Merge pull request #32563 from orta/fix_31298

Handle namepaths inside JSDoc type expressions a bit better
This commit is contained in:
Orta 2019-08-09 16:15:50 -07:00 committed by GitHub
commit 2a2866c3a9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 142 additions and 60 deletions

View File

@ -2435,6 +2435,25 @@ namespace ts {
function parseJSDocType(): TypeNode {
scanner.setInJSDocType(true);
const moduleSpecifier = parseOptionalToken(SyntaxKind.ModuleKeyword);
if (moduleSpecifier) {
const moduleTag = createNode(SyntaxKind.JSDocNamepathType, moduleSpecifier.pos) as JSDocNamepathType;
terminate: while (true) {
switch (token()) {
case SyntaxKind.CloseBraceToken:
case SyntaxKind.EndOfFileToken:
case SyntaxKind.CommaToken:
case SyntaxKind.WhitespaceTrivia:
break terminate;
default:
nextTokenJSDoc();
}
}
scanner.setInJSDocType(false);
return finishNode(moduleTag);
}
const dotdotdot = parseOptionalToken(SyntaxKind.DotDotDotToken);
let type = parseTypeOrTypePredicate();
scanner.setInJSDocType(false);

View File

@ -2025,7 +2025,7 @@ namespace ts {
// First non-whitespace character on this line.
let firstNonWhitespace = 0;
// These initial values are special because the first line is:
// firstNonWhitespace = 0 to indicate that we want leading whitspace,
// firstNonWhitespace = 0 to indicate that we want leading whitespace,
while (pos < end) {
char = text.charCodeAt(pos);

View File

@ -455,6 +455,8 @@ namespace ts {
JSDocOptionalType,
JSDocFunctionType,
JSDocVariadicType,
// https://jsdoc.app/about-namepaths.html
JSDocNamepathType,
JSDocComment,
JSDocTypeLiteral,
JSDocSignature,
@ -2430,6 +2432,11 @@ namespace ts {
type: TypeNode;
}
export interface JSDocNamepathType extends JSDocType {
kind: SyntaxKind.JSDocNamepathType;
type: TypeNode;
}
export type JSDocTypeReferencingNode = JSDocVariadicType | JSDocOptionalType | JSDocNullableType | JSDocNonNullableType;
export interface JSDoc extends Node {

View File

@ -1269,6 +1269,10 @@ namespace FourSlash {
private verifySignatureHelpWorker(options: FourSlashInterface.VerifySignatureHelpOptions) {
const help = this.getSignatureHelp({ triggerReason: options.triggerReason })!;
if (!help) {
this.raiseError("Could not get a help signature");
}
const selectedItem = help.items[help.selectedItemIndex];
// Argument index may exceed number of parameters
const currentParameter = selectedItem.parameters[help.argumentIndex] as ts.SignatureHelpParameter | undefined;

View File

@ -1,4 +1,5 @@
namespace ts {
/** The classifier is used for syntactic highlighting in editors via the TSServer */
export function createClassifier(): Classifier {
const scanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ false);

View File

@ -374,29 +374,30 @@ declare namespace ts {
JSDocOptionalType = 294,
JSDocFunctionType = 295,
JSDocVariadicType = 296,
JSDocComment = 297,
JSDocTypeLiteral = 298,
JSDocSignature = 299,
JSDocTag = 300,
JSDocAugmentsTag = 301,
JSDocAuthorTag = 302,
JSDocClassTag = 303,
JSDocCallbackTag = 304,
JSDocEnumTag = 305,
JSDocParameterTag = 306,
JSDocReturnTag = 307,
JSDocThisTag = 308,
JSDocTypeTag = 309,
JSDocTemplateTag = 310,
JSDocTypedefTag = 311,
JSDocPropertyTag = 312,
SyntaxList = 313,
NotEmittedStatement = 314,
PartiallyEmittedExpression = 315,
CommaListExpression = 316,
MergeDeclarationMarker = 317,
EndOfDeclarationMarker = 318,
Count = 319,
JSDocNamepathType = 297,
JSDocComment = 298,
JSDocTypeLiteral = 299,
JSDocSignature = 300,
JSDocTag = 301,
JSDocAugmentsTag = 302,
JSDocAuthorTag = 303,
JSDocClassTag = 304,
JSDocCallbackTag = 305,
JSDocEnumTag = 306,
JSDocParameterTag = 307,
JSDocReturnTag = 308,
JSDocThisTag = 309,
JSDocTypeTag = 310,
JSDocTemplateTag = 311,
JSDocTypedefTag = 312,
JSDocPropertyTag = 313,
SyntaxList = 314,
NotEmittedStatement = 315,
PartiallyEmittedExpression = 316,
CommaListExpression = 317,
MergeDeclarationMarker = 318,
EndOfDeclarationMarker = 319,
Count = 320,
FirstAssignment = 60,
LastAssignment = 72,
FirstCompoundAssignment = 61,
@ -423,9 +424,9 @@ declare namespace ts {
LastBinaryOperator = 72,
FirstNode = 149,
FirstJSDocNode = 289,
LastJSDocNode = 312,
FirstJSDocTagNode = 300,
LastJSDocTagNode = 312,
LastJSDocNode = 313,
FirstJSDocTagNode = 301,
LastJSDocTagNode = 313,
}
export enum NodeFlags {
None = 0,
@ -1558,6 +1559,10 @@ declare namespace ts {
kind: SyntaxKind.JSDocVariadicType;
type: TypeNode;
}
export interface JSDocNamepathType extends JSDocType {
kind: SyntaxKind.JSDocNamepathType;
type: TypeNode;
}
export type JSDocTypeReferencingNode = JSDocVariadicType | JSDocOptionalType | JSDocNullableType | JSDocNonNullableType;
export interface JSDoc extends Node {
kind: SyntaxKind.JSDocComment;
@ -5671,6 +5676,7 @@ declare namespace ts {
}
}
declare namespace ts {
/** The classifier is used for syntactic highlighting in editors via the TSServer */
function createClassifier(): Classifier;
}
declare namespace ts {

View File

@ -374,29 +374,30 @@ declare namespace ts {
JSDocOptionalType = 294,
JSDocFunctionType = 295,
JSDocVariadicType = 296,
JSDocComment = 297,
JSDocTypeLiteral = 298,
JSDocSignature = 299,
JSDocTag = 300,
JSDocAugmentsTag = 301,
JSDocAuthorTag = 302,
JSDocClassTag = 303,
JSDocCallbackTag = 304,
JSDocEnumTag = 305,
JSDocParameterTag = 306,
JSDocReturnTag = 307,
JSDocThisTag = 308,
JSDocTypeTag = 309,
JSDocTemplateTag = 310,
JSDocTypedefTag = 311,
JSDocPropertyTag = 312,
SyntaxList = 313,
NotEmittedStatement = 314,
PartiallyEmittedExpression = 315,
CommaListExpression = 316,
MergeDeclarationMarker = 317,
EndOfDeclarationMarker = 318,
Count = 319,
JSDocNamepathType = 297,
JSDocComment = 298,
JSDocTypeLiteral = 299,
JSDocSignature = 300,
JSDocTag = 301,
JSDocAugmentsTag = 302,
JSDocAuthorTag = 303,
JSDocClassTag = 304,
JSDocCallbackTag = 305,
JSDocEnumTag = 306,
JSDocParameterTag = 307,
JSDocReturnTag = 308,
JSDocThisTag = 309,
JSDocTypeTag = 310,
JSDocTemplateTag = 311,
JSDocTypedefTag = 312,
JSDocPropertyTag = 313,
SyntaxList = 314,
NotEmittedStatement = 315,
PartiallyEmittedExpression = 316,
CommaListExpression = 317,
MergeDeclarationMarker = 318,
EndOfDeclarationMarker = 319,
Count = 320,
FirstAssignment = 60,
LastAssignment = 72,
FirstCompoundAssignment = 61,
@ -423,9 +424,9 @@ declare namespace ts {
LastBinaryOperator = 72,
FirstNode = 149,
FirstJSDocNode = 289,
LastJSDocNode = 312,
FirstJSDocTagNode = 300,
LastJSDocTagNode = 312,
LastJSDocNode = 313,
FirstJSDocTagNode = 301,
LastJSDocTagNode = 313,
}
export enum NodeFlags {
None = 0,
@ -1558,6 +1559,10 @@ declare namespace ts {
kind: SyntaxKind.JSDocVariadicType;
type: TypeNode;
}
export interface JSDocNamepathType extends JSDocType {
kind: SyntaxKind.JSDocNamepathType;
type: TypeNode;
}
export type JSDocTypeReferencingNode = JSDocVariadicType | JSDocOptionalType | JSDocNullableType | JSDocNonNullableType;
export interface JSDoc extends Node {
kind: SyntaxKind.JSDocComment;
@ -5671,6 +5676,7 @@ declare namespace ts {
}
}
declare namespace ts {
/** The classifier is used for syntactic highlighting in editors via the TSServer */
function createClassifier(): Classifier;
}
declare namespace ts {

View File

@ -1,14 +1,8 @@
tests/cases/conformance/jsdoc/bug26693.js(1,15): error TS2580: Cannot find name 'module'. Do you need to install type definitions for node? Try `npm i @types/node`.
tests/cases/conformance/jsdoc/bug26693.js(1,21): error TS1005: '}' expected.
tests/cases/conformance/jsdoc/bug26693.js(2,22): error TS2307: Cannot find module 'nope'.
==== tests/cases/conformance/jsdoc/bug26693.js (3 errors) ====
==== tests/cases/conformance/jsdoc/bug26693.js (1 errors) ====
/** @typedef {module:locale} hi */
~~~~~~
!!! error TS2580: Cannot find name 'module'. Do you need to install type definitions for node? Try `npm i @types/node`.
~
!!! error TS1005: '}' expected.
import { nope } from 'nope';
~~~~~~
!!! error TS2307: Cannot find module 'nope'.

View File

@ -0,0 +1,45 @@
///<reference path="fourslash.ts" />
// @allowJs: true
// @Filename: 31298.js
/////**
//// * @returns {module:@nodefuel/web~Webserver~wsServer#hello} Websocket server object
//// */
////function foo() { }
////foo(''/*foo*/);
////
/////**
//// * @type {module:xxxxx} */
//// */
////function bar() { }
////bar(''/*bar*/);
////
/////** @type {function(module:xxxx, module:xxxx): module:xxxxx} */
////function zee() { }
////zee(''/*zee*/);
verify.signatureHelp({
marker: "foo",
text: "foo(): any",
docComment: "",
tags: [
{ name: "returns", text: "Websocket server object" },
],
});
verify.signatureHelp({
marker: "bar",
text: "bar(): void",
docComment: "",
tags: [],
});
verify.signatureHelp({
marker: "zee",
text: "zee(): any",
docComment: "",
tags: [
{ name: "type", text: "{function(module:xxxx, module:xxxx): module:xxxxx}" },
],
});