Use correct scopes for one-phase summary type inference.

Change-Id: I2ec5519e73881754426ea4f2560fbb487607efb9
Reviewed-on: https://dart-review.googlesource.com/74665
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 7035b35..b1b7397 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -3272,11 +3272,7 @@
 
   @override
   E getAncestor<E extends Element>(Predicate<Element> predicate) {
-    Element ancestor = _enclosingElement;
-    while (ancestor != null && !predicate(ancestor)) {
-      ancestor = ancestor.enclosingElement;
-    }
-    return ancestor as E;
+    return getAncestorStatic<E>(_enclosingElement, predicate);
   }
 
   /**
@@ -3421,6 +3417,15 @@
     }
     throw new StateError('Unable to find $item in $items');
   }
+
+  static E getAncestorStatic<E extends Element>(
+      Element startingPoint, Predicate<Element> predicate) {
+    Element ancestor = startingPoint;
+    while (ancestor != null && !predicate(ancestor)) {
+      ancestor = ancestor.enclosingElement;
+    }
+    return ancestor as E;
+  }
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/summary/link.dart b/pkg/analyzer/lib/src/summary/link.dart
index 605ed50..27c379a 100644
--- a/pkg/analyzer/lib/src/summary/link.dart
+++ b/pkg/analyzer/lib/src/summary/link.dart
@@ -67,6 +67,7 @@
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/resolver/inheritance_manager.dart';
 import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
@@ -2223,6 +2224,8 @@
   FunctionElementForLink_Local _functionElement;
 
   factory ExprTypeComputer(FunctionElementForLink_Local functionElement) {
+    ClassElement enclosingClass =
+        functionElement.getAncestor((e) => e is ClassElement);
     CompilationUnitElementForLink unit = functionElement.compilationUnit;
     LibraryElementForLink library = unit.enclosingElement;
     Linker linker = library._linker;
@@ -2233,19 +2236,25 @@
     var source = unit.source;
     var astRewriteVisitor = new AstRewriteVisitor(
         linker.typeSystem, library, source, typeProvider, errorListener);
-    // TODO(paulberry): Do we need to pass a nameScope to
-    // resolverVisitor to get type variables to resolve properly?
+    EnclosedScope nameScope = new LibraryScope(library);
+    if (enclosingClass != null) {
+      nameScope = new ClassScope(
+          new TypeParameterScope(nameScope, enclosingClass), enclosingClass);
+    }
     var resolverVisitor = new ResolverVisitor(
         library, source, typeProvider, errorListener,
-        propagateTypes: false, reportConstEvaluationErrors: false);
-    var typeResolverVisitor =
-        new TypeResolverVisitor(library, source, typeProvider, errorListener);
-    LibraryScope libraryScope = new LibraryScope(library);
+        nameScope: nameScope,
+        propagateTypes: false,
+        reportConstEvaluationErrors: false);
+    var typeResolverVisitor = new TypeResolverVisitor(
+        library, source, typeProvider, errorListener,
+        nameScope: nameScope);
     var variableResolverVisitor = new VariableResolverVisitor(
         library, source, typeProvider, errorListener,
-        nameScope: libraryScope);
+        nameScope: nameScope);
     var partialResolverVisitor = new PartialResolverVisitor(
-        library, source, typeProvider, errorListener);
+        library, source, typeProvider, errorListener,
+        nameScope: nameScope);
     return new ExprTypeComputer._(
         unit._unitResynthesizer,
         astRewriteVisitor,
@@ -2637,6 +2646,11 @@
   bool get _hasTypeBeenInferred => _inferredReturnType != null;
 
   @override
+  E getAncestor<E extends Element>(Predicate<Element> predicate) {
+    return ElementImpl.getAncestorStatic(enclosingElement, predicate);
+  }
+
+  @override
   FunctionElementForLink_Local getLocalFunction(int index) {
     List<FunctionElementForLink_Local_NonSynthetic> functions = this.functions;
     return index < functions.length ? functions[index] : null;
@@ -2778,6 +2792,11 @@
   }
 
   @override
+  E getAncestor<E extends Element>(Predicate<Element> predicate) {
+    return ElementImpl.getAncestorStatic(enclosingElement, predicate);
+  }
+
+  @override
   FunctionElementForLink_Local getLocalFunction(int index) {
     List<FunctionElementForLink_Local_NonSynthetic> functions = this.functions;
     return index < functions.length ? functions[index] : null;
diff --git a/pkg/analyzer/test/src/summary/summarize_ast_one_phase_test.dart b/pkg/analyzer/test/src/summary/summarize_ast_one_phase_test.dart
index 9bd6dd6..7b6f960 100644
--- a/pkg/analyzer/test/src/summary/summarize_ast_one_phase_test.dart
+++ b/pkg/analyzer/test/src/summary/summarize_ast_one_phase_test.dart
@@ -48,12 +48,6 @@
 
   @override
   @failingTest
-  test_field_final_typeParameter() {
-    super.test_field_final_typeParameter();
-  }
-
-  @override
-  @failingTest
   test_field_inferred_type_nonstatic_implicit_initialized() {
     super.test_field_inferred_type_nonstatic_implicit_initialized();
   }