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 { |