mirror of
https://github.com/microsoft/TypeScript.git
synced 2025-11-18 17:21:48 +00:00
Include type reference directives in symlink cache, wait until program is present to create it (#44259)
* Fix discovery of more pnpm symlinks * Add some tests * Never show pnpm paths in auto imports, even if there’s no other path * Import statement completions can return none * Fix tests * Add failing test showing poor symlink cache reuse * Fix test, fails for right reasons now * Preserve cache built up during program creation, then fill in with program resolutions * Remove obsolete comment * Remove obsolete type assertion * Revert fully filtering out ignored paths
This commit is contained in:
@@ -66,7 +66,9 @@ namespace ts.codefix {
|
||||
const preferTypeOnlyImport = !!usageIsTypeOnly && compilerOptions.importsNotUsedAsValues === ImportsNotUsedAsValues.Error;
|
||||
const useRequire = shouldUseRequire(sourceFile, program);
|
||||
const fix = getImportFixForSymbol(sourceFile, exportInfos, moduleSymbol, symbolName, program, /*position*/ undefined, preferTypeOnlyImport, useRequire, host, preferences);
|
||||
addImport({ fixes: [fix], symbolName });
|
||||
if (fix) {
|
||||
addImport({ fixes: [fix], symbolName });
|
||||
}
|
||||
}
|
||||
|
||||
function addImport(info: FixesInfo) {
|
||||
@@ -203,7 +205,7 @@ namespace ts.codefix {
|
||||
: getAllReExportingModules(sourceFile, exportedSymbol, moduleSymbol, symbolName, host, program, /*useAutoImportProvider*/ true);
|
||||
const useRequire = shouldUseRequire(sourceFile, program);
|
||||
const preferTypeOnlyImport = compilerOptions.importsNotUsedAsValues === ImportsNotUsedAsValues.Error && !isSourceFileJS(sourceFile) && isValidTypeOnlyAliasUseSite(getTokenAtPosition(sourceFile, position));
|
||||
const fix = getImportFixForSymbol(sourceFile, exportInfos, moduleSymbol, symbolName, program, position, preferTypeOnlyImport, useRequire, host, preferences);
|
||||
const fix = Debug.checkDefined(getImportFixForSymbol(sourceFile, exportInfos, moduleSymbol, symbolName, program, position, preferTypeOnlyImport, useRequire, host, preferences));
|
||||
return { moduleSpecifier: fix.moduleSpecifier, codeAction: codeFixActionToCodeAction(codeActionForFix({ host, formatContext, preferences }, sourceFile, symbolName, fix, getQuotePreference(sourceFile, preferences))) };
|
||||
}
|
||||
|
||||
@@ -274,7 +276,7 @@ namespace ts.codefix {
|
||||
program: Program,
|
||||
host: LanguageServiceHost,
|
||||
preferences: UserPreferences
|
||||
): { exportInfo?: SymbolExportInfo, moduleSpecifier: string } {
|
||||
): { exportInfo?: SymbolExportInfo, moduleSpecifier: string } | undefined {
|
||||
return getBestFix(getNewImportFixes(program, importingFile, /*position*/ undefined, /*preferTypeOnlyImport*/ false, /*useRequire*/ false, exportInfo, host, preferences), importingFile, host);
|
||||
}
|
||||
|
||||
@@ -529,7 +531,8 @@ namespace ts.codefix {
|
||||
return sort(fixes, (a, b) => compareValues(a.kind, b.kind) || compareModuleSpecifiers(a, b, allowsImportingSpecifier));
|
||||
}
|
||||
|
||||
function getBestFix<T extends ImportFix>(fixes: readonly T[], sourceFile: SourceFile, host: LanguageServiceHost): T {
|
||||
function getBestFix<T extends ImportFix>(fixes: readonly T[], sourceFile: SourceFile, host: LanguageServiceHost): T | undefined {
|
||||
if (!some(fixes)) return;
|
||||
// These will always be placed first if available, and are better than other kinds
|
||||
if (fixes[0].kind === ImportFixKind.UseNamespace || fixes[0].kind === ImportFixKind.AddToExisting) {
|
||||
return fixes[0];
|
||||
|
||||
@@ -1594,6 +1594,7 @@ namespace ts.Completions {
|
||||
|
||||
function tryGetImportCompletionSymbols(): GlobalsSearch {
|
||||
if (!importCompletionNode) return GlobalsSearch.Continue;
|
||||
isNewIdentifierLocation = true;
|
||||
collectAutoImports(/*resolveModuleSpecifiers*/ true);
|
||||
return GlobalsSearch.Success;
|
||||
}
|
||||
@@ -1762,7 +1763,7 @@ namespace ts.Completions {
|
||||
// If we don't need to resolve module specifiers, we can use any re-export that is importable at all
|
||||
// (We need to ensure that at least one is importable to show a completion.)
|
||||
const { moduleSpecifier, exportInfo } = resolveModuleSpecifiers
|
||||
? codefix.getModuleSpecifierForBestExportInfo(info, sourceFile, program, host, preferences)
|
||||
? codefix.getModuleSpecifierForBestExportInfo(info, sourceFile, program, host, preferences) || {}
|
||||
: { moduleSpecifier: undefined, exportInfo: find(info, isImportableExportInfo) };
|
||||
if (!exportInfo) return;
|
||||
const moduleFile = tryCast(exportInfo.moduleSymbol.valueDeclaration, isSourceFile);
|
||||
|
||||
@@ -1845,7 +1845,6 @@ namespace ts {
|
||||
getSymlinkCache: maybeBind(host, host.getSymlinkCache) || program.getSymlinkCache,
|
||||
getModuleSpecifierCache: maybeBind(host, host.getModuleSpecifierCache),
|
||||
getGlobalTypingsCacheLocation: maybeBind(host, host.getGlobalTypingsCacheLocation),
|
||||
getSourceFiles: () => program.getSourceFiles(),
|
||||
redirectTargetsMap: program.redirectTargetsMap,
|
||||
getProjectReferenceRedirect: fileName => program.getProjectReferenceRedirect(fileName),
|
||||
isSourceOfProjectReferenceRedirect: fileName => program.isSourceOfProjectReferenceRedirect(fileName),
|
||||
|
||||
Reference in New Issue
Block a user