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();
}