| Index: lib/src/js/builder.dart
|
| diff --git a/lib/src/js/builder.dart b/lib/src/js/builder.dart
|
| index 6914b4ac96a187385df146dace080648b0bd2c28..dfedaa2c461a1a274cbe4277dca9fa6228b75e9d 100644
|
| --- a/lib/src/js/builder.dart
|
| +++ b/lib/src/js/builder.dart
|
| @@ -894,26 +894,10 @@ class MiniJsParser {
|
| // PropertyDefinition :
|
| // PropertyName : AssignmentExpression
|
| // MethodDefinition
|
| + properties.add(parseMethodOrProperty());
|
|
|
| - if (acceptCategory(HASH)) {
|
| - properties.add(parseInterpolatedMember());
|
| - } else {
|
| - bool isGetter = acceptString('get');
|
| - bool isSetter = isGetter ? false : acceptString('set');
|
| - Expression name = parsePropertyName();
|
| -
|
| - if (lastCategory == LPAREN) {
|
| - Fun fun = parseFun();
|
| - properties.add(
|
| - new Method(name, fun, isGetter: isGetter, isSetter: isSetter));
|
| - } else {
|
| - expectCategory(COLON);
|
| - Expression value = parseAssignment();
|
| - properties.add(new Property(name, value));
|
| - }
|
| - if (acceptCategory(RBRACE)) break;
|
| - expectCategory(COMMA);
|
| - }
|
| + if (acceptCategory(RBRACE)) break;
|
| + expectCategory(COMMA);
|
| }
|
| return new ObjectInitializer(properties);
|
| }
|
| @@ -1467,28 +1451,59 @@ class MiniJsParser {
|
| expectCategory(LBRACE);
|
| var methods = new List<Method>();
|
| while (lastCategory != RBRACE) {
|
| - methods.add(parseMethod());
|
| + methods.add(parseMethodOrProperty(onlyMethods: true));
|
| }
|
| expectCategory(RBRACE);
|
| return new ClassExpression(name, heritage, methods);
|
| }
|
|
|
| - Method parseMethod() {
|
| - if (acceptCategory(HASH)) return parseInterpolatedMember();
|
| -
|
| + /**
|
| + * Parses a [Method] or a [Property].
|
| + *
|
| + * Most of the complexity is from supporting interpolation. Several forms
|
| + * are supported:
|
| + *
|
| + * - getter/setter names: `get #() { ... }`
|
| + * - method names: `#() { ... }`
|
| + * - property names: `#: ...`
|
| + * - entire methods: `#`
|
| + */
|
| + Property parseMethodOrProperty({bool onlyMethods: false}) {
|
| bool isStatic = acceptString('static');
|
| - bool isGetter = acceptString('get');
|
| - bool isSetter = isGetter ? false : acceptString('set');
|
| - var name = parsePropertyName();
|
| - var fun = parseFun();
|
| - return new Method(name, fun,
|
| - isGetter: isGetter, isSetter: isSetter, isStatic: isStatic);
|
| - }
|
|
|
| - InterpolatedMethod parseInterpolatedMember() {
|
| - var member = new InterpolatedMethod(parseHash());
|
| - interpolatedValues.add(member);
|
| - return member;
|
| + bool isGetter = false;
|
| + bool isSetter = false;
|
| + Expression name = null;
|
| + if (acceptCategory(HASH)) {
|
| + if (lastCategory != LPAREN && (onlyMethods || lastCategory != COLON)) {
|
| + // Interpolated method
|
| + var member = new InterpolatedMethod(parseHash());
|
| + interpolatedValues.add(member);
|
| + return member;
|
| + }
|
| + name = parseInterpolatedExpression();
|
| + } else {
|
| + name = parsePropertyName();
|
| + }
|
| +
|
| + // Allow get or set to be followed by another property name.
|
| + if (lastCategory == ALPHA && name is PropertyName) {
|
| + PropertyName p = name;
|
| + isGetter = p.name == 'get';
|
| + isSetter = p.name == 'set';
|
| + if (isGetter || isSetter) {
|
| + name = parsePropertyName();
|
| + }
|
| + }
|
| +
|
| + if (!onlyMethods && acceptCategory(COLON)) {
|
| + Expression value = parseAssignment();
|
| + return new Property(name, value);
|
| + } else {
|
| + var fun = parseFun();
|
| + return new Method(name, fun,
|
| + isGetter: isGetter, isSetter: isSetter, isStatic: isStatic);
|
| + }
|
| }
|
|
|
| Expression parsePropertyName() {
|
| @@ -1505,13 +1520,16 @@ class MiniJsParser {
|
| expectCategory(RSQUARE);
|
| return expr;
|
| } else if (acceptCategory(HASH)) {
|
| - var nameOrPosition = parseHash();
|
| - var interpolatedLiteral = new InterpolatedLiteral(nameOrPosition);
|
| - interpolatedValues.add(interpolatedLiteral);
|
| - return interpolatedLiteral;
|
| + return parseInterpolatedExpression();
|
| } else {
|
| error('Expected property name');
|
| return null;
|
| }
|
| }
|
| +
|
| + InterpolatedExpression parseInterpolatedExpression() {
|
| + var interpolated = new InterpolatedExpression(parseHash());
|
| + interpolatedValues.add(interpolated);
|
| + return interpolated;
|
| + }
|
| }
|
|
|