From 79b10081a9fdc2f0259c43676c8bda0a3fa3fe21 Mon Sep 17 00:00:00 2001 From: Andy Date: Thu, 13 Jul 2017 07:32:41 -0700 Subject: [PATCH] getApplicableRefactors: Don't return undefined response (#16773) --- src/compiler/core.ts | 11 +++++++++++ src/services/refactorProvider.ts | 19 +++---------------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/compiler/core.ts b/src/compiler/core.ts index 97a65c10933..a1880b46471 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -467,6 +467,17 @@ namespace ts { return result; } + export function flatMapIter(iter: Iterator, mapfn: (x: T) => U[] | undefined): U[] { + const result: U[] = []; + while (true) { + const { value, done } = iter.next(); + if (done) break; + const res = mapfn(value); + if (res) result.push(...res); + } + return result; + } + /** * Maps an array. If the mapped value is an array, it is spread into the result. * Avoids allocation if all elements map to themselves. diff --git a/src/services/refactorProvider.ts b/src/services/refactorProvider.ts index 3c02ddf671c..432df8c53d0 100644 --- a/src/services/refactorProvider.ts +++ b/src/services/refactorProvider.ts @@ -33,22 +33,9 @@ namespace ts { refactors.set(refactor.name, refactor); } - export function getApplicableRefactors(context: RefactorContext): ApplicableRefactorInfo[] | undefined { - let results: ApplicableRefactorInfo[]; - const refactorList: Refactor[] = []; - refactors.forEach(refactor => { - refactorList.push(refactor); - }); - for (const refactor of refactorList) { - if (context.cancellationToken && context.cancellationToken.isCancellationRequested()) { - return results; - } - const infos = refactor.getAvailableActions(context); - if (infos && infos.length) { - (results || (results = [])).push(...infos); - } - } - return results; + export function getApplicableRefactors(context: RefactorContext): ApplicableRefactorInfo[] { + return flatMapIter(refactors.values(), refactor => + context.cancellationToken && context.cancellationToken.isCancellationRequested() ? [] : refactor.getAvailableActions(context)); } export function getEditsForRefactor(context: RefactorContext, refactorName: string, actionName: string): RefactorEditInfo | undefined {