Skip to content

Commit 8692936

Browse files
scheglovcommit-bot@chromium.org
authored andcommitted
Verify constants using Analyzer.
This fixes 44 failing language_2 tests. Change-Id: I9248a940c56764d030e5cb1c8d558a3d41b88899 Reviewed-on: https://dart-review.googlesource.com/68340 Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent b83072c commit 8692936

14 files changed

+332
-520
lines changed

pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart

Lines changed: 31 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ class LibraryAnalyzer {
132132
_computePendingMissingRequiredParameters(file, unit);
133133
});
134134

135+
units.values.forEach(_findConstants);
135136
_computeConstants();
136137

137138
PerformanceStatistics.errors.makeCurrentWhile(() {
@@ -229,8 +230,14 @@ class LibraryAnalyzer {
229230
});
230231
});
231232

233+
units.values.forEach(_findConstants);
232234
_computeConstants();
233235

236+
units.forEach((file, unit) {
237+
ErrorReporter errorReporter = _getErrorReporter(file);
238+
_computeConstantErrors(errorReporter, unit);
239+
});
240+
234241
if (_analysisOptions.hint) {
235242
PerformanceStatistics.hints.makeCurrentWhile(() {
236243
units.forEach((file, unit) {
@@ -275,6 +282,13 @@ class LibraryAnalyzer {
275282
});
276283
}
277284

285+
void _computeConstantErrors(
286+
ErrorReporter errorReporter, CompilationUnit unit) {
287+
ConstantVerifier constantVerifier = new ConstantVerifier(
288+
errorReporter, _libraryElement, _typeProvider, _declaredVariables);
289+
unit.accept(constantVerifier);
290+
}
291+
278292
/**
279293
* Compute [_constants] in all units.
280294
*/
@@ -428,9 +442,7 @@ class LibraryAnalyzer {
428442
//
429443
// Use the ConstantVerifier to compute errors.
430444
//
431-
ConstantVerifier constantVerifier = new ConstantVerifier(
432-
errorReporter, _libraryElement, _typeProvider, _declaredVariables);
433-
unit.accept(constantVerifier);
445+
_computeConstantErrors(errorReporter, unit);
434446

435447
//
436448
// Use the ErrorVerifier to compute errors.
@@ -470,6 +482,17 @@ class LibraryAnalyzer {
470482
return errors.where((AnalysisError e) => !isIgnored(e)).toList();
471483
}
472484

485+
/// Find constants to compute.
486+
void _findConstants(CompilationUnit unit) {
487+
ConstantFinder constantFinder = new ConstantFinder();
488+
unit.accept(constantFinder);
489+
_constants.addAll(constantFinder.constantsToCompute);
490+
491+
var dependenciesFinder = new ConstantExpressionsDependenciesFinder();
492+
unit.accept(dependenciesFinder);
493+
_constants.addAll(dependenciesFinder.dependencies);
494+
}
495+
473496
RecordingErrorListener _getErrorListener(FileState file) =>
474497
_errorListeners.putIfAbsent(file, () => new RecordingErrorListener());
475498

@@ -709,24 +732,6 @@ class LibraryAnalyzer {
709732

710733
unit.accept(new ResolverVisitor(
711734
_libraryElement, source, _typeProvider, errorListener));
712-
713-
//
714-
// Find constants to compute.
715-
//
716-
{
717-
ConstantFinder constantFinder = new ConstantFinder();
718-
unit.accept(constantFinder);
719-
_constants.addAll(constantFinder.constantsToCompute);
720-
}
721-
722-
//
723-
// Find constant dependencies to compute.
724-
//
725-
{
726-
var finder = new ConstantExpressionsDependenciesFinder();
727-
unit.accept(finder);
728-
_constants.addAll(finder.dependencies);
729-
}
730735
}
731736

732737
void _resolveFile2(FileState file, CompilationUnitImpl unit,
@@ -847,30 +852,17 @@ class LibraryAnalyzer {
847852
variableList.type?.accept(applier);
848853
for (var variable in variables.reversed) {
849854
variable.initializer?.accept(applier);
855+
var element = variable.declaredElement;
856+
if (element is ConstVariableElement) {
857+
(element as ConstVariableElement).constantInitializer =
858+
variable.initializer;
859+
}
850860
}
851861
applier.applyToAnnotations(declaration);
852862
} else {
853863
throw new StateError('(${declaration.runtimeType}) $declaration');
854864
}
855865
}
856-
857-
//
858-
// Find constants to compute.
859-
//
860-
{
861-
ConstantFinder constantFinder = new ConstantFinder();
862-
unit.accept(constantFinder);
863-
_constants.addAll(constantFinder.constantsToCompute);
864-
}
865-
866-
//
867-
// Find constant dependencies to compute.
868-
//
869-
{
870-
var finder = new ConstantExpressionsDependenciesFinder();
871-
unit.accept(finder);
872-
_constants.addAll(finder.dependencies);
873-
}
874866
}
875867

876868
/**

pkg/analyzer/lib/src/fasta/resolution_applier.dart

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -695,8 +695,14 @@ class ResolutionApplier extends GeneralizingAstVisitor {
695695
node.name.staticElement = element;
696696
element.type = type;
697697
}
698+
699+
node.initializer?.accept(this);
700+
701+
if (element is ConstVariableElement) {
702+
(element as ConstVariableElement).constantInitializer =
703+
node.initializer;
704+
}
698705
}
699-
node.initializer?.accept(this);
700706
}
701707

702708
@override

pkg/analyzer/lib/src/kernel/resynthesize.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -688,7 +688,7 @@ class _ExprBuilder {
688688
var arguments = _toArguments(expr.arguments);
689689
var creation = AstTestFactory.instanceCreationExpression(
690690
keyword, constructorName, arguments);
691-
creation.staticElement = element;
691+
creation.staticElement = ConstructorMember.from(element, type);
692692
creation.staticType = type;
693693
return creation;
694694
}

pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart

Lines changed: 0 additions & 143 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,6 @@ class CheckedModeCompileTimeErrorCodeTest_Kernel
2424
@override
2525
bool get usingFastaParser => true;
2626

27-
@failingTest
28-
@override
29-
test_assertion_throws() async {
30-
// Not yet generating errors in kernel mode.
31-
await super.test_assertion_throws();
32-
}
33-
3427
@failingTest
3528
@override
3629
test_fieldFormalParameterAssignableToField_fieldType_unresolved_null() async {
@@ -39,29 +32,6 @@ class CheckedModeCompileTimeErrorCodeTest_Kernel
3932
.test_fieldFormalParameterAssignableToField_fieldType_unresolved_null();
4033
}
4134

42-
@failingTest
43-
@override
44-
test_fieldFormalParameterNotAssignableToField() async {
45-
// Expected 1 errors of type CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, found 0;
46-
// 1 errors of type StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, found 0
47-
await super.test_fieldFormalParameterNotAssignableToField();
48-
}
49-
50-
@failingTest
51-
@override
52-
test_fieldFormalParameterNotAssignableToField_extends() async {
53-
// Expected 1 errors of type CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, found 0
54-
await super.test_fieldFormalParameterNotAssignableToField_extends();
55-
}
56-
57-
@failingTest
58-
@override
59-
test_fieldFormalParameterNotAssignableToField_fieldType() async {
60-
// Expected 1 errors of type CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, found 0;
61-
// 1 errors of type StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, found 0
62-
await super.test_fieldFormalParameterNotAssignableToField_fieldType();
63-
}
64-
6535
@failingTest
6636
@override
6737
test_fieldFormalParameterNotAssignableToField_fieldType_unresolved() async {
@@ -71,71 +41,13 @@ class CheckedModeCompileTimeErrorCodeTest_Kernel
7141
.test_fieldFormalParameterNotAssignableToField_fieldType_unresolved();
7242
}
7343

74-
@failingTest
75-
@override
76-
test_fieldFormalParameterNotAssignableToField_implements() async {
77-
// Expected 1 errors of type CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, found 0
78-
await super.test_fieldFormalParameterNotAssignableToField_implements();
79-
}
80-
81-
@failingTest
82-
@override
83-
test_fieldFormalParameterNotAssignableToField_list() async {
84-
// Expected 1 errors of type CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, found 0
85-
await super.test_fieldFormalParameterNotAssignableToField_list();
86-
}
87-
88-
@failingTest
89-
@override
90-
test_fieldFormalParameterNotAssignableToField_map_keyMismatch() async {
91-
// Expected 1 errors of type CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, found 0
92-
await super.test_fieldFormalParameterNotAssignableToField_map_keyMismatch();
93-
}
94-
95-
@failingTest
96-
@override
97-
test_fieldFormalParameterNotAssignableToField_map_valueMismatch() async {
98-
// Expected 1 errors of type CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, found 0
99-
await super
100-
.test_fieldFormalParameterNotAssignableToField_map_valueMismatch();
101-
}
102-
103-
@failingTest
104-
@override
105-
test_fieldFormalParameterNotAssignableToField_optional() async {
106-
// UnimplementedError: kernel: (Let) let final dynamic #t1 = "foo" in let ...
107-
await super.test_fieldFormalParameterNotAssignableToField_optional();
108-
}
109-
110-
@failingTest
111-
@override
112-
test_fieldFormalParameterNotAssignableToField_typedef() async {
113-
// Expected 1 errors of type CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, found 0;
114-
// 1 errors of type StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, found 0
115-
await super.test_fieldFormalParameterNotAssignableToField_typedef();
116-
}
117-
11844
@failingTest
11945
@override
12046
test_fieldInitializerNotAssignable() async {
12147
// UnimplementedError: kernel: (Let) let final dynamic #t2 = "" in let ...
12248
await super.test_fieldInitializerNotAssignable();
12349
}
12450

125-
@failingTest
126-
@override
127-
test_fieldTypeMismatch() async {
128-
// UnimplementedError: kernel: (AsExpression) x as{TypeError} dart.core::int
129-
await super.test_fieldTypeMismatch();
130-
}
131-
132-
@failingTest
133-
@override
134-
test_fieldTypeMismatch_generic() async {
135-
// UnimplementedError: kernel: (Let) let final dynamic #t3 = #lib1::y in let ...
136-
await super.test_fieldTypeMismatch_generic();
137-
}
138-
13951
@failingTest
14052
@override
14153
test_fieldTypeMismatch_unresolved() async {
@@ -158,12 +70,6 @@ class CheckedModeCompileTimeErrorCodeTest_Kernel
15870
await super.test_listElementTypeNotAssignable();
15971
}
16072

161-
@failingTest
162-
@FastaProblem('https://github.com/dart-lang/sdk/issues/31936')
163-
@override
164-
test_listLiteral_inferredElementType() async =>
165-
super.test_listLiteral_inferredElementType();
166-
16773
@failingTest
16874
@override
16975
test_mapKeyTypeNotAssignable() async {
@@ -172,18 +78,6 @@ class CheckedModeCompileTimeErrorCodeTest_Kernel
17278
await super.test_mapKeyTypeNotAssignable();
17379
}
17480

175-
@failingTest
176-
@FastaProblem('https://github.com/dart-lang/sdk/issues/31936')
177-
@override
178-
test_mapLiteral_inferredKeyType() async =>
179-
super.test_mapLiteral_inferredKeyType();
180-
181-
@failingTest
182-
@FastaProblem('https://github.com/dart-lang/sdk/issues/31936')
183-
@override
184-
test_mapLiteral_inferredValueType() async =>
185-
super.test_mapLiteral_inferredValueType();
186-
18781
@failingTest
18882
@override
18983
test_mapValueTypeNotAssignable() async {
@@ -199,22 +93,6 @@ class CheckedModeCompileTimeErrorCodeTest_Kernel
19993
await super.test_parameterAssignable_undefined_null();
20094
}
20195

202-
@failingTest
203-
@override
204-
test_parameterNotAssignable() async {
205-
// Expected 1 errors of type CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, found 0;
206-
// 1 errors of type StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, found 0
207-
await super.test_parameterNotAssignable();
208-
}
209-
210-
@failingTest
211-
@override
212-
test_parameterNotAssignable_typeSubstitution() async {
213-
// Expected 1 errors of type CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, found 0;
214-
// 1 errors of type StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, found 0
215-
await super.test_parameterNotAssignable_typeSubstitution();
216-
}
217-
21896
@failingTest
21997
@override
22098
test_parameterNotAssignable_undefined() async {
@@ -223,34 +101,13 @@ class CheckedModeCompileTimeErrorCodeTest_Kernel
223101
await super.test_parameterNotAssignable_undefined();
224102
}
225103

226-
@failingTest
227-
@override
228-
test_redirectingConstructor_paramTypeMismatch() async {
229-
// Bad state: Expected element reference for analyzer offset 33; got one for kernel offset 36
230-
await super.test_redirectingConstructor_paramTypeMismatch();
231-
}
232-
233-
@failingTest
234-
@override
235-
test_superConstructor_paramTypeMismatch() async {
236-
// UnimplementedError: kernel: (AsExpression) d as{TypeError} dart.core::double
237-
await super.test_superConstructor_paramTypeMismatch();
238-
}
239-
240104
@failingTest
241105
@override
242106
test_topLevelVarAssignable_undefined_null() async {
243107
// Expected 1 errors of type StaticWarningCode.UNDEFINED_CLASS, found 0
244108
await super.test_topLevelVarAssignable_undefined_null();
245109
}
246110

247-
@failingTest
248-
@override
249-
test_topLevelVarNotAssignable() async {
250-
// UnimplementedError: kernel: (Let) let final dynamic #t5 = "foo" in let ...
251-
await super.test_topLevelVarNotAssignable();
252-
}
253-
254111
@failingTest
255112
@override
256113
test_topLevelVarNotAssignable_undefined() async {

pkg/analyzer/test/generated/checked_mode_compile_time_error_code_test.dart

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -419,10 +419,19 @@ const int y = 1;
419419
var v = const C<String>();
420420
''');
421421
await computeAnalysisResult(source);
422-
assertErrors(source, [
423-
CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH,
424-
StaticTypeWarningCode.INVALID_ASSIGNMENT
425-
]);
422+
assertErrors(
423+
source,
424+
useCFE
425+
? [
426+
CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE,
427+
StaticTypeWarningCode.INVALID_ASSIGNMENT
428+
]
429+
: [
430+
CheckedModeCompileTimeErrorCode
431+
.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH,
432+
StaticTypeWarningCode.INVALID_ASSIGNMENT
433+
],
434+
);
426435
verify([source]);
427436
}
428437

@@ -451,7 +460,15 @@ const int y = 1;
451460
var v = const C<int>();
452461
''');
453462
await computeAnalysisResult(source);
454-
assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
463+
assertErrors(
464+
source,
465+
useCFE
466+
? [
467+
CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE,
468+
StaticTypeWarningCode.INVALID_ASSIGNMENT
469+
]
470+
: [StaticTypeWarningCode.INVALID_ASSIGNMENT],
471+
);
455472
verify([source]);
456473
}
457474

0 commit comments

Comments
 (0)