Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 closurelib; | 7 import '../closure.dart' as closurelib; |
| 8 import '../closure.dart' hide ClosureScope; | 8 import '../closure.dart' hide ClosureScope; |
| 9 import '../constants/expressions.dart'; | 9 import '../constants/expressions.dart'; |
| 10 import '../dart_types.dart'; | 10 import '../dart_types.dart'; |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 136 */ | 136 */ |
| 137 // TODO(johnniwinther): Implement [SemanticDeclVisitor]. | 137 // TODO(johnniwinther): Implement [SemanticDeclVisitor]. |
| 138 abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive> | 138 abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
| 139 with IrBuilderMixin<ast.Node>, | 139 with IrBuilderMixin<ast.Node>, |
| 140 SemanticSendResolvedMixin<ir.Primitive, dynamic>, | 140 SemanticSendResolvedMixin<ir.Primitive, dynamic>, |
| 141 SendResolverMixin, | 141 SendResolverMixin, |
| 142 BaseImplementationOfStaticsMixin<ir.Primitive, dynamic>, | 142 BaseImplementationOfStaticsMixin<ir.Primitive, dynamic>, |
| 143 BaseImplementationOfLocalsMixin<ir.Primitive, dynamic>, | 143 BaseImplementationOfLocalsMixin<ir.Primitive, dynamic>, |
| 144 BaseImplementationOfDynamicsMixin<ir.Primitive, dynamic>, | 144 BaseImplementationOfDynamicsMixin<ir.Primitive, dynamic>, |
| 145 BaseImplementationOfConstantsMixin<ir.Primitive, dynamic>, | 145 BaseImplementationOfConstantsMixin<ir.Primitive, dynamic>, |
| 146 BaseImplementationOfSuperIncDecsMixin<ir.Primitive, dynamic>, | 146 BaseImplementationOfNewMixin<ir.Primitive, dynamic>, |
| 147 BaseImplementationOfNewMixin<ir.Primitive, dynamic> | 147 BaseImplementationOfCompoundsMixin<ir.Primitive, dynamic>, |
| 148 BaseImplementationOfIndexCompoundsMixin<ir.Primitive, dynamic> | |
| 148 implements SemanticSendVisitor<ir.Primitive, dynamic> { | 149 implements SemanticSendVisitor<ir.Primitive, dynamic> { |
| 149 final TreeElements elements; | 150 final TreeElements elements; |
| 150 final Compiler compiler; | 151 final Compiler compiler; |
| 151 final SourceInformationBuilder sourceInformationBuilder; | 152 final SourceInformationBuilder sourceInformationBuilder; |
| 152 | 153 |
| 153 /// A map from try statements in the source to analysis information about | 154 /// A map from try statements in the source to analysis information about |
| 154 /// them. | 155 /// them. |
| 155 /// | 156 /// |
| 156 /// The analysis information includes the set of variables that must be | 157 /// The analysis information includes the set of variables that must be |
| 157 /// copied into [ir.MutableVariable]s on entry to the try and copied out on | 158 /// copied into [ir.MutableVariable]s on entry to the try and copied out on |
| (...skipping 1080 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1238 @override | 1239 @override |
| 1239 ir.Primitive visitSuperIndexSet( | 1240 ir.Primitive visitSuperIndexSet( |
| 1240 ast.SendSet node, | 1241 ast.SendSet node, |
| 1241 FunctionElement function, | 1242 FunctionElement function, |
| 1242 ast.Node index, | 1243 ast.Node index, |
| 1243 ast.Node rhs, | 1244 ast.Node rhs, |
| 1244 _) { | 1245 _) { |
| 1245 return irBuilder.buildSuperIndexSet(function, visit(index), visit(rhs)); | 1246 return irBuilder.buildSuperIndexSet(function, visit(index), visit(rhs)); |
| 1246 } | 1247 } |
| 1247 | 1248 |
| 1248 @override | 1249 ir.Primitive translateCompounds( |
| 1249 ir.Primitive visitCompoundIndexSet( | |
| 1250 ast.SendSet node, | |
| 1251 ast.Node receiver, | |
| 1252 ast.Node index, | |
| 1253 op.AssignmentOperator operator, | |
| 1254 ast.Node rhs, | |
| 1255 _) { | |
| 1256 ir.Primitive target = visit(receiver); | |
| 1257 ir.Primitive indexValue = visit(index); | |
| 1258 return translateCompound( | |
| 1259 getValue: () { | |
| 1260 Selector selector = new Selector.index(); | |
| 1261 List<ir.Primitive> arguments = <ir.Primitive>[indexValue]; | |
| 1262 arguments = | |
| 1263 normalizeDynamicArguments(selector.callStructure, arguments); | |
| 1264 return irBuilder.buildDynamicInvocation(target, selector, arguments); | |
| 1265 }, | |
| 1266 operator: operator, | |
| 1267 rhs: rhs, | |
| 1268 setValue: (ir.Primitive result) { | |
| 1269 irBuilder.buildDynamicIndexSet(target, indexValue, result); | |
| 1270 }); | |
| 1271 } | |
| 1272 | |
| 1273 @override | |
| 1274 ir.Primitive visitSuperCompoundIndexSet( | |
| 1275 ast.SendSet node, | |
| 1276 FunctionElement getter, | |
| 1277 FunctionElement setter, | |
| 1278 ast.Node index, | |
| 1279 op.AssignmentOperator operator, | |
| 1280 ast.Node rhs, | |
| 1281 _) { | |
| 1282 ir.Primitive indexValue = visit(index); | |
| 1283 return translateCompound( | |
| 1284 getValue: () { | |
| 1285 return irBuilder.buildSuperIndex(getter, indexValue); | |
| 1286 }, | |
| 1287 operator: operator, | |
| 1288 rhs: rhs, | |
| 1289 setValue: (ir.Primitive result) { | |
| 1290 irBuilder.buildSuperIndexSet(setter, indexValue, result); | |
| 1291 }); | |
| 1292 } | |
| 1293 | |
| 1294 ir.Primitive translatePrefixPostfix( | |
| 1295 {ir.Primitive getValue(), | 1250 {ir.Primitive getValue(), |
| 1296 op.IncDecOperator operator, | 1251 CompoundRhs rhs, |
| 1297 void setValue(ir.Primitive value), | 1252 void setValue(ir.Primitive value)}) { |
| 1298 bool isPrefix}) { | |
| 1299 ir.Primitive value = getValue(); | 1253 ir.Primitive value = getValue(); |
| 1300 Selector operatorSelector = | 1254 Selector operatorSelector = |
| 1301 new Selector.binaryOperator(operator.selectorName); | 1255 new Selector.binaryOperator(rhs.operator.selectorName); |
| 1302 List<ir.Primitive> arguments = | 1256 ir.Primitive rhsValue; |
| 1303 <ir.Primitive>[irBuilder.buildIntegerConstant(1)]; | 1257 if (rhs.kind == CompoundKind.ASSIGNMENT) { |
| 1258 rhsValue = visit(rhs.rhs); | |
| 1259 } else { | |
| 1260 rhsValue = irBuilder.buildIntegerConstant(1); | |
| 1261 } | |
| 1262 List<ir.Primitive> arguments = <ir.Primitive>[rhsValue]; | |
| 1304 arguments = normalizeDynamicArguments( | 1263 arguments = normalizeDynamicArguments( |
| 1305 operatorSelector.callStructure, arguments); | 1264 operatorSelector.callStructure, arguments); |
| 1306 ir.Primitive result = | 1265 ir.Primitive result = |
| 1307 irBuilder.buildDynamicInvocation(value, operatorSelector, arguments); | 1266 irBuilder.buildDynamicInvocation(value, operatorSelector, arguments); |
| 1308 setValue(result); | 1267 setValue(result); |
| 1309 return isPrefix ? result : value; | 1268 return rhs.kind == CompoundKind.POSTFIX ? value : result; |
| 1310 } | |
| 1311 | |
| 1312 ir.Primitive translateCompound( | |
| 1313 {ir.Primitive getValue(), | |
| 1314 op.AssignmentOperator operator, | |
| 1315 ast.Node rhs, | |
| 1316 void setValue(ir.Primitive value)}) { | |
| 1317 ir.Primitive value = getValue(); | |
| 1318 Selector operatorSelector = | |
| 1319 new Selector.binaryOperator(operator.selectorName); | |
| 1320 List<ir.Primitive> arguments = <ir.Primitive>[visit(rhs)]; | |
| 1321 arguments = normalizeDynamicArguments( | |
| 1322 operatorSelector.callStructure, arguments); | |
| 1323 ir.Primitive result = | |
| 1324 irBuilder.buildDynamicInvocation(value, operatorSelector, arguments); | |
| 1325 setValue(result); | |
| 1326 return result; | |
| 1327 } | 1269 } |
| 1328 | 1270 |
| 1329 @override | 1271 @override |
| 1330 ir.Primitive handleDynamicCompound( | |
| 1331 ast.Send node, | |
| 1332 ast.Node receiver, | |
| 1333 op.AssignmentOperator operator, | |
| 1334 ast.Node rhs, | |
| 1335 Selector getterSelector, | |
| 1336 Selector setterSelector, | |
| 1337 _) { | |
| 1338 ir.Primitive target = translateReceiver(receiver); | |
| 1339 return translateCompound( | |
| 1340 getValue: () => irBuilder.buildDynamicGet(target, getterSelector), | |
| 1341 operator: operator, | |
| 1342 rhs: rhs, | |
| 1343 setValue: (ir.Primitive result) { | |
| 1344 irBuilder.buildDynamicSet(target, setterSelector, result); | |
| 1345 }); | |
| 1346 } | |
| 1347 | |
| 1348 @override | |
| 1349 ir.Primitive handleDynamicPostfixPrefix( | |
| 1350 ast.Send node, | |
| 1351 ast.Node receiver, | |
| 1352 op.IncDecOperator operator, | |
| 1353 Selector getterSelector, | |
| 1354 Selector setterSelector, | |
| 1355 arg, | |
| 1356 {bool isPrefix}) { | |
| 1357 ir.Primitive target = translateReceiver(receiver); | |
| 1358 return translatePrefixPostfix( | |
| 1359 getValue: () => irBuilder.buildDynamicGet(target, getterSelector), | |
| 1360 operator: operator, | |
| 1361 setValue: (ir.Primitive result) { | |
| 1362 irBuilder.buildDynamicSet(target, setterSelector, result); | |
| 1363 }, | |
| 1364 isPrefix: isPrefix); | |
| 1365 } | |
| 1366 | |
| 1367 @override | |
| 1368 ir.Primitive handleDynamicSet( | 1272 ir.Primitive handleDynamicSet( |
| 1369 ast.SendSet node, | 1273 ast.SendSet node, |
| 1370 ast.Node receiver, | 1274 ast.Node receiver, |
| 1371 Selector selector, | 1275 Selector selector, |
| 1372 ast.Node rhs, | 1276 ast.Node rhs, |
| 1373 _) { | 1277 _) { |
| 1374 return irBuilder.buildDynamicSet( | 1278 return irBuilder.buildDynamicSet( |
| 1375 translateReceiver(receiver), | 1279 translateReceiver(receiver), |
| 1376 selector, | 1280 selector, |
| 1377 visit(rhs)); | 1281 visit(rhs)); |
| 1378 } | 1282 } |
| 1379 | 1283 |
| 1380 @override | 1284 @override |
| 1381 ir.Primitive handleLocalCompound( | |
| 1382 ast.Send node, | |
| 1383 LocalElement element, | |
| 1384 op.AssignmentOperator operator, | |
| 1385 ast.Node rhs, | |
| 1386 _) { | |
| 1387 return translateCompound( | |
| 1388 getValue: () => irBuilder.buildLocalVariableGet(element), | |
| 1389 operator: operator, | |
| 1390 rhs: rhs, | |
| 1391 setValue: (ir.Primitive result) { | |
| 1392 irBuilder.buildLocalVariableSet(element, result); | |
| 1393 }); | |
| 1394 } | |
| 1395 | |
| 1396 @override | |
| 1397 ir.Primitive handleLocalPostfixPrefix( | |
| 1398 ast.Send node, | |
| 1399 LocalElement element, | |
| 1400 op.IncDecOperator operator, | |
| 1401 arg, | |
| 1402 {bool isPrefix}) { | |
| 1403 return translatePrefixPostfix( | |
| 1404 getValue: () => irBuilder.buildLocalVariableGet(element), | |
| 1405 operator: operator, | |
| 1406 setValue: (ir.Primitive result) { | |
| 1407 irBuilder.buildLocalVariableSet(element, result); | |
| 1408 }, | |
| 1409 isPrefix: isPrefix); | |
| 1410 } | |
| 1411 | |
| 1412 @override | |
| 1413 ir.Primitive handleLocalSet( | 1285 ir.Primitive handleLocalSet( |
| 1414 ast.SendSet node, | 1286 ast.SendSet node, |
| 1415 LocalElement element, | 1287 LocalElement element, |
| 1416 ast.Node rhs, | 1288 ast.Node rhs, |
| 1417 _) { | 1289 _) { |
| 1418 return irBuilder.buildLocalVariableSet(element, visit(rhs)); | 1290 return irBuilder.buildLocalVariableSet(element, visit(rhs)); |
| 1419 } | 1291 } |
| 1420 | 1292 |
| 1421 @override | 1293 @override |
| 1422 ir.Primitive handleStaticFieldCompound( | |
| 1423 ast.Send node, | |
| 1424 FieldElement field, | |
| 1425 op.AssignmentOperator operator, | |
| 1426 ast.Node rhs, | |
| 1427 _) { | |
| 1428 return translateCompound( | |
| 1429 getValue: () => irBuilder.buildStaticFieldGet(field), | |
| 1430 operator: operator, | |
| 1431 rhs: rhs, | |
| 1432 setValue: (ir.Primitive result) { | |
| 1433 irBuilder.buildStaticFieldSet(field, result); | |
| 1434 }); | |
| 1435 } | |
| 1436 | |
| 1437 @override | |
| 1438 ir.Primitive handleStaticFieldPostfixPrefix( | |
| 1439 ast.Send node, | |
| 1440 FieldElement field, | |
| 1441 op.IncDecOperator operator, | |
| 1442 arg, | |
| 1443 {bool isPrefix}) { | |
| 1444 return translatePrefixPostfix( | |
| 1445 getValue: () => irBuilder.buildStaticFieldGet(field), | |
| 1446 operator: operator, | |
| 1447 setValue: (ir.Primitive result) { | |
| 1448 irBuilder.buildStaticFieldSet(field, result); | |
| 1449 }, | |
| 1450 isPrefix: isPrefix); | |
| 1451 } | |
| 1452 | |
| 1453 @override | |
| 1454 ir.Primitive handleStaticFieldSet( | 1294 ir.Primitive handleStaticFieldSet( |
| 1455 ast.SendSet node, | 1295 ast.SendSet node, |
| 1456 FieldElement field, | 1296 FieldElement field, |
| 1457 ast.Node rhs, | 1297 ast.Node rhs, |
| 1458 _) { | 1298 _) { |
| 1459 return irBuilder.buildStaticFieldSet(field, visit(rhs)); | 1299 return irBuilder.buildStaticFieldSet(field, visit(rhs)); |
| 1460 } | 1300 } |
| 1461 | 1301 |
| 1462 @override | 1302 @override |
| 1463 ir.Primitive visitSuperFieldSet( | 1303 ir.Primitive visitSuperFieldSet( |
| 1464 ast.SendSet node, | 1304 ast.SendSet node, |
| 1465 FieldElement field, | 1305 FieldElement field, |
| 1466 ast.Node rhs, | 1306 ast.Node rhs, |
| 1467 _) { | 1307 _) { |
| 1468 return irBuilder.buildSuperFieldSet(field, visit(rhs)); | 1308 return irBuilder.buildSuperFieldSet(field, visit(rhs)); |
| 1469 } | 1309 } |
| 1470 | 1310 |
| 1471 @override | 1311 @override |
| 1472 ir.Primitive visitSuperSetterSet( | 1312 ir.Primitive visitSuperSetterSet( |
| 1473 ast.SendSet node, | 1313 ast.SendSet node, |
| 1474 FunctionElement setter, | 1314 FunctionElement setter, |
| 1475 ast.Node rhs, | 1315 ast.Node rhs, |
| 1476 _) { | 1316 _) { |
| 1477 return irBuilder.buildSuperSetterSet(setter, visit(rhs)); | 1317 return irBuilder.buildSuperSetterSet(setter, visit(rhs)); |
| 1478 } | 1318 } |
| 1479 | 1319 |
| 1480 @override | 1320 @override |
| 1481 ir.Primitive handleStaticGetterSetterCompound( | 1321 ir.Primitive visitUnresolvedSuperIndexSet( |
| 1482 ast.Send node, | 1322 ast.Send node, |
| 1483 FunctionElement getter, | 1323 Element element, |
| 1324 ast.Node index, | |
| 1325 ast.Node rhs, | |
| 1326 arg) { | |
| 1327 return giveup(node, 'visitUnresolvedSuperIndexSet'); | |
| 1328 } | |
| 1329 | |
| 1330 @override | |
| 1331 ir.Primitive handleStaticSetterSet( | |
| 1332 ast.SendSet node, | |
| 1484 FunctionElement setter, | 1333 FunctionElement setter, |
| 1485 op.AssignmentOperator operator, | |
| 1486 ast.Node rhs, | 1334 ast.Node rhs, |
| 1487 _) { | 1335 _) { |
| 1488 return translateCompound( | 1336 return irBuilder.buildStaticSetterSet(setter, visit(rhs)); |
| 1489 getValue: () => irBuilder.buildStaticGetterGet(getter), | 1337 } |
| 1490 operator: operator, | 1338 |
| 1491 rhs: rhs, | 1339 @override |
| 1492 setValue: (ir.Primitive result) { | 1340 ir.Primitive handleConstantCompounds( |
| 1493 irBuilder.buildStaticSetterSet(setter, result); | 1341 ast.SendSet node, |
| 1494 }); | 1342 ConstantExpression constant, |
| 1495 } | 1343 CompoundRhs rhs, |
| 1496 | 1344 arg) { |
| 1497 @override | 1345 return translateCompounds( |
| 1498 ir.Primitive handleSuperFieldFieldPostfixPrefix( | 1346 getValue: () => irBuilder.buildConstant(constant), |
| 1499 ast.Send node, | 1347 rhs: rhs, |
| 1500 FieldElement readField, | 1348 setValue: (value) {}); // The binary operator will throw before this. |
|
asgerf
2015/05/18 10:32:42
This seems wrong. The binary operator will not thr
Johnni Winther
2015/05/20 08:16:34
`5 += 42` is a syntax error that will (and should)
| |
| 1501 FieldElement writtenField, | 1349 } |
| 1502 op.IncDecOperator operator, | 1350 |
| 1503 arg, | 1351 @override |
| 1504 {bool isPrefix}) { | 1352 ir.Primitive handleDynamicCompounds( |
| 1505 return translatePrefixPostfix( | |
| 1506 getValue: () => irBuilder.buildSuperFieldGet(readField), | |
| 1507 operator: operator, | |
| 1508 setValue: (ir.Primitive result) { | |
| 1509 irBuilder.buildSuperFieldSet(writtenField, result); | |
| 1510 }, | |
| 1511 isPrefix: isPrefix); | |
| 1512 } | |
| 1513 | |
| 1514 @override | |
| 1515 ir.Primitive handleSuperFieldSetterPostfixPrefix( | |
| 1516 ast.Send node, | |
| 1517 FieldElement field, | |
| 1518 FunctionElement setter, | |
| 1519 op.IncDecOperator operator, | |
| 1520 arg, | |
| 1521 {bool isPrefix}) { | |
| 1522 return translatePrefixPostfix( | |
| 1523 getValue: () => irBuilder.buildSuperFieldGet(field), | |
| 1524 operator: operator, | |
| 1525 setValue: (ir.Primitive result) { | |
| 1526 irBuilder.buildSuperSetterSet(setter, result); | |
| 1527 }, | |
| 1528 isPrefix: isPrefix); | |
| 1529 } | |
| 1530 | |
| 1531 @override | |
| 1532 ir.Primitive handleSuperGetterFieldPostfixPrefix( | |
| 1533 ast.Send node, | |
| 1534 FunctionElement getter, | |
| 1535 FieldElement field, | |
| 1536 op.IncDecOperator operator, | |
| 1537 arg, | |
| 1538 {bool isPrefix}) { | |
| 1539 return translatePrefixPostfix( | |
| 1540 getValue: () => irBuilder.buildSuperGetterGet(getter), | |
| 1541 operator: operator, | |
| 1542 setValue: (ir.Primitive result) { | |
| 1543 irBuilder.buildSuperFieldSet(field, result); | |
| 1544 }, | |
| 1545 isPrefix: isPrefix); | |
| 1546 } | |
| 1547 | |
| 1548 @override | |
| 1549 ir.Primitive handleSuperGetterSetterPostfixPrefix( | |
| 1550 ast.Send node, | |
| 1551 FunctionElement getter, | |
| 1552 FunctionElement setter, | |
| 1553 op.IncDecOperator operator, | |
| 1554 arg, | |
| 1555 {bool isPrefix}) { | |
| 1556 return translatePrefixPostfix( | |
| 1557 getValue: () => irBuilder.buildSuperGetterGet(getter), | |
| 1558 operator: operator, | |
| 1559 setValue: (ir.Primitive result) { | |
| 1560 irBuilder.buildSuperSetterSet(setter, result); | |
| 1561 }, | |
| 1562 isPrefix: isPrefix); | |
| 1563 } | |
| 1564 | |
| 1565 @override | |
| 1566 ir.Primitive handleSuperMethodSetterPostfixPrefix( | |
| 1567 ast.Send node, | |
| 1568 FunctionElement method, | |
| 1569 FunctionElement setter, | |
| 1570 op.IncDecOperator operator, | |
| 1571 arg, | |
| 1572 {bool isPrefix}) { | |
| 1573 return translatePrefixPostfix( | |
| 1574 getValue: () => irBuilder.buildSuperMethodGet(method), | |
| 1575 operator: operator, | |
| 1576 setValue: (ir.Primitive result) { | |
| 1577 irBuilder.buildSuperSetterSet(setter, result); | |
| 1578 }, | |
| 1579 isPrefix: isPrefix); | |
| 1580 } | |
| 1581 | |
| 1582 @override | |
| 1583 ir.Primitive handleStaticGetterSetterPostfixPrefix( | |
| 1584 ast.Send node, | |
| 1585 FunctionElement getter, | |
| 1586 FunctionElement setter, | |
| 1587 op.IncDecOperator operator, | |
| 1588 arg, | |
| 1589 {bool isPrefix}) { | |
| 1590 return translatePrefixPostfix( | |
| 1591 getValue: () => irBuilder.buildStaticGetterGet(getter), | |
| 1592 operator: operator, | |
| 1593 setValue: (ir.Primitive result) { | |
| 1594 irBuilder.buildStaticSetterSet(setter, result); | |
| 1595 }, | |
| 1596 isPrefix: isPrefix); | |
| 1597 } | |
| 1598 | |
| 1599 @override | |
| 1600 ir.Primitive handleStaticMethodSetterCompound( | |
| 1601 ast.Send node, | |
| 1602 FunctionElement method, | |
| 1603 FunctionElement setter, | |
| 1604 op.AssignmentOperator operator, | |
| 1605 ast.Node rhs, | |
| 1606 _) { | |
| 1607 return translateCompound( | |
| 1608 getValue: () => irBuilder.buildStaticFunctionGet(method), | |
| 1609 operator: operator, | |
| 1610 rhs: rhs, | |
| 1611 setValue: (ir.Primitive result) { | |
| 1612 irBuilder.buildStaticSetterSet(setter, result); | |
| 1613 }); | |
| 1614 } | |
| 1615 | |
| 1616 @override | |
| 1617 ir.Primitive handleStaticMethodSetterPostfixPrefix( | |
| 1618 ast.Send node, | |
| 1619 FunctionElement getter, | |
| 1620 FunctionElement setter, | |
| 1621 op.IncDecOperator operator, | |
| 1622 arg, | |
| 1623 {bool isPrefix}) { | |
| 1624 return translatePrefixPostfix( | |
| 1625 getValue: () => irBuilder.buildStaticFunctionGet(getter), | |
| 1626 operator: operator, | |
| 1627 setValue: (ir.Primitive result) { | |
| 1628 irBuilder.buildStaticSetterSet(setter, result); | |
| 1629 }, | |
| 1630 isPrefix: isPrefix); | |
| 1631 } | |
| 1632 | |
| 1633 @override | |
| 1634 ir.Primitive handleDynamicIndexPostfixPrefix( | |
| 1635 ast.Send node, | 1353 ast.Send node, |
| 1636 ast.Node receiver, | 1354 ast.Node receiver, |
| 1355 CompoundRhs rhs, | |
| 1356 Selector getterSelector, | |
| 1357 Selector setterSelector, | |
| 1358 arg) { | |
| 1359 ir.Primitive target = translateReceiver(receiver); | |
| 1360 return translateCompounds( | |
| 1361 getValue: () => irBuilder.buildDynamicGet(target, getterSelector), | |
| 1362 rhs: rhs, | |
| 1363 setValue: (ir.Primitive result) { | |
| 1364 irBuilder.buildDynamicSet(target, setterSelector, result); | |
| 1365 }); | |
| 1366 } | |
| 1367 | |
| 1368 ir.Primitive buildLocalNoSuchSetter(Local local, ir.Primitive value) { | |
| 1369 Selector selector = new Selector.setter(local.name, null); | |
| 1370 return buildStaticNoSuchMethod(selector, [value]); | |
| 1371 } | |
| 1372 | |
| 1373 @override | |
| 1374 ir.Primitive handleLocalCompounds( | |
| 1375 ast.SendSet node, | |
| 1376 LocalElement local, | |
| 1377 CompoundRhs rhs, | |
| 1378 arg, | |
| 1379 {bool isSetterValid}) { | |
| 1380 return translateCompounds( | |
| 1381 getValue: () { | |
| 1382 if (local.isFunction) { | |
| 1383 return irBuilder.buildLocalFunctionGet(local); | |
| 1384 } else { | |
| 1385 return irBuilder.buildLocalVariableGet(local); | |
| 1386 } | |
| 1387 }, | |
| 1388 rhs: rhs, | |
| 1389 setValue: (ir.Primitive result) { | |
| 1390 if (isSetterValid) { | |
| 1391 irBuilder.buildLocalVariableSet(local, result); | |
| 1392 } else { | |
| 1393 return buildLocalNoSuchSetter(local, result); | |
| 1394 } | |
| 1395 }); | |
| 1396 } | |
| 1397 | |
| 1398 ir.Primitive buildStaticNoSuchGetter(Element element) { | |
| 1399 return buildStaticNoSuchMethod( | |
| 1400 new Selector.getter(element.name, element.library), | |
| 1401 const <ir.Primitive>[]); | |
| 1402 } | |
| 1403 | |
| 1404 ir.Primitive buildStaticNoSuchSetter(Element element, ir.Primitive value) { | |
| 1405 return buildStaticNoSuchMethod( | |
| 1406 new Selector.setter(element.name, element.library), | |
| 1407 <ir.Primitive>[value]); | |
| 1408 } | |
| 1409 | |
| 1410 @override | |
| 1411 ir.Primitive handleStaticCompounds( | |
| 1412 ast.SendSet node, | |
| 1413 Element getter, | |
| 1414 CompoundGetter getterKind, | |
| 1415 Element setter, | |
| 1416 CompoundSetter setterKind, | |
| 1417 CompoundRhs rhs, | |
| 1418 arg) { | |
| 1419 return translateCompounds( | |
| 1420 getValue: () { | |
| 1421 switch (getterKind) { | |
| 1422 case CompoundGetter.FIELD: | |
| 1423 return irBuilder.buildStaticFieldGet(getter); | |
| 1424 case CompoundGetter.GETTER: | |
| 1425 return irBuilder.buildStaticGetterGet(getter); | |
| 1426 case CompoundGetter.METHOD: | |
| 1427 return irBuilder.buildStaticFunctionGet(getter); | |
| 1428 case CompoundGetter.UNRESOLVED: | |
| 1429 return buildStaticNoSuchGetter(getter); | |
| 1430 } | |
| 1431 }, | |
| 1432 rhs: rhs, | |
| 1433 setValue: (ir.Primitive result) { | |
| 1434 switch (setterKind) { | |
| 1435 case CompoundSetter.FIELD: | |
| 1436 return irBuilder.buildStaticFieldSet(setter, result); | |
| 1437 case CompoundSetter.SETTER: | |
| 1438 return irBuilder.buildStaticSetterSet(setter, result); | |
| 1439 case CompoundSetter.INVALID: | |
| 1440 // TODO(johnniwinther): Ensure [setter] is non null. | |
| 1441 return buildStaticNoSuchSetter( | |
| 1442 setter != null ? setter : getter, result); | |
| 1443 } | |
| 1444 }); | |
| 1445 } | |
| 1446 | |
| 1447 ir.Primitive buildSuperNoSuchGetter(Element element) { | |
| 1448 return buildInstanceNoSuchMethod( | |
| 1449 new Selector.getter(element.name, element.library), | |
| 1450 const <ir.Primitive>[]); | |
| 1451 } | |
| 1452 | |
| 1453 ir.Primitive buildSuperNoSuchSetter(Element element, ir.Primitive value) { | |
| 1454 return buildInstanceNoSuchMethod( | |
| 1455 new Selector.setter(element.name, element.library), | |
| 1456 <ir.Primitive>[value]); | |
| 1457 } | |
| 1458 | |
| 1459 @override | |
| 1460 ir.Primitive handleSuperCompounds( | |
| 1461 ast.SendSet node, | |
| 1462 Element getter, | |
| 1463 CompoundGetter getterKind, | |
| 1464 Element setter, | |
| 1465 CompoundSetter setterKind, | |
| 1466 CompoundRhs rhs, | |
| 1467 arg) { | |
| 1468 return translateCompounds( | |
| 1469 getValue: () { | |
| 1470 switch (getterKind) { | |
| 1471 case CompoundGetter.FIELD: | |
| 1472 return irBuilder.buildSuperFieldGet(getter); | |
| 1473 case CompoundGetter.GETTER: | |
| 1474 return irBuilder.buildSuperGetterGet(getter); | |
| 1475 case CompoundGetter.METHOD: | |
| 1476 return irBuilder.buildSuperMethodGet(getter); | |
| 1477 case CompoundGetter.UNRESOLVED: | |
| 1478 // TODO(johnniwinther): Ensure [getter] is not null. | |
| 1479 return buildSuperNoSuchGetter(getter != null ? getter : setter); | |
| 1480 } | |
| 1481 }, | |
| 1482 rhs: rhs, | |
| 1483 setValue: (ir.Primitive result) { | |
| 1484 switch (setterKind) { | |
| 1485 case CompoundSetter.FIELD: | |
| 1486 return irBuilder.buildSuperFieldSet(setter, result); | |
| 1487 case CompoundSetter.SETTER: | |
| 1488 return irBuilder.buildSuperSetterSet(setter, result); | |
| 1489 case CompoundSetter.INVALID: | |
| 1490 return buildSuperNoSuchSetter(setter, result); | |
| 1491 } | |
| 1492 }); | |
| 1493 } | |
| 1494 | |
| 1495 @override | |
| 1496 ir.Primitive handleTypeVariableTypeLiteralCompounds( | |
| 1497 ast.SendSet node, | |
| 1498 TypeVariableElement typeVariable, | |
| 1499 CompoundRhs rhs, | |
| 1500 arg) { | |
| 1501 return translateCompounds( | |
| 1502 getValue: () => irBuilder.buildReifyTypeVariable(typeVariable.type), | |
| 1503 rhs: rhs, | |
| 1504 setValue: (value) {}); // The binary operator will throw before this. | |
| 1505 } | |
| 1506 | |
| 1507 @override | |
| 1508 ir.Primitive handleIndexCompounds( | |
| 1509 ast.SendSet node, | |
| 1510 ast.Node receiver, | |
| 1637 ast.Node index, | 1511 ast.Node index, |
| 1638 op.IncDecOperator operator, | 1512 CompoundRhs rhs, |
| 1639 arg, | 1513 arg) { |
| 1640 {bool isPrefix}) { | |
| 1641 ir.Primitive target = visit(receiver); | 1514 ir.Primitive target = visit(receiver); |
| 1642 ir.Primitive indexValue = visit(index); | 1515 ir.Primitive indexValue = visit(index); |
| 1643 return translatePrefixPostfix( | 1516 return translateCompounds( |
| 1644 getValue: () { | 1517 getValue: () { |
| 1645 Selector selector = new Selector.index(); | 1518 Selector selector = new Selector.index(); |
| 1646 List<ir.Primitive> arguments = <ir.Primitive>[indexValue]; | 1519 List<ir.Primitive> arguments = <ir.Primitive>[indexValue]; |
| 1647 arguments = | 1520 arguments = |
| 1648 normalizeDynamicArguments(selector.callStructure, arguments); | 1521 normalizeDynamicArguments(selector.callStructure, arguments); |
| 1649 return irBuilder.buildDynamicInvocation(target, selector, arguments); | 1522 return irBuilder.buildDynamicInvocation(target, selector, arguments); |
| 1650 }, | 1523 }, |
| 1651 operator: operator, | 1524 rhs: rhs, |
| 1652 setValue: (ir.Primitive result) { | 1525 setValue: (ir.Primitive result) { |
| 1653 Selector selector = new Selector.indexSet(); | 1526 irBuilder.buildDynamicIndexSet(target, indexValue, result); |
| 1654 List<ir.Primitive> arguments = <ir.Primitive>[indexValue, result]; | 1527 }); |
| 1655 arguments = | 1528 } |
| 1656 normalizeDynamicArguments(selector.callStructure, arguments); | 1529 |
| 1657 irBuilder.buildDynamicInvocation(target, selector, arguments); | 1530 @override |
| 1658 }, | 1531 ir.Primitive handleSuperIndexCompounds( |
| 1659 isPrefix: isPrefix); | 1532 ast.SendSet node, |
| 1660 } | 1533 Element indexFunction, |
| 1661 | 1534 Element indexSetFunction, |
| 1662 @override | |
| 1663 ir.Primitive handleSuperIndexPostfixPrefix( | |
| 1664 ast.Send node, | |
| 1665 FunctionElement indexFunction, | |
| 1666 FunctionElement indexSetFunction, | |
| 1667 ast.Node index, | 1535 ast.Node index, |
| 1668 op.IncDecOperator operator, | 1536 CompoundRhs rhs, |
| 1669 arg, | 1537 arg, |
| 1670 {bool isPrefix}) { | 1538 {bool isGetterValid, |
| 1539 bool isSetterValid}) { | |
| 1671 ir.Primitive indexValue = visit(index); | 1540 ir.Primitive indexValue = visit(index); |
| 1672 return translatePrefixPostfix( | 1541 return translateCompounds( |
| 1673 getValue: () { | 1542 getValue: () { |
| 1674 return irBuilder.buildSuperIndex(indexFunction, indexValue); | 1543 if (isGetterValid) { |
| 1675 }, | 1544 return irBuilder.buildSuperIndex(indexFunction, indexValue); |
| 1676 operator: operator, | 1545 } else { |
| 1677 setValue: (ir.Primitive result) { | 1546 return buildInstanceNoSuchMethod( |
| 1678 irBuilder.buildSuperIndexSet(indexSetFunction, indexValue, result); | 1547 new Selector.index(), <ir.Primitive>[indexValue]); |
| 1679 }, | 1548 } |
| 1680 isPrefix: isPrefix); | 1549 }, |
| 1681 } | 1550 rhs: rhs, |
| 1682 | 1551 setValue: (ir.Primitive result) { |
| 1683 @override | 1552 if (isSetterValid) { |
| 1684 ir.Primitive handleUnresolvedSuperGetterIndexPostfixPrefix( | 1553 irBuilder.buildSuperIndexSet(indexSetFunction, indexValue, result); |
| 1685 ast.Send node, | 1554 } else { |
| 1686 Element element, | 1555 buildInstanceNoSuchMethod( |
| 1687 ast.Node index, | 1556 new Selector.indexSet(), <ir.Primitive>[indexValue, result]); |
| 1688 op.IncDecOperator operator, | 1557 } |
| 1689 arg, | 1558 }); |
| 1690 {bool isPrefix}) { | 1559 } |
| 1691 return giveup(node, 'handleSuperUnresolvedGetterIndexPostfixPrefix'); | 1560 |
| 1692 } | |
| 1693 | |
| 1694 @override | |
| 1695 ir.Primitive handleUnresolvedSuperSetterIndexPostfixPrefix( | |
| 1696 ast.Send node, | |
| 1697 FunctionElement indexFunction, | |
| 1698 Element element, | |
| 1699 ast.Node index, | |
| 1700 op.IncDecOperator operator, | |
| 1701 arg, | |
| 1702 {bool isPrefix}) { | |
| 1703 return giveup(node, 'handleSuperUnresolvedGetterIndexPostfixPrefix'); | |
| 1704 } | |
| 1705 | |
| 1706 @override | |
| 1707 ir.Primitive visitUnresolvedSuperGetterCompoundIndexSet( | |
| 1708 ast.Send node, | |
| 1709 Element element, | |
| 1710 ast.Node index, | |
| 1711 op.AssignmentOperator operator, | |
| 1712 ast.Node rhs, | |
| 1713 arg) { | |
| 1714 return giveup(node, 'visitUnresolvedSuperGetterCompoundIndexSet'); | |
| 1715 } | |
| 1716 | |
| 1717 @override | |
| 1718 ir.Primitive visitUnresolvedSuperIndexSet( | |
| 1719 ast.Send node, | |
| 1720 Element element, | |
| 1721 ast.Node index, | |
| 1722 ast.Node rhs, | |
| 1723 arg) { | |
| 1724 return giveup(node, 'visitUnresolvedSuperIndexSet'); | |
| 1725 } | |
| 1726 | |
| 1727 @override | |
| 1728 ir.Primitive visitUnresolvedSuperSetterCompoundIndexSet( | |
| 1729 ast.Send node, | |
| 1730 MethodElement getter, | |
| 1731 Element element, | |
| 1732 ast.Node index, | |
| 1733 op.AssignmentOperator operator, | |
| 1734 ast.Node rhs, | |
| 1735 arg) { | |
| 1736 return giveup(node, 'visitUnresolvedSuperSetterCompoundIndexSet'); | |
| 1737 } | |
| 1738 | |
| 1739 @override | |
| 1740 ir.Primitive handleStaticSetterSet( | |
| 1741 ast.SendSet node, | |
| 1742 FunctionElement setter, | |
| 1743 ast.Node rhs, | |
| 1744 _) { | |
| 1745 return irBuilder.buildStaticSetterSet(setter, visit(rhs)); | |
| 1746 } | |
| 1747 | |
| 1748 @override | |
| 1749 ir.Primitive visitSuperFieldCompound( | |
| 1750 ast.Send node, | |
| 1751 FieldElement field, | |
| 1752 op.AssignmentOperator operator, | |
| 1753 ast.Node rhs, | |
| 1754 _) { | |
| 1755 return translateCompound( | |
| 1756 getValue: () => irBuilder.buildSuperFieldGet(field), | |
| 1757 operator: operator, | |
| 1758 rhs: rhs, | |
| 1759 setValue: (ir.Primitive result) { | |
| 1760 irBuilder.buildSuperFieldSet(field, result); | |
| 1761 }); | |
| 1762 } | |
| 1763 | |
| 1764 @override | |
| 1765 ir.Primitive visitSuperFieldFieldPostfix( | |
| 1766 ast.Send node, | |
| 1767 FieldElement readField, | |
| 1768 FieldElement writtenField, | |
| 1769 op.IncDecOperator operator, | |
| 1770 _) { | |
| 1771 return translatePrefixPostfix( | |
| 1772 getValue: () => irBuilder.buildSuperFieldGet(readField), | |
| 1773 operator: operator, | |
| 1774 setValue: (ir.Primitive result) { | |
| 1775 irBuilder.buildSuperFieldSet(writtenField, result); | |
| 1776 }, | |
| 1777 isPrefix: false); | |
| 1778 } | |
| 1779 | |
| 1780 @override | |
| 1781 ir.Primitive visitSuperFieldFieldPrefix( | |
| 1782 ast.Send node, | |
| 1783 FieldElement readField, | |
| 1784 FieldElement writtenField, | |
| 1785 op.IncDecOperator operator, | |
| 1786 _) { | |
| 1787 return translatePrefixPostfix( | |
| 1788 getValue: () => irBuilder.buildSuperFieldGet(readField), | |
| 1789 operator: operator, | |
| 1790 setValue: (ir.Primitive result) { | |
| 1791 irBuilder.buildSuperFieldSet(writtenField, result); | |
| 1792 }, | |
| 1793 isPrefix: true); | |
| 1794 } | |
| 1795 | |
| 1796 @override | |
| 1797 ir.Primitive visitSuperFieldSetterCompound( | |
| 1798 ast.Send node, | |
| 1799 FieldElement field, | |
| 1800 FunctionElement setter, | |
| 1801 op.AssignmentOperator operator, | |
| 1802 ast.Node rhs, | |
| 1803 _) { | |
| 1804 return translateCompound( | |
| 1805 getValue: () => irBuilder.buildSuperFieldGet(field), | |
| 1806 operator: operator, | |
| 1807 rhs: rhs, | |
| 1808 setValue: (ir.Primitive result) { | |
| 1809 irBuilder.buildSuperSetterSet(setter, result); | |
| 1810 }); | |
| 1811 } | |
| 1812 | |
| 1813 @override | |
| 1814 ir.Primitive visitSuperGetterFieldCompound( | |
| 1815 ast.Send node, | |
| 1816 FunctionElement getter, | |
| 1817 FieldElement field, | |
| 1818 op.AssignmentOperator operator, | |
| 1819 ast.Node rhs, | |
| 1820 _) { | |
| 1821 return translateCompound( | |
| 1822 getValue: () => irBuilder.buildSuperGetterGet(getter), | |
| 1823 operator: operator, | |
| 1824 rhs: rhs, | |
| 1825 setValue: (ir.Primitive result) { | |
| 1826 irBuilder.buildSuperFieldSet(field, result); | |
| 1827 }); | |
| 1828 } | |
| 1829 | |
| 1830 @override | |
| 1831 ir.Primitive visitSuperGetterSetterCompound( | |
| 1832 ast.Send node, | |
| 1833 FunctionElement getter, | |
| 1834 FunctionElement setter, | |
| 1835 op.AssignmentOperator operator, | |
| 1836 ast.Node rhs, | |
| 1837 _) { | |
| 1838 return translateCompound( | |
| 1839 getValue: () => irBuilder.buildSuperGetterGet(getter), | |
| 1840 operator: operator, | |
| 1841 rhs: rhs, | |
| 1842 setValue: (ir.Primitive result) { | |
| 1843 irBuilder.buildSuperSetterSet(setter, result); | |
| 1844 }); | |
| 1845 } | |
| 1846 | |
| 1847 @override | |
| 1848 ir.Primitive visitSuperMethodSetterCompound( | |
| 1849 ast.Send node, | |
| 1850 FunctionElement method, | |
| 1851 FunctionElement setter, | |
| 1852 op.AssignmentOperator operator, | |
| 1853 ast.Node rhs, | |
| 1854 _) { | |
| 1855 return translateCompound( | |
| 1856 getValue: () => irBuilder.buildSuperMethodGet(method), | |
| 1857 operator: operator, | |
| 1858 rhs: rhs, | |
| 1859 setValue: (ir.Primitive result) { | |
| 1860 irBuilder.buildSuperSetterSet(setter, result); | |
| 1861 }); | |
| 1862 } | |
| 1863 | |
| 1864 ir.Primitive visitStringJuxtaposition(ast.StringJuxtaposition node) { | 1561 ir.Primitive visitStringJuxtaposition(ast.StringJuxtaposition node) { |
| 1865 assert(irBuilder.isOpen); | 1562 assert(irBuilder.isOpen); |
| 1866 ir.Primitive first = visit(node.first); | 1563 ir.Primitive first = visit(node.first); |
| 1867 ir.Primitive second = visit(node.second); | 1564 ir.Primitive second = visit(node.second); |
| 1868 return irBuilder.buildStringConcatenation([first, second]); | 1565 return irBuilder.buildStringConcatenation([first, second]); |
| 1869 } | 1566 } |
| 1870 | 1567 |
| 1871 ir.Primitive visitStringInterpolation(ast.StringInterpolation node) { | 1568 ir.Primitive visitStringInterpolation(ast.StringInterpolation node) { |
| 1872 assert(irBuilder.isOpen); | 1569 assert(irBuilder.isOpen); |
| 1873 List<ir.Primitive> arguments = []; | 1570 List<ir.Primitive> arguments = []; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1910 ast.Send node, | 1607 ast.Send node, |
| 1911 ast.NodeList arguments, _) { | 1608 ast.NodeList arguments, _) { |
| 1912 if (compiler.enableUserAssertions) { | 1609 if (compiler.enableUserAssertions) { |
| 1913 return giveup(node, 'Assert'); | 1610 return giveup(node, 'Assert'); |
| 1914 } else { | 1611 } else { |
| 1915 return irBuilder.buildNullConstant(); | 1612 return irBuilder.buildNullConstant(); |
| 1916 } | 1613 } |
| 1917 } | 1614 } |
| 1918 | 1615 |
| 1919 @override | 1616 @override |
| 1920 ir.Primitive errorUnresolvedCompound( | 1617 ir.Primitive visitUnresolvedCompound( |
| 1921 ast.Send node, | 1618 ast.Send node, |
| 1922 Element element, | 1619 Element element, |
| 1923 op.AssignmentOperator operator, | 1620 op.AssignmentOperator operator, |
| 1924 ast.Node rhs, _) { | 1621 ast.Node rhs, _) { |
| 1925 // TODO(asgerf): What is unresolved? The getter and/or the setter? | 1622 // TODO(asgerf): What is unresolved? The getter and/or the setter? |
| 1926 // If it was the setter, we must evaluate the right-hand side. | 1623 // If it was the setter, we must evaluate the right-hand side. |
| 1927 return buildStaticNoSuchMethod(elements.getSelector(node), []); | 1624 return buildStaticNoSuchMethod(elements.getSelector(node), []); |
| 1928 } | 1625 } |
| 1929 | 1626 |
| 1930 @override | 1627 @override |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1972 ir.Primitive visitUnresolvedInvoke( | 1669 ir.Primitive visitUnresolvedInvoke( |
| 1973 ast.Send node, | 1670 ast.Send node, |
| 1974 Element element, | 1671 Element element, |
| 1975 ast.NodeList arguments, | 1672 ast.NodeList arguments, |
| 1976 Selector selector, _) { | 1673 Selector selector, _) { |
| 1977 return buildStaticNoSuchMethod(elements.getSelector(node), | 1674 return buildStaticNoSuchMethod(elements.getSelector(node), |
| 1978 arguments.nodes.mapToList(visit)); | 1675 arguments.nodes.mapToList(visit)); |
| 1979 } | 1676 } |
| 1980 | 1677 |
| 1981 @override | 1678 @override |
| 1982 ir.Primitive errorUnresolvedPostfix( | |
| 1983 ast.Send node, | |
| 1984 Element element, | |
| 1985 op.IncDecOperator operator, _) { | |
| 1986 // TODO(asgerf): Which ones are missing? The getter and/or the setter? | |
| 1987 return buildStaticNoSuchMethod(elements.getSelector(node), []); | |
| 1988 } | |
| 1989 | |
| 1990 @override | |
| 1991 ir.Primitive errorUnresolvedPrefix( | |
| 1992 ast.Send node, | |
| 1993 Element element, | |
| 1994 op.IncDecOperator operator, _) { | |
| 1995 // TODO(asgerf): Which ones are missing? The getter and/or the setter? | |
| 1996 return buildStaticNoSuchMethod(elements.getSelector(node), []); | |
| 1997 } | |
| 1998 | |
| 1999 @override | |
| 2000 ir.Primitive visitUnresolvedRedirectingFactoryConstructorInvoke( | 1679 ir.Primitive visitUnresolvedRedirectingFactoryConstructorInvoke( |
| 2001 ast.NewExpression node, | 1680 ast.NewExpression node, |
| 2002 ConstructorElement constructor, | 1681 ConstructorElement constructor, |
| 2003 InterfaceType type, | 1682 InterfaceType type, |
| 2004 ast.NodeList arguments, | 1683 ast.NodeList arguments, |
| 2005 CallStructure callStructure, _) { | 1684 CallStructure callStructure, _) { |
| 2006 String nameString = Elements.reconstructConstructorName(constructor); | 1685 String nameString = Elements.reconstructConstructorName(constructor); |
| 2007 Name name = new Name(nameString, constructor.library); | 1686 Name name = new Name(nameString, constructor.library); |
| 2008 return buildStaticNoSuchMethod( | 1687 return buildStaticNoSuchMethod( |
| 2009 new Selector(SelectorKind.CALL, name, callStructure), | 1688 new Selector(SelectorKind.CALL, name, callStructure), |
| 2010 translateDynamicArguments(arguments, callStructure)); | 1689 translateDynamicArguments(arguments, callStructure)); |
| 2011 } | 1690 } |
| 2012 | 1691 |
| 2013 @override | 1692 @override |
| 2014 ir.Primitive errorUnresolvedSet( | 1693 ir.Primitive errorUnresolvedSet( |
| 2015 ast.Send node, | 1694 ast.Send node, |
| 2016 Element element, | 1695 Element element, |
| 2017 ast.Node rhs, _) { | 1696 ast.Node rhs, _) { |
| 2018 return buildStaticNoSuchMethod(elements.getSelector(node), [visit(rhs)]); | 1697 return buildStaticNoSuchMethod(elements.getSelector(node), [visit(rhs)]); |
| 2019 } | 1698 } |
| 2020 | 1699 |
| 2021 @override | 1700 @override |
| 2022 ir.Primitive errorUnresolvedSuperCompoundIndexSet( | |
| 2023 ast.SendSet node, | |
| 2024 Element element, | |
| 2025 ast.Node index, | |
| 2026 op.AssignmentOperator operator, | |
| 2027 ast.Node rhs, _) { | |
| 2028 // Assume the index getter is missing. | |
| 2029 Selector selector = useSelectorTypeOfNode(new Selector.index(), node); | |
| 2030 return buildInstanceNoSuchMethod(selector, [visit(index)]); | |
| 2031 } | |
| 2032 | |
| 2033 @override | |
| 2034 ir.Primitive visitUnresolvedSuperIndex( | 1701 ir.Primitive visitUnresolvedSuperIndex( |
| 2035 ast.Send node, | 1702 ast.Send node, |
| 2036 Element function, | 1703 Element function, |
| 2037 ast.Node index, _) { | 1704 ast.Node index, _) { |
| 2038 // Assume the index getter is missing. | 1705 // Assume the index getter is missing. |
| 2039 Selector selector = useSelectorTypeOfNode(new Selector.index(), node); | 1706 Selector selector = useSelectorTypeOfNode(new Selector.index(), node); |
| 2040 return buildInstanceNoSuchMethod(selector, [visit(index)]); | 1707 return buildInstanceNoSuchMethod(selector, [visit(index)]); |
| 2041 } | 1708 } |
| 2042 | 1709 |
| 2043 @override | 1710 @override |
| 2044 ir.Primitive errorUnresolvedSuperIndexPostfix( | |
| 2045 ast.Send node, | |
| 2046 Element function, | |
| 2047 ast.Node index, | |
| 2048 op.IncDecOperator operator, _) { | |
| 2049 // Assume the index getter is missing. | |
| 2050 Selector selector = useSelectorTypeOfNode(new Selector.index(), node); | |
| 2051 return buildInstanceNoSuchMethod(selector, [visit(index)]); | |
| 2052 } | |
| 2053 | |
| 2054 @override | |
| 2055 ir.Primitive errorUnresolvedSuperIndexPrefix( | |
| 2056 ast.Send node, | |
| 2057 Element function, | |
| 2058 ast.Node index, | |
| 2059 op.IncDecOperator operator, _) { | |
| 2060 // Assume the index getter is missing. | |
| 2061 Selector selector = useSelectorTypeOfNode(new Selector.index(), node); | |
| 2062 return buildInstanceNoSuchMethod(selector, [visit(index)]); | |
| 2063 } | |
| 2064 | |
| 2065 @override | |
| 2066 ir.Primitive errorUnresolvedSuperIndexSet( | |
| 2067 ast.SendSet node, | |
| 2068 Element element, | |
| 2069 ast.Node index, | |
| 2070 ast.Node rhs, _) { | |
| 2071 Selector selector = useSelectorTypeOfNode(new Selector.index(), node); | |
| 2072 return buildInstanceNoSuchMethod( | |
| 2073 selector, | |
| 2074 [visit(index), visit(rhs)]); | |
| 2075 } | |
| 2076 | |
| 2077 @override | |
| 2078 ir.Primitive visitUnresolvedSuperBinary( | 1711 ir.Primitive visitUnresolvedSuperBinary( |
| 2079 ast.Send node, | 1712 ast.Send node, |
| 2080 Element element, | 1713 Element element, |
| 2081 op.BinaryOperator operator, | 1714 op.BinaryOperator operator, |
| 2082 ast.Node argument, _) { | 1715 ast.Node argument, _) { |
| 2083 return buildInstanceNoSuchMethod( | 1716 return buildInstanceNoSuchMethod( |
| 2084 elements.getSelector(node), | 1717 elements.getSelector(node), |
| 2085 [visit(argument)]); | 1718 [visit(argument)]); |
| 2086 } | 1719 } |
| 2087 | 1720 |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2194 ir.Primitive visitAbstractClassConstructorInvoke( | 1827 ir.Primitive visitAbstractClassConstructorInvoke( |
| 2195 ast.NewExpression node, | 1828 ast.NewExpression node, |
| 2196 ConstructorElement element, | 1829 ConstructorElement element, |
| 2197 InterfaceType type, | 1830 InterfaceType type, |
| 2198 ast.NodeList arguments, | 1831 ast.NodeList arguments, |
| 2199 CallStructure callStructure, _) { | 1832 CallStructure callStructure, _) { |
| 2200 return buildAbstractClassInstantiationError(element.enclosingClass); | 1833 return buildAbstractClassInstantiationError(element.enclosingClass); |
| 2201 } | 1834 } |
| 2202 | 1835 |
| 2203 @override | 1836 @override |
| 2204 ir.Primitive errorClassTypeLiteralCompound( | |
| 2205 ast.Send node, | |
| 2206 ConstantExpression constant, | |
| 2207 op.AssignmentOperator operator, | |
| 2208 ast.Node rhs, _) { | |
| 2209 return translateCompound( | |
| 2210 getValue: () => irBuilder.buildConstant(constant), | |
| 2211 operator: operator, | |
| 2212 rhs: rhs, | |
| 2213 setValue: (value) {}); // The binary operator will throw before this. | |
| 2214 } | |
| 2215 | |
| 2216 @override | |
| 2217 ir.Primitive errorClassTypeLiteralPostfix( | |
| 2218 ast.Send node, | |
| 2219 ConstantExpression constant, | |
| 2220 op.IncDecOperator operator, _) { | |
| 2221 return translatePrefixPostfix( | |
| 2222 getValue: () => irBuilder.buildConstant(constant), | |
| 2223 operator: operator, | |
| 2224 setValue: (value) {}, // The binary operator will throw before this. | |
| 2225 isPrefix: false); | |
| 2226 } | |
| 2227 | |
| 2228 @override | |
| 2229 ir.Primitive errorClassTypeLiteralPrefix( | |
| 2230 ast.Send node, | |
| 2231 ConstantExpression constant, | |
| 2232 op.IncDecOperator operator, _) { | |
| 2233 return translatePrefixPostfix( | |
| 2234 getValue: () => irBuilder.buildConstant(constant), | |
| 2235 operator: operator, | |
| 2236 setValue: (value) {}, // The binary operator will throw before this. | |
| 2237 isPrefix: true); | |
| 2238 } | |
| 2239 | |
| 2240 @override | |
| 2241 ir.Primitive errorDynamicTypeLiteralCompound( | |
| 2242 ast.Send node, | |
| 2243 ConstantExpression constant, | |
| 2244 op.AssignmentOperator operator, | |
| 2245 ast.Node rhs, _) { | |
| 2246 return translateCompound( | |
| 2247 getValue: () => irBuilder.buildConstant(constant), | |
| 2248 operator: operator, | |
| 2249 rhs: rhs, | |
| 2250 setValue: (value) {}); // The binary operator will throw before this. | |
| 2251 } | |
| 2252 | |
| 2253 @override | |
| 2254 ir.Primitive errorDynamicTypeLiteralPostfix( | |
| 2255 ast.Send node, | |
| 2256 ConstantExpression constant, | |
| 2257 op.IncDecOperator operator, _) { | |
| 2258 return translatePrefixPostfix( | |
| 2259 getValue: () => irBuilder.buildConstant(constant), | |
| 2260 operator: operator, | |
| 2261 setValue: (value) {}, // The binary operator will throw before this. | |
| 2262 isPrefix: false); | |
| 2263 } | |
| 2264 | |
| 2265 @override | |
| 2266 ir.Primitive errorDynamicTypeLiteralPrefix( | |
| 2267 ast.Send node, | |
| 2268 ConstantExpression constant, | |
| 2269 op.IncDecOperator operator, _) { | |
| 2270 return translatePrefixPostfix( | |
| 2271 getValue: () => irBuilder.buildConstant(constant), | |
| 2272 operator: operator, | |
| 2273 setValue: (value) {}, // The binary operator will throw before this. | |
| 2274 isPrefix: true); | |
| 2275 } | |
| 2276 | |
| 2277 @override | |
| 2278 ir.Primitive errorFinalLocalVariableCompound( | |
| 2279 ast.Send node, | |
| 2280 LocalVariableElement variable, | |
| 2281 op.AssignmentOperator operator, | |
| 2282 ast.Node rhs, _) { | |
| 2283 Selector selector = new Selector.setter(variable.name, null); | |
| 2284 return translateCompound( | |
| 2285 getValue: () => irBuilder.buildLocalVariableGet(variable), | |
| 2286 operator: operator, | |
| 2287 rhs: rhs, | |
| 2288 setValue: (value) => buildStaticNoSuchMethod(selector, [value])); | |
| 2289 } | |
| 2290 | |
| 2291 @override | |
| 2292 ir.Primitive errorFinalLocalVariableSet( | 1837 ir.Primitive errorFinalLocalVariableSet( |
| 2293 ast.SendSet node, | 1838 ast.SendSet node, |
| 2294 LocalVariableElement variable, | 1839 LocalVariableElement variable, |
| 2295 ast.Node rhs, _) { | 1840 ast.Node rhs, _) { |
| 2296 Selector selector = new Selector.setter(variable.name, null); | 1841 Selector selector = new Selector.setter(variable.name, null); |
| 2297 return buildStaticNoSuchMethod(selector, [visit(rhs)]); | 1842 return buildStaticNoSuchMethod(selector, [visit(rhs)]); |
| 2298 } | 1843 } |
| 2299 | 1844 |
| 2300 @override | 1845 @override |
| 2301 ir.Primitive errorFinalParameterCompound( | |
| 2302 ast.Send node, | |
| 2303 ParameterElement parameter, | |
| 2304 op.AssignmentOperator operator, | |
| 2305 ast.Node rhs, _) { | |
| 2306 Selector selector = new Selector.setter(parameter.name, null); | |
| 2307 return translateCompound( | |
| 2308 getValue: () => irBuilder.buildLocalVariableGet(parameter), | |
| 2309 operator: operator, | |
| 2310 rhs: rhs, | |
| 2311 setValue: (value) => buildStaticNoSuchMethod(selector, [value])); | |
| 2312 } | |
| 2313 | |
| 2314 @override | |
| 2315 ir.Primitive errorFinalParameterSet( | 1846 ir.Primitive errorFinalParameterSet( |
| 2316 ast.SendSet node, | 1847 ast.SendSet node, |
| 2317 ParameterElement parameter, | 1848 ParameterElement parameter, |
| 2318 ast.Node rhs, _) { | 1849 ast.Node rhs, _) { |
| 2319 Selector selector = new Selector.setter(parameter.name, null); | 1850 Selector selector = new Selector.setter(parameter.name, null); |
| 2320 return buildStaticNoSuchMethod(selector, [visit(rhs)]); | 1851 return buildStaticNoSuchMethod(selector, [visit(rhs)]); |
| 2321 } | 1852 } |
| 2322 | 1853 |
| 2323 @override | 1854 @override |
| 2324 ir.Primitive errorFinalStaticFieldCompound( | |
| 2325 ast.Send node, | |
| 2326 FieldElement field, | |
| 2327 op.AssignmentOperator operator, | |
| 2328 ast.Node rhs, _) { | |
| 2329 return translateCompound( | |
| 2330 getValue: () => irBuilder.buildStaticFieldGet(field), | |
| 2331 operator: operator, | |
| 2332 rhs: rhs, | |
| 2333 setValue: (value) => buildStaticNoSuchMethod( | |
| 2334 new Selector.setter(field.name, field.library), [value])); | |
| 2335 } | |
| 2336 | |
| 2337 @override | |
| 2338 ir.Primitive errorFinalStaticFieldSet( | 1855 ir.Primitive errorFinalStaticFieldSet( |
| 2339 ast.SendSet node, | 1856 ast.SendSet node, |
| 2340 FieldElement field, | 1857 FieldElement field, |
| 2341 ast.Node rhs, _) { | 1858 ast.Node rhs, _) { |
| 2342 // TODO(asgerf): Include class name somehow? | 1859 // TODO(asgerf): Include class name somehow? |
| 2343 return buildStaticNoSuchMethod( | 1860 return buildStaticNoSuchMethod( |
| 2344 new Selector.setter(field.name, field.library), | 1861 new Selector.setter(field.name, field.library), |
| 2345 [visit(rhs)]); | 1862 [visit(rhs)]); |
| 2346 } | 1863 } |
| 2347 | 1864 |
| 2348 @override | 1865 @override |
| 2349 ir.Primitive errorFinalSuperFieldCompound( | |
| 2350 ast.Send node, | |
| 2351 FieldElement field, | |
| 2352 op.AssignmentOperator operator, | |
| 2353 ast.Node rhs, _) { | |
| 2354 Selector selector = useSelectorTypeOfNode( | |
| 2355 new Selector.setter(field.name, field.library), | |
| 2356 node); | |
| 2357 return translateCompound( | |
| 2358 getValue: () => irBuilder.buildSuperFieldGet(field), | |
| 2359 operator: operator, | |
| 2360 rhs: rhs, | |
| 2361 setValue: (value) => buildInstanceNoSuchMethod(selector, [value])); | |
| 2362 } | |
| 2363 | |
| 2364 @override | |
| 2365 ir.Primitive errorFinalSuperFieldSet( | 1866 ir.Primitive errorFinalSuperFieldSet( |
| 2366 ast.SendSet node, | 1867 ast.SendSet node, |
| 2367 FieldElement field, | 1868 FieldElement field, |
| 2368 ast.Node rhs, _) { | 1869 ast.Node rhs, _) { |
| 2369 Selector selector = useSelectorTypeOfNode( | 1870 Selector selector = useSelectorTypeOfNode( |
| 2370 new Selector.setter(field.name, field.library), | 1871 new Selector.setter(field.name, field.library), |
| 2371 node); | 1872 node); |
| 2372 return buildInstanceNoSuchMethod(selector, [visit(rhs)]); | 1873 return buildInstanceNoSuchMethod(selector, [visit(rhs)]); |
| 2373 } | 1874 } |
| 2374 | 1875 |
| 2375 @override | 1876 @override |
| 2376 ir.Primitive errorFinalTopLevelFieldCompound( | |
| 2377 ast.Send node, | |
| 2378 FieldElement field, | |
| 2379 op.AssignmentOperator operator, | |
| 2380 ast.Node rhs, _) { | |
| 2381 return translateCompound( | |
| 2382 getValue: () => irBuilder.buildStaticFieldGet(field), | |
| 2383 operator: operator, | |
| 2384 rhs: rhs, | |
| 2385 setValue: (value) => buildStaticNoSuchMethod( | |
| 2386 new Selector.setter(field.name, field.library), [value])); | |
| 2387 } | |
| 2388 | |
| 2389 @override | |
| 2390 ir.Primitive errorFinalTopLevelFieldSet( | 1877 ir.Primitive errorFinalTopLevelFieldSet( |
| 2391 ast.SendSet node, | 1878 ast.SendSet node, |
| 2392 FieldElement field, | 1879 FieldElement field, |
| 2393 ast.Node rhs, _) { | 1880 ast.Node rhs, _) { |
| 2394 return buildStaticNoSuchMethod( | 1881 return buildStaticNoSuchMethod( |
| 2395 new Selector.setter(field.name, field.library), | 1882 new Selector.setter(field.name, field.library), |
| 2396 [visit(rhs)]); | 1883 [visit(rhs)]); |
| 2397 } | 1884 } |
| 2398 | 1885 |
| 2399 @override | 1886 @override |
| 2400 ir.Primitive errorLocalFunctionCompound( | |
| 2401 ast.Send node, | |
| 2402 LocalFunctionElement function, | |
| 2403 op.AssignmentOperator operator, | |
| 2404 ast.Node rhs, _) { | |
| 2405 return translateCompound( | |
| 2406 getValue: () => irBuilder.buildLocalFunctionGet(function), | |
| 2407 operator: operator, | |
| 2408 rhs: rhs, | |
| 2409 setValue: (value) {}); // Binary operator will throw before this. | |
| 2410 } | |
| 2411 | |
| 2412 @override | |
| 2413 ir.Primitive errorLocalFunctionPostfix( | |
| 2414 ast.Send node, | |
| 2415 LocalFunctionElement function, | |
| 2416 op.IncDecOperator operator, | |
| 2417 _) { | |
| 2418 return translatePrefixPostfix( | |
| 2419 getValue: () => irBuilder.buildLocalFunctionGet(function), | |
| 2420 operator: operator, | |
| 2421 setValue: (value) {}, // Binary operator will throw before this. | |
| 2422 isPrefix: false); | |
| 2423 } | |
| 2424 | |
| 2425 @override | |
| 2426 ir.Primitive errorLocalFunctionPrefix( | |
| 2427 ast.Send node, | |
| 2428 LocalFunctionElement function, | |
| 2429 op.IncDecOperator operator, | |
| 2430 _) { | |
| 2431 return translatePrefixPostfix( | |
| 2432 getValue: () => irBuilder.buildLocalFunctionGet(function), | |
| 2433 operator: operator, | |
| 2434 setValue: (value) {}, // Binary operator will throw before this. | |
| 2435 isPrefix: true); | |
| 2436 } | |
| 2437 | |
| 2438 @override | |
| 2439 ir.Primitive errorLocalFunctionSet( | 1887 ir.Primitive errorLocalFunctionSet( |
| 2440 ast.SendSet node, | 1888 ast.SendSet node, |
| 2441 LocalFunctionElement function, | 1889 LocalFunctionElement function, |
| 2442 ast.Node rhs, _) { | 1890 ast.Node rhs, _) { |
| 2443 return buildStaticNoSuchMethod( | 1891 return buildStaticNoSuchMethod( |
| 2444 new Selector.setter(function.name, null), | 1892 new Selector.setter(function.name, null), |
| 2445 [visit(rhs)]); | 1893 [visit(rhs)]); |
| 2446 } | 1894 } |
| 2447 | 1895 |
| 2448 @override | 1896 @override |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2533 CallStructure callStructure, _) { | 1981 CallStructure callStructure, _) { |
| 2534 List<ir.Primitive> args = | 1982 List<ir.Primitive> args = |
| 2535 translateDynamicArguments(arguments, callStructure); | 1983 translateDynamicArguments(arguments, callStructure); |
| 2536 Name name = new Name(setter.name, setter.library); | 1984 Name name = new Name(setter.name, setter.library); |
| 2537 Selector selector = useSelectorTypeOfNode( | 1985 Selector selector = useSelectorTypeOfNode( |
| 2538 new Selector(SelectorKind.CALL, name, callStructure), | 1986 new Selector(SelectorKind.CALL, name, callStructure), |
| 2539 node); | 1987 node); |
| 2540 return buildInstanceNoSuchMethod(selector, args); | 1988 return buildInstanceNoSuchMethod(selector, args); |
| 2541 } | 1989 } |
| 2542 | 1990 |
| 2543 @override | |
| 2544 ir.Primitive errorTypeVariableTypeLiteralCompound( | |
| 2545 ast.Send node, | |
| 2546 TypeVariableElement element, | |
| 2547 op.AssignmentOperator operator, | |
| 2548 ast.Node rhs, _) { | |
| 2549 return translateCompound( | |
| 2550 getValue: () => irBuilder.buildReifyTypeVariable(element.type), | |
| 2551 operator: operator, | |
| 2552 rhs: rhs, | |
| 2553 setValue: (value) {}); // The binary operator will throw before this. | |
| 2554 } | |
| 2555 | |
| 2556 @override | |
| 2557 ir.Primitive errorTypeVariableTypeLiteralPostfix( | |
| 2558 ast.Send node, | |
| 2559 TypeVariableElement element, | |
| 2560 op.IncDecOperator operator, _) { | |
| 2561 return translatePrefixPostfix( | |
| 2562 getValue: () => irBuilder.buildReifyTypeVariable(element.type), | |
| 2563 operator: operator, | |
| 2564 setValue: (value) {}, // The binary operator will throw before this. | |
| 2565 isPrefix: false); | |
| 2566 } | |
| 2567 | |
| 2568 @override | |
| 2569 ir.Primitive errorTypeVariableTypeLiteralPrefix( | |
| 2570 ast.Send node, | |
| 2571 TypeVariableElement element, | |
| 2572 op.IncDecOperator operator, _) { | |
| 2573 return translatePrefixPostfix( | |
| 2574 getValue: () => irBuilder.buildReifyTypeVariable(element.type), | |
| 2575 operator: operator, | |
| 2576 setValue: (value) {}, // The binary operator will throw before this. | |
| 2577 isPrefix: true); | |
| 2578 } | |
| 2579 | |
| 2580 @override | |
| 2581 ir.Primitive errorTypedefTypeLiteralCompound( | |
| 2582 ast.Send node, | |
| 2583 ConstantExpression constant, | |
| 2584 op.AssignmentOperator operator, | |
| 2585 ast.Node rhs, _) { | |
| 2586 return translateCompound( | |
| 2587 getValue: () => irBuilder.buildConstant(constant), | |
| 2588 operator: operator, | |
| 2589 rhs: rhs, | |
| 2590 setValue: (value) {}); // The binary operator will throw before this. | |
| 2591 } | |
| 2592 | |
| 2593 @override | |
| 2594 ir.Primitive errorTypedefTypeLiteralPostfix( | |
| 2595 ast.Send node, | |
| 2596 ConstantExpression constant, | |
| 2597 op.IncDecOperator operator, _) { | |
| 2598 return translatePrefixPostfix( | |
| 2599 getValue: () => irBuilder.buildConstant(constant), | |
| 2600 operator: operator, | |
| 2601 setValue: (value) {}, // The binary operator will throw before this. | |
| 2602 isPrefix: false); | |
| 2603 } | |
| 2604 | |
| 2605 @override | |
| 2606 ir.Primitive errorTypedefTypeLiteralPrefix( | |
| 2607 ast.Send node, | |
| 2608 TypeConstantExpression constant, | |
| 2609 op.IncDecOperator operator, _) { | |
| 2610 return translatePrefixPostfix( | |
| 2611 getValue: () => irBuilder.buildConstant(constant), | |
| 2612 operator: operator, | |
| 2613 setValue: (value) {}, // The binary operator will throw before this. | |
| 2614 isPrefix: true); | |
| 2615 } | |
| 2616 | |
| 2617 ir.RootNode nullIfGiveup(ir.RootNode action()) { | 1991 ir.RootNode nullIfGiveup(ir.RootNode action()) { |
| 2618 try { | 1992 try { |
| 2619 return action(); | 1993 return action(); |
| 2620 } catch(e) { | 1994 } catch(e) { |
| 2621 if (e == ABORT_IRNODE_BUILDER) { | 1995 if (e == ABORT_IRNODE_BUILDER) { |
| 2622 return null; | 1996 return null; |
| 2623 } | 1997 } |
| 2624 rethrow; | 1998 rethrow; |
| 2625 } | 1999 } |
| 2626 } | 2000 } |
| (...skipping 1075 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3702 node.body = replacementFor(node.body); | 3076 node.body = replacementFor(node.body); |
| 3703 } | 3077 } |
| 3704 } | 3078 } |
| 3705 | 3079 |
| 3706 /// Visit a just-deleted subterm and unlink all [Reference]s in it. | 3080 /// Visit a just-deleted subterm and unlink all [Reference]s in it. |
| 3707 class RemovalVisitor extends ir.RecursiveVisitor { | 3081 class RemovalVisitor extends ir.RecursiveVisitor { |
| 3708 processReference(ir.Reference reference) { | 3082 processReference(ir.Reference reference) { |
| 3709 reference.unlink(); | 3083 reference.unlink(); |
| 3710 } | 3084 } |
| 3711 } | 3085 } |
| OLD | NEW |