| 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..cad4dc224ab8261d43544cdedb2b1ba4828f9e0f 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/standard_resolution_map.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,10 @@ 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) => resolutionMap
|
| + .elementForCompilationUnit(u)
|
| + .librarySource
|
| + .isInSystemLibrary)) {
|
| var sdk = context.sourceFactory.dartSdk;
|
| summaryData.addBundle(
|
| null,
|
| @@ -234,7 +238,8 @@ 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(resolutionMap.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 +254,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 = resolutionMap.elementForCompilationUnit(unit).library;
|
| if (unit.element != library.definingCompilationUnit) continue;
|
|
|
| var libraryTemp = _isDartRuntime(library)
|
| @@ -272,15 +277,19 @@ 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(
|
| + resolutionMap.elementForCompilationUnit(unit).library)) {
|
| + sdkBootstrappingFns
|
| + .addAll(resolutionMap.elementForCompilationUnit(unit).functions);
|
| }
|
| _collectElements(unit, nodes);
|
| }
|
| _loader = new ElementLoader(nodes);
|
| if (compilationUnits.isNotEmpty) {
|
| _constants = new ConstFieldVisitor(context,
|
| - dummySource: compilationUnits.first.element.source);
|
| + dummySource: resolutionMap
|
| + .elementForCompilationUnit(compilationUnits.first)
|
| + .source);
|
| }
|
|
|
| // Add implicit dart:core dependency so it is first.
|
| @@ -728,7 +737,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
|
|
| @override
|
| JS.Statement visitClassDeclaration(ClassDeclaration node) {
|
| - var classElem = node.element;
|
| + var classElem = resolutionMap.elementDeclaredByClassDeclaration(node);
|
|
|
| // If this class is annotated with `@JS`, then there is nothing to emit.
|
| if (findAnnotation(classElem, isPublicJSAnnotation) != null) return null;
|
| @@ -1110,14 +1119,16 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| new JS.Identifier(
|
| // TODO(ochafik): use a refactored _emitMemberName instead.
|
| decl.name.name,
|
| - type: emitTypeRef(decl.element.type)),
|
| + type: emitTypeRef(resolutionMap
|
| + .elementDeclaredByVariableDeclaration(decl)
|
| + .type)),
|
| null))
|
| .toList(growable: false));
|
| }
|
|
|
| @override
|
| JS.Statement visitEnumDeclaration(EnumDeclaration node) {
|
| - var element = node.element;
|
| + var element = resolutionMap.elementDeclaredByEnumDeclaration(node);
|
| var type = element.type;
|
|
|
| // Generate a class per section 13 of the spec.
|
| @@ -1288,7 +1299,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| List<FieldDeclaration> fields,
|
| List<ClassElement> superclasses,
|
| Map<FieldElement, JS.TemporaryId> virtualFields) {
|
| - var element = node.element;
|
| + var element = resolutionMap.elementDeclaredByClassDeclaration(node);
|
| var type = element.type;
|
| var isObject = type.isObject;
|
|
|
| @@ -1315,7 +1326,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| jsMethods.add(new JS.Method(
|
| _propertyName('constructor'),
|
| js.call('function(...args) { return this.new.apply(this, args); }')
|
| - as JS.Fun));
|
| + as JS.Fun));
|
| } else if (ctors.isEmpty) {
|
| jsMethods.add(_emitImplicitConstructor(node, fields, virtualFields));
|
| }
|
| @@ -1768,7 +1779,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 = resolutionMap.elementDeclaredByMethodDeclaration(node);
|
| // TODO(vsm): Clean up all the nasty duplication.
|
| if (node.isAbstract) {
|
| continue;
|
| @@ -1823,7 +1834,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 = resolutionMap.elementDeclaredByConstructorDeclaration(node);
|
| var type = _emitAnnotatedFunctionType(element.type, node.metadata,
|
| parameters: node.parameters.parameters,
|
| nameType: options.hoistSignatureTypes,
|
| @@ -1895,7 +1906,9 @@ 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 &&
|
| + resolutionMap.elementDeclaredByMethodDeclaration(m).isPublic) {
|
| dartxNames.add(_declareMemberName(m.element, useExtension: false));
|
| }
|
| }
|
| @@ -1957,7 +1970,9 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| if (superCall != null) {
|
| body.add(superCall);
|
| }
|
| - var name = _constructorName(node.element.unnamedConstructor);
|
| + var name = _constructorName(resolutionMap
|
| + .elementDeclaredByClassDeclaration(node)
|
| + .unnamedConstructor);
|
| return annotate(
|
| new JS.Method(name, js.call('function() { #; }', [body]) as JS.Fun),
|
| node,
|
| @@ -1973,12 +1988,18 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| if (_externalOrNative(node)) return null;
|
|
|
| var name = _constructorName(node.element);
|
| - var returnType = emitTypeRef(node.element.enclosingElement.type);
|
| + var returnType = emitTypeRef(resolutionMap
|
| + .elementDeclaredByConstructorDeclaration(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 =
|
| + resolutionMap.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 +2108,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| @override
|
| JS.Statement visitRedirectingConstructorInvocation(
|
| RedirectingConstructorInvocation node) {
|
| - var ctor = node.staticElement;
|
| + var ctor = resolutionMap.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 +2285,11 @@ 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 =
|
| + resolutionMap.elementDeclaredByFormalParameter(param).type;
|
| if (node is MethodDeclaration &&
|
| - (param.element.isCovariant || _unsoundCovariant(paramType, true)) &&
|
| + (resolutionMap.elementDeclaredByFormalParameter(param).isCovariant ||
|
| + _unsoundCovariant(paramType, true)) &&
|
| !_inWhitelistCode(node)) {
|
| var castType = _emitType(paramType,
|
| nameType: options.nameTypeTests || options.hoistTypeTests,
|
| @@ -2411,7 +2434,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| fn = _simplifyPassThroughArrowFunCallBody(fn);
|
| }
|
|
|
| - var element = node.element;
|
| + var element = resolutionMap.elementDeclaredByFunctionDeclaration(node);
|
| var nameExpr = _emitTopLevelName(element);
|
| body.add(annotate(js.statement('# = #', [nameExpr, fn]), node, element));
|
| if (!_isDartRuntime(element.library)) {
|
| @@ -2679,7 +2702,9 @@ class CodeGenerator extends GeneralizingAstVisitor
|
|
|
| return new JS.Block([
|
| declareFn,
|
| - _emitFunctionTagged(name, func.element.type).toStatement()
|
| + _emitFunctionTagged(name,
|
| + resolutionMap.elementDeclaredByFunctionDeclaration(func).type)
|
| + .toStatement()
|
| ]);
|
| }
|
|
|
| @@ -2699,7 +2724,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 = resolutionMap.staticElementForIdentifier(node);
|
| if (accessor == null) {
|
| return js.commentExpression(
|
| 'Unimplemented unknown name', new JS.Identifier(node.name));
|
| @@ -3230,7 +3255,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| return _badAssignment("Unimplemented: unknown name '$node'", node, rhs);
|
| }
|
|
|
| - var accessor = node.staticElement;
|
| + var accessor = resolutionMap.staticElementForIdentifier(node);
|
| if (accessor == null) return unimplemented();
|
|
|
| // Get the original declaring element. If we had a property accessor, this
|
| @@ -3392,7 +3417,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| return _emitFunctionCall(node);
|
| }
|
| if (node.methodName.name == 'call') {
|
| - var targetType = target.staticType;
|
| + var targetType = resolutionMap.staticTypeForExpression(target);
|
| if (targetType is FunctionType) {
|
| // Call methods on function types should be handled as regular function
|
| // invocations.
|
| @@ -3866,8 +3891,9 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| return _emitTopLevelField(node);
|
| }
|
|
|
| - var name =
|
| - new JS.Identifier(node.name.name, type: emitTypeRef(node.element.type));
|
| + var name = new JS.Identifier(node.name.name,
|
| + type: emitTypeRef(
|
| + resolutionMap.elementDeclaredByVariableDeclaration(node).type));
|
| return new JS.VariableInitialization(name, _visitInitializer(node));
|
| }
|
|
|
| @@ -3972,7 +3998,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| new JS.Method(
|
| access,
|
| js.call('function() { return #; }', _visitInitializer(node))
|
| - as JS.Fun,
|
| + as JS.Fun,
|
| isGetter: true),
|
| node,
|
| _findAccessor(element, getter: true)));
|
| @@ -4084,7 +4110,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
|
|
| @override
|
| visitInstanceCreationExpression(InstanceCreationExpression node) {
|
| - var element = node.staticElement;
|
| + var element = resolutionMap.staticElementForConstructorReference(node);
|
| var constructor = node.constructorName;
|
| var name = constructor.name;
|
| var type = constructor.type.type;
|
| @@ -4532,7 +4558,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| }
|
| result = astFactory.prefixedIdentifier(
|
| _bindValue(scope, 'o', ident.prefix, context: context)
|
| - as SimpleIdentifier,
|
| + as SimpleIdentifier,
|
| ident.period,
|
| ident.identifier);
|
| } else {
|
| @@ -5773,7 +5799,9 @@ 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 = resolutionMap
|
| + .elementForCompilationUnit(target.root as CompilationUnit)
|
| + .library;
|
| var imports = containingLibrary.getImportsWithPrefix(prefix);
|
| return imports.length == 1 && imports[0].isDeferred;
|
| }
|
|
|