From f25643faa3d3dfbeda517a83fa49c7b80916bd55 Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Tue, 27 Jun 2017 12:41:28 -0700 Subject: [PATCH] getApplicableRefactors: Don't return undefined response --- 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 7c9811c41c85d..ea19c3274f20b 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -494,6 +494,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 3c02ddf671c8c..432df8c53d00c 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 {