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

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