Index: lib/type.ts |
diff --git a/lib/type.ts b/lib/type.ts |
index fa15a61dabc1b59090aeff93b35273828b112cb6..b5680f281106246fd898fbc59f72956de1e488ca 100644 |
--- a/lib/type.ts |
+++ b/lib/type.ts |
@@ -1,37 +1,18 @@ |
import * as ts from 'typescript'; |
+ |
import * as base from './base'; |
+import {FacadeConverter, fixupIdentifierName} from './facade_converter'; |
import {Transpiler} from './main'; |
-import {FacadeConverter} from './facade_converter'; |
export default class TypeTranspiler extends base.TranspilerBase { |
constructor(tr: Transpiler, private fc: FacadeConverter) { super(tr); } |
visitNode(node: ts.Node): boolean { |
+ if (base.isTypeNode(node)) { |
+ this.emit(this.fc.generateDartTypeName(<ts.TypeNode>node, this.insideCodeComment)); |
+ return true; |
+ } |
switch (node.kind) { |
- case ts.SyntaxKind.TypeLiteral: |
- let indexType = this.maybeDestructureIndexType(<ts.TypeLiteralNode>node); |
- if (indexType) { |
- // This is effectively a Map. |
- this.emit('Map <'); |
- this.visit(indexType[0]); |
- this.emit(','); |
- this.visit(indexType[1]); |
- this.emit('>'); |
- } else { |
- // Dart doesn't support other type literals. |
- this.emit('dynamic'); |
- } |
- break; |
- case ts.SyntaxKind.UnionType: |
- this.emit('dynamic /*'); |
- this.visitList((<ts.UnionTypeNode>node).types, '|'); |
- this.emit('*/'); |
- break; |
- case ts.SyntaxKind.TypeReference: |
- let typeRef = <ts.TypeReferenceNode>node; |
- this.fc.visitTypeName(typeRef.typeName); |
- this.maybeVisitTypeArguments(typeRef); |
- break; |
case ts.SyntaxKind.TypeAssertionExpression: |
let typeAssertExpr = <ts.TypeAssertion>node; |
if (this.isReifiedTypeLiteral(typeAssertExpr)) { |
@@ -52,27 +33,25 @@ export default class TypeTranspiler extends base.TranspilerBase { |
this.visit(typeParam.constraint); |
} |
break; |
- case ts.SyntaxKind.ArrayType: |
- this.emit('List'); |
- this.emit('<'); |
- this.visit((<ts.ArrayTypeNode>node).elementType); |
- this.emit('>'); |
- break; |
- case ts.SyntaxKind.FunctionType: |
- this.emit('dynamic /*'); |
- this.emit(node.getText()); |
- this.emit('*/'); |
- break; |
case ts.SyntaxKind.QualifiedName: |
+ // TODO(jacobr): there is overlap between this case and |
+ // generateDartTypeName in facade_converter. |
let first = <ts.QualifiedName>node; |
+ let match = this.fc.lookupCustomDartTypeName(first, this.insideCodeComment); |
+ if (match) { |
+ this.emitType(match.name, match.comment); |
+ break; |
+ } |
this.visit(first.left); |
this.emit('.'); |
this.visit(first.right); |
break; |
case ts.SyntaxKind.Identifier: |
let ident = <ts.Identifier>node; |
- this.fc.visitTypeName(ident); |
+ let text = fixupIdentifierName(ident.text); |
+ this.emit(text); |
break; |
+ // TODO(jacobr): all these cases might be obsolete. |
case ts.SyntaxKind.NumberKeyword: |
this.emit('num'); |
break; |