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