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

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

Issue 1126173002: Refactor handling of compounds. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Update status. 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 | Annotate | Revision Log
« 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 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 1081 matching lines...) Expand 10 before | Expand all | Expand 10 after
1239 @override 1240 @override
1240 ir.Primitive visitSuperIndexSet( 1241 ir.Primitive visitSuperIndexSet(
1241 ast.SendSet node, 1242 ast.SendSet node,
1242 FunctionElement function, 1243 FunctionElement function,
1243 ast.Node index, 1244 ast.Node index,
1244 ast.Node rhs, 1245 ast.Node rhs,
1245 _) { 1246 _) {
1246 return irBuilder.buildSuperIndexSet(function, visit(index), visit(rhs)); 1247 return irBuilder.buildSuperIndexSet(function, visit(index), visit(rhs));
1247 } 1248 }
1248 1249
1249 @override 1250 ir.Primitive translateCompounds(
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(
1296 {ir.Primitive getValue(), 1251 {ir.Primitive getValue(),
1297 op.IncDecOperator operator, 1252 CompoundRhs rhs,
1298 void setValue(ir.Primitive value), 1253 void setValue(ir.Primitive value)}) {
1299 bool isPrefix}) {
1300 ir.Primitive value = getValue(); 1254 ir.Primitive value = getValue();
1301 Selector operatorSelector = 1255 Selector operatorSelector =
1302 new Selector.binaryOperator(operator.selectorName); 1256 new Selector.binaryOperator(rhs.operator.selectorName);
1303 List<ir.Primitive> arguments = 1257 ir.Primitive rhsValue;
1304 <ir.Primitive>[irBuilder.buildIntegerConstant(1)]; 1258 if (rhs.kind == CompoundKind.ASSIGNMENT) {
1259 rhsValue = visit(rhs.rhs);
1260 } else {
1261 rhsValue = irBuilder.buildIntegerConstant(1);
1262 }
1263 List<ir.Primitive> arguments = <ir.Primitive>[rhsValue];
1305 arguments = normalizeDynamicArguments( 1264 arguments = normalizeDynamicArguments(
1306 operatorSelector.callStructure, arguments); 1265 operatorSelector.callStructure, arguments);
1307 ir.Primitive result = 1266 ir.Primitive result =
1308 irBuilder.buildDynamicInvocation(value, operatorSelector, arguments); 1267 irBuilder.buildDynamicInvocation(value, operatorSelector, arguments);
1309 setValue(result); 1268 setValue(result);
1310 return isPrefix ? result : value; 1269 return rhs.kind == CompoundKind.POSTFIX ? value : result;
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;
1328 } 1270 }
1329 1271
1330 @override 1272 @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
1369 ir.Primitive handleDynamicSet( 1273 ir.Primitive handleDynamicSet(
1370 ast.SendSet node, 1274 ast.SendSet node,
1371 ast.Node receiver, 1275 ast.Node receiver,
1372 Selector selector, 1276 Selector selector,
1373 ast.Node rhs, 1277 ast.Node rhs,
1374 _) { 1278 _) {
1375 return irBuilder.buildDynamicSet( 1279 return irBuilder.buildDynamicSet(
1376 translateReceiver(receiver), 1280 translateReceiver(receiver),
1377 selector, 1281 selector,
1378 visit(rhs)); 1282 visit(rhs));
1379 } 1283 }
1380 1284
1381 @override 1285 @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
1414 ir.Primitive handleLocalSet( 1286 ir.Primitive handleLocalSet(
1415 ast.SendSet node, 1287 ast.SendSet node,
1416 LocalElement element, 1288 LocalElement element,
1417 ast.Node rhs, 1289 ast.Node rhs,
1418 _) { 1290 _) {
1419 return irBuilder.buildLocalVariableSet(element, visit(rhs)); 1291 return irBuilder.buildLocalVariableSet(element, visit(rhs));
1420 } 1292 }
1421 1293
1422 @override 1294 @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
1457 ir.Primitive handleStaticFieldSet( 1295 ir.Primitive handleStaticFieldSet(
1458 ast.SendSet node, 1296 ast.SendSet node,
1459 FieldElement field, 1297 FieldElement field,
1460 ast.Node rhs, 1298 ast.Node rhs,
1461 _) { 1299 _) {
1462 return irBuilder.buildStaticFieldSet(field, visit(rhs)); 1300 return irBuilder.buildStaticFieldSet(field, visit(rhs));
1463 } 1301 }
1464 1302
1465 @override 1303 @override
1466 ir.Primitive visitSuperFieldSet( 1304 ir.Primitive visitSuperFieldSet(
1467 ast.SendSet node, 1305 ast.SendSet node,
1468 FieldElement field, 1306 FieldElement field,
1469 ast.Node rhs, 1307 ast.Node rhs,
1470 _) { 1308 _) {
1471 return irBuilder.buildSuperFieldSet(field, visit(rhs)); 1309 return irBuilder.buildSuperFieldSet(field, visit(rhs));
1472 } 1310 }
1473 1311
1474 @override 1312 @override
1475 ir.Primitive visitSuperSetterSet( 1313 ir.Primitive visitSuperSetterSet(
1476 ast.SendSet node, 1314 ast.SendSet node,
1477 FunctionElement setter, 1315 FunctionElement setter,
1478 ast.Node rhs, 1316 ast.Node rhs,
1479 _) { 1317 _) {
1480 return irBuilder.buildSuperSetterSet(setter, visit(rhs)); 1318 return irBuilder.buildSuperSetterSet(setter, visit(rhs));
1481 } 1319 }
1482 1320
1483 @override 1321 @override
1484 ir.Primitive handleStaticGetterSetterCompound( 1322 ir.Primitive visitUnresolvedSuperIndexSet(
1485 ast.Send node, 1323 ast.Send node,
1486 FunctionElement getter, 1324 Element element,
1325 ast.Node index,
1326 ast.Node rhs,
1327 arg) {
1328 return giveup(node, 'visitUnresolvedSuperIndexSet');
1329 }
1330
1331 @override
1332 ir.Primitive handleStaticSetterSet(
1333 ast.SendSet node,
1487 FunctionElement setter, 1334 FunctionElement setter,
1488 op.AssignmentOperator operator,
1489 ast.Node rhs, 1335 ast.Node rhs,
1490 _) { 1336 _) {
1491 return translateCompound( 1337 return irBuilder.buildStaticSetterSet(setter, visit(rhs));
1492 getValue: () => irBuilder.buildStaticGetterGet(getter), 1338 }
1493 operator: operator, 1339
1494 rhs: rhs, 1340 @override
1495 setValue: (ir.Primitive result) { 1341 ir.Primitive handleTypeLiteralConstantCompounds(
1496 irBuilder.buildStaticSetterSet(setter, result); 1342 ast.SendSet node,
1497 }); 1343 ConstantExpression constant,
1498 } 1344 CompoundRhs rhs,
1499 1345 arg) {
1500 @override 1346 return translateCompounds(
1501 ir.Primitive handleSuperFieldFieldPostfixPrefix( 1347 getValue: () => irBuilder.buildConstant(constant),
1502 ast.Send node, 1348 rhs: rhs,
1503 FieldElement readField, 1349 setValue: (value) {}); // The binary operator will throw before this.
1504 FieldElement writtenField, 1350 }
1505 op.IncDecOperator operator, 1351
1506 arg, 1352 @override
1507 {bool isPrefix}) { 1353 ir.Primitive handleDynamicCompounds(
1508 return translatePrefixPostfix(
1509 getValue: () => irBuilder.buildSuperFieldGet(readField),
1510 operator: operator,
1511 setValue: (ir.Primitive result) {
1512 irBuilder.buildSuperFieldSet(writtenField, result);
1513 },
1514 isPrefix: isPrefix);
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(
1638 ast.Send node, 1354 ast.Send node,
1639 ast.Node receiver, 1355 ast.Node receiver,
1356 CompoundRhs rhs,
1357 Selector getterSelector,
1358 Selector setterSelector,
1359 arg) {
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,
1640 ast.Node index, 1513 ast.Node index,
1641 op.IncDecOperator operator, 1514 CompoundRhs rhs,
1642 arg, 1515 arg) {
1643 {bool isPrefix}) {
1644 ir.Primitive target = visit(receiver); 1516 ir.Primitive target = visit(receiver);
1645 ir.Primitive indexValue = visit(index); 1517 ir.Primitive indexValue = visit(index);
1646 return translatePrefixPostfix( 1518 return translateCompounds(
1647 getValue: () { 1519 getValue: () {
1648 Selector selector = new Selector.index(); 1520 Selector selector = new Selector.index();
1649 List<ir.Primitive> arguments = <ir.Primitive>[indexValue]; 1521 List<ir.Primitive> arguments = <ir.Primitive>[indexValue];
1650 arguments = 1522 arguments =
1651 normalizeDynamicArguments(selector.callStructure, arguments); 1523 normalizeDynamicArguments(selector.callStructure, arguments);
1652 return irBuilder.buildDynamicInvocation(target, selector, arguments); 1524 return irBuilder.buildDynamicInvocation(target, selector, arguments);
1653 }, 1525 },
1654 operator: operator, 1526 rhs: rhs,
1655 setValue: (ir.Primitive result) { 1527 setValue: (ir.Primitive result) {
1656 Selector selector = new Selector.indexSet(); 1528 irBuilder.buildDynamicIndexSet(target, indexValue, result);
1657 List<ir.Primitive> arguments = <ir.Primitive>[indexValue, result]; 1529 });
1658 arguments = 1530 }
1659 normalizeDynamicArguments(selector.callStructure, arguments); 1531
1660 irBuilder.buildDynamicInvocation(target, selector, arguments); 1532 @override
1661 }, 1533 ir.Primitive handleSuperIndexCompounds(
1662 isPrefix: isPrefix); 1534 ast.SendSet node,
1663 } 1535 Element indexFunction,
1664 1536 Element indexSetFunction,
1665 @override
1666 ir.Primitive handleSuperIndexPostfixPrefix(
1667 ast.Send node,
1668 FunctionElement indexFunction,
1669 FunctionElement indexSetFunction,
1670 ast.Node index, 1537 ast.Node index,
1671 op.IncDecOperator operator, 1538 CompoundRhs rhs,
1672 arg, 1539 arg,
1673 {bool isPrefix}) { 1540 {bool isGetterValid,
1541 bool isSetterValid}) {
1674 ir.Primitive indexValue = visit(index); 1542 ir.Primitive indexValue = visit(index);
1675 return translatePrefixPostfix( 1543 return translateCompounds(
1676 getValue: () { 1544 getValue: () {
1677 return irBuilder.buildSuperIndex(indexFunction, indexValue); 1545 if (isGetterValid) {
1678 }, 1546 return irBuilder.buildSuperIndex(indexFunction, indexValue);
1679 operator: operator, 1547 } else {
1680 setValue: (ir.Primitive result) { 1548 return buildInstanceNoSuchMethod(
1681 irBuilder.buildSuperIndexSet(indexSetFunction, indexValue, result); 1549 new Selector.index(), <ir.Primitive>[indexValue]);
1682 }, 1550 }
1683 isPrefix: isPrefix); 1551 },
1684 } 1552 rhs: rhs,
1685 1553 setValue: (ir.Primitive result) {
1686 @override 1554 if (isSetterValid) {
1687 ir.Primitive handleUnresolvedSuperGetterIndexPostfixPrefix( 1555 irBuilder.buildSuperIndexSet(indexSetFunction, indexValue, result);
1688 ast.Send node, 1556 } else {
1689 Element element, 1557 buildInstanceNoSuchMethod(
1690 ast.Node index, 1558 new Selector.indexSet(), <ir.Primitive>[indexValue, result]);
1691 op.IncDecOperator operator, 1559 }
1692 arg, 1560 });
1693 {bool isPrefix}) { 1561 }
1694 return giveup(node, 'handleSuperUnresolvedGetterIndexPostfixPrefix'); 1562
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(
1744 ast.SendSet node,
1745 FunctionElement setter,
1746 ast.Node rhs,
1747 _) {
1748 return irBuilder.buildStaticSetterSet(setter, visit(rhs));
1749 }
1750
1751 @override
1752 ir.Primitive visitSuperFieldCompound(
1753 ast.Send node,
1754 FieldElement field,
1755 op.AssignmentOperator operator,
1756 ast.Node rhs,
1757 _) {
1758 return translateCompound(
1759 getValue: () => irBuilder.buildSuperFieldGet(field),
1760 operator: operator,
1761 rhs: rhs,
1762 setValue: (ir.Primitive result) {
1763 irBuilder.buildSuperFieldSet(field, result);
1764 });
1765 }
1766
1767 @override
1768 ir.Primitive visitSuperFieldFieldPostfix(
1769 ast.Send node,
1770 FieldElement readField,
1771 FieldElement writtenField,
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
1867 ir.Primitive visitStringJuxtaposition(ast.StringJuxtaposition node) { 1563 ir.Primitive visitStringJuxtaposition(ast.StringJuxtaposition node) {
1868 assert(irBuilder.isOpen); 1564 assert(irBuilder.isOpen);
1869 ir.Primitive first = visit(node.first); 1565 ir.Primitive first = visit(node.first);
1870 ir.Primitive second = visit(node.second); 1566 ir.Primitive second = visit(node.second);
1871 return irBuilder.buildStringConcatenation([first, second]); 1567 return irBuilder.buildStringConcatenation([first, second]);
1872 } 1568 }
1873 1569
1874 ir.Primitive visitStringInterpolation(ast.StringInterpolation node) { 1570 ir.Primitive visitStringInterpolation(ast.StringInterpolation node) {
1875 assert(irBuilder.isOpen); 1571 assert(irBuilder.isOpen);
1876 List<ir.Primitive> arguments = []; 1572 List<ir.Primitive> arguments = [];
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1913 ast.Send node, 1609 ast.Send node,
1914 ast.NodeList arguments, _) { 1610 ast.NodeList arguments, _) {
1915 if (compiler.enableUserAssertions) { 1611 if (compiler.enableUserAssertions) {
1916 return giveup(node, 'Assert'); 1612 return giveup(node, 'Assert');
1917 } else { 1613 } else {
1918 return irBuilder.buildNullConstant(); 1614 return irBuilder.buildNullConstant();
1919 } 1615 }
1920 } 1616 }
1921 1617
1922 @override 1618 @override
1923 ir.Primitive errorUnresolvedCompound( 1619 ir.Primitive visitUnresolvedCompound(
1924 ast.Send node, 1620 ast.Send node,
1925 Element element, 1621 Element element,
1926 op.AssignmentOperator operator, 1622 op.AssignmentOperator operator,
1927 ast.Node rhs, _) { 1623 ast.Node rhs, _) {
1928 // TODO(asgerf): What is unresolved? The getter and/or the setter? 1624 // TODO(asgerf): What is unresolved? The getter and/or the setter?
1929 // If it was the setter, we must evaluate the right-hand side. 1625 // If it was the setter, we must evaluate the right-hand side.
1930 return buildStaticNoSuchMethod(elements.getSelector(node), []); 1626 return buildStaticNoSuchMethod(elements.getSelector(node), []);
1931 } 1627 }
1932 1628
1933 @override 1629 @override
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1975 ir.Primitive visitUnresolvedInvoke( 1671 ir.Primitive visitUnresolvedInvoke(
1976 ast.Send node, 1672 ast.Send node,
1977 Element element, 1673 Element element,
1978 ast.NodeList arguments, 1674 ast.NodeList arguments,
1979 Selector selector, _) { 1675 Selector selector, _) {
1980 return buildStaticNoSuchMethod(elements.getSelector(node), 1676 return buildStaticNoSuchMethod(elements.getSelector(node),
1981 arguments.nodes.mapToList(visit)); 1677 arguments.nodes.mapToList(visit));
1982 } 1678 }
1983 1679
1984 @override 1680 @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
2003 ir.Primitive visitUnresolvedRedirectingFactoryConstructorInvoke( 1681 ir.Primitive visitUnresolvedRedirectingFactoryConstructorInvoke(
2004 ast.NewExpression node, 1682 ast.NewExpression node,
2005 ConstructorElement constructor, 1683 ConstructorElement constructor,
2006 InterfaceType type, 1684 InterfaceType type,
2007 ast.NodeList arguments, 1685 ast.NodeList arguments,
2008 CallStructure callStructure, _) { 1686 CallStructure callStructure, _) {
2009 String nameString = Elements.reconstructConstructorName(constructor); 1687 String nameString = Elements.reconstructConstructorName(constructor);
2010 Name name = new Name(nameString, constructor.library); 1688 Name name = new Name(nameString, constructor.library);
2011 return buildStaticNoSuchMethod( 1689 return buildStaticNoSuchMethod(
2012 new Selector(SelectorKind.CALL, name, callStructure), 1690 new Selector(SelectorKind.CALL, name, callStructure),
2013 translateDynamicArguments(arguments, callStructure)); 1691 translateDynamicArguments(arguments, callStructure));
2014 } 1692 }
2015 1693
2016 @override 1694 @override
2017 ir.Primitive errorUnresolvedSet( 1695 ir.Primitive errorUnresolvedSet(
2018 ast.Send node, 1696 ast.Send node,
2019 Element element, 1697 Element element,
2020 ast.Node rhs, _) { 1698 ast.Node rhs, _) {
2021 return buildStaticNoSuchMethod(elements.getSelector(node), [visit(rhs)]); 1699 return buildStaticNoSuchMethod(elements.getSelector(node), [visit(rhs)]);
2022 } 1700 }
2023 1701
2024 @override 1702 @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
2037 ir.Primitive visitUnresolvedSuperIndex( 1703 ir.Primitive visitUnresolvedSuperIndex(
2038 ast.Send node, 1704 ast.Send node,
2039 Element function, 1705 Element function,
2040 ast.Node index, _) { 1706 ast.Node index, _) {
2041 // Assume the index getter is missing. 1707 // Assume the index getter is missing.
2042 Selector selector = useSelectorTypeOfNode(new Selector.index(), node); 1708 Selector selector = useSelectorTypeOfNode(new Selector.index(), node);
2043 return buildInstanceNoSuchMethod(selector, [visit(index)]); 1709 return buildInstanceNoSuchMethod(selector, [visit(index)]);
2044 } 1710 }
2045 1711
2046 @override 1712 @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
2081 ir.Primitive visitUnresolvedSuperBinary( 1713 ir.Primitive visitUnresolvedSuperBinary(
2082 ast.Send node, 1714 ast.Send node,
2083 Element element, 1715 Element element,
2084 op.BinaryOperator operator, 1716 op.BinaryOperator operator,
2085 ast.Node argument, _) { 1717 ast.Node argument, _) {
2086 return buildInstanceNoSuchMethod( 1718 return buildInstanceNoSuchMethod(
2087 elements.getSelector(node), 1719 elements.getSelector(node),
2088 [visit(argument)]); 1720 [visit(argument)]);
2089 } 1721 }
2090 1722
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
2197 ir.Primitive visitAbstractClassConstructorInvoke( 1829 ir.Primitive visitAbstractClassConstructorInvoke(
2198 ast.NewExpression node, 1830 ast.NewExpression node,
2199 ConstructorElement element, 1831 ConstructorElement element,
2200 InterfaceType type, 1832 InterfaceType type,
2201 ast.NodeList arguments, 1833 ast.NodeList arguments,
2202 CallStructure callStructure, _) { 1834 CallStructure callStructure, _) {
2203 return buildAbstractClassInstantiationError(element.enclosingClass); 1835 return buildAbstractClassInstantiationError(element.enclosingClass);
2204 } 1836 }
2205 1837
2206 @override 1838 @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
2295 ir.Primitive errorFinalLocalVariableSet( 1839 ir.Primitive errorFinalLocalVariableSet(
2296 ast.SendSet node, 1840 ast.SendSet node,
2297 LocalVariableElement variable, 1841 LocalVariableElement variable,
2298 ast.Node rhs, _) { 1842 ast.Node rhs, _) {
2299 Selector selector = new Selector.setter(variable.name, null); 1843 Selector selector = new Selector.setter(variable.name, null);
2300 return buildStaticNoSuchMethod(selector, [visit(rhs)]); 1844 return buildStaticNoSuchMethod(selector, [visit(rhs)]);
2301 } 1845 }
2302 1846
2303 @override 1847 @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
2318 ir.Primitive errorFinalParameterSet( 1848 ir.Primitive errorFinalParameterSet(
2319 ast.SendSet node, 1849 ast.SendSet node,
2320 ParameterElement parameter, 1850 ParameterElement parameter,
2321 ast.Node rhs, _) { 1851 ast.Node rhs, _) {
2322 Selector selector = new Selector.setter(parameter.name, null); 1852 Selector selector = new Selector.setter(parameter.name, null);
2323 return buildStaticNoSuchMethod(selector, [visit(rhs)]); 1853 return buildStaticNoSuchMethod(selector, [visit(rhs)]);
2324 } 1854 }
2325 1855
2326 @override 1856 @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
2342 ir.Primitive errorFinalStaticFieldSet( 1857 ir.Primitive errorFinalStaticFieldSet(
2343 ast.SendSet node, 1858 ast.SendSet node,
2344 FieldElement field, 1859 FieldElement field,
2345 ast.Node rhs, _) { 1860 ast.Node rhs, _) {
2346 // TODO(asgerf): Include class name somehow? 1861 // TODO(asgerf): Include class name somehow?
2347 return buildStaticNoSuchMethod( 1862 return buildStaticNoSuchMethod(
2348 new Selector.setter(field.name, field.library), 1863 new Selector.setter(field.name, field.library),
2349 [visit(rhs)]); 1864 [visit(rhs)]);
2350 } 1865 }
2351 1866
2352 @override 1867 @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
2369 ir.Primitive errorFinalSuperFieldSet( 1868 ir.Primitive errorFinalSuperFieldSet(
2370 ast.SendSet node, 1869 ast.SendSet node,
2371 FieldElement field, 1870 FieldElement field,
2372 ast.Node rhs, _) { 1871 ast.Node rhs, _) {
2373 Selector selector = useSelectorTypeOfNode( 1872 Selector selector = useSelectorTypeOfNode(
2374 new Selector.setter(field.name, field.library), 1873 new Selector.setter(field.name, field.library),
2375 node); 1874 node);
2376 return buildInstanceNoSuchMethod(selector, [visit(rhs)]); 1875 return buildInstanceNoSuchMethod(selector, [visit(rhs)]);
2377 } 1876 }
2378 1877
2379 @override 1878 @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
2395 ir.Primitive errorFinalTopLevelFieldSet( 1879 ir.Primitive errorFinalTopLevelFieldSet(
2396 ast.SendSet node, 1880 ast.SendSet node,
2397 FieldElement field, 1881 FieldElement field,
2398 ast.Node rhs, _) { 1882 ast.Node rhs, _) {
2399 return buildStaticNoSuchMethod( 1883 return buildStaticNoSuchMethod(
2400 new Selector.setter(field.name, field.library), 1884 new Selector.setter(field.name, field.library),
2401 [visit(rhs)]); 1885 [visit(rhs)]);
2402 } 1886 }
2403 1887
2404 @override 1888 @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
2444 ir.Primitive errorLocalFunctionSet( 1889 ir.Primitive errorLocalFunctionSet(
2445 ast.SendSet node, 1890 ast.SendSet node,
2446 LocalFunctionElement function, 1891 LocalFunctionElement function,
2447 ast.Node rhs, _) { 1892 ast.Node rhs, _) {
2448 return buildStaticNoSuchMethod( 1893 return buildStaticNoSuchMethod(
2449 new Selector.setter(function.name, null), 1894 new Selector.setter(function.name, null),
2450 [visit(rhs)]); 1895 [visit(rhs)]);
2451 } 1896 }
2452 1897
2453 @override 1898 @override
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
2538 CallStructure callStructure, _) { 1983 CallStructure callStructure, _) {
2539 List<ir.Primitive> args = 1984 List<ir.Primitive> args =
2540 translateDynamicArguments(arguments, callStructure); 1985 translateDynamicArguments(arguments, callStructure);
2541 Name name = new Name(setter.name, setter.library); 1986 Name name = new Name(setter.name, setter.library);
2542 Selector selector = useSelectorTypeOfNode( 1987 Selector selector = useSelectorTypeOfNode(
2543 new Selector(SelectorKind.CALL, name, callStructure), 1988 new Selector(SelectorKind.CALL, name, callStructure),
2544 node); 1989 node);
2545 return buildInstanceNoSuchMethod(selector, args); 1990 return buildInstanceNoSuchMethod(selector, args);
2546 } 1991 }
2547 1992
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
2622 ir.RootNode nullIfGiveup(ir.RootNode action()) { 1993 ir.RootNode nullIfGiveup(ir.RootNode action()) {
2623 try { 1994 try {
2624 return action(); 1995 return action();
2625 } catch(e) { 1996 } catch(e) {
2626 if (e == ABORT_IRNODE_BUILDER) { 1997 if (e == ABORT_IRNODE_BUILDER) {
2627 return null; 1998 return null;
2628 } 1999 }
2629 rethrow; 2000 rethrow;
2630 } 2001 }
2631 } 2002 }
(...skipping 1135 matching lines...) Expand 10 before | Expand all | Expand 10 after
3767 node.body = replacementFor(node.body); 3138 node.body = replacementFor(node.body);
3768 } 3139 }
3769 } 3140 }
3770 3141
3771 /// Visit a just-deleted subterm and unlink all [Reference]s in it. 3142 /// Visit a just-deleted subterm and unlink all [Reference]s in it.
3772 class RemovalVisitor extends ir.RecursiveVisitor { 3143 class RemovalVisitor extends ir.RecursiveVisitor {
3773 processReference(ir.Reference reference) { 3144 processReference(ir.Reference reference) {
3774 reference.unlink(); 3145 reference.unlink();
3775 } 3146 }
3776 } 3147 }
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