From 063e8a72ec3aeab881150ce31ba474d1e92272fa Mon Sep 17 00:00:00 2001 From: Andrew Casey Date: Wed, 13 Sep 2017 16:43:14 -0700 Subject: [PATCH] Merge pull request #18427 from amcasey/GH17869 Forbid extraction of empty spans (cherry picked from commit be5c00f4c9626848fe8e812aad32b86020c296bc) --- src/harness/unittests/extractMethods.ts | 6 ++++++ src/services/refactors/extractMethod.ts | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/src/harness/unittests/extractMethods.ts b/src/harness/unittests/extractMethods.ts index e7d86331a82..b0ba6143042 100644 --- a/src/harness/unittests/extractMethods.ts +++ b/src/harness/unittests/extractMethods.ts @@ -404,6 +404,12 @@ function test(x: number) { ]); testExtractRangeFailed("extract-method-not-for-token-expression-statement", `[#|a|]`, ["Select more than a single token."]); + testExtractRangeFailed("extractRangeFailed9", + `var x = ([#||]1 + 2);`, + [ + "Statement or expression expected." + ]); + testExtractMethod("extractMethod1", `namespace A { let x = 1; diff --git a/src/services/refactors/extractMethod.ts b/src/services/refactors/extractMethod.ts index ebc13dd2696..93f320cb261 100644 --- a/src/services/refactors/extractMethod.ts +++ b/src/services/refactors/extractMethod.ts @@ -149,6 +149,11 @@ namespace ts.refactor.extractMethod { // exported only for tests export function getRangeToExtract(sourceFile: SourceFile, span: TextSpan): RangeToExtract { const length = span.length || 0; + + if (length === 0) { + return { errors: [createFileDiagnostic(sourceFile, span.start, length, Messages.StatementOrExpressionExpected)] }; + } + // Walk up starting from the the start position until we find a non-SourceFile node that subsumes the selected span. // This may fail (e.g. you select two statements in the root of a source file) let start = getParentNodeInSpan(getTokenAtPosition(sourceFile, span.start, /*includeJsDocComment*/ false), sourceFile, span);