diff --git a/internal/ls/autoimports.go b/internal/ls/autoimports.go index b61abc8dc0..ac168cf5da 100644 --- a/internal/ls/autoimports.go +++ b/internal/ls/autoimports.go @@ -1010,7 +1010,9 @@ func (l *LanguageService) getNewImportFixes( ) []*ImportFix /* FixAddNewImport | FixAddJsdocTypeImport */ { isJs := tspath.HasJSFileExtension(sourceFile.FileName()) compilerOptions := l.GetProgram().Options() - // !!! packagejsonAutoimportProvider + // !!! if preferences.IncludePackageJsonAutoImports != "off" { + // !!! packagejsonAutoimportProvider + // !!! } // getChecker := createGetChecker(program, host)// memoized typechecker based on `isFromPackageJson` bool getModuleSpecifiers := func(moduleSymbol *ast.Symbol, checker *checker.Checker) ([]string, modulespecifiers.ResultKind) { @@ -1345,6 +1347,10 @@ func forEachExternalModuleToImportFrom( }, ) + // if preferences.IncludePackageJsonAutoImports == "off" { + // return; + // } + // !!! autoImportProvider // if autoImportProvider := useAutoImportProvider && l.getPackageJsonAutoImportProvider(); autoImportProvider != nil { // // start := timestamp(); diff --git a/internal/ls/completions.go b/internal/ls/completions.go index 95934780dc..86d8754171 100644 --- a/internal/ls/completions.go +++ b/internal/ls/completions.go @@ -1188,7 +1188,9 @@ func (l *LanguageService) getCompletionData( isValidTypeOnlyUseSite := ast.IsValidTypeOnlyAliasUseSite(location) // !!! moduleSpecifierCache := host.getModuleSpecifierCache(); - // !!! packageJsonAutoImportProvider := host.getPackageJsonAutoImportProvider(); + // !!! if preferences.includePackageJsonAutoImports != "off" { + // !!! packageJsonAutoImportProvider := host.getPackageJsonAutoImportProvider(); + // !!! } addSymbolToList := func(info []*SymbolExportInfo, symbolName string, isFromAmbientModule bool, exportMapKey ExportInfoMapKey) []*SymbolExportInfo { // Do a relatively cheap check to bail early if all re-exports are non-importable // due to file location or package.json dependency filtering. For non-node16+ diff --git a/internal/ls/findallreferences.go b/internal/ls/findallreferences.go index 7e31e181e0..9527c4f7bb 100644 --- a/internal/ls/findallreferences.go +++ b/internal/ls/findallreferences.go @@ -15,6 +15,7 @@ import ( "github.com/microsoft/typescript-go/internal/compiler" "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/debug" + "github.com/microsoft/typescript-go/internal/ls" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/scanner" "github.com/microsoft/typescript-go/internal/stringutil" @@ -452,11 +453,11 @@ func (l *LanguageService) getImplementationReferenceEntries(ctx context.Context, return core.FlatMap(symbolsAndEntries, func(s *SymbolAndEntries) []*referenceEntry { return s.references }) } -func (l *LanguageService) ProvideRename(ctx context.Context, params *lsproto.RenameParams) (lsproto.WorkspaceEditOrNull, error) { +func (l *LanguageService) ProvideRename(ctx context.Context, params *lsproto.RenameParams, prefs *ls.UserPreferences) (lsproto.WorkspaceEditOrNull, error) { program, sourceFile := l.getProgramAndFile(params.TextDocument.Uri) position := int(l.converters.LineAndCharacterToPosition(sourceFile, params.Position)) node := astnav.GetTouchingPropertyName(sourceFile, position) - if node.Kind != ast.KindIdentifier { + if node.Kind != ast.KindIdentifier && !(ast.IsStringLiteralLike(node) && tryGetImportFromModuleSpecifier(node) != nil && prefs.AllowRenameOfImportPath) { return lsproto.WorkspaceEditOrNull{}, nil } options := refOptions{use: referenceUseRename, useAliasesForRename: true} @@ -467,6 +468,9 @@ func (l *LanguageService) ProvideRename(ctx context.Context, params *lsproto.Ren defer done() for _, entry := range entries { uri := FileNameToDocumentURI(l.getFileNameOfEntry(entry)) + if !prefs.AllowRenameOfImportPath && entry.node != nil && ast.IsStringLiteralLike(entry.node) && tryGetImportFromModuleSpecifier(entry.node) != nil { + continue + } textEdit := &lsproto.TextEdit{ Range: *l.getRangeOfEntry(entry), NewText: l.getTextForRename(node, entry, params.NewName, checker), diff --git a/internal/lsp/server.go b/internal/lsp/server.go index 54f78f2e16..e341ff6286 100644 --- a/internal/lsp/server.go +++ b/internal/lsp/server.go @@ -855,8 +855,8 @@ func (s *Server) handleDocumentSymbol(ctx context.Context, ls *ls.LanguageServic return ls.ProvideDocumentSymbols(ctx, params.TextDocument.Uri) } -func (s *Server) handleRename(ctx context.Context, ls *ls.LanguageService, params *lsproto.RenameParams) (lsproto.RenameResponse, error) { - return ls.ProvideRename(ctx, params) +func (s *Server) handleRename(ctx context.Context, languageServer *ls.LanguageService, params *lsproto.RenameParams) (lsproto.RenameResponse, error) { + return languageServer.ProvideRename(ctx, params, &ls.UserPreferences{}) } func (s *Server) handleDocumentHighlight(ctx context.Context, ls *ls.LanguageService, params *lsproto.DocumentHighlightParams) (lsproto.DocumentHighlightResponse, error) { diff --git a/internal/modulespecifiers/preferences.go b/internal/modulespecifiers/preferences.go index f28f1293c6..2c544e22fc 100644 --- a/internal/modulespecifiers/preferences.go +++ b/internal/modulespecifiers/preferences.go @@ -141,6 +141,7 @@ func getPreferredEnding( type ModuleSpecifierPreferences struct { relativePreference RelativePreferenceKind getAllowedEndingsInPreferredOrder func(syntaxImpliedNodeFormat core.ResolutionMode) []ModuleSpecifierEnding + packageJsonAutoImports IncludePackageJsonAutoImports excludeRegexes []string } @@ -170,6 +171,7 @@ func getModuleSpecifierPreferences( // all others are shortest } } + filePreferredEnding := getPreferredEnding( prefs, host, @@ -226,6 +228,7 @@ func getModuleSpecifierPreferences( } return ModuleSpecifierPreferences{ + packageJsonAutoImports: prefs.IncludePackageJsonAutoImports, excludeRegexes: excludes, relativePreference: relativePreference, getAllowedEndingsInPreferredOrder: getAllowedEndingsInPreferredOrder, diff --git a/internal/modulespecifiers/specifiers.go b/internal/modulespecifiers/specifiers.go index 1f8e26b040..775db819b2 100644 --- a/internal/modulespecifiers/specifiers.go +++ b/internal/modulespecifiers/specifiers.go @@ -493,7 +493,7 @@ func getLocalModuleSpecifier( } var fromPackageJsonImports string - if !pathsOnly { + if !pathsOnly && preferences.packageJsonAutoImports != IncludePackageJsonAutoImportsOff { fromPackageJsonImports = tryGetModuleNameFromPackageJsonImports( moduleFileName, sourceDirectory, diff --git a/internal/modulespecifiers/types.go b/internal/modulespecifiers/types.go index 6cdfa3e689..91d04366f5 100644 --- a/internal/modulespecifiers/types.go +++ b/internal/modulespecifiers/types.go @@ -85,9 +85,20 @@ const ( ImportModuleSpecifierEndingPreferenceJs ImportModuleSpecifierEndingPreference = "js" ) +type IncludePackageJsonAutoImports string + +const ( + IncludePackageJsonAutoImportsNone IncludePackageJsonAutoImports = "" + IncludePackageJsonAutoImportsAuto IncludePackageJsonAutoImports = "auto" + IncludePackageJsonAutoImportsOn IncludePackageJsonAutoImports = "on" + IncludePackageJsonAutoImportsOff IncludePackageJsonAutoImports = "off" +) + type UserPreferences struct { ImportModuleSpecifierPreference ImportModuleSpecifierPreference ImportModuleSpecifierEnding ImportModuleSpecifierEndingPreference + IncludePackageJsonAutoImports IncludePackageJsonAutoImports + allowRenameOfImportPath core.Tristate AutoImportSpecifierExcludeRegexes []string }