| 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('.');
|
| }
|
| }
|
|
|