| Index: lib/src/codegen/js_codegen.dart
|
| diff --git a/lib/src/codegen/js_codegen.dart b/lib/src/codegen/js_codegen.dart
|
| index 20a1eccf4d49d92187b63aa90a9ec7f991c0259e..b33fd70b6f5f84e4d6247405fe6b480f5e3277e0 100644
|
| --- a/lib/src/codegen/js_codegen.dart
|
| +++ b/lib/src/codegen/js_codegen.dart
|
| @@ -1476,7 +1476,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
|
| id = lhs.identifier;
|
| }
|
|
|
| - if (target != null && rules.isDynamicTarget(target)) {
|
| + if (target != null && DynamicInvoke.get(target)) {
|
| return js.call('dart.$DPUT(#, #, #)', [
|
| _visit(target),
|
| _emitMemberName(id.name, type: getStaticType(target)),
|
| @@ -1517,7 +1517,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
|
|
|
| String code;
|
| if (target == null || isLibraryPrefix(target)) {
|
| - if (rules.isDynamicCall(node.methodName)) {
|
| + if (DynamicInvoke.get(node.methodName)) {
|
| code = 'dart.$DCALL(#, #)';
|
| } else {
|
| code = '#(#)';
|
| @@ -1532,9 +1532,9 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
|
| bool isStatic = element is ExecutableElement && element.isStatic;
|
| var memberName = _emitMemberName(name, type: type, isStatic: isStatic);
|
|
|
| - if (rules.isDynamicTarget(target)) {
|
| + if (DynamicInvoke.get(target)) {
|
| code = 'dart.$DSEND(#, #, #)';
|
| - } else if (rules.isDynamicCall(node.methodName)) {
|
| + } else if (DynamicInvoke.get(node.methodName)) {
|
| // This is a dynamic call to a statically know target. For example:
|
| // class Foo { Function bar; }
|
| // new Foo().bar(); // dynamic call
|
| @@ -1576,7 +1576,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
|
| JS.Expression visitFunctionExpressionInvocation(
|
| FunctionExpressionInvocation node) {
|
| var code;
|
| - if (rules.isDynamicCall(node.function)) {
|
| + if (DynamicInvoke.get(node.function)) {
|
| code = 'dart.$DCALL(#, #)';
|
| } else {
|
| code = '#(#)';
|
| @@ -1987,6 +1987,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
|
| new SimpleIdentifier(new StringToken(TokenType.IDENTIFIER, name, -1));
|
| id.staticElement = new TemporaryVariableElement.forNode(id);
|
| id.staticType = type;
|
| + DynamicInvoke.set(id, type.isDynamic);
|
| return id;
|
| }
|
|
|
| @@ -2014,25 +2015,30 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
|
| /// needed.
|
| Expression _bindLeftHandSide(
|
| Map<String, JS.Expression> scope, Expression expr, {Expression context}) {
|
| + Expression result;
|
| if (expr is IndexExpression) {
|
| IndexExpression index = expr;
|
| - return new IndexExpression.forTarget(
|
| + result = new IndexExpression.forTarget(
|
| _bindValue(scope, 'o', index.target, context: context),
|
| index.leftBracket,
|
| _bindValue(scope, 'i', index.index, context: context),
|
| - index.rightBracket)..staticType = expr.staticType;
|
| + index.rightBracket);
|
| } else if (expr is PropertyAccess) {
|
| PropertyAccess prop = expr;
|
| - return new PropertyAccess(
|
| + result = new PropertyAccess(
|
| _bindValue(scope, 'o', _getTarget(prop), context: context),
|
| - prop.operator, prop.propertyName)..staticType = expr.staticType;
|
| + prop.operator, prop.propertyName);
|
| } else if (expr is PrefixedIdentifier) {
|
| PrefixedIdentifier ident = expr;
|
| - return new PrefixedIdentifier(
|
| + result = new PrefixedIdentifier(
|
| _bindValue(scope, 'o', ident.prefix, context: context), ident.period,
|
| - ident.identifier)..staticType = expr.staticType;
|
| + ident.identifier);
|
| + } else {
|
| + return expr as SimpleIdentifier;
|
| }
|
| - return expr as SimpleIdentifier;
|
| + result.staticType = expr.staticType;
|
| + DynamicInvoke.set(result, DynamicInvoke.get(expr));
|
| + return result;
|
| }
|
|
|
| /// Creates a temporary to contain the value of [expr]. The temporary can be
|
| @@ -2208,7 +2214,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
|
| }
|
| var name = _emitMemberName(memberId.name,
|
| type: getStaticType(target), isStatic: isStatic);
|
| - if (rules.isDynamicTarget(target)) {
|
| + if (DynamicInvoke.get(target)) {
|
| return js.call('dart.$DLOAD(#, #)', [_visit(target), name]);
|
| }
|
|
|
| @@ -2238,7 +2244,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
|
| Expression target, String name, List<Expression> args) {
|
| var type = getStaticType(target);
|
| var memberName = _emitMemberName(name, unary: args.isEmpty, type: type);
|
| - if (rules.isDynamicTarget(target)) {
|
| + if (DynamicInvoke.get(target)) {
|
| // dynamic dispatch
|
| var dynamicHelper = const {'[]': DINDEX, '[]=': DSETINDEX}[name];
|
| if (dynamicHelper != null) {
|
|
|