Skip to content

Commit 2f3b06a

Browse files
committed
Handle extraction ranges including case clause expressions
(mostly by rejecting them) Fixes microsoft#20559
1 parent 4f11dd6 commit 2f3b06a

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed

src/harness/unittests/extractRanges.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,52 @@ switch (x) {
365365
refactor.extractSymbol.Messages.cannotExtractRange.message
366366
]);
367367

368+
testExtractRangeFailed("extractRangeFailed14",
369+
`
370+
switch(1) {
371+
case [#|1:
372+
break;|]
373+
}
374+
`,
375+
[
376+
refactor.extractSymbol.Messages.cannotExtractRange.message
377+
]);
378+
379+
testExtractRangeFailed("extractRangeFailed15",
380+
`
381+
switch(1) {
382+
case [#|1:
383+
break|];
384+
}
385+
`,
386+
[
387+
refactor.extractSymbol.Messages.cannotExtractRange.message
388+
]);
389+
390+
// Documentation only - it would be nice if the result were [$|1|]
391+
testExtractRangeFailed("extractRangeFailed16",
392+
`
393+
switch(1) {
394+
[#|case 1|]:
395+
break;
396+
}
397+
`,
398+
[
399+
refactor.extractSymbol.Messages.cannotExtractRange.message
400+
]);
401+
402+
// Documentation only - it would be nice if the result were [$|1|]
403+
testExtractRangeFailed("extractRangeFailed17",
404+
`
405+
switch(1) {
406+
[#|case 1:|]
407+
break;
408+
}
409+
`,
410+
[
411+
refactor.extractSymbol.Messages.cannotExtractRange.message
412+
]);
413+
368414
testExtractRangeFailed("extract-method-not-for-token-expression-statement", `[#|a|]`, [refactor.extractSymbol.Messages.cannotExtractIdentifier.message]);
369415
});
370416
}

src/services/refactors/extractSymbol.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,17 @@ namespace ts.refactor.extractSymbol {
235235
break;
236236
}
237237
}
238+
239+
if (!statements.length) {
240+
// https://github.com/Microsoft/TypeScript/issues/20559
241+
// Ranges like [|case 1: break;|] will fail to populate `statements` because
242+
// they will never find `start` in `start.parent.statements`.
243+
// Consider: We could support ranges like [|case 1:|] by refining them to just
244+
// the expression.
245+
Debug.assert(isCaseClause(start.parent) && span.start < start.parent.expression.end);
246+
return { errors: [createFileDiagnostic(sourceFile, span.start, length, Messages.cannotExtractRange)] };
247+
}
248+
238249
return { targetRange: { range: statements, facts: rangeFacts, declarations } };
239250
}
240251

0 commit comments

Comments
 (0)