Skip to content
Permalink
Browse files
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
  • Loading branch information
iisaduan committed Oct 13, 2022
1 parent 2bcfed0 commit 2cb7e779d70d57ef0d46dd3f768e646b8bbe783a
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 5 deletions.
@@ -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) {
@@ -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({
@@ -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");

0 comments on commit 2cb7e77

Please sign in to comment.