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:
committed by
Commit Queue
parent
944a2f691e
commit
ce7164488a
@@ -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':
|
||||
|
||||
@@ -6818,6 +6818,7 @@ final class ExtensionTypeDeclarationImpl extends NamedCompilationUnitMemberImpl
|
||||
super.visitChildren(visitor);
|
||||
typeParameters?.accept(visitor);
|
||||
representation.accept(visitor);
|
||||
implementsClause?.accept(visitor);
|
||||
members.accept(visitor);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user