Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(24)

Unified Diff: pkg/analyzer/test/src/dart/analysis/driver_test.dart

Issue 2679073003: Compute constants in non-task analyzer. (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/analyzer/lib/src/dart/analysis/analysis_impl.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analyzer/test/src/dart/analysis/driver_test.dart
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 7d435d591235e66d7939fbc183f7f6c985ff67f4..67764a3a9fda5ce4a4bb8401b9388853740443c0 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -19,6 +19,8 @@ import 'package:analyzer/src/dart/analysis/driver.dart';
import 'package:analyzer/src/dart/analysis/file_state.dart';
import 'package:analyzer/src/dart/analysis/status.dart';
import 'package:analyzer/src/dart/analysis/top_level_declaration.dart';
+import 'package:analyzer/src/dart/constant/evaluation.dart';
+import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/error/codes.dart';
import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
import 'package:analyzer/src/generated/sdk.dart';
@@ -30,6 +32,7 @@ import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'package:typed_mock/typed_mock.dart';
+import '../../../utils.dart';
import '../../context/mock_sdk.dart';
import 'base.dart';
@@ -580,6 +583,115 @@ var A2 = B1;
}
}
+ test_const_annotation_notConstConstructor() async {
+ addTestFile('''
+class A {
+ final int i;
+ A(this.i);
+}
+
+@A(5)
+class C {}
+''');
+ var result = await driver.getResult(testFile);
+ var atD = AstFinder.getClass(result.unit, 'C').metadata[0];
+ var atDI = atD.elementAnnotation as ElementAnnotationImpl;
+ var value = atDI.evaluationResult.value;
+ // That is illegal.
+ expect(value, isNull);
+ }
+
+ test_const_annotation_withArgs() async {
+ addTestFile('''
+const x = 1;
+@D(x) class C {}
+class D {
+ const D(this.value);
+ final value;
+}
+''');
+ var result = await driver.getResult(testFile);
+ var atD = AstFinder.getClass(result.unit, 'C').metadata[0];
+ var atDI = atD.elementAnnotation as ElementAnnotationImpl;
+ var value = atDI.evaluationResult.value;
+ expect(value, isNotNull);
+ expect(value.type, isNotNull);
+ expect(value.type.name, 'D');
+ expect(value.fields.keys, ['value']);
+ expect(value.getField('value').toIntValue(), 1);
+ expect(atDI.evaluationResult.errors, isEmpty);
+ }
+
+ test_const_annotation_withoutArgs() async {
+ addTestFile('''
+const x = 1;
+@x class C {}
+''');
+ var result = await driver.getResult(testFile);
+ Annotation at_x = AstFinder.getClass(result.unit, 'C').metadata[0];
+ expect(at_x.elementAnnotation.constantValue.toIntValue(), 1);
+ }
+
+ test_const_circular_reference() async {
+ addTestFile('''
+const x = y + 1;
+const y = x + 1;
+''');
+ var result = await driver.getResult(testFile);
+ var x = AstFinder.getTopLevelVariableElement(result.unit, 'x')
+ as TopLevelVariableElementImpl;
+ _expectCircularityError(x.evaluationResult);
+ }
+
+ test_const_dependency_sameUnit() async {
+ addTestFile('''
+const x = y + 1;
+const y = 1;
+''');
+ var result = await driver.getResult(testFile);
+ var x = AstFinder.getTopLevelVariableElement(result.unit, 'x');
+ var y = AstFinder.getTopLevelVariableElement(result.unit, 'y');
+ expect(x.constantValue.toIntValue(), 2);
+ expect(y.constantValue.toIntValue(), 1);
+ }
+
+ test_const_externalConstFactory() async {
+ addTestFile('''
+const x = const C.foo();
+
+class C extends B {
+ external const factory C.foo();
+}
+
+class B {}
+''');
+ var result = await driver.getResult(testFile);
+ var x = AstFinder.getTopLevelVariableElement(result.unit, 'x');
+ expect(x.constantValue, isNotNull);
+ }
+
+ test_const_implicitSuperConstructorInvocation() async {
+ addTestFile('''
+class Base {}
+class Derived extends Base {
+ const Derived();
+}
+const x = const Derived();
+''');
+ var result = await driver.getResult(testFile);
+ var x = AstFinder.getTopLevelVariableElement(result.unit, 'x');
+ expect(x.constantValue, isNotNull);
+ }
+
+ test_const_simple_topLevelVariable() async {
+ addTestFile('''
+const x = 1;
+''');
+ var result = await driver.getResult(testFile);
+ var x = AstFinder.getTopLevelVariableElement(result.unit, 'x');
+ expect(x.constantValue.toIntValue(), 1);
+ }
+
test_errors_uriDoesNotExist_export() async {
addTestFile(r'''
export 'foo.dart';
@@ -1970,6 +2082,14 @@ var A = B;
}
}
+ void _expectCircularityError(EvaluationResultImpl evaluationResult) {
+ expect(evaluationResult, isNotNull);
+ expect(evaluationResult.value, isNull);
+ expect(evaluationResult.errors, hasLength(1));
+ expect(evaluationResult.errors[0].errorCode,
+ CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT);
+ }
+
ClassDeclaration _getClass(CompilationUnit unit, String name) {
for (CompilationUnitMember declaration in unit.declarations) {
if (declaration is ClassDeclaration) {
« no previous file with comments | « pkg/analyzer/lib/src/dart/analysis/analysis_impl.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698