Skip to content

Commit f11ee8c

Browse files
committed
Merge pull request #2805 from Microsoft/moduleFixes
Fix #2538 and #2801
2 parents b22e0e9 + 3298327 commit f11ee8c

File tree

161 files changed

+482
-860
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

161 files changed

+482
-860
lines changed

src/compiler/checker.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,8 @@ module ts {
349349
}
350350
result = undefined;
351351
}
352-
else if (location.kind === SyntaxKind.SourceFile) {
352+
else if (location.kind === SyntaxKind.SourceFile ||
353+
(location.kind === SyntaxKind.ModuleDeclaration && (<ModuleDeclaration>location).name.kind === SyntaxKind.StringLiteral)) {
353354
result = getSymbol(getSymbolOfNode(location).exports, "default", meaning & SymbolFlags.ModuleMember);
354355
let localSymbol = getLocalSymbolForExportDefault(result);
355356
if (result && (result.flags & meaning) && localSymbol && localSymbol.name === name) {

src/compiler/emitter.ts

Lines changed: 65 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -4621,19 +4621,6 @@ var __param = this.__param || function(index, decorator) { return function (targ
46214621
}
46224622
}
46234623

4624-
function sortAMDModules(amdModules: {name: string; path: string}[]) {
4625-
// AMD modules with declared variable names go first
4626-
return amdModules.sort((moduleA, moduleB) => {
4627-
if (moduleA.name === moduleB.name) {
4628-
return 0;
4629-
} else if (!moduleA.name) {
4630-
return 1;
4631-
} else {
4632-
return -1;
4633-
}
4634-
});
4635-
}
4636-
46374624
function emitExportStarHelper() {
46384625
if (hasExportStars) {
46394626
writeLine();
@@ -4649,44 +4636,83 @@ var __param = this.__param || function(index, decorator) { return function (targ
46494636

46504637
function emitAMDModule(node: SourceFile, startIndex: number) {
46514638
collectExternalModuleInfo(node);
4652-
writeLine();
4653-
write("define(");
4654-
sortAMDModules(node.amdDependencies);
4655-
if (node.amdModuleName) {
4656-
write("\"" + node.amdModuleName + "\", ");
4639+
4640+
// An AMD define function has the following shape:
4641+
// define(id?, dependencies?, factory);
4642+
//
4643+
// This has the shape of
4644+
// define(name, ["module1", "module2"], function (module1Alias) {
4645+
// The location of the alias in the parameter list in the factory function needs to
4646+
// match the position of the module name in the dependency list.
4647+
//
4648+
// To ensure this is true in cases of modules with no aliases, e.g.:
4649+
// `import "module"` or `<amd-dependency path= "a.css" />`
4650+
// we need to add modules without alias names to the end of the dependencies list
4651+
4652+
let aliasedModuleNames: string[] = []; // names of modules with corresponding parameter in the
4653+
// factory function.
4654+
let unaliasedModuleNames: string[] = []; // names of modules with no corresponding parameters in
4655+
// factory function.
4656+
let importAliasNames: string[] = []; // names of the parameters in the factory function; these
4657+
// paramters need to match the indexes of the corresponding
4658+
// module names in aliasedModuleNames.
4659+
4660+
// Fill in amd-dependency tags
4661+
for (let amdDependency of node.amdDependencies) {
4662+
if (amdDependency.name) {
4663+
aliasedModuleNames.push("\"" + amdDependency.path + "\"");
4664+
importAliasNames.push(amdDependency.name);
4665+
}
4666+
else {
4667+
unaliasedModuleNames.push("\"" + amdDependency.path + "\"");
4668+
}
46574669
}
4658-
write("[\"require\", \"exports\"");
4670+
46594671
for (let importNode of externalImports) {
4660-
write(", ");
4672+
// Find the name of the external module
4673+
let externalModuleName = "";
46614674
let moduleName = getExternalModuleName(importNode);
46624675
if (moduleName.kind === SyntaxKind.StringLiteral) {
4663-
emitLiteral(<LiteralExpression>moduleName);
4676+
externalModuleName = getLiteralText(<LiteralExpression>moduleName);
4677+
}
4678+
4679+
// Find the name of the module alais, if there is one
4680+
let importAliasName: string;
4681+
let namespaceDeclaration = getNamespaceDeclarationNode(importNode);
4682+
if (namespaceDeclaration && !isDefaultImport(importNode)) {
4683+
importAliasName = getSourceTextOfNodeFromSourceFile(currentSourceFile, namespaceDeclaration.name);
4684+
}
4685+
else {
4686+
importAliasName = getGeneratedNameForNode(<ImportDeclaration | ExportDeclaration>importNode);
4687+
}
4688+
4689+
if (importAliasName) {
4690+
aliasedModuleNames.push(externalModuleName);
4691+
importAliasNames.push(importAliasName);
46644692
}
46654693
else {
4666-
write("\"\"");
4694+
unaliasedModuleNames.push(externalModuleName);
46674695
}
46684696
}
4669-
for (let amdDependency of node.amdDependencies) {
4670-
let text = "\"" + amdDependency.path + "\"";
4697+
4698+
writeLine();
4699+
write("define(");
4700+
if (node.amdModuleName) {
4701+
write("\"" + node.amdModuleName + "\", ");
4702+
}
4703+
write("[\"require\", \"exports\"");
4704+
if (aliasedModuleNames.length) {
46714705
write(", ");
4672-
write(text);
4706+
write(aliasedModuleNames.join(", "));
46734707
}
4674-
write("], function (require, exports");
4675-
for (let importNode of externalImports) {
4708+
if (unaliasedModuleNames.length) {
46764709
write(", ");
4677-
let namespaceDeclaration = getNamespaceDeclarationNode(importNode);
4678-
if (namespaceDeclaration && !isDefaultImport(importNode)) {
4679-
emit(namespaceDeclaration.name);
4680-
}
4681-
else {
4682-
write(getGeneratedNameForNode(<ImportDeclaration | ExportDeclaration>importNode));
4683-
}
4710+
write(unaliasedModuleNames.join(", "));
46844711
}
4685-
for (let amdDependency of node.amdDependencies) {
4686-
if (amdDependency.name) {
4687-
write(", ");
4688-
write(amdDependency.name);
4689-
}
4712+
write("], function (require, exports");
4713+
if (importAliasNames.length) {
4714+
write(", ");
4715+
write(importAliasNames.join(", "));
46904716
}
46914717
write(") {");
46924718
increaseIndent();

src/compiler/utilities.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1913,4 +1913,4 @@ module ts {
19131913

19141914
return createTextChangeRange(createTextSpanFromBounds(oldStartN, oldEndN), /*newLength:*/ newEndN - oldStartN);
19151915
}
1916-
}
1916+
}

tests/baselines/reference/amdDependencyCommentName2.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ m1.f();
66

77
//// [amdDependencyCommentName2.js]
88
///<amd-dependency path='bar' name='b'/>
9-
define(["require", "exports", "m2", "bar"], function (require, exports, m1, b) {
9+
define(["require", "exports", "bar", "m2"], function (require, exports, b, m1) {
1010
m1.f();
1111
});

tests/baselines/reference/amdDependencyCommentName3.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@ m1.f();
1010
///<amd-dependency path='bar' name='b'/>
1111
///<amd-dependency path='foo'/>
1212
///<amd-dependency path='goo' name='c'/>
13-
define(["require", "exports", "m2", "bar", "goo", "foo"], function (require, exports, m1, b, c) {
13+
define(["require", "exports", "bar", "goo", "m2", "foo"], function (require, exports, b, c, m1) {
1414
m1.f();
1515
});
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
tests/cases/compiler/amdDependencyCommentName4.ts(8,21): error TS2307: Cannot find external module 'aliasedModule1'.
2+
tests/cases/compiler/amdDependencyCommentName4.ts(11,26): error TS2307: Cannot find external module 'aliasedModule2'.
3+
tests/cases/compiler/amdDependencyCommentName4.ts(14,15): error TS2307: Cannot find external module 'aliasedModule3'.
4+
tests/cases/compiler/amdDependencyCommentName4.ts(17,21): error TS2307: Cannot find external module 'aliasedModule4'.
5+
6+
7+
==== tests/cases/compiler/amdDependencyCommentName4.ts (4 errors) ====
8+
///<amd-dependency path='aliasedModule5' name='n1'/>
9+
///<amd-dependency path='unaliasedModule3'/>
10+
///<amd-dependency path='aliasedModule6' name='n2'/>
11+
///<amd-dependency path='unaliasedModule4'/>
12+
13+
import "unaliasedModule1";
14+
15+
import r1 = require("aliasedModule1");
16+
~~~~~~~~~~~~~~~~
17+
!!! error TS2307: Cannot find external module 'aliasedModule1'.
18+
r1;
19+
20+
import {p1, p2, p3} from "aliasedModule2";
21+
~~~~~~~~~~~~~~~~
22+
!!! error TS2307: Cannot find external module 'aliasedModule2'.
23+
p1;
24+
25+
import d from "aliasedModule3";
26+
~~~~~~~~~~~~~~~~
27+
!!! error TS2307: Cannot find external module 'aliasedModule3'.
28+
d;
29+
30+
import * as ns from "aliasedModule4";
31+
~~~~~~~~~~~~~~~~
32+
!!! error TS2307: Cannot find external module 'aliasedModule4'.
33+
ns;
34+
35+
import "unaliasedModule2";
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
//// [amdDependencyCommentName4.ts]
2+
///<amd-dependency path='aliasedModule5' name='n1'/>
3+
///<amd-dependency path='unaliasedModule3'/>
4+
///<amd-dependency path='aliasedModule6' name='n2'/>
5+
///<amd-dependency path='unaliasedModule4'/>
6+
7+
import "unaliasedModule1";
8+
9+
import r1 = require("aliasedModule1");
10+
r1;
11+
12+
import {p1, p2, p3} from "aliasedModule2";
13+
p1;
14+
15+
import d from "aliasedModule3";
16+
d;
17+
18+
import * as ns from "aliasedModule4";
19+
ns;
20+
21+
import "unaliasedModule2";
22+
23+
//// [amdDependencyCommentName4.js]
24+
///<amd-dependency path='aliasedModule5' name='n1'/>
25+
///<amd-dependency path='unaliasedModule3'/>
26+
///<amd-dependency path='aliasedModule6' name='n2'/>
27+
///<amd-dependency path='unaliasedModule4'/>
28+
define(["require", "exports", "aliasedModule5", "aliasedModule6", "aliasedModule1", "aliasedModule2", "aliasedModule3", "aliasedModule4", "unaliasedModule3", "unaliasedModule4", "unaliasedModule1", "unaliasedModule2"], function (require, exports, n1, n2, r1, aliasedModule2_1, aliasedModule3_1, ns) {
29+
r1;
30+
aliasedModule2_1.p1;
31+
aliasedModule3_1.default;
32+
ns;
33+
});
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
//// [es5ExportDefaultClassDeclaration4.ts]
2+
3+
declare module "foo" {
4+
export var before: C;
5+
6+
export default class C {
7+
method(): C;
8+
}
9+
10+
export var after: C;
11+
12+
export var t: typeof C;
13+
}
14+
15+
16+
17+
//// [es5ExportDefaultClassDeclaration4.js]
18+
19+
20+
//// [es5ExportDefaultClassDeclaration4.d.ts]
21+
declare module "foo" {
22+
var before: C;
23+
class C {
24+
method(): C;
25+
}
26+
var after: C;
27+
var t: typeof C;
28+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
=== tests/cases/compiler/es5ExportDefaultClassDeclaration4.ts ===
2+
3+
declare module "foo" {
4+
export var before: C;
5+
>before : Symbol(before, Decl(es5ExportDefaultClassDeclaration4.ts, 2, 14))
6+
>C : Symbol(C, Decl(es5ExportDefaultClassDeclaration4.ts, 2, 25))
7+
8+
export default class C {
9+
>C : Symbol(C, Decl(es5ExportDefaultClassDeclaration4.ts, 2, 25))
10+
11+
method(): C;
12+
>method : Symbol(method, Decl(es5ExportDefaultClassDeclaration4.ts, 4, 28))
13+
>C : Symbol(C, Decl(es5ExportDefaultClassDeclaration4.ts, 2, 25))
14+
}
15+
16+
export var after: C;
17+
>after : Symbol(after, Decl(es5ExportDefaultClassDeclaration4.ts, 8, 14))
18+
>C : Symbol(C, Decl(es5ExportDefaultClassDeclaration4.ts, 2, 25))
19+
20+
export var t: typeof C;
21+
>t : Symbol(t, Decl(es5ExportDefaultClassDeclaration4.ts, 10, 14))
22+
>C : Symbol(C, Decl(es5ExportDefaultClassDeclaration4.ts, 2, 25))
23+
}
24+
25+
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
=== tests/cases/compiler/es5ExportDefaultClassDeclaration4.ts ===
2+
3+
declare module "foo" {
4+
export var before: C;
5+
>before : C
6+
>C : C
7+
8+
export default class C {
9+
>C : C
10+
11+
method(): C;
12+
>method : () => C
13+
>C : C
14+
}
15+
16+
export var after: C;
17+
>after : C
18+
>C : C
19+
20+
export var t: typeof C;
21+
>t : typeof C
22+
>C : typeof C
23+
}
24+
25+

0 commit comments

Comments
 (0)