Extension types. Semantic highlighting.

Change-Id: I46cde8151965e209a230df811592f8498e93c218
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/318161
Reviewed-by: Phil Quitslund <pquitslund@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
This commit is contained in:
Konstantin Shcheglov
2023-08-04 19:13:43 +00:00
committed by Commit Queue
parent 944a2f691e
commit ce7164488a
11 changed files with 156 additions and 2 deletions
+1 -1
View File
@@ -4763,7 +4763,7 @@ a:focus, a:hover {
<dl><dt class="value">ANNOTATION</dt><dt class="value">BUILT_IN</dt><dt class="value">CLASS</dt><dt class="value">COMMENT_BLOCK</dt><dt class="value">COMMENT_DOCUMENTATION</dt><dt class="value">COMMENT_END_OF_LINE</dt><dt class="value">CONSTRUCTOR</dt><dt class="value">CONSTRUCTOR_TEAR_OFF</dt><dt class="value">DIRECTIVE</dt><dt class="value">DYNAMIC_TYPE</dt><dd>
<p>Deprecated - no longer sent.</p>
</dd><dt class="value">DYNAMIC_LOCAL_VARIABLE_DECLARATION</dt><dt class="value">DYNAMIC_LOCAL_VARIABLE_REFERENCE</dt><dt class="value">DYNAMIC_PARAMETER_DECLARATION</dt><dt class="value">DYNAMIC_PARAMETER_REFERENCE</dt><dt class="value">ENUM</dt><dt class="value">ENUM_CONSTANT</dt><dt class="value">EXTENSION</dt><dt class="value">FIELD</dt><dd>
</dd><dt class="value">DYNAMIC_LOCAL_VARIABLE_DECLARATION</dt><dt class="value">DYNAMIC_LOCAL_VARIABLE_REFERENCE</dt><dt class="value">DYNAMIC_PARAMETER_DECLARATION</dt><dt class="value">DYNAMIC_PARAMETER_REFERENCE</dt><dt class="value">ENUM</dt><dt class="value">ENUM_CONSTANT</dt><dt class="value">EXTENSION</dt><dt class="value">EXTENSION_TYPE</dt><dt class="value">FIELD</dt><dd>
<p>Deprecated - no longer sent.</p>
</dd><dt class="value">FIELD_STATIC</dt><dd>
@@ -184,6 +184,8 @@ class DartUnitHighlightsComputer {
semanticModifiers = {CustomSemanticTokenModifiers.constructor};
} else if (element is EnumElement) {
type = HighlightRegionType.ENUM;
} else if (element is ExtensionTypeElement) {
type = HighlightRegionType.EXTENSION_TYPE;
} else {
type = HighlightRegionType.CLASS;
if (parent is ConstructorDeclaration) {
@@ -862,6 +864,27 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor<void> {
super.visitExtensionOverride(node);
}
@override
void visitExtensionTypeDeclaration(ExtensionTypeDeclaration node) {
computer._addRegion_token(
node.extensionKeyword,
HighlightRegionType.BUILT_IN,
);
computer._addRegion_token(
node.typeKeyword,
HighlightRegionType.BUILT_IN,
);
computer._addRegion_token(
node.name,
HighlightRegionType.EXTENSION_TYPE,
semanticTokenModifiers: {SemanticTokenModifiers.declaration},
);
super.visitExtensionTypeDeclaration(node);
}
@override
void visitFieldDeclaration(FieldDeclaration node) {
computer._addRegion_token(
@@ -1269,6 +1292,32 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor<void> {
super.visitRecordTypeAnnotation(node);
}
@override
void visitRepresentationConstructorName(RepresentationConstructorName node) {
computer._addRegion_token(
node.name,
HighlightRegionType.CONSTRUCTOR,
semanticTokenType: SemanticTokenTypes.method,
semanticTokenModifiers: {
CustomSemanticTokenModifiers.constructor,
SemanticTokenModifiers.declaration,
},
);
super.visitRepresentationConstructorName(node);
}
@override
void visitRepresentationDeclaration(RepresentationDeclaration node) {
computer._addRegion_token(
node.fieldName,
HighlightRegionType.INSTANCE_FIELD_DECLARATION,
semanticTokenModifiers: {SemanticTokenModifiers.declaration},
);
super.visitRepresentationDeclaration(node);
}
@override
void visitRethrowExpression(RethrowExpression node) {
computer._addRegion_token(node.rethrowKeyword, HighlightRegionType.KEYWORD,
@@ -1099,6 +1099,25 @@ void f() {
assertHasRegion(HighlightRegionType.EXTENSION, 'E.bar()');
}
Future<void> test_extensionType() async {
final testCode = TestCode.parse(r'''
extension type A<T>.named(int it) implements num {}
''');
addTestFile(testCode.code);
await prepareHighlights();
assertHighlightText(testCode, -1, r'''
0 + 9 |extension| BUILT_IN
10 + 4 |type| BUILT_IN
15 + 1 |A| EXTENSION_TYPE
17 + 1 |T| TYPE_PARAMETER
20 + 5 |named| CONSTRUCTOR
26 + 3 |int| CLASS
30 + 2 |it| INSTANCE_FIELD_DECLARATION
34 + 10 |implements| BUILT_IN
45 + 3 |num| CLASS
''');
}
Future<void> test_forEachPartsWithPattern_final() async {
addTestFile('''
void f(List<Object> l) {
@@ -1242,6 +1261,40 @@ class A {
assertHasRegion(HighlightRegionType.INSTANCE_FIELD_REFERENCE, 'f);');
}
Future<void> test_instanceCreation_class() async {
final testCode = TestCode.parse(r'''
class A {
A.named(int it);
}
void f() {
[!A.named(0)!];
}
''');
addTestFile(testCode.code);
await prepareHighlights();
assertHighlightText(testCode, 0, r'''
44 + 1 |A| CONSTRUCTOR
46 + 5 |named| CONSTRUCTOR
52 + 1 |0| LITERAL_INTEGER
''');
}
Future<void> test_instanceCreation_extensionType() async {
final testCode = TestCode.parse(r'''
extension type A.named(T it) {}
void f() {
[!A.named(0)!];
}
''');
addTestFile(testCode.code);
await prepareHighlights();
assertHighlightText(testCode, 0, r'''
45 + 1 |A| CONSTRUCTOR
47 + 5 |named| CONSTRUCTOR
53 + 1 |0| LITERAL_INTEGER
''');
}
Future<void> test_KEYWORD() async {
addTestFile('''
void f() {
@@ -1617,6 +1670,19 @@ void g() {
assertHasRegion(HighlightRegionType.PARAMETER_REFERENCE, 'a: 0');
}
Future<void> test_namedType_extensionType() async {
final testCode = TestCode.parse(r'''
extension type A<T>(T it) {}
void f([!A<int>!] a) {}
''');
addTestFile(testCode.code);
await prepareHighlights();
assertHighlightText(testCode, 0, r'''
36 + 1 |A| EXTENSION_TYPE
38 + 3 |int| CLASS
''');
}
Future<void> test_PARAMETER() async {
addTestFile('''
void f(int p) {
@@ -1725,6 +1791,23 @@ void f(Object o) {
assertHasRegion(HighlightRegionType.KEYWORD, 'var');
}
Future<void> test_propertyAccess_extensionTypeName() async {
final testCode = TestCode.parse(r'''
extension type A.named(T it) {
static const V = 0;
}
void f() {
[!A.V!];
}
''');
addTestFile(testCode.code);
await prepareHighlights();
assertHighlightText(testCode, 0, r'''
68 + 1 |A| EXTENSION_TYPE
70 + 1 |V| STATIC_GETTER_REFERENCE
''');
}
Future<void> test_recordTypeAnnotation_named() async {
addTestFile('''
({int f1, String f2})? r;
@@ -807,6 +807,7 @@ final Matcher isHighlightRegion = LazyMatcher(() => MatchesJsonObject(
/// ENUM
/// ENUM_CONSTANT
/// EXTENSION
/// EXTENSION_TYPE
/// FIELD
/// FIELD_STATIC
/// FUNCTION
@@ -891,6 +892,7 @@ final Matcher isHighlightRegionType = MatchesEnum('HighlightRegionType', [
'ENUM',
'ENUM_CONSTANT',
'EXTENSION',
'EXTENSION_TYPE',
'FIELD',
'FIELD_STATIC',
'FUNCTION',
@@ -52,6 +52,8 @@ public class HighlightRegionType {
public static final String EXTENSION = "EXTENSION";
public static final String EXTENSION_TYPE = "EXTENSION_TYPE";
/**
* Deprecated - no longer sent.
*/
@@ -1897,6 +1897,7 @@ class HighlightRegion implements HasToJson {
/// ENUM
/// ENUM_CONSTANT
/// EXTENSION
/// EXTENSION_TYPE
/// FIELD
/// FIELD_STATIC
/// FUNCTION
@@ -2015,6 +2016,9 @@ class HighlightRegionType implements Enum {
static const HighlightRegionType EXTENSION =
HighlightRegionType._('EXTENSION');
static const HighlightRegionType EXTENSION_TYPE =
HighlightRegionType._('EXTENSION_TYPE');
/// Deprecated - no longer sent.
static const HighlightRegionType FIELD = HighlightRegionType._('FIELD');
@@ -2236,6 +2240,7 @@ class HighlightRegionType implements Enum {
ENUM,
ENUM_CONSTANT,
EXTENSION,
EXTENSION_TYPE,
FIELD,
FIELD_STATIC,
FUNCTION,
@@ -2344,6 +2349,8 @@ class HighlightRegionType implements Enum {
return ENUM_CONSTANT;
case 'EXTENSION':
return EXTENSION;
case 'EXTENSION_TYPE':
return EXTENSION_TYPE;
case 'FIELD':
return FIELD;
case 'FIELD_STATIC':
+1
View File
@@ -6818,6 +6818,7 @@ final class ExtensionTypeDeclarationImpl extends NamedCompilationUnitMemberImpl
super.visitChildren(visitor);
typeParameters?.accept(visitor);
representation.accept(visitor);
implementsClause?.accept(visitor);
members.accept(visitor);
}
}
+1 -1
View File
@@ -1419,7 +1419,7 @@ a:focus, a:hover {
<dl><dt class="value">ANNOTATION</dt><dt class="value">BUILT_IN</dt><dt class="value">CLASS</dt><dt class="value">COMMENT_BLOCK</dt><dt class="value">COMMENT_DOCUMENTATION</dt><dt class="value">COMMENT_END_OF_LINE</dt><dt class="value">CONSTRUCTOR</dt><dt class="value">CONSTRUCTOR_TEAR_OFF</dt><dt class="value">DIRECTIVE</dt><dt class="value">DYNAMIC_TYPE</dt><dd>
<p>Deprecated - no longer sent.</p>
</dd><dt class="value">DYNAMIC_LOCAL_VARIABLE_DECLARATION</dt><dt class="value">DYNAMIC_LOCAL_VARIABLE_REFERENCE</dt><dt class="value">DYNAMIC_PARAMETER_DECLARATION</dt><dt class="value">DYNAMIC_PARAMETER_REFERENCE</dt><dt class="value">ENUM</dt><dt class="value">ENUM_CONSTANT</dt><dt class="value">EXTENSION</dt><dt class="value">FIELD</dt><dd>
</dd><dt class="value">DYNAMIC_LOCAL_VARIABLE_DECLARATION</dt><dt class="value">DYNAMIC_LOCAL_VARIABLE_REFERENCE</dt><dt class="value">DYNAMIC_PARAMETER_DECLARATION</dt><dt class="value">DYNAMIC_PARAMETER_REFERENCE</dt><dt class="value">ENUM</dt><dt class="value">ENUM_CONSTANT</dt><dt class="value">EXTENSION</dt><dt class="value">EXTENSION_TYPE</dt><dt class="value">FIELD</dt><dd>
<p>Deprecated - no longer sent.</p>
</dd><dt class="value">FIELD_STATIC</dt><dd>
@@ -1897,6 +1897,7 @@ class HighlightRegion implements HasToJson {
/// ENUM
/// ENUM_CONSTANT
/// EXTENSION
/// EXTENSION_TYPE
/// FIELD
/// FIELD_STATIC
/// FUNCTION
@@ -2015,6 +2016,9 @@ class HighlightRegionType implements Enum {
static const HighlightRegionType EXTENSION =
HighlightRegionType._('EXTENSION');
static const HighlightRegionType EXTENSION_TYPE =
HighlightRegionType._('EXTENSION_TYPE');
/// Deprecated - no longer sent.
static const HighlightRegionType FIELD = HighlightRegionType._('FIELD');
@@ -2236,6 +2240,7 @@ class HighlightRegionType implements Enum {
ENUM,
ENUM_CONSTANT,
EXTENSION,
EXTENSION_TYPE,
FIELD,
FIELD_STATIC,
FUNCTION,
@@ -2344,6 +2349,8 @@ class HighlightRegionType implements Enum {
return ENUM_CONSTANT;
case 'EXTENSION':
return EXTENSION;
case 'EXTENSION_TYPE':
return EXTENSION_TYPE;
case 'FIELD':
return FIELD;
case 'FIELD_STATIC':
@@ -382,6 +382,7 @@ final Matcher isHighlightRegion = LazyMatcher(() => MatchesJsonObject(
/// ENUM
/// ENUM_CONSTANT
/// EXTENSION
/// EXTENSION_TYPE
/// FIELD
/// FIELD_STATIC
/// FUNCTION
@@ -466,6 +467,7 @@ final Matcher isHighlightRegionType = MatchesEnum('HighlightRegionType', [
'ENUM',
'ENUM_CONSTANT',
'EXTENSION',
'EXTENSION_TYPE',
'FIELD',
'FIELD_STATIC',
'FUNCTION',
@@ -736,6 +736,7 @@
<value><code>ENUM</code></value>
<value><code>ENUM_CONSTANT</code></value>
<value><code>EXTENSION</code></value>
<value><code>EXTENSION_TYPE</code></value>
<value>
<code>FIELD</code>
<p>Deprecated - no longer sent.</p>