OLD | NEW |
1 import * as dartStyle from 'dart-style'; | 1 import * as dartStyle from 'dart-style'; |
2 import * as fs from 'fs'; | 2 import * as fs from 'fs'; |
3 import * as path from 'path'; | 3 import * as path from 'path'; |
4 import * as ts from 'typescript'; | 4 import * as ts from 'typescript'; |
5 | |
6 import * as base from './base'; | 5 import * as base from './base'; |
7 import {ImportSummary, TranspilerBase} from './base'; | 6 import {ImportSummary, TranspilerBase} from './base'; |
8 import DeclarationTranspiler from './declaration'; | 7 import DeclarationTranspiler from './declaration'; |
9 import {FacadeConverter} from './facade_converter'; | 8 import {FacadeConverter} from './facade_converter'; |
10 import * as merge from './merge'; | 9 import * as merge from './merge'; |
11 import mkdirP from './mkdirp'; | 10 import mkdirP from './mkdirp'; |
12 import ModuleTranspiler from './module'; | 11 import ModuleTranspiler from './module'; |
13 import TypeTranspiler from './type'; | 12 import TypeTranspiler from './type'; |
14 | 13 |
15 export interface TranspilerOptions { | 14 export interface TranspilerOptions { |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 | 66 |
68 const NUM_OUTPUT_CONTEXTS = 3; | 67 const NUM_OUTPUT_CONTEXTS = 3; |
69 | 68 |
70 export class Transpiler { | 69 export class Transpiler { |
71 private outputs: Output[]; | 70 private outputs: Output[]; |
72 private outputStack: Output[]; | 71 private outputStack: Output[]; |
73 private currentFile: ts.SourceFile; | 72 private currentFile: ts.SourceFile; |
74 /** | 73 /** |
75 * Map of import library path to a Set of identifier names being imported. | 74 * Map of import library path to a Set of identifier names being imported. |
76 */ | 75 */ |
77 imports: ts.Map<ImportSummary>; | 76 imports: Map<String, ImportSummary>; |
78 // Comments attach to all following AST nodes before the next 'physical' token
. Track the earliest | 77 // Comments attach to all following AST nodes before the next 'physical' token
. Track the earliest |
79 // offset to avoid printing comments multiple times. | 78 // offset to avoid printing comments multiple times. |
80 private lastCommentIdx: number = -1; | 79 private lastCommentIdx: number = -1; |
81 private errors: string[] = []; | 80 private errors: string[] = []; |
82 | 81 |
83 private transpilers: TranspilerBase[]; | 82 private transpilers: TranspilerBase[]; |
84 private declarationTranspiler: DeclarationTranspiler; | 83 private declarationTranspiler: DeclarationTranspiler; |
85 private fc: FacadeConverter; | 84 private fc: FacadeConverter; |
86 /* Number of nested levels of type arguments the current expression is within.
*/ | 85 /* Number of nested levels of type arguments the current expression is within.
*/ |
87 private typeArgumentDepth = 0; | 86 private typeArgumentDepth = 0; |
88 | 87 |
89 constructor(private options: TranspilerOptions = {}) { | 88 constructor(private options: TranspilerOptions) { |
| 89 this.options = this.options || {}; |
90 this.fc = new FacadeConverter(this, options.typingsRoot); | 90 this.fc = new FacadeConverter(this, options.typingsRoot); |
91 this.declarationTranspiler = new DeclarationTranspiler( | 91 this.declarationTranspiler = new DeclarationTranspiler( |
92 this, this.fc, options.enforceUnderscoreConventions, options.promoteFunc
tionLikeMembers); | 92 this, this.fc, options.enforceUnderscoreConventions, options.promoteFunc
tionLikeMembers); |
93 this.transpilers = [ | 93 this.transpilers = [ |
94 new ModuleTranspiler(this, this.fc, options.moduleName), | 94 new ModuleTranspiler(this, this.fc, options.moduleName), |
95 this.declarationTranspiler, | 95 this.declarationTranspiler, |
96 new TypeTranspiler(this, this.fc), | 96 new TypeTranspiler(this, this.fc), |
97 ]; | 97 ]; |
98 } | 98 } |
99 | 99 |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
230 if (this.outputStack.length === 0) { | 230 if (this.outputStack.length === 0) { |
231 this.reportError(null, 'Attempting to pop output stack when already empty'
); | 231 this.reportError(null, 'Attempting to pop output stack when already empty'
); |
232 } | 232 } |
233 this.outputStack.pop(); | 233 this.outputStack.pop(); |
234 } | 234 } |
235 | 235 |
236 private translate(sourceFile: ts.SourceFile): string { | 236 private translate(sourceFile: ts.SourceFile): string { |
237 this.currentFile = sourceFile; | 237 this.currentFile = sourceFile; |
238 this.outputs = []; | 238 this.outputs = []; |
239 this.outputStack = []; | 239 this.outputStack = []; |
240 this.imports = {}; | 240 this.imports = new Map(); |
241 for (let i = 0; i < NUM_OUTPUT_CONTEXTS; ++i) { | 241 for (let i = 0; i < NUM_OUTPUT_CONTEXTS; ++i) { |
242 this.outputs.push(new Output()); | 242 this.outputs.push(new Output()); |
243 } | 243 } |
244 | 244 |
245 this.lastCommentIdx = -1; | 245 this.lastCommentIdx = -1; |
246 merge.normalizeSourceFile(sourceFile, this.fc); | 246 merge.normalizeSourceFile(sourceFile, this.fc); |
247 this.pushContext(OutputContext.Default); | 247 this.pushContext(OutputContext.Default); |
248 this.visit(sourceFile); | 248 this.visit(sourceFile); |
249 this.popContext(); | 249 this.popContext(); |
250 if (this.outputStack.length > 0) { | 250 if (this.outputStack.length > 0) { |
251 this.reportError( | 251 this.reportError( |
252 sourceFile, 'Internal error managing output contexts. ' + | 252 sourceFile, 'Internal error managing output contexts. ' + |
253 'Inconsistent push and pop context calls.'); | 253 'Inconsistent push and pop context calls.'); |
254 } | 254 } |
255 this.pushContext(OutputContext.Import); | 255 this.pushContext(OutputContext.Import); |
256 | 256 |
257 for (let name of Object.getOwnPropertyNames(this.imports)) { | 257 this.imports.forEach((summary, name) => { |
258 let summary = this.imports[name]; | |
259 this.emit(`import ${JSON.stringify(name)}`); | 258 this.emit(`import ${JSON.stringify(name)}`); |
260 | 259 |
261 if (!summary.showAll) { | 260 if (!summary.showAll) { |
262 let shownNames = Object.getOwnPropertyNames(summary.shown); | 261 let shownNames = Array.from(summary.shown); |
263 if (shownNames.length > 0) { | 262 if (shownNames.length > 0) { |
264 this.emit(`show ${shownNames.join(', ')}`); | 263 this.emit(`show ${shownNames.join(', ')}`); |
265 } | 264 } |
266 } | 265 } |
267 if (summary.asPrefix) { | 266 if (summary.asPrefix) { |
268 this.emit(`as ${summary.asPrefix}`); | 267 this.emit(`as ${summary.asPrefix}`); |
269 } | 268 } |
270 this.emit(';\n'); | 269 this.emit(';\n'); |
271 } | 270 }); |
272 this.popContext(); | 271 this.popContext(); |
273 | 272 |
274 let result = ''; | 273 let result = ''; |
275 for (let output of this.outputs) { | 274 for (let output of this.outputs) { |
276 result += output.getResult(); | 275 result += output.getResult(); |
277 } | 276 } |
278 return this.formatCode(result, sourceFile); | 277 return this.formatCode(result, sourceFile); |
279 } | 278 } |
280 | 279 |
281 private formatCode(code: string, context: ts.Node) { | 280 private formatCode(code: string, context: ts.Node) { |
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
595 try { | 594 try { |
596 let transpiler = new Transpiler(args); | 595 let transpiler = new Transpiler(args); |
597 if (args.destination) console.error('Transpiling', args._, 'to', args.destin
ation); | 596 if (args.destination) console.error('Transpiling', args._, 'to', args.destin
ation); |
598 transpiler.transpile(args._, args.destination); | 597 transpiler.transpile(args._, args.destination); |
599 } catch (e) { | 598 } catch (e) { |
600 if (e.name !== 'DartFacadeError') throw e; | 599 if (e.name !== 'DartFacadeError') throw e; |
601 console.error(e.message); | 600 console.error(e.message); |
602 process.exit(1); | 601 process.exit(1); |
603 } | 602 } |
604 } | 603 } |
OLD | NEW |