Skip to content

Commit cef9f67

Browse files
committed
refactor LS host
1 parent bb7a5b3 commit cef9f67

File tree

8 files changed

+24
-37
lines changed

8 files changed

+24
-37
lines changed

internal/api/api.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ func (api *API) GetSymbolAtPosition(ctx context.Context, projectId Handle[projec
160160
return nil, errors.New("project not found")
161161
}
162162

163-
languageService := ls.NewLanguageService(project, snapshot.Converters(), snapshot.ReadFile, snapshot.FileExists, snapshot.UseCaseSensitiveFileNames())
163+
languageService := ls.NewLanguageService(project.GetProgram(), snapshot)
164164
symbol, err := languageService.GetSymbolAtPosition(ctx, fileName, position)
165165
if err != nil || symbol == nil {
166166
return nil, err
@@ -202,7 +202,7 @@ func (api *API) GetSymbolAtLocation(ctx context.Context, projectId Handle[projec
202202
if node == nil {
203203
return nil, fmt.Errorf("node of kind %s not found at position %d in file %q", kind.String(), pos, sourceFile.FileName())
204204
}
205-
languageService := ls.NewLanguageService(project, snapshot.Converters(), snapshot.ReadFile, snapshot.FileExists, snapshot.UseCaseSensitiveFileNames())
205+
languageService := ls.NewLanguageService(project.GetProgram(), snapshot)
206206
symbol := languageService.GetSymbolAtLocation(ctx, node)
207207
if symbol == nil {
208208
return nil, nil
@@ -232,7 +232,7 @@ func (api *API) GetTypeOfSymbol(ctx context.Context, projectId Handle[project.Pr
232232
if !ok {
233233
return nil, fmt.Errorf("symbol %q not found", symbolHandle)
234234
}
235-
languageService := ls.NewLanguageService(project, snapshot.Converters(), snapshot.ReadFile, snapshot.FileExists, snapshot.UseCaseSensitiveFileNames())
235+
languageService := ls.NewLanguageService(project.GetProgram(), snapshot)
236236
t := languageService.GetTypeOfSymbol(ctx, symbol)
237237
if t == nil {
238238
return nil, nil

internal/ls/autoimports.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -702,7 +702,7 @@ func (l *LanguageService) createPackageJsonImportFilter(fromFile *ast.SourceFile
702702
return nil
703703
}
704704
specifier := modulespecifiers.GetNodeModulesPackageName(
705-
l.host.GetProgram().Options(),
705+
l.program.Options(),
706706
fromFile,
707707
importedFileName,
708708
moduleSpecifierResolutionHost,

internal/ls/host.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
package ls
22

3-
import (
4-
"github.com/microsoft/typescript-go/internal/compiler"
5-
)
6-
73
type Host interface {
8-
GetProgram() *compiler.Program
4+
UseCaseSensitiveFileNames() bool
5+
ReadFile(path string) (contents string, ok bool)
6+
FileExists(path string) bool
7+
Converters() *Converters
98
}

internal/ls/languageservice.go

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,33 +8,26 @@ import (
88
)
99

1010
type LanguageService struct {
11-
host Host
12-
converters *Converters
13-
documentPositionMappers map[string]*sourcemap.DocumentPositionMapper
14-
useCaseSensitiveFileNames bool
15-
readFile func(path string) (contents string, ok bool)
16-
fileExists func(path string) bool
11+
host Host
12+
program *compiler.Program
13+
converters *Converters
14+
documentPositionMappers map[string]*sourcemap.DocumentPositionMapper
1715
}
1816

1917
func NewLanguageService(
18+
program *compiler.Program,
2019
host Host,
21-
converters *Converters,
22-
readFile func(path string) (contents string, ok bool),
23-
fileExists func(path string) bool,
24-
useCaseSensitiveFileNames bool,
2520
) *LanguageService {
2621
return &LanguageService{
27-
host: host,
28-
converters: converters,
29-
readFile: readFile,
30-
fileExists: fileExists,
31-
useCaseSensitiveFileNames: useCaseSensitiveFileNames,
32-
documentPositionMappers: map[string]*sourcemap.DocumentPositionMapper{},
22+
host: host,
23+
program: program,
24+
converters: host.Converters(),
25+
documentPositionMappers: map[string]*sourcemap.DocumentPositionMapper{},
3326
}
3427
}
3528

3629
func (l *LanguageService) GetProgram() *compiler.Program {
37-
return l.host.GetProgram()
30+
return l.program
3831
}
3932

4033
func (l *LanguageService) tryGetProgramAndFile(fileName string) (*compiler.Program, *ast.SourceFile) {
@@ -62,11 +55,11 @@ func (l *LanguageService) GetDocumentPositionMapper(fileName string) *sourcemap.
6255
}
6356

6457
func (l *LanguageService) ReadFile(fileName string) (string, bool) {
65-
return l.readFile(fileName)
58+
return l.host.ReadFile(fileName)
6659
}
6760

6861
func (l *LanguageService) UseCaseSensitiveFileNames() bool {
69-
return l.useCaseSensitiveFileNames
62+
return l.host.UseCaseSensitiveFileNames()
7063
}
7164

7265
func (l *LanguageService) GetLineInfo(fileName string) *sourcemap.LineInfo {

internal/ls/source_map.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ func (s *script) Text() string {
4141
}
4242

4343
func (l *LanguageService) getScript(fileName string) *script {
44-
text, ok := l.readFile(fileName)
44+
text, ok := l.host.ReadFile(fileName)
4545
if !ok {
4646
return nil
4747
}
@@ -54,7 +54,7 @@ func (l *LanguageService) tryGetSourcePosition(
5454
) *sourcemap.DocumentPosition {
5555
newPos := l.tryGetSourcePositionWorker(fileName, position)
5656
if newPos != nil {
57-
if !l.fileExists(newPos.FileName) {
57+
if !l.host.FileExists(newPos.FileName) {
5858
return nil
5959
}
6060
}

internal/project/project.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import (
99
"github.com/microsoft/typescript-go/internal/collections"
1010
"github.com/microsoft/typescript-go/internal/compiler"
1111
"github.com/microsoft/typescript-go/internal/core"
12-
"github.com/microsoft/typescript-go/internal/ls"
1312
"github.com/microsoft/typescript-go/internal/lsp/lsproto"
1413
"github.com/microsoft/typescript-go/internal/project/ata"
1514
"github.com/microsoft/typescript-go/internal/project/logging"
@@ -49,8 +48,6 @@ const (
4948
PendingReloadFull
5049
)
5150

52-
var _ ls.Host = (*Project)(nil)
53-
5451
// Project represents a TypeScript project.
5552
// If changing struct fields, also update the Clone method.
5653
type Project struct {
@@ -195,7 +192,6 @@ func (p *Project) ConfigFilePath() tspath.Path {
195192
return p.configFilePath
196193
}
197194

198-
// GetProgram implements ls.Host.
199195
func (p *Project) GetProgram() *compiler.Program {
200196
return p.Program
201197
}

internal/project/session.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ func (s *Session) GetLanguageService(ctx context.Context, uri lsproto.DocumentUr
367367
if project == nil {
368368
return nil, fmt.Errorf("no project found for URI %s", uri)
369369
}
370-
return ls.NewLanguageService(project, snapshot.Converters(), snapshot.ReadFile, snapshot.FileExists, snapshot.UseCaseSensitiveFileNames()), nil
370+
return ls.NewLanguageService(project.GetProgram(), snapshot), nil
371371
}
372372

373373
func (s *Session) UpdateSnapshot(ctx context.Context, overlays map[tspath.Path]*overlay, change SnapshotChange) *Snapshot {

internal/sourcemap/source_mapper.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -286,8 +286,7 @@ func tryGetSourceMappingURL(host Host, fileName string) string {
286286
return TryGetSourceMappingURL(lineInfo)
287287
}
288288

289-
// Originally: /^data:(?:application\/json;charset=[uU][tT][fF]-8;base64,([A-Za-z0-9+/=]+)$)?/
290-
// Should have been /^data:(?:application\/json;(?:charset=[uU][tT][fF]-8;)?base64,([A-Za-z0-9+/=]+)$)?/
289+
// Equivalent to /^data:(?:application\/json;(?:charset=[uU][tT][fF]-8;)?base64,([A-Za-z0-9+/=]+)$)?/
291290
func tryParseBase64Url(url string) (parseableUrl string, isBase64Url bool) {
292291
var found bool
293292
if url, found = strings.CutPrefix(url, `data:`); !found {

0 commit comments

Comments
 (0)