Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(723)

Side by Side Diff: pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart

Issue 1785633002: Make source information mandatory for building send-like node in CPS (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Add dartdoc to new methods Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library dart2js.ir_builder_task; 5 library dart2js.ir_builder_task;
6 6
7 import '../closure.dart' as closure; 7 import '../closure.dart' as closure;
8 import '../common.dart'; 8 import '../common.dart';
9 import '../common/names.dart' show 9 import '../common/names.dart' show
10 Identifiers, 10 Identifiers,
(...skipping 1136 matching lines...) Expand 10 before | Expand all | Expand 10 after
1147 new Selector.callConstructor(constructor.memberName, 1), 1147 new Selector.callConstructor(constructor.memberName, 1),
1148 <ir.Primitive>[stream, dummyTypeArgument], 1148 <ir.Primitive>[stream, dummyTypeArgument],
1149 sourceInformationBuilder.buildGeneric(node))); 1149 sourceInformationBuilder.buildGeneric(node)));
1150 1150
1151 ir.Node buildTryBody(IrBuilder builder) { 1151 ir.Node buildTryBody(IrBuilder builder) {
1152 ir.Node buildLoopCondition(IrBuilder builder) { 1152 ir.Node buildLoopCondition(IrBuilder builder) {
1153 ir.Primitive moveNext = builder.buildDynamicInvocation( 1153 ir.Primitive moveNext = builder.buildDynamicInvocation(
1154 iterator, 1154 iterator,
1155 Selectors.moveNext, 1155 Selectors.moveNext,
1156 elements.getMoveNextTypeMask(node), 1156 elements.getMoveNextTypeMask(node),
1157 <ir.Primitive>[]); 1157 <ir.Primitive>[],
1158 sourceInformationBuilder.buildForInMoveNext(node));
1158 return builder.addPrimitive(new ir.Await(moveNext)); 1159 return builder.addPrimitive(new ir.Await(moveNext));
1159 } 1160 }
1160 1161
1161 ir.Node buildLoopBody(IrBuilder builder) { 1162 ir.Node buildLoopBody(IrBuilder builder) {
1162 return withBuilder(builder, () { 1163 return withBuilder(builder, () {
1163 ir.Primitive current = irBuilder.buildDynamicInvocation( 1164 ir.Primitive current = irBuilder.buildDynamicInvocation(
1164 iterator, 1165 iterator,
1165 Selectors.current, 1166 Selectors.current,
1166 elements.getCurrentTypeMask(node), 1167 elements.getCurrentTypeMask(node),
1167 <ir.Primitive>[]); 1168 <ir.Primitive>[],
1169 sourceInformationBuilder.buildForInCurrent(node));
1168 Element variable = elements.getForInVariable(node); 1170 Element variable = elements.getForInVariable(node);
1171 SourceInformation sourceInformation =
1172 sourceInformationBuilder.buildForInSet(node);
1169 if (Elements.isLocal(variable)) { 1173 if (Elements.isLocal(variable)) {
1170 if (node.declaredIdentifier.asVariableDefinitions() != null) { 1174 if (node.declaredIdentifier.asVariableDefinitions() != null) {
1171 irBuilder.declareLocalVariable(variable); 1175 irBuilder.declareLocalVariable(variable);
1172 } 1176 }
1173 irBuilder.buildLocalVariableSet(variable, current); 1177 irBuilder.buildLocalVariableSet(
1178 variable, current, sourceInformation);
1174 } else if (Elements.isError(variable) || 1179 } else if (Elements.isError(variable) ||
1175 Elements.isMalformed(variable)) { 1180 Elements.isMalformed(variable)) {
1176 Selector selector = 1181 Selector selector =
1177 new Selector.setter(new Name(variable.name, variable.library)); 1182 new Selector.setter(new Name(variable.name, variable.library));
1178 List<ir.Primitive> args = <ir.Primitive>[current]; 1183 List<ir.Primitive> args = <ir.Primitive>[current];
1179 // Note the comparison below. It can be the case that an element 1184 // Note the comparison below. It can be the case that an element
1180 // isError and isMalformed. 1185 // isError and isMalformed.
1181 if (Elements.isError(variable)) { 1186 if (Elements.isError(variable)) {
1182 irBuilder.buildStaticNoSuchMethod(selector, args); 1187 irBuilder.buildStaticNoSuchMethod(
1188 selector, args, sourceInformation);
1183 } else { 1189 } else {
1184 irBuilder.buildErroneousInvocation(variable, selector, args); 1190 irBuilder.buildErroneousInvocation(
1191 variable, selector, args, sourceInformation);
1185 } 1192 }
1186 } else if (Elements.isStaticOrTopLevel(variable)) { 1193 } else if (Elements.isStaticOrTopLevel(variable)) {
1187 if (variable.isField) { 1194 if (variable.isField) {
1188 irBuilder.addPrimitive(new ir.SetStatic(variable, current)); 1195 irBuilder.addPrimitive(new ir.SetStatic(variable, current));
1189 } else { 1196 } else {
1190 irBuilder.buildStaticSetterSet(variable, current); 1197 irBuilder.buildStaticSetterSet(
1198 variable, current, sourceInformation);
1191 } 1199 }
1192 } else { 1200 } else {
1193 ir.Primitive receiver = irBuilder.buildThis(); 1201 ir.Primitive receiver = irBuilder.buildThis();
1194 ast.Node identifier = node.declaredIdentifier; 1202 ast.Node identifier = node.declaredIdentifier;
1195 irBuilder.buildDynamicSet( 1203 irBuilder.buildDynamicSet(
1196 receiver, 1204 receiver,
1197 elements.getSelector(identifier), 1205 elements.getSelector(identifier),
1198 elements.getTypeMask(identifier), 1206 elements.getTypeMask(identifier),
1199 current); 1207 current,
1208 sourceInformation);
1200 } 1209 }
1201 visit(node.body); 1210 visit(node.body);
1202 }); 1211 });
1203 } 1212 }
1204 1213
1205 builder.buildWhile( 1214 builder.buildWhile(
1206 buildCondition: buildLoopCondition, 1215 buildCondition: buildLoopCondition,
1207 buildBody: buildLoopBody, 1216 buildBody: buildLoopBody,
1208 target: elements.getTargetDefinition(node), 1217 target: elements.getTargetDefinition(node),
1209 closureScope: getClosureScopeForNode(node)); 1218 closureScope: getClosureScopeForNode(node));
1210 } 1219 }
1211 1220
1212 ir.Node buildFinallyBody(IrBuilder builder) { 1221 ir.Node buildFinallyBody(IrBuilder builder) {
1213 ir.Primitive cancellation = builder.buildDynamicInvocation( 1222 ir.Primitive cancellation = builder.buildDynamicInvocation(
1214 iterator, 1223 iterator,
1215 Selectors.cancel, 1224 Selectors.cancel,
1216 backend.dynamicType, 1225 backend.dynamicType,
1217 <ir.Primitive>[], 1226 <ir.Primitive>[],
1218 sourceInformation: sourceInformationBuilder.buildGeneric(node)); 1227 sourceInformationBuilder.buildGeneric(node));
1219 return builder.addPrimitive(new ir.Await(cancellation)); 1228 return builder.addPrimitive(new ir.Await(cancellation));
1220 } 1229 }
1221 1230
1222 irBuilder.buildTryFinally(new TryStatementInfo(), buildTryBody, 1231 irBuilder.buildTryFinally(new TryStatementInfo(), buildTryBody,
1223 buildFinallyBody); 1232 buildFinallyBody);
1224 } 1233 }
1225 1234
1226 visitAwait(ast.Await node) { 1235 visitAwait(ast.Await node) {
1227 assert(irBuilder.isOpen); 1236 assert(irBuilder.isOpen);
1228 ir.Primitive value = visit(node.expression); 1237 ir.Primitive value = visit(node.expression);
(...skipping 15 matching lines...) Expand all
1244 identifier.asVariableDefinitions(); 1253 identifier.asVariableDefinitions();
1245 Element variableElement = elements.getForInVariable(node); 1254 Element variableElement = elements.getForInVariable(node);
1246 Selector selector = elements.getSelector(identifier); 1255 Selector selector = elements.getSelector(identifier);
1247 1256
1248 irBuilder.buildForIn( 1257 irBuilder.buildForIn(
1249 buildExpression: subbuild(node.expression), 1258 buildExpression: subbuild(node.expression),
1250 buildVariableDeclaration: subbuild(variableDeclaration), 1259 buildVariableDeclaration: subbuild(variableDeclaration),
1251 variableElement: variableElement, 1260 variableElement: variableElement,
1252 variableSelector: selector, 1261 variableSelector: selector,
1253 variableMask: elements.getTypeMask(identifier), 1262 variableMask: elements.getTypeMask(identifier),
1263 variableSetSourceInformation:
1264 sourceInformationBuilder.buildForInSet(node),
1254 currentMask: elements.getCurrentTypeMask(node), 1265 currentMask: elements.getCurrentTypeMask(node),
1266 currentSourceInformation:
1267 sourceInformationBuilder.buildForInCurrent(node),
1255 moveNextMask: elements.getMoveNextTypeMask(node), 1268 moveNextMask: elements.getMoveNextTypeMask(node),
1269 moveNextSourceInformation:
1270 sourceInformationBuilder.buildForInMoveNext(node),
1256 iteratorMask: elements.getIteratorTypeMask(node), 1271 iteratorMask: elements.getIteratorTypeMask(node),
1272 iteratorSourceInformation:
1273 sourceInformationBuilder.buildForInIterator(node),
1257 buildBody: subbuild(node.body), 1274 buildBody: subbuild(node.body),
1258 target: elements.getTargetDefinition(node), 1275 target: elements.getTargetDefinition(node),
1259 closureScope: getClosureScopeForNode(node)); 1276 closureScope: getClosureScopeForNode(node));
1260 } 1277 }
1261 1278
1262 /// If compiling with trusted type annotations, assumes that [value] is 1279 /// If compiling with trusted type annotations, assumes that [value] is
1263 /// now known to be `null` or an instance of [type]. 1280 /// now known to be `null` or an instance of [type].
1264 /// 1281 ///
1265 /// This is also where we should add type checks in checked mode, but this 1282 /// This is also where we should add type checks in checked mode, but this
1266 /// is not supported yet. 1283 /// is not supported yet.
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1311 if (nativeBody != null) { 1328 if (nativeBody != null) {
1312 ast.LiteralString jsCode = nativeBody.asLiteralString(); 1329 ast.LiteralString jsCode = nativeBody.asLiteralString();
1313 String javaScriptCode = jsCode.dartString.slowToString(); 1330 String javaScriptCode = jsCode.dartString.slowToString();
1314 assert(invariant(nativeBody, 1331 assert(invariant(nativeBody,
1315 !nativeRedirectionRegExp.hasMatch(javaScriptCode), 1332 !nativeRedirectionRegExp.hasMatch(javaScriptCode),
1316 message: "Deprecated syntax, use @JSName('name') instead.")); 1333 message: "Deprecated syntax, use @JSName('name') instead."));
1317 assert(invariant(nativeBody, 1334 assert(invariant(nativeBody,
1318 function.functionSignature.parameterCount == 0, 1335 function.functionSignature.parameterCount == 0,
1319 message: 'native "..." syntax is restricted to ' 1336 message: 'native "..." syntax is restricted to '
1320 'functions with zero parameters.')); 1337 'functions with zero parameters.'));
1321 irBuilder.buildNativeFunctionBody(function, javaScriptCode); 1338 irBuilder.buildNativeFunctionBody(function, javaScriptCode,
1339 sourceInformationBuilder.buildForeignCode(node));
1322 } else { 1340 } else {
1323 String name = backend.getFixedBackendName(function); 1341 String name = backend.getFixedBackendName(function);
1324 irBuilder.buildRedirectingNativeFunctionBody(function, name, source); 1342 irBuilder.buildRedirectingNativeFunctionBody(function, name, source);
1325 } 1343 }
1326 } else { 1344 } else {
1327 irBuilder.buildReturn( 1345 irBuilder.buildReturn(
1328 value: build(node.expression), 1346 value: build(node.expression),
1329 sourceInformation: source); 1347 sourceInformation: source);
1330 } 1348 }
1331 } 1349 }
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after
1609 stackTraceVariable = elements[catchClause.trace]; 1627 stackTraceVariable = elements[catchClause.trace];
1610 } 1628 }
1611 DartType type; 1629 DartType type;
1612 if (catchClause.onKeyword != null) { 1630 if (catchClause.onKeyword != null) {
1613 type = elements.getType(catchClause.type); 1631 type = elements.getType(catchClause.type);
1614 } 1632 }
1615 catchClauseInfos.add(new CatchClauseInfo( 1633 catchClauseInfos.add(new CatchClauseInfo(
1616 type: type, 1634 type: type,
1617 exceptionVariable: exceptionVariable, 1635 exceptionVariable: exceptionVariable,
1618 stackTraceVariable: stackTraceVariable, 1636 stackTraceVariable: stackTraceVariable,
1619 buildCatchBlock: subbuild(catchClause.block))); 1637 buildCatchBlock: subbuild(catchClause.block),
1638 sourceInformation: sourceInformationBuilder.buildCatch(catchClause)));
1620 } 1639 }
1621 1640
1622 assert(!node.catchBlocks.isEmpty || node.finallyBlock != null); 1641 assert(!node.catchBlocks.isEmpty || node.finallyBlock != null);
1623 if (!node.catchBlocks.isEmpty && node.finallyBlock != null) { 1642 if (!node.catchBlocks.isEmpty && node.finallyBlock != null) {
1624 // Try/catch/finally is encoded in terms of try/catch and try/finally: 1643 // Try/catch/finally is encoded in terms of try/catch and try/finally:
1625 // 1644 //
1626 // try tryBlock catch (ex, st) catchBlock finally finallyBlock 1645 // try tryBlock catch (ex, st) catchBlock finally finallyBlock
1627 // ==> 1646 // ==>
1628 // try { try tryBlock catch (ex, st) catchBlock } finally finallyBlock 1647 // try { try tryBlock catch (ex, st) catchBlock } finally finallyBlock
1629 irBuilder.buildTryFinally(tryStatements[node.finallyBlock], 1648 irBuilder.buildTryFinally(tryStatements[node.finallyBlock],
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
1737 return translateConstant(node); 1756 return translateConstant(node);
1738 } 1757 }
1739 1758
1740 InterfaceType type = elements.getType(node); 1759 InterfaceType type = elements.getType(node);
1741 1760
1742 if (node.entries.nodes.isEmpty) { 1761 if (node.entries.nodes.isEmpty) {
1743 if (type.treatAsRaw) { 1762 if (type.treatAsRaw) {
1744 return irBuilder.buildStaticFunctionInvocation( 1763 return irBuilder.buildStaticFunctionInvocation(
1745 helpers.mapLiteralUntypedEmptyMaker, 1764 helpers.mapLiteralUntypedEmptyMaker,
1746 <ir.Primitive>[], 1765 <ir.Primitive>[],
1747 sourceInformation: sourceInformationBuilder.buildNew(node)); 1766 sourceInformationBuilder.buildNew(node));
1748 } else { 1767 } else {
1749 ConstructorElement constructor = helpers.mapLiteralConstructorEmpty; 1768 ConstructorElement constructor = helpers.mapLiteralConstructorEmpty;
1750 return irBuilder.buildConstructorInvocation( 1769 return irBuilder.buildConstructorInvocation(
1751 constructor.effectiveTarget, 1770 constructor.effectiveTarget,
1752 CallStructure.NO_ARGS, 1771 CallStructure.NO_ARGS,
1753 constructor.computeEffectiveTargetType(type), 1772 constructor.computeEffectiveTargetType(type),
1754 <ir.Primitive>[], 1773 <ir.Primitive>[],
1755 sourceInformationBuilder.buildNew(node)); 1774 sourceInformationBuilder.buildNew(node));
1756 } 1775 }
1757 } 1776 }
1758 1777
1759 List<ir.Primitive> keysAndValues = <ir.Primitive>[]; 1778 List<ir.Primitive> keysAndValues = <ir.Primitive>[];
1760 for (ast.LiteralMapEntry entry in node.entries.nodes.toList()) { 1779 for (ast.LiteralMapEntry entry in node.entries.nodes.toList()) {
1761 keysAndValues.add(visit(entry.key)); 1780 keysAndValues.add(visit(entry.key));
1762 keysAndValues.add(visit(entry.value)); 1781 keysAndValues.add(visit(entry.value));
1763 } 1782 }
1764 ir.Primitive keysAndValuesList = 1783 ir.Primitive keysAndValuesList =
1765 irBuilder.buildListLiteral(null, keysAndValues); 1784 irBuilder.buildListLiteral(null, keysAndValues);
1766 1785
1767 if (type.treatAsRaw) { 1786 if (type.treatAsRaw) {
1768 return irBuilder.buildStaticFunctionInvocation( 1787 return irBuilder.buildStaticFunctionInvocation(
1769 helpers.mapLiteralUntypedMaker, 1788 helpers.mapLiteralUntypedMaker,
1770 <ir.Primitive>[keysAndValuesList], 1789 <ir.Primitive>[keysAndValuesList],
1771 sourceInformation: sourceInformationBuilder.buildNew(node)); 1790 sourceInformationBuilder.buildNew(node));
1772 } else { 1791 } else {
1773 ConstructorElement constructor = helpers.mapLiteralConstructor; 1792 ConstructorElement constructor = helpers.mapLiteralConstructor;
1774 return irBuilder.buildConstructorInvocation( 1793 return irBuilder.buildConstructorInvocation(
1775 constructor.effectiveTarget, 1794 constructor.effectiveTarget,
1776 CallStructure.ONE_ARG, 1795 CallStructure.ONE_ARG,
1777 constructor.computeEffectiveTargetType(type), 1796 constructor.computeEffectiveTargetType(type),
1778 <ir.Primitive>[keysAndValuesList], 1797 <ir.Primitive>[keysAndValuesList],
1779 sourceInformationBuilder.buildNew(node)); 1798 sourceInformationBuilder.buildNew(node));
1780 } 1799 }
1781 } 1800 }
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1835 ir.Primitive buildCheckDeferredIsLoaded(PrefixElement prefix, ast.Send node) { 1854 ir.Primitive buildCheckDeferredIsLoaded(PrefixElement prefix, ast.Send node) {
1836 SourceInformation sourceInformation = 1855 SourceInformation sourceInformation =
1837 sourceInformationBuilder.buildCall(node, node.selector); 1856 sourceInformationBuilder.buildCall(node, node.selector);
1838 ir.Primitive name = irBuilder.buildStringConstant( 1857 ir.Primitive name = irBuilder.buildStringConstant(
1839 compiler.deferredLoadTask.getImportDeferName(node, prefix)); 1858 compiler.deferredLoadTask.getImportDeferName(node, prefix));
1840 ir.Primitive uri = 1859 ir.Primitive uri =
1841 irBuilder.buildStringConstant('${prefix.deferredImport.uri}'); 1860 irBuilder.buildStringConstant('${prefix.deferredImport.uri}');
1842 return irBuilder.buildStaticFunctionInvocation( 1861 return irBuilder.buildStaticFunctionInvocation(
1843 helpers.checkDeferredIsLoaded, 1862 helpers.checkDeferredIsLoaded,
1844 <ir.Primitive>[name, uri], 1863 <ir.Primitive>[name, uri],
1845 sourceInformation: sourceInformation); 1864 sourceInformation);
1846 } 1865 }
1847 1866
1848 ir.Primitive visitNamedArgument(ast.NamedArgument node) { 1867 ir.Primitive visitNamedArgument(ast.NamedArgument node) {
1849 assert(irBuilder.isOpen); 1868 assert(irBuilder.isOpen);
1850 return visit(node.expression); 1869 return visit(node.expression);
1851 } 1870 }
1852 1871
1853 @override 1872 @override
1854 ir.Primitive visitExpressionInvoke(ast.Send node, 1873 ir.Primitive visitExpressionInvoke(ast.Send node,
1855 ast.Node expression, 1874 ast.Node expression,
1856 ast.NodeList argumentsNode, 1875 ast.NodeList argumentsNode,
1857 CallStructure callStructure, _) { 1876 CallStructure callStructure, _) {
1858 ir.Primitive receiver = visit(expression); 1877 ir.Primitive receiver = visit(expression);
1859 List<ir.Primitive> arguments = argumentsNode.nodes.mapToList(visit); 1878 List<ir.Primitive> arguments = argumentsNode.nodes.mapToList(visit);
1860 callStructure = normalizeDynamicArguments(callStructure, arguments); 1879 callStructure = normalizeDynamicArguments(callStructure, arguments);
1861 return irBuilder.buildCallInvocation(receiver, callStructure, arguments, 1880 return irBuilder.buildCallInvocation(receiver, callStructure, arguments,
1862 sourceInformation: 1881 sourceInformationBuilder.buildCall(node, argumentsNode));
1863 sourceInformationBuilder.buildCall(node, argumentsNode));
1864 } 1882 }
1865 1883
1866 /// Returns `true` if [node] is a super call. 1884 /// Returns `true` if [node] is a super call.
1867 // TODO(johnniwinther): Remove the need for this. 1885 // TODO(johnniwinther): Remove the need for this.
1868 bool isSuperCall(ast.Send node) { 1886 bool isSuperCall(ast.Send node) {
1869 return node != null && node.receiver != null && node.receiver.isSuper(); 1887 return node != null && node.receiver != null && node.receiver.isSuper();
1870 } 1888 }
1871 1889
1872 @override 1890 @override
1873 ir.Primitive handleConstantGet( 1891 ir.Primitive handleConstantGet(
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
1945 MethodElement function, 1963 MethodElement function,
1946 _) { 1964 _) {
1947 return irBuilder.addPrimitive(new ir.GetStatic(function, isFinal: true)); 1965 return irBuilder.addPrimitive(new ir.GetStatic(function, isFinal: true));
1948 } 1966 }
1949 1967
1950 @override 1968 @override
1951 ir.Primitive handleStaticGetterGet( 1969 ir.Primitive handleStaticGetterGet(
1952 ast.Send node, 1970 ast.Send node,
1953 FunctionElement getter, 1971 FunctionElement getter,
1954 _) { 1972 _) {
1955 return buildStaticGetterGet(getter, node); 1973 return buildStaticGetterGet(
1974 getter, node, sourceInformationBuilder.buildGet(node));
1956 } 1975 }
1957 1976
1958 /// Create a getter invocation of the static getter [getter]. This also 1977 /// Create a getter invocation of the static getter [getter]. This also
1959 /// handles the special case where [getter] is the `loadLibrary` 1978 /// handles the special case where [getter] is the `loadLibrary`
1960 /// pseudo-function on library prefixes of deferred imports. 1979 /// pseudo-function on library prefixes of deferred imports.
1961 ir.Primitive buildStaticGetterGet(MethodElement getter, ast.Send node) { 1980 ir.Primitive buildStaticGetterGet(
1962 SourceInformation sourceInformation = 1981 MethodElement getter,
1963 sourceInformationBuilder.buildGet(node); 1982 ast.Send node,
1983 SourceInformation sourceInformation) {
1964 if (getter.isDeferredLoaderGetter) { 1984 if (getter.isDeferredLoaderGetter) {
1965 PrefixElement prefix = getter.enclosingElement; 1985 PrefixElement prefix = getter.enclosingElement;
1966 ir.Primitive loadId = irBuilder.buildStringConstant( 1986 ir.Primitive loadId = irBuilder.buildStringConstant(
1967 compiler.deferredLoadTask.getImportDeferName(node, prefix)); 1987 compiler.deferredLoadTask.getImportDeferName(node, prefix));
1968 return irBuilder.buildStaticFunctionInvocation( 1988 return irBuilder.buildStaticFunctionInvocation(
1969 compiler.loadLibraryFunction, 1989 compiler.loadLibraryFunction,
1970 <ir.Primitive>[loadId], 1990 <ir.Primitive>[loadId],
1971 sourceInformation: sourceInformation); 1991 sourceInformation);
1972 } else { 1992 } else {
1973 return irBuilder.buildStaticGetterGet(getter, sourceInformation); 1993 return irBuilder.buildStaticGetterGet(getter, sourceInformation);
1974 } 1994 }
1975 } 1995 }
1976 1996
1977 @override 1997 @override
1978 ir.Primitive visitSuperFieldGet( 1998 ir.Primitive visitSuperFieldGet(
1979 ast.Send node, 1999 ast.Send node,
1980 FieldElement field, 2000 FieldElement field,
1981 _) { 2001 _) {
1982 return irBuilder.buildSuperFieldGet(field); 2002 return irBuilder.buildSuperFieldGet(
2003 field, sourceInformationBuilder.buildGet(node));
1983 } 2004 }
1984 2005
1985 @override 2006 @override
1986 ir.Primitive visitSuperGetterGet( 2007 ir.Primitive visitSuperGetterGet(
1987 ast.Send node, 2008 ast.Send node,
1988 FunctionElement getter, 2009 FunctionElement getter,
1989 _) { 2010 _) {
1990 return irBuilder.buildSuperGetterGet( 2011 return irBuilder.buildSuperGetterGet(
1991 getter, sourceInformationBuilder.buildGet(node)); 2012 getter, sourceInformationBuilder.buildGet(node));
1992 } 2013 }
1993 2014
1994 @override 2015 @override
1995 ir.Primitive visitSuperMethodGet( 2016 ir.Primitive visitSuperMethodGet(
1996 ast.Send node, 2017 ast.Send node,
1997 MethodElement method, 2018 MethodElement method,
1998 _) { 2019 _) {
1999 return irBuilder.buildSuperMethodGet(method); 2020 return irBuilder.buildSuperMethodGet(
2021 method, sourceInformationBuilder.buildGet(node));
2000 } 2022 }
2001 2023
2002 @override 2024 @override
2003 ir.Primitive visitUnresolvedSuperGet( 2025 ir.Primitive visitUnresolvedSuperGet(
2004 ast.Send node, 2026 ast.Send node,
2005 Element element, _) { 2027 Element element, _) {
2006 return buildSuperNoSuchMethod( 2028 return buildSuperNoSuchMethod(
2007 elements.getSelector(node), elements.getTypeMask(node), []); 2029 elements.getSelector(node), elements.getTypeMask(node), [],
2030 sourceInformationBuilder.buildGet(node));
2008 } 2031 }
2009 2032
2010 @override 2033 @override
2011 ir.Primitive visitUnresolvedSuperSet( 2034 ir.Primitive visitUnresolvedSuperSet(
2012 ast.Send node, 2035 ast.Send node,
2013 Element element, 2036 Element element,
2014 ast.Node rhs, _) { 2037 ast.Node rhs, _) {
2015 return buildSuperNoSuchMethod( 2038 return buildSuperNoSuchMethod(
2016 elements.getSelector(node), elements.getTypeMask(node), [visit(rhs)]); 2039 elements.getSelector(node), elements.getTypeMask(node), [visit(rhs)],
2040 sourceInformationBuilder.buildAssignment(node));
2017 } 2041 }
2018 2042
2019 @override 2043 @override
2020 ir.Primitive visitThisGet(ast.Identifier node, _) { 2044 ir.Primitive visitThisGet(ast.Identifier node, _) {
2021 if (irBuilder.state.thisParameter == null) { 2045 if (irBuilder.state.thisParameter == null) {
2022 // TODO(asgerf,johnniwinther): Should be in a visitInvalidThis method. 2046 // TODO(asgerf,johnniwinther): Should be in a visitInvalidThis method.
2023 // 'this' in static context. Just translate to null. 2047 // 'this' in static context. Just translate to null.
2024 assert(compiler.compilationFailed); 2048 assert(compiler.compilationFailed);
2025 return irBuilder.buildNullConstant(); 2049 return irBuilder.buildNullConstant();
2026 } 2050 }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
2071 return translateLogicalOperator(left, right, isLazyOr: true); 2095 return translateLogicalOperator(left, right, isLazyOr: true);
2072 } 2096 }
2073 2097
2074 @override 2098 @override
2075 ir.Primitive visitAs( 2099 ir.Primitive visitAs(
2076 ast.Send node, 2100 ast.Send node,
2077 ast.Node expression, 2101 ast.Node expression,
2078 DartType type, 2102 DartType type,
2079 _) { 2103 _) {
2080 ir.Primitive receiver = visit(expression); 2104 ir.Primitive receiver = visit(expression);
2081 return irBuilder.buildTypeOperator(receiver, type, isTypeTest: false); 2105 return irBuilder.buildTypeOperator(
2106 receiver,
2107 type,
2108 sourceInformationBuilder.buildAs(node),
2109 isTypeTest: false);
2082 } 2110 }
2083 2111
2084 @override 2112 @override
2085 ir.Primitive visitIs( 2113 ir.Primitive visitIs(
2086 ast.Send node, 2114 ast.Send node,
2087 ast.Node expression, 2115 ast.Node expression,
2088 DartType type, 2116 DartType type,
2089 _) { 2117 _) {
2090 ir.Primitive value = visit(expression); 2118 ir.Primitive value = visit(expression);
2091 return irBuilder.buildTypeOperator(value, type, isTypeTest: true); 2119 return irBuilder.buildTypeOperator(
2120 value,
2121 type,
2122 sourceInformationBuilder.buildIs(node),
2123 isTypeTest: true);
2092 } 2124 }
2093 2125
2094 @override 2126 @override
2095 ir.Primitive visitIsNot(ast.Send node, 2127 ir.Primitive visitIsNot(ast.Send node,
2096 ast.Node expression, DartType type, _) { 2128 ast.Node expression, DartType type, _) {
2097 ir.Primitive value = visit(expression); 2129 ir.Primitive value = visit(expression);
2098 ir.Primitive check = irBuilder.buildTypeOperator( 2130 ir.Primitive check = irBuilder.buildTypeOperator(
2099 value, type, isTypeTest: true); 2131 value,
2132 type,
2133 sourceInformationBuilder.buildIs(node),
2134 isTypeTest: true);
2100 return irBuilder.buildNegation(check); 2135 return irBuilder.buildNegation(check);
2101 } 2136 }
2102 2137
2103 ir.Primitive translateBinary(ast.Send node, 2138 ir.Primitive translateBinary(ast.Send node,
2104 ast.Node left, 2139 ast.Node left,
2105 op.BinaryOperator operator, 2140 op.BinaryOperator operator,
2106 ast.Node right) { 2141 ast.Node right) {
2107 ir.Primitive receiver = visit(left); 2142 ir.Primitive receiver = visit(left);
2108 Selector selector = new Selector.binaryOperator(operator.selectorName); 2143 Selector selector = new Selector.binaryOperator(operator.selectorName);
2109 List<ir.Primitive> arguments = <ir.Primitive>[visit(right)]; 2144 List<ir.Primitive> arguments = <ir.Primitive>[visit(right)];
2110 CallStructure callStructure = 2145 CallStructure callStructure =
2111 normalizeDynamicArguments(selector.callStructure, arguments); 2146 normalizeDynamicArguments(selector.callStructure, arguments);
2112 return irBuilder.buildDynamicInvocation( 2147 return irBuilder.buildDynamicInvocation(
2113 receiver, 2148 receiver,
2114 new Selector(selector.kind, selector.memberName, callStructure), 2149 new Selector(selector.kind, selector.memberName, callStructure),
2115 elements.getTypeMask(node), 2150 elements.getTypeMask(node),
2116 arguments, 2151 arguments,
2117 sourceInformation: 2152 sourceInformationBuilder.buildCall(node, node.selector));
2118 sourceInformationBuilder.buildCall(node, node.selector));
2119 } 2153 }
2120 2154
2121 @override 2155 @override
2122 ir.Primitive visitBinary(ast.Send node, 2156 ir.Primitive visitBinary(ast.Send node,
2123 ast.Node left, 2157 ast.Node left,
2124 op.BinaryOperator operator, 2158 op.BinaryOperator operator,
2125 ast.Node right, _) { 2159 ast.Node right, _) {
2126 return translateBinary(node, left, operator, right); 2160 return translateBinary(node, left, operator, right);
2127 } 2161 }
2128 2162
2129 @override 2163 @override
2130 ir.Primitive visitIndex(ast.Send node, 2164 ir.Primitive visitIndex(ast.Send node,
2131 ast.Node receiver, 2165 ast.Node receiver,
2132 ast.Node index, _) { 2166 ast.Node index, _) {
2133 ir.Primitive target = visit(receiver); 2167 ir.Primitive target = visit(receiver);
2134 Selector selector = new Selector.index(); 2168 Selector selector = new Selector.index();
2135 List<ir.Primitive> arguments = <ir.Primitive>[visit(index)]; 2169 List<ir.Primitive> arguments = <ir.Primitive>[visit(index)];
2136 CallStructure callStructure = 2170 CallStructure callStructure =
2137 normalizeDynamicArguments(selector.callStructure, arguments); 2171 normalizeDynamicArguments(selector.callStructure, arguments);
2138 return irBuilder.buildDynamicInvocation( 2172 return irBuilder.buildDynamicInvocation(
2139 target, 2173 target,
2140 new Selector(selector.kind, selector.memberName, callStructure), 2174 new Selector(selector.kind, selector.memberName, callStructure),
2141 elements.getTypeMask(node), 2175 elements.getTypeMask(node),
2142 arguments, 2176 arguments,
2143 sourceInformation: 2177 sourceInformationBuilder.buildCall(receiver, node.selector));
2144 sourceInformationBuilder.buildCall(receiver, node.selector));
2145 } 2178 }
2146 2179
2147 ir.Primitive translateSuperBinary(FunctionElement function, 2180 ir.Primitive translateSuperBinary(FunctionElement function,
2148 op.BinaryOperator operator, 2181 op.BinaryOperator operator,
2149 ast.Node argument) { 2182 ast.Node argument,
2183 SourceInformation sourceInformation) {
2150 List<ir.Primitive> arguments = <ir.Primitive>[visit(argument)]; 2184 List<ir.Primitive> arguments = <ir.Primitive>[visit(argument)];
2151 return irBuilder.buildSuperMethodInvocation(function, 2185 return irBuilder.buildSuperMethodInvocation(function,
2152 CallStructure.ONE_ARG, arguments); 2186 CallStructure.ONE_ARG, arguments, sourceInformation);
2153 } 2187 }
2154 2188
2155 @override 2189 @override
2156 ir.Primitive visitSuperBinary( 2190 ir.Primitive visitSuperBinary(
2157 ast.Send node, 2191 ast.Send node,
2158 FunctionElement function, 2192 FunctionElement function,
2159 op.BinaryOperator operator, 2193 op.BinaryOperator operator,
2160 ast.Node argument, 2194 ast.Node argument,
2161 _) { 2195 _) {
2162 return translateSuperBinary(function, operator, argument); 2196 return translateSuperBinary(function, operator, argument,
2197 sourceInformationBuilder.buildBinary(node));
2163 } 2198 }
2164 2199
2165 @override 2200 @override
2166 ir.Primitive visitSuperIndex( 2201 ir.Primitive visitSuperIndex(
2167 ast.Send node, 2202 ast.Send node,
2168 FunctionElement function, 2203 FunctionElement function,
2169 ast.Node index, 2204 ast.Node index,
2170 _) { 2205 _) {
2171 return irBuilder.buildSuperIndex(function, visit(index)); 2206 return irBuilder.buildSuperIndex(function, visit(index),
2207 sourceInformationBuilder.buildIndex(node));
2172 } 2208 }
2173 2209
2174 @override 2210 @override
2175 ir.Primitive visitEquals( 2211 ir.Primitive visitEquals(
2176 ast.Send node, 2212 ast.Send node,
2177 ast.Node left, 2213 ast.Node left,
2178 ast.Node right, 2214 ast.Node right,
2179 _) { 2215 _) {
2180 return translateBinary(node, left, op.BinaryOperator.EQ, right); 2216 return translateBinary(node, left, op.BinaryOperator.EQ, right);
2181 } 2217 }
2182 2218
2183 @override 2219 @override
2184 ir.Primitive visitSuperEquals( 2220 ir.Primitive visitSuperEquals(
2185 ast.Send node, 2221 ast.Send node,
2186 FunctionElement function, 2222 FunctionElement function,
2187 ast.Node argument, 2223 ast.Node argument,
2188 _) { 2224 _) {
2189 return translateSuperBinary(function, op.BinaryOperator.EQ, argument); 2225 return translateSuperBinary(function, op.BinaryOperator.EQ, argument,
2226 sourceInformationBuilder.buildBinary(node));
2190 } 2227 }
2191 2228
2192 @override 2229 @override
2193 ir.Primitive visitNot( 2230 ir.Primitive visitNot(
2194 ast.Send node, 2231 ast.Send node,
2195 ast.Node expression, 2232 ast.Node expression,
2196 _) { 2233 _) {
2197 return irBuilder.buildNegation(visit(expression)); 2234 return irBuilder.buildNegation(visit(expression));
2198 } 2235 }
2199 2236
2200 @override 2237 @override
2201 ir.Primitive visitNotEquals( 2238 ir.Primitive visitNotEquals(
2202 ast.Send node, 2239 ast.Send node,
2203 ast.Node left, 2240 ast.Node left,
2204 ast.Node right, 2241 ast.Node right,
2205 _) { 2242 _) {
2206 return irBuilder.buildNegation( 2243 return irBuilder.buildNegation(
2207 translateBinary(node, left, op.BinaryOperator.NOT_EQ, right)); 2244 translateBinary(node, left, op.BinaryOperator.NOT_EQ, right));
2208 } 2245 }
2209 2246
2210 @override 2247 @override
2211 ir.Primitive visitSuperNotEquals( 2248 ir.Primitive visitSuperNotEquals(
2212 ast.Send node, 2249 ast.Send node,
2213 FunctionElement function, 2250 FunctionElement function,
2214 ast.Node argument, 2251 ast.Node argument,
2215 _) { 2252 _) {
2216 return irBuilder.buildNegation( 2253 return irBuilder.buildNegation(
2217 translateSuperBinary(function, op.BinaryOperator.NOT_EQ, argument)); 2254 translateSuperBinary(function, op.BinaryOperator.NOT_EQ, argument,
2255 sourceInformationBuilder.buildBinary(node)));
2218 } 2256 }
2219 2257
2220 @override 2258 @override
2221 ir.Primitive visitUnary(ast.Send node, 2259 ir.Primitive visitUnary(ast.Send node,
2222 op.UnaryOperator operator, ast.Node expression, _) { 2260 op.UnaryOperator operator, ast.Node expression, _) {
2223 // TODO(johnniwinther): Clean up the creation of selectors. 2261 // TODO(johnniwinther): Clean up the creation of selectors.
2224 Selector selector = operator.selector; 2262 Selector selector = operator.selector;
2225 ir.Primitive receiver = translateReceiver(expression); 2263 ir.Primitive receiver = translateReceiver(expression);
2226 return irBuilder.buildDynamicInvocation( 2264 return irBuilder.buildDynamicInvocation(
2227 receiver, selector, elements.getTypeMask(node), const [], 2265 receiver, selector, elements.getTypeMask(node), const [],
2228 sourceInformation: sourceInformationBuilder.buildCall( 2266 sourceInformationBuilder.buildCall(expression, node));
2229 expression, node));
2230 } 2267 }
2231 2268
2232 @override 2269 @override
2233 ir.Primitive visitSuperUnary( 2270 ir.Primitive visitSuperUnary(
2234 ast.Send node, 2271 ast.Send node,
2235 op.UnaryOperator operator, 2272 op.UnaryOperator operator,
2236 FunctionElement function, 2273 FunctionElement function,
2237 _) { 2274 _) {
2238 return irBuilder.buildSuperMethodInvocation( 2275 return irBuilder.buildSuperMethodInvocation(
2239 function, CallStructure.NO_ARGS, const []); 2276 function, CallStructure.NO_ARGS, const [],
2277 sourceInformationBuilder.buildCall(node, node));
2240 } 2278 }
2241 2279
2242 // TODO(johnniwinther): Handle this in the [IrBuilder] to ensure the correct 2280 // TODO(johnniwinther): Handle this in the [IrBuilder] to ensure the correct
2243 // semantic correlation between arguments and invocation. 2281 // semantic correlation between arguments and invocation.
2244 CallStructure translateDynamicArguments(ast.NodeList nodeList, 2282 CallStructure translateDynamicArguments(ast.NodeList nodeList,
2245 CallStructure callStructure, 2283 CallStructure callStructure,
2246 List<ir.Primitive> arguments) { 2284 List<ir.Primitive> arguments) {
2247 assert(arguments.isEmpty); 2285 assert(arguments.isEmpty);
2248 for (ast.Node node in nodeList) arguments.add(visit(node)); 2286 for (ast.Node node in nodeList) arguments.add(visit(node));
2249 return normalizeDynamicArguments(callStructure, arguments); 2287 return normalizeDynamicArguments(callStructure, arguments);
(...skipping 10 matching lines...) Expand all
2260 return normalizeStaticArguments(callStructure, element, arguments); 2298 return normalizeStaticArguments(callStructure, element, arguments);
2261 } 2299 }
2262 2300
2263 ir.Primitive translateCallInvoke(ir.Primitive target, 2301 ir.Primitive translateCallInvoke(ir.Primitive target,
2264 ast.NodeList argumentsNode, 2302 ast.NodeList argumentsNode,
2265 CallStructure callStructure, 2303 CallStructure callStructure,
2266 SourceInformation sourceInformation) { 2304 SourceInformation sourceInformation) {
2267 List<ir.Primitive> arguments = <ir.Primitive>[]; 2305 List<ir.Primitive> arguments = <ir.Primitive>[];
2268 callStructure = 2306 callStructure =
2269 translateDynamicArguments(argumentsNode, callStructure, arguments); 2307 translateDynamicArguments(argumentsNode, callStructure, arguments);
2270 return irBuilder.buildCallInvocation(target, callStructure, arguments, 2308 return irBuilder.buildCallInvocation(
2271 sourceInformation: sourceInformation); 2309 target, callStructure, arguments, sourceInformation);
2272 } 2310 }
2273 2311
2274 @override 2312 @override
2275 ir.Primitive handleConstantInvoke( 2313 ir.Primitive handleConstantInvoke(
2276 ast.Send node, 2314 ast.Send node,
2277 ConstantExpression constant, 2315 ConstantExpression constant,
2278 ast.NodeList arguments, 2316 ast.NodeList arguments,
2279 CallStructure callStructure, 2317 CallStructure callStructure,
2280 _) { 2318 _) {
2281 ir.Primitive target = buildConstantExpression(constant, 2319 ir.Primitive target = buildConstantExpression(constant,
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
2359 _) { 2397 _) {
2360 ir.Primitive target = translateReceiver(receiver); 2398 ir.Primitive target = translateReceiver(receiver);
2361 List<ir.Primitive> arguments = <ir.Primitive>[]; 2399 List<ir.Primitive> arguments = <ir.Primitive>[];
2362 CallStructure callStructure = translateDynamicArguments( 2400 CallStructure callStructure = translateDynamicArguments(
2363 argumentsNode, selector.callStructure, arguments); 2401 argumentsNode, selector.callStructure, arguments);
2364 return irBuilder.buildDynamicInvocation( 2402 return irBuilder.buildDynamicInvocation(
2365 target, 2403 target,
2366 new Selector(selector.kind, selector.memberName, callStructure), 2404 new Selector(selector.kind, selector.memberName, callStructure),
2367 elements.getTypeMask(node), 2405 elements.getTypeMask(node),
2368 arguments, 2406 arguments,
2369 sourceInformation: 2407 sourceInformationBuilder.buildCall(node, node.selector));
2370 sourceInformationBuilder.buildCall(node, node.selector));
2371 } 2408 }
2372 2409
2373 @override 2410 @override
2374 ir.Primitive visitIfNotNullDynamicPropertyInvoke( 2411 ir.Primitive visitIfNotNullDynamicPropertyInvoke(
2375 ast.Send node, 2412 ast.Send node,
2376 ast.Node receiver, 2413 ast.Node receiver,
2377 ast.NodeList argumentsNode, 2414 ast.NodeList argumentsNode,
2378 Selector selector, 2415 Selector selector,
2379 _) { 2416 _) {
2380 ir.Primitive target = visit(receiver); 2417 ir.Primitive target = visit(receiver);
2381 return irBuilder.buildIfNotNullSend( 2418 return irBuilder.buildIfNotNullSend(
2382 target, 2419 target,
2383 nested(() { 2420 nested(() {
2384 List<ir.Primitive> arguments = <ir.Primitive>[]; 2421 List<ir.Primitive> arguments = <ir.Primitive>[];
2385 CallStructure callStructure = translateDynamicArguments( 2422 CallStructure callStructure = translateDynamicArguments(
2386 argumentsNode, selector.callStructure, arguments); 2423 argumentsNode, selector.callStructure, arguments);
2387 return irBuilder.buildDynamicInvocation( 2424 return irBuilder.buildDynamicInvocation(
2388 target, 2425 target,
2389 new Selector(selector.kind, selector.memberName, callStructure), 2426 new Selector(selector.kind, selector.memberName, callStructure),
2390 elements.getTypeMask(node), 2427 elements.getTypeMask(node),
2391 arguments); 2428 arguments,
2429 sourceInformationBuilder.buildCall(node, node.selector));
2392 })); 2430 }));
2393 } 2431 }
2394 2432
2395 ir.Primitive handleLocalInvoke( 2433 ir.Primitive handleLocalInvoke(
2396 ast.Send node, 2434 ast.Send node,
2397 LocalElement element, 2435 LocalElement element,
2398 ast.NodeList argumentsNode, 2436 ast.NodeList argumentsNode,
2399 CallStructure callStructure, 2437 CallStructure callStructure,
2400 _) { 2438 _) {
2401 ir.Primitive function = irBuilder.buildLocalGet(element); 2439 ir.Primitive function = irBuilder.buildLocalGet(element);
2402 List<ir.Primitive> arguments = <ir.Primitive>[]; 2440 List<ir.Primitive> arguments = <ir.Primitive>[];
2403 callStructure = 2441 callStructure =
2404 translateDynamicArguments(argumentsNode, callStructure, arguments); 2442 translateDynamicArguments(argumentsNode, callStructure, arguments);
2405 return irBuilder.buildCallInvocation(function, callStructure, arguments, 2443 return irBuilder.buildCallInvocation(function, callStructure, arguments,
2406 sourceInformation: 2444 sourceInformationBuilder.buildCall(node, argumentsNode));
2407 sourceInformationBuilder.buildCall(node, argumentsNode));
2408 } 2445 }
2409 2446
2410 @override 2447 @override
2411 ir.Primitive handleStaticFieldGet(ast.Send node, FieldElement field, _) { 2448 ir.Primitive handleStaticFieldGet(ast.Send node, FieldElement field, _) {
2412 return buildStaticFieldGet(field, sourceInformationBuilder.buildGet(node)); 2449 return buildStaticFieldGet(field, sourceInformationBuilder.buildGet(node));
2413 } 2450 }
2414 2451
2415 @override 2452 @override
2416 ir.Primitive handleStaticFieldInvoke( 2453 ir.Primitive handleStaticFieldInvoke(
2417 ast.Send node, 2454 ast.Send node,
2418 FieldElement field, 2455 FieldElement field,
2419 ast.NodeList argumentsNode, 2456 ast.NodeList argumentsNode,
2420 CallStructure callStructure, 2457 CallStructure callStructure,
2421 _) { 2458 _) {
2422 SourceInformation src = sourceInformationBuilder.buildGet(node); 2459 SourceInformation src = sourceInformationBuilder.buildGet(node);
2423 ir.Primitive target = buildStaticFieldGet(field, src); 2460 ir.Primitive target = buildStaticFieldGet(field, src);
2424 List<ir.Primitive> arguments = <ir.Primitive>[]; 2461 List<ir.Primitive> arguments = <ir.Primitive>[];
2425 callStructure = 2462 callStructure =
2426 translateDynamicArguments(argumentsNode, callStructure, arguments); 2463 translateDynamicArguments(argumentsNode, callStructure, arguments);
2427 return irBuilder.buildCallInvocation( 2464 return irBuilder.buildCallInvocation(
2428 target, 2465 target,
2429 callStructure, 2466 callStructure,
2430 arguments, 2467 arguments,
2431 sourceInformation: 2468 sourceInformationBuilder.buildCall(node, argumentsNode));
2432 sourceInformationBuilder.buildCall(node, argumentsNode));
2433 } 2469 }
2434 2470
2435 @override 2471 @override
2436 ir.Primitive handleStaticFunctionInvoke(ast.Send node, 2472 ir.Primitive handleStaticFunctionInvoke(ast.Send node,
2437 MethodElement function, 2473 MethodElement function,
2438 ast.NodeList argumentsNode, 2474 ast.NodeList argumentsNode,
2439 CallStructure callStructure, 2475 CallStructure callStructure,
2440 _) { 2476 _) {
2441 if (compiler.backend.isForeign(function)) { 2477 if (compiler.backend.isForeign(function)) {
2442 return handleForeignCode(node, function, argumentsNode, callStructure); 2478 return handleForeignCode(
2479 node,
2480 function,
2481 argumentsNode,
2482 callStructure);
2443 } else { 2483 } else {
2444 List<ir.Primitive> arguments = <ir.Primitive>[]; 2484 List<ir.Primitive> arguments = <ir.Primitive>[];
2445 callStructure = translateStaticArguments(argumentsNode, function, 2485 callStructure = translateStaticArguments(argumentsNode, function,
2446 callStructure, arguments); 2486 callStructure, arguments);
2447 Selector selector = new Selector.call(function.memberName, callStructure); 2487 Selector selector = new Selector.call(function.memberName, callStructure);
2448 return irBuilder.buildInvokeStatic(function, selector, arguments, 2488 return irBuilder.buildInvokeStatic(function, selector, arguments,
2449 sourceInformationBuilder.buildCall(node, node.selector)); 2489 sourceInformationBuilder.buildCall(node, node.selector));
2450 } 2490 }
2451 } 2491 }
2452 2492
2453 @override 2493 @override
2454 ir.Primitive handleStaticFunctionIncompatibleInvoke( 2494 ir.Primitive handleStaticFunctionIncompatibleInvoke(
2455 ast.Send node, 2495 ast.Send node,
2456 MethodElement function, 2496 MethodElement function,
2457 ast.NodeList arguments, 2497 ast.NodeList arguments,
2458 CallStructure callStructure, _) { 2498 CallStructure callStructure, _) {
2459 return irBuilder.buildStaticNoSuchMethod( 2499 return irBuilder.buildStaticNoSuchMethod(
2460 elements.getSelector(node), 2500 elements.getSelector(node),
2461 arguments.nodes.mapToList(visit)); 2501 arguments.nodes.mapToList(visit),
2502 sourceInformationBuilder.buildCall(node, node.selector));
2462 } 2503 }
2463 2504
2464 @override 2505 @override
2465 ir.Primitive handleStaticGetterInvoke( 2506 ir.Primitive handleStaticGetterInvoke(
2466 ast.Send node, 2507 ast.Send node,
2467 FunctionElement getter, 2508 FunctionElement getter,
2468 ast.NodeList argumentsNode, 2509 ast.NodeList argumentsNode,
2469 CallStructure callStructure, 2510 CallStructure callStructure,
2470 _) { 2511 _) {
2471 ir.Primitive target = buildStaticGetterGet(getter, node); 2512 ir.Primitive target = buildStaticGetterGet(
2513 getter, node, sourceInformationBuilder.buildGet(node));
2472 List<ir.Primitive> arguments = <ir.Primitive>[]; 2514 List<ir.Primitive> arguments = <ir.Primitive>[];
2473 callStructure = 2515 callStructure =
2474 translateDynamicArguments(argumentsNode, callStructure, arguments); 2516 translateDynamicArguments(argumentsNode, callStructure, arguments);
2475 return irBuilder.buildCallInvocation( 2517 return irBuilder.buildCallInvocation(
2476 target, 2518 target,
2477 callStructure, 2519 callStructure,
2478 arguments, 2520 arguments,
2479 sourceInformation: 2521 sourceInformationBuilder.buildCall(node, argumentsNode));
2480 sourceInformationBuilder.buildCall(node, argumentsNode));
2481 } 2522 }
2482 2523
2483 @override 2524 @override
2484 ir.Primitive visitSuperFieldInvoke( 2525 ir.Primitive visitSuperFieldInvoke(
2485 ast.Send node, 2526 ast.Send node,
2486 FieldElement field, 2527 FieldElement field,
2487 ast.NodeList argumentsNode, 2528 ast.NodeList argumentsNode,
2488 CallStructure callStructure, 2529 CallStructure callStructure,
2489 _) { 2530 _) {
2490 ir.Primitive target = irBuilder.buildSuperFieldGet(field); 2531 ir.Primitive target = irBuilder.buildSuperFieldGet(
2532 field, sourceInformationBuilder.buildGet(node));
2491 List<ir.Primitive> arguments = <ir.Primitive>[]; 2533 List<ir.Primitive> arguments = <ir.Primitive>[];
2492 callStructure = 2534 callStructure =
2493 translateDynamicArguments(argumentsNode, callStructure, arguments); 2535 translateDynamicArguments(argumentsNode, callStructure, arguments);
2494 return irBuilder.buildCallInvocation( 2536 return irBuilder.buildCallInvocation(
2495 target, 2537 target,
2496 callStructure, 2538 callStructure,
2497 arguments, 2539 arguments,
2498 sourceInformation: 2540 sourceInformationBuilder.buildCall(node, argumentsNode));
2499 sourceInformationBuilder.buildCall(node, argumentsNode));
2500 } 2541 }
2501 2542
2502 @override 2543 @override
2503 ir.Primitive visitSuperGetterInvoke( 2544 ir.Primitive visitSuperGetterInvoke(
2504 ast.Send node, 2545 ast.Send node,
2505 FunctionElement getter, 2546 FunctionElement getter,
2506 ast.NodeList argumentsNode, 2547 ast.NodeList argumentsNode,
2507 CallStructure callStructure, 2548 CallStructure callStructure,
2508 _) { 2549 _) {
2509 ir.Primitive target = irBuilder.buildSuperGetterGet(getter, 2550 ir.Primitive target = irBuilder.buildSuperGetterGet(getter,
2510 sourceInformationBuilder.buildGet(node)); 2551 sourceInformationBuilder.buildGet(node));
2511 List<ir.Primitive> arguments = <ir.Primitive>[]; 2552 List<ir.Primitive> arguments = <ir.Primitive>[];
2512 callStructure = 2553 callStructure =
2513 translateDynamicArguments(argumentsNode, callStructure, arguments); 2554 translateDynamicArguments(argumentsNode, callStructure, arguments);
2514 return irBuilder.buildCallInvocation( 2555 return irBuilder.buildCallInvocation(
2515 target, 2556 target,
2516 callStructure, 2557 callStructure,
2517 arguments, 2558 arguments,
2518 sourceInformation: 2559 sourceInformationBuilder.buildCall(node, argumentsNode));
2519 sourceInformationBuilder.buildCall(node, argumentsNode));
2520 } 2560 }
2521 2561
2522 @override 2562 @override
2523 ir.Primitive visitSuperMethodInvoke( 2563 ir.Primitive visitSuperMethodInvoke(
2524 ast.Send node, 2564 ast.Send node,
2525 MethodElement method, 2565 MethodElement method,
2526 ast.NodeList argumentsNode, 2566 ast.NodeList argumentsNode,
2527 CallStructure callStructure, 2567 CallStructure callStructure,
2528 _) { 2568 _) {
2529 List<ir.Primitive> arguments = <ir.Primitive>[]; 2569 List<ir.Primitive> arguments = <ir.Primitive>[];
2530 callStructure = translateStaticArguments(argumentsNode, method, 2570 callStructure = translateStaticArguments(argumentsNode, method,
2531 callStructure, arguments); 2571 callStructure, arguments);
2532 return irBuilder.buildSuperMethodInvocation( 2572 return irBuilder.buildSuperMethodInvocation(
2533 method, 2573 method,
2534 callStructure, 2574 callStructure,
2535 arguments, 2575 arguments,
2536 sourceInformation: 2576 sourceInformationBuilder.buildCall(node, node.selector));
2537 sourceInformationBuilder.buildCall(node, node.selector));
2538 } 2577 }
2539 2578
2540 @override 2579 @override
2541 ir.Primitive visitSuperMethodIncompatibleInvoke( 2580 ir.Primitive visitSuperMethodIncompatibleInvoke(
2542 ast.Send node, 2581 ast.Send node,
2543 MethodElement method, 2582 MethodElement method,
2544 ast.NodeList arguments, 2583 ast.NodeList arguments,
2545 CallStructure callStructure, _) { 2584 CallStructure callStructure, _) {
2546 List<ir.Primitive> normalizedArguments = <ir.Primitive>[]; 2585 List<ir.Primitive> normalizedArguments = <ir.Primitive>[];
2547 CallStructure normalizedCallStructure = 2586 CallStructure normalizedCallStructure =
2548 translateDynamicArguments(arguments, callStructure, normalizedArguments); 2587 translateDynamicArguments(arguments, callStructure, normalizedArguments);
2549 return buildSuperNoSuchMethod( 2588 return buildSuperNoSuchMethod(
2550 new Selector.call(method.memberName, normalizedCallStructure), 2589 new Selector.call(method.memberName, normalizedCallStructure),
2551 elements.getTypeMask(node), 2590 elements.getTypeMask(node),
2552 normalizedArguments); 2591 normalizedArguments,
2592 sourceInformationBuilder.buildCall(node, arguments));
2553 } 2593 }
2554 2594
2555 @override 2595 @override
2556 ir.Primitive visitUnresolvedSuperInvoke( 2596 ir.Primitive visitUnresolvedSuperInvoke(
2557 ast.Send node, 2597 ast.Send node,
2558 Element element, 2598 Element element,
2559 ast.NodeList argumentsNode, 2599 ast.NodeList argumentsNode,
2560 Selector selector, _) { 2600 Selector selector, _) {
2561 List<ir.Primitive> arguments = <ir.Primitive>[]; 2601 List<ir.Primitive> arguments = <ir.Primitive>[];
2562 CallStructure callStructure = translateDynamicArguments( 2602 CallStructure callStructure = translateDynamicArguments(
2563 argumentsNode, selector.callStructure, arguments); 2603 argumentsNode, selector.callStructure, arguments);
2564 // TODO(johnniwinther): Supply a member name to the visit function instead 2604 // TODO(johnniwinther): Supply a member name to the visit function instead
2565 // of looking it up in elements. 2605 // of looking it up in elements.
2566 return buildSuperNoSuchMethod( 2606 return buildSuperNoSuchMethod(
2567 new Selector.call(elements.getSelector(node).memberName, callStructure), 2607 new Selector.call(elements.getSelector(node).memberName, callStructure),
2568 elements.getTypeMask(node), 2608 elements.getTypeMask(node),
2569 arguments); 2609 arguments,
2610 sourceInformationBuilder.buildCall(node, argumentsNode));
2570 } 2611 }
2571 2612
2572 @override 2613 @override
2573 ir.Primitive visitThisInvoke( 2614 ir.Primitive visitThisInvoke(
2574 ast.Send node, 2615 ast.Send node,
2575 ast.NodeList arguments, 2616 ast.NodeList arguments,
2576 CallStructure callStructure, 2617 CallStructure callStructure,
2577 _) { 2618 _) {
2578 return translateCallInvoke( 2619 return translateCallInvoke(
2579 irBuilder.buildThis(), 2620 irBuilder.buildThis(),
(...skipping 18 matching lines...) Expand all
2598 } 2639 }
2599 2640
2600 @override 2641 @override
2601 ir.Primitive visitIndexSet( 2642 ir.Primitive visitIndexSet(
2602 ast.SendSet node, 2643 ast.SendSet node,
2603 ast.Node receiver, 2644 ast.Node receiver,
2604 ast.Node index, 2645 ast.Node index,
2605 ast.Node rhs, 2646 ast.Node rhs,
2606 _) { 2647 _) {
2607 return irBuilder.buildDynamicIndexSet( 2648 return irBuilder.buildDynamicIndexSet(
2608 visit(receiver), elements.getTypeMask(node), visit(index), visit(rhs)); 2649 visit(receiver),
2650 elements.getTypeMask(node),
2651 visit(index),
2652 visit(rhs),
2653 sourceInformationBuilder.buildIndexSet(node));
2609 } 2654 }
2610 2655
2611 @override 2656 @override
2612 ir.Primitive visitSuperIndexSet( 2657 ir.Primitive visitSuperIndexSet(
2613 ast.SendSet node, 2658 ast.SendSet node,
2614 FunctionElement function, 2659 FunctionElement function,
2615 ast.Node index, 2660 ast.Node index,
2616 ast.Node rhs, 2661 ast.Node rhs,
2617 _) { 2662 _) {
2618 return irBuilder.buildSuperIndexSet(function, visit(index), visit(rhs)); 2663 return irBuilder.buildSuperIndexSet(
2664 function,
2665 visit(index),
2666 visit(rhs),
2667 sourceInformationBuilder.buildIndexSet(node));
2619 } 2668 }
2620 2669
2621 ir.Primitive translateCompounds( 2670 ir.Primitive translateCompounds(
2622 ast.SendSet node, 2671 ast.SendSet node,
2623 ir.Primitive getValue(), 2672 ir.Primitive getValue(),
2624 CompoundRhs rhs, 2673 CompoundRhs rhs,
2625 void setValue(ir.Primitive value)) { 2674 void setValue(ir.Primitive value)) {
2626 ir.Primitive value = getValue(); 2675 ir.Primitive value = getValue();
2627 op.BinaryOperator operator = rhs.operator; 2676 op.BinaryOperator operator = rhs.operator;
2628 if (operator.kind == op.BinaryOperatorKind.IF_NULL) { 2677 if (operator.kind == op.BinaryOperatorKind.IF_NULL) {
(...skipping 20 matching lines...) Expand all
2649 TypeMask operatorTypeMask = 2698 TypeMask operatorTypeMask =
2650 elements.getOperatorTypeMaskInComplexSendSet(node); 2699 elements.getOperatorTypeMaskInComplexSendSet(node);
2651 SourceInformation operatorSourceInformation = 2700 SourceInformation operatorSourceInformation =
2652 sourceInformationBuilder.buildCall(node, node.assignmentOperator); 2701 sourceInformationBuilder.buildCall(node, node.assignmentOperator);
2653 ir.Primitive result = irBuilder.buildDynamicInvocation( 2702 ir.Primitive result = irBuilder.buildDynamicInvocation(
2654 value, 2703 value,
2655 new Selector(operatorSelector.kind, operatorSelector.memberName, 2704 new Selector(operatorSelector.kind, operatorSelector.memberName,
2656 callStructure), 2705 callStructure),
2657 operatorTypeMask, 2706 operatorTypeMask,
2658 arguments, 2707 arguments,
2659 sourceInformation: operatorSourceInformation); 2708 operatorSourceInformation);
2660 setValue(result); 2709 setValue(result);
2661 return rhs.kind == CompoundKind.POSTFIX ? value : result; 2710 return rhs.kind == CompoundKind.POSTFIX ? value : result;
2662 } 2711 }
2663 2712
2664 ir.Primitive translateSetIfNull( 2713 ir.Primitive translateSetIfNull(
2665 ast.SendSet node, 2714 ast.SendSet node,
2666 ir.Primitive getValue(), 2715 ir.Primitive getValue(),
2667 ast.Node rhs, 2716 ast.Node rhs,
2668 void setValue(ir.Primitive value)) { 2717 void setValue(ir.Primitive value)) {
2669 ir.Primitive value = getValue(); 2718 ir.Primitive value = getValue();
(...skipping 10 matching lines...) Expand all
2680 ir.Primitive handleDynamicSet( 2729 ir.Primitive handleDynamicSet(
2681 ast.SendSet node, 2730 ast.SendSet node,
2682 ast.Node receiver, 2731 ast.Node receiver,
2683 Name name, 2732 Name name,
2684 ast.Node rhs, 2733 ast.Node rhs,
2685 _) { 2734 _) {
2686 return irBuilder.buildDynamicSet( 2735 return irBuilder.buildDynamicSet(
2687 translateReceiver(receiver), 2736 translateReceiver(receiver),
2688 new Selector.setter(name), 2737 new Selector.setter(name),
2689 elements.getTypeMask(node), 2738 elements.getTypeMask(node),
2690 visit(rhs)); 2739 visit(rhs),
2740 sourceInformationBuilder.buildAssignment(node));
2691 } 2741 }
2692 2742
2693 @override 2743 @override
2694 ir.Primitive visitIfNotNullDynamicPropertySet( 2744 ir.Primitive visitIfNotNullDynamicPropertySet(
2695 ast.SendSet node, 2745 ast.SendSet node,
2696 ast.Node receiver, 2746 ast.Node receiver,
2697 Name name, 2747 Name name,
2698 ast.Node rhs, 2748 ast.Node rhs,
2699 _) { 2749 _) {
2700 ir.Primitive target = visit(receiver); 2750 ir.Primitive target = visit(receiver);
2701 return irBuilder.buildIfNotNullSend( 2751 return irBuilder.buildIfNotNullSend(
2702 target, 2752 target,
2703 nested(() => irBuilder.buildDynamicSet( 2753 nested(() => irBuilder.buildDynamicSet(
2704 target, 2754 target,
2705 new Selector.setter(name), 2755 new Selector.setter(name),
2706 elements.getTypeMask(node), 2756 elements.getTypeMask(node),
2707 visit(rhs)))); 2757 visit(rhs),
2758 sourceInformationBuilder.buildAssignment(node))));
2708 } 2759 }
2709 2760
2710 @override 2761 @override
2711 ir.Primitive handleLocalSet( 2762 ir.Primitive handleLocalSet(
2712 ast.SendSet node, 2763 ast.SendSet node,
2713 LocalElement element, 2764 LocalElement element,
2714 ast.Node rhs, 2765 ast.Node rhs,
2715 _) { 2766 _) {
2716 ir.Primitive value = visit(rhs); 2767 ir.Primitive value = visit(rhs);
2717 value = checkTypeVsElement(value, element); 2768 value = checkTypeVsElement(value, element);
2718 return irBuilder.buildLocalVariableSet(element, value); 2769 return irBuilder.buildLocalVariableSet(element, value,
2770 sourceInformationBuilder.buildAssignment(node));
2719 } 2771 }
2720 2772
2721 @override 2773 @override
2722 ir.Primitive handleStaticFieldSet( 2774 ir.Primitive handleStaticFieldSet(
2723 ast.SendSet node, 2775 ast.SendSet node,
2724 FieldElement field, 2776 FieldElement field,
2725 ast.Node rhs, 2777 ast.Node rhs,
2726 _) { 2778 _) {
2727 ir.Primitive value = visit(rhs); 2779 ir.Primitive value = visit(rhs);
2728 irBuilder.addPrimitive(new ir.SetStatic(field, value)); 2780 irBuilder.addPrimitive(new ir.SetStatic(field, value,
2781 sourceInformationBuilder.buildAssignment(node)));
2729 return value; 2782 return value;
2730 } 2783 }
2731 2784
2732 @override 2785 @override
2733 ir.Primitive visitSuperFieldSet( 2786 ir.Primitive visitSuperFieldSet(
2734 ast.SendSet node, 2787 ast.SendSet node,
2735 FieldElement field, 2788 FieldElement field,
2736 ast.Node rhs, 2789 ast.Node rhs,
2737 _) { 2790 _) {
2738 return irBuilder.buildSuperFieldSet(field, visit(rhs)); 2791 return irBuilder.buildSuperFieldSet(field, visit(rhs),
2792 sourceInformationBuilder.buildAssignment(node));
2739 } 2793 }
2740 2794
2741 @override 2795 @override
2742 ir.Primitive visitSuperSetterSet( 2796 ir.Primitive visitSuperSetterSet(
2743 ast.SendSet node, 2797 ast.SendSet node,
2744 FunctionElement setter, 2798 FunctionElement setter,
2745 ast.Node rhs, 2799 ast.Node rhs,
2746 _) { 2800 _) {
2747 return irBuilder.buildSuperSetterSet(setter, visit(rhs)); 2801 return irBuilder.buildSuperSetterSet(setter, visit(rhs),
2802 sourceInformationBuilder.buildAssignment(node));
2748 } 2803 }
2749 2804
2750 @override 2805 @override
2751 ir.Primitive visitUnresolvedSuperIndexSet( 2806 ir.Primitive visitUnresolvedSuperIndexSet(
2752 ast.Send node, 2807 ast.Send node,
2753 Element element, 2808 Element element,
2754 ast.Node index, 2809 ast.Node index,
2755 ast.Node rhs, 2810 ast.Node rhs,
2756 arg) { 2811 arg) {
2757 return giveup(node, 'visitUnresolvedSuperIndexSet'); 2812 return giveup(node, 'visitUnresolvedSuperIndexSet');
2758 } 2813 }
2759 2814
2760 @override 2815 @override
2761 ir.Primitive handleStaticSetterSet( 2816 ir.Primitive handleStaticSetterSet(
2762 ast.SendSet node, 2817 ast.SendSet node,
2763 FunctionElement setter, 2818 FunctionElement setter,
2764 ast.Node rhs, 2819 ast.Node rhs,
2765 _) { 2820 _) {
2766 return irBuilder.buildStaticSetterSet(setter, visit(rhs)); 2821 return irBuilder.buildStaticSetterSet(setter, visit(rhs),
2822 sourceInformationBuilder.buildAssignment(node));
2767 } 2823 }
2768 2824
2769 @override 2825 @override
2770 ir.Primitive handleTypeLiteralConstantCompounds( 2826 ir.Primitive handleTypeLiteralConstantCompounds(
2771 ast.SendSet node, 2827 ast.SendSet node,
2772 ConstantExpression constant, 2828 ConstantExpression constant,
2773 CompoundRhs rhs, 2829 CompoundRhs rhs,
2774 arg) { 2830 arg) {
2775 SourceInformation src = sourceInformationBuilder.buildGet(node); 2831 SourceInformation src = sourceInformationBuilder.buildGet(node);
2776 return translateCompounds(node, () { 2832 return translateCompounds(node, () {
(...skipping 27 matching lines...) Expand all
2804 return irBuilder.buildDynamicGet( 2860 return irBuilder.buildDynamicGet(
2805 target, 2861 target,
2806 new Selector.getter(name), 2862 new Selector.getter(name),
2807 elements.getGetterTypeMaskInComplexSendSet(node), 2863 elements.getGetterTypeMaskInComplexSendSet(node),
2808 sourceInformationBuilder.buildGet(node)); 2864 sourceInformationBuilder.buildGet(node));
2809 }, rhs, (ir.Primitive result) { 2865 }, rhs, (ir.Primitive result) {
2810 irBuilder.buildDynamicSet( 2866 irBuilder.buildDynamicSet(
2811 target, 2867 target,
2812 new Selector.setter(name), 2868 new Selector.setter(name),
2813 elements.getTypeMask(node), 2869 elements.getTypeMask(node),
2814 result); 2870 result,
2871 sourceInformationBuilder.buildAssignment(node));
2815 }); 2872 });
2816 } 2873 }
2817 return node.isConditional 2874 return node.isConditional
2818 ? irBuilder.buildIfNotNullSend(target, nested(helper)) 2875 ? irBuilder.buildIfNotNullSend(target, nested(helper))
2819 : helper(); 2876 : helper();
2820 } 2877 }
2821 2878
2822 @override 2879 @override
2823 ir.Primitive handleDynamicSetIfNulls( 2880 ir.Primitive handleDynamicSetIfNulls(
2824 ast.Send node, 2881 ast.Send node,
2825 ast.Node receiver, 2882 ast.Node receiver,
2826 Name name, 2883 Name name,
2827 ast.Node rhs, 2884 ast.Node rhs,
2828 _) { 2885 _) {
2829 ir.Primitive target = translateReceiver(receiver); 2886 ir.Primitive target = translateReceiver(receiver);
2830 ir.Primitive helper() { 2887 ir.Primitive helper() {
2831 return translateSetIfNull(node, () { 2888 return translateSetIfNull(node, () {
2832 return irBuilder.buildDynamicGet( 2889 return irBuilder.buildDynamicGet(
2833 target, 2890 target,
2834 new Selector.getter(name), 2891 new Selector.getter(name),
2835 elements.getGetterTypeMaskInComplexSendSet(node), 2892 elements.getGetterTypeMaskInComplexSendSet(node),
2836 sourceInformationBuilder.buildGet(node)); 2893 sourceInformationBuilder.buildGet(node));
2837 }, rhs, (ir.Primitive result) { 2894 }, rhs, (ir.Primitive result) {
2838 irBuilder.buildDynamicSet( 2895 irBuilder.buildDynamicSet(
2839 target, 2896 target,
2840 new Selector.setter(name), 2897 new Selector.setter(name),
2841 elements.getTypeMask(node), 2898 elements.getTypeMask(node),
2842 result); 2899 result,
2900 sourceInformationBuilder.buildAssignment(node));
2843 }); 2901 });
2844 } 2902 }
2845 return node.isConditional 2903 return node.isConditional
2846 ? irBuilder.buildIfNotNullSend(target, nested(helper)) 2904 ? irBuilder.buildIfNotNullSend(target, nested(helper))
2847 : helper(); 2905 : helper();
2848 } 2906 }
2849 2907
2850 ir.Primitive buildLocalNoSuchSetter(LocalElement local, ir.Primitive value) { 2908 ir.Primitive buildLocalNoSuchSetter(
2909 LocalElement local,
2910 ir.Primitive value,
2911 SourceInformation sourceInformation) {
2851 Selector selector = new Selector.setter( 2912 Selector selector = new Selector.setter(
2852 new Name(local.name, local.library, isSetter: true)); 2913 new Name(local.name, local.library, isSetter: true));
2853 return irBuilder.buildStaticNoSuchMethod(selector, [value]); 2914 return irBuilder.buildStaticNoSuchMethod(
2915 selector, [value], sourceInformation);
2854 } 2916 }
2855 2917
2856 @override 2918 @override
2857 ir.Primitive handleLocalCompounds( 2919 ir.Primitive handleLocalCompounds(
2858 ast.SendSet node, 2920 ast.SendSet node,
2859 LocalElement local, 2921 LocalElement local,
2860 CompoundRhs rhs, 2922 CompoundRhs rhs,
2861 arg, 2923 arg,
2862 {bool isSetterValid}) { 2924 {bool isSetterValid}) {
2863 return translateCompounds(node, () { 2925 return translateCompounds(node, () {
2864 return irBuilder.buildLocalGet(local); 2926 return irBuilder.buildLocalGet(local);
2865 }, rhs, (ir.Primitive result) { 2927 }, rhs, (ir.Primitive result) {
2866 if (isSetterValid) { 2928 if (isSetterValid) {
2867 irBuilder.buildLocalVariableSet(local, result); 2929 irBuilder.buildLocalVariableSet(
2930 local, result,
2931 sourceInformationBuilder.buildAssignment(node));
2868 } else { 2932 } else {
2869 Selector selector = new Selector.setter( 2933 Selector selector = new Selector.setter(
2870 new Name(local.name, local.library, isSetter: true)); 2934 new Name(local.name, local.library, isSetter: true));
2871 irBuilder.buildStaticNoSuchMethod(selector, <ir.Primitive>[result]); 2935 irBuilder.buildStaticNoSuchMethod(
2936 selector, <ir.Primitive>[result],
2937 sourceInformationBuilder.buildAssignment(node));
2872 } 2938 }
2873 }); 2939 });
2874 } 2940 }
2875 2941
2876 @override 2942 @override
2877 ir.Primitive handleLocalSetIfNulls( 2943 ir.Primitive handleLocalSetIfNulls(
2878 ast.SendSet node, 2944 ast.SendSet node,
2879 LocalElement local, 2945 LocalElement local,
2880 ast.Node rhs, 2946 ast.Node rhs,
2881 _, 2947 _,
2882 {bool isSetterValid}) { 2948 {bool isSetterValid}) {
2883 return translateSetIfNull(node, () { 2949 return translateSetIfNull(node, () {
2884 return irBuilder.buildLocalGet(local); 2950 return irBuilder.buildLocalGet(
2951 local, sourceInformation: sourceInformationBuilder.buildGet(node));
2885 }, rhs, (ir.Primitive result) { 2952 }, rhs, (ir.Primitive result) {
2953 SourceInformation sourceInformation =
2954 sourceInformationBuilder.buildAssignment(node);
2886 if (isSetterValid) { 2955 if (isSetterValid) {
2887 irBuilder.buildLocalVariableSet(local, result); 2956 irBuilder.buildLocalVariableSet(
2957 local, result, sourceInformation);
2888 } else { 2958 } else {
2889 Selector selector = new Selector.setter( 2959 Selector selector = new Selector.setter(
2890 new Name(local.name, local.library, isSetter: true)); 2960 new Name(local.name, local.library, isSetter: true));
2891 irBuilder.buildStaticNoSuchMethod(selector, <ir.Primitive>[result]); 2961 irBuilder.buildStaticNoSuchMethod(
2962 selector, <ir.Primitive>[result], sourceInformation);
2892 } 2963 }
2893 }); 2964 });
2894 } 2965 }
2895 2966
2896 @override 2967 @override
2897 ir.Primitive handleStaticCompounds( 2968 ir.Primitive handleStaticCompounds(
2898 ast.SendSet node, 2969 ast.SendSet node,
2899 Element getter, 2970 Element getter,
2900 CompoundGetter getterKind, 2971 CompoundGetter getterKind,
2901 Element setter, 2972 Element setter,
2902 CompoundSetter setterKind, 2973 CompoundSetter setterKind,
2903 CompoundRhs rhs, 2974 CompoundRhs rhs,
2904 arg) { 2975 arg) {
2905 return translateCompounds(node, () { 2976 return translateCompounds(node, () {
2977 SourceInformation sourceInformation =
2978 sourceInformationBuilder.buildGet(node);
2906 switch (getterKind) { 2979 switch (getterKind) {
2907 case CompoundGetter.FIELD: 2980 case CompoundGetter.FIELD:
2908 SourceInformation src = sourceInformationBuilder.buildGet(node); 2981 return buildStaticFieldGet(getter, sourceInformation);
2909 return buildStaticFieldGet(getter, src);
2910 case CompoundGetter.GETTER: 2982 case CompoundGetter.GETTER:
2911 return buildStaticGetterGet(getter, node); 2983 return buildStaticGetterGet(getter, node, sourceInformation);
2912 case CompoundGetter.METHOD: 2984 case CompoundGetter.METHOD:
2913 return irBuilder.addPrimitive(new ir.GetStatic(getter, 2985 return irBuilder.addPrimitive(new ir.GetStatic(getter,
2914 isFinal: true)); 2986 sourceInformation: sourceInformation, isFinal: true));
2915 case CompoundGetter.UNRESOLVED: 2987 case CompoundGetter.UNRESOLVED:
2916 return irBuilder.buildStaticNoSuchMethod( 2988 return irBuilder.buildStaticNoSuchMethod(
2917 new Selector.getter(new Name(getter.name, getter.library)), 2989 new Selector.getter(new Name(getter.name, getter.library)),
2918 <ir.Primitive>[]); 2990 <ir.Primitive>[],
2991 sourceInformation);
2919 } 2992 }
2920 }, rhs, (ir.Primitive result) { 2993 }, rhs, (ir.Primitive result) {
2994 SourceInformation sourceInformation =
2995 sourceInformationBuilder.buildAssignment(node);
2921 switch (setterKind) { 2996 switch (setterKind) {
2922 case CompoundSetter.FIELD: 2997 case CompoundSetter.FIELD:
2923 irBuilder.addPrimitive(new ir.SetStatic(setter, result)); 2998 irBuilder.addPrimitive(
2999 new ir.SetStatic(setter, result, sourceInformation));
2924 return; 3000 return;
2925 case CompoundSetter.SETTER: 3001 case CompoundSetter.SETTER:
2926 irBuilder.buildStaticSetterSet(setter, result); 3002 irBuilder.buildStaticSetterSet(setter, result, sourceInformation);
2927 return; 3003 return;
2928 case CompoundSetter.INVALID: 3004 case CompoundSetter.INVALID:
2929 irBuilder.buildStaticNoSuchMethod( 3005 irBuilder.buildStaticNoSuchMethod(
2930 new Selector.setter(new Name(setter.name, setter.library)), 3006 new Selector.setter(new Name(setter.name, setter.library)),
2931 <ir.Primitive>[result]); 3007 <ir.Primitive>[result],
3008 sourceInformation);
2932 return; 3009 return;
2933 } 3010 }
2934 }); 3011 });
2935 } 3012 }
2936 3013
2937 @override 3014 @override
2938 ir.Primitive handleStaticSetIfNulls( 3015 ir.Primitive handleStaticSetIfNulls(
2939 ast.SendSet node, 3016 ast.SendSet node,
2940 Element getter, 3017 Element getter,
2941 CompoundGetter getterKind, 3018 CompoundGetter getterKind,
2942 Element setter, 3019 Element setter,
2943 CompoundSetter setterKind, 3020 CompoundSetter setterKind,
2944 ast.Node rhs, 3021 ast.Node rhs,
2945 _) { 3022 _) {
2946 return translateSetIfNull(node, () { 3023 return translateSetIfNull(node, () {
3024 SourceInformation sourceInformation =
3025 sourceInformationBuilder.buildGet(node);
2947 switch (getterKind) { 3026 switch (getterKind) {
2948 case CompoundGetter.FIELD: 3027 case CompoundGetter.FIELD:
2949 SourceInformation src = sourceInformationBuilder.buildGet(node); 3028 return buildStaticFieldGet(getter, sourceInformation);
2950 return buildStaticFieldGet(getter, src);
2951 case CompoundGetter.GETTER: 3029 case CompoundGetter.GETTER:
2952 return buildStaticGetterGet(getter, node); 3030 return buildStaticGetterGet(getter, node, sourceInformation);
2953 case CompoundGetter.METHOD: 3031 case CompoundGetter.METHOD:
2954 return irBuilder.addPrimitive(new ir.GetStatic(getter, 3032 return irBuilder.addPrimitive(new ir.GetStatic(getter,
3033 sourceInformation: sourceInformation,
2955 isFinal: true)); 3034 isFinal: true));
2956 case CompoundGetter.UNRESOLVED: 3035 case CompoundGetter.UNRESOLVED:
2957 return irBuilder.buildStaticNoSuchMethod( 3036 return irBuilder.buildStaticNoSuchMethod(
2958 new Selector.getter(new Name(getter.name, getter.library)), 3037 new Selector.getter(new Name(getter.name, getter.library)),
2959 <ir.Primitive>[]); 3038 <ir.Primitive>[],
3039 sourceInformation);
2960 } 3040 }
2961 }, rhs, (ir.Primitive result) { 3041 }, rhs, (ir.Primitive result) {
3042 SourceInformation sourceInformation =
3043 sourceInformationBuilder.buildAssignment(node);
2962 switch (setterKind) { 3044 switch (setterKind) {
2963 case CompoundSetter.FIELD: 3045 case CompoundSetter.FIELD:
2964 irBuilder.addPrimitive(new ir.SetStatic(setter, result)); 3046 irBuilder.addPrimitive(new ir.SetStatic(
3047 setter, result, sourceInformation));
2965 return; 3048 return;
2966 case CompoundSetter.SETTER: 3049 case CompoundSetter.SETTER:
2967 irBuilder.buildStaticSetterSet(setter, result); 3050 irBuilder.buildStaticSetterSet(setter, result, sourceInformation);
2968 return; 3051 return;
2969 case CompoundSetter.INVALID: 3052 case CompoundSetter.INVALID:
2970 irBuilder.buildStaticNoSuchMethod( 3053 irBuilder.buildStaticNoSuchMethod(
2971 new Selector.setter(new Name(setter.name, setter.library)), 3054 new Selector.setter(new Name(setter.name, setter.library)),
2972 <ir.Primitive>[result]); 3055 <ir.Primitive>[result],
3056 sourceInformation);
2973 return; 3057 return;
2974 } 3058 }
2975 }); 3059 });
2976 } 3060 }
2977 3061
2978 ir.Primitive buildSuperNoSuchGetter(Element element, TypeMask mask) { 3062 ir.Primitive buildSuperNoSuchGetter(
3063 Element element,
3064 TypeMask mask,
3065 SourceInformation sourceInformation) {
2979 return buildSuperNoSuchMethod( 3066 return buildSuperNoSuchMethod(
2980 new Selector.getter(new Name(element.name, element.library)), 3067 new Selector.getter(new Name(element.name, element.library)),
2981 mask, 3068 mask,
2982 const <ir.Primitive>[]); 3069 const <ir.Primitive>[],
3070 sourceInformation);
2983 } 3071 }
2984 3072
2985 ir.Primitive buildSuperNoSuchSetter(Element element, 3073 ir.Primitive buildSuperNoSuchSetter(
2986 TypeMask mask, 3074 Element element,
2987 ir.Primitive value) { 3075 TypeMask mask,
3076 ir.Primitive value,
3077 SourceInformation sourceInformation) {
2988 return buildSuperNoSuchMethod( 3078 return buildSuperNoSuchMethod(
2989 new Selector.setter(new Name(element.name, element.library)), 3079 new Selector.setter(new Name(element.name, element.library)),
2990 mask, 3080 mask,
2991 <ir.Primitive>[value]); 3081 <ir.Primitive>[value],
3082 sourceInformation);
2992 } 3083 }
2993 3084
2994 @override 3085 @override
2995 ir.Primitive handleSuperCompounds( 3086 ir.Primitive handleSuperCompounds(
2996 ast.SendSet node, 3087 ast.SendSet node,
2997 Element getter, 3088 Element getter,
2998 CompoundGetter getterKind, 3089 CompoundGetter getterKind,
2999 Element setter, 3090 Element setter,
3000 CompoundSetter setterKind, 3091 CompoundSetter setterKind,
3001 CompoundRhs rhs, 3092 CompoundRhs rhs,
3002 arg) { 3093 arg) {
3003 return translateCompounds(node, () { 3094 return translateCompounds(node, () {
3004 switch (getterKind) { 3095 switch (getterKind) {
3005 case CompoundGetter.FIELD: 3096 case CompoundGetter.FIELD:
3006 return irBuilder.buildSuperFieldGet(getter); 3097 return irBuilder.buildSuperFieldGet(
3098 getter, sourceInformationBuilder.buildGet(node));
3007 case CompoundGetter.GETTER: 3099 case CompoundGetter.GETTER:
3008 return irBuilder.buildSuperGetterGet( 3100 return irBuilder.buildSuperGetterGet(
3009 getter, sourceInformationBuilder.buildGet(node)); 3101 getter, sourceInformationBuilder.buildGet(node));
3010 case CompoundGetter.METHOD: 3102 case CompoundGetter.METHOD:
3011 return irBuilder.buildSuperMethodGet(getter); 3103 return irBuilder.buildSuperMethodGet(
3104 getter, sourceInformationBuilder.buildGet(node));
3012 case CompoundGetter.UNRESOLVED: 3105 case CompoundGetter.UNRESOLVED:
3013 return buildSuperNoSuchGetter( 3106 return buildSuperNoSuchGetter(
3014 getter, elements.getGetterTypeMaskInComplexSendSet(node)); 3107 getter, elements.getGetterTypeMaskInComplexSendSet(node),
3108 sourceInformationBuilder.buildGet(node));
3015 } 3109 }
3016 }, rhs, (ir.Primitive result) { 3110 }, rhs, (ir.Primitive result) {
3017 switch (setterKind) { 3111 switch (setterKind) {
3018 case CompoundSetter.FIELD: 3112 case CompoundSetter.FIELD:
3019 irBuilder.buildSuperFieldSet(setter, result); 3113 irBuilder.buildSuperFieldSet(setter, result,
3114 sourceInformationBuilder.buildAssignment(node));
3020 return; 3115 return;
3021 case CompoundSetter.SETTER: 3116 case CompoundSetter.SETTER:
3022 irBuilder.buildSuperSetterSet(setter, result); 3117 irBuilder.buildSuperSetterSet(setter, result,
3118 sourceInformationBuilder.buildAssignment(node));
3023 return; 3119 return;
3024 case CompoundSetter.INVALID: 3120 case CompoundSetter.INVALID:
3025 buildSuperNoSuchSetter( 3121 buildSuperNoSuchSetter(
3026 setter, elements.getTypeMask(node), result); 3122 setter, elements.getTypeMask(node), result,
3123 sourceInformationBuilder.buildAssignment(node));
3027 return; 3124 return;
3028 } 3125 }
3029 }); 3126 });
3030 } 3127 }
3031 3128
3032 @override 3129 @override
3033 ir.Primitive handleSuperSetIfNulls( 3130 ir.Primitive handleSuperSetIfNulls(
3034 ast.SendSet node, 3131 ast.SendSet node,
3035 Element getter, 3132 Element getter,
3036 CompoundGetter getterKind, 3133 CompoundGetter getterKind,
3037 Element setter, 3134 Element setter,
3038 CompoundSetter setterKind, 3135 CompoundSetter setterKind,
3039 ast.Node rhs, 3136 ast.Node rhs,
3040 _) { 3137 _) {
3041 return translateSetIfNull(node, () { 3138 return translateSetIfNull(node, () {
3042 switch (getterKind) { 3139 switch (getterKind) {
3043 case CompoundGetter.FIELD: 3140 case CompoundGetter.FIELD:
3044 return irBuilder.buildSuperFieldGet(getter); 3141 return irBuilder.buildSuperFieldGet(
3142 getter, sourceInformationBuilder.buildGet(node));
3045 case CompoundGetter.GETTER: 3143 case CompoundGetter.GETTER:
3046 return irBuilder.buildSuperGetterGet( 3144 return irBuilder.buildSuperGetterGet(
3047 getter, sourceInformationBuilder.buildGet(node)); 3145 getter, sourceInformationBuilder.buildGet(node));
3048 case CompoundGetter.METHOD: 3146 case CompoundGetter.METHOD:
3049 return irBuilder.buildSuperMethodGet(getter); 3147 return irBuilder.buildSuperMethodGet(
3148 getter, sourceInformationBuilder.buildGet(node));
3050 case CompoundGetter.UNRESOLVED: 3149 case CompoundGetter.UNRESOLVED:
3051 return buildSuperNoSuchGetter( 3150 return buildSuperNoSuchGetter(
3052 getter, 3151 getter,
3053 elements.getGetterTypeMaskInComplexSendSet(node)); 3152 elements.getGetterTypeMaskInComplexSendSet(node),
3153 sourceInformationBuilder.buildGet(node));
3054 } 3154 }
3055 }, rhs, (ir.Primitive result) { 3155 }, rhs, (ir.Primitive result) {
3056 switch (setterKind) { 3156 switch (setterKind) {
3057 case CompoundSetter.FIELD: 3157 case CompoundSetter.FIELD:
3058 irBuilder.buildSuperFieldSet(setter, result); 3158 irBuilder.buildSuperFieldSet(
3159 setter, result,
3160 sourceInformationBuilder.buildAssignment(node));
3059 return; 3161 return;
3060 case CompoundSetter.SETTER: 3162 case CompoundSetter.SETTER:
3061 irBuilder.buildSuperSetterSet(setter, result); 3163 irBuilder.buildSuperSetterSet(
3164 setter, result,
3165 sourceInformationBuilder.buildAssignment(node));
3062 return; 3166 return;
3063 case CompoundSetter.INVALID: 3167 case CompoundSetter.INVALID:
3064 buildSuperNoSuchSetter( 3168 buildSuperNoSuchSetter(
3065 setter, elements.getTypeMask(node), result); 3169 setter, elements.getTypeMask(node), result,
3170 sourceInformationBuilder.buildAssignment(node));
3066 return; 3171 return;
3067 } 3172 }
3068 }); 3173 });
3069 } 3174 }
3070 3175
3071 @override 3176 @override
3072 ir.Primitive handleTypeVariableTypeLiteralCompounds( 3177 ir.Primitive handleTypeVariableTypeLiteralCompounds(
3073 ast.SendSet node, 3178 ast.SendSet node,
3074 TypeVariableElement typeVariable, 3179 TypeVariableElement typeVariable,
3075 CompoundRhs rhs, 3180 CompoundRhs rhs,
(...skipping 30 matching lines...) Expand all
3106 return translateCompounds(node, () { 3211 return translateCompounds(node, () {
3107 Selector selector = new Selector.index(); 3212 Selector selector = new Selector.index();
3108 List<ir.Primitive> arguments = <ir.Primitive>[indexValue]; 3213 List<ir.Primitive> arguments = <ir.Primitive>[indexValue];
3109 CallStructure callStructure = 3214 CallStructure callStructure =
3110 normalizeDynamicArguments(selector.callStructure, arguments); 3215 normalizeDynamicArguments(selector.callStructure, arguments);
3111 return irBuilder.buildDynamicInvocation( 3216 return irBuilder.buildDynamicInvocation(
3112 target, 3217 target,
3113 new Selector(selector.kind, selector.memberName, callStructure), 3218 new Selector(selector.kind, selector.memberName, callStructure),
3114 elements.getGetterTypeMaskInComplexSendSet(node), 3219 elements.getGetterTypeMaskInComplexSendSet(node),
3115 arguments, 3220 arguments,
3116 sourceInformation:
3117 sourceInformationBuilder.buildCall(receiver, node)); 3221 sourceInformationBuilder.buildCall(receiver, node));
3118 }, rhs, (ir.Primitive result) { 3222 }, rhs, (ir.Primitive result) {
3119 irBuilder.buildDynamicIndexSet( 3223 irBuilder.buildDynamicIndexSet(
3120 target, 3224 target,
3121 elements.getTypeMask(node), 3225 elements.getTypeMask(node),
3122 indexValue, 3226 indexValue,
3123 result); 3227 result,
3228 sourceInformationBuilder.buildIndexSet(node));
3124 }); 3229 });
3125 } 3230 }
3126 3231
3127 @override 3232 @override
3128 ir.Primitive handleSuperIndexCompounds( 3233 ir.Primitive handleSuperIndexCompounds(
3129 ast.SendSet node, 3234 ast.SendSet node,
3130 Element indexFunction, 3235 Element indexFunction,
3131 Element indexSetFunction, 3236 Element indexSetFunction,
3132 ast.Node index, 3237 ast.Node index,
3133 CompoundRhs rhs, 3238 CompoundRhs rhs,
3134 arg, 3239 arg,
3135 {bool isGetterValid, 3240 {bool isGetterValid,
3136 bool isSetterValid}) { 3241 bool isSetterValid}) {
3137 ir.Primitive indexValue = visit(index); 3242 ir.Primitive indexValue = visit(index);
3138 return translateCompounds(node, () { 3243 return translateCompounds(node, () {
3139 return isGetterValid 3244 if (isGetterValid) {
3140 ? irBuilder.buildSuperIndex(indexFunction, indexValue) 3245 return irBuilder.buildSuperIndex(
3141 : buildSuperNoSuchMethod( 3246 indexFunction,
3142 new Selector.index(), 3247 indexValue,
3143 elements.getGetterTypeMaskInComplexSendSet(node), 3248 sourceInformationBuilder.buildIndex(node));
3144 <ir.Primitive>[indexValue]); 3249 } else {
3250 return buildSuperNoSuchMethod(
3251 new Selector.index(),
3252 elements.getGetterTypeMaskInComplexSendSet(node),
3253 <ir.Primitive>[indexValue],
3254 sourceInformationBuilder.buildIndex(node));
3255 }
3145 }, rhs, (ir.Primitive result) { 3256 }, rhs, (ir.Primitive result) {
3146 if (isSetterValid) { 3257 if (isSetterValid) {
3147 irBuilder.buildSuperIndexSet(indexSetFunction, indexValue, result); 3258 irBuilder.buildSuperIndexSet(indexSetFunction, indexValue, result,
3259 sourceInformationBuilder.buildIndexSet(node));
3148 } else { 3260 } else {
3149 buildSuperNoSuchMethod( 3261 buildSuperNoSuchMethod(
3150 new Selector.indexSet(), 3262 new Selector.indexSet(),
3151 elements.getTypeMask(node), 3263 elements.getTypeMask(node),
3152 <ir.Primitive>[indexValue, result]); 3264 <ir.Primitive>[indexValue, result],
3265 sourceInformationBuilder.buildIndexSet(node));
3153 } 3266 }
3154 }); 3267 });
3155 } 3268 }
3156 3269
3157 /// Build code to handle foreign code, that is, native JavaScript code, or 3270 /// Build code to handle foreign code, that is, native JavaScript code, or
3158 /// builtin values and operations of the backend. 3271 /// builtin values and operations of the backend.
3159 ir.Primitive handleForeignCode(ast.Send node, 3272 ir.Primitive handleForeignCode(ast.Send node,
3160 MethodElement function, 3273 MethodElement function,
3161 ast.NodeList argumentList, 3274 ast.NodeList argumentList,
3162 CallStructure callStructure) { 3275 CallStructure callStructure) {
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
3238 ' and number of arguments.'}); 3351 ' and number of arguments.'});
3239 return irBuilder.buildNullConstant(); 3352 return irBuilder.buildNullConstant();
3240 } 3353 }
3241 3354
3242 if (HasCapturedPlaceholders.check(behavior.codeTemplate.ast)) { 3355 if (HasCapturedPlaceholders.check(behavior.codeTemplate.ast)) {
3243 reporter.reportErrorMessage(node, MessageKind.JS_PLACEHOLDER_CAPTURE); 3356 reporter.reportErrorMessage(node, MessageKind.JS_PLACEHOLDER_CAPTURE);
3244 return irBuilder.buildNullConstant(); 3357 return irBuilder.buildNullConstant();
3245 } 3358 }
3246 3359
3247 return irBuilder.buildForeignCode(behavior.codeTemplate, arguments, 3360 return irBuilder.buildForeignCode(behavior.codeTemplate, arguments,
3248 behavior); 3361 behavior, sourceInformationBuilder.buildForeignCode(node));
3249 3362
3250 case 'DART_CLOSURE_TO_JS': 3363 case 'DART_CLOSURE_TO_JS':
3251 // TODO(ahe): This should probably take care to wrap the closure in 3364 // TODO(ahe): This should probably take care to wrap the closure in
3252 // another closure that saves the current isolate. 3365 // another closure that saves the current isolate.
3253 case 'RAW_DART_FUNCTION_REF': 3366 case 'RAW_DART_FUNCTION_REF':
3254 validateArgumentCount(exactly: 1); 3367 validateArgumentCount(exactly: 1);
3255 3368
3256 ast.Node argument = node.arguments.single; 3369 ast.Node argument = node.arguments.single;
3257 FunctionElement closure = elements[argument].implementation; 3370 FunctionElement closure = elements[argument].implementation;
3258 if (!Elements.isStaticOrTopLevelFunction(closure)) { 3371 if (!Elements.isStaticOrTopLevelFunction(closure)) {
3259 internalError(argument, 3372 internalError(argument,
3260 'only static or toplevel function supported'); 3373 'only static or toplevel function supported');
3261 } 3374 }
3262 if (closure.functionSignature.hasOptionalParameters) { 3375 if (closure.functionSignature.hasOptionalParameters) {
3263 internalError(argument, 3376 internalError(argument,
3264 'closures with optional parameters not supported'); 3377 'closures with optional parameters not supported');
3265 } 3378 }
3266 return irBuilder.buildForeignCode( 3379 return irBuilder.buildForeignCode(
3267 js.js.expressionTemplateYielding( 3380 js.js.expressionTemplateYielding(
3268 backend.emitter.staticFunctionAccess(closure)), 3381 backend.emitter.staticFunctionAccess(closure)),
3269 <ir.Primitive>[], 3382 <ir.Primitive>[],
3270 NativeBehavior.PURE, 3383 NativeBehavior.PURE,
3384 sourceInformationBuilder.buildForeignCode(node),
3271 dependency: closure); 3385 dependency: closure);
3272 3386
3273 case 'JS_BUILTIN': 3387 case 'JS_BUILTIN':
3274 // The first argument is a description of the type and effect of the 3388 // The first argument is a description of the type and effect of the
3275 // builtin, which has already been analyzed in the frontend. The second 3389 // builtin, which has already been analyzed in the frontend. The second
3276 // argument must be a [JsBuiltin] value. All other arguments are 3390 // argument must be a [JsBuiltin] value. All other arguments are
3277 // values used by the JavaScript template that is associated with the 3391 // values used by the JavaScript template that is associated with the
3278 // builtin. 3392 // builtin.
3279 validateArgumentCount(minimum: 2); 3393 validateArgumentCount(minimum: 2);
3280 3394
3281 ast.Node builtin = argumentNodes.tail.head; 3395 ast.Node builtin = argumentNodes.tail.head;
3282 JsBuiltin value = getEnumValue(builtin, helpers.jsBuiltinEnum, 3396 JsBuiltin value = getEnumValue(builtin, helpers.jsBuiltinEnum,
3283 JsBuiltin.values); 3397 JsBuiltin.values);
3284 js.Template template = backend.emitter.builtinTemplateFor(value); 3398 js.Template template = backend.emitter.builtinTemplateFor(value);
3285 List<ir.Primitive> arguments = 3399 List<ir.Primitive> arguments =
3286 argumentNodes.skip(2).mapToList(visit, growable: false); 3400 argumentNodes.skip(2).mapToList(visit, growable: false);
3287 return irBuilder.buildForeignCode(template, arguments, behavior); 3401 return irBuilder.buildForeignCode(template, arguments, behavior,
3402 sourceInformationBuilder.buildForeignCode(node));
3288 3403
3289 case 'JS_EMBEDDED_GLOBAL': 3404 case 'JS_EMBEDDED_GLOBAL':
3290 validateArgumentCount(exactly: 2); 3405 validateArgumentCount(exactly: 2);
3291 3406
3292 String name = expectStringConstant(argumentNodes.tail.head); 3407 String name = expectStringConstant(argumentNodes.tail.head);
3293 js.Expression access = 3408 js.Expression access =
3294 backend.emitter.generateEmbeddedGlobalAccess(name); 3409 backend.emitter.generateEmbeddedGlobalAccess(name);
3295 js.Template template = js.js.expressionTemplateYielding(access); 3410 js.Template template = js.js.expressionTemplateYielding(access);
3296 return irBuilder.buildForeignCode(template, <ir.Primitive>[], behavior); 3411 return irBuilder.buildForeignCode(template, <ir.Primitive>[], behavior,
3412 sourceInformationBuilder.buildForeignCode(node));
3297 3413
3298 case 'JS_INTERCEPTOR_CONSTANT': 3414 case 'JS_INTERCEPTOR_CONSTANT':
3299 validateArgumentCount(exactly: 1); 3415 validateArgumentCount(exactly: 1);
3300 3416
3301 ast.Node argument = argumentNodes.head; 3417 ast.Node argument = argumentNodes.head;
3302 ir.Primitive argumentValue = visit(argument); 3418 ir.Primitive argumentValue = visit(argument);
3303 if (argumentValue is ir.Constant && argumentValue.value.isType) { 3419 if (argumentValue is ir.Constant && argumentValue.value.isType) {
3304 TypeConstantValue constant = argumentValue.value; 3420 TypeConstantValue constant = argumentValue.value;
3305 ConstantValue interceptorValue = 3421 ConstantValue interceptorValue =
3306 new InterceptorConstantValue(constant.representedType); 3422 new InterceptorConstantValue(constant.representedType);
(...skipping 30 matching lines...) Expand all
3337 value = compiler.useContentSecurityPolicy; 3453 value = compiler.useContentSecurityPolicy;
3338 break; 3454 break;
3339 default: 3455 default:
3340 internalError(node, 'Unknown internal flag "$name".'); 3456 internalError(node, 'Unknown internal flag "$name".');
3341 } 3457 }
3342 return irBuilder.buildBooleanConstant(value); 3458 return irBuilder.buildBooleanConstant(value);
3343 3459
3344 case 'JS_STRING_CONCAT': 3460 case 'JS_STRING_CONCAT':
3345 validateArgumentCount(exactly: 2); 3461 validateArgumentCount(exactly: 2);
3346 List<ir.Primitive> arguments = argumentNodes.mapToList(visit); 3462 List<ir.Primitive> arguments = argumentNodes.mapToList(visit);
3347 return irBuilder.buildStringConcatenation(arguments); 3463 return irBuilder.buildStringConcatenation(arguments,
3464 sourceInformationBuilder.buildForeignCode(node));
3348 3465
3349 case 'JS_CURRENT_ISOLATE_CONTEXT': 3466 case 'JS_CURRENT_ISOLATE_CONTEXT':
3350 validateArgumentCount(exactly: 0); 3467 validateArgumentCount(exactly: 0);
3351 3468
3352 if (!compiler.hasIsolateSupport) { 3469 if (!compiler.hasIsolateSupport) {
3353 // If the isolate library is not used, we just generate code 3470 // If the isolate library is not used, we just generate code
3354 // to fetch the current isolate. 3471 // to fetch the current isolate.
3355 continue getStaticState; 3472 continue getStaticState;
3356 } 3473 }
3357 return buildIsolateHelperInvocation(helpers.currentIsolate, 3474 return buildIsolateHelperInvocation(helpers.currentIsolate,
3358 CallStructure.NO_ARGS); 3475 CallStructure.NO_ARGS);
3359 3476
3360 getStaticState: case 'JS_GET_STATIC_STATE': 3477 getStaticState: case 'JS_GET_STATIC_STATE':
3361 validateArgumentCount(exactly: 0); 3478 validateArgumentCount(exactly: 0);
3362 3479
3363 return irBuilder.buildForeignCode( 3480 return irBuilder.buildForeignCode(
3364 js.js.parseForeignJS(backend.namer.staticStateHolder), 3481 js.js.parseForeignJS(backend.namer.staticStateHolder),
3365 const <ir.Primitive>[], 3482 const <ir.Primitive>[],
3366 NativeBehavior.DEPENDS_OTHER); 3483 NativeBehavior.DEPENDS_OTHER,
3484 sourceInformationBuilder.buildForeignCode(node));
3367 3485
3368 case 'JS_SET_STATIC_STATE': 3486 case 'JS_SET_STATIC_STATE':
3369 validateArgumentCount(exactly: 1); 3487 validateArgumentCount(exactly: 1);
3370 3488
3371 ir.Primitive value = visit(argumentNodes.single); 3489 ir.Primitive value = visit(argumentNodes.single);
3372 String isolateName = backend.namer.staticStateHolder; 3490 String isolateName = backend.namer.staticStateHolder;
3373 return irBuilder.buildForeignCode( 3491 return irBuilder.buildForeignCode(
3374 js.js.parseForeignJS("$isolateName = #"), 3492 js.js.parseForeignJS("$isolateName = #"),
3375 <ir.Primitive>[value], 3493 <ir.Primitive>[value],
3376 NativeBehavior.CHANGES_OTHER); 3494 NativeBehavior.CHANGES_OTHER,
3495 sourceInformationBuilder.buildForeignCode(node));
3377 3496
3378 case 'JS_CALL_IN_ISOLATE': 3497 case 'JS_CALL_IN_ISOLATE':
3379 validateArgumentCount(exactly: 2); 3498 validateArgumentCount(exactly: 2);
3380 3499
3381 if (!compiler.hasIsolateSupport) { 3500 if (!compiler.hasIsolateSupport) {
3382 ir.Primitive closure = visit(argumentNodes.tail.head); 3501 ir.Primitive closure = visit(argumentNodes.tail.head);
3383 return irBuilder.buildCallInvocation(closure, CallStructure.NO_ARGS, 3502 return irBuilder.buildCallInvocation(closure, CallStructure.NO_ARGS,
3384 const <ir.Primitive>[]); 3503 const <ir.Primitive>[],
3504 sourceInformationBuilder.buildForeignCode(node));
3385 } 3505 }
3386 return buildIsolateHelperInvocation(helpers.callInIsolate, 3506 return buildIsolateHelperInvocation(helpers.callInIsolate,
3387 CallStructure.TWO_ARGS); 3507 CallStructure.TWO_ARGS);
3388 3508
3389 default: 3509 default:
3390 return giveup(node, 'unplemented native construct: ${function.name}'); 3510 return giveup(node, 'unplemented native construct: ${function.name}');
3391 } 3511 }
3392 } 3512 }
3393 3513
3394 /// Evaluates a string interpolation and appends each part to [accumulator] 3514 /// Evaluates a string interpolation and appends each part to [accumulator]
(...skipping 13 matching lines...) Expand all
3408 // do not bother to include them. 3528 // do not bother to include them.
3409 if (!node.dartString.isEmpty) { 3529 if (!node.dartString.isEmpty) {
3410 accumulator.add(irBuilder.buildDartStringConstant(node.dartString)); 3530 accumulator.add(irBuilder.buildDartStringConstant(node.dartString));
3411 } 3531 }
3412 } else if (node is ast.ParenthesizedExpression) { 3532 } else if (node is ast.ParenthesizedExpression) {
3413 buildStringParts(node.expression, accumulator); 3533 buildStringParts(node.expression, accumulator);
3414 } else { 3534 } else {
3415 ir.Primitive value = visit(node); 3535 ir.Primitive value = visit(node);
3416 accumulator.add(irBuilder.buildStaticFunctionInvocation( 3536 accumulator.add(irBuilder.buildStaticFunctionInvocation(
3417 helpers.stringInterpolationHelper, 3537 helpers.stringInterpolationHelper,
3418 <ir.Primitive>[value])); 3538 <ir.Primitive>[value],
3539 sourceInformationBuilder.buildStringInterpolation(node)));
3419 } 3540 }
3420 } 3541 }
3421 3542
3422 ir.Primitive visitStringJuxtaposition(ast.StringJuxtaposition node) { 3543 ir.Primitive visitStringJuxtaposition(ast.StringJuxtaposition node) {
3423 assert(irBuilder.isOpen); 3544 assert(irBuilder.isOpen);
3424 List<ir.Primitive> parts = <ir.Primitive>[]; 3545 List<ir.Primitive> parts = <ir.Primitive>[];
3425 buildStringParts(node, parts); 3546 buildStringParts(node, parts);
3426 return irBuilder.buildStringConcatenation(parts); 3547 return irBuilder.buildStringConcatenation(parts,
3548 sourceInformationBuilder.buildStringInterpolation(node));
3427 } 3549 }
3428 3550
3429 ir.Primitive visitStringInterpolation(ast.StringInterpolation node) { 3551 ir.Primitive visitStringInterpolation(ast.StringInterpolation node) {
3430 assert(irBuilder.isOpen); 3552 assert(irBuilder.isOpen);
3431 List<ir.Primitive> parts = <ir.Primitive>[]; 3553 List<ir.Primitive> parts = <ir.Primitive>[];
3432 buildStringParts(node, parts); 3554 buildStringParts(node, parts);
3433 return irBuilder.buildStringConcatenation(parts); 3555 return irBuilder.buildStringConcatenation(parts,
3556 sourceInformationBuilder.buildStringInterpolation(node));
3434 } 3557 }
3435 3558
3436 ir.Primitive translateConstant(ast.Node node) { 3559 ir.Primitive translateConstant(ast.Node node) {
3437 assert(irBuilder.isOpen); 3560 assert(irBuilder.isOpen);
3438 return irBuilder.buildConstant( 3561 return irBuilder.buildConstant(
3439 getConstantForNode(node), 3562 getConstantForNode(node),
3440 sourceInformation: sourceInformationBuilder.buildGet(node)); 3563 sourceInformation: sourceInformationBuilder.buildGet(node));
3441 } 3564 }
3442 3565
3443 ir.Primitive visitThrow(ast.Throw node) { 3566 ir.Primitive visitThrow(ast.Throw node) {
3444 assert(irBuilder.isOpen); 3567 assert(irBuilder.isOpen);
3445 // This function is not called for throw expressions occurring as 3568 // This function is not called for throw expressions occurring as
3446 // statements. 3569 // statements.
3447 return irBuilder.buildNonTailThrow(visit(node.expression)); 3570 return irBuilder.buildNonTailThrow(visit(node.expression));
3448 } 3571 }
3449 3572
3450 ir.Primitive buildSuperNoSuchMethod(Selector selector, 3573 ir.Primitive buildSuperNoSuchMethod(
3574 Selector selector,
3451 TypeMask mask, 3575 TypeMask mask,
3452 List<ir.Primitive> arguments) { 3576 List<ir.Primitive> arguments,
3577 SourceInformation sourceInformation) {
3453 ClassElement cls = elements.analyzedElement.enclosingClass; 3578 ClassElement cls = elements.analyzedElement.enclosingClass;
3454 MethodElement element = cls.lookupSuperMember(Identifiers.noSuchMethod_); 3579 MethodElement element = cls.lookupSuperMember(Identifiers.noSuchMethod_);
3455 if (!Selectors.noSuchMethod_.signatureApplies(element)) { 3580 if (!Selectors.noSuchMethod_.signatureApplies(element)) {
3456 element = compiler.coreClasses.objectClass.lookupMember( 3581 element = compiler.coreClasses.objectClass.lookupMember(
3457 Identifiers.noSuchMethod_); 3582 Identifiers.noSuchMethod_);
3458 } 3583 }
3459 return irBuilder.buildSuperMethodInvocation( 3584 return irBuilder.buildSuperMethodInvocation(
3460 element, 3585 element,
3461 Selectors.noSuchMethod_.callStructure, 3586 Selectors.noSuchMethod_.callStructure,
3462 [irBuilder.buildInvocationMirror(selector, arguments)]); 3587 [irBuilder.buildInvocationMirror(selector, arguments)],
3588 sourceInformation);
3463 } 3589 }
3464 3590
3465 @override 3591 @override
3466 ir.Primitive visitUnresolvedCompound( 3592 ir.Primitive visitUnresolvedCompound(
3467 ast.Send node, 3593 ast.Send node,
3468 Element element, 3594 Element element,
3469 op.AssignmentOperator operator, 3595 op.AssignmentOperator operator,
3470 ast.Node rhs, _) { 3596 ast.Node rhs, _) {
3471 // TODO(asgerf): What is unresolved? The getter and/or the setter? 3597 return irBuilder.buildStaticNoSuchMethod(
3472 // If it was the setter, we must evaluate the right-hand side. 3598 new Selector.getter(new Name(element.name, element.library)),
3473 return irBuilder.buildStaticNoSuchMethod(elements.getSelector(node), []); 3599 [],
3600 sourceInformationBuilder.buildGet(node));
3474 } 3601 }
3475 3602
3476 @override 3603 @override
3477 ir.Primitive visitUnresolvedClassConstructorInvoke( 3604 ir.Primitive visitUnresolvedClassConstructorInvoke(
3478 ast.NewExpression node, 3605 ast.NewExpression node,
3479 Element element, 3606 Element element,
3480 DartType type, 3607 DartType type,
3481 ast.NodeList arguments, 3608 ast.NodeList arguments,
3482 Selector selector, _) { 3609 Selector selector, _) {
3483 // If the class is missing it's a runtime error. 3610 // If the class is missing it's a runtime error.
3484 ir.Primitive message = 3611 ir.Primitive message =
3485 irBuilder.buildStringConstant("Unresolved class: '${element.name}'"); 3612 irBuilder.buildStringConstant("Unresolved class: '${element.name}'");
3486 return irBuilder.buildStaticFunctionInvocation( 3613 return irBuilder.buildStaticFunctionInvocation(
3487 helpers.throwRuntimeError, 3614 helpers.throwRuntimeError,
3488 <ir.Primitive>[message]); 3615 <ir.Primitive>[message],
3616 sourceInformationBuilder.buildNew(node));
3489 } 3617 }
3490 3618
3491 @override 3619 @override
3492 ir.Primitive visitUnresolvedConstructorInvoke( 3620 ir.Primitive visitUnresolvedConstructorInvoke(
3493 ast.NewExpression node, 3621 ast.NewExpression node,
3494 Element constructor, 3622 Element constructor,
3495 DartType type, 3623 DartType type,
3496 ast.NodeList argumentsNode, 3624 ast.NodeList argumentsNode,
3497 Selector selector, _) { 3625 Selector selector, _) {
3498 // If the class is there but the constructor is missing, it's an NSM error. 3626 // If the class is there but the constructor is missing, it's an NSM error.
3499 List<ir.Primitive> arguments = <ir.Primitive>[]; 3627 List<ir.Primitive> arguments = <ir.Primitive>[];
3500 CallStructure callStructure = translateDynamicArguments( 3628 CallStructure callStructure = translateDynamicArguments(
3501 argumentsNode, selector.callStructure, arguments); 3629 argumentsNode, selector.callStructure, arguments);
3502 return irBuilder.buildStaticNoSuchMethod( 3630 return irBuilder.buildStaticNoSuchMethod(
3503 new Selector(selector.kind, selector.memberName, callStructure), 3631 new Selector(selector.kind, selector.memberName, callStructure),
3504 arguments); 3632 arguments,
3633 sourceInformationBuilder.buildNew(node));
3505 } 3634 }
3506 3635
3507 @override 3636 @override
3508 ir.Primitive visitConstructorIncompatibleInvoke( 3637 ir.Primitive visitConstructorIncompatibleInvoke(
3509 ast.NewExpression node, 3638 ast.NewExpression node,
3510 ConstructorElement constructor, 3639 ConstructorElement constructor,
3511 DartType type, 3640 DartType type,
3512 ast.NodeList argumentsNode, 3641 ast.NodeList argumentsNode,
3513 CallStructure callStructure, _) { 3642 CallStructure callStructure, _) {
3514 List<ir.Primitive> arguments = <ir.Primitive>[]; 3643 List<ir.Primitive> arguments = <ir.Primitive>[];
3515 callStructure = 3644 callStructure =
3516 translateDynamicArguments(argumentsNode, callStructure, arguments); 3645 translateDynamicArguments(argumentsNode, callStructure, arguments);
3517 return irBuilder.buildStaticNoSuchMethod( 3646 return irBuilder.buildStaticNoSuchMethod(
3518 new Selector.call(constructor.memberName, callStructure), arguments); 3647 new Selector.call(constructor.memberName, callStructure), arguments,
3648 sourceInformationBuilder.buildNew(node));
3519 } 3649 }
3520 3650
3521 @override 3651 @override
3522 ir.Primitive visitUnresolvedGet( 3652 ir.Primitive visitUnresolvedGet(
3523 ast.Send node, 3653 ast.Send node,
3524 Element element, _) { 3654 Element element, _) {
3525 return irBuilder.buildStaticNoSuchMethod(elements.getSelector(node), []); 3655 return irBuilder.buildStaticNoSuchMethod(
3656 elements.getSelector(node), [],
3657 sourceInformationBuilder.buildGet(node));
3526 } 3658 }
3527 3659
3528 @override 3660 @override
3529 ir.Primitive visitUnresolvedInvoke( 3661 ir.Primitive visitUnresolvedInvoke(
3530 ast.Send node, 3662 ast.Send node,
3531 Element element, 3663 Element element,
3532 ast.NodeList arguments, 3664 ast.NodeList arguments,
3533 Selector selector, _) { 3665 Selector selector, _) {
3534 return irBuilder.buildStaticNoSuchMethod(elements.getSelector(node), 3666 return irBuilder.buildStaticNoSuchMethod(
3535 arguments.nodes.mapToList(visit)); 3667 elements.getSelector(node),
3668 arguments.nodes.mapToList(visit),
3669 sourceInformationBuilder.buildCall(node, node.selector));
3536 } 3670 }
3537 3671
3538 @override 3672 @override
3539 ir.Primitive visitUnresolvedRedirectingFactoryConstructorInvoke( 3673 ir.Primitive visitUnresolvedRedirectingFactoryConstructorInvoke(
3540 ast.NewExpression node, 3674 ast.NewExpression node,
3541 ConstructorElement constructor, 3675 ConstructorElement constructor,
3542 InterfaceType type, 3676 InterfaceType type,
3543 ast.NodeList argumentsNode, 3677 ast.NodeList argumentsNode,
3544 CallStructure callStructure, _) { 3678 CallStructure callStructure, _) {
3545 String nameString = Elements.reconstructConstructorName(constructor); 3679 String nameString = Elements.reconstructConstructorName(constructor);
3546 Name name = new Name(nameString, constructor.library); 3680 Name name = new Name(nameString, constructor.library);
3547 List<ir.Primitive> arguments = <ir.Primitive>[]; 3681 List<ir.Primitive> arguments = <ir.Primitive>[];
3548 callStructure = 3682 callStructure =
3549 translateDynamicArguments(argumentsNode, callStructure, arguments); 3683 translateDynamicArguments(argumentsNode, callStructure, arguments);
3550 return irBuilder.buildStaticNoSuchMethod( 3684 return irBuilder.buildStaticNoSuchMethod(
3551 new Selector.call(name, callStructure), 3685 new Selector.call(name, callStructure),
3552 arguments); 3686 arguments,
3687 sourceInformationBuilder.buildNew(node));
3553 } 3688 }
3554 3689
3555 @override 3690 @override
3556 ir.Primitive visitUnresolvedSet( 3691 ir.Primitive visitUnresolvedSet(
3557 ast.Send node, 3692 ast.Send node,
3558 Element element, 3693 Element element,
3559 ast.Node rhs, _) { 3694 ast.Node rhs, _) {
3560 return irBuilder.buildStaticNoSuchMethod(elements.getSelector(node), 3695 return irBuilder.buildStaticNoSuchMethod(elements.getSelector(node),
3561 [visit(rhs)]); 3696 [visit(rhs)],
3697 sourceInformationBuilder.buildAssignment(node));
3562 } 3698 }
3563 3699
3564 @override 3700 @override
3565 ir.Primitive visitUnresolvedSuperIndex( 3701 ir.Primitive visitUnresolvedSuperIndex(
3566 ast.Send node, 3702 ast.Send node,
3567 Element function, 3703 Element function,
3568 ast.Node index, _) { 3704 ast.Node index, _) {
3569 // Assume the index getter is missing. 3705 // Assume the index getter is missing.
3570 return buildSuperNoSuchMethod( 3706 return buildSuperNoSuchMethod(
3571 new Selector.index(), elements.getTypeMask(node), [visit(index)]); 3707 new Selector.index(), elements.getTypeMask(node), [visit(index)],
3708 sourceInformationBuilder.buildIndex(node));
3572 } 3709 }
3573 3710
3574 @override 3711 @override
3575 ir.Primitive visitUnresolvedSuperBinary( 3712 ir.Primitive visitUnresolvedSuperBinary(
3576 ast.Send node, 3713 ast.Send node,
3577 Element element, 3714 Element element,
3578 op.BinaryOperator operator, 3715 op.BinaryOperator operator,
3579 ast.Node argument, _) { 3716 ast.Node argument, _) {
3580 return buildSuperNoSuchMethod( 3717 return buildSuperNoSuchMethod(
3581 elements.getSelector(node), 3718 elements.getSelector(node),
3582 elements.getTypeMask(node), 3719 elements.getTypeMask(node),
3583 [visit(argument)]); 3720 [visit(argument)],
3721 sourceInformationBuilder.buildCall(node, node.selector));
3584 } 3722 }
3585 3723
3586 @override 3724 @override
3587 ir.Primitive visitUnresolvedSuperUnary( 3725 ir.Primitive visitUnresolvedSuperUnary(
3588 ast.Send node, 3726 ast.Send node,
3589 op.UnaryOperator operator, 3727 op.UnaryOperator operator,
3590 Element element, _) { 3728 Element element, _) {
3591 return buildSuperNoSuchMethod( 3729 return buildSuperNoSuchMethod(
3592 elements.getSelector(node), elements.getTypeMask(node), []); 3730 elements.getSelector(node), elements.getTypeMask(node), [],
3731 sourceInformationBuilder.buildCall(node, node.selector));
3593 } 3732 }
3594 3733
3595 @override 3734 @override
3596 ir.Primitive bulkHandleNode(ast.Node node, String message, _) { 3735 ir.Primitive bulkHandleNode(ast.Node node, String message, _) {
3597 return giveup(node, "Unhandled node: ${message.replaceAll('#', '$node')}"); 3736 return giveup(node, "Unhandled node: ${message.replaceAll('#', '$node')}");
3598 } 3737 }
3599 3738
3600 @override 3739 @override
3601 ir.Primitive bulkHandleError(ast.Node node, ErroneousElement error, _) { 3740 ir.Primitive bulkHandleError(ast.Node node, ErroneousElement error, _) {
3602 return irBuilder.buildNullConstant(); 3741 return irBuilder.buildNullConstant();
3603 } 3742 }
3604 3743
3605 @override 3744 @override
3606 ir.Primitive visitClassTypeLiteralSet( 3745 ir.Primitive visitClassTypeLiteralSet(
3607 ast.SendSet node, 3746 ast.SendSet node,
3608 TypeConstantExpression constant, 3747 TypeConstantExpression constant,
3609 ast.Node rhs, _) { 3748 ast.Node rhs, _) {
3610 InterfaceType type = constant.type; 3749 InterfaceType type = constant.type;
3611 ClassElement element = type.element; 3750 ClassElement element = type.element;
3612 return irBuilder.buildStaticNoSuchMethod( 3751 return irBuilder.buildStaticNoSuchMethod(
3613 new Selector.setter(element.memberName), 3752 new Selector.setter(element.memberName),
3614 [visit(rhs)]); 3753 [visit(rhs)],
3754 sourceInformationBuilder.buildAssignment(node));
3615 } 3755 }
3616 3756
3617 @override 3757 @override
3618 ir.Primitive visitTypedefTypeLiteralSet( 3758 ir.Primitive visitTypedefTypeLiteralSet(
3619 ast.SendSet node, 3759 ast.SendSet node,
3620 TypeConstantExpression constant, 3760 TypeConstantExpression constant,
3621 ast.Node rhs, _) { 3761 ast.Node rhs, _) {
3622 TypedefType type = constant.type; 3762 TypedefType type = constant.type;
3623 TypedefElement element = type.element; 3763 TypedefElement element = type.element;
3624 return irBuilder.buildStaticNoSuchMethod( 3764 return irBuilder.buildStaticNoSuchMethod(
3625 new Selector.setter(element.memberName), 3765 new Selector.setter(element.memberName),
3626 [visit(rhs)]); 3766 [visit(rhs)],
3767 sourceInformationBuilder.buildAssignment(node));
3627 } 3768 }
3628 3769
3629 @override 3770 @override
3630 ir.Primitive visitTypeVariableTypeLiteralSet( 3771 ir.Primitive visitTypeVariableTypeLiteralSet(
3631 ast.SendSet node, 3772 ast.SendSet node,
3632 TypeVariableElement element, 3773 TypeVariableElement element,
3633 ast.Node rhs, _) { 3774 ast.Node rhs, _) {
3634 return irBuilder.buildStaticNoSuchMethod( 3775 return irBuilder.buildStaticNoSuchMethod(
3635 new Selector.setter(element.memberName), [visit(rhs)]); 3776 new Selector.setter(element.memberName), [visit(rhs)],
3777 sourceInformationBuilder.buildAssignment(node));
3636 } 3778 }
3637 3779
3638 @override 3780 @override
3639 ir.Primitive visitDynamicTypeLiteralSet( 3781 ir.Primitive visitDynamicTypeLiteralSet(
3640 ast.SendSet node, 3782 ast.SendSet node,
3641 ConstantExpression constant, 3783 ConstantExpression constant,
3642 ast.Node rhs, _) { 3784 ast.Node rhs, _) {
3643 return irBuilder.buildStaticNoSuchMethod( 3785 return irBuilder.buildStaticNoSuchMethod(
3644 new Selector.setter(Names.dynamic_), [visit(rhs)]); 3786 new Selector.setter(Names.dynamic_), [visit(rhs)],
3787 sourceInformationBuilder.buildAssignment(node));
3645 } 3788 }
3646 3789
3647 @override 3790 @override
3648 ir.Primitive visitAbstractClassConstructorInvoke( 3791 ir.Primitive visitAbstractClassConstructorInvoke(
3649 ast.NewExpression node, 3792 ast.NewExpression node,
3650 ConstructorElement element, 3793 ConstructorElement element,
3651 InterfaceType type, 3794 InterfaceType type,
3652 ast.NodeList arguments, 3795 ast.NodeList arguments,
3653 CallStructure callStructure, _) { 3796 CallStructure callStructure, _) {
3654 for (ast.Node argument in arguments) visit(argument); 3797 for (ast.Node argument in arguments) visit(argument);
3655 ir.Primitive name = 3798 ir.Primitive name =
3656 irBuilder.buildStringConstant(element.enclosingClass.name); 3799 irBuilder.buildStringConstant(element.enclosingClass.name);
3657 return irBuilder.buildStaticFunctionInvocation( 3800 return irBuilder.buildStaticFunctionInvocation(
3658 helpers.throwAbstractClassInstantiationError, 3801 helpers.throwAbstractClassInstantiationError,
3659 <ir.Primitive>[name]); 3802 <ir.Primitive>[name],
3803 sourceInformationBuilder.buildNew(node));
3660 } 3804 }
3661 3805
3662 @override 3806 @override
3663 ir.Primitive handleFinalStaticFieldSet( 3807 ir.Primitive handleFinalStaticFieldSet(
3664 ast.SendSet node, 3808 ast.SendSet node,
3665 FieldElement field, 3809 FieldElement field,
3666 ast.Node rhs, _) { 3810 ast.Node rhs, _) {
3667 // TODO(asgerf): Include class name somehow for static class members? 3811 // TODO(asgerf): Include class name somehow for static class members?
3668 return irBuilder.buildStaticNoSuchMethod( 3812 return irBuilder.buildStaticNoSuchMethod(
3669 new Selector.setter(field.memberName), 3813 new Selector.setter(field.memberName),
3670 [visit(rhs)]); 3814 [visit(rhs)],
3815 sourceInformationBuilder.buildAssignment(node));
3671 } 3816 }
3672 3817
3673 @override 3818 @override
3674 ir.Primitive visitFinalSuperFieldSet( 3819 ir.Primitive visitFinalSuperFieldSet(
3675 ast.SendSet node, 3820 ast.SendSet node,
3676 FieldElement field, 3821 FieldElement field,
3677 ast.Node rhs, _) { 3822 ast.Node rhs, _) {
3678 return buildSuperNoSuchMethod( 3823 return buildSuperNoSuchMethod(
3679 new Selector.setter(field.memberName), 3824 new Selector.setter(field.memberName),
3680 elements.getTypeMask(node), 3825 elements.getTypeMask(node),
3681 [visit(rhs)]); 3826 [visit(rhs)],
3827 sourceInformationBuilder.buildAssignment(node));
3682 } 3828 }
3683 3829
3684 @override 3830 @override
3685 ir.Primitive handleImmutableLocalSet( 3831 ir.Primitive handleImmutableLocalSet(
3686 ast.SendSet node, 3832 ast.SendSet node,
3687 LocalElement local, 3833 LocalElement local,
3688 ast.Node rhs, _) { 3834 ast.Node rhs, _) {
3689 return irBuilder.buildStaticNoSuchMethod( 3835 return irBuilder.buildStaticNoSuchMethod(
3690 new Selector.setter(new Name(local.name, local.library)), 3836 new Selector.setter(new Name(local.name, local.library)),
3691 [visit(rhs)]); 3837 [visit(rhs)],
3838 sourceInformationBuilder.buildAssignment(node));
3692 } 3839 }
3693 3840
3694 @override 3841 @override
3695 ir.Primitive handleStaticFunctionSet( 3842 ir.Primitive handleStaticFunctionSet(
3696 ast.Send node, 3843 ast.Send node,
3697 MethodElement function, 3844 MethodElement function,
3698 ast.Node rhs, 3845 ast.Node rhs,
3699 _) { 3846 _) {
3700 return irBuilder.buildStaticNoSuchMethod( 3847 return irBuilder.buildStaticNoSuchMethod(
3701 new Selector.setter(function.memberName), 3848 new Selector.setter(function.memberName),
3702 [visit(rhs)]); 3849 [visit(rhs)],
3850 sourceInformationBuilder.buildAssignment(node));
3703 } 3851 }
3704 3852
3705 @override 3853 @override
3706 ir.Primitive handleStaticGetterSet( 3854 ir.Primitive handleStaticGetterSet(
3707 ast.SendSet node, 3855 ast.SendSet node,
3708 GetterElement getter, 3856 GetterElement getter,
3709 ast.Node rhs, 3857 ast.Node rhs,
3710 _) { 3858 _) {
3711 return irBuilder.buildStaticNoSuchMethod( 3859 return irBuilder.buildStaticNoSuchMethod(
3712 new Selector.setter(getter.memberName), 3860 new Selector.setter(getter.memberName),
3713 [visit(rhs)]); 3861 [visit(rhs)],
3862 sourceInformationBuilder.buildAssignment(node));
3714 } 3863 }
3715 3864
3716 @override 3865 @override
3717 ir.Primitive handleStaticSetterGet( 3866 ir.Primitive handleStaticSetterGet(
3718 ast.Send node, 3867 ast.Send node,
3719 SetterElement setter, 3868 SetterElement setter,
3720 _) { 3869 _) {
3721 return irBuilder.buildStaticNoSuchMethod( 3870 return irBuilder.buildStaticNoSuchMethod(
3722 new Selector.getter(setter.memberName), 3871 new Selector.getter(setter.memberName),
3723 []); 3872 [],
3873 sourceInformationBuilder.buildGet(node));
3724 } 3874 }
3725 3875
3726 @override 3876 @override
3727 ir.Primitive handleStaticSetterInvoke( 3877 ir.Primitive handleStaticSetterInvoke(
3728 ast.Send node, 3878 ast.Send node,
3729 SetterElement setter, 3879 SetterElement setter,
3730 ast.NodeList argumentsNode, 3880 ast.NodeList argumentsNode,
3731 CallStructure callStructure, _) { 3881 CallStructure callStructure, _) {
3732 // Translate as a method call. 3882 // Translate as a method call.
3733 List<ir.Primitive> arguments = argumentsNode.nodes.mapToList(visit); 3883 List<ir.Primitive> arguments = argumentsNode.nodes.mapToList(visit);
3734 return irBuilder.buildStaticNoSuchMethod( 3884 return irBuilder.buildStaticNoSuchMethod(
3735 new Selector.call(setter.memberName, callStructure), 3885 new Selector.call(setter.memberName, callStructure),
3736 arguments); 3886 arguments,
3887 sourceInformationBuilder.buildCall(node, argumentsNode));
3737 } 3888 }
3738 3889
3739 @override 3890 @override
3740 ir.Primitive visitSuperGetterSet( 3891 ir.Primitive visitSuperGetterSet(
3741 ast.SendSet node, 3892 ast.SendSet node,
3742 GetterElement getter, 3893 GetterElement getter,
3743 ast.Node rhs, 3894 ast.Node rhs,
3744 _) { 3895 _) {
3745 return buildSuperNoSuchMethod( 3896 return buildSuperNoSuchMethod(
3746 new Selector.setter(getter.memberName), 3897 new Selector.setter(getter.memberName),
3747 elements.getTypeMask(node), 3898 elements.getTypeMask(node),
3748 [visit(rhs)]); 3899 [visit(rhs)],
3900 sourceInformationBuilder.buildAssignment(node));
3749 } 3901 }
3750 3902
3751 @override 3903 @override
3752 ir.Primitive visitSuperMethodSet( 3904 ir.Primitive visitSuperMethodSet(
3753 ast.Send node, 3905 ast.Send node,
3754 MethodElement method, 3906 MethodElement method,
3755 ast.Node rhs, 3907 ast.Node rhs,
3756 _) { 3908 _) {
3757 return buildSuperNoSuchMethod( 3909 return buildSuperNoSuchMethod(
3758 new Selector.setter(method.memberName), 3910 new Selector.setter(method.memberName),
3759 elements.getTypeMask(node), 3911 elements.getTypeMask(node),
3760 [visit(rhs)]); 3912 [visit(rhs)],
3913 sourceInformationBuilder.buildAssignment(node));
3761 } 3914 }
3762 3915
3763 @override 3916 @override
3764 ir.Primitive visitSuperSetterGet( 3917 ir.Primitive visitSuperSetterGet(
3765 ast.Send node, 3918 ast.Send node,
3766 SetterElement setter, _) { 3919 SetterElement setter, _) {
3767 return buildSuperNoSuchMethod( 3920 return buildSuperNoSuchMethod(
3768 new Selector.setter(setter.memberName), 3921 new Selector.getter(setter.memberName),
Siggi Cherem (dart-lang) 2016/03/10 17:49:04 oh my - did this affect any tests? Maybe we should
Johnni Winther 2016/03/11 13:46:27 Removed from this CL.
3769 elements.getTypeMask(node), 3922 elements.getTypeMask(node),
3770 []); 3923 [],
3924 sourceInformationBuilder.buildGet(node));
3771 } 3925 }
3772 3926
3773 @override 3927 @override
3774 ir.Primitive visitSuperSetterInvoke( 3928 ir.Primitive visitSuperSetterInvoke(
3775 ast.Send node, 3929 ast.Send node,
3776 SetterElement setter, 3930 SetterElement setter,
3777 ast.NodeList argumentsNode, 3931 ast.NodeList argumentsNode,
3778 CallStructure callStructure, _) { 3932 CallStructure callStructure, _) {
3779 List<ir.Primitive> arguments = <ir.Primitive>[]; 3933 List<ir.Primitive> arguments = <ir.Primitive>[];
3780 callStructure = 3934 callStructure =
3781 translateDynamicArguments(argumentsNode, callStructure, arguments); 3935 translateDynamicArguments(argumentsNode, callStructure, arguments);
3782 return buildSuperNoSuchMethod( 3936 return buildSuperNoSuchMethod(
3783 new Selector.call(setter.memberName, callStructure), 3937 new Selector.call(setter.memberName, callStructure),
3784 elements.getTypeMask(node), 3938 elements.getTypeMask(node),
3785 arguments); 3939 arguments,
3940 sourceInformationBuilder.buildCall(node, argumentsNode));
3786 } 3941 }
3787 3942
3788 ir.FunctionDefinition nullIfGiveup(ir.FunctionDefinition action()) { 3943 ir.FunctionDefinition nullIfGiveup(ir.FunctionDefinition action()) {
3789 try { 3944 try {
3790 return action(); 3945 return action();
3791 } catch(e) { 3946 } catch(e) {
3792 if (e == ABORT_IRNODE_BUILDER) { 3947 if (e == ABORT_IRNODE_BUILDER) {
3793 return null; 3948 return null;
3794 } 3949 }
3795 rethrow; 3950 rethrow;
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
4047 _backend.jsInteropAnalysis.hasAnonymousAnnotation(element.contextClass); 4202 _backend.jsInteropAnalysis.hasAnonymousAnnotation(element.contextClass);
4048 4203
4049 String getJsInteropTargetPath(FunctionElement element) { 4204 String getJsInteropTargetPath(FunctionElement element) {
4050 return '${_backend.namer.fixedBackendPath(element)}.' 4205 return '${_backend.namer.fixedBackendPath(element)}.'
4051 '${_backend.getFixedBackendName(element)}'; 4206 '${_backend.getFixedBackendName(element)}';
4052 } 4207 }
4053 4208
4054 DartType get jsJavascriptObjectType => 4209 DartType get jsJavascriptObjectType =>
4055 _backend.helpers.jsJavaScriptObjectClass.thisType; 4210 _backend.helpers.jsJavaScriptObjectClass.thisType;
4056 } 4211 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart ('k') | pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698