| 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 c62aa11e635e922f45cb7278f7ae3701ea1a856d..54f4b6fd5741d5b8f1aecfdb910a2a55b657e225 100644
|
| --- a/pkg/dev_compiler/lib/src/compiler/code_generator.dart
|
| +++ b/pkg/dev_compiler/lib/src/compiler/code_generator.dart
|
| @@ -1,4 +1,5 @@
|
| // Copyright (c) 2015, 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.
|
|
|
| @@ -29,7 +30,7 @@ import 'package:analyzer/src/summary/summarize_elements.dart'
|
| show PackageBundleAssembler;
|
| import 'package:analyzer/src/summary/summary_sdk.dart';
|
| import 'package:analyzer/src/task/strong/ast_properties.dart'
|
| - show isDynamicInvoke, setIsDynamicInvoke;
|
| + show isDynamicInvoke, setIsDynamicInvoke, getImplicitAssignmentCast;
|
| import 'package:path/path.dart' show separator;
|
|
|
| import '../closure/closure_annotator.dart' show ClosureAnnotator;
|
| @@ -559,19 +560,13 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| var type = _emitType(to,
|
| nameType: options.nameTypeTests || options.hoistTypeTests,
|
| hoistType: options.hoistTypeTests);
|
| - if (isReifiedCoercion(node)) {
|
| + if (CoercionReifier.isImplicitCast(node)) {
|
| return js.call('#._check(#)', [type, jsFrom]);
|
| } else {
|
| return js.call('#.as(#)', [type, jsFrom]);
|
| }
|
| }
|
|
|
| - bool isReifiedCoercion(AstNode node) {
|
| - // TODO(sra): Find a better way to recognize reified coercion, since we
|
| - // can't set the isSynthetic attribute.
|
| - return (node is AsExpression) && (node.asOperator.offset == 0);
|
| - }
|
| -
|
| @override
|
| visitIsExpression(IsExpression node) {
|
| // Generate `is` as `dart.is` or `typeof` depending on the RHS type.
|
| @@ -1930,8 +1925,8 @@ class CodeGenerator extends GeneralizingAstVisitor
|
|
|
| var fun = new JS.Fun(
|
| params,
|
| - js.statement(
|
| - '{ return $newKeyword #(#); }', [_visit(redirect), params]),
|
| + js.statement('{ return $newKeyword #(#); }',
|
| + [_visit(redirect) as JS.Node, params]),
|
| returnType: returnType);
|
| return annotate(
|
| new JS.Method(name, fun, isStatic: true), node, node.element);
|
| @@ -3014,9 +3009,12 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| // (for example, x is IndexExpression) we evaluate those once.
|
| var vars = <JS.MetaLetVariable, JS.Expression>{};
|
| var lhs = _bindLeftHandSide(vars, left, context: context);
|
| - var inc = AstBuilder.binaryExpression(lhs, op, right);
|
| - inc.staticElement = element;
|
| - inc.staticType = getStaticType(left);
|
| + Expression inc = AstBuilder.binaryExpression(lhs, op, right)
|
| + ..staticElement = element
|
| + ..staticType = getStaticType(lhs);
|
| +
|
| + var castTo = getImplicitAssignmentCast(left);
|
| + if (castTo != null) inc = CoercionReifier.castExpression(inc, castTo);
|
| return new JS.MetaLet(vars, [_emitSet(lhs, inc)]);
|
| }
|
|
|
| @@ -4544,7 +4542,8 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| }
|
| }
|
| if (tail.isEmpty) return _visit(node);
|
| - return js.call('dart.nullSafe(#, #)', [_visit(node), tail.reversed]);
|
| + return js.call(
|
| + 'dart.nullSafe(#, #)', [_visit(node) as JS.Expression, tail.reversed]);
|
| }
|
|
|
| static Token _getOperator(Expression node) {
|
| @@ -4697,8 +4696,8 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| // dynamic dispatch
|
| var dynamicHelper = const {'[]': 'dindex', '[]=': 'dsetindex'}[name];
|
| if (dynamicHelper != null) {
|
| - return js.call(
|
| - 'dart.$dynamicHelper(#, #)', [_visit(target), _visitList(args)]);
|
| + return js.call('dart.$dynamicHelper(#, #)',
|
| + [_visit(target) as JS.Expression, _visitList(args)]);
|
| } else {
|
| return js.call('dart.dsend(#, #, #)',
|
| [_visit(target), memberName, _visitList(args)]);
|
| @@ -5052,7 +5051,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| // TODO(jmesserly): we can likely make these faster.
|
| JS.Expression emitMap() {
|
| var entries = node.entries;
|
| - var mapArguments = null;
|
| + Object mapArguments = null;
|
| var type = node.staticType as InterfaceType;
|
| var typeArgs = type.typeArguments;
|
| var reifyTypeArgs = typeArgs.any((t) => !t.isDynamic);
|
| @@ -5174,10 +5173,9 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| if (op == '&&') return shortCircuit('# && #');
|
| if (op == '||') return shortCircuit('# || #');
|
| }
|
| - if (isReifiedCoercion(node)) {
|
| - AsExpression asNode = node;
|
| - assert(asNode.staticType == types.boolType);
|
| - return js.call('dart.test(#)', _visit(asNode.expression));
|
| + if (node is AsExpression && CoercionReifier.isImplicitCast(node)) {
|
| + assert(node.staticType == types.boolType);
|
| + return js.call('dart.test(#)', _visit(node.expression));
|
| }
|
| JS.Expression result = _visit(node);
|
| if (isNullable(node)) result = js.call('dart.test(#)', result);
|
| @@ -5458,7 +5456,8 @@ String jsLibraryName(String libraryRoot, LibraryElement library) {
|
| uri.path.substring(libraryRoot.length).replaceAll('/', separator);
|
| } else {
|
| // We don't have a unique name.
|
| - throw 'Invalid library root. $libraryRoot does not contain ${uri.toFilePath()}';
|
| + throw 'Invalid library root. $libraryRoot does not contain ${uri
|
| + .toFilePath()}';
|
| }
|
| return pathToJSIdentifier(qualifiedPath);
|
| }
|
| @@ -5479,10 +5478,12 @@ JS.LiteralString _propertyName(String name) => js.string(name, "'");
|
| /// everywhere in the tree where they are treated as the same variable.
|
| class TemporaryVariableElement extends LocalVariableElementImpl {
|
| final JS.Expression jsVariable;
|
| +
|
| TemporaryVariableElement.forNode(Identifier name, this.jsVariable)
|
| : super.forNode(name);
|
|
|
| int get hashCode => identityHashCode(this);
|
| +
|
| bool operator ==(Object other) => identical(this, other);
|
| }
|
|
|
|
|