Index: lib/module.ts |
diff --git a/lib/module.ts b/lib/module.ts |
index 8b8d12c156b5d2bfb73542f7ea24a60c19fd92fc..a985fcdf3b4225aaff03a1acff9a3a664d5131a8 100644 |
--- a/lib/module.ts |
+++ b/lib/module.ts |
@@ -1,7 +1,8 @@ |
import * as ts from 'typescript'; |
+ |
import * as base from './base'; |
-import {Transpiler} from './main'; |
import {FacadeConverter} from './facade_converter'; |
+import {OutputContext, Transpiler} from './main'; |
export default class ModuleTranspiler extends base.TranspilerBase { |
constructor(tr: Transpiler, private fc: FacadeConverter, private generateLibraryName: boolean) { |
@@ -11,12 +12,14 @@ export default class ModuleTranspiler extends base.TranspilerBase { |
visitNode(node: ts.Node): boolean { |
switch (node.kind) { |
case ts.SyntaxKind.SourceFile: |
- if (this.generateLibraryName) { |
- this.emit('library'); |
- this.emit(this.getLibraryName()); |
- this.emit(';'); |
- } |
- this.fc.emitExtraImports(<ts.SourceFile>node); |
+ this.pushContext(OutputContext.Import); |
+ this.emit('@JS()'); |
+ this.emit('library'); |
+ this.emit(this.getLibraryName()); |
+ this.emit(';'); |
+ this.popContext(); |
+ |
+ this.emitImport('package:js/js.dart'); |
ts.forEachChild(node, this.visit.bind(this)); |
break; |
case ts.SyntaxKind.EndOfFileToken: |
@@ -81,11 +84,13 @@ export default class ModuleTranspiler extends base.TranspilerBase { |
break; |
case ts.SyntaxKind.ImportEqualsDeclaration: |
let importEqDecl = <ts.ImportEqualsDeclaration>node; |
+ this.pushContext(OutputContext.Import); |
this.emit('import'); |
this.visit(importEqDecl.moduleReference); |
this.emit('as'); |
this.fc.visitTypeName(importEqDecl.name); |
this.emit(';'); |
+ this.popContext(); |
break; |
case ts.SyntaxKind.ExternalModuleReference: |
this.visitExternalModuleReferenceExpr((<ts.ExternalModuleReference>node).expression); |
@@ -97,21 +102,7 @@ export default class ModuleTranspiler extends base.TranspilerBase { |
return true; |
} |
- private static isIgnoredImport(e: ts.ImportSpecifier) { |
- // TODO: unify with facade_converter.ts |
- let name = base.ident(e.name); |
- switch (name) { |
- case 'CONST': |
- case 'CONST_EXPR': |
- case 'normalizeBlank': |
- case 'forwardRef': |
- case 'ABSTRACT': |
- case 'IMPLEMENTS': |
- return true; |
- default: |
- return false; |
- } |
- } |
+ private static isIgnoredImport(e: ts.ImportSpecifier) { return false; } |
private visitExternalModuleReferenceExpr(expr: ts.Expression) { |
// TODO: what if this isn't a string literal? |
@@ -131,9 +122,7 @@ export default class ModuleTranspiler extends base.TranspilerBase { |
let bindings = n.importClause.namedBindings; |
if (bindings.kind !== ts.SyntaxKind.NamedImports) return false; |
let elements = (<ts.NamedImports>bindings).elements; |
- // An import list being empty *after* filtering is ok, but if it's empty in the code itself, |
- // it's nonsensical code, so probably a programming error. |
- if (elements.length === 0) this.reportError(n, 'empty import list'); |
+ if (elements.length === 0) return true; |
return elements.every(ModuleTranspiler.isIgnoredImport); |
} |
@@ -141,21 +130,16 @@ export default class ModuleTranspiler extends base.TranspilerBase { |
return ns.filter((e) => !ModuleTranspiler.isIgnoredImport(e)); |
} |
- // For the Dart keyword list see |
- // https://www.dartlang.org/docs/dart-up-and-running/ch02.html#keywords |
- private static DART_RESERVED_WORDS = |
- ('assert break case catch class const continue default do else enum extends false final ' + |
- 'finally for if in is new null rethrow return super switch this throw true try let void ' + |
- 'while with') |
- .split(/ /); |
- |
getLibraryName(nameForTest?: string) { |
let fileName = this.getRelativeFileName(nameForTest); |
let parts = fileName.split('/'); |
return parts.filter((p) => p.length > 0) |
.map((p) => p.replace(/[^\w.]/g, '_')) |
+ .map((p) => p.replace(/\.d\.ts$/g, '')) |
.map((p) => p.replace(/\.[jt]s$/g, '')) |
- .map((p) => ModuleTranspiler.DART_RESERVED_WORDS.indexOf(p) !== -1 ? '_' + p : p) |
+ .map((p) => p.replace(/\./g, '')) |
+ .map((p) => FacadeConverter.DART_RESERVED_WORDS.indexOf(p) !== -1 ? '_' + p : p) |
+ .filter((p) => p.length > 0) |
.join('.'); |
} |
} |