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

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

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

Powered by Google App Engine
This is Rietveld 408576698