From 909e0b19034df578509b0c9a0d98c7e680102ffd Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Tue, 2 Feb 2016 13:10:30 -0800 Subject: [PATCH 1/8] Always show file tokens in JS completion lists Fixes #6654 --- src/services/services.ts | 2 +- .../fourslash/getJavaScriptGlobalCompletions1.ts | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 tests/cases/fourslash/getJavaScriptGlobalCompletions1.ts diff --git a/src/services/services.ts b/src/services/services.ts index 058ae3e72cf..386a00dc85d 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -3830,7 +3830,7 @@ namespace ts { const entries: CompletionEntry[] = []; - if (isRightOfDot && isSourceFileJavaScript(sourceFile)) { + if (isSourceFileJavaScript(sourceFile)) { const uniqueNames = getCompletionEntriesFromSymbols(symbols, entries); addRange(entries, getJavaScriptCompletionEntries(sourceFile, location.pos, uniqueNames)); } diff --git a/tests/cases/fourslash/getJavaScriptGlobalCompletions1.ts b/tests/cases/fourslash/getJavaScriptGlobalCompletions1.ts new file mode 100644 index 00000000000..240df24bf52 --- /dev/null +++ b/tests/cases/fourslash/getJavaScriptGlobalCompletions1.ts @@ -0,0 +1,15 @@ +/// + +// @allowNonTsExtensions: true +// @Filename: Foo.js +//// function f() { +//// // helloWorld leaks from here into the global space? +//// if (helloWorld) { +//// return 3; +//// } +//// return 5; +//// } +//// +//// hello/**/ + +verify.completionListContains('helloWorld'); From 569f0b261c2384ebc786ad53ee8c48b8f1c96321 Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Tue, 2 Feb 2016 13:39:02 -0800 Subject: [PATCH 2/8] :heart: linter --- src/services/services.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/services.ts b/src/services/services.ts index 386a00dc85d..b553faad1ab 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -3819,7 +3819,7 @@ namespace ts { return undefined; } - const { symbols, isMemberCompletion, isNewIdentifierLocation, location, isRightOfDot, isJsDocTagName } = completionData; + const { symbols, isMemberCompletion, isNewIdentifierLocation, location, isJsDocTagName } = completionData; if (isJsDocTagName) { // If the current position is a jsDoc tag name, only tag names should be provided for completion From 37441e169890b51d50ae111ffed7a2168bea97b2 Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Wed, 3 Feb 2016 00:18:36 -0800 Subject: [PATCH 3/8] Recognize object literal method JSDoc comments Fixes #6825 (cherry picked from commit 8aad976c69ef4528f751a0312db2a40ed6a758d8) --- src/compiler/parser.ts | 4 +-- src/compiler/utilities.ts | 5 +++ .../fourslash/jsDocFunctionSignatures3.ts | 32 +++++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 tests/cases/fourslash/jsDocFunctionSignatures3.ts diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index bd05ceb1bd2..2840ef1aee6 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -3995,7 +3995,7 @@ namespace ts { shorthandDeclaration.equalsToken = equalsToken; shorthandDeclaration.objectAssignmentInitializer = allowInAnd(parseAssignmentExpressionOrHigher); } - return finishNode(shorthandDeclaration); + return addJSDocComment(finishNode(shorthandDeclaration)); } else { const propertyAssignment = createNode(SyntaxKind.PropertyAssignment, fullStart); @@ -4004,7 +4004,7 @@ namespace ts { propertyAssignment.questionToken = questionToken; parseExpected(SyntaxKind.ColonToken); propertyAssignment.initializer = allowInAnd(parseAssignmentExpressionOrHigher); - return finishNode(propertyAssignment); + return addJSDocComment(finishNode(propertyAssignment)); } } diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index d5813599f14..10fb18f5f4b 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -1224,6 +1224,11 @@ namespace ts { if (isSourceOfAssignmentExpressionStatement) { return node.parent.parent.jsDocComment; } + + const isPropertyAssignmentExpression = node.parent && node.parent.kind === SyntaxKind.PropertyAssignment; + if (isPropertyAssignmentExpression) { + return node.parent.jsDocComment; + } } return undefined; diff --git a/tests/cases/fourslash/jsDocFunctionSignatures3.ts b/tests/cases/fourslash/jsDocFunctionSignatures3.ts new file mode 100644 index 00000000000..3679035d31d --- /dev/null +++ b/tests/cases/fourslash/jsDocFunctionSignatures3.ts @@ -0,0 +1,32 @@ +/// + +// @allowNonTsExtensions: true +// @Filename: Foo.js + +//// var someObject = { +//// /** +//// * @param {string} param1 Some string param. +//// * @param {number} parm2 Some number param. +//// */ +//// someMethod: function(param1, param2) { +//// console.log(param1/*1*/); +//// return false; +//// }, +//// /** +//// * @param {number} p1 Some number param. +//// */ +//// otherMethod(p1) { +//// p1/*2*/ +//// } +//// +//// }; + +goTo.marker('1'); +edit.insert('.'); +verify.memberListContains('substr', undefined, undefined, 'method'); +edit.backspace(); + +goTo.marker('2'); +edit.insert('.'); +verify.memberListContains('toFixed', undefined, undefined, 'method'); +edit.backspace(); From 34b0b5c82d0290a751ff2bde02635c8e5aaad671 Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Wed, 3 Feb 2016 00:44:52 -0800 Subject: [PATCH 4/8] Capture `node.parent` (cherry picked from commit 1c7062313d2dde764ea7f7d20f2415b02d8d6fbb) --- src/compiler/utilities.ts | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 10fb18f5f4b..b1cd63ee5b3 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -1216,18 +1216,19 @@ namespace ts { } // Also recognize when the node is the RHS of an assignment expression + const parent = node.parent; const isSourceOfAssignmentExpressionStatement = - node.parent && node.parent.parent && - node.parent.kind === SyntaxKind.BinaryExpression && - (node.parent as BinaryExpression).operatorToken.kind === SyntaxKind.EqualsToken && - node.parent.parent.kind === SyntaxKind.ExpressionStatement; + parent && parent.parent && + parent.kind === SyntaxKind.BinaryExpression && + (parent as BinaryExpression).operatorToken.kind === SyntaxKind.EqualsToken && + parent.parent.kind === SyntaxKind.ExpressionStatement; if (isSourceOfAssignmentExpressionStatement) { - return node.parent.parent.jsDocComment; + return parent.parent.jsDocComment; } - const isPropertyAssignmentExpression = node.parent && node.parent.kind === SyntaxKind.PropertyAssignment; + const isPropertyAssignmentExpression = parent && parent.kind === SyntaxKind.PropertyAssignment; if (isPropertyAssignmentExpression) { - return node.parent.jsDocComment; + return parent.jsDocComment; } } From 78237739ba60354e6347946b19db7bafd9a1b015 Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Fri, 5 Feb 2016 10:46:15 -0800 Subject: [PATCH 5/8] Add more complex test scenarios (cherry picked from commit e347c3711cc4b85eda34f1aba844e1a6576ff40c) # Conflicts: # tests/cases/fourslash/jsDocGenerics1.ts --- tests/cases/fourslash/jsDocGenerics1.ts | 34 +++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 tests/cases/fourslash/jsDocGenerics1.ts diff --git a/tests/cases/fourslash/jsDocGenerics1.ts b/tests/cases/fourslash/jsDocGenerics1.ts new file mode 100644 index 00000000000..61358e3f490 --- /dev/null +++ b/tests/cases/fourslash/jsDocGenerics1.ts @@ -0,0 +1,34 @@ +/// + +// @allowNonTsExtensions: true +// @Filename: ref.d.ts +//// namespace Thing { +//// export interface Thung { +//// a: number; +//// ] +//// ] + + +// @Filename: Foo.js +//// +//// /** @type {Array} */ +//// var v; +//// v[0]./*1*/ +//// +//// /** @type {{x: Array>}} */ +//// var w; +//// w.x[0][0]./*2*/ +//// +//// /** @type {Array} */ +//// var x; +//// x[0].a./*3*/ + + +goTo.marker('1'); +verify.memberListContains("toFixed", /*displayText:*/ undefined, /*documentation*/ undefined, "method"); + +goTo.marker('2'); +verify.memberListContains("toFixed", /*displayText:*/ undefined, /*documentation*/ undefined, "method"); + +goTo.marker('3'); +verify.memberListContains("toFixed", /*displayText:*/ undefined, /*documentation*/ undefined, "method"); From 4035bf3006ca932234046de14928d7353f72ae55 Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Fri, 5 Feb 2016 10:47:09 -0800 Subject: [PATCH 6/8] Allow parsing TS-style generics in JSDoc Fixes #6814 (cherry picked from commit 6e06bb39a13281c6080e973e1a015aea66e8b9ce) # Conflicts: # tests/cases/fourslash/jsDocGenerics1.ts --- src/compiler/parser.ts | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 2840ef1aee6..041d34979ca 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -5765,16 +5765,22 @@ namespace ts { const result = createNode(SyntaxKind.JSDocTypeReference); result.name = parseSimplePropertyName(); - while (parseOptional(SyntaxKind.DotToken)) { - if (token === SyntaxKind.LessThanToken) { - result.typeArguments = parseTypeArguments(); - break; - } - else { - result.name = parseQualifiedName(result.name); + if (token === SyntaxKind.LessThanToken) { + result.typeArguments = parseTypeArguments(); + } + else { + while (parseOptional(SyntaxKind.DotToken)) { + if (token === SyntaxKind.LessThanToken) { + result.typeArguments = parseTypeArguments(); + break; + } + else { + result.name = parseQualifiedName(result.name); + } } } + return finishNode(result); } From 8d0267c854e2013b93b643280bbd1896c15b1c0a Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Wed, 3 Feb 2016 00:09:38 -0800 Subject: [PATCH 7/8] Recognize `=` as equivalent to `?` in JSDoc signatures Fixes #6811 (cherry picked from commit f7eac73a6f2e72470c581c62857e4ea7263e871e) --- src/compiler/parser.ts | 3 +++ tests/cases/fourslash/jsDocFunctionSignatures2.ts | 12 ++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 tests/cases/fourslash/jsDocFunctionSignatures2.ts diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 041d34979ca..fbc6c0d0286 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -5758,6 +5758,9 @@ namespace ts { function parseJSDocParameter(): ParameterDeclaration { const parameter = createNode(SyntaxKind.Parameter); parameter.type = parseJSDocType(); + if (parseOptional(SyntaxKind.EqualsToken)) { + parameter.questionToken = createNode(SyntaxKind.QuestionToken); + } return finishNode(parameter); } diff --git a/tests/cases/fourslash/jsDocFunctionSignatures2.ts b/tests/cases/fourslash/jsDocFunctionSignatures2.ts new file mode 100644 index 00000000000..174ea7d6560 --- /dev/null +++ b/tests/cases/fourslash/jsDocFunctionSignatures2.ts @@ -0,0 +1,12 @@ +/// + +// @allowNonTsExtensions: true +// @Filename: Foo.js + +//// /** @type {function(string, boolean=): number} */ +//// var f6; +//// +//// f6('', /**/false) + +goTo.marker(); +verify.currentSignatureHelpIs('f6(p0: string, p1?: boolean): number') From e4a6b670c1bc3c4143fbf8370be483c82d31cb0d Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Wed, 3 Feb 2016 10:05:58 -0800 Subject: [PATCH 8/8] Use different syntax kind here (cherry picked from commit d47097f009ce63eca1021ce646aaa04cab19fa64) --- src/compiler/parser.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index fbc6c0d0286..94ef398cf72 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -5759,7 +5759,7 @@ namespace ts { const parameter = createNode(SyntaxKind.Parameter); parameter.type = parseJSDocType(); if (parseOptional(SyntaxKind.EqualsToken)) { - parameter.questionToken = createNode(SyntaxKind.QuestionToken); + parameter.questionToken = createNode(SyntaxKind.EqualsToken); } return finishNode(parameter); }