Skip to content

Commit 4288288

Browse files
committed
fix crash
1 parent df42721 commit 4288288

File tree

4 files changed

+71
-20
lines changed

4 files changed

+71
-20
lines changed

internal/ls/lsutil/configuration.go

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@ type UserConfig struct {
1414
// if `userPreferences` is nil, this function will return a config with default userPreferences
1515
func NewUserConfig(userPreferences *UserPreferences) *UserConfig {
1616
return &UserConfig{
17-
js: userPreferences.CopyOrDefault(),
18-
ts: userPreferences.CopyOrDefault(),
17+
js: userPreferences.Copy(),
18+
ts: userPreferences.Copy(),
1919
}
2020
}
2121

2222
func (c *UserConfig) Copy() *UserConfig {
2323
return &UserConfig{
24-
ts: c.ts.CopyOrDefault(),
25-
js: c.js.CopyOrDefault(),
24+
ts: c.ts.Copy(),
25+
js: c.js.Copy(),
2626
}
2727
}
2828

@@ -46,16 +46,26 @@ func (a *UserConfig) Merge(b *UserConfig) *UserConfig {
4646
}
4747

4848
func (c *UserConfig) TS() *UserPreferences {
49-
return c.ts
49+
if c.ts != nil {
50+
return c.ts
51+
} else if c.js != nil {
52+
return c.js
53+
}
54+
return NewDefaultUserPreferences()
5055
}
5156

5257
func (c *UserConfig) JS() *UserPreferences {
53-
return c.js
58+
if c.js != nil {
59+
return c.js
60+
} else if c.ts != nil {
61+
return c.ts
62+
}
63+
return NewDefaultUserPreferences()
5464
}
5565

5666
func (c *UserConfig) GetPreferences(activeFile string) *UserPreferences {
5767
fileEnding := strings.TrimPrefix(tspath.GetAnyExtensionFromPath(activeFile, nil, true), ".")
58-
if tspath.ExtensionIsTs(fileEnding) {
68+
if activeFile == "" || tspath.ExtensionIsTs(fileEnding) {
5969
if c.ts != nil {
6070
return c.ts
6171
} else if c.js != nil {
@@ -72,13 +82,12 @@ func (c *UserConfig) GetPreferences(activeFile string) *UserPreferences {
7282
}
7383

7484
func ParseNewUserConfig(items []any) *UserConfig {
75-
defaultPref := NewUserConfig(nil)
76-
c := NewUserConfig(nil)
85+
defaultPref := NewUserConfig(NewDefaultUserPreferences())
86+
c := &UserConfig{}
7787
for i, item := range items {
7888
if item == nil {
7989
// continue
8090
} else if config, ok := item.(map[string]any); ok {
81-
newConfig := &UserConfig{}
8291
switch i {
8392
case 0:
8493
// if provided, parse and set "js/ts" as base config
@@ -87,13 +96,11 @@ func ParseNewUserConfig(items []any) *UserConfig {
8796
continue
8897
case 1:
8998
// typescript
90-
newConfig.ts = defaultPref.ts.ParseWorker(config)
99+
c.ts = defaultPref.ts.ParseWorker(config)
91100
case 2:
92101
// javascript
93-
newConfig.js = defaultPref.js.ParseWorker(config)
102+
c.js = defaultPref.js.ParseWorker(config)
94103
}
95-
96-
c = c.Merge(newConfig)
97104
} else if item, ok := item.(*UserPreferences); ok {
98105
// case for fourslash -- fourslash sends the entire userPreferences over
99106
// !!! support format and js/ts distinction?

internal/ls/lsutil/userpreferences.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -626,7 +626,7 @@ func parseIntWithDefault(val any, defaultV int) int {
626626

627627
func (p *UserPreferences) Set(name string, value any) bool {
628628
switch strings.ToLower(name) {
629-
case "quotePreference":
629+
case "quotepreference":
630630
p.QuotePreference = parseQuotePreference(value)
631631
case "lazyconfiguredprojectsfromexternalproject":
632632
p.LazyConfiguredProjectsFromExternalProject = parseBoolWithDefault(value, false)

internal/project/session_test.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -904,6 +904,50 @@ func TestSession(t *testing.T) {
904904
assert.Equal(t, len(codeLensRefreshCalls), 1, "expected one RefreshCodeLens call after code lens preference change")
905905
assert.Equal(t, len(inlayHintsRefreshCalls), 1, "expected one RefreshInlayHints call after inlay hints preference change")
906906
})
907+
t.Run("config parsing", func(t *testing.T) {
908+
t.Parallel()
909+
files := map[string]any{
910+
"/src/tsconfig.json": "{}",
911+
"/src/index.ts": "export const x = 1;",
912+
}
913+
session, _ := projecttestutil.Setup(files)
914+
session.DidOpenFile(context.Background(), "file:///src/index.ts", 1, files["/src/index.ts"].(string), lsproto.LanguageKindTypeScript)
915+
_, err := session.GetLanguageService(context.Background(), lsproto.DocumentUri("file:///src/index.ts"))
916+
assert.NilError(t, err)
917+
918+
configMap1 := map[string]any{
919+
"UseAliasesForRename": true,
920+
"QuotePreference": "single",
921+
"OrganizeImportsIgnoreCase": true,
922+
}
923+
// set "typescript" options only
924+
session.Configure(lsutil.ParseNewUserConfig([]any{nil, configMap1, nil}))
925+
actualConfig1 := session.Config()
926+
expectedPrefs1 := lsutil.NewDefaultUserPreferences()
927+
expectedPrefs1.UseAliasesForRename = core.TSTrue
928+
expectedPrefs1.QuotePreference = lsutil.QuotePreferenceSingle
929+
expectedPrefs1.OrganizeImportsIgnoreCase = core.TSTrue
930+
931+
// "javascript" options should default to ts
932+
assert.DeepEqual(t, *actualConfig1.TS(), *expectedPrefs1)
933+
assert.DeepEqual(t, *actualConfig1.JS(), *expectedPrefs1)
934+
935+
configMap2 := map[string]any{
936+
"UseAliasesForRename": false,
937+
"QuotePreference": "double",
938+
"OrganizeImportsIgnoreCase": false,
939+
}
940+
// set "javascript" options only
941+
session.Configure(lsutil.ParseNewUserConfig([]any{nil, nil, configMap2}))
942+
actualConfig2 := session.Config()
943+
expectedPrefs2 := lsutil.NewDefaultUserPreferences()
944+
expectedPrefs2.UseAliasesForRename = core.TSFalse
945+
expectedPrefs2.QuotePreference = lsutil.QuotePreferenceDouble
946+
expectedPrefs2.OrganizeImportsIgnoreCase = core.TSFalse
947+
// "typescript" options should not change
948+
assert.DeepEqual(t, *actualConfig2.TS(), *expectedPrefs1)
949+
assert.DeepEqual(t, *actualConfig2.JS(), *expectedPrefs2)
950+
})
907951
}
908952

909953
func ptrTo[T any](v T) *T {

internal/project/snapshot.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -385,14 +385,14 @@ func (s *Snapshot) Clone(ctx context.Context, change SnapshotChange, overlays ma
385385
for path, overlay := range overlays {
386386
openFiles[path] = overlay.FileName()
387387
}
388-
oldAutoImports := s.AutoImports
389-
if oldAutoImports == nil {
390-
oldAutoImports = autoimport.NewRegistry(s.toPath, s.allUserPreferences.TS())
391-
}
392388
prepareAutoImports := tspath.Path("")
393389
if change.ResourceRequest.AutoImports != "" {
394390
prepareAutoImports = change.ResourceRequest.AutoImports.Path(s.UseCaseSensitiveFileNames())
395391
}
392+
oldAutoImports := s.AutoImports
393+
if oldAutoImports == nil {
394+
oldAutoImports = autoimport.NewRegistry(s.toPath, s.allUserPreferences.GetPreferences(string(prepareAutoImports)))
395+
}
396396
var autoImportsWatch *WatchedFiles[map[tspath.Path]string]
397397
autoImports, err := oldAutoImports.Clone(ctx, autoimport.RegistryChange{
398398
RequestedFile: prepareAutoImports,
@@ -401,7 +401,7 @@ func (s *Snapshot) Clone(ctx context.Context, change SnapshotChange, overlays ma
401401
Created: change.fileChanges.Created,
402402
Deleted: change.fileChanges.Deleted,
403403
RebuiltPrograms: projectsWithNewProgramStructure,
404-
UserPreferences: config.TS(),
404+
UserPreferences: config.GetPreferences(string(prepareAutoImports)),
405405
}, autoImportHost, logger.Fork("UpdateAutoImports"))
406406
if err == nil {
407407
autoImportsWatch = s.autoImportsWatch.Clone(autoImports.NodeModulesDirectories())

0 commit comments

Comments
 (0)