ignore not applicable refactor code actions

This commit is contained in:
Qiming Zhao 2020-09-22 18:40:37 +08:00
parent 807fd06457
commit 7999ac085e
4 changed files with 55 additions and 17 deletions

View file

@ -629,6 +629,6 @@
"which": "^2.0.2"
},
"dependencies": {
"typescript": "3.9.7"
"typescript": "4.0.3"
}
}

View file

@ -12,6 +12,12 @@ import { ITypeScriptServiceClient } from '../typescriptService'
import * as typeConverters from '../utils/typeConverters'
import FormattingOptionsManager from './fileConfigurationManager'
namespace Experimental {
export interface RefactorActionInfo extends Proto.RefactorActionInfo {
readonly notApplicableReason?: string
}
}
class ApplyRefactoringCommand implements Command {
public static readonly ID = '_typescript.applyRefactoring'
public readonly id = ApplyRefactoringCommand.ID
@ -142,7 +148,8 @@ export default class TypeScriptRefactorProvider implements CodeActionProvider {
response.body,
document,
file,
range
range,
context.only && context.only.some(v => v.includes(CodeActionKind.Refactor))
)
}
@ -150,10 +157,13 @@ export default class TypeScriptRefactorProvider implements CodeActionProvider {
body: Proto.ApplicableRefactorInfo[],
document: TextDocument,
file: string,
rangeOrSelection: Range
rangeOrSelection: Range,
setPrefrred: boolean
): CodeAction[] {
const actions: CodeAction[] = []
for (const info of body) {
// ignore not refactor that not applicable
if ((info as Experimental.RefactorActionInfo).notApplicableReason) continue
if (!info.inlineable) {
const codeAction: CodeAction = {
title: info.description,
@ -167,15 +177,11 @@ export default class TypeScriptRefactorProvider implements CodeActionProvider {
actions.push(codeAction)
} else {
for (const action of info.actions) {
actions.push(
this.refactorActionToCodeAction(
action,
document,
file,
info,
rangeOrSelection
)
)
let codeAction = this.refactorActionToCodeAction(action, document, file, info, rangeOrSelection)
if (setPrefrred) {
codeAction.isPreferred = TypeScriptRefactorProvider.isPreferred(action, info.actions)
}
actions.push(codeAction)
}
}
}
@ -204,7 +210,7 @@ export default class TypeScriptRefactorProvider implements CodeActionProvider {
private shouldTrigger(context: CodeActionContext): boolean {
if (
context.only &&
context.only.indexOf(CodeActionKind.Refactor) == -1
context.only.every(o => !o.includes(CodeActionKind.Refactor))
) {
return false
}
@ -221,4 +227,34 @@ export default class TypeScriptRefactorProvider implements CodeActionProvider {
}
return CodeActionKind.Refactor
}
private static isPreferred(
action: Proto.RefactorActionInfo,
allActions: readonly Proto.RefactorActionInfo[],
): boolean {
let kind = TypeScriptRefactorProvider.getKind(action)
if (TypeScriptRefactorProvider.extractConstantKind == kind) {
// Only mark the action with the lowest scope as preferred
const getScope = (name: string) => {
const scope = name.match(/scope_(\d)/)?.[1]
return scope ? +scope : undefined
}
const scope = getScope(action.name)
if (typeof scope !== 'number') {
return false
}
return allActions
.filter(otherAtion => otherAtion !== action && otherAtion.name.startsWith('constant_'))
.every(otherAction => {
const otherScope = getScope(otherAction.name)
return typeof otherScope === 'number' ? scope < otherScope : true
})
}
let { name } = action
if (name.startsWith('Extract to type alias') || name.startsWith('Extract to interface')) {
return true
}
return false
}
}

View file

@ -38,6 +38,8 @@ export default class API {
public static readonly v380 = API.fromSimpleString('3.8.0')
public static readonly v381 = API.fromSimpleString('3.8.1')
public static readonly v390 = API.fromSimpleString('3.9.0')
public static readonly v400 = API.fromSimpleString('4.0.0')
public static readonly v401 = API.fromSimpleString('4.0.1');
public static fromVersionString(versionString: string): API {
let version = semver.valid(versionString)

View file

@ -3139,10 +3139,10 @@ typedarray@^0.0.6:
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
typescript@3.9.7:
version "3.9.7"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa"
integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==
typescript@4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.3.tgz#153bbd468ef07725c1df9c77e8b453f8d36abba5"
integrity sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==
union-value@^1.0.0:
version "1.0.1"