Skip to content

Commit 22e2bde

Browse files
committed
Merge pull request #1158 from gisenberg/master
Adding support for named AMD modules.
2 parents 838e760 + b54143c commit 22e2bde

11 files changed

+102
-2
lines changed

src/compiler/diagnosticInformationMap.generated.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,7 @@ module ts {
273273
Type_argument_candidate_1_is_not_a_valid_type_argument_because_it_is_not_a_supertype_of_candidate_0: { code: 2455, category: DiagnosticCategory.Error, key: "Type argument candidate '{1}' is not a valid type argument because it is not a supertype of candidate '{0}'." },
274274
Type_alias_0_circularly_references_itself: { code: 2456, category: DiagnosticCategory.Error, key: "Type alias '{0}' circularly references itself." },
275275
Type_alias_name_cannot_be_0: { code: 2457, category: DiagnosticCategory.Error, key: "Type alias name cannot be '{0}'" },
276+
An_AMD_module_cannot_have_multiple_name_assignments: { code: 2458, category: DiagnosticCategory.Error, key: "An AMD module cannot have multiple name assignments." },
276277
Import_declaration_0_is_using_private_name_1: { code: 4000, category: DiagnosticCategory.Error, key: "Import declaration '{0}' is using private name '{1}'." },
277278
Type_parameter_0_of_exported_class_has_or_is_using_name_1_from_private_module_2: { code: 4001, category: DiagnosticCategory.Error, key: "Type parameter '{0}' of exported class has or is using name '{1}' from private module '{2}'." },
278279
Type_parameter_0_of_exported_class_has_or_is_using_private_name_1: { code: 4002, category: DiagnosticCategory.Error, key: "Type parameter '{0}' of exported class has or is using private name '{1}'." },

src/compiler/diagnosticMessages.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1089,6 +1089,10 @@
10891089
"category": "Error",
10901090
"code": 2457
10911091
},
1092+
"An AMD module cannot have multiple name assignments.": {
1093+
"category": "Error",
1094+
"code": 2458
1095+
},
10921096

10931097
"Import declaration '{0}' is using private name '{1}'.": {
10941098
"category": "Error",

src/compiler/emitter.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2134,7 +2134,11 @@ module ts {
21342134
function emitAMDModule(node: SourceFile, startIndex: number) {
21352135
var imports = getExternalImportDeclarations(node);
21362136
writeLine();
2137-
write("define([\"require\", \"exports\"");
2137+
write("define(");
2138+
if(node.amdModuleName) {
2139+
write("\"" + node.amdModuleName + "\", ");
2140+
}
2141+
write("[\"require\", \"exports\"");
21382142
forEach(imports, imp => {
21392143
write(", ");
21402144
emitLiteral(imp.externalModuleName);

src/compiler/parser.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ module ts {
2020
interface ReferenceComments {
2121
referencedFiles: FileReference[];
2222
amdDependencies: string[];
23+
amdModuleName: string;
2324
}
2425

2526
export function getSourceFileOfNode(node: Node): SourceFile {
@@ -4248,6 +4249,7 @@ module ts {
42484249
function processReferenceComments(): ReferenceComments {
42494250
var referencedFiles: FileReference[] = [];
42504251
var amdDependencies: string[] = [];
4252+
var amdModuleName: string;
42514253
commentRanges = [];
42524254
token = scanner.scan();
42534255

@@ -4267,6 +4269,15 @@ module ts {
42674269
}
42684270
}
42694271
else {
4272+
var amdModuleNameRegEx = /^\/\/\/\s*<amd-module\s+name\s*=\s*('|")(.+?)\1/gim;
4273+
var amdModuleNameMatchResult = amdModuleNameRegEx.exec(comment);
4274+
if(amdModuleNameMatchResult) {
4275+
if(amdModuleName) {
4276+
errorAtPos(range.pos, range.end - range.pos, Diagnostics.An_AMD_module_cannot_have_multiple_name_assignments);
4277+
}
4278+
amdModuleName = amdModuleNameMatchResult[2];
4279+
}
4280+
42704281
var amdDependencyRegEx = /^\/\/\/\s*<amd-dependency\s+path\s*=\s*('|")(.+?)\1/gim;
42714282
var amdDependencyMatchResult = amdDependencyRegEx.exec(comment);
42724283
if (amdDependencyMatchResult) {
@@ -4277,7 +4288,8 @@ module ts {
42774288
commentRanges = undefined;
42784289
return {
42794290
referencedFiles: referencedFiles,
4280-
amdDependencies: amdDependencies
4291+
amdDependencies: amdDependencies,
4292+
amdModuleName: amdModuleName
42814293
};
42824294
}
42834295

@@ -4307,6 +4319,7 @@ module ts {
43074319
var referenceComments = processReferenceComments();
43084320
file.referencedFiles = referenceComments.referencedFiles;
43094321
file.amdDependencies = referenceComments.amdDependencies;
4322+
file.amdModuleName = referenceComments.amdModuleName;
43104323
file.statements = parseList(ParsingContext.SourceElements, /*checkForStrictMode*/ true, parseSourceElement);
43114324
file.externalModuleIndicator = getExternalModuleIndicator();
43124325
file.nodeCount = nodeCount;

src/compiler/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -642,6 +642,7 @@ module ts {
642642
getPositionFromLineAndCharacter(line: number, character: number): number;
643643
getLineStarts(): number[];
644644
amdDependencies: string[];
645+
amdModuleName: string;
645646
referencedFiles: FileReference[];
646647
syntacticErrors: Diagnostic[];
647648
semanticErrors: Diagnostic[];

src/services/services.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -718,6 +718,7 @@ module ts {
718718
public getPositionFromLineAndCharacter(line: number, character: number): number { return -1; }
719719
public getLineStarts(): number[] { return undefined; }
720720
public amdDependencies: string[];
721+
public amdModuleName: string;
721722
public referencedFiles: FileReference[];
722723
public syntacticErrors: Diagnostic[];
723724
public semanticErrors: Diagnostic[];
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
//// [amdModuleName1.ts]
2+
///<amd-module name='NamedModule'/>
3+
class Foo {
4+
x: number;
5+
constructor() {
6+
this.x = 5;
7+
}
8+
}
9+
export = Foo;
10+
11+
12+
//// [amdModuleName1.js]
13+
define("NamedModule", ["require", "exports"], function (require, exports) {
14+
///<amd-module name='NamedModule'/>
15+
var Foo = (function () {
16+
function Foo() {
17+
this.x = 5;
18+
}
19+
return Foo;
20+
})();
21+
return Foo;
22+
});
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
=== tests/cases/compiler/amdModuleName1.ts ===
2+
///<amd-module name='NamedModule'/>
3+
class Foo {
4+
>Foo : Foo
5+
6+
x: number;
7+
>x : number
8+
9+
constructor() {
10+
this.x = 5;
11+
>this.x = 5 : number
12+
>this.x : number
13+
>this : Foo
14+
>x : number
15+
}
16+
}
17+
export = Foo;
18+
>Foo : Foo
19+
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
tests/cases/compiler/amdModuleName2.ts(2,1): error TS2458: An AMD module cannot have multiple name assignments.
2+
3+
4+
==== tests/cases/compiler/amdModuleName2.ts (1 errors) ====
5+
///<amd-module name='FirstModuleName'/>
6+
///<amd-module name='SecondModuleName'/>
7+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8+
!!! error TS2458: An AMD module cannot have multiple name assignments.
9+
class Foo {
10+
x: number;
11+
constructor() {
12+
this.x = 5;
13+
}
14+
}
15+
export = Foo;
16+
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
//@module: amd
2+
///<amd-module name='NamedModule'/>
3+
class Foo {
4+
x: number;
5+
constructor() {
6+
this.x = 5;
7+
}
8+
}
9+
export = Foo;
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
//@module: amd
2+
///<amd-module name='FirstModuleName'/>
3+
///<amd-module name='SecondModuleName'/>
4+
class Foo {
5+
x: number;
6+
constructor() {
7+
this.x = 5;
8+
}
9+
}
10+
export = Foo;

0 commit comments

Comments
 (0)