blob: a8a0d5aebf3b2e4a14389e1810c4a4ad457eec85 [file] [log] [blame]
// 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/error/listener.dart';
import 'package:analyzer/src/generated/resolver.dart';
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer/src/summary2/link.dart';
/// Used to resolve some AST nodes - variable initializers, and annotations.
class AstResolver {
final Linker _linker;
final LibraryElement _library;
final Scope _nameScope;
AstResolver(this._linker, this._library, this._nameScope);
void resolve(
AstNode node, {
ClassElement enclosingClassElement,
ExecutableElement enclosingExecutableElement,
bool doAstRewrite = false,
}) {
var source = _FakeSource();
var errorListener = AnalysisErrorListener.NULL_LISTENER;
var typeResolverVisitor = new TypeResolverVisitor(
_library, source, _linker.typeProvider, errorListener,
nameScope: _nameScope);
node.accept(typeResolverVisitor);
if (doAstRewrite) {
var astRewriteVisitor = new AstRewriteVisitor(_linker.typeSystem,
_library, source, _linker.typeProvider, errorListener,
nameScope: _nameScope);
node.accept(astRewriteVisitor);
}
// expression.accept(_variableResolverVisitor);
// if (_linker.getAst != null) {
// expression.accept(_partialResolverVisitor);
// }
var resolverVisitor = new ResolverVisitor(_linker.inheritance, _library,
source, _linker.typeProvider, errorListener,
nameScope: _nameScope,
propagateTypes: false,
reportConstEvaluationErrors: false);
resolverVisitor.prepareEnclosingDeclarations(
enclosingClassElement: enclosingClassElement,
enclosingExecutableElement: enclosingExecutableElement,
);
node.accept(resolverVisitor);
}
}
class _FakeSource implements Source {
noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
}