From fbcddb61e2fa85815ab75c3517dbdda6b663f797 Mon Sep 17 00:00:00 2001 From: Andy Date: Mon, 12 Jun 2017 14:35:35 -0700 Subject: [PATCH] Don't bind JSDoc namespace in a TS file (#16416) --- src/compiler/binder.ts | 6 ++++-- src/compiler/parser.ts | 2 +- tests/baselines/reference/jsdocInTypeScript.errors.txt | 8 +++++++- tests/baselines/reference/jsdocInTypeScript.js | 5 +++++ tests/cases/compiler/jsdocInTypeScript.ts | 3 +++ 5 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index 38d526dac02..ba5022a7b3c 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -2138,8 +2138,10 @@ namespace ts { case SyntaxKind.EnumDeclaration: return bindEnumDeclaration(node); case SyntaxKind.ModuleDeclaration: - return bindModuleDeclaration(node); - + if (node.parent.kind !== ts.SyntaxKind.JSDocTypedefTag || isInJavaScriptFile(node)) { + return bindModuleDeclaration(node); + } + return undefined; // Jsx-attributes case SyntaxKind.JsxAttributes: return bindJsxAttributes(node); diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 6834c98586c..75186eca2c1 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -6851,7 +6851,7 @@ namespace ts { jsDocNamespaceNode.flags |= flags; jsDocNamespaceNode.name = typeNameOrNamespaceName; jsDocNamespaceNode.body = parseJSDocTypeNameWithNamespace(NodeFlags.NestedNamespace); - return jsDocNamespaceNode; + return finishNode(jsDocNamespaceNode); } if (typeNameOrNamespaceName && flags & NodeFlags.NestedNamespace) { diff --git a/tests/baselines/reference/jsdocInTypeScript.errors.txt b/tests/baselines/reference/jsdocInTypeScript.errors.txt index 9aa0e377010..ec3b7eab4b4 100644 --- a/tests/baselines/reference/jsdocInTypeScript.errors.txt +++ b/tests/baselines/reference/jsdocInTypeScript.errors.txt @@ -3,9 +3,10 @@ tests/cases/compiler/jsdocInTypeScript.ts(23,33): error TS2362: The left-hand si tests/cases/compiler/jsdocInTypeScript.ts(25,3): error TS2345: Argument of type '1' is not assignable to parameter of type 'boolean'. tests/cases/compiler/jsdocInTypeScript.ts(25,15): error TS2339: Property 'length' does not exist on type 'number'. tests/cases/compiler/jsdocInTypeScript.ts(30,3): error TS2339: Property 'x' does not exist on type '{}'. +tests/cases/compiler/jsdocInTypeScript.ts(42,12): error TS2503: Cannot find namespace 'N'. -==== tests/cases/compiler/jsdocInTypeScript.ts (5 errors) ==== +==== tests/cases/compiler/jsdocInTypeScript.ts (6 errors) ==== // JSDoc typedef tags are not bound TypeScript files. /** @typedef {function} T */ declare const x: T; @@ -55,4 +56,9 @@ tests/cases/compiler/jsdocInTypeScript.ts(30,3): error TS2339: Property 'x' does function tem(t: T): I { return {}; } let i: I; // Should succeed thanks to type parameter default + + /** @typedef {string} N.Str */ + import M = N; // Error: @typedef does not create namespaces in TypeScript code. + ~ +!!! error TS2503: Cannot find namespace 'N'. \ No newline at end of file diff --git a/tests/baselines/reference/jsdocInTypeScript.js b/tests/baselines/reference/jsdocInTypeScript.js index 961c11bb00b..3e653f0859a 100644 --- a/tests/baselines/reference/jsdocInTypeScript.js +++ b/tests/baselines/reference/jsdocInTypeScript.js @@ -38,6 +38,9 @@ interface I {} function tem(t: T): I { return {}; } let i: I; // Should succeed thanks to type parameter default + +/** @typedef {string} N.Str */ +import M = N; // Error: @typedef does not create namespaces in TypeScript code. //// [jsdocInTypeScript.js] @@ -63,3 +66,5 @@ z.x = 1; // Error /** @template T */ function tem(t) { return {}; } var i; // Should succeed thanks to type parameter default +/** @typedef {string} N.Str */ +var M = N; // Error: @typedef does not create namespaces in TypeScript code. diff --git a/tests/cases/compiler/jsdocInTypeScript.ts b/tests/cases/compiler/jsdocInTypeScript.ts index b0f052472e0..66cab24cc93 100644 --- a/tests/cases/compiler/jsdocInTypeScript.ts +++ b/tests/cases/compiler/jsdocInTypeScript.ts @@ -37,3 +37,6 @@ interface I {} function tem(t: T): I { return {}; } let i: I; // Should succeed thanks to type parameter default + +/** @typedef {string} N.Str */ +import M = N; // Error: @typedef does not create namespaces in TypeScript code.