| Index: dart/sdk/lib/_internal/compiler/implementation/elements/elements.dart
|
| diff --git a/dart/sdk/lib/_internal/compiler/implementation/elements/elements.dart b/dart/sdk/lib/_internal/compiler/implementation/elements/elements.dart
|
| index 684ba90b8647ead4c308bca9d4fde54070c6bbda..fbdc8ca869b2c28100bb168594afdfa5b2fb45bf 100644
|
| --- a/dart/sdk/lib/_internal/compiler/implementation/elements/elements.dart
|
| +++ b/dart/sdk/lib/_internal/compiler/implementation/elements/elements.dart
|
| @@ -1802,62 +1802,92 @@ class Elements {
|
| return new SourceString('$r\$$s');
|
| }
|
|
|
| - static const SourceString OPERATOR_EQUALS =
|
| - const SourceString(r'operator$eq');
|
| -
|
| - static SourceString constructOperatorName(SourceString selector,
|
| - bool isUnary) {
|
| - String str = selector.stringValue;
|
| - if (identical(str, '==') || identical(str, '!=')) return OPERATOR_EQUALS;
|
| -
|
| - if (identical(str, '~')) {
|
| - str = 'not';
|
| - } else if (identical(str, '-') && isUnary) {
|
| - // TODO(ahe): Return something like 'unary -'.
|
| - return const SourceString('negate');
|
| - } else if (identical(str, '[]')) {
|
| - str = 'index';
|
| - } else if (identical(str, '[]=')) {
|
| - str = 'indexSet';
|
| - } else if (identical(str, '*') || identical(str, '*=')) {
|
| - str = 'mul';
|
| - } else if (identical(str, '/') || identical(str, '/=')) {
|
| - str = 'div';
|
| - } else if (identical(str, '%') || identical(str, '%=')) {
|
| - str = 'mod';
|
| - } else if (identical(str, '~/') || identical(str, '~/=')) {
|
| - str = 'tdiv';
|
| - } else if (identical(str, '+') || identical(str, '+=')) {
|
| - str = 'add';
|
| - } else if (identical(str, '-') || identical(str, '-=')) {
|
| - str = 'sub';
|
| - } else if (identical(str, '<<') || identical(str, '<<=')) {
|
| - str = 'shl';
|
| - } else if (identical(str, '>>') || identical(str, '>>=')) {
|
| - str = 'shr';
|
| - } else if (identical(str, '>=')) {
|
| - str = 'ge';
|
| - } else if (identical(str, '>')) {
|
| - str = 'gt';
|
| - } else if (identical(str, '<=')) {
|
| - str = 'le';
|
| - } else if (identical(str, '<')) {
|
| - str = 'lt';
|
| - } else if (identical(str, '&') || identical(str, '&=')) {
|
| - str = 'and';
|
| - } else if (identical(str, '^') || identical(str, '^=')) {
|
| - str = 'xor';
|
| - } else if (identical(str, '|') || identical(str, '|=')) {
|
| - str = 'or';
|
| - } else if (selector == const SourceString('negate')) {
|
| - // TODO(ahe): Remove this case: Legacy support for pre-0.11 spec.
|
| - return selector;
|
| - } else if (identical(str, '?')) {
|
| - return selector;
|
| + /**
|
| + * Map an operator-name to a valid Dart identifier.
|
| + *
|
| + * For non-operator names, this metod just returns its input.
|
| + *
|
| + * The results returned from this method are guaranteed to be valid
|
| + * JavaScript identifers, except it may include reserved words for
|
| + * non-operator names.
|
| + */
|
| + static SourceString operatorNameToIdentifier(SourceString name) {
|
| + if (name == null) return null;
|
| + String value = name.stringValue;
|
| + if (value == null) {
|
| + return name;
|
| + } else if (identical(value, '==')) {
|
| + return const SourceString(r'operator$eq');
|
| + } else if (identical(value, '~')) {
|
| + return const SourceString(r'operator$not');
|
| + } else if (identical(value, '[]')) {
|
| + return const SourceString(r'operator$index');
|
| + } else if (identical(value, '[]=')) {
|
| + return const SourceString(r'oprator$indexSet');
|
| + } else if (identical(value, '*')) {
|
| + return const SourceString(r'operator$mul');
|
| + } else if (identical(value, '/')) {
|
| + return const SourceString(r'operator$div');
|
| + } else if (identical(value, '%')) {
|
| + return const SourceString(r'operator$mod');
|
| + } else if (identical(value, '~/')) {
|
| + return const SourceString(r'operator$tdiv');
|
| + } else if (identical(value, '+')) {
|
| + return const SourceString(r'operator$add');
|
| + } else if (identical(value, '<<')) {
|
| + return const SourceString(r'operator$shl');
|
| + } else if (identical(value, '>>')) {
|
| + return const SourceString(r'operator$shr');
|
| + } else if (identical(value, '>=')) {
|
| + return const SourceString(r'operator$ge');
|
| + } else if (identical(value, '>')) {
|
| + return const SourceString(r'operator$gt');
|
| + } else if (identical(value, '<=')) {
|
| + return const SourceString(r'operator$le');
|
| + } else if (identical(value, '<')) {
|
| + return const SourceString(r'operator$lt');
|
| + } else if (identical(value, '&')) {
|
| + return const SourceString(r'operator$and');
|
| + } else if (identical(value, '^')) {
|
| + return const SourceString(r'operator$xor');
|
| + } else if (identical(value, '|')) {
|
| + return const SourceString(r'operator$or');
|
| + } else if (identical(value, '-')) {
|
| + return const SourceString(r'operator$sub');
|
| + } else if (identical(value, 'unary-')) {
|
| + return const SourceString(r'operator$negate');
|
| + } else {
|
| + return name;
|
| + }
|
| + }
|
| +
|
| + static SourceString constructOperatorName(SourceString op, bool isUnary) {
|
| + String value = op.stringValue;
|
| + if ((value === '==') ||
|
| + (value === '~') ||
|
| + (value === '[]') ||
|
| + (value === '[]=') ||
|
| + (value === '*') ||
|
| + (value === '/') ||
|
| + (value === '%') ||
|
| + (value === '~/') ||
|
| + (value === '+') ||
|
| + (value === '<<') ||
|
| + (value === '>>>') ||
|
| + (value === '>>') ||
|
| + (value === '>=') ||
|
| + (value === '>') ||
|
| + (value === '<=') ||
|
| + (value === '<') ||
|
| + (value === '&') ||
|
| + (value === '^') ||
|
| + (value === '|')) {
|
| + return op;
|
| + } else if (value === '-') {
|
| + return isUnary ? const SourceString('unary-') : op;
|
| } else {
|
| - throw new Exception('Unhandled selector: ${selector.slowToString()}');
|
| + throw 'Unhandled operator: ${op.slowToString()}';
|
| }
|
| - return new SourceString('operator\$$str');
|
| }
|
|
|
| static SourceString mapToUserOperator(SourceString op) {
|
|
|