| Index: lib/expression.ts
|
| diff --git a/lib/expression.ts b/lib/expression.ts
|
| deleted file mode 100644
|
| index 5c42d68df1ccf6f50adfa6e020b0b69b68a0ba21..0000000000000000000000000000000000000000
|
| --- a/lib/expression.ts
|
| +++ /dev/null
|
| @@ -1,145 +0,0 @@
|
| -import * as ts from 'typescript';
|
| -import * as base from './base';
|
| -import {Transpiler} from './main';
|
| -import {FacadeConverter} from './facade_converter';
|
| -
|
| -export default class ExpressionTranspiler extends base.TranspilerBase {
|
| - constructor(tr: Transpiler, private fc: FacadeConverter) { super(tr); }
|
| -
|
| - visitNode(node: ts.Node): boolean {
|
| - switch (node.kind) {
|
| - case ts.SyntaxKind.BinaryExpression:
|
| - let binExpr = <ts.BinaryExpression>node;
|
| - let operatorKind = binExpr.operatorToken.kind;
|
| - let tokenStr = ts.tokenToString(operatorKind);
|
| - switch (operatorKind) {
|
| - case ts.SyntaxKind.EqualsEqualsEqualsToken:
|
| - case ts.SyntaxKind.ExclamationEqualsEqualsToken:
|
| - if (operatorKind === ts.SyntaxKind.ExclamationEqualsEqualsToken) this.emit('!');
|
| - this.emit('identical (');
|
| - this.visit(binExpr.left);
|
| - this.emit(',');
|
| - this.visit(binExpr.right);
|
| - this.emit(')');
|
| - break;
|
| - case ts.SyntaxKind.CaretToken:
|
| - case ts.SyntaxKind.BarToken:
|
| - case ts.SyntaxKind.AmpersandToken:
|
| - case ts.SyntaxKind.GreaterThanGreaterThanToken:
|
| - case ts.SyntaxKind.LessThanLessThanToken:
|
| - case ts.SyntaxKind.CaretEqualsToken:
|
| - case ts.SyntaxKind.BarEqualsToken:
|
| - case ts.SyntaxKind.AmpersandEqualsToken:
|
| - case ts.SyntaxKind.GreaterThanGreaterThanEqualsToken:
|
| - case ts.SyntaxKind.LessThanLessThanEqualsToken:
|
| - // In Dart, the bitwise operators are only available on int, so the number types ts2dart
|
| - // deals with have to be converted to int explicitly to match JS's semantics in Dart.
|
| - if (tokenStr[tokenStr.length - 1] === '=') {
|
| - // For assignments, strip the trailing `=` sign to emit just the operator itself.
|
| - this.visit(binExpr.left);
|
| - this.emit('=');
|
| - this.visitAndWrapAsInt(binExpr.left);
|
| - this.emit(tokenStr.slice(0, -1));
|
| - } else {
|
| - // normal case (LHS [op])
|
| - this.visitAndWrapAsInt(binExpr.left);
|
| - this.emit(tokenStr);
|
| - }
|
| - this.visitAndWrapAsInt(binExpr.right);
|
| - break;
|
| - case ts.SyntaxKind.InKeyword:
|
| - this.reportError(node, 'in operator is unsupported');
|
| - break;
|
| - case ts.SyntaxKind.InstanceOfKeyword:
|
| - this.visit(binExpr.left);
|
| - this.emit('is');
|
| - this.fc.visitTypeName(<ts.Identifier>binExpr.right);
|
| - break;
|
| - default:
|
| - this.visit(binExpr.left);
|
| - this.emit(tokenStr);
|
| - this.visit(binExpr.right);
|
| - break;
|
| - }
|
| - break;
|
| - case ts.SyntaxKind.PrefixUnaryExpression:
|
| - let prefixUnary = <ts.PrefixUnaryExpression>node;
|
| - let operator = ts.tokenToString(prefixUnary.operator);
|
| - this.emit(operator);
|
| -
|
| - if (prefixUnary.operator === ts.SyntaxKind.TildeToken) {
|
| - this.visitAndWrapAsInt(prefixUnary.operand);
|
| - } else {
|
| - this.visit(prefixUnary.operand);
|
| - }
|
| - break;
|
| - case ts.SyntaxKind.PostfixUnaryExpression:
|
| - let postfixUnary = <ts.PostfixUnaryExpression>node;
|
| - this.visit(postfixUnary.operand);
|
| - this.emit(ts.tokenToString(postfixUnary.operator));
|
| - break;
|
| - case ts.SyntaxKind.ConditionalExpression:
|
| - let conditional = <ts.ConditionalExpression>node;
|
| - this.visit(conditional.condition);
|
| - this.emit('?');
|
| - this.visit(conditional.whenTrue);
|
| - this.emit(':');
|
| - this.visit(conditional.whenFalse);
|
| - break;
|
| - case ts.SyntaxKind.DeleteExpression:
|
| - this.reportError(node, 'delete operator is unsupported');
|
| - break;
|
| - case ts.SyntaxKind.VoidExpression:
|
| - this.reportError(node, 'void operator is unsupported');
|
| - break;
|
| - case ts.SyntaxKind.TypeOfExpression:
|
| - this.reportError(node, 'typeof operator is unsupported');
|
| - break;
|
| -
|
| - case ts.SyntaxKind.ParenthesizedExpression:
|
| - let parenExpr = <ts.ParenthesizedExpression>node;
|
| - this.emit('(');
|
| - this.visit(parenExpr.expression);
|
| - this.emit(')');
|
| - break;
|
| -
|
| - case ts.SyntaxKind.PropertyAccessExpression:
|
| - let propAccess = <ts.PropertyAccessExpression>node;
|
| - if (propAccess.name.text === 'stack' &&
|
| - this.hasAncestor(propAccess, ts.SyntaxKind.CatchClause)) {
|
| - // Handle `e.stack` accesses in catch clauses by mangling to `e_stack`.
|
| - // FIXME: Use type checker/FacadeConverter to make sure this is actually Error.stack.
|
| - this.visit(propAccess.expression);
|
| - this.emitNoSpace('_stack');
|
| - } else {
|
| - if (this.fc.handlePropertyAccess(propAccess)) break;
|
| - this.visit(propAccess.expression);
|
| - this.emit('.');
|
| - this.visit(propAccess.name);
|
| - }
|
| - break;
|
| - case ts.SyntaxKind.ElementAccessExpression:
|
| - let elemAccess = <ts.ElementAccessExpression>node;
|
| - this.visit(elemAccess.expression);
|
| - this.emit('[');
|
| - this.visit(elemAccess.argumentExpression);
|
| - this.emit(']');
|
| - break;
|
| -
|
| - default:
|
| - return false;
|
| - }
|
| - return true;
|
| - }
|
| -
|
| - visitAndWrapAsInt(n: ts.Expression) {
|
| - let lhsIsHexLit = n.kind === ts.SyntaxKind.NumericLiteral;
|
| - if (lhsIsHexLit) {
|
| - this.visit(n);
|
| - return;
|
| - }
|
| - this.emit('(');
|
| - this.visit(n);
|
| - this.emit('as int)');
|
| - }
|
| -}
|
|
|