From a3c5d5d37e54610d2e86ec44b1692522a3ed6931 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Thu, 21 Sep 2023 15:31:09 -0700 Subject: [PATCH] Make JSDoc skipping public, plus more configurable (#55739) --- src/compiler/parser.ts | 43 +-- src/compiler/program.ts | 10 +- src/compiler/scanner.ts | 49 +++- src/compiler/types.ts | 32 ++- src/compiler/watch.ts | 2 +- src/compiler/watchPublic.ts | 15 +- src/executeCommandLine/executeCommandLine.ts | 15 +- src/harness/fakesHosts.ts | 12 +- src/harness/fourslashImpl.ts | 1 + src/harness/harnessLanguageService.ts | 1 + src/server/editorServices.ts | 7 +- src/server/project.ts | 12 +- src/services/documentRegistry.ts | 9 +- src/services/services.ts | 14 +- src/services/shims.ts | 8 + src/services/textChanges.ts | 3 +- src/services/transpile.ts | 2 + src/services/types.ts | 3 + src/testRunner/tests.ts | 2 +- src/testRunner/unittests/skipJSDocParsing.ts | 76 +++++ .../unittests/skipNonSemanticJSDocParsing.ts | 60 ---- tests/baselines/reference/api/typescript.d.ts | 38 ++- .../deprecated-ParseAll-file.js.diff | 3 + .../deprecated-ParseAll-file.ts.diff | 3 + ...deprecated-ParseForTypeErrors-file.js.diff | 13 + ...eprecated-ParseForTypeErrors-file.ts.diff} | 8 +- .../deprecated-ParseForTypeInfo-file.js.diff | 13 + .../deprecated-ParseForTypeInfo-file.ts.diff | 123 +++++++++ .../deprecated-ParseNone-file.js.diff | 124 +++++++++ .../deprecated-ParseNone-file.ts.diff | 123 +++++++++ .../link-ParseAll-file.js.diff | 3 + .../link-ParseAll-file.ts.diff | 3 + .../link-ParseForTypeErrors-file.js.diff | 13 + .../link-ParseForTypeErrors-file.ts.diff} | 8 +- .../link-ParseForTypeInfo-file.js.diff | 13 + .../link-ParseForTypeInfo-file.ts.diff | 67 +++++ .../link-ParseNone-file.js.diff | 68 +++++ .../link-ParseNone-file.ts.diff | 67 +++++ .../see-ParseAll-file.js.diff | 3 + .../see-ParseAll-file.ts.diff | 3 + .../see-ParseForTypeErrors-file.js.diff | 13 + .../see-ParseForTypeErrors-file.ts.diff} | 8 +- .../see-ParseForTypeInfo-file.js.diff | 13 + .../see-ParseForTypeInfo-file.ts.diff | 259 +++++++++++++++++ .../see-ParseNone-file.js.diff | 260 ++++++++++++++++++ .../see-ParseNone-file.ts.diff | 259 +++++++++++++++++ 46 files changed, 1741 insertions(+), 143 deletions(-) create mode 100644 src/testRunner/unittests/skipJSDocParsing.ts delete mode 100644 src/testRunner/unittests/skipNonSemanticJSDocParsing.ts create mode 100644 tests/baselines/reference/skipJSDocParsing/deprecated-ParseAll-file.js.diff create mode 100644 tests/baselines/reference/skipJSDocParsing/deprecated-ParseAll-file.ts.diff create mode 100644 tests/baselines/reference/skipJSDocParsing/deprecated-ParseForTypeErrors-file.js.diff rename tests/baselines/reference/{skipNonSemanticJSDocParsing/deprecated.diff => skipJSDocParsing/deprecated-ParseForTypeErrors-file.ts.diff} (94%) create mode 100644 tests/baselines/reference/skipJSDocParsing/deprecated-ParseForTypeInfo-file.js.diff create mode 100644 tests/baselines/reference/skipJSDocParsing/deprecated-ParseForTypeInfo-file.ts.diff create mode 100644 tests/baselines/reference/skipJSDocParsing/deprecated-ParseNone-file.js.diff create mode 100644 tests/baselines/reference/skipJSDocParsing/deprecated-ParseNone-file.ts.diff create mode 100644 tests/baselines/reference/skipJSDocParsing/link-ParseAll-file.js.diff create mode 100644 tests/baselines/reference/skipJSDocParsing/link-ParseAll-file.ts.diff create mode 100644 tests/baselines/reference/skipJSDocParsing/link-ParseForTypeErrors-file.js.diff rename tests/baselines/reference/{skipNonSemanticJSDocParsing/link.diff => skipJSDocParsing/link-ParseForTypeErrors-file.ts.diff} (65%) create mode 100644 tests/baselines/reference/skipJSDocParsing/link-ParseForTypeInfo-file.js.diff create mode 100644 tests/baselines/reference/skipJSDocParsing/link-ParseForTypeInfo-file.ts.diff create mode 100644 tests/baselines/reference/skipJSDocParsing/link-ParseNone-file.js.diff create mode 100644 tests/baselines/reference/skipJSDocParsing/link-ParseNone-file.ts.diff create mode 100644 tests/baselines/reference/skipJSDocParsing/see-ParseAll-file.js.diff create mode 100644 tests/baselines/reference/skipJSDocParsing/see-ParseAll-file.ts.diff create mode 100644 tests/baselines/reference/skipJSDocParsing/see-ParseForTypeErrors-file.js.diff rename tests/baselines/reference/{skipNonSemanticJSDocParsing/see.diff => skipJSDocParsing/see-ParseForTypeErrors-file.ts.diff} (65%) create mode 100644 tests/baselines/reference/skipJSDocParsing/see-ParseForTypeInfo-file.js.diff create mode 100644 tests/baselines/reference/skipJSDocParsing/see-ParseForTypeInfo-file.ts.diff create mode 100644 tests/baselines/reference/skipJSDocParsing/see-ParseNone-file.js.diff create mode 100644 tests/baselines/reference/skipJSDocParsing/see-ParseNone-file.ts.diff diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 43f542270d9d8..2a8f9f5165cc2 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -187,6 +187,7 @@ import { JSDocOverloadTag, JSDocOverrideTag, JSDocParameterTag, + JSDocParsingMode, JSDocPrivateTag, JSDocPropertyLikeTag, JSDocPropertyTag, @@ -1318,16 +1319,14 @@ export interface CreateSourceFileOptions { setExternalModuleIndicator?: (file: SourceFile) => void; /** @internal */ packageJsonLocations?: readonly string[]; /** @internal */ packageJsonScope?: PackageJsonInfo; + jsDocParsingMode?: JSDocParsingMode; } function setExternalModuleIndicator(sourceFile: SourceFile) { sourceFile.externalModuleIndicator = isFileProbablyExternalModule(sourceFile); } -export function createSourceFile(fileName: string, sourceText: string, languageVersionOrOptions: ScriptTarget | CreateSourceFileOptions, setParentNodes?: boolean, scriptKind?: ScriptKind): SourceFile; -/** @internal */ -export function createSourceFile(fileName: string, sourceText: string, languageVersionOrOptions: ScriptTarget | CreateSourceFileOptions, setParentNodes?: boolean, scriptKind?: ScriptKind, skipNonSemanticJSDoc?: boolean): SourceFile; -export function createSourceFile(fileName: string, sourceText: string, languageVersionOrOptions: ScriptTarget | CreateSourceFileOptions, setParentNodes = false, scriptKind?: ScriptKind, skipNonSemanticJSDoc?: boolean): SourceFile { +export function createSourceFile(fileName: string, sourceText: string, languageVersionOrOptions: ScriptTarget | CreateSourceFileOptions, setParentNodes = false, scriptKind?: ScriptKind): SourceFile { tracing?.push(tracing.Phase.Parse, "createSourceFile", { path: fileName }, /*separateBeginAndEnd*/ true); performance.mark("beforeParse"); let result: SourceFile; @@ -1337,16 +1336,17 @@ export function createSourceFile(fileName: string, sourceText: string, languageV languageVersion, setExternalModuleIndicator: overrideSetExternalModuleIndicator, impliedNodeFormat: format, + jsDocParsingMode, } = typeof languageVersionOrOptions === "object" ? languageVersionOrOptions : ({ languageVersion: languageVersionOrOptions } as CreateSourceFileOptions); if (languageVersion === ScriptTarget.JSON) { - result = Parser.parseSourceFile(fileName, sourceText, languageVersion, /*syntaxCursor*/ undefined, setParentNodes, ScriptKind.JSON, noop, skipNonSemanticJSDoc); + result = Parser.parseSourceFile(fileName, sourceText, languageVersion, /*syntaxCursor*/ undefined, setParentNodes, ScriptKind.JSON, noop, jsDocParsingMode); } else { const setIndicator = format === undefined ? overrideSetExternalModuleIndicator : (file: SourceFile) => { file.impliedNodeFormat = format; return (overrideSetExternalModuleIndicator || setExternalModuleIndicator)(file); }; - result = Parser.parseSourceFile(fileName, sourceText, languageVersion, /*syntaxCursor*/ undefined, setParentNodes, scriptKind, setIndicator, skipNonSemanticJSDoc); + result = Parser.parseSourceFile(fileName, sourceText, languageVersion, /*syntaxCursor*/ undefined, setParentNodes, scriptKind, setIndicator, jsDocParsingMode); } perfLogger?.logStopParseSourceFile(); @@ -1586,7 +1586,7 @@ namespace Parser { setParentNodes = false, scriptKind?: ScriptKind, setExternalModuleIndicatorOverride?: (file: SourceFile) => void, - skipNonSemanticJSDoc?: boolean, + jsDocParsingMode = JSDocParsingMode.ParseAll, ): SourceFile { scriptKind = ensureScriptKind(fileName, scriptKind); if (scriptKind === ScriptKind.JSON) { @@ -1601,10 +1601,9 @@ namespace Parser { return result; } - skipNonSemanticJSDoc = !!skipNonSemanticJSDoc && scriptKind !== ScriptKind.JS && scriptKind !== ScriptKind.JSX; - initializeState(fileName, sourceText, languageVersion, syntaxCursor, scriptKind, skipNonSemanticJSDoc); + initializeState(fileName, sourceText, languageVersion, syntaxCursor, scriptKind, jsDocParsingMode); - const result = parseSourceFileWorker(languageVersion, setParentNodes, scriptKind, setExternalModuleIndicatorOverride || setExternalModuleIndicator, skipNonSemanticJSDoc); + const result = parseSourceFileWorker(languageVersion, setParentNodes, scriptKind, setExternalModuleIndicatorOverride || setExternalModuleIndicator, jsDocParsingMode); clearState(); @@ -1613,7 +1612,7 @@ namespace Parser { export function parseIsolatedEntityName(content: string, languageVersion: ScriptTarget): EntityName | undefined { // Choice of `isDeclarationFile` should be arbitrary - initializeState("", content, languageVersion, /*syntaxCursor*/ undefined, ScriptKind.JS, /*skipNonSemanticJSDoc*/ false); + initializeState("", content, languageVersion, /*syntaxCursor*/ undefined, ScriptKind.JS, JSDocParsingMode.ParseAll); // Prime the scanner. nextToken(); const entityName = parseEntityName(/*allowReservedWords*/ true); @@ -1623,7 +1622,7 @@ namespace Parser { } export function parseJsonText(fileName: string, sourceText: string, languageVersion: ScriptTarget = ScriptTarget.ES2015, syntaxCursor?: IncrementalParser.SyntaxCursor, setParentNodes = false): JsonSourceFile { - initializeState(fileName, sourceText, languageVersion, syntaxCursor, ScriptKind.JSON, /*skipNonSemanticJSDoc*/ false); + initializeState(fileName, sourceText, languageVersion, syntaxCursor, ScriptKind.JSON, JSDocParsingMode.ParseAll); sourceFlags = contextFlags; // Prime the scanner. @@ -1711,7 +1710,7 @@ namespace Parser { return result; } - function initializeState(_fileName: string, _sourceText: string, _languageVersion: ScriptTarget, _syntaxCursor: IncrementalParser.SyntaxCursor | undefined, _scriptKind: ScriptKind, _skipNonSemanticJSDoc: boolean) { + function initializeState(_fileName: string, _sourceText: string, _languageVersion: ScriptTarget, _syntaxCursor: IncrementalParser.SyntaxCursor | undefined, _scriptKind: ScriptKind, _jsDocParsingMode: JSDocParsingMode) { NodeConstructor = objectAllocator.getNodeConstructor(); TokenConstructor = objectAllocator.getTokenConstructor(); IdentifierConstructor = objectAllocator.getIdentifierConstructor(); @@ -1752,7 +1751,8 @@ namespace Parser { scanner.setOnError(scanError); scanner.setScriptTarget(languageVersion); scanner.setLanguageVariant(languageVariant); - scanner.setSkipNonSemanticJSDoc(_skipNonSemanticJSDoc); + scanner.setScriptKind(scriptKind); + scanner.setJSDocParsingMode(_jsDocParsingMode); } function clearState() { @@ -1760,7 +1760,8 @@ namespace Parser { scanner.clearCommentDirectives(); scanner.setText(""); scanner.setOnError(undefined); - scanner.setSkipNonSemanticJSDoc(false); + scanner.setScriptKind(ScriptKind.Unknown); + scanner.setJSDocParsingMode(JSDocParsingMode.ParseAll); // Clear any data. We don't want to accidentally hold onto it for too long. sourceText = undefined!; @@ -1777,7 +1778,7 @@ namespace Parser { topLevel = true; } - function parseSourceFileWorker(languageVersion: ScriptTarget, setParentNodes: boolean, scriptKind: ScriptKind, setExternalModuleIndicator: (file: SourceFile) => void, skipNonSemanticJSDoc: boolean): SourceFile { + function parseSourceFileWorker(languageVersion: ScriptTarget, setParentNodes: boolean, scriptKind: ScriptKind, setExternalModuleIndicator: (file: SourceFile) => void, jsDocParsingMode: JSDocParsingMode): SourceFile { const isDeclarationFile = isDeclarationFileName(fileName); if (isDeclarationFile) { contextFlags |= NodeFlags.Ambient; @@ -1804,7 +1805,7 @@ namespace Parser { sourceFile.identifierCount = identifierCount; sourceFile.identifiers = identifiers; sourceFile.parseDiagnostics = attachFileToDiagnostics(parseDiagnostics, sourceFile); - sourceFile.skipNonSemanticJSDoc = skipNonSemanticJSDoc; + sourceFile.jsDocParsingMode = jsDocParsingMode; if (jsDocDiagnostics) { sourceFile.jsDocDiagnostics = attachFileToDiagnostics(jsDocDiagnostics, sourceFile); } @@ -8686,7 +8687,7 @@ namespace Parser { export namespace JSDocParser { export function parseJSDocTypeExpressionForTests(content: string, start: number | undefined, length: number | undefined): { jsDocTypeExpression: JSDocTypeExpression; diagnostics: Diagnostic[]; } | undefined { - initializeState("file.js", content, ScriptTarget.Latest, /*syntaxCursor*/ undefined, ScriptKind.JS, /*skipNonSemanticJSDoc*/ false); + initializeState("file.js", content, ScriptTarget.Latest, /*syntaxCursor*/ undefined, ScriptKind.JS, JSDocParsingMode.ParseAll); scanner.setText(content, start, length); currentToken = scanner.scan(); const jsDocTypeExpression = parseJSDocTypeExpression(); @@ -8736,7 +8737,7 @@ namespace Parser { } export function parseIsolatedJSDocComment(content: string, start: number | undefined, length: number | undefined): { jsDoc: JSDoc; diagnostics: Diagnostic[]; } | undefined { - initializeState("", content, ScriptTarget.Latest, /*syntaxCursor*/ undefined, ScriptKind.JS, /*skipNonSemanticJSDoc*/ false); + initializeState("", content, ScriptTarget.Latest, /*syntaxCursor*/ undefined, ScriptKind.JS, JSDocParsingMode.ParseAll); const jsDoc = doInsideOfContext(NodeFlags.JSDoc, () => parseJSDocCommentWorker(start, length)); const sourceFile = { languageVariant: LanguageVariant.Standard, text: content } as SourceFile; @@ -9804,7 +9805,7 @@ namespace IncrementalParser { if (sourceFile.statements.length === 0) { // If we don't have any statements in the current source file, then there's no real // way to incrementally parse. So just do a full parse instead. - return Parser.parseSourceFile(sourceFile.fileName, newText, sourceFile.languageVersion, /*syntaxCursor*/ undefined, /*setParentNodes*/ true, sourceFile.scriptKind, sourceFile.setExternalModuleIndicator, sourceFile.skipNonSemanticJSDoc); + return Parser.parseSourceFile(sourceFile.fileName, newText, sourceFile.languageVersion, /*syntaxCursor*/ undefined, /*setParentNodes*/ true, sourceFile.scriptKind, sourceFile.setExternalModuleIndicator, sourceFile.jsDocParsingMode); } // Make sure we're not trying to incrementally update a source file more than once. Once @@ -9867,7 +9868,7 @@ namespace IncrementalParser { // inconsistent tree. Setting the parents on the new tree should be very fast. We // will immediately bail out of walking any subtrees when we can see that their parents // are already correct. - const result = Parser.parseSourceFile(sourceFile.fileName, newText, sourceFile.languageVersion, syntaxCursor, /*setParentNodes*/ true, sourceFile.scriptKind, sourceFile.setExternalModuleIndicator, sourceFile.skipNonSemanticJSDoc); + const result = Parser.parseSourceFile(sourceFile.fileName, newText, sourceFile.languageVersion, syntaxCursor, /*setParentNodes*/ true, sourceFile.scriptKind, sourceFile.setExternalModuleIndicator, sourceFile.jsDocParsingMode); result.commentDirectives = getNewCommentDirectives( sourceFile.commentDirectives, result.commentDirectives, diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 73810c6fc89ed..d5d7df674f2c9 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -399,7 +399,6 @@ export function createGetSourceFile( readFile: ProgramHost["readFile"], getCompilerOptions: () => CompilerOptions, setParentNodes: boolean | undefined, - skipNonSemanticJSDocParsing: boolean | undefined, ): CompilerHost["getSourceFile"] { return (fileName, languageVersionOrOptions, onError) => { let text: string | undefined; @@ -415,7 +414,7 @@ export function createGetSourceFile( } text = ""; } - return text !== undefined ? createSourceFile(fileName, text, languageVersionOrOptions, setParentNodes, /*scriptKind*/ undefined, skipNonSemanticJSDocParsing) : undefined; + return text !== undefined ? createSourceFile(fileName, text, languageVersionOrOptions, setParentNodes) : undefined; }; } @@ -456,7 +455,6 @@ export function createWriteFileMeasuringIO( export function createCompilerHostWorker( options: CompilerOptions, setParentNodes?: boolean, - skipNonSemanticJSDocParsing?: boolean, system: System = sys, ): CompilerHost { const existingDirectories = new Map(); @@ -479,7 +477,7 @@ export function createCompilerHostWorker( const newLine = getNewLineCharacter(options); const realpath = system.realpath && ((path: string) => system.realpath!(path)); const compilerHost: CompilerHost = { - getSourceFile: createGetSourceFile(fileName => compilerHost.readFile(fileName), () => options, setParentNodes, skipNonSemanticJSDocParsing), + getSourceFile: createGetSourceFile(fileName => compilerHost.readFile(fileName), () => options, setParentNodes), getDefaultLibLocation, getDefaultLibFileName: options => combinePaths(getDefaultLibLocation(), getDefaultLibFileName(options)), writeFile: createWriteFileMeasuringIO( @@ -3515,8 +3513,8 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg const languageVersion = getEmitScriptTarget(options); const setExternalModuleIndicator = getSetExternalModuleIndicator(options); return typeof result === "object" ? - { ...result, languageVersion, setExternalModuleIndicator } : - { languageVersion, impliedNodeFormat: result, setExternalModuleIndicator }; + { ...result, languageVersion, setExternalModuleIndicator, jsDocParsingMode: host.jsDocParsingMode } : + { languageVersion, impliedNodeFormat: result, setExternalModuleIndicator, jsDocParsingMode: host.jsDocParsingMode }; } function findSourceFileWorker(fileName: string, isDefaultLib: boolean, ignoreNoDefaultLib: boolean, reason: FileIncludeReason, packageId: PackageId | undefined): SourceFile | undefined { diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts index 71059c4acd0b4..8a2c896140838 100644 --- a/src/compiler/scanner.ts +++ b/src/compiler/scanner.ts @@ -12,6 +12,7 @@ import { DiagnosticMessage, Diagnostics, identity, + JSDocParsingMode, JSDocSyntaxKind, JsxTokenSyntaxKind, KeywordSyntaxKind, @@ -21,6 +22,7 @@ import { parsePseudoBigInt, positionIsSynthesized, PunctuationOrKeywordSyntaxKind, + ScriptKind, ScriptTarget, SourceFileLike, SyntaxKind, @@ -95,6 +97,8 @@ export interface Scanner { setOnError(onError: ErrorCallback | undefined): void; setScriptTarget(scriptTarget: ScriptTarget): void; setLanguageVariant(variant: LanguageVariant): void; + setScriptKind(scriptKind: ScriptKind): void; + setJSDocParsingMode(kind: JSDocParsingMode): void; /** @deprecated use {@link resetTokenState} */ setTextPos(textPos: number): void; resetTokenState(pos: number): void; @@ -114,8 +118,6 @@ export interface Scanner { // callback returns something truthy, then the scanner state is not rolled back. The result // of invoking the callback is returned from this function. tryScan(callback: () => T): T; - /** @internal */ - setSkipNonSemanticJSDoc(skip: boolean): void; } /** @internal */ @@ -345,10 +347,7 @@ const commentDirectiveRegExSingleLine = /^\/\/\/?\s*@(ts-expect-error|ts-ignore) */ const commentDirectiveRegExMultiLine = /^(?:\/|\*)*\s*@(ts-expect-error|ts-ignore)/; -/** - * Test for whether a comment contains a JSDoc tag needed by the checker when run in tsc. - */ -const semanticJSDocTagRegEx = /@(?:see|link)/i; +const jsDocSeeOrLink = /@(?:see|link)/i; function lookupInUnicodeMap(code: number, map: readonly number[]): boolean { // Bail out quickly if it couldn't possibly be in the map. @@ -1008,7 +1007,8 @@ export function createScanner(languageVersion: ScriptTarget, skipTrivia: boolean var commentDirectives: CommentDirective[] | undefined; var inJSDocType = 0; - var skipNonSemanticJSDoc = false; + var scriptKind = ScriptKind.Unknown; + var jsDocParsingMode = JSDocParsingMode.ParseAll; setText(text, start, length); @@ -1054,6 +1054,8 @@ export function createScanner(languageVersion: ScriptTarget, skipTrivia: boolean setText, setScriptTarget, setLanguageVariant, + setScriptKind, + setJSDocParsingMode, setOnError, resetTokenState, setTextPos: resetTokenState, @@ -1061,7 +1063,6 @@ export function createScanner(languageVersion: ScriptTarget, skipTrivia: boolean tryScan, lookAhead, scanRange, - setSkipNonSemanticJSDoc, }; /* eslint-enable no-var */ @@ -2003,7 +2004,7 @@ export function createScanner(languageVersion: ScriptTarget, skipTrivia: boolean } } - if (isJSDoc && (!skipNonSemanticJSDoc || semanticJSDocTagRegEx.test(text.slice(fullStartPos, pos)))) { + if (isJSDoc && shouldParseJSDoc()) { tokenFlags |= TokenFlags.PrecedingJSDocComment; } @@ -2288,6 +2289,28 @@ export function createScanner(languageVersion: ScriptTarget, skipTrivia: boolean } } + function shouldParseJSDoc() { + switch (jsDocParsingMode) { + case JSDocParsingMode.ParseAll: + return true; + case JSDocParsingMode.ParseNone: + return false; + } + + if (scriptKind !== ScriptKind.TS && scriptKind !== ScriptKind.TSX) { + // If outside of TS, we need JSDoc to get any type info. + return true; + } + + if (jsDocParsingMode === JSDocParsingMode.ParseForTypeInfo) { + // If we're in TS, but we don't need to produce reliable errors, + // we don't need to parse to find @see or @link. + return false; + } + + return jsDocSeeOrLink.test(text.slice(fullStartPos, pos)); + } + function reScanInvalidIdentifier(): SyntaxKind { Debug.assert(token === SyntaxKind.Unknown, "'reScanInvalidIdentifier' should only be called when the current token is 'SyntaxKind.Unknown'."); pos = tokenStart = fullStartPos; @@ -2788,8 +2811,12 @@ export function createScanner(languageVersion: ScriptTarget, skipTrivia: boolean languageVariant = variant; } - function setSkipNonSemanticJSDoc(skip: boolean) { - skipNonSemanticJSDoc = skip; + function setScriptKind(kind: ScriptKind) { + scriptKind = kind; + } + + function setJSDocParsingMode(kind: JSDocParsingMode) { + jsDocParsingMode = kind; } function resetTokenState(position: number) { diff --git a/src/compiler/types.ts b/src/compiler/types.ts index cf6bc023f8d5a..31b70fbc1bb51 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -4293,7 +4293,7 @@ export interface SourceFile extends Declaration, LocalsContainer { /** @internal */ exportedModulesFromDeclarationEmit?: ExportedModulesFromDeclarationEmit; /** @internal */ endFlowNode?: FlowNode; - /** @internal */ skipNonSemanticJSDoc?: boolean; + /** @internal */ jsDocParsingMode?: JSDocParsingMode; } /** @internal */ @@ -7786,6 +7786,8 @@ export interface CompilerHost extends ModuleResolutionHost { // For testing: /** @internal */ storeFilesChangingSignatureDuringEmit?: boolean; /** @internal */ getBuildInfo?(fileName: string, configFilePath: string | undefined): BuildInfo | undefined; + + jsDocParsingMode?: JSDocParsingMode; } /** true if --out otherwise source file name * @@ -9853,6 +9855,34 @@ export const commentPragmas = { }, } as const; +export const enum JSDocParsingMode { + /** + * Always parse JSDoc comments and include them in the AST. + * + * This is the default if no mode is provided. + */ + ParseAll, + /** + * Never parse JSDoc comments, mo matter the file type. + */ + ParseNone, + /** + * Parse only JSDoc comments which are needed to provide correct type errors. + * + * This will always parse JSDoc in non-TS files, but only parse JSDoc comments + * containing `@see` and `@link` in TS files. + */ + ParseForTypeErrors, + /** + * Parse only JSDoc comments which are needed to provide correct type info. + * + * This will always parse JSDoc in non-TS files, but never in TS files. + * + * Note: Do not use this mode if you require accurate type errors; use {@link ParseForTypeErrors} instead. + */ + ParseForTypeInfo, +} + /** @internal */ export type PragmaArgTypeMaybeCapture = TDesc extends { captureSpan: true; } ? { value: string; pos: number; end: number; } : string; diff --git a/src/compiler/watch.ts b/src/compiler/watch.ts index f87c3f7265968..517a6fab011f4 100644 --- a/src/compiler/watch.ts +++ b/src/compiler/watch.ts @@ -746,7 +746,6 @@ export function createCompilerHostFromProgramHost(host: ProgramHost, getCom (fileName, encoding) => !encoding ? compilerHost.readFile(fileName) : host.readFile(fileName, encoding), getCompilerOptions, /*setParentNodes*/ undefined, - host.skipNonSemanticJSDocParsing, ), getDefaultLibLocation: maybeBind(host, host.getDefaultLibLocation), getDefaultLibFileName: options => host.getDefaultLibFileName(options), @@ -769,6 +768,7 @@ export function createCompilerHostFromProgramHost(host: ProgramHost, getCom createHash: maybeBind(host, host.createHash), readDirectory: maybeBind(host, host.readDirectory), storeFilesChangingSignatureDuringEmit: host.storeFilesChangingSignatureDuringEmit, + jsDocParsingMode: host.jsDocParsingMode, }; return compilerHost; } diff --git a/src/compiler/watchPublic.ts b/src/compiler/watchPublic.ts index 6f432177ac8d5..266be7e16fc31 100644 --- a/src/compiler/watchPublic.ts +++ b/src/compiler/watchPublic.ts @@ -53,6 +53,7 @@ import { isArray, isIgnoredFileFromWildCardWatching, isProgramUptoDate, + JSDocParsingMode, MapLike, maybeBind, ModuleResolutionCache, @@ -118,11 +119,8 @@ export function readBuilderProgram(compilerOptions: CompilerOptions, host: ReadB return createBuilderProgramUsingProgramBuildInfo(buildInfo, buildInfoPath, host); } -export function createIncrementalCompilerHost(options: CompilerOptions, system?: System): CompilerHost; -/** @internal */ -export function createIncrementalCompilerHost(options: CompilerOptions, system?: System, skipNonSemanticJSDocParsing?: boolean): CompilerHost; -export function createIncrementalCompilerHost(options: CompilerOptions, system = sys, skipNonSemanticJSDocParsing?: boolean): CompilerHost { - const host = createCompilerHostWorker(options, /*setParentNodes*/ undefined, skipNonSemanticJSDocParsing, system); +export function createIncrementalCompilerHost(options: CompilerOptions, system = sys): CompilerHost { + const host = createCompilerHostWorker(options, /*setParentNodes*/ undefined, system); host.createHash = maybeBind(system, system.createHash); host.storeFilesChangingSignatureDuringEmit = system.storeFilesChangingSignatureDuringEmit; setGetSourceFileAsHashVersioned(host); @@ -258,12 +256,7 @@ export interface ProgramHost { */ getModuleResolutionCache?(): ModuleResolutionCache | undefined; - /** - * True if it's safe for the parser to skip parsing non-semantic JSDoc tags. - * - * @internal - */ - skipNonSemanticJSDocParsing?: boolean; + jsDocParsingMode?: JSDocParsingMode; } /** * Internal interface used to wire emit through same host diff --git a/src/executeCommandLine/executeCommandLine.ts b/src/executeCommandLine/executeCommandLine.ts index 99aa3b345ba45..19f16d0ef6e77 100644 --- a/src/executeCommandLine/executeCommandLine.ts +++ b/src/executeCommandLine/executeCommandLine.ts @@ -57,6 +57,7 @@ import { getNormalizedAbsolutePath, isIncrementalCompilation, isWatchSet, + JSDocParsingMode, normalizePath, optionDeclarations, optionsForBuild, @@ -790,7 +791,7 @@ function reportWatchModeWithoutSysSupport(sys: System, reportDiagnostic: Diagnos } // This could be inlined everywhere, but this is convenient for debugging and patching. -const skipNonSemanticJSDocParsing = true; +const defaultJSDocParsingMode = JSDocParsingMode.ParseForTypeErrors; function performBuild( sys: System, @@ -842,7 +843,7 @@ function performBuild( createBuilderStatusReporter(sys, shouldBePretty(sys, buildOptions)), createWatchStatusReporter(sys, buildOptions), ); - buildHost.skipNonSemanticJSDocParsing = skipNonSemanticJSDocParsing; + buildHost.jsDocParsingMode = defaultJSDocParsingMode; const solutionPerformance = enableSolutionPerformance(sys, buildOptions); updateSolutionBuilderHost(sys, cb, buildHost, solutionPerformance); const onWatchStatusChange = buildHost.onWatchStatusChange; @@ -872,7 +873,7 @@ function performBuild( createBuilderStatusReporter(sys, shouldBePretty(sys, buildOptions)), createReportErrorSummary(sys, buildOptions), ); - buildHost.skipNonSemanticJSDocParsing = skipNonSemanticJSDocParsing; + buildHost.jsDocParsingMode = defaultJSDocParsingMode; const solutionPerformance = enableSolutionPerformance(sys, buildOptions); updateSolutionBuilderHost(sys, cb, buildHost, solutionPerformance); const builder = createSolutionBuilder(buildHost, projects, buildOptions); @@ -895,7 +896,8 @@ function performCompilation( config: ParsedCommandLine, ) { const { fileNames, options, projectReferences } = config; - const host = createCompilerHostWorker(options, /*setParentNodes*/ undefined, skipNonSemanticJSDocParsing, sys); + const host = createCompilerHostWorker(options, /*setParentNodes*/ undefined, sys); + host.jsDocParsingMode = defaultJSDocParsingMode; const currentDirectory = host.getCurrentDirectory(); const getCanonicalFileName = createGetCanonicalFileName(host.useCaseSensitiveFileNames()); changeCompilerHostLikeToUseCache(host, fileName => toPath(fileName, currentDirectory, getCanonicalFileName)); @@ -928,7 +930,8 @@ function performIncrementalCompilation( ) { const { options, fileNames, projectReferences } = config; enableStatisticsAndTracing(sys, options, /*isBuildMode*/ false); - const host = createIncrementalCompilerHost(options, sys, skipNonSemanticJSDocParsing); + const host = createIncrementalCompilerHost(options, sys); + host.jsDocParsingMode = defaultJSDocParsingMode; const exitStatus = ts_performIncrementalCompilation({ host, system: sys, @@ -980,7 +983,7 @@ function updateWatchCompilationHost( cb: ExecuteCommandLineCallbacks, watchCompilerHost: WatchCompilerHost, ) { - watchCompilerHost.skipNonSemanticJSDocParsing = skipNonSemanticJSDocParsing; + watchCompilerHost.jsDocParsingMode = defaultJSDocParsingMode; updateCreateProgram(sys, watchCompilerHost, /*isBuildMode*/ false); const emitFilesUsingBuilder = watchCompilerHost.afterProgramCreate!; // TODO: GH#18217 watchCompilerHost.afterProgramCreate = builderProgram => { diff --git a/src/harness/fakesHosts.ts b/src/harness/fakesHosts.ts index 9d30f00218980..c44dd5b7c5d6a 100644 --- a/src/harness/fakesHosts.ts +++ b/src/harness/fakesHosts.ts @@ -248,13 +248,14 @@ export class CompilerHost implements ts.CompilerHost { private readonly _outputsMap: collections.SortedMap; public readonly traces: string[] = []; public readonly shouldAssertInvariants = !Harness.lightMode; + public readonly jsDocParsingMode: ts.JSDocParsingMode | undefined; private _setParentNodes: boolean; private _sourceFiles: collections.SortedMap; private _parseConfigHost: ParseConfigHost | undefined; private _newLine: string; - constructor(sys: System | vfs.FileSystem, options = ts.getDefaultCompilerOptions(), setParentNodes = false) { + constructor(sys: System | vfs.FileSystem, options = ts.getDefaultCompilerOptions(), setParentNodes = false, jsDocParsingMode?: ts.JSDocParsingMode) { if (sys instanceof vfs.FileSystem) sys = new System(sys); this.sys = sys; this.defaultLibLocation = sys.vfs.meta.get("defaultLibLocation") || ""; @@ -262,6 +263,7 @@ export class CompilerHost implements ts.CompilerHost { this._sourceFiles = new collections.SortedMap({ comparer: sys.vfs.stringComparer, sort: "insertion" }); this._setParentNodes = setParentNodes; this._outputsMap = new collections.SortedMap(this.vfs.stringComparer); + this.jsDocParsingMode = jsDocParsingMode; } public get vfs() { @@ -561,13 +563,13 @@ export function patchHostForBuildInfoWrite(sys: T, version: export class SolutionBuilderHost extends CompilerHost implements ts.SolutionBuilderHost { createProgram: ts.CreateProgram; - private constructor(sys: System | vfs.FileSystem, options?: ts.CompilerOptions, setParentNodes?: boolean, createProgram?: ts.CreateProgram) { - super(sys, options, setParentNodes); + private constructor(sys: System | vfs.FileSystem, options?: ts.CompilerOptions, setParentNodes?: boolean, createProgram?: ts.CreateProgram, jsDocParsingMode?: ts.JSDocParsingMode) { + super(sys, options, setParentNodes, jsDocParsingMode); this.createProgram = createProgram || ts.createEmitAndSemanticDiagnosticsBuilderProgram as unknown as ts.CreateProgram; } - static create(sys: System | vfs.FileSystem, options?: ts.CompilerOptions, setParentNodes?: boolean, createProgram?: ts.CreateProgram) { - const host = new SolutionBuilderHost(sys, options, setParentNodes, createProgram); + static create(sys: System | vfs.FileSystem, options?: ts.CompilerOptions, setParentNodes?: boolean, createProgram?: ts.CreateProgram, jsDocParsingMode?: ts.JSDocParsingMode) { + const host = new SolutionBuilderHost(sys, options, setParentNodes, createProgram, jsDocParsingMode); patchHostForBuildInfoReadWrite(host.sys); return host; } diff --git a/src/harness/fourslashImpl.ts b/src/harness/fourslashImpl.ts index 8979ff61dad21..0cf7285364388 100644 --- a/src/harness/fourslashImpl.ts +++ b/src/harness/fourslashImpl.ts @@ -2763,6 +2763,7 @@ export class TestState { this.languageService.getProgram()?.getCompilerOptions() || {}, ), setExternalModuleIndicator: ts.getSetExternalModuleIndicator(this.languageService.getProgram()?.getCompilerOptions() || {}), + jsDocParsingMode: this.languageServiceAdapterHost.jsDocParsingMode, }; const referenceSourceFile = ts.createLanguageServiceSourceFile( this.activeFile.fileName, diff --git a/src/harness/harnessLanguageService.ts b/src/harness/harnessLanguageService.ts index 1fed0e38ef4ca..996b7a39a3050 100644 --- a/src/harness/harnessLanguageService.ts +++ b/src/harness/harnessLanguageService.ts @@ -146,6 +146,7 @@ export abstract class LanguageServiceAdapterHost { public readonly sys = new fakes.System(new vfs.FileSystem(/*ignoreCase*/ true, { cwd: virtualFileSystemRoot })); public typesRegistry: Map | undefined; private scriptInfos: collections.SortedMap; + public jsDocParsingMode: ts.JSDocParsingMode | undefined; constructor(protected cancellationToken = DefaultHostCancellationToken.instance, protected settings = ts.getDefaultCompilerOptions()) { this.scriptInfos = new collections.SortedMap({ comparer: this.vfs.stringComparer, sort: "insertion" }); diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index b9779f3d7006d..9aaaac8bf56d0 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -71,6 +71,7 @@ import { isNodeModulesDirectory, isRootedDiskPath, isString, + JSDocParsingMode, LanguageServiceMode, length, map, @@ -591,6 +592,7 @@ export interface ProjectServiceOptions { serverMode?: LanguageServiceMode; session: Session | undefined; /** @internal */ incrementalVerifier?: (service: ProjectService) => void; + jsDocParsingMode?: JSDocParsingMode; } interface OriginalFileInfo { @@ -998,6 +1000,8 @@ export class ProjectService { /** @internal */ verifyDocumentRegistry = noop; + readonly jsDocParsingMode: JSDocParsingMode | undefined; + constructor(opts: ProjectServiceOptions) { this.host = opts.host; this.logger = opts.logger; @@ -1013,6 +1017,7 @@ export class ProjectService { this.allowLocalPluginLoads = !!opts.allowLocalPluginLoads; this.typesMapLocation = (opts.typesMapLocation === undefined) ? combinePaths(getDirectoryPath(this.getExecutingFilePath()), "typesMap.json") : opts.typesMapLocation; this.session = opts.session; + this.jsDocParsingMode = opts.jsDocParsingMode; if (opts.serverMode !== undefined) { this.serverMode = opts.serverMode; @@ -1049,7 +1054,7 @@ export class ProjectService { extraFileExtensions: [], }; - this.documentRegistry = createDocumentRegistryInternal(this.host.useCaseSensitiveFileNames, this.currentDirectory, this); + this.documentRegistry = createDocumentRegistryInternal(this.host.useCaseSensitiveFileNames, this.currentDirectory, this.jsDocParsingMode, this); const watchLogLevel = this.logger.hasLevel(LogLevel.verbose) ? WatchLogLevel.Verbose : this.logger.loggingEnabled() ? WatchLogLevel.TriggerOnly : WatchLogLevel.None; const log: (s: string) => void = watchLogLevel !== WatchLogLevel.None ? (s => this.logger.info(s)) : noop; diff --git a/src/server/project.ts b/src/server/project.ts index a32fd668d0b0d..2923a813177a3 100644 --- a/src/server/project.ts +++ b/src/server/project.ts @@ -71,6 +71,7 @@ import { isDeclarationFileName, isExternalModuleNameRelative, isInsideNodeModules, + JSDocParsingMode, JsTyping, LanguageService, LanguageServiceHost, @@ -506,6 +507,8 @@ export abstract class Project implements LanguageServiceHost, ModuleResolutionHo /** @internal */ createHash = maybeBind(this.projectService.host, this.projectService.host.createHash); + readonly jsDocParsingMode: JSDocParsingMode | undefined; + /** @internal */ constructor( projectName: string, @@ -524,6 +527,7 @@ export abstract class Project implements LanguageServiceHost, ModuleResolutionHo this.directoryStructureHost = directoryStructureHost; this.currentDirectory = this.projectService.getNormalizedAbsolutePath(currentDirectory); this.getCanonicalFileName = this.projectService.toCanonicalFileName; + this.jsDocParsingMode = this.projectService.jsDocParsingMode; this.cancellationToken = new ThrottledCancellationToken(this.projectService.cancellationToken, this.projectService.throttleWaitMilliseconds); if (!this.compilerOptions) { @@ -2710,7 +2714,13 @@ export class ConfiguredProject extends Project { private compilerHost?: CompilerHost; /** @internal */ - constructor(configFileName: NormalizedPath, readonly canonicalConfigFilePath: NormalizedPath, projectService: ProjectService, documentRegistry: DocumentRegistry, cachedDirectoryStructureHost: CachedDirectoryStructureHost) { + constructor( + configFileName: NormalizedPath, + readonly canonicalConfigFilePath: NormalizedPath, + projectService: ProjectService, + documentRegistry: DocumentRegistry, + cachedDirectoryStructureHost: CachedDirectoryStructureHost, + ) { super(configFileName, ProjectKind.Configured, projectService, documentRegistry, /*hasExplicitListOfFiles*/ false, /*lastFileExceededProgramSize*/ undefined, /*compilerOptions*/ {}, /*compileOnSaveEnabled*/ false, /*watchOptions*/ undefined, cachedDirectoryStructureHost, getDirectoryPath(configFileName)); } diff --git a/src/services/documentRegistry.ts b/src/services/documentRegistry.ts index 9fc06295100cd..b6e2433085560 100644 --- a/src/services/documentRegistry.ts +++ b/src/services/documentRegistry.ts @@ -16,6 +16,7 @@ import { identity, IScriptSnapshot, isDeclarationFileName, + JSDocParsingMode, MinimalResolutionCacheHost, Path, ResolutionMode, @@ -178,14 +179,14 @@ export function isDocumentRegistryEntry(entry: BucketEntry): entry is DocumentRe return !!(entry as DocumentRegistryEntry).sourceFile; } -export function createDocumentRegistry(useCaseSensitiveFileNames?: boolean, currentDirectory?: string): DocumentRegistry { - return createDocumentRegistryInternal(useCaseSensitiveFileNames, currentDirectory); +export function createDocumentRegistry(useCaseSensitiveFileNames?: boolean, currentDirectory?: string, jsDocParsingMode?: JSDocParsingMode): DocumentRegistry { + return createDocumentRegistryInternal(useCaseSensitiveFileNames, currentDirectory, jsDocParsingMode); } /** @internal */ export type DocumentRegistryBucketKeyWithMode = string & { __documentRegistryBucketKeyWithMode: any; }; /** @internal */ -export function createDocumentRegistryInternal(useCaseSensitiveFileNames?: boolean, currentDirectory = "", externalCache?: ExternalDocumentCache): DocumentRegistry { +export function createDocumentRegistryInternal(useCaseSensitiveFileNames?: boolean, currentDirectory = "", jsDocParsingMode?: JSDocParsingMode, externalCache?: ExternalDocumentCache): DocumentRegistry { // Maps from compiler setting target (ES3, ES5, etc.) to all the cached documents we have // for those settings. const buckets = new Map>(); @@ -270,8 +271,10 @@ export function createDocumentRegistryInternal(useCaseSensitiveFileNames?: boole languageVersion: scriptTarget, impliedNodeFormat: host && getImpliedNodeFormatForFile(path, host.getCompilerHost?.()?.getModuleResolutionCache?.()?.getPackageJsonInfoCache(), host, compilationSettings), setExternalModuleIndicator: getSetExternalModuleIndicator(compilationSettings), + jsDocParsingMode, }; sourceFileOptions.languageVersion = scriptTarget; + Debug.assertEqual(jsDocParsingMode, sourceFileOptions.jsDocParsingMode); const oldBucketCount = buckets.size; const keyWithMode = getDocumentRegistryBucketKeyWithMode(key, sourceFileOptions.impliedNodeFormat); const bucket = getOrUpdate(buckets, keyWithMode, () => new Map()); diff --git a/src/services/services.ts b/src/services/services.ts index 3e3da71e481ce..56af0f72d70f3 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -189,6 +189,7 @@ import { JSDoc, JsDoc, JSDocContainer, + JSDocParsingMode, JSDocTagInfo, JsonSourceFile, JsxAttributes, @@ -1356,6 +1357,8 @@ class SyntaxTreeCache { this.host.getCompilationSettings(), ), setExternalModuleIndicator: getSetExternalModuleIndicator(this.host.getCompilationSettings()), + // These files are used to produce syntax-based highlighting, which reads JSDoc, so we must use ParseAll. + jsDocParsingMode: JSDocParsingMode.ParseAll, }; sourceFile = createLanguageServiceSourceFile(fileName, scriptSnapshot, options, version, /*setNodeParents*/ true, scriptKind); } @@ -1382,7 +1385,14 @@ function setSourceFileFields(sourceFile: SourceFile, scriptSnapshot: IScriptSnap sourceFile.scriptSnapshot = scriptSnapshot; } -export function createLanguageServiceSourceFile(fileName: string, scriptSnapshot: IScriptSnapshot, scriptTargetOrOptions: ScriptTarget | CreateSourceFileOptions, version: string, setNodeParents: boolean, scriptKind?: ScriptKind): SourceFile { +export function createLanguageServiceSourceFile( + fileName: string, + scriptSnapshot: IScriptSnapshot, + scriptTargetOrOptions: ScriptTarget | CreateSourceFileOptions, + version: string, + setNodeParents: boolean, + scriptKind?: ScriptKind, +): SourceFile { const sourceFile = createSourceFile(fileName, getSnapshotText(scriptSnapshot), scriptTargetOrOptions, setNodeParents, scriptKind); setSourceFileFields(sourceFile, scriptSnapshot, version); return sourceFile; @@ -1443,6 +1453,7 @@ export function updateLanguageServiceSourceFile(sourceFile: SourceFile, scriptSn languageVersion: sourceFile.languageVersion, impliedNodeFormat: sourceFile.impliedNodeFormat, setExternalModuleIndicator: sourceFile.setExternalModuleIndicator, + jsDocParsingMode: sourceFile.jsDocParsingMode, }; // Otherwise, just create a new source file. return createLanguageServiceSourceFile(sourceFile.fileName, scriptSnapshot, options, version, /*setNodeParents*/ true, sourceFile.scriptKind); @@ -1682,6 +1693,7 @@ export function createLanguageService( resolveLibrary: maybeBind(host, host.resolveLibrary), useSourceOfProjectReferenceRedirect: maybeBind(host, host.useSourceOfProjectReferenceRedirect), getParsedCommandLine, + jsDocParsingMode: host.jsDocParsingMode, }; const originalGetSourceFile = compilerHost.getSourceFile; diff --git a/src/services/shims.ts b/src/services/shims.ts index 1fe06d9e1fbf5..4c2fa0cbce057 100644 --- a/src/services/shims.ts +++ b/src/services/shims.ts @@ -36,6 +36,7 @@ import { HostCancellationToken, IScriptSnapshot, isString, + JSDocParsingMode, JsTyping, LanguageService, LanguageServiceHost, @@ -159,6 +160,8 @@ export interface LanguageServiceShimHost extends Logger { getModuleResolutionsForFile?(fileName: string): string; getTypeReferenceDirectiveResolutionsForFile?(fileName: string): string; directoryExists(directoryName: string): boolean; + + jsDocParsingMode?: JSDocParsingMode; } /** @@ -437,6 +440,8 @@ export class LanguageServiceShimHostAdapter implements LanguageServiceHost { public resolveTypeReferenceDirectives: ((typeDirectiveNames: string[] | readonly FileReference[], containingFile: string) => (ResolvedTypeReferenceDirective | undefined)[]) | undefined; public directoryExists: ((directoryName: string) => boolean) | undefined; + public jsDocParsingMode: JSDocParsingMode | undefined; + constructor(private shimHost: LanguageServiceShimHost) { // if shimHost is a COM object then property check will become method call with no arguments. // 'in' does not have this effect. @@ -458,6 +463,9 @@ export class LanguageServiceShimHostAdapter implements LanguageServiceHost { return map(typeDirectiveNames as (string | FileReference)[], name => getProperty(typeDirectivesForFile, isString(name) ? name : toFileNameLowerCase(name.fileName))); }; } + if ("jsDocParsingMode" in this.shimHost) { + this.jsDocParsingMode = this.shimHost.jsDocParsingMode; + } } public log(s: string): void { diff --git a/src/services/textChanges.ts b/src/services/textChanges.ts index 47f5cceabd8a7..177e25b18d0e5 100644 --- a/src/services/textChanges.ts +++ b/src/services/textChanges.ts @@ -109,6 +109,7 @@ import { JSDoc, JSDocComment, JSDocParameterTag, + JSDocParsingMode, JSDocReturnTag, JSDocTag, JSDocTypeTag, @@ -1290,7 +1291,7 @@ namespace changesToText { export function newFileChangesWorker(scriptKind: ScriptKind, insertions: readonly NewFileInsertion[], newLineCharacter: string, formatContext: formatting.FormatContext): string { // TODO: this emits the file, parses it back, then formats it that -- may be a less roundabout way to do this const nonFormattedText = flatMap(insertions, insertion => insertion.statements.map(s => s === SyntaxKind.NewLineTrivia ? "" : getNonformattedText(s, insertion.oldFile, newLineCharacter).text)).join(newLineCharacter); - const sourceFile = createSourceFile("any file name", nonFormattedText, ScriptTarget.ESNext, /*setParentNodes*/ true, scriptKind); + const sourceFile = createSourceFile("any file name", nonFormattedText, { languageVersion: ScriptTarget.ESNext, jsDocParsingMode: JSDocParsingMode.ParseNone }, /*setParentNodes*/ true, scriptKind); const changes = formatting.formatDocument(sourceFile, formatContext); return applyChanges(nonFormattedText, changes) + newLineCharacter; } diff --git a/src/services/transpile.ts b/src/services/transpile.ts index d68f49fd4a3ed..9637387afa093 100644 --- a/src/services/transpile.ts +++ b/src/services/transpile.ts @@ -20,6 +20,7 @@ import { getSetExternalModuleIndicator, hasProperty, isString, + JSDocParsingMode, MapLike, normalizePath, optionDeclarations, @@ -120,6 +121,7 @@ export function transpileModule(input: string, transpileOptions: TranspileOption languageVersion: getEmitScriptTarget(options), impliedNodeFormat: getImpliedNodeFormatForFile(toPath(inputFileName, "", compilerHost.getCanonicalFileName), /*packageJsonInfoCache*/ undefined, compilerHost, options), setExternalModuleIndicator: getSetExternalModuleIndicator(options), + jsDocParsingMode: JSDocParsingMode.ParseNone, }, ); if (transpileOptions.moduleName) { diff --git a/src/services/types.ts b/src/services/types.ts index 18a52a5e6fcc8..c1d92f808dccf 100644 --- a/src/services/types.ts +++ b/src/services/types.ts @@ -14,6 +14,7 @@ import { GetEffectiveTypeRootsHost, HasChangedAutomaticTypeDirectiveNames, HasInvalidatedResolutions, + JSDocParsingMode, LineAndCharacter, MinimalResolutionCacheHost, ModuleResolutionCache, @@ -427,6 +428,8 @@ export interface LanguageServiceHost extends GetEffectiveTypeRootsHost, MinimalR getParsedCommandLine?(fileName: string): ParsedCommandLine | undefined; /** @internal */ onReleaseParsedCommandLine?(configFileName: string, oldResolvedRef: ResolvedProjectReference | undefined, optionOptions: CompilerOptions): void; /** @internal */ getIncompleteCompletionsCache?(): IncompleteCompletionsCache; + + jsDocParsingMode?: JSDocParsingMode; } /** @internal */ diff --git a/src/testRunner/tests.ts b/src/testRunner/tests.ts index 0d646f714d750..6c28643511d1f 100644 --- a/src/testRunner/tests.ts +++ b/src/testRunner/tests.ts @@ -211,4 +211,4 @@ import "./unittests/tsserver/watchEnvironment"; import "./unittests/debugDeprecation"; import "./unittests/tsserver/inconsistentErrorInEditor"; import "./unittests/tsserver/getMoveToRefactoringFileSuggestions"; -import "./unittests/skipNonSemanticJSDocParsing"; +import "./unittests/skipJSDocParsing"; diff --git a/src/testRunner/unittests/skipJSDocParsing.ts b/src/testRunner/unittests/skipJSDocParsing.ts new file mode 100644 index 0000000000000..6498e6f214c44 --- /dev/null +++ b/src/testRunner/unittests/skipJSDocParsing.ts @@ -0,0 +1,76 @@ +import * as Harness from "../_namespaces/Harness"; +import * as ts from "../_namespaces/ts"; +import * as Utils from "../_namespaces/Utils"; + +describe("unittests:: skipJSDocParsing", () => { + const Diff = require("diff"); + + const kinds = [ + ts.JSDocParsingMode.ParseAll, + ts.JSDocParsingMode.ParseForTypeErrors, + ts.JSDocParsingMode.ParseForTypeInfo, + ts.JSDocParsingMode.ParseNone, + ]; + const filenames = [ + "file.ts", + "file.js", + ]; + function diffSourceFiles(name: string, content: string) { + for (const jsDocParsingMode of kinds) { + const kindName = ts.Debug.formatEnum(jsDocParsingMode, (ts as any).JSDocParsingMode); + for (const filename of filenames) { + const testName = `${name}-${kindName}-${filename}`; + it(testName, () => { + const sourceFile = ts.createSourceFile(filename, content, { languageVersion: ts.ScriptTarget.ESNext, jsDocParsingMode: undefined }); + assert.isTrue(sourceFile && sourceFile.parseDiagnostics.length === 0, "no errors issued"); + const sourceFileSkipped = ts.createSourceFile(filename, content, { languageVersion: ts.ScriptTarget.ESNext, jsDocParsingMode }); + assert.isTrue(sourceFileSkipped && sourceFileSkipped.parseDiagnostics.length === 0, "no errors issued"); + + const patch = Diff.createTwoFilesPatch("default", kindName, Utils.sourceFileToJSON(sourceFile), Utils.sourceFileToJSON(sourceFileSkipped)); + Harness.Baseline.runBaseline("skipJSDocParsing/" + testName + ".diff", patch); + }); + } + } + } + + diffSourceFiles( + "deprecated", + ` +/** @deprecated */ +function imDeprecated() {} +imDeprecated() +/** + * {@see imDeprecated} + * @deprecated + */ +function imDeprecated2() {} +imDeprecated2() + `, + ); + + diffSourceFiles( + "see", + ` +/** + * @typedef {any} A + */ + +/** + * @see {@link A} + * @see {@linkcode A} + * @see {@linkplain A} + */ +let foo; + `, + ); + + diffSourceFiles( + "link", + ` +import type { A } from "./a"; + +/** {@link A} */ +export interface B {} + `, + ); +}); diff --git a/src/testRunner/unittests/skipNonSemanticJSDocParsing.ts b/src/testRunner/unittests/skipNonSemanticJSDocParsing.ts deleted file mode 100644 index 94948e36e5855..0000000000000 --- a/src/testRunner/unittests/skipNonSemanticJSDocParsing.ts +++ /dev/null @@ -1,60 +0,0 @@ -import * as Harness from "../_namespaces/Harness"; -import * as ts from "../_namespaces/ts"; -import * as Utils from "../_namespaces/Utils"; - -describe("unittests:: skipNonSemanticJSDocParsing", () => { - const Diff = require("diff"); - - function diffSourceFiles(name: string, content: string) { - it(name, () => { - const sourceFile = ts.createSourceFile("file.ts", content, ts.ScriptTarget.ESNext, /*setParentNodes*/ undefined, /*scriptKind*/ undefined); - assert.isTrue(sourceFile && sourceFile.parseDiagnostics.length === 0, "no errors issued"); - const sourceFileSkipped = ts.createSourceFile("file.ts", content, ts.ScriptTarget.ESNext, /*setParentNodes*/ undefined, /*scriptKind*/ undefined, /*skipNonSemanticJSDoc*/ true); - assert.isTrue(sourceFileSkipped && sourceFileSkipped.parseDiagnostics.length === 0, "no errors issued"); - - const patch = Diff.createTwoFilesPatch("withJSDoc", "withoutJSDoc", Utils.sourceFileToJSON(sourceFile), Utils.sourceFileToJSON(sourceFileSkipped), "With JSDoc", "Without JSDoc"); - Harness.Baseline.runBaseline("skipNonSemanticJSDocParsing/" + name + ".diff", patch); - }); - } - - diffSourceFiles( - "deprecated", - ` -/** @deprecated */ -function imDeprecated() {} -imDeprecated() -/** - * {@see imDeprecated} - * @deprecated - */ -function imDeprecated2() {} -imDeprecated2() - `, - ); - - diffSourceFiles( - "see", - ` -/** - * @typedef {any} A - */ - -/** - * @see {@link A} - * @see {@linkcode A} - * @see {@linkplain A} - */ -let foo; - `, - ); - - diffSourceFiles( - "link", - ` -import type { A } from "./a"; - -/** {@link A} */ -export interface B {} - `, - ); -}); diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index bd20795fc6894..88ce1a5067df1 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -3295,6 +3295,7 @@ declare namespace ts { isNonTsProject(): boolean; isJsOnlyProject(): boolean; static resolveModule(moduleName: string, initialDir: string, host: ServerHost, log: (message: string) => void): {} | undefined; + readonly jsDocParsingMode: JSDocParsingMode | undefined; isKnownTypesPackageName(name: string): boolean; installPackage(options: InstallPackageOptions): Promise; private get typingsCache(); @@ -3616,6 +3617,7 @@ declare namespace ts { typesMapLocation?: string; serverMode?: LanguageServiceMode; session: Session | undefined; + jsDocParsingMode?: JSDocParsingMode; } interface WatchOptionsAndErrors { watchOptions: WatchOptions; @@ -3690,6 +3692,7 @@ declare namespace ts { private performanceEventHandler?; private pendingPluginEnablements?; private currentPluginEnablementPromise?; + readonly jsDocParsingMode: JSDocParsingMode | undefined; constructor(opts: ProjectServiceOptions); toPath(fileName: string): Path; private loadTypesMap; @@ -7750,6 +7753,7 @@ declare namespace ts { hasInvalidatedResolutions?(filePath: Path): boolean; createHash?(data: string): string; getParsedCommandLine?(fileName: string): ParsedCommandLine | undefined; + jsDocParsingMode?: JSDocParsingMode; } interface SourceMapRange extends TextRange { source?: SourceMapSource; @@ -8607,6 +8611,33 @@ declare namespace ts { IndexSignatureParameters = 8848, JSDocComment = 33, } + enum JSDocParsingMode { + /** + * Always parse JSDoc comments and include them in the AST. + * + * This is the default if no mode is provided. + */ + ParseAll = 0, + /** + * Never parse JSDoc comments, mo matter the file type. + */ + ParseNone = 1, + /** + * Parse only JSDoc comments which are needed to provide correct type errors. + * + * This will always parse JSDoc in non-TS files, but only parse JSDoc comments + * containing `@see` and `@link` in TS files. + */ + ParseForTypeErrors = 2, + /** + * Parse only JSDoc comments which are needed to provide correct type info. + * + * This will always parse JSDoc in non-TS files, but never in TS files. + * + * Note: Do not use this mode if you require accurate type errors; use {@link ParseForTypeErrors} instead. + */ + ParseForTypeInfo = 3, + } interface UserPreferences { readonly disableSuggestions?: boolean; readonly quotePreference?: "auto" | "double" | "single"; @@ -8768,6 +8799,8 @@ declare namespace ts { setOnError(onError: ErrorCallback | undefined): void; setScriptTarget(scriptTarget: ScriptTarget): void; setLanguageVariant(variant: LanguageVariant): void; + setScriptKind(scriptKind: ScriptKind): void; + setJSDocParsingMode(kind: JSDocParsingMode): void; /** @deprecated use {@link resetTokenState} */ setTextPos(textPos: number): void; resetTokenState(pos: number): void; @@ -9437,6 +9470,7 @@ declare namespace ts { * check specified by `isFileProbablyExternalModule` will be used to set the field. */ setExternalModuleIndicator?: (file: SourceFile) => void; + jsDocParsingMode?: JSDocParsingMode; } function parseCommandLine(commandLine: readonly string[], readFile?: (path: string) => string | undefined): ParsedCommandLine; /** @@ -10027,6 +10061,7 @@ declare namespace ts { * Returns the module resolution cache used by a provided `resolveModuleNames` implementation so that any non-name module resolution operations (eg, package.json lookup) can reuse it */ getModuleResolutionCache?(): ModuleResolutionCache | undefined; + jsDocParsingMode?: JSDocParsingMode; } interface WatchCompilerHost extends ProgramHost, WatchHost { /** Instead of using output d.ts file from project reference, use its source file */ @@ -10277,6 +10312,7 @@ declare namespace ts { installPackage?(options: InstallPackageOptions): Promise; writeFile?(fileName: string, content: string): void; getParsedCommandLine?(fileName: string): ParsedCommandLine | undefined; + jsDocParsingMode?: JSDocParsingMode; } type WithMetadata = T & { metadata?: unknown; @@ -11374,7 +11410,7 @@ declare namespace ts { fileName: string; highlightSpans: HighlightSpan[]; } - function createDocumentRegistry(useCaseSensitiveFileNames?: boolean, currentDirectory?: string): DocumentRegistry; + function createDocumentRegistry(useCaseSensitiveFileNames?: boolean, currentDirectory?: string, jsDocParsingMode?: JSDocParsingMode): DocumentRegistry; /** * The document registry represents a store of SourceFile objects that can be shared between * multiple LanguageService instances. A LanguageService instance holds on the SourceFile (AST) diff --git a/tests/baselines/reference/skipJSDocParsing/deprecated-ParseAll-file.js.diff b/tests/baselines/reference/skipJSDocParsing/deprecated-ParseAll-file.js.diff new file mode 100644 index 0000000000000..760be52719d14 --- /dev/null +++ b/tests/baselines/reference/skipJSDocParsing/deprecated-ParseAll-file.js.diff @@ -0,0 +1,3 @@ +=================================================================== +--- default ++++ ParseAll diff --git a/tests/baselines/reference/skipJSDocParsing/deprecated-ParseAll-file.ts.diff b/tests/baselines/reference/skipJSDocParsing/deprecated-ParseAll-file.ts.diff new file mode 100644 index 0000000000000..760be52719d14 --- /dev/null +++ b/tests/baselines/reference/skipJSDocParsing/deprecated-ParseAll-file.ts.diff @@ -0,0 +1,3 @@ +=================================================================== +--- default ++++ ParseAll diff --git a/tests/baselines/reference/skipJSDocParsing/deprecated-ParseForTypeErrors-file.js.diff b/tests/baselines/reference/skipJSDocParsing/deprecated-ParseForTypeErrors-file.js.diff new file mode 100644 index 0000000000000..e93086418a396 --- /dev/null +++ b/tests/baselines/reference/skipJSDocParsing/deprecated-ParseForTypeErrors-file.js.diff @@ -0,0 +1,13 @@ +=================================================================== +--- default ++++ ParseForTypeErrors +@@ -237,7 +237,7 @@ + "typeReferenceDirectives": [], + "libReferenceDirectives": [], + "amdDependencies": [], + "identifiers": {}, +- "jsDocParsingMode": 0, ++ "jsDocParsingMode": 2, + "jsDocDiagnostics": [] + } +\ No newline at end of file diff --git a/tests/baselines/reference/skipNonSemanticJSDocParsing/deprecated.diff b/tests/baselines/reference/skipJSDocParsing/deprecated-ParseForTypeErrors-file.ts.diff similarity index 94% rename from tests/baselines/reference/skipNonSemanticJSDocParsing/deprecated.diff rename to tests/baselines/reference/skipJSDocParsing/deprecated-ParseForTypeErrors-file.ts.diff index 12a169292e64b..87668c103ba48 100644 --- a/tests/baselines/reference/skipNonSemanticJSDocParsing/deprecated.diff +++ b/tests/baselines/reference/skipJSDocParsing/deprecated-ParseForTypeErrors-file.ts.diff @@ -1,6 +1,6 @@ =================================================================== ---- withJSDoc With JSDoc -+++ withoutJSDoc Without JSDoc +--- default ++++ ParseForTypeErrors @@ -8,9 +8,8 @@ "0": { "kind": "FunctionDeclaration", @@ -61,7 +61,7 @@ "libReferenceDirectives": [], "amdDependencies": [], "identifiers": {}, -- "skipNonSemanticJSDoc": false -+ "skipNonSemanticJSDoc": true +- "jsDocParsingMode": 0 ++ "jsDocParsingMode": 2 } \ No newline at end of file diff --git a/tests/baselines/reference/skipJSDocParsing/deprecated-ParseForTypeInfo-file.js.diff b/tests/baselines/reference/skipJSDocParsing/deprecated-ParseForTypeInfo-file.js.diff new file mode 100644 index 0000000000000..2cbcaf823cbbb --- /dev/null +++ b/tests/baselines/reference/skipJSDocParsing/deprecated-ParseForTypeInfo-file.js.diff @@ -0,0 +1,13 @@ +=================================================================== +--- default ++++ ParseForTypeInfo +@@ -237,7 +237,7 @@ + "typeReferenceDirectives": [], + "libReferenceDirectives": [], + "amdDependencies": [], + "identifiers": {}, +- "jsDocParsingMode": 0, ++ "jsDocParsingMode": 3, + "jsDocDiagnostics": [] + } +\ No newline at end of file diff --git a/tests/baselines/reference/skipJSDocParsing/deprecated-ParseForTypeInfo-file.ts.diff b/tests/baselines/reference/skipJSDocParsing/deprecated-ParseForTypeInfo-file.ts.diff new file mode 100644 index 0000000000000..71a17bf4c9b28 --- /dev/null +++ b/tests/baselines/reference/skipJSDocParsing/deprecated-ParseForTypeInfo-file.ts.diff @@ -0,0 +1,123 @@ +=================================================================== +--- default ++++ ParseForTypeInfo +@@ -8,9 +8,8 @@ + "0": { + "kind": "FunctionDeclaration", + "pos": 0, + "end": 46, +- "flags": "Deprecated", + "modifierFlagsCache": 0, + "transformFlags": 4194304, + "name": { + "kind": "Identifier", +@@ -40,43 +39,9 @@ + "hasTrailingComma": false, + "transformFlags": 0 + }, + "multiLine": false +- }, +- "jsDoc": [ +- { +- "kind": "JSDoc", +- "pos": 1, +- "end": 19, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "tags": { +- "0": { +- "kind": "JSDocDeprecatedTag", +- "pos": 5, +- "end": 17, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "tagName": { +- "kind": "Identifier", +- "pos": 6, +- "end": 16, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "deprecated" +- } +- }, +- "length": 1, +- "pos": 5, +- "end": 17, +- "hasTrailingComma": false, +- "transformFlags": 0 +- } +- } +- ] ++ } + }, + "1": { + "kind": "ExpressionStatement", + "pos": 46, +@@ -109,9 +74,8 @@ + "2": { + "kind": "FunctionDeclaration", + "pos": 61, + "end": 135, +- "flags": "Deprecated", + "modifierFlagsCache": 0, + "transformFlags": 4194304, + "name": { + "kind": "Identifier", +@@ -141,44 +105,9 @@ + "hasTrailingComma": false, + "transformFlags": 0 + }, + "multiLine": false +- }, +- "jsDoc": [ +- { +- "kind": "JSDoc", +- "pos": 62, +- "end": 107, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "comment": "{@see imDeprecated}", +- "tags": { +- "0": { +- "kind": "JSDocDeprecatedTag", +- "pos": 92, +- "end": 105, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "tagName": { +- "kind": "Identifier", +- "pos": 93, +- "end": 103, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "deprecated" +- } +- }, +- "length": 1, +- "pos": 92, +- "end": 105, +- "hasTrailingComma": false, +- "transformFlags": 0 +- } +- } +- ] ++ } + }, + "3": { + "kind": "ExpressionStatement", + "pos": 135, +@@ -237,6 +166,6 @@ + "typeReferenceDirectives": [], + "libReferenceDirectives": [], + "amdDependencies": [], + "identifiers": {}, +- "jsDocParsingMode": 0 ++ "jsDocParsingMode": 3 + } +\ No newline at end of file diff --git a/tests/baselines/reference/skipJSDocParsing/deprecated-ParseNone-file.js.diff b/tests/baselines/reference/skipJSDocParsing/deprecated-ParseNone-file.js.diff new file mode 100644 index 0000000000000..34123c540957d --- /dev/null +++ b/tests/baselines/reference/skipJSDocParsing/deprecated-ParseNone-file.js.diff @@ -0,0 +1,124 @@ +=================================================================== +--- default ++++ ParseNone +@@ -8,9 +8,8 @@ + "0": { + "kind": "FunctionDeclaration", + "pos": 0, + "end": 46, +- "flags": "Deprecated", + "modifierFlagsCache": 0, + "transformFlags": 4194304, + "name": { + "kind": "Identifier", +@@ -40,43 +39,9 @@ + "hasTrailingComma": false, + "transformFlags": 0 + }, + "multiLine": false +- }, +- "jsDoc": [ +- { +- "kind": "JSDoc", +- "pos": 1, +- "end": 19, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "tags": { +- "0": { +- "kind": "JSDocDeprecatedTag", +- "pos": 5, +- "end": 17, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "tagName": { +- "kind": "Identifier", +- "pos": 6, +- "end": 16, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "deprecated" +- } +- }, +- "length": 1, +- "pos": 5, +- "end": 17, +- "hasTrailingComma": false, +- "transformFlags": 0 +- } +- } +- ] ++ } + }, + "1": { + "kind": "ExpressionStatement", + "pos": 46, +@@ -109,9 +74,8 @@ + "2": { + "kind": "FunctionDeclaration", + "pos": 61, + "end": 135, +- "flags": "Deprecated", + "modifierFlagsCache": 0, + "transformFlags": 4194304, + "name": { + "kind": "Identifier", +@@ -141,44 +105,9 @@ + "hasTrailingComma": false, + "transformFlags": 0 + }, + "multiLine": false +- }, +- "jsDoc": [ +- { +- "kind": "JSDoc", +- "pos": 62, +- "end": 107, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "comment": "{@see imDeprecated}", +- "tags": { +- "0": { +- "kind": "JSDocDeprecatedTag", +- "pos": 92, +- "end": 105, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "tagName": { +- "kind": "Identifier", +- "pos": 93, +- "end": 103, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "deprecated" +- } +- }, +- "length": 1, +- "pos": 92, +- "end": 105, +- "hasTrailingComma": false, +- "transformFlags": 0 +- } +- } +- ] ++ } + }, + "3": { + "kind": "ExpressionStatement", + "pos": 135, +@@ -237,7 +166,6 @@ + "typeReferenceDirectives": [], + "libReferenceDirectives": [], + "amdDependencies": [], + "identifiers": {}, +- "jsDocParsingMode": 0, +- "jsDocDiagnostics": [] ++ "jsDocParsingMode": 1 + } +\ No newline at end of file diff --git a/tests/baselines/reference/skipJSDocParsing/deprecated-ParseNone-file.ts.diff b/tests/baselines/reference/skipJSDocParsing/deprecated-ParseNone-file.ts.diff new file mode 100644 index 0000000000000..a6b7b2826bb37 --- /dev/null +++ b/tests/baselines/reference/skipJSDocParsing/deprecated-ParseNone-file.ts.diff @@ -0,0 +1,123 @@ +=================================================================== +--- default ++++ ParseNone +@@ -8,9 +8,8 @@ + "0": { + "kind": "FunctionDeclaration", + "pos": 0, + "end": 46, +- "flags": "Deprecated", + "modifierFlagsCache": 0, + "transformFlags": 4194304, + "name": { + "kind": "Identifier", +@@ -40,43 +39,9 @@ + "hasTrailingComma": false, + "transformFlags": 0 + }, + "multiLine": false +- }, +- "jsDoc": [ +- { +- "kind": "JSDoc", +- "pos": 1, +- "end": 19, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "tags": { +- "0": { +- "kind": "JSDocDeprecatedTag", +- "pos": 5, +- "end": 17, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "tagName": { +- "kind": "Identifier", +- "pos": 6, +- "end": 16, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "deprecated" +- } +- }, +- "length": 1, +- "pos": 5, +- "end": 17, +- "hasTrailingComma": false, +- "transformFlags": 0 +- } +- } +- ] ++ } + }, + "1": { + "kind": "ExpressionStatement", + "pos": 46, +@@ -109,9 +74,8 @@ + "2": { + "kind": "FunctionDeclaration", + "pos": 61, + "end": 135, +- "flags": "Deprecated", + "modifierFlagsCache": 0, + "transformFlags": 4194304, + "name": { + "kind": "Identifier", +@@ -141,44 +105,9 @@ + "hasTrailingComma": false, + "transformFlags": 0 + }, + "multiLine": false +- }, +- "jsDoc": [ +- { +- "kind": "JSDoc", +- "pos": 62, +- "end": 107, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "comment": "{@see imDeprecated}", +- "tags": { +- "0": { +- "kind": "JSDocDeprecatedTag", +- "pos": 92, +- "end": 105, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "tagName": { +- "kind": "Identifier", +- "pos": 93, +- "end": 103, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "deprecated" +- } +- }, +- "length": 1, +- "pos": 92, +- "end": 105, +- "hasTrailingComma": false, +- "transformFlags": 0 +- } +- } +- ] ++ } + }, + "3": { + "kind": "ExpressionStatement", + "pos": 135, +@@ -237,6 +166,6 @@ + "typeReferenceDirectives": [], + "libReferenceDirectives": [], + "amdDependencies": [], + "identifiers": {}, +- "jsDocParsingMode": 0 ++ "jsDocParsingMode": 1 + } +\ No newline at end of file diff --git a/tests/baselines/reference/skipJSDocParsing/link-ParseAll-file.js.diff b/tests/baselines/reference/skipJSDocParsing/link-ParseAll-file.js.diff new file mode 100644 index 0000000000000..760be52719d14 --- /dev/null +++ b/tests/baselines/reference/skipJSDocParsing/link-ParseAll-file.js.diff @@ -0,0 +1,3 @@ +=================================================================== +--- default ++++ ParseAll diff --git a/tests/baselines/reference/skipJSDocParsing/link-ParseAll-file.ts.diff b/tests/baselines/reference/skipJSDocParsing/link-ParseAll-file.ts.diff new file mode 100644 index 0000000000000..760be52719d14 --- /dev/null +++ b/tests/baselines/reference/skipJSDocParsing/link-ParseAll-file.ts.diff @@ -0,0 +1,3 @@ +=================================================================== +--- default ++++ ParseAll diff --git a/tests/baselines/reference/skipJSDocParsing/link-ParseForTypeErrors-file.js.diff b/tests/baselines/reference/skipJSDocParsing/link-ParseForTypeErrors-file.js.diff new file mode 100644 index 0000000000000..e9d1e506a0dbe --- /dev/null +++ b/tests/baselines/reference/skipJSDocParsing/link-ParseForTypeErrors-file.js.diff @@ -0,0 +1,13 @@ +=================================================================== +--- default ++++ ParseForTypeErrors +@@ -220,7 +220,7 @@ + "typeReferenceDirectives": [], + "libReferenceDirectives": [], + "amdDependencies": [], + "identifiers": {}, +- "jsDocParsingMode": 0, ++ "jsDocParsingMode": 2, + "jsDocDiagnostics": [] + } +\ No newline at end of file diff --git a/tests/baselines/reference/skipNonSemanticJSDocParsing/link.diff b/tests/baselines/reference/skipJSDocParsing/link-ParseForTypeErrors-file.ts.diff similarity index 65% rename from tests/baselines/reference/skipNonSemanticJSDocParsing/link.diff rename to tests/baselines/reference/skipJSDocParsing/link-ParseForTypeErrors-file.ts.diff index e7b3e2a532791..6c5ccc242997c 100644 --- a/tests/baselines/reference/skipNonSemanticJSDocParsing/link.diff +++ b/tests/baselines/reference/skipJSDocParsing/link-ParseForTypeErrors-file.ts.diff @@ -1,12 +1,12 @@ =================================================================== ---- withJSDoc With JSDoc -+++ withoutJSDoc Without JSDoc +--- default ++++ ParseForTypeErrors @@ -220,6 +220,6 @@ "typeReferenceDirectives": [], "libReferenceDirectives": [], "amdDependencies": [], "identifiers": {}, -- "skipNonSemanticJSDoc": false -+ "skipNonSemanticJSDoc": true +- "jsDocParsingMode": 0 ++ "jsDocParsingMode": 2 } \ No newline at end of file diff --git a/tests/baselines/reference/skipJSDocParsing/link-ParseForTypeInfo-file.js.diff b/tests/baselines/reference/skipJSDocParsing/link-ParseForTypeInfo-file.js.diff new file mode 100644 index 0000000000000..bb812c46fb7e3 --- /dev/null +++ b/tests/baselines/reference/skipJSDocParsing/link-ParseForTypeInfo-file.js.diff @@ -0,0 +1,13 @@ +=================================================================== +--- default ++++ ParseForTypeInfo +@@ -220,7 +220,7 @@ + "typeReferenceDirectives": [], + "libReferenceDirectives": [], + "amdDependencies": [], + "identifiers": {}, +- "jsDocParsingMode": 0, ++ "jsDocParsingMode": 3, + "jsDocDiagnostics": [] + } +\ No newline at end of file diff --git a/tests/baselines/reference/skipJSDocParsing/link-ParseForTypeInfo-file.ts.diff b/tests/baselines/reference/skipJSDocParsing/link-ParseForTypeInfo-file.ts.diff new file mode 100644 index 0000000000000..3dc7ed06e5b59 --- /dev/null +++ b/tests/baselines/reference/skipJSDocParsing/link-ParseForTypeInfo-file.ts.diff @@ -0,0 +1,67 @@ +=================================================================== +--- default ++++ ParseForTypeInfo +@@ -91,53 +91,9 @@ + "pos": 69, + "end": 69, + "hasTrailingComma": false, + "transformFlags": 0 +- }, +- "jsDoc": [ +- { +- "kind": "JSDoc", +- "pos": 32, +- "end": 48, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "comment": { +- "0": { +- "kind": "JSDocText", +- "pos": 32, +- "end": 36, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "text": "" +- }, +- "1": { +- "kind": "JSDocLink", +- "pos": 36, +- "end": 45, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "name": { +- "kind": "Identifier", +- "pos": 43, +- "end": 44, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "A" +- }, +- "text": "" +- }, +- "length": 2, +- "pos": 32, +- "end": 46, +- "hasTrailingComma": false, +- "transformFlags": 0 +- } +- } +- ] ++ } + }, + "length": 2, + "pos": 0, + "end": 70, +@@ -220,6 +176,6 @@ + "typeReferenceDirectives": [], + "libReferenceDirectives": [], + "amdDependencies": [], + "identifiers": {}, +- "jsDocParsingMode": 0 ++ "jsDocParsingMode": 3 + } +\ No newline at end of file diff --git a/tests/baselines/reference/skipJSDocParsing/link-ParseNone-file.js.diff b/tests/baselines/reference/skipJSDocParsing/link-ParseNone-file.js.diff new file mode 100644 index 0000000000000..62602086aa08d --- /dev/null +++ b/tests/baselines/reference/skipJSDocParsing/link-ParseNone-file.js.diff @@ -0,0 +1,68 @@ +=================================================================== +--- default ++++ ParseNone +@@ -91,53 +91,9 @@ + "pos": 69, + "end": 69, + "hasTrailingComma": false, + "transformFlags": 0 +- }, +- "jsDoc": [ +- { +- "kind": "JSDoc", +- "pos": 32, +- "end": 48, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "comment": { +- "0": { +- "kind": "JSDocText", +- "pos": 32, +- "end": 36, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "text": "" +- }, +- "1": { +- "kind": "JSDocLink", +- "pos": 36, +- "end": 45, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "name": { +- "kind": "Identifier", +- "pos": 43, +- "end": 44, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "A" +- }, +- "text": "" +- }, +- "length": 2, +- "pos": 32, +- "end": 46, +- "hasTrailingComma": false, +- "transformFlags": 0 +- } +- } +- ] ++ } + }, + "length": 2, + "pos": 0, + "end": 70, +@@ -220,7 +176,6 @@ + "typeReferenceDirectives": [], + "libReferenceDirectives": [], + "amdDependencies": [], + "identifiers": {}, +- "jsDocParsingMode": 0, +- "jsDocDiagnostics": [] ++ "jsDocParsingMode": 1 + } +\ No newline at end of file diff --git a/tests/baselines/reference/skipJSDocParsing/link-ParseNone-file.ts.diff b/tests/baselines/reference/skipJSDocParsing/link-ParseNone-file.ts.diff new file mode 100644 index 0000000000000..f9f9ff442701b --- /dev/null +++ b/tests/baselines/reference/skipJSDocParsing/link-ParseNone-file.ts.diff @@ -0,0 +1,67 @@ +=================================================================== +--- default ++++ ParseNone +@@ -91,53 +91,9 @@ + "pos": 69, + "end": 69, + "hasTrailingComma": false, + "transformFlags": 0 +- }, +- "jsDoc": [ +- { +- "kind": "JSDoc", +- "pos": 32, +- "end": 48, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "comment": { +- "0": { +- "kind": "JSDocText", +- "pos": 32, +- "end": 36, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "text": "" +- }, +- "1": { +- "kind": "JSDocLink", +- "pos": 36, +- "end": 45, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "name": { +- "kind": "Identifier", +- "pos": 43, +- "end": 44, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "A" +- }, +- "text": "" +- }, +- "length": 2, +- "pos": 32, +- "end": 46, +- "hasTrailingComma": false, +- "transformFlags": 0 +- } +- } +- ] ++ } + }, + "length": 2, + "pos": 0, + "end": 70, +@@ -220,6 +176,6 @@ + "typeReferenceDirectives": [], + "libReferenceDirectives": [], + "amdDependencies": [], + "identifiers": {}, +- "jsDocParsingMode": 0 ++ "jsDocParsingMode": 1 + } +\ No newline at end of file diff --git a/tests/baselines/reference/skipJSDocParsing/see-ParseAll-file.js.diff b/tests/baselines/reference/skipJSDocParsing/see-ParseAll-file.js.diff new file mode 100644 index 0000000000000..760be52719d14 --- /dev/null +++ b/tests/baselines/reference/skipJSDocParsing/see-ParseAll-file.js.diff @@ -0,0 +1,3 @@ +=================================================================== +--- default ++++ ParseAll diff --git a/tests/baselines/reference/skipJSDocParsing/see-ParseAll-file.ts.diff b/tests/baselines/reference/skipJSDocParsing/see-ParseAll-file.ts.diff new file mode 100644 index 0000000000000..760be52719d14 --- /dev/null +++ b/tests/baselines/reference/skipJSDocParsing/see-ParseAll-file.ts.diff @@ -0,0 +1,3 @@ +=================================================================== +--- default ++++ ParseAll diff --git a/tests/baselines/reference/skipJSDocParsing/see-ParseForTypeErrors-file.js.diff b/tests/baselines/reference/skipJSDocParsing/see-ParseForTypeErrors-file.js.diff new file mode 100644 index 0000000000000..ba69c9d229b52 --- /dev/null +++ b/tests/baselines/reference/skipJSDocParsing/see-ParseForTypeErrors-file.js.diff @@ -0,0 +1,13 @@ +=================================================================== +--- default ++++ ParseForTypeErrors +@@ -307,7 +307,7 @@ + "typeReferenceDirectives": [], + "libReferenceDirectives": [], + "amdDependencies": [], + "identifiers": {}, +- "jsDocParsingMode": 0, ++ "jsDocParsingMode": 2, + "jsDocDiagnostics": [] + } +\ No newline at end of file diff --git a/tests/baselines/reference/skipNonSemanticJSDocParsing/see.diff b/tests/baselines/reference/skipJSDocParsing/see-ParseForTypeErrors-file.ts.diff similarity index 65% rename from tests/baselines/reference/skipNonSemanticJSDocParsing/see.diff rename to tests/baselines/reference/skipJSDocParsing/see-ParseForTypeErrors-file.ts.diff index cbad93fc6bd33..87f0d97e8188e 100644 --- a/tests/baselines/reference/skipNonSemanticJSDocParsing/see.diff +++ b/tests/baselines/reference/skipJSDocParsing/see-ParseForTypeErrors-file.ts.diff @@ -1,12 +1,12 @@ =================================================================== ---- withJSDoc With JSDoc -+++ withoutJSDoc Without JSDoc +--- default ++++ ParseForTypeErrors @@ -307,6 +307,6 @@ "typeReferenceDirectives": [], "libReferenceDirectives": [], "amdDependencies": [], "identifiers": {}, -- "skipNonSemanticJSDoc": false -+ "skipNonSemanticJSDoc": true +- "jsDocParsingMode": 0 ++ "jsDocParsingMode": 2 } \ No newline at end of file diff --git a/tests/baselines/reference/skipJSDocParsing/see-ParseForTypeInfo-file.js.diff b/tests/baselines/reference/skipJSDocParsing/see-ParseForTypeInfo-file.js.diff new file mode 100644 index 0000000000000..12d08d1593c44 --- /dev/null +++ b/tests/baselines/reference/skipJSDocParsing/see-ParseForTypeInfo-file.js.diff @@ -0,0 +1,13 @@ +=================================================================== +--- default ++++ ParseForTypeInfo +@@ -307,7 +307,7 @@ + "typeReferenceDirectives": [], + "libReferenceDirectives": [], + "amdDependencies": [], + "identifiers": {}, +- "jsDocParsingMode": 0, ++ "jsDocParsingMode": 3, + "jsDocDiagnostics": [] + } +\ No newline at end of file diff --git a/tests/baselines/reference/skipJSDocParsing/see-ParseForTypeInfo-file.ts.diff b/tests/baselines/reference/skipJSDocParsing/see-ParseForTypeInfo-file.ts.diff new file mode 100644 index 0000000000000..d02071fc7ed65 --- /dev/null +++ b/tests/baselines/reference/skipJSDocParsing/see-ParseForTypeInfo-file.ts.diff @@ -0,0 +1,259 @@ +=================================================================== +--- default ++++ ParseForTypeInfo +@@ -39,245 +39,9 @@ + "end": 108, + "hasTrailingComma": false, + "transformFlags": 0 + } +- }, +- "jsDoc": [ +- { +- "kind": "JSDoc", +- "pos": 1, +- "end": 28, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "tags": { +- "0": { +- "kind": "JSDocTypedefTag", +- "pos": 8, +- "end": 24, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "tagName": { +- "kind": "Identifier", +- "pos": 9, +- "end": 16, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "typedef" +- }, +- "typeExpression": { +- "kind": "JSDocTypeExpression", +- "pos": 17, +- "end": 22, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "type": { +- "kind": "AnyKeyword", +- "pos": 18, +- "end": 21, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 1 +- } +- }, +- "fullName": { +- "kind": "Identifier", +- "pos": 23, +- "end": 24, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "A" +- }, +- "name": { +- "kind": "Identifier", +- "pos": 23, +- "end": 24, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "A" +- } +- }, +- "length": 1, +- "pos": 8, +- "end": 24, +- "hasTrailingComma": false, +- "transformFlags": 0 +- } +- }, +- { +- "kind": "JSDoc", +- "pos": 30, +- "end": 100, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "tags": { +- "0": { +- "kind": "JSDocSeeTag", +- "pos": 37, +- "end": 55, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "tagName": { +- "kind": "Identifier", +- "pos": 38, +- "end": 41, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "see" +- }, +- "comment": { +- "0": { +- "kind": "JSDocText", +- "pos": 42, +- "end": 42, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "text": "" +- }, +- "1": { +- "kind": "JSDocLink", +- "pos": 42, +- "end": 51, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "name": { +- "kind": "Identifier", +- "pos": 49, +- "end": 50, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "A" +- }, +- "text": "" +- }, +- "length": 2, +- "pos": 42, +- "end": 55, +- "hasTrailingComma": false, +- "transformFlags": 0 +- } +- }, +- "1": { +- "kind": "JSDocSeeTag", +- "pos": 55, +- "end": 77, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "tagName": { +- "kind": "Identifier", +- "pos": 56, +- "end": 59, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "see" +- }, +- "comment": { +- "0": { +- "kind": "JSDocText", +- "pos": 60, +- "end": 60, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "text": "" +- }, +- "1": { +- "kind": "JSDocLinkCode", +- "pos": 60, +- "end": 73, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "name": { +- "kind": "Identifier", +- "pos": 71, +- "end": 72, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "A" +- }, +- "text": "" +- }, +- "length": 2, +- "pos": 60, +- "end": 77, +- "hasTrailingComma": false, +- "transformFlags": 0 +- } +- }, +- "2": { +- "kind": "JSDocSeeTag", +- "pos": 77, +- "end": 98, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "tagName": { +- "kind": "Identifier", +- "pos": 78, +- "end": 81, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "see" +- }, +- "comment": { +- "0": { +- "kind": "JSDocText", +- "pos": 82, +- "end": 82, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "text": "" +- }, +- "1": { +- "kind": "JSDocLinkPlain", +- "pos": 82, +- "end": 96, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "name": { +- "kind": "Identifier", +- "pos": 94, +- "end": 95, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "A" +- }, +- "text": "" +- }, +- "length": 2, +- "pos": 82, +- "end": 98, +- "hasTrailingComma": false, +- "transformFlags": 0 +- } +- }, +- "length": 3, +- "pos": 37, +- "end": 98, +- "hasTrailingComma": false, +- "transformFlags": 0 +- } +- } +- ] ++ } + }, + "length": 1, + "pos": 0, + "end": 109, +@@ -307,6 +71,6 @@ + "typeReferenceDirectives": [], + "libReferenceDirectives": [], + "amdDependencies": [], + "identifiers": {}, +- "jsDocParsingMode": 0 ++ "jsDocParsingMode": 3 + } +\ No newline at end of file diff --git a/tests/baselines/reference/skipJSDocParsing/see-ParseNone-file.js.diff b/tests/baselines/reference/skipJSDocParsing/see-ParseNone-file.js.diff new file mode 100644 index 0000000000000..6765fd6681d39 --- /dev/null +++ b/tests/baselines/reference/skipJSDocParsing/see-ParseNone-file.js.diff @@ -0,0 +1,260 @@ +=================================================================== +--- default ++++ ParseNone +@@ -39,245 +39,9 @@ + "end": 108, + "hasTrailingComma": false, + "transformFlags": 0 + } +- }, +- "jsDoc": [ +- { +- "kind": "JSDoc", +- "pos": 1, +- "end": 28, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "tags": { +- "0": { +- "kind": "JSDocTypedefTag", +- "pos": 8, +- "end": 24, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "tagName": { +- "kind": "Identifier", +- "pos": 9, +- "end": 16, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "typedef" +- }, +- "typeExpression": { +- "kind": "JSDocTypeExpression", +- "pos": 17, +- "end": 22, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "type": { +- "kind": "AnyKeyword", +- "pos": 18, +- "end": 21, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 1 +- } +- }, +- "fullName": { +- "kind": "Identifier", +- "pos": 23, +- "end": 24, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "A" +- }, +- "name": { +- "kind": "Identifier", +- "pos": 23, +- "end": 24, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "A" +- } +- }, +- "length": 1, +- "pos": 8, +- "end": 24, +- "hasTrailingComma": false, +- "transformFlags": 0 +- } +- }, +- { +- "kind": "JSDoc", +- "pos": 30, +- "end": 100, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "tags": { +- "0": { +- "kind": "JSDocSeeTag", +- "pos": 37, +- "end": 55, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "tagName": { +- "kind": "Identifier", +- "pos": 38, +- "end": 41, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "see" +- }, +- "comment": { +- "0": { +- "kind": "JSDocText", +- "pos": 42, +- "end": 42, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "text": "" +- }, +- "1": { +- "kind": "JSDocLink", +- "pos": 42, +- "end": 51, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "name": { +- "kind": "Identifier", +- "pos": 49, +- "end": 50, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "A" +- }, +- "text": "" +- }, +- "length": 2, +- "pos": 42, +- "end": 55, +- "hasTrailingComma": false, +- "transformFlags": 0 +- } +- }, +- "1": { +- "kind": "JSDocSeeTag", +- "pos": 55, +- "end": 77, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "tagName": { +- "kind": "Identifier", +- "pos": 56, +- "end": 59, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "see" +- }, +- "comment": { +- "0": { +- "kind": "JSDocText", +- "pos": 60, +- "end": 60, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "text": "" +- }, +- "1": { +- "kind": "JSDocLinkCode", +- "pos": 60, +- "end": 73, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "name": { +- "kind": "Identifier", +- "pos": 71, +- "end": 72, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "A" +- }, +- "text": "" +- }, +- "length": 2, +- "pos": 60, +- "end": 77, +- "hasTrailingComma": false, +- "transformFlags": 0 +- } +- }, +- "2": { +- "kind": "JSDocSeeTag", +- "pos": 77, +- "end": 98, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "tagName": { +- "kind": "Identifier", +- "pos": 78, +- "end": 81, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "see" +- }, +- "comment": { +- "0": { +- "kind": "JSDocText", +- "pos": 82, +- "end": 82, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "text": "" +- }, +- "1": { +- "kind": "JSDocLinkPlain", +- "pos": 82, +- "end": 96, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "name": { +- "kind": "Identifier", +- "pos": 94, +- "end": 95, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "A" +- }, +- "text": "" +- }, +- "length": 2, +- "pos": 82, +- "end": 98, +- "hasTrailingComma": false, +- "transformFlags": 0 +- } +- }, +- "length": 3, +- "pos": 37, +- "end": 98, +- "hasTrailingComma": false, +- "transformFlags": 0 +- } +- } +- ] ++ } + }, + "length": 1, + "pos": 0, + "end": 109, +@@ -307,7 +71,6 @@ + "typeReferenceDirectives": [], + "libReferenceDirectives": [], + "amdDependencies": [], + "identifiers": {}, +- "jsDocParsingMode": 0, +- "jsDocDiagnostics": [] ++ "jsDocParsingMode": 1 + } +\ No newline at end of file diff --git a/tests/baselines/reference/skipJSDocParsing/see-ParseNone-file.ts.diff b/tests/baselines/reference/skipJSDocParsing/see-ParseNone-file.ts.diff new file mode 100644 index 0000000000000..58af82cd07529 --- /dev/null +++ b/tests/baselines/reference/skipJSDocParsing/see-ParseNone-file.ts.diff @@ -0,0 +1,259 @@ +=================================================================== +--- default ++++ ParseNone +@@ -39,245 +39,9 @@ + "end": 108, + "hasTrailingComma": false, + "transformFlags": 0 + } +- }, +- "jsDoc": [ +- { +- "kind": "JSDoc", +- "pos": 1, +- "end": 28, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "tags": { +- "0": { +- "kind": "JSDocTypedefTag", +- "pos": 8, +- "end": 24, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "tagName": { +- "kind": "Identifier", +- "pos": 9, +- "end": 16, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "typedef" +- }, +- "typeExpression": { +- "kind": "JSDocTypeExpression", +- "pos": 17, +- "end": 22, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "type": { +- "kind": "AnyKeyword", +- "pos": 18, +- "end": 21, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 1 +- } +- }, +- "fullName": { +- "kind": "Identifier", +- "pos": 23, +- "end": 24, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "A" +- }, +- "name": { +- "kind": "Identifier", +- "pos": 23, +- "end": 24, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "A" +- } +- }, +- "length": 1, +- "pos": 8, +- "end": 24, +- "hasTrailingComma": false, +- "transformFlags": 0 +- } +- }, +- { +- "kind": "JSDoc", +- "pos": 30, +- "end": 100, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "tags": { +- "0": { +- "kind": "JSDocSeeTag", +- "pos": 37, +- "end": 55, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "tagName": { +- "kind": "Identifier", +- "pos": 38, +- "end": 41, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "see" +- }, +- "comment": { +- "0": { +- "kind": "JSDocText", +- "pos": 42, +- "end": 42, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "text": "" +- }, +- "1": { +- "kind": "JSDocLink", +- "pos": 42, +- "end": 51, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "name": { +- "kind": "Identifier", +- "pos": 49, +- "end": 50, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "A" +- }, +- "text": "" +- }, +- "length": 2, +- "pos": 42, +- "end": 55, +- "hasTrailingComma": false, +- "transformFlags": 0 +- } +- }, +- "1": { +- "kind": "JSDocSeeTag", +- "pos": 55, +- "end": 77, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "tagName": { +- "kind": "Identifier", +- "pos": 56, +- "end": 59, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "see" +- }, +- "comment": { +- "0": { +- "kind": "JSDocText", +- "pos": 60, +- "end": 60, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "text": "" +- }, +- "1": { +- "kind": "JSDocLinkCode", +- "pos": 60, +- "end": 73, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "name": { +- "kind": "Identifier", +- "pos": 71, +- "end": 72, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "A" +- }, +- "text": "" +- }, +- "length": 2, +- "pos": 60, +- "end": 77, +- "hasTrailingComma": false, +- "transformFlags": 0 +- } +- }, +- "2": { +- "kind": "JSDocSeeTag", +- "pos": 77, +- "end": 98, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "tagName": { +- "kind": "Identifier", +- "pos": 78, +- "end": 81, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "see" +- }, +- "comment": { +- "0": { +- "kind": "JSDocText", +- "pos": 82, +- "end": 82, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "text": "" +- }, +- "1": { +- "kind": "JSDocLinkPlain", +- "pos": 82, +- "end": 96, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "name": { +- "kind": "Identifier", +- "pos": 94, +- "end": 95, +- "flags": "JSDoc", +- "modifierFlagsCache": 0, +- "transformFlags": 0, +- "escapedText": "A" +- }, +- "text": "" +- }, +- "length": 2, +- "pos": 82, +- "end": 98, +- "hasTrailingComma": false, +- "transformFlags": 0 +- } +- }, +- "length": 3, +- "pos": 37, +- "end": 98, +- "hasTrailingComma": false, +- "transformFlags": 0 +- } +- } +- ] ++ } + }, + "length": 1, + "pos": 0, + "end": 109, +@@ -307,6 +71,6 @@ + "typeReferenceDirectives": [], + "libReferenceDirectives": [], + "amdDependencies": [], + "identifiers": {}, +- "jsDocParsingMode": 0 ++ "jsDocParsingMode": 1 + } +\ No newline at end of file