mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-06-11 10:46:28 -05:00
Merge pull request #5024 from Microsoft/importsInAmbientModules
collect imports and exports in ambient external modules
This commit is contained in:
@@ -948,12 +948,6 @@ namespace ts {
|
||||
return symbol.flags & meaning ? symbol : resolveAlias(symbol);
|
||||
}
|
||||
|
||||
function isExternalModuleNameRelative(moduleName: string): boolean {
|
||||
// TypeScript 1.0 spec (April 2014): 11.2.1
|
||||
// An external module name is "relative" if the first term is "." or "..".
|
||||
return moduleName.substr(0, 2) === "./" || moduleName.substr(0, 3) === "../" || moduleName.substr(0, 2) === ".\\" || moduleName.substr(0, 3) === "..\\";
|
||||
}
|
||||
|
||||
function resolveExternalModuleName(location: Node, moduleReferenceExpression: Expression): Symbol {
|
||||
if (moduleReferenceExpression.kind !== SyntaxKind.StringLiteral) {
|
||||
return;
|
||||
|
||||
@@ -692,6 +692,12 @@ namespace ts {
|
||||
|
||||
let imports: LiteralExpression[];
|
||||
for (let node of file.statements) {
|
||||
collect(node, /* allowRelativeModuleNames */ true);
|
||||
}
|
||||
|
||||
file.imports = imports || emptyArray;
|
||||
|
||||
function collect(node: Node, allowRelativeModuleNames: boolean): void {
|
||||
switch (node.kind) {
|
||||
case SyntaxKind.ImportDeclaration:
|
||||
case SyntaxKind.ImportEqualsDeclaration:
|
||||
@@ -704,7 +710,9 @@ namespace ts {
|
||||
break;
|
||||
}
|
||||
|
||||
(imports || (imports = [])).push(<LiteralExpression>moduleNameExpr);
|
||||
if (allowRelativeModuleNames || !isExternalModuleNameRelative((<LiteralExpression>moduleNameExpr).text)) {
|
||||
(imports || (imports = [])).push(<LiteralExpression>moduleNameExpr);
|
||||
}
|
||||
break;
|
||||
case SyntaxKind.ModuleDeclaration:
|
||||
if ((<ModuleDeclaration>node).name.kind === SyntaxKind.StringLiteral && (node.flags & NodeFlags.Ambient || isDeclarationFile(file))) {
|
||||
@@ -714,23 +722,15 @@ namespace ts {
|
||||
// The StringLiteral must specify a top - level external module name.
|
||||
// Relative external module names are not permitted
|
||||
forEachChild((<ModuleDeclaration>node).body, node => {
|
||||
if (isExternalModuleImportEqualsDeclaration(node) &&
|
||||
getExternalModuleImportEqualsDeclarationExpression(node).kind === SyntaxKind.StringLiteral) {
|
||||
let moduleName = <LiteralExpression>getExternalModuleImportEqualsDeclarationExpression(node);
|
||||
// TypeScript 1.0 spec (April 2014): 12.1.6
|
||||
// An ExternalImportDeclaration in anAmbientExternalModuleDeclaration may reference other external modules
|
||||
// only through top - level external module names. Relative external module names are not permitted.
|
||||
if (moduleName) {
|
||||
(imports || (imports = [])).push(moduleName);
|
||||
}
|
||||
}
|
||||
// TypeScript 1.0 spec (April 2014): 12.1.6
|
||||
// An ExternalImportDeclaration in anAmbientExternalModuleDeclaration may reference other external modules
|
||||
// only through top - level external module names. Relative external module names are not permitted.
|
||||
collect(node, /* allowRelativeModuleNames */ false);
|
||||
});
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
file.imports = imports || emptyArray;
|
||||
}
|
||||
|
||||
function processSourceFile(fileName: string, isDefaultLib: boolean, refFile?: SourceFile, refPos?: number, refEnd?: number) {
|
||||
|
||||
@@ -992,6 +992,12 @@ namespace ts {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
export function isExternalModuleNameRelative(moduleName: string): boolean {
|
||||
// TypeScript 1.0 spec (April 2014): 11.2.1
|
||||
// An external module name is "relative" if the first term is "." or "..".
|
||||
return moduleName.substr(0, 2) === "./" || moduleName.substr(0, 3) === "../" || moduleName.substr(0, 2) === ".\\" || moduleName.substr(0, 3) === "..\\";
|
||||
}
|
||||
|
||||
export function isInstantiatedModule(node: ModuleDeclaration, preserveConstEnums: boolean) {
|
||||
let moduleState = getModuleInstanceState(node);
|
||||
|
||||
13
tests/baselines/reference/exportsInAmbientModules1.js
Normal file
13
tests/baselines/reference/exportsInAmbientModules1.js
Normal file
@@ -0,0 +1,13 @@
|
||||
//// [tests/cases/compiler/exportsInAmbientModules1.ts] ////
|
||||
|
||||
//// [external.d.ts]
|
||||
|
||||
export var x: number
|
||||
|
||||
//// [main.ts]
|
||||
|
||||
declare module "M" {
|
||||
export {x} from "external"
|
||||
}
|
||||
|
||||
//// [main.js]
|
||||
11
tests/baselines/reference/exportsInAmbientModules1.symbols
Normal file
11
tests/baselines/reference/exportsInAmbientModules1.symbols
Normal file
@@ -0,0 +1,11 @@
|
||||
=== tests/cases/compiler/external.d.ts ===
|
||||
|
||||
export var x: number
|
||||
>x : Symbol(x, Decl(external.d.ts, 1, 10))
|
||||
|
||||
=== tests/cases/compiler/main.ts ===
|
||||
|
||||
declare module "M" {
|
||||
export {x} from "external"
|
||||
>x : Symbol(x, Decl(main.ts, 2, 12))
|
||||
}
|
||||
11
tests/baselines/reference/exportsInAmbientModules1.types
Normal file
11
tests/baselines/reference/exportsInAmbientModules1.types
Normal file
@@ -0,0 +1,11 @@
|
||||
=== tests/cases/compiler/external.d.ts ===
|
||||
|
||||
export var x: number
|
||||
>x : number
|
||||
|
||||
=== tests/cases/compiler/main.ts ===
|
||||
|
||||
declare module "M" {
|
||||
export {x} from "external"
|
||||
>x : number
|
||||
}
|
||||
13
tests/baselines/reference/exportsInAmbientModules2.js
Normal file
13
tests/baselines/reference/exportsInAmbientModules2.js
Normal file
@@ -0,0 +1,13 @@
|
||||
//// [tests/cases/compiler/exportsInAmbientModules2.ts] ////
|
||||
|
||||
//// [external.d.ts]
|
||||
|
||||
export default class C {}
|
||||
|
||||
//// [main.ts]
|
||||
|
||||
declare module "M" {
|
||||
export * from "external"
|
||||
}
|
||||
|
||||
//// [main.js]
|
||||
11
tests/baselines/reference/exportsInAmbientModules2.symbols
Normal file
11
tests/baselines/reference/exportsInAmbientModules2.symbols
Normal file
@@ -0,0 +1,11 @@
|
||||
=== tests/cases/compiler/external.d.ts ===
|
||||
|
||||
export default class C {}
|
||||
>C : Symbol(C, Decl(external.d.ts, 0, 0))
|
||||
|
||||
=== tests/cases/compiler/main.ts ===
|
||||
|
||||
No type information for this code.declare module "M" {
|
||||
No type information for this code. export * from "external"
|
||||
No type information for this code.}
|
||||
No type information for this code.
|
||||
11
tests/baselines/reference/exportsInAmbientModules2.types
Normal file
11
tests/baselines/reference/exportsInAmbientModules2.types
Normal file
@@ -0,0 +1,11 @@
|
||||
=== tests/cases/compiler/external.d.ts ===
|
||||
|
||||
export default class C {}
|
||||
>C : C
|
||||
|
||||
=== tests/cases/compiler/main.ts ===
|
||||
|
||||
No type information for this code.declare module "M" {
|
||||
No type information for this code. export * from "external"
|
||||
No type information for this code.}
|
||||
No type information for this code.
|
||||
13
tests/baselines/reference/importsInAmbientModules1.js
Normal file
13
tests/baselines/reference/importsInAmbientModules1.js
Normal file
@@ -0,0 +1,13 @@
|
||||
//// [tests/cases/compiler/importsInAmbientModules1.ts] ////
|
||||
|
||||
//// [external.d.ts]
|
||||
|
||||
export var x: number
|
||||
|
||||
//// [main.ts]
|
||||
|
||||
declare module "M" {
|
||||
import {x} from "external"
|
||||
}
|
||||
|
||||
//// [main.js]
|
||||
11
tests/baselines/reference/importsInAmbientModules1.symbols
Normal file
11
tests/baselines/reference/importsInAmbientModules1.symbols
Normal file
@@ -0,0 +1,11 @@
|
||||
=== tests/cases/compiler/external.d.ts ===
|
||||
|
||||
export var x: number
|
||||
>x : Symbol(x, Decl(external.d.ts, 1, 10))
|
||||
|
||||
=== tests/cases/compiler/main.ts ===
|
||||
|
||||
declare module "M" {
|
||||
import {x} from "external"
|
||||
>x : Symbol(x, Decl(main.ts, 2, 12))
|
||||
}
|
||||
11
tests/baselines/reference/importsInAmbientModules1.types
Normal file
11
tests/baselines/reference/importsInAmbientModules1.types
Normal file
@@ -0,0 +1,11 @@
|
||||
=== tests/cases/compiler/external.d.ts ===
|
||||
|
||||
export var x: number
|
||||
>x : number
|
||||
|
||||
=== tests/cases/compiler/main.ts ===
|
||||
|
||||
declare module "M" {
|
||||
import {x} from "external"
|
||||
>x : number
|
||||
}
|
||||
13
tests/baselines/reference/importsInAmbientModules2.js
Normal file
13
tests/baselines/reference/importsInAmbientModules2.js
Normal file
@@ -0,0 +1,13 @@
|
||||
//// [tests/cases/compiler/importsInAmbientModules2.ts] ////
|
||||
|
||||
//// [external.d.ts]
|
||||
|
||||
export default class C {}
|
||||
|
||||
//// [main.ts]
|
||||
|
||||
declare module "M" {
|
||||
import C from "external"
|
||||
}
|
||||
|
||||
//// [main.js]
|
||||
11
tests/baselines/reference/importsInAmbientModules2.symbols
Normal file
11
tests/baselines/reference/importsInAmbientModules2.symbols
Normal file
@@ -0,0 +1,11 @@
|
||||
=== tests/cases/compiler/external.d.ts ===
|
||||
|
||||
export default class C {}
|
||||
>C : Symbol(C, Decl(external.d.ts, 0, 0))
|
||||
|
||||
=== tests/cases/compiler/main.ts ===
|
||||
|
||||
declare module "M" {
|
||||
import C from "external"
|
||||
>C : Symbol(C, Decl(main.ts, 2, 10))
|
||||
}
|
||||
11
tests/baselines/reference/importsInAmbientModules2.types
Normal file
11
tests/baselines/reference/importsInAmbientModules2.types
Normal file
@@ -0,0 +1,11 @@
|
||||
=== tests/cases/compiler/external.d.ts ===
|
||||
|
||||
export default class C {}
|
||||
>C : C
|
||||
|
||||
=== tests/cases/compiler/main.ts ===
|
||||
|
||||
declare module "M" {
|
||||
import C from "external"
|
||||
>C : typeof C
|
||||
}
|
||||
13
tests/baselines/reference/importsInAmbientModules3.js
Normal file
13
tests/baselines/reference/importsInAmbientModules3.js
Normal file
@@ -0,0 +1,13 @@
|
||||
//// [tests/cases/compiler/importsInAmbientModules3.ts] ////
|
||||
|
||||
//// [external.d.ts]
|
||||
|
||||
export default class C {}
|
||||
|
||||
//// [main.ts]
|
||||
|
||||
declare module "M" {
|
||||
import C = require("external");
|
||||
}
|
||||
|
||||
//// [main.js]
|
||||
11
tests/baselines/reference/importsInAmbientModules3.symbols
Normal file
11
tests/baselines/reference/importsInAmbientModules3.symbols
Normal file
@@ -0,0 +1,11 @@
|
||||
=== tests/cases/compiler/main.ts ===
|
||||
|
||||
declare module "M" {
|
||||
import C = require("external");
|
||||
>C : Symbol(C, Decl(main.ts, 1, 20))
|
||||
}
|
||||
=== tests/cases/compiler/external.d.ts ===
|
||||
|
||||
export default class C {}
|
||||
>C : Symbol(C, Decl(external.d.ts, 0, 0))
|
||||
|
||||
11
tests/baselines/reference/importsInAmbientModules3.types
Normal file
11
tests/baselines/reference/importsInAmbientModules3.types
Normal file
@@ -0,0 +1,11 @@
|
||||
=== tests/cases/compiler/main.ts ===
|
||||
|
||||
declare module "M" {
|
||||
import C = require("external");
|
||||
>C : typeof C
|
||||
}
|
||||
=== tests/cases/compiler/external.d.ts ===
|
||||
|
||||
export default class C {}
|
||||
>C : C
|
||||
|
||||
10
tests/cases/compiler/exportsInAmbientModules1.ts
Normal file
10
tests/cases/compiler/exportsInAmbientModules1.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
// @module: amd
|
||||
|
||||
// @filename: external.d.ts
|
||||
export var x: number
|
||||
|
||||
// @filename: main.ts
|
||||
|
||||
declare module "M" {
|
||||
export {x} from "external"
|
||||
}
|
||||
10
tests/cases/compiler/exportsInAmbientModules2.ts
Normal file
10
tests/cases/compiler/exportsInAmbientModules2.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
// @module: amd
|
||||
|
||||
// @filename: external.d.ts
|
||||
export default class C {}
|
||||
|
||||
// @filename: main.ts
|
||||
|
||||
declare module "M" {
|
||||
export * from "external"
|
||||
}
|
||||
10
tests/cases/compiler/importsInAmbientModules1.ts
Normal file
10
tests/cases/compiler/importsInAmbientModules1.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
// @module: amd
|
||||
|
||||
// @filename: external.d.ts
|
||||
export var x: number
|
||||
|
||||
// @filename: main.ts
|
||||
|
||||
declare module "M" {
|
||||
import {x} from "external"
|
||||
}
|
||||
10
tests/cases/compiler/importsInAmbientModules2.ts
Normal file
10
tests/cases/compiler/importsInAmbientModules2.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
// @module: amd
|
||||
|
||||
// @filename: external.d.ts
|
||||
export default class C {}
|
||||
|
||||
// @filename: main.ts
|
||||
|
||||
declare module "M" {
|
||||
import C from "external"
|
||||
}
|
||||
10
tests/cases/compiler/importsInAmbientModules3.ts
Normal file
10
tests/cases/compiler/importsInAmbientModules3.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
// @module: amd
|
||||
|
||||
// @filename: external.d.ts
|
||||
export default class C {}
|
||||
|
||||
// @filename: main.ts
|
||||
|
||||
declare module "M" {
|
||||
import C = require("external");
|
||||
}
|
||||
Reference in New Issue
Block a user