| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 // Utilities for building JS ASTs at runtime. Contains a builder class | 5 // Utilities for building JS ASTs at runtime. Contains a builder class |
| 6 // and a parser that parses part of the language. | 6 // and a parser that parses part of the language. |
| 7 | 7 |
| 8 part of js_ast; | 8 part of js_ast; |
| 9 | 9 |
| 10 | 10 |
| (...skipping 751 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 762 } | 762 } |
| 763 return new ArrayInitializer(values); | 763 return new ArrayInitializer(values); |
| 764 } else if (last != null && last.startsWith("/")) { | 764 } else if (last != null && last.startsWith("/")) { |
| 765 String regexp = getDelimited(lastPosition); | 765 String regexp = getDelimited(lastPosition); |
| 766 getToken(); | 766 getToken(); |
| 767 String flags = lastToken; | 767 String flags = lastToken; |
| 768 if (!acceptCategory(ALPHA)) flags = ""; | 768 if (!acceptCategory(ALPHA)) flags = ""; |
| 769 Expression expression = new RegExpLiteral(regexp + flags); | 769 Expression expression = new RegExpLiteral(regexp + flags); |
| 770 return expression; | 770 return expression; |
| 771 } else if (acceptCategory(HASH)) { | 771 } else if (acceptCategory(HASH)) { |
| 772 var nameOrPosition = parseHash(); | 772 return parseInterpolatedExpression(); |
| 773 InterpolatedExpression expression = | |
| 774 new InterpolatedExpression(nameOrPosition); | |
| 775 interpolatedValues.add(expression); | |
| 776 return expression; | |
| 777 } else { | 773 } else { |
| 778 error("Expected primary expression"); | 774 error("Expected primary expression"); |
| 779 return null; | 775 return null; |
| 780 } | 776 } |
| 781 } | 777 } |
| 782 | 778 |
| 779 InterpolatedExpression parseInterpolatedExpression() { |
| 780 var expression = new InterpolatedExpression(parseHash()); |
| 781 interpolatedValues.add(expression); |
| 782 return expression; |
| 783 } |
| 784 |
| 783 /** | 785 /** |
| 784 * CoverParenthesizedExpressionAndArrowParameterList[Yield] : | 786 * CoverParenthesizedExpressionAndArrowParameterList[Yield] : |
| 785 * ( Expression ) | 787 * ( Expression ) |
| 786 * ( ) | 788 * ( ) |
| 787 * ( ... BindingIdentifier ) | 789 * ( ... BindingIdentifier ) |
| 788 * ( Expression , ... BindingIdentifier ) | 790 * ( Expression , ... BindingIdentifier ) |
| 789 */ | 791 */ |
| 790 Expression parseExpressionOrArrowFunction() { | 792 Expression parseExpressionOrArrowFunction() { |
| 791 if (acceptCategory(RPAREN)) { | 793 if (acceptCategory(RPAREN)) { |
| 792 expectCategory(ARROW); | 794 expectCategory(ARROW); |
| (...skipping 674 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1467 * - method names: `#() { ... }` | 1469 * - method names: `#() { ... }` |
| 1468 * - property names: `#: ...` | 1470 * - property names: `#: ...` |
| 1469 * - entire methods: `#` | 1471 * - entire methods: `#` |
| 1470 */ | 1472 */ |
| 1471 Property parseMethodOrProperty({bool onlyMethods: false}) { | 1473 Property parseMethodOrProperty({bool onlyMethods: false}) { |
| 1472 bool isStatic = acceptString('static'); | 1474 bool isStatic = acceptString('static'); |
| 1473 | 1475 |
| 1474 bool isGetter = false; | 1476 bool isGetter = false; |
| 1475 bool isSetter = false; | 1477 bool isSetter = false; |
| 1476 Expression name = null; | 1478 Expression name = null; |
| 1479 bool propertyNameIsIdentifier = lastCategory == ALPHA; |
| 1477 if (acceptCategory(HASH)) { | 1480 if (acceptCategory(HASH)) { |
| 1478 if (lastCategory != LPAREN && (onlyMethods || lastCategory != COLON)) { | 1481 if (lastCategory != LPAREN && (onlyMethods || lastCategory != COLON)) { |
| 1479 // Interpolated method | 1482 // Interpolated method |
| 1480 var member = new InterpolatedMethod(parseHash()); | 1483 var member = new InterpolatedMethod(parseHash()); |
| 1481 interpolatedValues.add(member); | 1484 interpolatedValues.add(member); |
| 1482 return member; | 1485 return member; |
| 1483 } | 1486 } |
| 1484 var interpolated = new InterpolatedExpression(parseHash()); | 1487 name = parseInterpolatedExpression(); |
| 1485 interpolatedValues.add(interpolated); | |
| 1486 name = interpolated; | |
| 1487 } else { | 1488 } else { |
| 1488 name = parsePropertyName(); | 1489 name = parsePropertyName(); |
| 1489 } | 1490 } |
| 1490 | 1491 |
| 1491 // Allow get or set to be followed by another property name. | 1492 // Allow get or set to be followed by another property name. |
| 1492 if (name is PropertyName && | 1493 if (propertyNameIsIdentifier && |
| 1493 (lastCategory == ALPHA || lastCategory == HASH)) { | 1494 (lastCategory == ALPHA || lastCategory == HASH)) { |
| 1494 PropertyName p = name; | 1495 LiteralString p = name; |
| 1495 isGetter = p.name == 'get'; | 1496 isGetter = p.value == '"get"'; |
| 1496 isSetter = p.name == 'set'; | 1497 isSetter = p.value == '"set"'; |
| 1497 if (isGetter || isSetter) { | 1498 if (isGetter || isSetter) { |
| 1498 name = parsePropertyName(); | 1499 name = parsePropertyName(); |
| 1499 } | 1500 } |
| 1500 } | 1501 } |
| 1501 | 1502 |
| 1502 if (!onlyMethods && acceptCategory(COLON)) { | 1503 if (!onlyMethods && acceptCategory(COLON)) { |
| 1503 Expression value = parseAssignment(); | 1504 Expression value = parseAssignment(); |
| 1504 return new Property(name, value); | 1505 return new Property(name, value); |
| 1505 } else { | 1506 } else { |
| 1506 var fun = parseFun(); | 1507 var fun = parseFun(); |
| 1507 return new Method(name, fun, | 1508 return new Method(name, fun, |
| 1508 isGetter: isGetter, isSetter: isSetter, isStatic: isStatic); | 1509 isGetter: isGetter, isSetter: isSetter, isStatic: isStatic); |
| 1509 } | 1510 } |
| 1510 } | 1511 } |
| 1511 | 1512 |
| 1512 Expression parsePropertyName() { | 1513 Expression parsePropertyName() { |
| 1513 String identifier = lastToken; | 1514 String identifier = lastToken; |
| 1514 if (acceptCategory(ALPHA)) { | 1515 if (acceptCategory(STRING)) { |
| 1515 return new PropertyName(identifier); | |
| 1516 } else if (acceptCategory(STRING)) { | |
| 1517 return new LiteralString(identifier); | 1516 return new LiteralString(identifier); |
| 1518 } else if (acceptCategory(SYMBOL)) { | 1517 } else if (acceptCategory(ALPHA) || acceptCategory(SYMBOL)) { |
| 1519 // e.g. void | 1518 // ALPHA or a SYMBOL, e.g. void |
| 1520 return new LiteralString('"$identifier"'); | 1519 return new LiteralString('"$identifier"'); |
| 1521 } else if (acceptCategory(LSQUARE)) { | 1520 } else if (acceptCategory(LSQUARE)) { |
| 1522 var expr = parseAssignment(); | 1521 var expr = parseAssignment(); |
| 1523 expectCategory(RSQUARE); | 1522 expectCategory(RSQUARE); |
| 1524 return expr; | 1523 return expr; |
| 1525 } else if (acceptCategory(HASH)) { | 1524 } else if (acceptCategory(HASH)) { |
| 1526 var member = new InterpolatedPropertyName(parseHash()); | 1525 return parseInterpolatedExpression(); |
| 1527 interpolatedValues.add(member); | |
| 1528 return member; | |
| 1529 } else { | 1526 } else { |
| 1530 error('Expected property name'); | 1527 error('Expected property name'); |
| 1531 return null; | 1528 return null; |
| 1532 } | 1529 } |
| 1533 } | 1530 } |
| 1534 } | 1531 } |
| OLD | NEW |