| 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; | 
| } | 
|  |