blob: c3dcf81b024097b53a091b0eded5e55966527f46 [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/summary/idl.dart';
import 'package:analyzer/src/summary2/ast_binary_writer.dart';
import 'package:analyzer/src/summary2/builder/source_library_builder.dart';
import 'package:analyzer/src/summary2/link.dart';
import 'package:analyzer/src/summary2/reference.dart';
/// Used to resolve some AST nodes - variable initializers, and annotations.
class AstResolver {
final Linker _linker;
LibraryElement _library;
Scope _nameScope;
AstResolver(this._linker, Reference libraryRef) {
_library = _linker.elementFactory.elementOfReference(libraryRef);
_nameScope = LibraryScope(_library);
}
LinkedNode resolve(UnitBuilder unit, AstNode node) {
var source = _FakeSource();
var errorListener = AnalysisErrorListener.NULL_LISTENER;
var typeResolverVisitor = new TypeResolverVisitor(
_library, source, _linker.typeProvider, errorListener,
nameScope: _nameScope);
node.accept(typeResolverVisitor);
// expression.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);
node.accept(resolverVisitor);
var writer = AstBinaryWriter(
_linker.linkingBundleContext,
unit.context.tokensContext,
);
return writer.writeNode(node);
}
}
class _FakeSource implements Source {
noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
}