| Index: pkg/compiler/lib/src/js_backend/codegen/codegen.dart
|
| diff --git a/pkg/compiler/lib/src/js_backend/codegen/codegen.dart b/pkg/compiler/lib/src/js_backend/codegen/codegen.dart
|
| index 40406569f8a2c989069f181396245625dccb7cf7..d2c539d963e42ba0e97dcdd01b8cf7d382bf6981 100644
|
| --- a/pkg/compiler/lib/src/js_backend/codegen/codegen.dart
|
| +++ b/pkg/compiler/lib/src/js_backend/codegen/codegen.dart
|
| @@ -6,31 +6,20 @@ library code_generator;
|
|
|
| import 'glue.dart';
|
|
|
| -import '../../closure.dart' show
|
| - ClosureClassElement;
|
| -import '../../common/codegen.dart' show
|
| - CodegenRegistry;
|
| +import '../../closure.dart' show ClosureClassElement;
|
| +import '../../common/codegen.dart' show CodegenRegistry;
|
| import '../../constants/values.dart';
|
| import '../../dart_types.dart';
|
| import '../../elements/elements.dart';
|
| -import '../../io/source_information.dart' show
|
| - SourceInformation;
|
| +import '../../io/source_information.dart' show SourceInformation;
|
| import '../../js/js.dart' as js;
|
| import '../../tree_ir/tree_ir_nodes.dart' as tree_ir;
|
| -import '../../tree_ir/tree_ir_nodes.dart' show
|
| - BuiltinMethod,
|
| - BuiltinOperator,
|
| - isCompoundableOperator;
|
| -import '../../types/types.dart' show
|
| - TypeMask;
|
| -import '../../universe/call_structure.dart' show
|
| - CallStructure;
|
| -import '../../universe/selector.dart' show
|
| - Selector;
|
| -import '../../universe/use.dart' show
|
| - DynamicUse,
|
| - StaticUse,
|
| - TypeUse;
|
| +import '../../tree_ir/tree_ir_nodes.dart'
|
| + show BuiltinMethod, BuiltinOperator, isCompoundableOperator;
|
| +import '../../types/types.dart' show TypeMask;
|
| +import '../../universe/call_structure.dart' show CallStructure;
|
| +import '../../universe/selector.dart' show Selector;
|
| +import '../../universe/use.dart' show DynamicUse, StaticUse, TypeUse;
|
| import '../../util/maplet.dart';
|
|
|
| class CodegenBailout {
|
| @@ -43,7 +32,7 @@ class CodegenBailout {
|
| }
|
|
|
| class CodeGenerator extends tree_ir.StatementVisitor
|
| - with tree_ir.ExpressionVisitor<js.Expression> {
|
| + with tree_ir.ExpressionVisitor<js.Expression> {
|
| final CodegenRegistry registry;
|
|
|
| final Glue glue;
|
| @@ -65,8 +54,7 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| /// Stacks whose top element is the current target of an unlabeled break
|
| /// or continue. For continues, this is the loop node itself.
|
| final tree_ir.FallthroughStack shortBreak = new tree_ir.FallthroughStack();
|
| - final tree_ir.FallthroughStack shortContinue =
|
| - new tree_ir.FallthroughStack();
|
| + final tree_ir.FallthroughStack shortContinue = new tree_ir.FallthroughStack();
|
|
|
| /// When the top element is true, [Unreachable] statements will be emitted
|
| /// as [Return]s, otherwise they are emitted as empty because they are
|
| @@ -130,8 +118,7 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| if (!declaredVariables.add(use.name)) break;
|
|
|
| js.VariableInitialization jsVariable = new js.VariableInitialization(
|
| - new js.VariableDeclaration(use.name),
|
| - assign.value);
|
| + new js.VariableDeclaration(use.name), assign.value);
|
| jsVariables.add(jsVariable);
|
|
|
| ++accumulatorIndex;
|
| @@ -139,8 +126,7 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
|
|
| // If the last statement is a for loop with an initializer expression, try
|
| // to pull that expression into an initializer as well.
|
| - pullFromForLoop:
|
| - if (accumulatorIndex < accumulator.length &&
|
| + pullFromForLoop: if (accumulatorIndex < accumulator.length &&
|
| accumulator[accumulatorIndex] is js.For) {
|
| js.For forLoop = accumulator[accumulatorIndex];
|
| if (forLoop.init is! js.Assignment) break pullFromForLoop;
|
| @@ -156,8 +142,7 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| if (!declaredVariables.add(use.name)) break pullFromForLoop;
|
|
|
| js.VariableInitialization jsVariable = new js.VariableInitialization(
|
| - new js.VariableDeclaration(use.name),
|
| - assign.value);
|
| + new js.VariableDeclaration(use.name), assign.value);
|
| jsVariables.add(jsVariable);
|
|
|
| // Remove the initializer from the for loop.
|
| @@ -174,16 +159,16 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| for (tree_ir.Variable variable in variableNames.keys) {
|
| String name = getVariableName(variable);
|
| if (declaredVariables.contains(name)) continue;
|
| - js.VariableInitialization jsVariable = new js.VariableInitialization(
|
| - new js.VariableDeclaration(name),
|
| - null);
|
| + js.VariableInitialization jsVariable =
|
| + new js.VariableInitialization(new js.VariableDeclaration(name), null);
|
| jsVariables.add(jsVariable);
|
| }
|
|
|
| if (jsVariables.length > 0) {
|
| // Would be nice to avoid inserting at the beginning of list.
|
| - accumulator.insert(0, new js.ExpressionStatement(
|
| - new js.VariableDeclarationList(jsVariables)
|
| + accumulator.insert(
|
| + 0,
|
| + new js.ExpressionStatement(new js.VariableDeclarationList(jsVariables)
|
| .withSourceInformation(function.sourceInformation)));
|
| }
|
| return new js.Fun(parameters, new js.Block(accumulator));
|
| @@ -213,9 +198,8 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| // Synthesize a variable name that isn't used elsewhere.
|
| String prefix = variable.element == null ? 'v' : variable.element.name;
|
| int counter = 0;
|
| - name = glue.safeVariableName(variable.element == null
|
| - ? '$prefix$counter'
|
| - : variable.element.name);
|
| + name = glue.safeVariableName(
|
| + variable.element == null ? '$prefix$counter' : variable.element.name);
|
| while (!usedVariableNames.add(name)) {
|
| ++counter;
|
| name = '$prefix$counter';
|
| @@ -235,7 +219,7 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| }
|
|
|
| giveup(tree_ir.Node node,
|
| - [String reason = 'unimplemented in CodeGenerator']) {
|
| + [String reason = 'unimplemented in CodeGenerator']) {
|
| throw new CodegenBailout(node, reason);
|
| }
|
|
|
| @@ -248,32 +232,28 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| }
|
|
|
| js.Expression buildConstant(ConstantValue constant,
|
| - {SourceInformation sourceInformation}) {
|
| + {SourceInformation sourceInformation}) {
|
| registry.registerCompileTimeConstant(constant);
|
| - return glue.constantReference(constant)
|
| + return glue
|
| + .constantReference(constant)
|
| .withSourceInformation(sourceInformation);
|
| }
|
|
|
| @override
|
| js.Expression visitConstant(tree_ir.Constant node) {
|
| - return buildConstant(
|
| - node.value,
|
| - sourceInformation: node.sourceInformation);
|
| + return buildConstant(node.value, sourceInformation: node.sourceInformation);
|
| }
|
|
|
| - js.Expression buildStaticInvoke(Element target,
|
| - List<js.Expression> arguments,
|
| - {SourceInformation sourceInformation}) {
|
| + js.Expression buildStaticInvoke(Element target, List<js.Expression> arguments,
|
| + {SourceInformation sourceInformation}) {
|
| if (target.isConstructor) {
|
| // TODO(johnniwinther): Avoid dependency on [isGenerativeConstructor] by
|
| // using backend-specific [StatisUse] classes.
|
| - registry.registerStaticUse(
|
| - new StaticUse.constructorInvoke(target.declaration,
|
| - new CallStructure.unnamed(arguments.length)));
|
| + registry.registerStaticUse(new StaticUse.constructorInvoke(
|
| + target.declaration, new CallStructure.unnamed(arguments.length)));
|
| } else {
|
| - registry.registerStaticUse(
|
| - new StaticUse.staticInvoke(target.declaration,
|
| - new CallStructure.unnamed(arguments.length)));
|
| + registry.registerStaticUse(new StaticUse.staticInvoke(
|
| + target.declaration, new CallStructure.unnamed(arguments.length)));
|
| }
|
| js.Expression elementAccess = glue.staticFunctionAccess(target);
|
| return new js.Call(elementAccess, arguments,
|
| @@ -287,9 +267,7 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| registry.registerInstantiation(node.type);
|
| FunctionElement target = node.target;
|
| List<js.Expression> arguments = visitExpressionList(node.arguments);
|
| - return buildStaticInvoke(
|
| - target,
|
| - arguments,
|
| + return buildStaticInvoke(target, arguments,
|
| sourceInformation: node.sourceInformation);
|
| }
|
|
|
| @@ -306,9 +284,11 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| js.Expression visitInvokeMethod(tree_ir.InvokeMethod node) {
|
| TypeMask mask = glue.extendMaskIfReachesAll(node.selector, node.mask);
|
| registerMethodInvoke(node.selector, mask);
|
| - return js.propertyCall(visitExpression(node.receiver),
|
| - glue.invocationName(node.selector),
|
| - visitExpressionList(node.arguments))
|
| + return js
|
| + .propertyCall(
|
| + visitExpression(node.receiver),
|
| + glue.invocationName(node.selector),
|
| + visitExpressionList(node.arguments))
|
| .withSourceInformation(node.sourceInformation);
|
| }
|
|
|
| @@ -317,7 +297,7 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| FunctionElement target = node.target;
|
| List<js.Expression> arguments = visitExpressionList(node.arguments);
|
| return buildStaticInvoke(target, arguments,
|
| - sourceInformation: node.sourceInformation);
|
| + sourceInformation: node.sourceInformation);
|
| }
|
|
|
| @override
|
| @@ -327,44 +307,43 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| // will be created, and that this tear-off must bypass ordinary
|
| // dispatch to ensure the super method is invoked.
|
| registry.registerStaticUse(new StaticUse.staticInvoke(
|
| - glue.closureFromTearOff, new CallStructure.unnamed(
|
| - glue.closureFromTearOff.parameters.length)));
|
| + glue.closureFromTearOff,
|
| + new CallStructure.unnamed(
|
| + glue.closureFromTearOff.parameters.length)));
|
| registry.registerStaticUse(new StaticUse.superTearOff(node.target));
|
| }
|
| if (node.target is ConstructorBodyElement) {
|
| - registry.registerStaticUse(
|
| - new StaticUse.constructorBodyInvoke(
|
| - node.target.declaration,
|
| - new CallStructure.unnamed(node.arguments.length)));
|
| + registry.registerStaticUse(new StaticUse.constructorBodyInvoke(
|
| + node.target.declaration,
|
| + new CallStructure.unnamed(node.arguments.length)));
|
| // A constructor body cannot be overriden or intercepted, so we can
|
| // use the short form for this invocation.
|
| - return js.js('#.#(#)',
|
| - [visitExpression(node.receiver),
|
| - glue.instanceMethodName(node.target),
|
| - visitExpressionList(node.arguments)])
|
| - .withSourceInformation(node.sourceInformation);
|
| + return js.js('#.#(#)', [
|
| + visitExpression(node.receiver),
|
| + glue.instanceMethodName(node.target),
|
| + visitExpressionList(node.arguments)
|
| + ]).withSourceInformation(node.sourceInformation);
|
| }
|
| - registry.registerStaticUse(
|
| - new StaticUse.superInvoke(
|
| - node.target.declaration,
|
| - new CallStructure.unnamed(node.arguments.length)));
|
| - return js.js('#.#.call(#, #)',
|
| - [glue.prototypeAccess(node.target.enclosingClass),
|
| - glue.invocationName(node.selector),
|
| - visitExpression(node.receiver),
|
| - visitExpressionList(node.arguments)])
|
| - .withSourceInformation(node.sourceInformation);
|
| + registry.registerStaticUse(new StaticUse.superInvoke(
|
| + node.target.declaration,
|
| + new CallStructure.unnamed(node.arguments.length)));
|
| + return js.js('#.#.call(#, #)', [
|
| + glue.prototypeAccess(node.target.enclosingClass),
|
| + glue.invocationName(node.selector),
|
| + visitExpression(node.receiver),
|
| + visitExpressionList(node.arguments)
|
| + ]).withSourceInformation(node.sourceInformation);
|
| }
|
|
|
| @override
|
| js.Expression visitOneShotInterceptor(tree_ir.OneShotInterceptor node) {
|
| registerMethodInvoke(node.selector, node.mask);
|
| registry.registerUseInterceptor();
|
| - return js.js('#.#(#)',
|
| - [glue.getInterceptorLibrary(),
|
| - glue.registerOneShotInterceptor(node.selector),
|
| - visitExpressionList(node.arguments)])
|
| - .withSourceInformation(node.sourceInformation);
|
| + return js.js('#.#(#)', [
|
| + glue.getInterceptorLibrary(),
|
| + glue.registerOneShotInterceptor(node.selector),
|
| + visitExpressionList(node.arguments)
|
| + ]).withSourceInformation(node.sourceInformation);
|
| }
|
|
|
| @override
|
| @@ -377,9 +356,7 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| @override
|
| js.Expression visitLogicalOperator(tree_ir.LogicalOperator node) {
|
| return new js.Binary(
|
| - node.operator,
|
| - visitExpression(node.left),
|
| - visitExpression(node.right));
|
| + node.operator, visitExpression(node.left), visitExpression(node.right));
|
| }
|
|
|
| @override
|
| @@ -431,9 +408,9 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| }
|
| // TODO(sra): Implement fast cast via calling 'boolTypeCast'.
|
| } else if (node.isTypeTest &&
|
| - node.typeArguments.isEmpty &&
|
| - glue.mayGenerateInstanceofCheck(type) &&
|
| - tryRegisterInstanceofCheck(clazz)) {
|
| + node.typeArguments.isEmpty &&
|
| + glue.mayGenerateInstanceofCheck(type) &&
|
| + tryRegisterInstanceofCheck(clazz)) {
|
| return js.js('# instanceof #', [value, glue.constructorAccess(clazz)]);
|
| }
|
|
|
| @@ -449,9 +426,8 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| //
|
| // Any of the last two arguments may be null if there are no type
|
| // arguments, and/or if no substitution is required.
|
| - Element function = node.isTypeTest
|
| - ? glue.getCheckSubtype()
|
| - : glue.getSubtypeCast();
|
| + Element function =
|
| + node.isTypeTest ? glue.getCheckSubtype() : glue.getSubtypeCast();
|
|
|
| js.Expression isT = js.quoteName(glue.getTypeTestTag(type));
|
|
|
| @@ -464,8 +440,7 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| : new js.LiteralNull();
|
|
|
| return buildStaticHelperInvocation(
|
| - function,
|
| - <js.Expression>[value, isT, typeArgumentArray, asT]);
|
| + function, <js.Expression>[value, isT, typeArgumentArray, asT]);
|
| } else if (type is TypeVariableType || type is FunctionType) {
|
| registry.registerTypeUse(new TypeUse.isCheck(type));
|
|
|
| @@ -477,8 +452,7 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| js.Expression typeValue = typeArguments.single;
|
|
|
| return buildStaticHelperInvocation(
|
| - function,
|
| - <js.Expression>[value, typeValue]);
|
| + function, <js.Expression>[value, typeValue]);
|
| }
|
| return giveup(node, 'type check unimplemented for $type.');
|
| }
|
| @@ -526,19 +500,16 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
|
|
| bool isCompoundableBuiltin(tree_ir.Expression exp) {
|
| return exp is tree_ir.ApplyBuiltinOperator &&
|
| - exp.arguments.length == 2 &&
|
| - isCompoundableOperator(exp.operator);
|
| + exp.arguments.length == 2 &&
|
| + isCompoundableOperator(exp.operator);
|
| }
|
|
|
| bool isOneConstant(tree_ir.Expression exp) {
|
| return exp is tree_ir.Constant && exp.value.isOne;
|
| }
|
|
|
| - js.Expression makeAssignment(
|
| - js.Expression leftHand,
|
| - tree_ir.Expression value,
|
| - {SourceInformation sourceInformation,
|
| - BuiltinOperator compound}) {
|
| + js.Expression makeAssignment(js.Expression leftHand, tree_ir.Expression value,
|
| + {SourceInformation sourceInformation, BuiltinOperator compound}) {
|
| if (isOneConstant(value)) {
|
| if (compound == BuiltinOperator.NumAdd) {
|
| return new js.Prefix('++', leftHand)
|
| @@ -550,8 +521,8 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| }
|
| }
|
| if (compound != null) {
|
| - return new js.Assignment.compound(leftHand,
|
| - getAsCompoundOperator(compound), visitExpression(value))
|
| + return new js.Assignment.compound(
|
| + leftHand, getAsCompoundOperator(compound), visitExpression(value))
|
| .withSourceInformation(sourceInformation);
|
| }
|
| return new js.Assignment(leftHand, visitExpression(value))
|
| @@ -566,12 +537,12 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| tree_ir.Expression left = rhs.arguments[0];
|
| tree_ir.Expression right = rhs.arguments[1];
|
| if (left is tree_ir.VariableUse && left.variable == node.variable) {
|
| - return makeAssignment(variable, right, compound: rhs.operator,
|
| - sourceInformation: node.sourceInformation);
|
| + return makeAssignment(variable, right,
|
| + compound: rhs.operator, sourceInformation: node.sourceInformation);
|
| }
|
| }
|
| - return makeAssignment(
|
| - variable, node.value, sourceInformation: node.sourceInformation);
|
| + return makeAssignment(variable, node.value,
|
| + sourceInformation: node.sourceInformation);
|
| }
|
|
|
| @override
|
| @@ -594,14 +565,14 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| /// target. This means jumping to [other] is equivalent to executing [node].
|
| bool isEffectiveBreakTarget(tree_ir.Break node, tree_ir.Statement other) {
|
| return node.target.binding.next == other ||
|
| - other is tree_ir.Break && node.target == other.target;
|
| + other is tree_ir.Break && node.target == other.target;
|
| }
|
|
|
| /// True if the given break is equivalent to an unlabeled continue.
|
| bool isShortContinue(tree_ir.Break node) {
|
| tree_ir.Statement next = node.target.binding.next;
|
| return next is tree_ir.Continue &&
|
| - next.target.binding == shortContinue.target;
|
| + next.target.binding == shortContinue.target;
|
| }
|
|
|
| @override
|
| @@ -628,8 +599,8 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| if (node.next is tree_ir.Unreachable && emitUnreachableAsReturn.last) {
|
| // Emit as 'return exp' to assist local analysis in the VM.
|
| SourceInformation sourceInformation = node.expression.sourceInformation;
|
| - accumulator.add(
|
| - new js.Return(exp).withSourceInformation(sourceInformation));
|
| + accumulator
|
| + .add(new js.Return(exp).withSourceInformation(sourceInformation));
|
| return null;
|
| } else {
|
| accumulator.add(new js.ExpressionStatement(exp));
|
| @@ -643,7 +614,7 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
|
|
| bool isEndOfMethod(tree_ir.Statement node) {
|
| return isNullReturn(node) ||
|
| - node is tree_ir.Break && isNullReturn(node.target.binding.next);
|
| + node is tree_ir.Break && isNullReturn(node.target.binding.next);
|
| }
|
|
|
| @override
|
| @@ -728,7 +699,7 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| }
|
|
|
| js.Expression makeSequence(List<tree_ir.Expression> list) {
|
| - return list.map(visitExpression).reduce((x,y) => new js.Binary(',', x, y));
|
| + return list.map(visitExpression).reduce((x, y) => new js.Binary(',', x, y));
|
| }
|
|
|
| @override
|
| @@ -746,7 +717,8 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| js.Statement loopNode;
|
| if (node.updates.isEmpty) {
|
| loopNode = new js.While(condition, body);
|
| - } else { // Compile as a for loop.
|
| + } else {
|
| + // Compile as a for loop.
|
| js.Expression init;
|
| if (accumulator.isNotEmpty &&
|
| accumulator.last is js.ExpressionStatement) {
|
| @@ -778,8 +750,8 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| fallthrough.use();
|
| }
|
| shortBreak.pop();
|
| - accumulator.add(
|
| - insertLabel(node.label, new js.For(null, null, null, jsBody)));
|
| + accumulator
|
| + .add(insertLabel(node.label, new js.For(null, null, null, jsBody)));
|
| }
|
|
|
| bool isNull(tree_ir.Expression node) {
|
| @@ -794,7 +766,7 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| fallthrough.use();
|
| } else {
|
| accumulator.add(new js.Return(visitExpression(node.value))
|
| - .withSourceInformation(node.sourceInformation));
|
| + .withSourceInformation(node.sourceInformation));
|
| }
|
| }
|
|
|
| @@ -838,8 +810,7 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| if (classElement is ClosureClassElement) {
|
| registry.registerInstantiatedClosure(classElement.methodElement);
|
| }
|
| - js.Expression instance = new js.New(
|
| - glue.constructorAccess(classElement),
|
| + js.Expression instance = new js.New(glue.constructorAccess(classElement),
|
| visitExpressionList(node.arguments))
|
| .withSourceInformation(node.sourceInformation);
|
|
|
| @@ -847,8 +818,8 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| if (typeInformation != null) {
|
| FunctionElement helper = glue.getAddRuntimeTypeInformation();
|
| js.Expression typeArguments = visitExpression(typeInformation);
|
| - return buildStaticHelperInvocation(helper,
|
| - <js.Expression>[instance, typeArguments],
|
| + return buildStaticHelperInvocation(
|
| + helper, <js.Expression>[instance, typeArguments],
|
| sourceInformation: node.sourceInformation);
|
| } else {
|
| return instance;
|
| @@ -862,8 +833,8 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| js.Expression internalName =
|
| js.quoteName(glue.invocationName(node.selector));
|
| js.Expression kind = js.number(node.selector.invocationMirrorKind);
|
| - js.Expression arguments = new js.ArrayInitializer(
|
| - visitExpressionList(node.arguments));
|
| + js.Expression arguments =
|
| + new js.ArrayInitializer(visitExpressionList(node.arguments));
|
| js.Expression argumentNames = new js.ArrayInitializer(
|
| node.selector.namedArguments.map(js.string).toList(growable: false));
|
| return buildStaticHelperInvocation(glue.createInvocationMirrorMethod,
|
| @@ -881,29 +852,29 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| registry.registerSpecializedGetInterceptor(interceptedClasses);
|
| js.Name helperName = glue.getInterceptorName(interceptedClasses);
|
| js.Expression globalHolder = glue.getInterceptorLibrary();
|
| - return js.js('#.#(#)',
|
| - [globalHolder, helperName, visitExpression(node.input)])
|
| - .withSourceInformation(node.sourceInformation);
|
| + return js.js('#.#(#)', [
|
| + globalHolder,
|
| + helperName,
|
| + visitExpression(node.input)
|
| + ]).withSourceInformation(node.sourceInformation);
|
| }
|
|
|
| @override
|
| js.Expression visitGetField(tree_ir.GetField node) {
|
| registry.registerStaticUse(new StaticUse.fieldGet(node.field));
|
| - return new js.PropertyAccess(
|
| - visitExpression(node.object),
|
| - glue.instanceFieldPropertyName(node.field))
|
| + return new js.PropertyAccess(visitExpression(node.object),
|
| + glue.instanceFieldPropertyName(node.field))
|
| .withSourceInformation(node.sourceInformation);
|
| }
|
|
|
| @override
|
| js.Expression visitSetField(tree_ir.SetField node) {
|
| registry.registerStaticUse(new StaticUse.fieldSet(node.field));
|
| - js.PropertyAccess field =
|
| - new js.PropertyAccess(
|
| - visitExpression(node.object),
|
| - glue.instanceFieldPropertyName(node.field));
|
| - return makeAssignment(field, node.value, compound: node.compound,
|
| - sourceInformation: node.sourceInformation);
|
| + js.PropertyAccess field = new js.PropertyAccess(
|
| + visitExpression(node.object),
|
| + glue.instanceFieldPropertyName(node.field));
|
| + return makeAssignment(field, node.value,
|
| + compound: node.compound, sourceInformation: node.sourceInformation);
|
| }
|
|
|
| @override
|
| @@ -913,8 +884,9 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| // Tear off a method.
|
| registry.registerStaticUse(
|
| new StaticUse.staticTearOff(node.element.declaration));
|
| - return glue.isolateStaticClosureAccess(node.element)
|
| - .withSourceInformation(node.sourceInformation);
|
| + return glue
|
| + .isolateStaticClosureAccess(node.element)
|
| + .withSourceInformation(node.sourceInformation);
|
| }
|
| if (node.useLazyGetter) {
|
| // Read a lazily initialized field.
|
| @@ -925,20 +897,21 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| sourceInformation: node.sourceInformation);
|
| }
|
| // Read an eagerly initialized field.
|
| - registry.registerStaticUse(
|
| - new StaticUse.staticGet(node.element.declaration));
|
| - return glue.staticFieldAccess(node.element)
|
| + registry
|
| + .registerStaticUse(new StaticUse.staticGet(node.element.declaration));
|
| + return glue
|
| + .staticFieldAccess(node.element)
|
| .withSourceInformation(node.sourceInformation);
|
| }
|
|
|
| @override
|
| js.Expression visitSetStatic(tree_ir.SetStatic node) {
|
| assert(node.element is FieldElement);
|
| - registry.registerStaticUse(
|
| - new StaticUse.staticSet(node.element.declaration));
|
| + registry
|
| + .registerStaticUse(new StaticUse.staticSet(node.element.declaration));
|
| js.Expression field = glue.staticFieldAccess(node.element);
|
| - return makeAssignment(field, node.value, compound: node.compound,
|
| - sourceInformation: node.sourceInformation);
|
| + return makeAssignment(field, node.value,
|
| + compound: node.compound, sourceInformation: node.sourceInformation);
|
| }
|
|
|
| @override
|
| @@ -949,8 +922,7 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| @override
|
| js.Expression visitGetIndex(tree_ir.GetIndex node) {
|
| return new js.PropertyAccess(
|
| - visitExpression(node.object),
|
| - visitExpression(node.index));
|
| + visitExpression(node.object), visitExpression(node.index));
|
| }
|
|
|
| @override
|
| @@ -961,24 +933,21 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| }
|
|
|
| js.Expression buildStaticHelperInvocation(
|
| - FunctionElement helper,
|
| - List<js.Expression> arguments,
|
| + FunctionElement helper, List<js.Expression> arguments,
|
| {SourceInformation sourceInformation}) {
|
| registry.registerStaticUse(new StaticUse.staticInvoke(
|
| helper, new CallStructure.unnamed(arguments.length)));
|
| - return buildStaticInvoke(
|
| - helper, arguments, sourceInformation: sourceInformation);
|
| + return buildStaticInvoke(helper, arguments,
|
| + sourceInformation: sourceInformation);
|
| }
|
|
|
| @override
|
| js.Expression visitReifyRuntimeType(tree_ir.ReifyRuntimeType node) {
|
| js.Expression typeToString = buildStaticHelperInvocation(
|
| - glue.getRuntimeTypeToString(),
|
| - [visitExpression(node.value)],
|
| + glue.getRuntimeTypeToString(), [visitExpression(node.value)],
|
| sourceInformation: node.sourceInformation);
|
| return buildStaticHelperInvocation(
|
| - glue.getCreateRuntimeType(),
|
| - [typeToString],
|
| + glue.getCreateRuntimeType(), [typeToString],
|
| sourceInformation: node.sourceInformation);
|
| }
|
|
|
| @@ -988,14 +957,12 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| js.Expression index = js.number(glue.getTypeVariableIndex(node.variable));
|
| if (glue.needsSubstitutionForTypeVariableAccess(context)) {
|
| js.Expression typeName = glue.getRuntimeTypeName(context);
|
| - return buildStaticHelperInvocation(
|
| - glue.getRuntimeTypeArgument(),
|
| + return buildStaticHelperInvocation(glue.getRuntimeTypeArgument(),
|
| [visitExpression(node.target), typeName, index],
|
| sourceInformation: node.sourceInformation);
|
| } else {
|
| return buildStaticHelperInvocation(
|
| - glue.getTypeArgumentByIndex(),
|
| - [visitExpression(node.target), index],
|
| + glue.getTypeArgumentByIndex(), [visitExpression(node.target), index],
|
| sourceInformation: node.sourceInformation);
|
| }
|
| }
|
| @@ -1009,8 +976,8 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| node.dartType, arguments, registry);
|
| case tree_ir.TypeExpressionKind.INSTANCE:
|
| // We expect only flat types for the INSTANCE representation.
|
| - assert(node.dartType ==
|
| - (node.dartType.element as ClassElement).thisType);
|
| + assert(
|
| + node.dartType == (node.dartType.element as ClassElement).thisType);
|
| registry.registerInstantiatedClass(glue.listClass);
|
| return new js.ArrayInitializer(arguments);
|
| }
|
| @@ -1020,14 +987,13 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| if (node.dependency != null) {
|
| // Dependency is only used if [node] calls a Dart function. Currently only
|
| // through foreign function `RAW_DART_FUNCTION_REF`.
|
| - registry.registerStaticUse(
|
| - new StaticUse.staticInvoke(
|
| - node.dependency,
|
| - new CallStructure.unnamed(node.arguments.length)));
|
| + registry.registerStaticUse(new StaticUse.staticInvoke(
|
| + node.dependency, new CallStructure.unnamed(node.arguments.length)));
|
| }
|
| // TODO(sra,johnniwinther): Should this be in CodegenRegistry?
|
| glue.registerNativeBehavior(node.nativeBehavior, node);
|
| - return node.codeTemplate.instantiate(visitExpressionList(node.arguments))
|
| + return node.codeTemplate
|
| + .instantiate(visitExpressionList(node.arguments))
|
| .withSourceInformation(node.sourceInformation);
|
| }
|
|
|
| @@ -1120,7 +1086,7 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
| return js.js('-#', args);
|
| case BuiltinOperator.StringConcatenate:
|
| if (args.isEmpty) return js.string('');
|
| - return args.reduce((e1,e2) => new js.Binary('+', e1, e2));
|
| + return args.reduce((e1, e2) => new js.Binary('+', e1, e2));
|
| case BuiltinOperator.CharCodeAt:
|
| return js.js('#.charCodeAt(#)', args);
|
| case BuiltinOperator.Identical:
|
| @@ -1169,8 +1135,8 @@ class CodeGenerator extends tree_ir.StatementVisitor
|
|
|
| /// Add a uint32 normalization `op >>> 0` to [op] if it is not in 31-bit
|
| /// range.
|
| - js.Expression normalizeBitOp(js.Expression op,
|
| - tree_ir.ApplyBuiltinOperator node) {
|
| + js.Expression normalizeBitOp(
|
| + js.Expression op, tree_ir.ApplyBuiltinOperator node) {
|
| const MAX_UINT31 = 0x7fffffff;
|
| const MAX_UINT32 = 0xffffffff;
|
|
|
|
|