Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(172)

Side by Side Diff: lib/type.ts

Issue 2394683003: JS Interop Facade generation polish.
Patch Set: more cleanup Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « lib/module.ts ('k') | test/declaration_test.ts » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 }
OLDNEW
« no previous file with comments | « lib/module.ts ('k') | test/declaration_test.ts » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698