Skip to content

Commit f3e68f2

Browse files
bwilkersonCommit Queue
authored andcommitted
[Migrate] sdk_constraint_verifier.dart
Change-Id: Ieb50d8292dcaee51aebd243dddc6aaebbb2c0f96 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/403641 Reviewed-by: Konstantin Shcheglov <[email protected]> Commit-Queue: Brian Wilkerson <[email protected]>
1 parent 491f4f4 commit f3e68f2

File tree

5 files changed

+92
-47
lines changed

5 files changed

+92
-47
lines changed

pkg/analyzer/analyzer_use_new_elements.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,6 @@ lib/src/generated/exhaustiveness.dart
9999
lib/src/generated/resolver.dart
100100
lib/src/generated/testing/element_factory.dart
101101
lib/src/generated/testing/test_type_provider.dart
102-
lib/src/hint/sdk_constraint_verifier.dart
103102
lib/src/lint/linter.dart
104103
lib/src/services/top_level_declarations.dart
105104
lib/src/summary2/ast_binary_reader.dart

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4476,9 +4476,7 @@ class FormalParameterElementImpl extends PromotableElementImpl2
44764476
ElementKind get kind => ElementKind.PARAMETER;
44774477

44784478
@override
4479-
LibraryElement2 get library2 =>
4480-
wrappedElement.thisOrAncestorOfType<LibraryElementImpl>()
4481-
as LibraryElement2;
4479+
LibraryElement2? get library2 => wrappedElement.library2;
44824480

44834481
@override
44844482
String? get name3 => wrappedElement.name;
@@ -4859,8 +4857,10 @@ mixin FragmentedAnnotatableElementMixin<E extends Fragment>
48594857
-1, metadata.cast<ElementAnnotationImpl>(), () => sinceSdkVersion);
48604858

48614859
Version? get sinceSdkVersion {
4862-
var annotations = metadata.cast<ElementAnnotationImpl>();
4863-
return SinceSdkVersionComputer.fromAnnotations(annotations);
4860+
if (this is Element2) {
4861+
return SinceSdkVersionComputer().compute2(this as Element2);
4862+
}
4863+
return null;
48644864
}
48654865
}
48664866

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

Lines changed: 53 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5+
import 'package:analyzer/dart/element/element2.dart';
56
import 'package:analyzer/src/dart/ast/ast.dart';
67
import 'package:analyzer/src/dart/element/element.dart';
78
import 'package:pub_semver/pub_semver.dart';
@@ -40,27 +41,38 @@ class SinceSdkVersionComputer {
4041
}
4142
}
4243

43-
/// Returns the maximal specified `@Since()` version from the [annotations].
44-
///
45-
/// Returns `null` if none of the annotations is a `@Since` annotation.
46-
static Version? fromAnnotations(List<ElementAnnotationImpl> annotations) {
47-
// TODO(brianwilkerson): Replace the body of `_specifiedVersion` with this
48-
// method.
49-
Version? result;
50-
for (var annotation in annotations) {
51-
if (annotation.isDartInternalSince) {
52-
var arguments = annotation.annotationAst.arguments?.arguments;
53-
var versionNode = arguments?.singleOrNull;
54-
if (versionNode is SimpleStringLiteralImpl) {
55-
var versionStr = versionNode.value;
56-
var version = _parseVersion(versionStr);
57-
if (version != null) {
58-
result = result.maxWith(version);
59-
}
60-
}
61-
}
44+
/// The [element] is a `dart:xyz` library, so it can have `@Since` annotations.
45+
/// Evaluates its annotations and returns the version.
46+
Version? compute2(Element2 element) {
47+
// Must be in a `dart:` library.
48+
var libraryUri = element.library2?.uri;
49+
if (libraryUri == null || !libraryUri.isScheme('dart')) {
50+
return null;
51+
}
52+
53+
// Fields cannot be referenced outside.
54+
if (element is FieldElement2 && element.isSynthetic) {
55+
return null;
56+
}
57+
58+
// We cannot add required parameters.
59+
if (element is FormalParameterElement && element.isRequired) {
60+
return null;
61+
}
62+
63+
Version? specified;
64+
if (element is Annotatable) {
65+
specified = _specifiedVersion2(element as Annotatable);
66+
}
67+
if (element.enclosingElement2 case Annotatable enclosingElement?) {
68+
var enclosing = enclosingElement.metadata2.sinceSdkVersion;
69+
return specified.maxWith(enclosing);
70+
} else if (element.library2 case var libraryElement?) {
71+
var enclosing = libraryElement.metadata2.sinceSdkVersion;
72+
return specified.maxWith(enclosing);
73+
} else {
74+
return specified;
6275
}
63-
return result;
6476
}
6577

6678
/// Returns the parsed [Version], or `null` if wrong format.
@@ -96,6 +108,27 @@ class SinceSdkVersionComputer {
96108
}
97109
return result;
98110
}
111+
112+
/// Returns the maximal specified `@Since()` version, `null` if none.
113+
static Version? _specifiedVersion2(Annotatable element) {
114+
var annotations =
115+
element.metadata2.annotations.cast<ElementAnnotationImpl>();
116+
Version? result;
117+
for (var annotation in annotations) {
118+
if (annotation.isDartInternalSince) {
119+
var arguments = annotation.annotationAst.arguments?.arguments;
120+
var versionNode = arguments?.singleOrNull;
121+
if (versionNode is SimpleStringLiteralImpl) {
122+
var versionStr = versionNode.value;
123+
var version = _parseVersion(versionStr);
124+
if (version != null) {
125+
result = result.maxWith(version);
126+
}
127+
}
128+
}
129+
}
130+
return result;
131+
}
99132
}
100133

101134
extension on Version? {

pkg/analyzer/lib/src/hint/sdk_constraint_verifier.dart

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import 'package:analyzer/dart/ast/ast.dart';
66
import 'package:analyzer/dart/ast/syntactic_entity.dart';
77
import 'package:analyzer/dart/ast/token.dart';
88
import 'package:analyzer/dart/ast/visitor.dart';
9-
import 'package:analyzer/dart/element/element.dart';
9+
import 'package:analyzer/dart/element/element2.dart';
1010
import 'package:analyzer/dart/element/type.dart';
1111
import 'package:analyzer/error/listener.dart';
1212
import 'package:analyzer/src/error/codes.dart';
@@ -59,7 +59,7 @@ class SdkConstraintVerifier extends RecursiveAstVisitor<void> {
5959
// Named arguments are checked in [NamedExpression].
6060
for (var argument in node.arguments) {
6161
if (argument is! NamedExpression) {
62-
var parameter = argument.staticParameterElement;
62+
var parameter = argument.correspondingParameter;
6363
_checkSinceSdkVersion(parameter, node, errorEntity: argument);
6464
}
6565
}
@@ -69,8 +69,8 @@ class SdkConstraintVerifier extends RecursiveAstVisitor<void> {
6969

7070
@override
7171
void visitAssignmentExpression(AssignmentExpression node) {
72-
_checkSinceSdkVersion(node.readElement, node);
73-
_checkSinceSdkVersion(node.writeElement, node);
72+
_checkSinceSdkVersion(node.readElement2, node);
73+
_checkSinceSdkVersion(node.writeElement2, node);
7474
super.visitAssignmentExpression(node);
7575
}
7676

@@ -90,13 +90,13 @@ class SdkConstraintVerifier extends RecursiveAstVisitor<void> {
9090

9191
@override
9292
void visitConstructorName(ConstructorName node) {
93-
_checkSinceSdkVersion(node.staticElement, node);
93+
_checkSinceSdkVersion(node.element, node);
9494
super.visitConstructorName(node);
9595
}
9696

9797
@override
9898
void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
99-
_checkSinceSdkVersion(node.staticElement, node);
99+
_checkSinceSdkVersion(node.element, node);
100100
super.visitFunctionExpressionInvocation(node);
101101
}
102102

@@ -107,7 +107,7 @@ class SdkConstraintVerifier extends RecursiveAstVisitor<void> {
107107

108108
@override
109109
void visitIndexExpression(IndexExpression node) {
110-
_checkSinceSdkVersion(node.staticElement, node);
110+
_checkSinceSdkVersion(node.element, node);
111111
super.visitIndexExpression(node);
112112
}
113113

@@ -124,25 +124,25 @@ class SdkConstraintVerifier extends RecursiveAstVisitor<void> {
124124

125125
@override
126126
void visitMethodInvocation(MethodInvocation node) {
127-
_checkSinceSdkVersion(node.methodName.staticElement, node);
127+
_checkSinceSdkVersion(node.methodName.element, node);
128128
super.visitMethodInvocation(node);
129129
}
130130

131131
@override
132132
void visitNamedType(NamedType node) {
133-
_checkSinceSdkVersion(node.element, node);
133+
_checkSinceSdkVersion(node.element2, node);
134134
super.visitNamedType(node);
135135
}
136136

137137
@override
138138
void visitPrefixedIdentifier(PrefixedIdentifier node) {
139-
_checkSinceSdkVersion(node.staticElement, node);
139+
_checkSinceSdkVersion(node.element, node);
140140
super.visitPrefixedIdentifier(node);
141141
}
142142

143143
@override
144144
void visitPropertyAccess(PropertyAccess node) {
145-
_checkSinceSdkVersion(node.propertyName.staticElement, node);
145+
_checkSinceSdkVersion(node.propertyName.element, node);
146146
super.visitPropertyAccess(node);
147147
}
148148

@@ -156,20 +156,21 @@ class SdkConstraintVerifier extends RecursiveAstVisitor<void> {
156156
if (node.inDeclarationContext()) {
157157
return;
158158
}
159-
_checkSinceSdkVersion(node.staticElement, node);
159+
_checkSinceSdkVersion(node.element, node);
160160
}
161161

162162
void _checkSinceSdkVersion(
163-
Element? element,
163+
Element2? element,
164164
AstNode target, {
165165
SyntacticEntity? errorEntity,
166166
}) {
167-
if (element != null) {
168-
var sinceSdkVersion = element.sinceSdkVersion;
167+
element = element?.nonSynthetic2;
168+
if (element is Annotatable) {
169+
var sinceSdkVersion = (element as Annotatable).metadata2.sinceSdkVersion;
169170
if (sinceSdkVersion != null) {
170171
if (!_versionConstraint.requiresAtLeast(sinceSdkVersion)) {
171172
if (errorEntity == null) {
172-
if (!_shouldReportEnumIndex(target, element)) {
173+
if (!_shouldReportEnumIndex(target, element!)) {
173174
return;
174175
}
175176
if (target is AssignmentExpression) {
@@ -217,17 +218,17 @@ class SdkConstraintVerifier extends RecursiveAstVisitor<void> {
217218
/// Returns `true` if [element] is something else, or if the target is a
218219
/// concrete enum. The `index` was always available for concrete enums,
219220
/// but there was no common `Enum` supertype for all enums.
220-
static bool _shouldReportEnumIndex(AstNode node, Element element) {
221-
if (element is PropertyAccessorElement && element.name == 'index') {
221+
static bool _shouldReportEnumIndex(AstNode node, Element2 element) {
222+
if (element is PropertyAccessorElement2 && element.name3 == 'index') {
222223
DartType? targetType;
223224
if (node is PrefixedIdentifier) {
224225
targetType = node.prefix.staticType;
225226
} else if (node is PropertyAccess) {
226227
targetType = node.realTarget.staticType;
227228
}
228229
if (targetType != null) {
229-
var targetElement = targetType.element;
230-
return targetElement is ClassElement && targetElement.isDartCoreEnum;
230+
var targetElement = targetType.element3;
231+
return targetElement is ClassElement2 && targetElement.isDartCoreEnum;
231232
}
232233
return false;
233234
} else {

pkg/analyzer/test/src/summary/elements/since_sdk_version_test.dart

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ library
103103
constructors
104104
named
105105
firstFragment: dart:foo::<fragment>::@class::A::@constructor::named
106+
sinceSdkVersion: 2.15.0
106107
class B
107108
reference: dart:foo::@class::B
108109
firstFragment: dart:foo::<fragment>::@class::B
@@ -198,9 +199,11 @@ library
198199
getters
199200
synthetic get foo
200201
firstFragment: dart:foo::<fragment>::@class::A::@getter::foo
202+
sinceSdkVersion: 2.15.0
201203
setters
202204
synthetic set foo
203205
firstFragment: dart:foo::<fragment>::@class::A::@setter::foo
206+
sinceSdkVersion: 2.15.0
204207
formalParameters
205208
requiredPositional _foo
206209
type: int
@@ -273,6 +276,7 @@ library
273276
getters
274277
get foo
275278
firstFragment: dart:foo::<fragment>::@class::A::@getter::foo
279+
sinceSdkVersion: 2.15.0
276280
''');
277281
}
278282

@@ -328,6 +332,7 @@ library
328332
foo
329333
reference: dart:foo::@class::A::@method::foo
330334
firstFragment: dart:foo::<fragment>::@class::A::@method::foo
335+
sinceSdkVersion: 2.15.0
331336
''');
332337
}
333338

@@ -441,7 +446,7 @@ library
441446
foo
442447
reference: dart:foo::@class::A::@method::foo
443448
firstFragment: dart:foo::<fragment>::@class::A::@method::foo
444-
sinceSdkVersion: 2.14.0
449+
sinceSdkVersion: 2.15.0
445450
''');
446451
}
447452

@@ -517,6 +522,7 @@ library
517522
setters
518523
set foo
519524
firstFragment: dart:foo::<fragment>::@class::A::@setter::foo
525+
sinceSdkVersion: 2.15.0
520526
formalParameters
521527
requiredPositional _
522528
type: int
@@ -739,12 +745,15 @@ library
739745
getters
740746
synthetic static get v
741747
firstFragment: dart:foo::<fragment>::@enum::E::@getter::v
748+
sinceSdkVersion: 2.15.0
742749
synthetic static get values
743750
firstFragment: dart:foo::<fragment>::@enum::E::@getter::values
751+
sinceSdkVersion: 2.15.0
744752
methods
745753
foo
746754
reference: dart:foo::@enum::E::@method::foo
747755
firstFragment: dart:foo::<fragment>::@enum::E::@method::foo
756+
sinceSdkVersion: 2.15.0
748757
''');
749758
}
750759

@@ -801,6 +810,7 @@ library
801810
foo
802811
reference: dart:foo::@extension::E::@method::foo
803812
firstFragment: dart:foo::<fragment>::@extension::E::@method::foo
813+
sinceSdkVersion: 2.15.0
804814
''');
805815
}
806816

@@ -860,6 +870,7 @@ library
860870
foo
861871
reference: dart:foo::@mixin::M::@method::foo
862872
firstFragment: dart:foo::<fragment>::@mixin::M::@method::foo
873+
sinceSdkVersion: 2.15.0
863874
''');
864875
}
865876

@@ -1077,6 +1088,7 @@ library
10771088
foo
10781089
reference: dart:foo::@function::foo
10791090
firstFragment: dart:foo::<fragment>::@function::foo
1091+
sinceSdkVersion: 2.15.0
10801092
returnType: void
10811093
''');
10821094
}

0 commit comments

Comments
 (0)