Skip to content

Commit 200e8da

Browse files
author
Dart CI
committed
Version 2.11.0-168.0.dev
Merge commit 'febb1929cd4dccd08232657890f935bd752866d4' into 'dev'
2 parents db7eb25 + febb192 commit 200e8da

File tree

33 files changed

+1048
-243
lines changed

33 files changed

+1048
-243
lines changed

pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5669,6 +5669,17 @@ const MessageCode messageJsInteropNonExternalConstructor = const MessageCode(
56695669
r"""JS interop classes do not support non-external constructors.""",
56705670
tip: r"""Try annotating with `external`.""");
56715671

5672+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
5673+
const Code<Null> codeJsInteropNonExternalMember =
5674+
messageJsInteropNonExternalMember;
5675+
5676+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
5677+
const MessageCode messageJsInteropNonExternalMember = const MessageCode(
5678+
"JsInteropNonExternalMember",
5679+
message:
5680+
r"""This JS interop member must be annotated with `external`. Only factories and static methods can be non-external.""",
5681+
tip: r"""Try annotating the member with `external`.""");
5682+
56725683
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
56735684
const Template<
56745685
Message Function(String name)> templateLabelNotFound = const Template<

pkg/_js_interop_checks/lib/js_interop_checks.dart

Lines changed: 64 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,26 +13,57 @@ import 'package:_fe_analyzer_shared/src/messages/codes.dart'
1313
messageJsInteropEnclosingClassJSAnnotationContext,
1414
messageJsInteropIndexNotSupported,
1515
messageJsInteropNamedParameters,
16-
messageJsInteropNonExternalConstructor;
16+
messageJsInteropNonExternalConstructor,
17+
messageJsInteropNonExternalMember;
1718

1819
import 'src/js_interop.dart';
1920

2021
class JsInteropChecks extends RecursiveVisitor<void> {
2122
final DiagnosticReporter<Message, LocatedMessage> _diagnosticsReporter;
23+
bool _classHasJSAnnotation = false;
24+
bool _libraryHasJSAnnotation = false;
2225

2326
JsInteropChecks(this._diagnosticsReporter);
2427

2528
@override
2629
void defaultMember(Member member) {
27-
_checkMemberJSInteropAnnotation(member);
30+
_checkJSInteropAnnotation(member);
31+
// TODO(43530): Disallow having JS interop annotations on non-external
32+
// members (class members or otherwise). Currently, they're being ignored.
2833
super.defaultMember(member);
2934
}
3035

3136
@override
32-
void visitProcedure(Procedure procedure) {
33-
_checkMemberJSInteropAnnotation(procedure);
37+
void visitClass(Class cls) {
38+
_classHasJSAnnotation = hasJSInteropAnnotation(cls);
39+
super.visitClass(cls);
40+
_classHasJSAnnotation = false;
41+
}
3442

35-
if (!procedure.isExternal || !isJSInteropMember(procedure)) return;
43+
@override
44+
void visitLibrary(Library lib) {
45+
_libraryHasJSAnnotation = hasJSInteropAnnotation(lib);
46+
super.visitLibrary(lib);
47+
_libraryHasJSAnnotation = false;
48+
}
49+
50+
@override
51+
void visitProcedure(Procedure procedure) {
52+
_checkJSInteropAnnotation(procedure);
53+
if (_classHasJSAnnotation && !procedure.isExternal) {
54+
// If not one of few exceptions, member is not allowed to exclude
55+
// `external` inside of a JS interop class.
56+
if (!(procedure.isAbstract ||
57+
procedure.isFactory ||
58+
procedure.isStatic)) {
59+
_diagnosticsReporter.report(
60+
messageJsInteropNonExternalMember,
61+
procedure.fileOffset,
62+
procedure.name.text.length,
63+
procedure.location.file);
64+
}
65+
}
66+
if (!_isJSInteropMember(procedure)) return;
3667

3768
if (!procedure.isStatic &&
3869
(procedure.name.text == '[]=' || procedure.name.text == '[]')) {
@@ -65,17 +96,18 @@ class JsInteropChecks extends RecursiveVisitor<void> {
6596

6697
@override
6798
void visitConstructor(Constructor constructor) {
68-
_checkMemberJSInteropAnnotation(constructor);
69-
70-
if (!isJSInteropMember(constructor)) return;
71-
72-
if (!constructor.isExternal && !constructor.isSynthetic) {
99+
_checkJSInteropAnnotation(constructor);
100+
if (_classHasJSAnnotation &&
101+
!constructor.isExternal &&
102+
!constructor.isSynthetic) {
103+
// Non-synthetic constructors must be annotated with `external`.
73104
_diagnosticsReporter.report(
74105
messageJsInteropNonExternalConstructor,
75106
constructor.fileOffset,
76107
constructor.name.text.length,
77108
constructor.location.file);
78109
}
110+
if (!_isJSInteropMember(constructor)) return;
79111

80112
_checkNoNamedParameters(constructor.function);
81113
}
@@ -92,14 +124,18 @@ class JsInteropChecks extends RecursiveVisitor<void> {
92124
}
93125
}
94126

95-
/// Reports an error if [m] has a JS interop annotation and is part of a class
96-
/// that does not.
97-
void _checkMemberJSInteropAnnotation(Member m) {
98-
if (!hasJSInteropAnnotation(m)) return;
99-
var enclosingClass = m.enclosingClass;
100-
if (enclosingClass != null && !hasJSInteropAnnotation(enclosingClass)) {
127+
/// Reports an error if [member] does not correctly use the JS interop
128+
/// annotation or the keyword `external`.
129+
void _checkJSInteropAnnotation(Member member) {
130+
var enclosingClass = member.enclosingClass;
131+
132+
if (!_classHasJSAnnotation &&
133+
enclosingClass != null &&
134+
hasJSInteropAnnotation(member)) {
135+
// If in a class that is not JS interop, this member is not allowed to be
136+
// JS interop.
101137
_diagnosticsReporter.report(messageJsInteropEnclosingClassJSAnnotation,
102-
m.fileOffset, m.name.text.length, m.location.file,
138+
member.fileOffset, member.name.text.length, member.location.file,
103139
context: <LocatedMessage>[
104140
messageJsInteropEnclosingClassJSAnnotationContext.withLocation(
105141
enclosingClass.location.file,
@@ -108,4 +144,15 @@ class JsInteropChecks extends RecursiveVisitor<void> {
108144
]);
109145
}
110146
}
147+
148+
/// Returns whether [member] is considered to be a JS interop member.
149+
bool _isJSInteropMember(Member member) {
150+
if (!member.isExternal) return false;
151+
if (_classHasJSAnnotation) return true;
152+
if (!_classHasJSAnnotation && member.enclosingClass != null) return false;
153+
// In the case where the member does not belong to any class, a JS
154+
// annotation is not needed on the library to be considered JS interop as
155+
// long as the member has an annotation.
156+
return hasJSInteropAnnotation(member) || _libraryHasJSAnnotation;
157+
}
111158
}

pkg/_js_interop_checks/lib/src/js_interop.dart

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,6 @@ import 'package:kernel/kernel.dart';
99
bool hasJSInteropAnnotation(Annotatable a) =>
1010
a.annotations.any(_isPublicJSAnnotation);
1111

12-
/// Returns true if [m] belongs to a JS interop context. Checks if either the
13-
/// member or the surrounding context has a JS interop annotation.
14-
bool isJSInteropMember(Member m) {
15-
if (hasJSInteropAnnotation(m)) return true;
16-
var enclosingClass = m.enclosingClass;
17-
if (enclosingClass != null) return hasJSInteropAnnotation(enclosingClass);
18-
var enclosingLibrary = m.enclosingLibrary;
19-
if (enclosingLibrary != null) return hasJSInteropAnnotation(enclosingLibrary);
20-
return false;
21-
}
22-
2312
/// Returns true if [m] belongs to an anonymous class.
2413
bool isAnonymousClassMember(Member m) {
2514
var enclosingClass = m.enclosingClass;

pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ import 'package:analysis_server/src/services/linter/lint_names.dart';
6363
import 'package:analyzer/dart/analysis/results.dart';
6464
import 'package:analyzer/error/error.dart';
6565
import 'package:analyzer/src/error/codes.dart';
66+
import 'package:analyzer/src/generated/source.dart';
6667
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
6768

6869
/// A fix producer that produces changes to fix multiple diagnostics.
@@ -257,8 +258,11 @@ class BulkFixProcessor {
257258
Future<ChangeBuilder> fixErrorsInLibraries(List<String> libraryPaths) async {
258259
for (var path in libraryPaths) {
259260
var session = workspace.getSession(path);
260-
var libraryResult = await session.getResolvedLibrary(path);
261-
await _fixErrorsInLibrary(libraryResult);
261+
var kind = await session.getSourceKind(path);
262+
if (kind == SourceKind.LIBRARY) {
263+
var libraryResult = await session.getResolvedLibrary(path);
264+
await _fixErrorsInLibrary(libraryResult);
265+
}
262266
}
263267
return builder;
264268
}

pkg/analyzer/lib/src/dart/element/display_string_builder.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:analyzer/dart/element/type.dart';
88
import 'package:analyzer/src/dart/element/element.dart';
99
import 'package:analyzer/src/dart/element/type.dart';
1010
import 'package:analyzer/src/dart/element/type_algebra.dart';
11+
import 'package:analyzer/src/dart/resolver/variance.dart';
1112
import 'package:analyzer/src/generated/element_type_provider.dart';
1213
import 'package:meta/meta.dart';
1314

@@ -171,8 +172,9 @@ class ElementDisplayStringBuilder {
171172

172173
void writeTypeParameter(TypeParameterElement element) {
173174
if (element is TypeParameterElementImpl) {
174-
if (!element.isLegacyCovariant) {
175-
_write(element.variance.toKeywordString());
175+
var variance = element.variance;
176+
if (!element.isLegacyCovariant && variance != Variance.unrelated) {
177+
_write(variance.toKeywordString());
176178
_write(' ');
177179
}
178180
}

pkg/analyzer/lib/src/dart/element/element.dart

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7426,10 +7426,7 @@ class TypeParameterElementImpl extends ElementImpl
74267426
if (_variance != null) return _variance;
74277427

74287428
if (linkedNode != null) {
7429-
var varianceKeyword = linkedContext.getTypeParameterVariance(linkedNode);
7430-
if (varianceKeyword != null) {
7431-
_variance = Variance.fromKeywordString(varianceKeyword.lexeme);
7432-
}
7429+
_variance = linkedContext.getTypeParameterVariance(linkedNode);
74337430
}
74347431

74357432
return _variance ?? Variance.covariant;

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,4 +204,20 @@ class Variance {
204204
'Missing keyword lexeme representation for variance: $this');
205205
}
206206
}
207+
208+
@override
209+
String toString() {
210+
switch (this) {
211+
case contravariant:
212+
return 'contravariant';
213+
case invariant:
214+
return 'invariant';
215+
case covariant:
216+
return 'covariant';
217+
case unrelated:
218+
return 'unrelated';
219+
default:
220+
throw UnimplementedError('encoding: $_encoding');
221+
}
222+
}
207223
}

pkg/analyzer/lib/src/summary/format.dart

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6702,6 +6702,12 @@ class LinkedNodeBuilder extends Object
67026702
return _variantField_15 ??= 0;
67036703
}
67046704

6705+
@override
6706+
int get typeParameter_variance {
6707+
assert(kind == idl.LinkedNodeKind.typeParameter);
6708+
return _variantField_15 ??= 0;
6709+
}
6710+
67056711
set assignmentExpression_element(int value) {
67066712
assert(kind == idl.LinkedNodeKind.assignmentExpression);
67076713
assert(value == null || value >= 0);
@@ -6774,6 +6780,12 @@ class LinkedNodeBuilder extends Object
67746780
_variantField_15 = value;
67756781
}
67766782

6783+
set typeParameter_variance(int value) {
6784+
assert(kind == idl.LinkedNodeKind.typeParameter);
6785+
assert(value == null || value >= 0);
6786+
_variantField_15 = value;
6787+
}
6788+
67776789
@override
67786790
idl.UnlinkedTokenType get assignmentExpression_operator {
67796791
assert(kind == idl.LinkedNodeKind.assignmentExpression);
@@ -6804,12 +6816,6 @@ class LinkedNodeBuilder extends Object
68046816
return _variantField_28 ??= idl.UnlinkedTokenType.NOTHING;
68056817
}
68066818

6807-
@override
6808-
idl.UnlinkedTokenType get typeParameter_variance {
6809-
assert(kind == idl.LinkedNodeKind.typeParameter);
6810-
return _variantField_28 ??= idl.UnlinkedTokenType.NOTHING;
6811-
}
6812-
68136819
set assignmentExpression_operator(idl.UnlinkedTokenType value) {
68146820
assert(kind == idl.LinkedNodeKind.assignmentExpression);
68156821
_variantField_28 = value;
@@ -6835,11 +6841,6 @@ class LinkedNodeBuilder extends Object
68356841
_variantField_28 = value;
68366842
}
68376843

6838-
set typeParameter_variance(idl.UnlinkedTokenType value) {
6839-
assert(kind == idl.LinkedNodeKind.typeParameter);
6840-
_variantField_28 = value;
6841-
}
6842-
68436844
@override
68446845
bool get booleanLiteral_value {
68456846
assert(kind == idl.LinkedNodeKind.booleanLiteral);
@@ -8619,13 +8620,13 @@ class LinkedNodeBuilder extends Object
86198620
LinkedNodeBuilder.typeParameter({
86208621
List<LinkedNodeBuilder> annotatedNode_metadata,
86218622
LinkedNodeBuilder typeParameter_bound,
8622-
idl.UnlinkedTokenType typeParameter_variance,
8623+
int typeParameter_variance,
86238624
int informativeId,
86248625
LinkedNodeTypeBuilder typeParameter_defaultType,
86258626
}) : _kind = idl.LinkedNodeKind.typeParameter,
86268627
_variantField_4 = annotatedNode_metadata,
86278628
_variantField_6 = typeParameter_bound,
8628-
_variantField_28 = typeParameter_variance,
8629+
_variantField_15 = typeParameter_variance,
86298630
_variantField_36 = informativeId,
86308631
_variantField_23 = typeParameter_defaultType;
86318632

@@ -10668,12 +10669,10 @@ class LinkedNodeBuilder extends Object
1066810669
}
1066910670
signature.addBool(this.typeParameter_bound != null);
1067010671
this.typeParameter_bound?.collectApiSignature(signature);
10672+
signature.addInt(this.typeParameter_variance ?? 0);
1067110673
signature.addInt(this.flags ?? 0);
1067210674
signature.addBool(this.typeParameter_defaultType != null);
1067310675
this.typeParameter_defaultType?.collectApiSignature(signature);
10674-
signature.addInt(this.typeParameter_variance == null
10675-
? 0
10676-
: this.typeParameter_variance.index);
1067710676
signature.addString(this.name ?? '');
1067810677
} else if (kind == idl.LinkedNodeKind.typeParameterList) {
1067910678
signature.addInt(this.kind == null ? 0 : this.kind.index);
@@ -12711,6 +12710,14 @@ class _LinkedNodeImpl extends Object
1271112710
return _variantField_15;
1271212711
}
1271312712

12713+
@override
12714+
int get typeParameter_variance {
12715+
assert(kind == idl.LinkedNodeKind.typeParameter);
12716+
_variantField_15 ??=
12717+
const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
12718+
return _variantField_15;
12719+
}
12720+
1271412721
@override
1271512722
idl.UnlinkedTokenType get assignmentExpression_operator {
1271612723
assert(kind == idl.LinkedNodeKind.assignmentExpression);
@@ -12751,14 +12758,6 @@ class _LinkedNodeImpl extends Object
1275112758
return _variantField_28;
1275212759
}
1275312760

12754-
@override
12755-
idl.UnlinkedTokenType get typeParameter_variance {
12756-
assert(kind == idl.LinkedNodeKind.typeParameter);
12757-
_variantField_28 ??= const _UnlinkedTokenTypeReader()
12758-
.vTableGet(_bc, _bcOffset, 28, idl.UnlinkedTokenType.NOTHING);
12759-
return _variantField_28;
12760-
}
12761-
1276212761
@override
1276312762
bool get booleanLiteral_value {
1276412763
assert(kind == idl.LinkedNodeKind.booleanLiteral);
@@ -14797,9 +14796,8 @@ abstract class _LinkedNodeMixin implements idl.LinkedNode {
1479714796
if (typeParameter_bound != null) {
1479814797
_result["typeParameter_bound"] = typeParameter_bound.toJson();
1479914798
}
14800-
if (typeParameter_variance != idl.UnlinkedTokenType.NOTHING) {
14801-
_result["typeParameter_variance"] =
14802-
typeParameter_variance.toString().split('.')[1];
14799+
if (typeParameter_variance != 0) {
14800+
_result["typeParameter_variance"] = typeParameter_variance;
1480314801
}
1480414802
if (informativeId != 0) {
1480514803
_result["informativeId"] = informativeId;

pkg/analyzer/lib/src/summary/idl.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1557,8 +1557,8 @@ abstract class LinkedNode extends base.SummaryClass {
15571557
@VariantId(23, variant: LinkedNodeKind.typeParameter)
15581558
LinkedNodeType get typeParameter_defaultType;
15591559

1560-
@VariantId(28, variant: LinkedNodeKind.typeParameter)
1561-
UnlinkedTokenType get typeParameter_variance;
1560+
@VariantId(15, variant: LinkedNodeKind.typeParameter)
1561+
int get typeParameter_variance;
15621562

15631563
@VariantId(2, variant: LinkedNodeKind.typeParameterList)
15641564
List<LinkedNode> get typeParameterList_typeParameters;

0 commit comments

Comments
 (0)