Skip to content

Commit ccfbb45

Browse files
author
Andy
committed
Don't try to extract import to a method (#18025)
1 parent a39ae1f commit ccfbb45

File tree

3 files changed

+87
-67
lines changed

3 files changed

+87
-67
lines changed

src/compiler/utilities.ts

Lines changed: 62 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -4946,54 +4946,60 @@ namespace ts {
49464946
|| kind === SyntaxKind.NoSubstitutionTemplateLiteral;
49474947
}
49484948

4949-
function isLeftHandSideExpressionKind(kind: SyntaxKind): boolean {
4950-
return kind === SyntaxKind.PropertyAccessExpression
4951-
|| kind === SyntaxKind.ElementAccessExpression
4952-
|| kind === SyntaxKind.NewExpression
4953-
|| kind === SyntaxKind.CallExpression
4954-
|| kind === SyntaxKind.JsxElement
4955-
|| kind === SyntaxKind.JsxSelfClosingElement
4956-
|| kind === SyntaxKind.TaggedTemplateExpression
4957-
|| kind === SyntaxKind.ArrayLiteralExpression
4958-
|| kind === SyntaxKind.ParenthesizedExpression
4959-
|| kind === SyntaxKind.ObjectLiteralExpression
4960-
|| kind === SyntaxKind.ClassExpression
4961-
|| kind === SyntaxKind.FunctionExpression
4962-
|| kind === SyntaxKind.Identifier
4963-
|| kind === SyntaxKind.RegularExpressionLiteral
4964-
|| kind === SyntaxKind.NumericLiteral
4965-
|| kind === SyntaxKind.StringLiteral
4966-
|| kind === SyntaxKind.NoSubstitutionTemplateLiteral
4967-
|| kind === SyntaxKind.TemplateExpression
4968-
|| kind === SyntaxKind.FalseKeyword
4969-
|| kind === SyntaxKind.NullKeyword
4970-
|| kind === SyntaxKind.ThisKeyword
4971-
|| kind === SyntaxKind.TrueKeyword
4972-
|| kind === SyntaxKind.SuperKeyword
4973-
|| kind === SyntaxKind.ImportKeyword
4974-
|| kind === SyntaxKind.NonNullExpression
4975-
|| kind === SyntaxKind.MetaProperty;
4976-
}
4977-
49784949
/* @internal */
49794950
export function isLeftHandSideExpression(node: Node): node is LeftHandSideExpression {
4980-
return isLeftHandSideExpressionKind(skipPartiallyEmittedExpressions(node).kind);
4981-
}
4982-
4983-
function isUnaryExpressionKind(kind: SyntaxKind): boolean {
4984-
return kind === SyntaxKind.PrefixUnaryExpression
4985-
|| kind === SyntaxKind.PostfixUnaryExpression
4986-
|| kind === SyntaxKind.DeleteExpression
4987-
|| kind === SyntaxKind.TypeOfExpression
4988-
|| kind === SyntaxKind.VoidExpression
4989-
|| kind === SyntaxKind.AwaitExpression
4990-
|| kind === SyntaxKind.TypeAssertionExpression
4991-
|| isLeftHandSideExpressionKind(kind);
4951+
switch (node.kind) {
4952+
case SyntaxKind.PropertyAccessExpression:
4953+
case SyntaxKind.ElementAccessExpression:
4954+
case SyntaxKind.NewExpression:
4955+
case SyntaxKind.CallExpression:
4956+
case SyntaxKind.JsxElement:
4957+
case SyntaxKind.JsxSelfClosingElement:
4958+
case SyntaxKind.TaggedTemplateExpression:
4959+
case SyntaxKind.ArrayLiteralExpression:
4960+
case SyntaxKind.ParenthesizedExpression:
4961+
case SyntaxKind.ObjectLiteralExpression:
4962+
case SyntaxKind.ClassExpression:
4963+
case SyntaxKind.FunctionExpression:
4964+
case SyntaxKind.Identifier:
4965+
case SyntaxKind.RegularExpressionLiteral:
4966+
case SyntaxKind.NumericLiteral:
4967+
case SyntaxKind.StringLiteral:
4968+
case SyntaxKind.NoSubstitutionTemplateLiteral:
4969+
case SyntaxKind.TemplateExpression:
4970+
case SyntaxKind.FalseKeyword:
4971+
case SyntaxKind.NullKeyword:
4972+
case SyntaxKind.ThisKeyword:
4973+
case SyntaxKind.TrueKeyword:
4974+
case SyntaxKind.SuperKeyword:
4975+
case SyntaxKind.NonNullExpression:
4976+
case SyntaxKind.MetaProperty:
4977+
return true;
4978+
case SyntaxKind.PartiallyEmittedExpression:
4979+
return isLeftHandSideExpression((node as PartiallyEmittedExpression).expression);
4980+
case SyntaxKind.ImportKeyword:
4981+
return node.parent.kind === SyntaxKind.CallExpression;
4982+
default:
4983+
return false;
4984+
}
49924985
}
49934986

49944987
/* @internal */
49954988
export function isUnaryExpression(node: Node): node is UnaryExpression {
4996-
return isUnaryExpressionKind(skipPartiallyEmittedExpressions(node).kind);
4989+
switch (node.kind) {
4990+
case SyntaxKind.PrefixUnaryExpression:
4991+
case SyntaxKind.PostfixUnaryExpression:
4992+
case SyntaxKind.DeleteExpression:
4993+
case SyntaxKind.TypeOfExpression:
4994+
case SyntaxKind.VoidExpression:
4995+
case SyntaxKind.AwaitExpression:
4996+
case SyntaxKind.TypeAssertionExpression:
4997+
return true;
4998+
case SyntaxKind.PartiallyEmittedExpression:
4999+
return isUnaryExpression((node as PartiallyEmittedExpression).expression);
5000+
default:
5001+
return isLeftHandSideExpression(node);
5002+
}
49975003
}
49985004

49995005
/* @internal */
@@ -5009,21 +5015,22 @@ namespace ts {
50095015
}
50105016
}
50115017

5012-
function isExpressionKind(kind: SyntaxKind) {
5013-
return kind === SyntaxKind.ConditionalExpression
5014-
|| kind === SyntaxKind.YieldExpression
5015-
|| kind === SyntaxKind.ArrowFunction
5016-
|| kind === SyntaxKind.BinaryExpression
5017-
|| kind === SyntaxKind.SpreadElement
5018-
|| kind === SyntaxKind.AsExpression
5019-
|| kind === SyntaxKind.OmittedExpression
5020-
|| kind === SyntaxKind.CommaListExpression
5021-
|| isUnaryExpressionKind(kind);
5022-
}
5023-
50245018
/* @internal */
50255019
export function isExpression(node: Node): node is Expression {
5026-
return isExpressionKind(skipPartiallyEmittedExpressions(node).kind);
5020+
switch (node.kind) {
5021+
case SyntaxKind.ConditionalExpression:
5022+
case SyntaxKind.YieldExpression:
5023+
case SyntaxKind.ArrowFunction:
5024+
case SyntaxKind.BinaryExpression:
5025+
case SyntaxKind.SpreadElement:
5026+
case SyntaxKind.AsExpression:
5027+
case SyntaxKind.OmittedExpression:
5028+
case SyntaxKind.CommaListExpression:
5029+
case SyntaxKind.PartiallyEmittedExpression:
5030+
return true;
5031+
default:
5032+
return isUnaryExpression(node);
5033+
}
50275034
}
50285035

50295036
export function isAssertionExpression(node: Node): node is AssertionExpression {

src/services/refactors/extractMethod.ts

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -231,18 +231,7 @@ namespace ts.refactor.extractMethod {
231231
if (errors) {
232232
return { errors };
233233
}
234-
235-
// If our selection is the expression in an ExpressionStatement, expand
236-
// the selection to include the enclosing Statement (this stops us
237-
// from trying to care about the return value of the extracted function
238-
// and eliminates double semicolon insertion in certain scenarios)
239-
const range = isStatement(start)
240-
? [start]
241-
: start.parent && start.parent.kind === SyntaxKind.ExpressionStatement
242-
? [start.parent as Statement]
243-
: start as Expression;
244-
245-
return { targetRange: { range, facts: rangeFacts, declarations } };
234+
return { targetRange: { range: getStatementOrExpressionRange(start), facts: rangeFacts, declarations } };
246235
}
247236

248237
function createErrorResult(sourceFile: SourceFile, start: number, length: number, message: DiagnosticMessage): RangeToExtract {
@@ -459,6 +448,20 @@ namespace ts.refactor.extractMethod {
459448
}
460449
}
461450

451+
function getStatementOrExpressionRange(node: Node): Statement[] | Expression {
452+
if (isStatement(node)) {
453+
return [node];
454+
}
455+
else if (isExpression(node)) {
456+
// If our selection is the expression in an ExpressionStatement, expand
457+
// the selection to include the enclosing Statement (this stops us
458+
// from trying to care about the return value of the extracted function
459+
// and eliminates double semicolon insertion in certain scenarios)
460+
return isExpressionStatement(node.parent) ? [node.parent] : node;
461+
}
462+
return undefined;
463+
}
464+
462465
function isValidExtractionTarget(node: Node): node is Scope {
463466
// Note that we don't use isFunctionLike because we don't want to put the extracted closure *inside* a method
464467
return (node.kind === SyntaxKind.FunctionDeclaration) || isSourceFile(node) || isModuleBlock(node) || isClassLike(node);
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
// @Filename: /a.ts
4+
////i/**/mport _ from "./b";
5+
6+
// @Filename: /b.ts
7+
////export default function f() {}
8+
9+
goTo.marker("");
10+
verify.not.refactorAvailable('Extract Method');

0 commit comments

Comments
 (0)