diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart index b3ebf63f60b..b24c069216c 100644 --- a/pkg/analyzer/lib/src/generated/resolver.dart +++ b/pkg/analyzer/lib/src/generated/resolver.dart @@ -10905,27 +10905,6 @@ class ResolverVisitor extends ScopedVisitor { node.accept(typeAnalyzer); } - @override - void visitClassMembersInScope(ClassDeclaration node) { - safelyVisit(node.documentationComment); - node.metadata.accept(this); - // - // Visit the fields before other members so that instance fields will have - // propagated types associated with them before we see their use sites. - // - List nonFields = []; - for (ClassMember member in node.members) { - if (member is FieldDeclaration) { - member.accept(this); - } else { - nonFields.add(member); - } - } - for (ClassMember member in nonFields) { - member.accept(this); - } - } - @override Object visitComment(Comment node) { if (node.parent is FunctionDeclaration || @@ -11538,30 +11517,9 @@ class ResolverVisitor extends ScopedVisitor { Object visitVariableDeclaration(VariableDeclaration node) { super.visitVariableDeclaration(node); VariableElement element = node.element; - FunctionElement initializerElement = element.initializer; - Expression initializer = node.initializer; - if (initializerElement is FunctionElementImpl && initializer != null) { - initializerElement.returnType = initializer.staticType; - } - // - // Propagate types for instance fields. Top-level variables and static - // fields are handled elsewhere. - // - // TODO(brianwilkerson) Instance field propagation should probably be moved - // into the class InstanceMemberInferrer because we're already doing - // something there for strong mode. - // - if (initializer != null && - element is FieldElementImpl && - !element.isStatic && - element.isFinal) { - DartType staticType = element.type; - DartType bestType = initializer.bestType; - if (bestType != null && - bestType != staticType && - bestType.isMoreSpecificThan(staticType)) { - element.propagatedType = bestType; - } + if (element.initializer != null && node.initializer != null) { + (element.initializer as FunctionElementImpl).returnType = + node.initializer.staticType; } // Note: in addition to cloning the initializers for const variables, we // have to clone the initializers for non-static final fields (because if @@ -11571,9 +11529,9 @@ class ResolverVisitor extends ScopedVisitor { (element is FieldElement && element.isFinal && !element.isStatic)) && - initializer != null) { + node.initializer != null) { (element as ConstVariableElement).constantInitializer = - new ConstantAstCloner().cloneNode(initializer); + new ConstantAstCloner().cloneNode(node.initializer); } return null; } diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart index dcd5092e8d4..b308c9be981 100644 --- a/pkg/analyzer/test/generated/resolver_test.dart +++ b/pkg/analyzer/test/generated/resolver_test.dart @@ -12731,6 +12731,70 @@ class TypeOverrideManagerTest extends EngineTestCase { @reflectiveTest class TypePropagationTest extends ResolverTestCase { + void fail_finalPropertyInducingVariable_classMember_instance() { + addNamedSource( + "/lib.dart", + r''' +class A { + final v = 0; +}'''); + String code = r''' +import 'lib.dart'; +f(A a) { + return a.v; // marker +}'''; + _assertTypeOfMarkedExpression( + code, typeProvider.dynamicType, typeProvider.intType); + } + + void fail_finalPropertyInducingVariable_classMember_instance_inherited() { + addNamedSource( + "/lib.dart", + r''' +class A { + final v = 0; +}'''); + String code = r''' +import 'lib.dart'; +class B extends A { + m() { + return v; // marker + } +}'''; + _assertTypeOfMarkedExpression( + code, typeProvider.dynamicType, typeProvider.intType); + } + + void fail_finalPropertyInducingVariable_classMember_instance_propagatedTarget() { + addNamedSource( + "/lib.dart", + r''' +class A { + final v = 0; +}'''); + String code = r''' +import 'lib.dart'; +f(p) { + if (p is A) { + return p.v; // marker + } +}'''; + _assertTypeOfMarkedExpression( + code, typeProvider.dynamicType, typeProvider.intType); + } + + void fail_finalPropertyInducingVariable_classMember_instance_unprefixed() { + String code = r''' +class A { + final v = 0; + m() { + v; // marker + } +}'''; + _assertTypeOfMarkedExpression( + code, typeProvider.dynamicType, typeProvider.intType); + } + void fail_finalPropertyInducingVariable_classMember_static() { addNamedSource( "/lib.dart", @@ -13053,70 +13117,6 @@ main(CanvasElement canvas) { expect(identifier.propagatedType.name, "CanvasRenderingContext2D"); } - void test_finalPropertyInducingVariable_classMember_instance() { - addNamedSource( - "/lib.dart", - r''' -class A { - final v = 0; -}'''); - String code = r''' -import 'lib.dart'; -f(A a) { - return a.v; // marker -}'''; - _assertTypeOfMarkedExpression( - code, typeProvider.dynamicType, typeProvider.intType); - } - - void test_finalPropertyInducingVariable_classMember_instance_inherited() { - addNamedSource( - "/lib.dart", - r''' -class A { - final v = 0; -}'''); - String code = r''' -import 'lib.dart'; -class B extends A { - m() { - return v; // marker - } -}'''; - _assertTypeOfMarkedExpression( - code, typeProvider.dynamicType, typeProvider.intType); - } - - void test_finalPropertyInducingVariable_classMember_instance_propagatedTarget() { - addNamedSource( - "/lib.dart", - r''' -class A { - final v = 0; -}'''); - String code = r''' -import 'lib.dart'; -f(p) { - if (p is A) { - return p.v; // marker - } -}'''; - _assertTypeOfMarkedExpression( - code, typeProvider.dynamicType, typeProvider.intType); - } - - void test_finalPropertyInducingVariable_classMember_instance_unprefixed() { - String code = r''' -class A { - final v = 0; - m() { - v; // marker - } -}'''; - _assertTypeOfMarkedExpression( - code, typeProvider.dynamicType, typeProvider.intType); - } - void test_forEach() { String code = r''' main() {