From f10e38fea7996f746b79fc86f6fd47c1516cb307 Mon Sep 17 00:00:00 2001 From: Andrew Casey Date: Mon, 16 Sep 2019 19:08:01 -0700 Subject: [PATCH] Make extractSymbol explicitly drop JSDoc nodes Fixes #33332 --- src/compiler/utilities.ts | 2 ++ src/services/refactors/extractSymbol.ts | 5 +++++ src/testRunner/unittests/services/extract/ranges.ts | 4 ++++ 3 files changed, 11 insertions(+) diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index b338d3ba657..cb71df1fa93 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -975,6 +975,8 @@ namespace ts { return getSpanOfTokenAtPosition(sourceFile, node.pos); } + Debug.assert(!isJSDoc(errorNode)); + const isMissing = nodeIsMissing(errorNode); const pos = isMissing || isJsxText(node) ? errorNode.pos diff --git a/src/services/refactors/extractSymbol.ts b/src/services/refactors/extractSymbol.ts index 859f7e1d3cc..e7f57a57351 100644 --- a/src/services/refactors/extractSymbol.ts +++ b/src/services/refactors/extractSymbol.ts @@ -116,6 +116,7 @@ namespace ts.refactor.extractSymbol { export const cannotExtractRange: DiagnosticMessage = createMessage("Cannot extract range."); export const cannotExtractImport: DiagnosticMessage = createMessage("Cannot extract import statement."); export const cannotExtractSuper: DiagnosticMessage = createMessage("Cannot extract super call."); + export const cannotExtractJSDoc: DiagnosticMessage = createMessage("Cannot extract JSDoc."); export const cannotExtractEmpty: DiagnosticMessage = createMessage("Cannot extract empty range."); export const expressionExpected: DiagnosticMessage = createMessage("expression expected."); export const uselessConstantType: DiagnosticMessage = createMessage("No reason to extract constant of type."); @@ -246,6 +247,10 @@ namespace ts.refactor.extractSymbol { return { targetRange: { range: statements, facts: rangeFacts, declarations } }; } + if (isJSDoc(start)) { + return { errors: [createFileDiagnostic(sourceFile, span.start, length, Messages.cannotExtractJSDoc)] }; + } + if (isReturnStatement(start) && !start.expression) { // Makes no sense to extract an expression-less return statement. return { errors: [createFileDiagnostic(sourceFile, span.start, length, Messages.cannotExtractRange)] }; diff --git a/src/testRunner/unittests/services/extract/ranges.ts b/src/testRunner/unittests/services/extract/ranges.ts index d2ac6a0a883..ab205288b33 100644 --- a/src/testRunner/unittests/services/extract/ranges.ts +++ b/src/testRunner/unittests/services/extract/ranges.ts @@ -380,6 +380,10 @@ switch (x) { `[#|{ 1;|] }`, [refactor.extractSymbol.Messages.cannotExtractRange.message]); + testExtractRangeFailed("extractRangeFailed19", + `[#|/** @type {number} */|] const foo = 1;`, + [refactor.extractSymbol.Messages.cannotExtractJSDoc.message]); + testExtractRangeFailed("extract-method-not-for-token-expression-statement", `[#|a|]`, [refactor.extractSymbol.Messages.cannotExtractIdentifier.message]); }); }