Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(193)

Unified Diff: pkg/dev_compiler/lib/src/compiler/code_generator.dart

Issue 2551023005: Prepare for decoupling analyzer ASTs from element model. (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: pkg/dev_compiler/lib/src/compiler/code_generator.dart
diff --git a/pkg/dev_compiler/lib/src/compiler/code_generator.dart b/pkg/dev_compiler/lib/src/compiler/code_generator.dart
index 3b9e89e35eb526627161c0b266b5cec3f2aa6237..289a69688153c9161b84cce9c8aee9d33570f9b4 100644
--- a/pkg/dev_compiler/lib/src/compiler/code_generator.dart
+++ b/pkg/dev_compiler/lib/src/compiler/code_generator.dart
@@ -10,6 +10,7 @@ import 'package:analyzer/analyzer.dart' hide ConstantEvaluator;
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/standard_ast_factory.dart';
import 'package:analyzer/dart/ast/token.dart' show Token, TokenType;
+import 'package:analyzer/dart/ast/resolution_accessors.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/src/dart/ast/token.dart' show StringToken;
@@ -192,7 +193,7 @@ class CodeGenerator extends GeneralizingAstVisitor
List<int> _summarizeModule(List<CompilationUnit> units) {
if (!options.summarizeApi) return null;
- if (!units.any((u) => u.element.librarySource.isInSystemLibrary)) {
+ if (!units.any((u) => elementForCompilationUnit(u).librarySource.isInSystemLibrary)) {
var sdk = context.sourceFactory.dartSdk;
summaryData.addBundle(
null,
@@ -234,7 +235,7 @@ class CodeGenerator extends GeneralizingAstVisitor
// Transform the AST to make coercions explicit.
compilationUnits = CoercionReifier.reify(compilationUnits);
- if (compilationUnits.any((u) => _isDartRuntime(u.element.library))) {
+ if (compilationUnits.any((u) => _isDartRuntime(elementForCompilationUnit(u).library))) {
// Don't allow these to be renamed when we're building the SDK.
// There is JS code in dart:* that depends on their names.
_runtimeModule = new JS.Identifier('dart');
@@ -249,7 +250,7 @@ class CodeGenerator extends GeneralizingAstVisitor
// Initialize our library variables.
var items = <JS.ModuleItem>[];
for (var unit in compilationUnits) {
- var library = unit.element.library;
+ var library = elementForCompilationUnit(unit).library;
if (unit.element != library.definingCompilationUnit) continue;
var libraryTemp = _isDartRuntime(library)
@@ -272,15 +273,15 @@ class CodeGenerator extends GeneralizingAstVisitor
var nodes = new HashMap<Element, AstNode>.identity();
var sdkBootstrappingFns = new List<FunctionElement>();
for (var unit in compilationUnits) {
- if (_isDartRuntime(unit.element.library)) {
- sdkBootstrappingFns.addAll(unit.element.functions);
+ if (_isDartRuntime(elementForCompilationUnit(unit).library)) {
+ sdkBootstrappingFns.addAll(elementForCompilationUnit(unit).functions);
}
_collectElements(unit, nodes);
}
_loader = new ElementLoader(nodes);
if (compilationUnits.isNotEmpty) {
_constants = new ConstFieldVisitor(context,
- dummySource: compilationUnits.first.element.source);
+ dummySource: elementForCompilationUnit(compilationUnits.first).source);
}
// Add implicit dart:core dependency so it is first.
@@ -728,7 +729,7 @@ class CodeGenerator extends GeneralizingAstVisitor
@override
JS.Statement visitClassDeclaration(ClassDeclaration node) {
- var classElem = node.element;
+ var classElem = elementForClassDeclaration(node);
// If this class is annotated with `@JS`, then there is nothing to emit.
if (findAnnotation(classElem, isPublicJSAnnotation) != null) return null;
@@ -1110,14 +1111,14 @@ class CodeGenerator extends GeneralizingAstVisitor
new JS.Identifier(
// TODO(ochafik): use a refactored _emitMemberName instead.
decl.name.name,
- type: emitTypeRef(decl.element.type)),
+ type: emitTypeRef(elementForVariableDeclaration(decl).type)),
null))
.toList(growable: false));
}
@override
JS.Statement visitEnumDeclaration(EnumDeclaration node) {
- var element = node.element;
+ var element = elementForEnumDeclaration(node);
var type = element.type;
// Generate a class per section 13 of the spec.
@@ -1288,7 +1289,7 @@ class CodeGenerator extends GeneralizingAstVisitor
List<FieldDeclaration> fields,
List<ClassElement> superclasses,
Map<FieldElement, JS.TemporaryId> virtualFields) {
- var element = node.element;
+ var element = elementForClassDeclaration(node);
var type = element.type;
var isObject = type.isObject;
@@ -1768,7 +1769,7 @@ class CodeGenerator extends GeneralizingAstVisitor
var sNames = <JS.Expression>[];
for (MethodDeclaration node in methods) {
var name = node.name.name;
- var element = node.element;
+ var element = elementForMethodDeclaration(node);
// TODO(vsm): Clean up all the nasty duplication.
if (node.isAbstract) {
continue;
@@ -1823,7 +1824,7 @@ class CodeGenerator extends GeneralizingAstVisitor
var tCtors = <JS.Property>[];
for (ConstructorDeclaration node in ctors) {
var memberName = _constructorName(node.element);
- var element = node.element;
+ var element = elementForConstructorDeclaration(node);
var type = _emitAnnotatedFunctionType(element.type, node.metadata,
parameters: node.parameters.parameters,
nameType: options.hoistSignatureTypes,
@@ -1895,7 +1896,7 @@ class CodeGenerator extends GeneralizingAstVisitor
if (_extensionTypes.hasNativeSubtype(classElem.type)) {
var dartxNames = <JS.Expression>[];
for (var m in methods) {
- if (!m.isAbstract && !m.isStatic && m.element.isPublic) {
+ if (!m.isAbstract && !m.isStatic && elementForMethodDeclaration(m).isPublic) {
dartxNames.add(_declareMemberName(m.element, useExtension: false));
}
}
@@ -1957,7 +1958,7 @@ class CodeGenerator extends GeneralizingAstVisitor
if (superCall != null) {
body.add(superCall);
}
- var name = _constructorName(node.element.unnamedConstructor);
+ var name = _constructorName(elementForClassDeclaration(node).unnamedConstructor);
return annotate(
new JS.Method(name, js.call('function() { #; }', [body]) as JS.Fun),
node,
@@ -1973,12 +1974,12 @@ class CodeGenerator extends GeneralizingAstVisitor
if (_externalOrNative(node)) return null;
var name = _constructorName(node.element);
- var returnType = emitTypeRef(node.element.enclosingElement.type);
+ var returnType = emitTypeRef(elementForConstructorDeclaration(node).enclosingElement.type);
// Wacky factory redirecting constructors: factory Foo.q(x, y) = Bar.baz;
var redirect = node.redirectedConstructor;
if (redirect != null) {
- var newKeyword = redirect.staticElement.isFactory ? '' : 'new';
+ var newKeyword = staticElementForConstructorReference(redirect).isFactory ? '' : 'new';
// Pass along all arguments verbatim, and let the callee handle them.
// TODO(jmesserly): we'll need something different once we have
// rest/spread support, but this should work for now.
@@ -2087,7 +2088,7 @@ class CodeGenerator extends GeneralizingAstVisitor
@override
JS.Statement visitRedirectingConstructorInvocation(
RedirectingConstructorInvocation node) {
- var ctor = node.staticElement;
+ var ctor = staticElementForConstructorReference(node);
var cls = ctor.enclosingElement;
// We can't dispatch to the constructor with `this.new` as that might hit a
// derived class constructor with the same name.
@@ -2264,9 +2265,9 @@ class CodeGenerator extends GeneralizingAstVisitor
// TODO(jmesserly): various problems here, see:
// https://github.com/dart-lang/dev_compiler/issues/116
- var paramType = param.element.type;
+ var paramType = elementForFormalParameter(param).type;
if (node is MethodDeclaration &&
- (param.element.isCovariant || _unsoundCovariant(paramType, true)) &&
+ (elementForFormalParameter(param).isCovariant || _unsoundCovariant(paramType, true)) &&
!_inWhitelistCode(node)) {
var castType = _emitType(paramType,
nameType: options.nameTypeTests || options.hoistTypeTests,
@@ -2411,7 +2412,7 @@ class CodeGenerator extends GeneralizingAstVisitor
fn = _simplifyPassThroughArrowFunCallBody(fn);
}
- var element = node.element;
+ var element = elementForFunctionDeclaration(node);
var nameExpr = _emitTopLevelName(element);
body.add(annotate(js.statement('# = #', [nameExpr, fn]), node, element));
if (!_isDartRuntime(element.library)) {
@@ -2679,7 +2680,7 @@ class CodeGenerator extends GeneralizingAstVisitor
return new JS.Block([
declareFn,
- _emitFunctionTagged(name, func.element.type).toStatement()
+ _emitFunctionTagged(name, elementForFunctionDeclaration(func).type).toStatement()
]);
}
@@ -2699,7 +2700,7 @@ class CodeGenerator extends GeneralizingAstVisitor
/// going through the qualified library name if necessary, but *not* handling
/// inferred generic function instantiation.
JS.Expression _emitSimpleIdentifier(SimpleIdentifier node) {
- var accessor = node.staticElement;
+ var accessor = staticElementForIdentifier(node);
if (accessor == null) {
return js.commentExpression(
'Unimplemented unknown name', new JS.Identifier(node.name));
@@ -3230,7 +3231,7 @@ class CodeGenerator extends GeneralizingAstVisitor
return _badAssignment("Unimplemented: unknown name '$node'", node, rhs);
}
- var accessor = node.staticElement;
+ var accessor = staticElementForIdentifier(node);
if (accessor == null) return unimplemented();
// Get the original declaring element. If we had a property accessor, this
@@ -3392,7 +3393,7 @@ class CodeGenerator extends GeneralizingAstVisitor
return _emitFunctionCall(node);
}
if (node.methodName.name == 'call') {
- var targetType = target.staticType;
+ var targetType = staticTypeForExpression(target);
if (targetType is FunctionType) {
// Call methods on function types should be handled as regular function
// invocations.
@@ -3867,7 +3868,7 @@ class CodeGenerator extends GeneralizingAstVisitor
}
var name =
- new JS.Identifier(node.name.name, type: emitTypeRef(node.element.type));
+ new JS.Identifier(node.name.name, type: emitTypeRef(elementForVariableDeclaration(node).type));
return new JS.VariableInitialization(name, _visitInitializer(node));
}
@@ -4084,7 +4085,7 @@ class CodeGenerator extends GeneralizingAstVisitor
@override
visitInstanceCreationExpression(InstanceCreationExpression node) {
- var element = node.staticElement;
+ var element = staticElementForConstructorReference(node);
var constructor = node.constructorName;
var name = constructor.name;
var type = constructor.type.type;
@@ -5773,7 +5774,7 @@ bool _isDeferredLoadLibrary(Expression target, SimpleIdentifier name) {
var prefix = targetIdentifier.staticElement as PrefixElement;
// The library the prefix is referring to must come from a deferred import.
- var containingLibrary = (target.root as CompilationUnit).element.library;
+ var containingLibrary = elementForCompilationUnit(target.root as CompilationUnit).library;
var imports = containingLibrary.getImportsWithPrefix(prefix);
return imports.length == 1 && imports[0].isDeferred;
}

Powered by Google App Engine
This is Rietveld 408576698