| Index: pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart
|
| diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart
|
| index 797a68964ff36b79a630339c7319a327b5397aac..17c09aec160ffbb79671cf0811d403019713f034 100644
|
| --- a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart
|
| +++ b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart
|
| @@ -284,8 +284,11 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| targetConstructor,
|
| callStructure,
|
| targetType,
|
| - arguments);
|
| - irBuilder.buildReturn(instance);
|
| + arguments,
|
| + sourceInformationBuilder.buildNew(node));
|
| + irBuilder.buildReturn(
|
| + value: instance,
|
| + sourceInformation: sourceInformationBuilder.buildReturn(node));
|
| }
|
|
|
| visitFor(ast.For node) {
|
| @@ -399,7 +402,9 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| ir.Primitive visitReturn(ast.Return node) {
|
| assert(irBuilder.isOpen);
|
| assert(invariant(node, node.beginToken.value != 'native'));
|
| - irBuilder.buildReturn(build(node.expression));
|
| + irBuilder.buildReturn(
|
| + value: build(node.expression),
|
| + sourceInformation: sourceInformationBuilder.buildReturn(node));
|
| return null;
|
| }
|
|
|
| @@ -533,9 +538,11 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| return irBuilder.state.constants.getConstantValueForVariable(element);
|
| }
|
|
|
| - ir.Primitive buildConstantExpression(ConstantExpression expression) {
|
| + ir.Primitive buildConstantExpression(ConstantExpression expression,
|
| + SourceInformation sourceInformation) {
|
| return irBuilder.buildConstant(
|
| - irBuilder.state.constants.getConstantValue(expression));
|
| + irBuilder.state.constants.getConstantValue(expression),
|
| + sourceInformation: sourceInformation);
|
| }
|
|
|
| ir.Primitive visitLiteralList(ast.LiteralList node) {
|
| @@ -599,7 +606,7 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| } else {
|
| // The call to assert and its argument expression must be ignored
|
| // in production mode.
|
| - // Assertions can only occur in expression statements, so no value needs
|
| + // Assertions can onl)y occur in expression statements, so no value needs
|
| // to be returned.
|
| return null;
|
| }
|
| @@ -613,13 +620,15 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| @override
|
| ir.Primitive visitExpressionInvoke(ast.Send node,
|
| ast.Node expression,
|
| - ast.NodeList arguments,
|
| + ast.NodeList argumentsNode,
|
| Selector selector, _) {
|
| ir.Primitive receiver = visit(expression);
|
| List<ir.Primitive> arguments = node.arguments.mapToList(visit);
|
| arguments = normalizeDynamicArguments(selector.callStructure, arguments);
|
| return irBuilder.buildCallInvocation(
|
| - receiver, selector.callStructure, arguments);
|
| + receiver, selector.callStructure, arguments,
|
| + sourceInformation:
|
| + sourceInformationBuilder.buildCall(node, argumentsNode));
|
| }
|
|
|
| /// Returns `true` if [node] is a super call.
|
| @@ -632,7 +641,8 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| ir.Primitive handleConstantGet(
|
| ast.Node node,
|
| ConstantExpression constant, _) {
|
| - return buildConstantExpression(constant);
|
| + return buildConstantExpression(constant,
|
| + sourceInformationBuilder.buildGet(node));
|
| }
|
|
|
| /// If [node] is null, returns this.
|
| @@ -671,7 +681,8 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| ast.Send node,
|
| ConstantExpression constant,
|
| _) {
|
| - return buildConstantExpression(constant);
|
| + return buildConstantExpression(constant,
|
| + sourceInformationBuilder.buildGet(node));
|
| }
|
|
|
| @override
|
| @@ -680,7 +691,8 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| LocalVariableElement element,
|
| _) {
|
| return element.isConst
|
| - ? irBuilder.buildConstant(getConstantForVariable(element))
|
| + ? irBuilder.buildConstant(getConstantForVariable(element),
|
| + sourceInformation: sourceInformationBuilder.buildGet(node))
|
| : irBuilder.buildLocalVariableGet(element);
|
| }
|
|
|
| @@ -717,7 +729,8 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| ast.Send node,
|
| FunctionElement getter,
|
| _) {
|
| - return irBuilder.buildStaticGetterGet(getter);
|
| + return irBuilder.buildStaticGetterGet(
|
| + getter, sourceInformationBuilder.buildGet(node));
|
| }
|
|
|
| @override
|
| @@ -733,7 +746,8 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| ast.Send node,
|
| FunctionElement getter,
|
| _) {
|
| - return irBuilder.buildSuperGetterGet(getter);
|
| + return irBuilder.buildSuperGetterGet(
|
| + getter, sourceInformationBuilder.buildGet(node));
|
| }
|
|
|
| @override
|
| @@ -763,14 +777,17 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| return irBuilder.buildThis();
|
| }
|
|
|
| - ir.Primitive translateTypeVariableTypeLiteral(TypeVariableElement element) {
|
| - return irBuilder.buildReifyTypeVariable(element.type);
|
| + ir.Primitive translateTypeVariableTypeLiteral(
|
| + TypeVariableElement element,
|
| + SourceInformation sourceInformation) {
|
| + return irBuilder.buildReifyTypeVariable(element.type, sourceInformation);
|
| }
|
|
|
| @override
|
| ir.Primitive visitTypeVariableTypeLiteralGet(ast.Send node,
|
| TypeVariableElement element, _) {
|
| - return translateTypeVariableTypeLiteral(element);
|
| + return translateTypeVariableTypeLiteral(element,
|
| + sourceInformationBuilder.buildGet(node));
|
| }
|
|
|
| ir.Primitive translateLogicalOperator(ast.Expression left,
|
| @@ -842,7 +859,9 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| List<ir.Primitive> arguments = <ir.Primitive>[visit(right)];
|
| arguments = normalizeDynamicArguments(selector.callStructure, arguments);
|
| return irBuilder.buildDynamicInvocation(
|
| - receiver, selector, elements.getTypeMask(node), arguments);
|
| + receiver, selector, elements.getTypeMask(node), arguments,
|
| + sourceInformation:
|
| + sourceInformationBuilder.buildCall(node, node.selector));
|
| }
|
|
|
| @override
|
| @@ -979,10 +998,12 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
|
|
| ir.Primitive translateCallInvoke(ir.Primitive target,
|
| ast.NodeList arguments,
|
| - CallStructure callStructure) {
|
| + CallStructure callStructure,
|
| + SourceInformation sourceInformation) {
|
|
|
| return irBuilder.buildCallInvocation(target, callStructure,
|
| - translateDynamicArguments(arguments, callStructure));
|
| + translateDynamicArguments(arguments, callStructure),
|
| + sourceInformation: sourceInformation);
|
| }
|
|
|
| @override
|
| @@ -992,8 +1013,10 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| ast.NodeList arguments,
|
| CallStructure callStructure,
|
| _) {
|
| - ir.Primitive target = buildConstantExpression(constant);
|
| - return translateCallInvoke(target, arguments, callStructure);
|
| + ir.Primitive target = buildConstantExpression(constant,
|
| + sourceInformationBuilder.buildGet(node));
|
| + return translateCallInvoke(target, arguments, callStructure,
|
| + sourceInformationBuilder.buildCall(node, arguments));
|
| }
|
|
|
| @override
|
| @@ -1005,7 +1028,9 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| _) {
|
| return irBuilder.buildDynamicInvocation(
|
| translateReceiver(receiver), selector, elements.getTypeMask(node),
|
| - translateDynamicArguments(arguments, selector.callStructure));
|
| + translateDynamicArguments(arguments, selector.callStructure),
|
| + sourceInformation:
|
| + sourceInformationBuilder.buildCall(node, node.selector));
|
| }
|
|
|
| @override
|
| @@ -1030,7 +1055,9 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| CallStructure callStructure,
|
| _) {
|
| return irBuilder.buildLocalVariableInvocation(element, callStructure,
|
| - translateDynamicArguments(arguments, callStructure));
|
| + translateDynamicArguments(arguments, callStructure),
|
| + callSourceInformation:
|
| + sourceInformationBuilder.buildCall(node, arguments));
|
| }
|
|
|
| @override
|
| @@ -1041,7 +1068,8 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| CallStructure callStructure,
|
| _) {
|
| return irBuilder.buildLocalFunctionInvocation(function, callStructure,
|
| - translateDynamicArguments(arguments, callStructure));
|
| + translateDynamicArguments(arguments, callStructure),
|
| + sourceInformationBuilder.buildCall(node, arguments));
|
| }
|
|
|
| @override
|
| @@ -1060,7 +1088,9 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| ir.Primitive target = buildStaticFieldGet(field, src);
|
| return irBuilder.buildCallInvocation(target,
|
| callStructure,
|
| - translateDynamicArguments(arguments, callStructure));
|
| + translateDynamicArguments(arguments, callStructure),
|
| + sourceInformation:
|
| + sourceInformationBuilder.buildCall(node, arguments));
|
| }
|
|
|
| @override
|
| @@ -1092,10 +1122,13 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| if (compiler.backend.isForeign(getter)) {
|
| return giveup(node, 'handleStaticGetterInvoke: foreign: $getter');
|
| }
|
| - ir.Primitive target = irBuilder.buildStaticGetterGet(getter);
|
| + ir.Primitive target = irBuilder.buildStaticGetterGet(
|
| + getter, sourceInformationBuilder.buildGet(node));
|
| return irBuilder.buildCallInvocation(target,
|
| callStructure,
|
| - translateDynamicArguments(arguments, callStructure));
|
| + translateDynamicArguments(arguments, callStructure),
|
| + sourceInformation:
|
| + sourceInformationBuilder.buildCall(node, arguments));
|
| }
|
|
|
| @override
|
| @@ -1108,7 +1141,9 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| ir.Primitive target = irBuilder.buildSuperFieldGet(field);
|
| return irBuilder.buildCallInvocation(target,
|
| callStructure,
|
| - translateDynamicArguments(arguments, callStructure));
|
| + translateDynamicArguments(arguments, callStructure),
|
| + sourceInformation:
|
| + sourceInformationBuilder.buildCall(node, arguments));
|
| }
|
|
|
| @override
|
| @@ -1118,10 +1153,13 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| ast.NodeList arguments,
|
| CallStructure callStructure,
|
| _) {
|
| - ir.Primitive target = irBuilder.buildSuperGetterGet(getter);
|
| + ir.Primitive target = irBuilder.buildSuperGetterGet(
|
| + getter, sourceInformationBuilder.buildGet(node));
|
| return irBuilder.buildCallInvocation(target,
|
| callStructure,
|
| - translateDynamicArguments(arguments, callStructure));
|
| + translateDynamicArguments(arguments, callStructure),
|
| + sourceInformation:
|
| + sourceInformationBuilder.buildCall(node, arguments));
|
| }
|
|
|
| @override
|
| @@ -1132,7 +1170,9 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| CallStructure callStructure,
|
| _) {
|
| return irBuilder.buildSuperMethodInvocation(method, callStructure,
|
| - translateDynamicArguments(arguments, callStructure));
|
| + translateDynamicArguments(arguments, callStructure),
|
| + sourceInformation:
|
| + sourceInformationBuilder.buildCall(node, node.selector));
|
| }
|
|
|
| @override
|
| @@ -1165,7 +1205,11 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| ast.NodeList arguments,
|
| CallStructure callStructure,
|
| _) {
|
| - return translateCallInvoke(irBuilder.buildThis(), arguments, callStructure);
|
| + return translateCallInvoke(
|
| + irBuilder.buildThis(),
|
| + arguments,
|
| + callStructure,
|
| + sourceInformationBuilder.buildCall(node, arguments));
|
| }
|
|
|
| @override
|
| @@ -1176,9 +1220,11 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| CallStructure callStructure,
|
| _) {
|
| return translateCallInvoke(
|
| - translateTypeVariableTypeLiteral(element),
|
| + translateTypeVariableTypeLiteral(
|
| + element, sourceInformationBuilder.buildGet(node)),
|
| arguments,
|
| - callStructure);
|
| + callStructure,
|
| + sourceInformationBuilder.buildCall(node, arguments));
|
| }
|
|
|
| @override
|
| @@ -1327,7 +1373,10 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| CompoundRhs rhs,
|
| arg) {
|
| return translateCompounds(
|
| - getValue: () => buildConstantExpression(constant),
|
| + getValue: () {
|
| + return buildConstantExpression(constant,
|
| + sourceInformationBuilder.buildGet(node));
|
| + },
|
| rhs: rhs,
|
| setValue: (value) {}, // The binary operator will throw before this.
|
| operatorTypeMask: elements.getOperatorTypeMaskInComplexSendSet(node));
|
| @@ -1419,7 +1468,8 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| SourceInformation src = sourceInformationBuilder.buildGet(node);
|
| return irBuilder.buildStaticFieldGet(getter, src);
|
| case CompoundGetter.GETTER:
|
| - return irBuilder.buildStaticGetterGet(getter);
|
| + return irBuilder.buildStaticGetterGet(
|
| + getter, sourceInformationBuilder.buildGet(node));
|
| case CompoundGetter.METHOD:
|
| return irBuilder.buildStaticFunctionGet(getter);
|
| case CompoundGetter.UNRESOLVED:
|
| @@ -1473,7 +1523,8 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| case CompoundGetter.FIELD:
|
| return irBuilder.buildSuperFieldGet(getter);
|
| case CompoundGetter.GETTER:
|
| - return irBuilder.buildSuperGetterGet(getter);
|
| + return irBuilder.buildSuperGetterGet(
|
| + getter, sourceInformationBuilder.buildGet(node));
|
| case CompoundGetter.METHOD:
|
| return irBuilder.buildSuperMethodGet(getter);
|
| case CompoundGetter.UNRESOLVED:
|
| @@ -1505,7 +1556,11 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| CompoundRhs rhs,
|
| arg) {
|
| return translateCompounds(
|
| - getValue: () => irBuilder.buildReifyTypeVariable(typeVariable.type),
|
| + getValue: () {
|
| + return irBuilder.buildReifyTypeVariable(
|
| + typeVariable.type,
|
| + sourceInformationBuilder.buildGet(node));
|
| + },
|
| rhs: rhs,
|
| setValue: (value) {}, // The binary operator will throw before this.
|
| operatorTypeMask: elements.getOperatorTypeMaskInComplexSendSet(node));
|
| @@ -1621,7 +1676,9 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
|
|
| ir.Primitive translateConstant(ast.Node node) {
|
| assert(irBuilder.isOpen);
|
| - return irBuilder.buildConstant(getConstantForNode(node));
|
| + return irBuilder.buildConstant(
|
| + getConstantForNode(node),
|
| + sourceInformation: sourceInformationBuilder.buildGet(node));
|
| }
|
|
|
| ir.Primitive visitThrow(ast.Throw node) {
|
| @@ -2255,13 +2312,15 @@ class JsIrBuilderVisitor extends IrBuilderVisitor {
|
| }
|
|
|
| ir.Primitive visitFunctionExpression(ast.FunctionExpression node) {
|
| - return irBuilder.buildFunctionExpression(makeSubFunction(node));
|
| + return irBuilder.buildFunctionExpression(makeSubFunction(node),
|
| + sourceInformationBuilder.buildCreate(node));
|
| }
|
|
|
| visitFunctionDeclaration(ast.FunctionDeclaration node) {
|
| LocalFunctionElement element = elements[node.function];
|
| Object inner = makeSubFunction(node.function);
|
| - irBuilder.declareLocalFunction(element, inner);
|
| + irBuilder.declareLocalFunction(element, inner,
|
| + sourceInformationBuilder.buildCreate(node.function));
|
| }
|
|
|
| Map mapValues(Map map, dynamic fn(dynamic)) {
|
| @@ -2376,7 +2435,12 @@ class JsIrBuilderVisitor extends IrBuilderVisitor {
|
| return withBuilder(builder, () {
|
| irBuilder.buildFunctionHeader(<Local>[]);
|
| ir.Primitive initialValue = visit(element.initializer);
|
| - irBuilder.buildReturn(initialValue);
|
| + ast.VariableDefinitions node = element.node;
|
| + ast.SendSet sendSet = node.definitions.nodes.head;
|
| + irBuilder.buildReturn(
|
| + value: initialValue,
|
| + sourceInformation:
|
| + sourceInformationBuilder.buildReturn(sendSet.assignmentOperator));
|
| return irBuilder.makeFunctionDefinition();
|
| });
|
| }
|
| @@ -2501,10 +2565,16 @@ class JsIrBuilderVisitor extends IrBuilderVisitor {
|
| // Native fields are initialized elsewhere.
|
| }
|
| }, includeSuperAndInjectedMembers: true);
|
| +
|
| ir.Primitive instance = new ir.CreateInstance(
|
| classElement,
|
| instanceArguments,
|
| - typeInformation);
|
| + typeInformation,
|
| + constructor.hasNode
|
| + ? sourceInformationBuilder.buildCreate(constructor.node)
|
| + // TODO(johnniwinther): Provide source information for creation
|
| + // through synthetic constructors.
|
| + : null);
|
| irBuilder.add(new ir.LetPrim(instance));
|
|
|
| // --- Call constructor bodies ---
|
| @@ -2519,7 +2589,10 @@ class JsIrBuilderVisitor extends IrBuilderVisitor {
|
| }
|
|
|
| // --- step 4: return the created object ----
|
| - irBuilder.buildReturn(instance);
|
| + irBuilder.buildReturn(
|
| + value: instance,
|
| + sourceInformation:
|
| + sourceInformationBuilder.buildImplicitReturn(constructor));
|
|
|
| return irBuilder.makeFunctionDefinition();
|
| });
|
| @@ -2974,7 +3047,8 @@ class JsIrBuilderVisitor extends IrBuilderVisitor {
|
| target,
|
| callStructure,
|
| constructor.computeEffectiveTargetType(type),
|
| - arguments);
|
| + arguments,
|
| + sourceInformationBuilder.buildNew(node));
|
| }
|
|
|
| @override
|
| @@ -3027,7 +3101,7 @@ class JsIrBuilderVisitor extends IrBuilderVisitor {
|
| ir.Primitive buildStaticFieldGet(FieldElement field, SourceInformation src) {
|
| ConstantValue constant = getConstantForVariable(field);
|
| if (constant != null && !field.isAssignable) {
|
| - return irBuilder.buildConstant(constant);
|
| + return irBuilder.buildConstant(constant, sourceInformation: src);
|
| } else if (backend.constants.lazyStatics.contains(field)) {
|
| return irBuilder.buildStaticFieldLazyGet(field, src);
|
| } else {
|
|
|