diff --git a/src/compiler/diagnosticInformationMap.generated.ts b/src/compiler/diagnosticInformationMap.generated.ts
index 349601a6db8e5..d32611457e1b7 100644
--- a/src/compiler/diagnosticInformationMap.generated.ts
+++ b/src/compiler/diagnosticInformationMap.generated.ts
@@ -270,6 +270,7 @@ module ts {
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}'." },
Type_alias_0_circularly_references_itself: { code: 2456, category: DiagnosticCategory.Error, key: "Type alias '{0}' circularly references itself." },
Type_alias_name_cannot_be_0: { code: 2457, category: DiagnosticCategory.Error, key: "Type alias name cannot be '{0}'" },
+ An_AMD_module_cannot_have_multiple_name_assignments: { code: 2458, category: DiagnosticCategory.Error, key: "An AMD module cannot have multiple name assignments." },
Import_declaration_0_is_using_private_name_1: { code: 4000, category: DiagnosticCategory.Error, key: "Import declaration '{0}' is using private name '{1}'." },
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}'." },
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}'." },
diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json
index 7359abefb6048..ea639e2bb5bc8 100644
--- a/src/compiler/diagnosticMessages.json
+++ b/src/compiler/diagnosticMessages.json
@@ -1076,6 +1076,10 @@
"category": "Error",
"code": 2457
},
+ "An AMD module cannot have multiple name assignments.": {
+ "category": "Error",
+ "code": 2458
+ },
"Import declaration '{0}' is using private name '{1}'.": {
"category": "Error",
diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts
index f61d4403eece6..4dfce94c928b9 100644
--- a/src/compiler/emitter.ts
+++ b/src/compiler/emitter.ts
@@ -2096,7 +2096,11 @@ module ts {
function emitAMDModule(node: SourceFile, startIndex: number) {
var imports = getExternalImportDeclarations(node);
writeLine();
- write("define([\"require\", \"exports\"");
+ write("define(");
+ if(node.amdModuleName) {
+ write("\"" + node.amdModuleName + "\", ");
+ }
+ write("[\"require\", \"exports\"");
forEach(imports, imp => {
write(", ");
emitLiteral(imp.externalModuleName);
diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts
index 4849cb8c89e5b..ae3e065bfc327 100644
--- a/src/compiler/parser.ts
+++ b/src/compiler/parser.ts
@@ -20,6 +20,7 @@ module ts {
interface ReferenceComments {
referencedFiles: FileReference[];
amdDependencies: string[];
+ amdModuleName: string;
}
export function getSourceFileOfNode(node: Node): SourceFile {
@@ -4218,6 +4219,7 @@ module ts {
function processReferenceComments(): ReferenceComments {
var referencedFiles: FileReference[] = [];
var amdDependencies: string[] = [];
+ var amdModuleName: string;
commentRanges = [];
token = scanner.scan();
@@ -4237,6 +4239,15 @@ module ts {
}
}
else {
+ var amdModuleNameRegEx = /^\/\/\/\s*
+class Foo {
+ x: number;
+ constructor() {
+ this.x = 5;
+ }
+}
+export = Foo;
+
+
+//// [amdModuleName1.js]
+define("NamedModule", ["require", "exports"], function (require, exports) {
+ ///
+ var Foo = (function () {
+ function Foo() {
+ this.x = 5;
+ }
+ return Foo;
+ })();
+ return Foo;
+});
diff --git a/tests/baselines/reference/amdModuleName1.types b/tests/baselines/reference/amdModuleName1.types
new file mode 100644
index 0000000000000..02ad947235431
--- /dev/null
+++ b/tests/baselines/reference/amdModuleName1.types
@@ -0,0 +1,19 @@
+=== tests/cases/compiler/amdModuleName1.ts ===
+///
+class Foo {
+>Foo : Foo
+
+ x: number;
+>x : number
+
+ constructor() {
+ this.x = 5;
+>this.x = 5 : number
+>this.x : number
+>this : Foo
+>x : number
+ }
+}
+export = Foo;
+>Foo : Foo
+
diff --git a/tests/baselines/reference/amdModuleName2.errors.txt b/tests/baselines/reference/amdModuleName2.errors.txt
new file mode 100644
index 0000000000000..911f31a1f4bea
--- /dev/null
+++ b/tests/baselines/reference/amdModuleName2.errors.txt
@@ -0,0 +1,16 @@
+tests/cases/compiler/amdModuleName2.ts(2,1): error TS2458: An AMD module cannot have multiple name assignments.
+
+
+==== tests/cases/compiler/amdModuleName2.ts (1 errors) ====
+ ///
+ ///
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+!!! error TS2458: An AMD module cannot have multiple name assignments.
+ class Foo {
+ x: number;
+ constructor() {
+ this.x = 5;
+ }
+ }
+ export = Foo;
+
\ No newline at end of file
diff --git a/tests/cases/compiler/amdModuleName1.ts b/tests/cases/compiler/amdModuleName1.ts
new file mode 100644
index 0000000000000..fef7956e3329f
--- /dev/null
+++ b/tests/cases/compiler/amdModuleName1.ts
@@ -0,0 +1,9 @@
+//@module: amd
+///
+class Foo {
+ x: number;
+ constructor() {
+ this.x = 5;
+ }
+}
+export = Foo;
diff --git a/tests/cases/compiler/amdModuleName2.ts b/tests/cases/compiler/amdModuleName2.ts
new file mode 100644
index 0000000000000..cca02a2265078
--- /dev/null
+++ b/tests/cases/compiler/amdModuleName2.ts
@@ -0,0 +1,10 @@
+//@module: amd
+///
+///
+class Foo {
+ x: number;
+ constructor() {
+ this.x = 5;
+ }
+}
+export = Foo;