Index: pkg/analyzer/test/generated/all_the_rest_test.dart |
diff --git a/pkg/analyzer/test/generated/all_the_rest_test.dart b/pkg/analyzer/test/generated/all_the_rest_test.dart |
index a45e0121e83a7b40eb6b12a57e4a5614320b3502..abae226729165d6251bbe9196598f5ab9d36c068 100644 |
--- a/pkg/analyzer/test/generated/all_the_rest_test.dart |
+++ b/pkg/analyzer/test/generated/all_the_rest_test.dart |
@@ -851,6 +851,13 @@ class ConstantEvaluatorTest extends ResolverTestCase { |
class ConstantFinderTest extends EngineTestCase { |
AstNode _node; |
+ TypeProvider _typeProvider; |
+ |
+ void setUp() { |
+ super.setUp(); |
+ _typeProvider = new TestTypeProvider(); |
+ } |
+ |
/** |
* Test an annotation that consists solely of an identifier (and hence |
* represents a reference to a compile-time constant variable). |
@@ -895,6 +902,22 @@ class ConstantFinderTest extends EngineTestCase { |
expect(_findVariableDeclarations()[element], same(_node)); |
} |
+ void test_visitVariableDeclaration_final_inClass() { |
+ _setupFieldDeclaration('C', 'f', Keyword.FINAL); |
+ expect(_findVariableDeclarations(), isEmpty); |
+ } |
+ |
+ void test_visitVariableDeclaration_final_inClassWithConstConstructor() { |
+ VariableDeclaration field = _setupFieldDeclaration('C', 'f', Keyword.FINAL, |
+ hasConstConstructor: true); |
+ expect(_findVariableDeclarations()[field.element], same(field)); |
+ } |
+ |
+ void test_visitVariableDeclaration_final_outsideClass() { |
+ _setupVariableDeclaration('v', false, true, isFinal: true); |
+ expect(_findVariableDeclarations(), isEmpty); |
+ } |
+ |
void test_visitVariableDeclaration_noInitializer() { |
_setupVariableDeclaration("v", true, false); |
expect(_findVariableDeclarations().isEmpty, isTrue); |
@@ -905,6 +928,36 @@ class ConstantFinderTest extends EngineTestCase { |
expect(_findVariableDeclarations().isEmpty, isTrue); |
} |
+ void test_visitVariableDeclaration_static_const_inClass() { |
+ VariableDeclaration field = |
+ _setupFieldDeclaration('C', 'f', Keyword.CONST, isStatic: true); |
+ expect(_findVariableDeclarations()[field.element], same(field)); |
+ } |
+ |
+ void test_visitVariableDeclaration_static_const_inClassWithConstConstructor() { |
+ VariableDeclaration field = _setupFieldDeclaration('C', 'f', Keyword.CONST, |
+ isStatic: true, hasConstConstructor: true); |
+ expect(_findVariableDeclarations()[field.element], same(field)); |
+ } |
+ |
+ void test_visitVariableDeclaration_static_final_inClassWithConstConstructor() { |
+ _setupFieldDeclaration('C', 'f', Keyword.FINAL, |
+ isStatic: true, hasConstConstructor: true); |
+ expect(_findVariableDeclarations(), isEmpty); |
+ } |
+ |
+ void test_visitVariableDeclaration_uninitialized_final_inClassWithConstConstructor() { |
+ _setupFieldDeclaration('C', 'f', Keyword.FINAL, |
+ isInitialized: false, hasConstConstructor: true); |
+ expect(_findVariableDeclarations(), isEmpty); |
+ } |
+ |
+ void test_visitVariableDeclaration_uninitialized_static_const_inClass() { |
+ _setupFieldDeclaration('C', 'f', Keyword.CONST, |
+ isStatic: true, isInitialized: false); |
+ expect(_findVariableDeclarations(), isEmpty); |
+ } |
+ |
List<Annotation> _findAnnotations() { |
ConstantFinder finder = new ConstantFinder(); |
_node.accept(finder); |
@@ -954,6 +1007,41 @@ class ConstantFinderTest extends EngineTestCase { |
return element; |
} |
+ VariableDeclaration _setupFieldDeclaration( |
+ String className, String fieldName, Keyword keyword, |
+ {bool isInitialized: true, bool isStatic: false, |
+ bool hasConstConstructor: false}) { |
+ VariableDeclaration variableDeclaration = isInitialized |
+ ? AstFactory.variableDeclaration2(fieldName, AstFactory.integer(0)) |
+ : AstFactory.variableDeclaration(fieldName); |
+ VariableElement fieldElement = ElementFactory.fieldElement(fieldName, |
+ isStatic, keyword == Keyword.FINAL, keyword == Keyword.CONST, |
+ _typeProvider.intType); |
+ variableDeclaration.name.staticElement = fieldElement; |
+ FieldDeclaration fieldDeclaration = AstFactory.fieldDeclaration2( |
+ isStatic, keyword, <VariableDeclaration>[variableDeclaration]); |
+ ClassDeclaration classDeclaration = |
+ AstFactory.classDeclaration(null, className, null, null, null, null); |
+ classDeclaration.members.add(fieldDeclaration); |
+ _node = classDeclaration; |
+ ClassElementImpl classElement = ElementFactory.classElement2(className); |
+ classElement.fields = <FieldElement>[fieldElement]; |
+ classDeclaration.name.staticElement = classElement; |
+ if (hasConstConstructor) { |
+ ConstructorDeclaration constructorDeclaration = AstFactory |
+ .constructorDeclaration2(Keyword.CONST, null, |
+ AstFactory.identifier3(className), null, |
+ AstFactory.formalParameterList(), null, |
+ AstFactory.blockFunctionBody2()); |
+ classDeclaration.members.add(constructorDeclaration); |
+ ConstructorElement constructorElement = |
+ ElementFactory.constructorElement(classElement, '', true); |
+ constructorDeclaration.element = constructorElement; |
+ classElement.constructors = <ConstructorElement>[constructorElement]; |
+ } |
+ return variableDeclaration; |
+ } |
+ |
void _setupInstanceCreationExpression(String name, bool isConst) { |
_node = AstFactory.instanceCreationExpression2( |
isConst ? Keyword.CONST : null, |
@@ -961,15 +1049,15 @@ class ConstantFinderTest extends EngineTestCase { |
} |
VariableElement _setupVariableDeclaration( |
- String name, bool isConst, bool isInitialized) { |
+ String name, bool isConst, bool isInitialized, {isFinal: false}) { |
VariableDeclaration variableDeclaration = isInitialized |
? AstFactory.variableDeclaration2(name, AstFactory.integer(0)) |
: AstFactory.variableDeclaration(name); |
SimpleIdentifier identifier = variableDeclaration.name; |
VariableElement element = ElementFactory.localVariableElement(identifier); |
identifier.staticElement = element; |
- AstFactory.variableDeclarationList2( |
- isConst ? Keyword.CONST : null, [variableDeclaration]); |
+ Keyword keyword = isConst ? Keyword.CONST : isFinal ? Keyword.FINAL : null; |
+ AstFactory.variableDeclarationList2(keyword, [variableDeclaration]); |
_node = variableDeclaration; |
return element; |
} |
@@ -1345,6 +1433,30 @@ class B extends A { |
const B b = const B();'''); |
} |
+ void test_dependencyOnInitializedNonStaticConst() { |
+ // Even though non-static consts are not allowed by the language, we need |
+ // to handle them for error recovery purposes. |
+ // a depends on A() depends on A.x |
+ _assertProperDependencies(''' |
+class A { |
+ const A(); |
+ const int x = 1; |
+} |
+const A a = const A(); |
+''', [CompileTimeErrorCode.CONST_INSTANCE_FIELD]); |
+ } |
+ |
+ void test_dependencyOnInitializedFinal() { |
+ // a depends on A() depends on A.x |
+ _assertProperDependencies(''' |
+class A { |
+ const A(); |
+ final int x = 1; |
+} |
+const A a = const A(); |
+'''); |
+ } |
+ |
void test_dependencyOnNonFactoryRedirect() { |
// a depends on A.foo() depends on A.bar() |
_assertProperDependencies(r''' |
@@ -1430,6 +1542,40 @@ const x = y + 1; |
const y = 2;'''); |
} |
+ void test_final_initialized_at_declaration() { |
+ CompilationUnit compilationUnit = resolveSource(''' |
+class A { |
+ final int i = 123; |
+ const A(); |
+} |
+ |
+const A a = const A(); |
+'''); |
+ EvaluationResultImpl result = |
+ _evaluateInstanceCreationExpression(compilationUnit, 'a'); |
+ Map<String, DartObjectImpl> fields = _assertType(result, "A"); |
+ expect(fields, hasLength(1)); |
+ _assertIntField(fields, "i", 123); |
+ } |
+ |
+ void test_non_static_const_initialized_at_declaration() { |
+ // Even though non-static consts are not allowed by the language, we need |
+ // to handle them for error recovery purposes. |
+ CompilationUnit compilationUnit = resolveSource(''' |
+class A { |
+ const int i = 123; |
+ const A(); |
+} |
+ |
+const A a = const A(); |
+'''); |
+ EvaluationResultImpl result = |
+ _evaluateInstanceCreationExpression(compilationUnit, 'a'); |
+ Map<String, DartObjectImpl> fields = _assertType(result, "A"); |
+ expect(fields, hasLength(1)); |
+ _assertIntField(fields, "i", 123); |
+ } |
+ |
void test_fromEnvironment_bool_default_false() { |
expect(_assertValidBool(_check_fromEnvironment_bool(null, "false")), false); |
} |
@@ -8309,6 +8455,17 @@ class ValidatingConstantValueComputer extends ConstantValueComputer { |
} |
@override |
+ void beforeGetFieldEvaluationResult(FieldElementImpl field) { |
+ super.beforeGetFieldEvaluationResult(field); |
+ // If we are getting the constant value for a node in the graph, make sure |
+ // we properly recorded the dependency. |
+ VariableDeclaration node = findVariableDeclaration(field); |
+ if (node != null && referenceGraph.nodes.contains(node)) { |
+ expect(referenceGraph.containsPath(_nodeBeingEvaluated, node), isTrue); |
+ } |
+ } |
+ |
+ @override |
void beforeGetConstantInitializers(ConstructorElement constructor) { |
super.beforeGetConstantInitializers(constructor); |
// If we are getting the constant initializers for a node in the graph, |