Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 6d30f47

Browse files
author
Dart CI
committed
Version 2.15.0-101.0.dev
Merge commit '30abce99f3b779d843e9caebd1896099ea515507' into 'dev'
2 parents 81cea2b + 30abce9 commit 6d30f47

File tree

16 files changed

+367
-230
lines changed

16 files changed

+367
-230
lines changed

pkg/analysis_server/lib/src/computer/computer_highlights.dart

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -682,11 +682,7 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor<void> {
682682
// TODO(scheglov) The `ConstructorName` in a tear-off always has a name,
683683
// but this is not expressed via types.
684684
computer._addRegion_node(
685-
constructorName.name!,
686-
HighlightRegionType.CONSTRUCTOR_TEAR_OFF,
687-
semanticTokenType: SemanticTokenTypes.method,
688-
semanticTokenModifiers: {CustomSemanticTokenModifiers.constructor},
689-
);
685+
constructorName.name!, HighlightRegionType.CONSTRUCTOR_TEAR_OFF);
690686
}
691687

692688
@override

pkg/analysis_server/lib/src/lsp/semantic_tokens/mapping.dart

Lines changed: 9 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,17 @@
44

55
import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
66
import 'package:analysis_server/src/lsp/constants.dart';
7-
import 'package:analysis_server/src/lsp/semantic_tokens/legend.dart';
87
import 'package:analyzer_plugin/protocol/protocol_common.dart';
98

10-
final highlightRegionMapper = RegionTypeMapper();
11-
129
/// A mapping from [HighlightRegionType] to a set of [SemanticTokenModifiers].
1310
final highlightRegionTokenModifiers =
1411
<HighlightRegionType, Set<SemanticTokenModifiers>>{
1512
HighlightRegionType.COMMENT_DOCUMENTATION: {
1613
SemanticTokenModifiers.documentation
1714
},
15+
HighlightRegionType.CONSTRUCTOR_TEAR_OFF: {
16+
CustomSemanticTokenModifiers.constructor
17+
},
1818
HighlightRegionType.DYNAMIC_LOCAL_VARIABLE_DECLARATION: {
1919
SemanticTokenModifiers.declaration
2020
},
@@ -56,6 +56,7 @@ final highlightRegionTokenModifiers =
5656
SemanticTokenModifiers.static,
5757
},
5858
HighlightRegionType.STATIC_METHOD_REFERENCE: {SemanticTokenModifiers.static},
59+
HighlightRegionType.STATIC_METHOD_TEAR_OFF: {SemanticTokenModifiers.static},
5960
HighlightRegionType.STATIC_SETTER_DECLARATION: {
6061
SemanticTokenModifiers.declaration,
6162
SemanticTokenModifiers.static,
@@ -87,6 +88,7 @@ final highlightRegionTokenTypes = {
8788
HighlightRegionType.COMMENT_BLOCK: SemanticTokenTypes.comment,
8889
HighlightRegionType.COMMENT_DOCUMENTATION: SemanticTokenTypes.comment,
8990
HighlightRegionType.COMMENT_END_OF_LINE: SemanticTokenTypes.comment,
91+
HighlightRegionType.CONSTRUCTOR_TEAR_OFF: SemanticTokenTypes.method,
9092
HighlightRegionType.DYNAMIC_LOCAL_VARIABLE_DECLARATION:
9193
SemanticTokenTypes.variable,
9294
HighlightRegionType.DYNAMIC_LOCAL_VARIABLE_REFERENCE:
@@ -104,6 +106,7 @@ final highlightRegionTokenTypes = {
104106
HighlightRegionType.INSTANCE_GETTER_REFERENCE: SemanticTokenTypes.property,
105107
HighlightRegionType.INSTANCE_METHOD_DECLARATION: SemanticTokenTypes.method,
106108
HighlightRegionType.INSTANCE_METHOD_REFERENCE: SemanticTokenTypes.method,
109+
HighlightRegionType.INSTANCE_METHOD_TEAR_OFF: SemanticTokenTypes.method,
107110
HighlightRegionType.INSTANCE_SETTER_DECLARATION: SemanticTokenTypes.property,
108111
HighlightRegionType.INSTANCE_SETTER_REFERENCE: SemanticTokenTypes.property,
109112
HighlightRegionType.KEYWORD: SemanticTokenTypes.keyword,
@@ -114,6 +117,7 @@ final highlightRegionTokenTypes = {
114117
HighlightRegionType.LITERAL_STRING: SemanticTokenTypes.string,
115118
HighlightRegionType.LOCAL_FUNCTION_DECLARATION: SemanticTokenTypes.function,
116119
HighlightRegionType.LOCAL_FUNCTION_REFERENCE: SemanticTokenTypes.function,
120+
HighlightRegionType.LOCAL_FUNCTION_TEAR_OFF: SemanticTokenTypes.function,
117121
HighlightRegionType.LOCAL_VARIABLE_DECLARATION: SemanticTokenTypes.variable,
118122
HighlightRegionType.LOCAL_VARIABLE_REFERENCE: SemanticTokenTypes.variable,
119123
HighlightRegionType.PARAMETER_DECLARATION: SemanticTokenTypes.parameter,
@@ -123,11 +127,13 @@ final highlightRegionTokenTypes = {
123127
HighlightRegionType.STATIC_GETTER_REFERENCE: SemanticTokenTypes.property,
124128
HighlightRegionType.STATIC_METHOD_DECLARATION: SemanticTokenTypes.method,
125129
HighlightRegionType.STATIC_METHOD_REFERENCE: SemanticTokenTypes.method,
130+
HighlightRegionType.STATIC_METHOD_TEAR_OFF: SemanticTokenTypes.method,
126131
HighlightRegionType.STATIC_SETTER_DECLARATION: SemanticTokenTypes.property,
127132
HighlightRegionType.STATIC_SETTER_REFERENCE: SemanticTokenTypes.property,
128133
HighlightRegionType.TOP_LEVEL_FUNCTION_DECLARATION:
129134
SemanticTokenTypes.function,
130135
HighlightRegionType.TOP_LEVEL_FUNCTION_REFERENCE: SemanticTokenTypes.function,
136+
HighlightRegionType.TOP_LEVEL_FUNCTION_TEAR_OFF: SemanticTokenTypes.function,
131137
HighlightRegionType.TOP_LEVEL_GETTER_DECLARATION: SemanticTokenTypes.property,
132138
HighlightRegionType.TOP_LEVEL_GETTER_REFERENCE: SemanticTokenTypes.property,
133139
HighlightRegionType.TOP_LEVEL_SETTER_DECLARATION: SemanticTokenTypes.property,
@@ -142,37 +148,3 @@ final highlightRegionTokenTypes = {
142148
CustomSemanticTokenTypes.source,
143149
HighlightRegionType.VALID_STRING_ESCAPE: SemanticTokenTypes.string,
144150
};
145-
146-
/// A helper for converting from Server highlight regions to LSP semantic tokens.
147-
class RegionTypeMapper {
148-
/// A map to get the [SemanticTokenTypes] index directly from a [HighlightRegionType].
149-
final Map<HighlightRegionType, int> _tokenTypeIndexForHighlightRegion = {};
150-
151-
/// A map to get the [SemanticTokenModifiers] bitmask directly from a [HighlightRegionType].
152-
final Map<HighlightRegionType, int> _tokenModifierBitmaskForHighlightRegion =
153-
{};
154-
155-
RegionTypeMapper() {
156-
// Build mappings that go directly from [HighlightRegionType] to index/bitmask
157-
// for faster lookups.
158-
for (final regionType in highlightRegionTokenTypes.keys) {
159-
_tokenTypeIndexForHighlightRegion[regionType] = semanticTokenLegend
160-
.indexForType(highlightRegionTokenTypes[regionType]!);
161-
}
162-
163-
for (final regionType in highlightRegionTokenTypes.keys) {
164-
_tokenModifierBitmaskForHighlightRegion[regionType] = semanticTokenLegend
165-
.bitmaskForModifiers(highlightRegionTokenModifiers[regionType]);
166-
}
167-
}
168-
169-
/// Gets the [SemanticTokenModifiers] bitmask for a [HighlightRegionType]. Returns
170-
/// null if the region type has not been mapped.
171-
int bitmaskForModifier(HighlightRegionType type) =>
172-
_tokenModifierBitmaskForHighlightRegion[type]!;
173-
174-
/// Gets the [SemanticTokenTypes] index for a [HighlightRegionType]. Returns
175-
/// null if the region type has not been mapped.
176-
int indexForToken(HighlightRegionType type) =>
177-
_tokenTypeIndexForHighlightRegion[type]!;
178-
}

pkg/analysis_server/test/lsp/semantic_tokens_test.dart

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ class SemanticTokensTest extends AbstractLspAnalysisServerTest {
9393
final a = MyClass();
9494
final b = MyClass.named();
9595
final c = MyClass.factory();
96+
final d = MyClass.named;
9697
''';
9798

9899
final expected = [
@@ -126,7 +127,13 @@ class SemanticTokensTest extends AbstractLspAnalysisServerTest {
126127
_Token('MyClass', SemanticTokenTypes.class_,
127128
[CustomSemanticTokenModifiers.constructor]),
128129
_Token('factory', SemanticTokenTypes.method,
129-
[CustomSemanticTokenModifiers.constructor])
130+
[CustomSemanticTokenModifiers.constructor]),
131+
_Token('final', SemanticTokenTypes.keyword),
132+
_Token('d', SemanticTokenTypes.variable,
133+
[SemanticTokenModifiers.declaration]),
134+
_Token('MyClass', SemanticTokenTypes.class_),
135+
_Token('named', SemanticTokenTypes.method,
136+
[CustomSemanticTokenModifiers.constructor]),
130137
];
131138

132139
await initialize();
@@ -287,6 +294,8 @@ class SemanticTokensTest extends AbstractLspAnalysisServerTest {
287294
final a = MyClass();
288295
a.myMethod();
289296
MyClass.myStaticMethod();
297+
final b = a.myMethod;
298+
final c = MyClass.myStaticMethod;
290299
}
291300
''';
292301

@@ -321,6 +330,17 @@ class SemanticTokensTest extends AbstractLspAnalysisServerTest {
321330
_Token('MyClass', SemanticTokenTypes.class_),
322331
_Token('myStaticMethod', SemanticTokenTypes.method,
323332
[SemanticTokenModifiers.static]),
333+
_Token('final', SemanticTokenTypes.keyword),
334+
_Token('b', SemanticTokenTypes.variable,
335+
[SemanticTokenModifiers.declaration]),
336+
_Token('a', SemanticTokenTypes.variable),
337+
_Token('myMethod', SemanticTokenTypes.method),
338+
_Token('final', SemanticTokenTypes.keyword),
339+
_Token('c', SemanticTokenTypes.variable,
340+
[SemanticTokenModifiers.declaration]),
341+
_Token('MyClass', SemanticTokenTypes.class_),
342+
_Token('myStaticMethod', SemanticTokenTypes.method,
343+
[SemanticTokenModifiers.static]),
324344
];
325345

326346
await initialize();
@@ -612,6 +632,38 @@ class SemanticTokensTest extends AbstractLspAnalysisServerTest {
612632
expect(decoded, equals(expected));
613633
}
614634

635+
Future<void> test_local() async {
636+
final content = '''
637+
main() {
638+
func(String a) => print(a);
639+
final funcTearOff = func;
640+
}
641+
''';
642+
643+
final expected = [
644+
_Token('main', SemanticTokenTypes.function,
645+
[SemanticTokenModifiers.declaration, SemanticTokenModifiers.static]),
646+
_Token('func', SemanticTokenTypes.function,
647+
[SemanticTokenModifiers.declaration]),
648+
_Token('String', SemanticTokenTypes.class_),
649+
_Token('a', SemanticTokenTypes.parameter,
650+
[SemanticTokenModifiers.declaration]),
651+
_Token('print', SemanticTokenTypes.function),
652+
_Token('a', SemanticTokenTypes.parameter),
653+
_Token('final', SemanticTokenTypes.keyword),
654+
_Token('funcTearOff', SemanticTokenTypes.variable,
655+
[SemanticTokenModifiers.declaration]),
656+
_Token('func', SemanticTokenTypes.function),
657+
];
658+
659+
await initialize();
660+
await openFile(mainFileUri, withoutMarkers(content));
661+
662+
final tokens = await getSemanticTokens(mainFileUri);
663+
final decoded = decodeSemanticTokens(content, tokens);
664+
expect(decoded, equals(expected));
665+
}
666+
615667
Future<void> test_manyBools_bug() async {
616668
// Similar to test_manyImports_sortBug, this code triggered inconsistent tokens
617669
// for "false" because tokens were sorted incorrectly (because both boolean and
@@ -990,6 +1042,8 @@ const string3 = 'unicode \u1234\u123499\u{123456}\u{12345699}';
9901042
9911043
/// abc docs
9921044
bool get abc => true;
1045+
1046+
final funcTearOff = func;
9931047
''';
9941048

9951049
final expected = [
@@ -1019,6 +1073,10 @@ const string3 = 'unicode \u1234\u123499\u{123456}\u{12345699}';
10191073
_Token('abc', SemanticTokenTypes.property,
10201074
[SemanticTokenModifiers.declaration]),
10211075
_Token('true', CustomSemanticTokenTypes.boolean),
1076+
_Token('final', SemanticTokenTypes.keyword),
1077+
_Token('funcTearOff', SemanticTokenTypes.variable,
1078+
[SemanticTokenModifiers.declaration]),
1079+
_Token('func', SemanticTokenTypes.function),
10221080
];
10231081

10241082
await initialize();

pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -387,15 +387,16 @@ class FunctionReferenceResolver {
387387
);
388388

389389
if (methodElement == null) {
390-
// TODO(srawlins): Can we get here?
390+
// The target is known, but the method is not; [UNDEFINED_GETTER] is
391+
// reported elsewhere.
391392
node.staticType = DynamicTypeImpl.instance;
392393
return;
393394
} else {
394395
_resolveReceiverPrefix(node, prefixElement, target, methodElement);
395396
return;
396397
}
397398
} else {
398-
// TODO(srawlins): Can we get here?
399+
// The prefix is unknown; [UNDEFINED_IDENTIFIER] is reported elsewhere.
399400
node.staticType = DynamicTypeImpl.instance;
400401
return;
401402
}
@@ -440,7 +441,7 @@ class FunctionReferenceResolver {
440441
void _resolveReceiverPrefix(
441442
FunctionReferenceImpl node,
442443
PrefixElement prefixElement,
443-
PrefixedIdentifier prefix,
444+
PrefixedIdentifierImpl prefix,
444445
Element element,
445446
) {
446447
if (element is MultiplyDefinedElement) {
@@ -477,10 +478,19 @@ class FunctionReferenceResolver {
477478
name: element.name,
478479
);
479480
return;
481+
} else if (element is ExtensionElement) {
482+
prefix.identifier.staticElement = element;
483+
prefix.identifier.staticType = DynamicTypeImpl.instance;
484+
prefix.staticType = DynamicTypeImpl.instance;
485+
_resolveDisallowedExpression(node, DynamicTypeImpl.instance);
486+
return;
480487
}
481488

482-
// TODO(srawlins): Report undefined prefixed identifier.
483-
489+
assert(
490+
false,
491+
'Member of prefixed element, $prefixElement, is not a class, mixin, '
492+
'type alias, or executable element: $element (${element.runtimeType})',
493+
);
484494
node.staticType = DynamicTypeImpl.instance;
485495
}
486496

@@ -590,6 +600,11 @@ class FunctionReferenceResolver {
590600
function.staticType = element.type;
591601
_resolve(node: node, rawType: element.type);
592602
return;
603+
} else if (element is ExtensionElement) {
604+
function.staticElement = element;
605+
function.staticType = DynamicTypeImpl.instance;
606+
_resolveDisallowedExpression(node, DynamicTypeImpl.instance);
607+
return;
593608
} else {
594609
_resolveDisallowedExpression(node, DynamicTypeImpl.instance);
595610
return;

pkg/analyzer/test/generated/type_system_test.dart

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import 'test_analysis_context.dart';
1919

2020
main() {
2121
defineReflectiveSuite(() {
22-
defineReflectiveTests(AssignabilityTest);
22+
defineReflectiveTests(AssignabilityWithoutNullSafetyTest);
2323
defineReflectiveTests(TryPromoteToTest);
2424
});
2525
}
@@ -87,7 +87,8 @@ abstract class AbstractTypeSystemWithoutNullSafetyTest with ElementsTypesMixin {
8787
}
8888

8989
@reflectiveTest
90-
class AssignabilityTest extends AbstractTypeSystemWithoutNullSafetyTest {
90+
class AssignabilityWithoutNullSafetyTest
91+
extends AbstractTypeSystemWithoutNullSafetyTest {
9192
void test_isAssignableTo_bottom_isBottom() {
9293
var A = class_(name: 'A');
9394
List<DartType> interassignable = <DartType>[
@@ -435,7 +436,7 @@ class AssignabilityTest extends AbstractTypeSystemWithoutNullSafetyTest {
435436
}
436437

437438
@reflectiveTest
438-
class TryPromoteToTest extends AbstractTypeSystemWithoutNullSafetyTest {
439+
class TryPromoteToTest extends AbstractTypeSystemTest {
439440
void notPromotes(DartType from, DartType to) {
440441
var result = typeSystem.tryPromoteToType(to, from);
441442
expect(result, isNull);

pkg/analyzer/test/src/dart/element/class_hierarchy_test.dart

Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -15,38 +15,13 @@ import '../../../generated/type_system_test.dart';
1515

1616
main() {
1717
defineReflectiveSuite(() {
18-
defineReflectiveTests(ClassHierarchyLegacyTest);
19-
defineReflectiveTests(ClassHierarchyNullSafetyTest);
18+
defineReflectiveTests(ClassHierarchyTest);
19+
defineReflectiveTests(ClassHierarchyWithoutNullSafetyTest);
2020
});
2121
}
2222

2323
@reflectiveTest
24-
class ClassHierarchyLegacyTest extends AbstractTypeSystemWithoutNullSafetyTest
25-
with _AbstractClassHierarchyMixin {
26-
@override
27-
void setUp() {
28-
super.setUp();
29-
_createSharedElements();
30-
}
31-
32-
test_invalid() {
33-
_checkA(
34-
typeArguments: [intNone, doubleNone],
35-
interfaces: ['A<int*>'],
36-
errors: ['A<int*> vs. A<double*>'],
37-
);
38-
}
39-
40-
test_valid() {
41-
_checkA(
42-
typeArguments: [intNone, intQuestion],
43-
interfaces: ['A<int*>'],
44-
);
45-
}
46-
}
47-
48-
@reflectiveTest
49-
class ClassHierarchyNullSafetyTest extends AbstractTypeSystemTest
24+
class ClassHierarchyTest extends AbstractTypeSystemTest
5025
with _AbstractClassHierarchyMixin {
5126
@override
5227
void setUp() {
@@ -84,6 +59,32 @@ class ClassHierarchyNullSafetyTest extends AbstractTypeSystemTest
8459
}
8560
}
8661

62+
@reflectiveTest
63+
class ClassHierarchyWithoutNullSafetyTest
64+
extends AbstractTypeSystemWithoutNullSafetyTest
65+
with _AbstractClassHierarchyMixin {
66+
@override
67+
void setUp() {
68+
super.setUp();
69+
_createSharedElements();
70+
}
71+
72+
test_invalid() {
73+
_checkA(
74+
typeArguments: [intNone, doubleNone],
75+
interfaces: ['A<int*>'],
76+
errors: ['A<int*> vs. A<double*>'],
77+
);
78+
}
79+
80+
test_valid() {
81+
_checkA(
82+
typeArguments: [intNone, intQuestion],
83+
interfaces: ['A<int*>'],
84+
);
85+
}
86+
}
87+
8788
mixin _AbstractClassHierarchyMixin on ElementsTypesMixin {
8889
late ClassElementImpl A;
8990

0 commit comments

Comments
 (0)