From e8fb58709716c980326615047d34d7902c64af3e Mon Sep 17 00:00:00 2001 From: Andy Date: Thu, 22 Feb 2018 16:26:37 -0800 Subject: [PATCH] organizeImports: Avoid using full FindAllReferences (#22102) * organizeImports: Avoid using full FindAllReferences * Add parentheses --- src/services/findAllReferences.ts | 10 ++++++++++ src/services/organizeImports.ts | 17 +---------------- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/src/services/findAllReferences.ts b/src/services/findAllReferences.ts index 41bc5685f80..3b9d465764e 100644 --- a/src/services/findAllReferences.ts +++ b/src/services/findAllReferences.ts @@ -707,6 +707,16 @@ namespace ts.FindAllReferences.Core { return exposedByParent ? scope.getSourceFile() : scope; } + /** Used as a quick check for whether a symbol is used at all in a file (besides its definition). */ + export function isSymbolReferencedInFile(definition: Identifier, checker: TypeChecker, sourceFile: SourceFile) { + const symbol = checker.getSymbolAtLocation(definition); + if (!symbol) return true; // Be lenient with invalid code. + return getPossibleSymbolReferencePositions(sourceFile, symbol.name).some(position => { + const token = tryCast(getTouchingPropertyName(sourceFile, position, /*includeJsDocComment*/ true), isIdentifier); + return token && token !== definition && token.escapedText === definition.escapedText && checker.getSymbolAtLocation(token) === symbol; + }); + } + function getPossibleSymbolReferencePositions(sourceFile: SourceFile, symbolName: string, container: Node = sourceFile): ReadonlyArray { const positions: number[] = []; diff --git a/src/services/organizeImports.ts b/src/services/organizeImports.ts index 7f54d80e79d..082dfc4130d 100644 --- a/src/services/organizeImports.ts +++ b/src/services/organizeImports.ts @@ -104,23 +104,8 @@ namespace ts.OrganizeImports { return usedImports; function isDeclarationUsed(identifier: Identifier) { - const symbol = typeChecker.getSymbolAtLocation(identifier); - - // Be lenient with invalid code. - if (symbol === undefined) { - return true; - } - // The JSX factory symbol is always used. - if (jsxContext && symbol.name === jsxNamespace) { - return true; - } - - const entries = FindAllReferences.getReferenceEntriesForNode(identifier.pos, identifier, program, [sourceFile], { - isCancellationRequested: () => false, - throwIfCancellationRequested: () => { /*noop*/ }, - }).filter(e => e.type === "node" && e.node.getSourceFile() === sourceFile); - return entries.length > 1; + return jsxContext && (identifier.text === jsxNamespace) || FindAllReferences.Core.isSymbolReferencedInFile(identifier, typeChecker, sourceFile); } }