| OLD | NEW |
| 1 import * as ts from 'typescript'; | 1 import * as ts from 'typescript'; |
| 2 | 2 |
| 3 import * as base from './base'; | 3 import * as base from './base'; |
| 4 import {FacadeConverter, fixupIdentifierName} from './facade_converter'; | 4 import {FacadeConverter, fixupIdentifierName} from './facade_converter'; |
| 5 import {Transpiler} from './main'; | 5 import {Transpiler} from './main'; |
| 6 | 6 |
| 7 export default class TypeTranspiler extends base.TranspilerBase { | 7 export default class TypeTranspiler extends base.TranspilerBase { |
| 8 constructor(tr: Transpiler, private fc: FacadeConverter) { super(tr); } | 8 constructor(tr: Transpiler, private fc: FacadeConverter) { super(tr); } |
| 9 | 9 |
| 10 visitNode(node: ts.Node): boolean { | 10 visitNode(node: ts.Node): boolean { |
| 11 if (base.isTypeNode(node)) { | 11 if (base.isTypeNode(node)) { |
| 12 this.emit(this.fc.generateDartTypeName(<ts.TypeNode>node, this.insideCodeC
omment)); | 12 this.emit(this.fc.generateDartTypeName(<ts.TypeNode>node)); |
| 13 return true; | 13 return true; |
| 14 } | 14 } |
| 15 switch (node.kind) { | 15 switch (node.kind) { |
| 16 case ts.SyntaxKind.TypeAssertionExpression: | 16 case ts.SyntaxKind.TypeAssertionExpression: |
| 17 let typeAssertExpr = <ts.TypeAssertion>node; | 17 let typeAssertExpr = <ts.TypeAssertion>node; |
| 18 if (this.isReifiedTypeLiteral(typeAssertExpr)) { | 18 if (this.isReifiedTypeLiteral(typeAssertExpr)) { |
| 19 this.visit(typeAssertExpr.expression); | 19 this.visit(typeAssertExpr.expression); |
| 20 break; // type is handled by the container literal itself. | 20 break; // type is handled by the container literal itself. |
| 21 } | 21 } |
| 22 this.emit('('); | 22 this.emit('('); |
| 23 this.visit(typeAssertExpr.expression); | 23 this.visit(typeAssertExpr.expression); |
| 24 this.emit('as'); | 24 this.emit('as'); |
| 25 this.visit(typeAssertExpr.type); | 25 this.visit(typeAssertExpr.type); |
| 26 this.emit(')'); | 26 this.emit(')'); |
| 27 break; | 27 break; |
| 28 case ts.SyntaxKind.TypeParameter: | 28 case ts.SyntaxKind.TypeParameter: |
| 29 let typeParam = <ts.TypeParameterDeclaration>node; | 29 let typeParam = <ts.TypeParameterDeclaration>node; |
| 30 this.visit(typeParam.name); | 30 this.visit(typeParam.name); |
| 31 if (typeParam.constraint) { | 31 if (typeParam.constraint) { |
| 32 this.emit('extends'); | 32 this.emit('extends'); |
| 33 this.visit(typeParam.constraint); | 33 this.visit(typeParam.constraint); |
| 34 } | 34 } |
| 35 break; | 35 break; |
| 36 case ts.SyntaxKind.PropertyAccessExpression: |
| 37 let expr = <ts.PropertyAccessExpression>node; |
| 38 this.visit(expr.expression); |
| 39 this.emit('.'); |
| 40 this.fc.visitTypeName(expr.name); |
| 41 break; |
| 36 case ts.SyntaxKind.QualifiedName: | 42 case ts.SyntaxKind.QualifiedName: |
| 37 // TODO(jacobr): there is overlap between this case and | 43 // TODO(jacobr): there is overlap between this case and |
| 38 // generateDartTypeName in facade_converter. | 44 // generateDartTypeName in facade_converter. |
| 39 let first = <ts.QualifiedName>node; | 45 let first = <ts.QualifiedName>node; |
| 40 let match = this.fc.lookupCustomDartTypeName(first, this.insideCodeComme
nt); | 46 let match = this.fc.lookupCustomDartTypeName(first); |
| 41 if (match) { | 47 if (match) { |
| 42 this.emitType(match.name, match.comment); | 48 this.emitType(match.name, match.comment); |
| 43 break; | 49 break; |
| 44 } | 50 } |
| 45 this.visit(first.left); | 51 this.visit(first.left); |
| 46 this.emit('.'); | 52 this.emit('.'); |
| 47 this.visit(first.right); | 53 this.visit(first.right); |
| 48 break; | 54 break; |
| 49 case ts.SyntaxKind.Identifier: | 55 case ts.SyntaxKind.Identifier: |
| 50 let ident = <ts.Identifier>node; | 56 case ts.SyntaxKind.FirstLiteralToken: |
| 51 let text = fixupIdentifierName(ident.text); | 57 let text = fixupIdentifierName(base.ident(node)); |
| 52 this.emit(text); | 58 this.emit(text); |
| 53 break; | 59 break; |
| 54 // TODO(jacobr): all these cases might be obsolete. | |
| 55 case ts.SyntaxKind.NumberKeyword: | |
| 56 this.emit('num'); | |
| 57 break; | |
| 58 case ts.SyntaxKind.StringKeyword: | |
| 59 this.emit('String'); | |
| 60 break; | |
| 61 case ts.SyntaxKind.VoidKeyword: | |
| 62 this.emit('void'); | |
| 63 break; | |
| 64 case ts.SyntaxKind.BooleanKeyword: | |
| 65 this.emit('bool'); | |
| 66 break; | |
| 67 case ts.SyntaxKind.AnyKeyword: | |
| 68 this.emit('dynamic'); | |
| 69 break; | |
| 70 default: | 60 default: |
| 71 return false; | 61 return false; |
| 72 } | 62 } |
| 73 return true; | 63 return true; |
| 74 } | 64 } |
| 75 | 65 |
| 76 isReifiedTypeLiteral(node: ts.TypeAssertion): boolean { | 66 isReifiedTypeLiteral(node: ts.TypeAssertion): boolean { |
| 77 if (node.expression.kind === ts.SyntaxKind.ArrayLiteralExpression && | 67 if (node.expression.kind === ts.SyntaxKind.ArrayLiteralExpression && |
| 78 node.type.kind === ts.SyntaxKind.ArrayType) { | 68 node.type.kind === ts.SyntaxKind.ArrayType) { |
| 79 return true; | 69 return true; |
| 80 } else if ( | 70 } else if ( |
| 81 node.expression.kind === ts.SyntaxKind.ObjectLiteralExpression && | 71 node.expression.kind === ts.SyntaxKind.ObjectLiteralExpression && |
| 82 node.type.kind === ts.SyntaxKind.TypeLiteral) { | 72 node.type.kind === ts.SyntaxKind.TypeLiteral) { |
| 83 return true; | 73 return true; |
| 84 } | 74 } |
| 85 return false; | 75 return false; |
| 86 } | 76 } |
| 87 } | 77 } |
| OLD | NEW |