Index: pkg/analyzer/lib/src/generated/resolver.dart |
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart |
index d9dd238ffc742a17039405ce7c3886eab33f51dd..bc4ef3e88d071c65df450d4e9c4b300ae57a15f5 100644 |
--- a/pkg/analyzer/lib/src/generated/resolver.dart |
+++ b/pkg/analyzer/lib/src/generated/resolver.dart |
@@ -9379,6 +9379,27 @@ class TypeProviderImpl extends TypeProviderBase { |
} |
/** |
+ * Modes in which [TypeResolverVisitor] works. |
+ */ |
+enum TypeResolverMode { |
+ /** |
+ * Resolve all names types of all nodes. |
+ */ |
+ everything, |
+ |
+ /** |
+ * Resolve only type names outside of function bodies, variable initializers, |
+ * and parameter default values. |
+ */ |
+ api, |
+ |
+ /** |
+ * Resolve only type names that would be skipped during [api]. |
+ */ |
+ local |
+} |
+ |
+/** |
* Instances of the class `TypeResolverVisitor` are used to resolve the types associated with |
* the elements in the element model. This includes the types of superclasses, mixins, interfaces, |
* fields, methods, parameters, and local variables. As a side-effect, this also finishes building |
@@ -9415,6 +9436,8 @@ class TypeResolverVisitor extends ScopedVisitor { |
*/ |
TypeNameResolver _typeNameResolver; |
+ final TypeResolverMode mode; |
+ |
/** |
* Initialize a newly created visitor to resolve the nodes in an AST node. |
* |
@@ -9432,7 +9455,7 @@ class TypeResolverVisitor extends ScopedVisitor { |
*/ |
TypeResolverVisitor(LibraryElement definingLibrary, Source source, |
TypeProvider typeProvider, AnalysisErrorListener errorListener, |
- {Scope nameScope}) |
+ {Scope nameScope, this.mode: TypeResolverMode.everything}) |
: super(definingLibrary, source, typeProvider, errorListener, |
nameScope: nameScope) { |
_dynamicType = typeProvider.dynamicType; |
@@ -9473,6 +9496,14 @@ class TypeResolverVisitor extends ScopedVisitor { |
} |
@override |
+ Object visitBlockFunctionBody(BlockFunctionBody node) { |
+ if (mode == TypeResolverMode.api) { |
+ return null; |
+ } |
+ return super.visitBlockFunctionBody(node); |
+ } |
+ |
+ @override |
Object visitCatchClause(CatchClause node) { |
super.visitCatchClause(node); |
SimpleIdentifier exception = node.exceptionParameter; |
@@ -9631,6 +9662,14 @@ class TypeResolverVisitor extends ScopedVisitor { |
} |
@override |
+ Object visitExpressionFunctionBody(ExpressionFunctionBody node) { |
+ if (mode == TypeResolverMode.api) { |
+ return null; |
+ } |
+ return super.visitExpressionFunctionBody(node); |
+ } |
+ |
+ @override |
Object visitFieldFormalParameter(FieldFormalParameter node) { |
super.visitFieldFormalParameter(node); |
Element element = node.identifier.staticElement; |
@@ -9742,6 +9781,23 @@ class TypeResolverVisitor extends ScopedVisitor { |
} |
@override |
+ Object visitNode(AstNode node) { |
+ // In API mode we need to ignore: |
+ // - default values of parameters; |
+ // - initializers of top-level variables. |
+ if (mode == TypeResolverMode.api) { |
+ if (node is DefaultFormalParameter) { |
+ node.parameter.accept(this); |
+ return null; |
+ } |
+ if (node is VariableDeclaration) { |
+ return null; |
+ } |
+ } |
+ return super.visitNode(node); |
+ } |
+ |
+ @override |
Object visitSimpleFormalParameter(SimpleFormalParameter node) { |
super.visitSimpleFormalParameter(node); |
DartType declaredType; |