| // Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| import 'package:analyzer/dart/ast/ast.dart'; |
| import 'package:analyzer/dart/element/element.dart'; |
| import 'package:analyzer/dart/element/scope.dart'; |
| import 'package:analyzer/error/listener.dart'; |
| import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart'; |
| import 'package:analyzer/src/dart/resolver/resolution_visitor.dart'; |
| import 'package:analyzer/src/generated/resolver.dart'; |
| import 'package:analyzer/src/summary2/link.dart'; |
| |
| /// Used to resolve some AST nodes - variable initializers, and annotations. |
| class AstResolver { |
| final Linker _linker; |
| final CompilationUnitElement _unitElement; |
| final Scope _nameScope; |
| |
| AstResolver(this._linker, this._unitElement, this._nameScope); |
| |
| void resolve( |
| AstNode node, |
| AstNode Function() getNode, { |
| bool buildElements = true, |
| bool isTopLevelVariableInitializer = false, |
| ClassElement enclosingClassElement, |
| ExecutableElement enclosingExecutableElement, |
| FunctionBody enclosingFunctionBody, |
| }) { |
| var featureSet = node.thisOrAncestorOfType<CompilationUnit>().featureSet; |
| var errorListener = AnalysisErrorListener.NULL_LISTENER; |
| |
| if (buildElements) { |
| node.accept( |
| ResolutionVisitor( |
| unitElement: _unitElement, |
| featureSet: featureSet, |
| nameScope: _nameScope, |
| errorListener: errorListener, |
| ), |
| ); |
| node = getNode(); |
| |
| var variableResolverVisitor = VariableResolverVisitor( |
| _unitElement.library, |
| _unitElement.source, |
| _unitElement.library.typeProvider, |
| errorListener, |
| nameScope: _nameScope, |
| ); |
| node.accept(variableResolverVisitor); |
| } |
| |
| FlowAnalysisHelper flowAnalysis; |
| if (isTopLevelVariableInitializer) { |
| if (_unitElement.library.isNonNullableByDefault) { |
| flowAnalysis = FlowAnalysisHelper( |
| _unitElement.library.typeSystem, |
| false, |
| ); |
| flowAnalysis.topLevelDeclaration_enter(node.parent, null, null); |
| } |
| } |
| |
| var resolverVisitor = ResolverVisitor( |
| _linker.inheritance, |
| _unitElement.library, |
| _unitElement.source, |
| _unitElement.library.typeProvider, |
| errorListener, |
| featureSet: featureSet, |
| nameScope: _nameScope, |
| reportConstEvaluationErrors: false, |
| flowAnalysisHelper: flowAnalysis, |
| ); |
| resolverVisitor.prepareEnclosingDeclarations( |
| enclosingClassElement: enclosingClassElement, |
| enclosingExecutableElement: enclosingExecutableElement, |
| ); |
| if (enclosingFunctionBody != null) { |
| resolverVisitor.prepareCurrentFunctionBody(enclosingFunctionBody); |
| } |
| |
| node.accept(resolverVisitor); |
| |
| if (isTopLevelVariableInitializer) { |
| flowAnalysis?.topLevelDeclaration_exit(); |
| } |
| } |
| } |