fix(50416): correctly names disabled export refactors (#50663)

* added test case to try to retrieve duplicate refactor as in #50416. 'verify.refactorAvailable' correctly retrieves nonduplicate refactors...

* optional arguments in refactorAvailable return `true` even if there is no single refactor that satisfies both

* it still passes :C

* Delete fixExtractToInnerFunctionDuplicaton.ts

* deleted extra test code

* fix 'verify.refactorAvailable' so that tests correctly check for multiple arguments

* fixes #50416

* refactor
This commit is contained in:
Isabel Duan 2022-10-13 16:44:30 -07:00 committed by GitHub
parent 2bcfed01f3
commit 2cb7e779d7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 28 additions and 5 deletions

View File

@ -1,4 +1,3 @@
namespace FourSlash {
import ArrayOrSingle = FourSlashInterface.ArrayOrSingle;
@ -3481,8 +3480,18 @@ namespace FourSlash {
public verifyRefactorAvailable(negative: boolean, triggerReason: ts.RefactorTriggerReason, name: string, actionName?: string, actionDescription?: string) {
let refactors = this.getApplicableRefactorsAtSelection(triggerReason);
refactors = refactors.filter(r =>
r.name === name && (actionName === undefined || r.actions.some(a => a.name === actionName)) && (actionDescription === undefined || r.actions.some(a => a.description === actionDescription)));
refactors = refactors.filter(r => r.name === name);
if (actionName !== undefined) {
refactors.forEach(r => r.actions = r.actions.filter(a => a.name === actionName));
}
if (actionDescription !== undefined) {
refactors.forEach(r => r.actions = r.actions.filter(a => a.description === actionDescription));
}
refactors = refactors.filter(r => r.actions.length > 0);
const isAvailable = refactors.length > 0;
if (negative) {

View File

@ -69,8 +69,8 @@ namespace ts.refactor.extractSymbol {
let i = 0;
for (const { functionExtraction, constantExtraction } of extractions) {
const description = functionExtraction.description;
if (refactorKindBeginsWith(extractFunctionAction.kind, requestedRefactor)) {
const description = functionExtraction.description;
if (functionExtraction.errors.length === 0) {
// Don't issue refactorings with duplicated names.
// Scopes come back in "innermost first" order, so extractions will
@ -95,11 +95,11 @@ namespace ts.refactor.extractSymbol {
}
if (refactorKindBeginsWith(extractConstantAction.kind, requestedRefactor)) {
const description = constantExtraction.description;
if (constantExtraction.errors.length === 0) {
// Don't issue refactorings with duplicated names.
// Scopes come back in "innermost first" order, so extractions will
// preferentially go into nearer scopes
const description = constantExtraction.description;
if (!usedConstantNames.has(description)) {
usedConstantNames.set(description, true);
constantActions.push({

View File

@ -0,0 +1,14 @@
/// <reference path="../fourslash.ts" />
//// function foo(): void { /*x*/console.log('a');/*y*/ }
goTo.select("x","y");
verify.refactorAvailable("Extract Symbol", 'function_scope_0', "Extract to inner function in function 'foo'");
verify.refactorAvailable("Extract Symbol", 'function_scope_1', "Extract to function in global scope");
verify.not.refactorAvailable("Extract Symbol", 'constant_scope_0', "Extract to inner function in function 'foo'");
verify.refactorAvailable("Extract Symbol", 'constant_scope_0', "Extract to constant in enclosing scope");
verify.refactorAvailable("Extract Symbol", 'constant_scope_1', "Extract to constant in global scope");
verify.not.refactorAvailable("Extract Symbol", 'constant_scope_0', "Extract to constant in global scope");