Skip to content

Commit 00a23a0

Browse files
committed
Return errors instead of panics to make the code more idiomatic
1 parent d508afb commit 00a23a0

File tree

5 files changed

+45
-19
lines changed

5 files changed

+45
-19
lines changed

internal/ls/definition.go

+10-5
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,22 @@
11
package ls
22

33
import (
4+
"fmt"
45
"github.com/microsoft/typescript-go/internal/ast"
56
"github.com/microsoft/typescript-go/internal/astnav"
67
"github.com/microsoft/typescript-go/internal/core"
78
"github.com/microsoft/typescript-go/internal/scanner"
89
)
910

10-
func (l *LanguageService) ProvideDefinitions(fileName string, position int) []Location {
11-
program, file := l.getProgramAndFile(fileName)
11+
func (l *LanguageService) ProvideDefinitions(fileName string, position int) ([]Location, error) {
12+
program, file, err := l.getProgramAndFile(fileName)
13+
if err != nil {
14+
return nil, fmt.Errorf("failed to get program and file: %w", err)
15+
}
16+
1217
node := astnav.GetTouchingPropertyName(file, position)
1318
if node.Kind == ast.KindSourceFile {
14-
return nil
19+
return nil, nil
1520
}
1621

1722
checker := program.GetTypeChecker()
@@ -33,7 +38,7 @@ func (l *LanguageService) ProvideDefinitions(fileName string, position int) []Lo
3338
Range: core.NewTextRange(pos, loc.End()),
3439
})
3540
}
36-
return locations
41+
return locations, nil
3742
}
38-
return nil
43+
return nil, nil
3944
}

internal/ls/diagnostics.go

+7-3
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
package ls
22

33
import (
4+
"fmt"
45
"slices"
56

67
"github.com/microsoft/typescript-go/internal/ast"
78
)
89

9-
func (l *LanguageService) GetDocumentDiagnostics(fileName string) []*ast.Diagnostic {
10-
program, file := l.getProgramAndFile(fileName)
10+
func (l *LanguageService) GetDocumentDiagnostics(fileName string) ([]*ast.Diagnostic, error) {
11+
program, file, err := l.getProgramAndFile(fileName)
12+
if err != nil {
13+
return nil, fmt.Errorf("failed to get program and file for diagnostics: %w", err)
14+
}
1115
syntaxDiagnostics := program.GetSyntacticDiagnostics(file)
1216
semanticDiagnostics := program.GetSemanticDiagnostics(file)
13-
return slices.Concat(syntaxDiagnostics, semanticDiagnostics)
17+
return slices.Concat(syntaxDiagnostics, semanticDiagnostics), nil
1418
}

internal/ls/hover.go

+9-5
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,27 @@
11
package ls
22

33
import (
4+
"fmt"
45
"github.com/microsoft/typescript-go/internal/ast"
56
"github.com/microsoft/typescript-go/internal/astnav"
67
)
78

8-
func (l *LanguageService) ProvideHover(fileName string, position int) string {
9-
program, file := l.getProgramAndFile(fileName)
9+
func (l *LanguageService) ProvideHover(fileName string, position int) (string, error) {
10+
program, file, err := l.getProgramAndFile(fileName)
11+
if err != nil {
12+
return "", fmt.Errorf("failed to get program and file for hover: %w", err)
13+
}
1014
node := astnav.GetTouchingPropertyName(file, position)
1115
if node.Kind == ast.KindSourceFile {
1216
// Avoid giving quickInfo for the sourceFile as a whole.
13-
return ""
17+
return "", nil
1418
}
1519

1620
checker := program.GetTypeChecker()
1721
if symbol := checker.GetSymbolAtLocation(node); symbol != nil {
1822
if t := checker.GetTypeOfSymbolAtLocation(symbol, node); t != nil {
19-
return checker.TypeToString(t)
23+
return checker.TypeToString(t), nil
2024
}
2125
}
22-
return ""
26+
return "", nil
2327
}

internal/ls/languageservice.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package ls
22

33
import (
4+
"fmt"
45
"github.com/microsoft/typescript-go/internal/ast"
56
"github.com/microsoft/typescript-go/internal/compiler"
67
"github.com/microsoft/typescript-go/internal/core"
@@ -55,11 +56,11 @@ func (l *LanguageService) GetProgram() *compiler.Program {
5556
return l.host.GetProgram()
5657
}
5758

58-
func (l *LanguageService) getProgramAndFile(fileName string) (*compiler.Program, *ast.SourceFile) {
59+
func (l *LanguageService) getProgramAndFile(fileName string) (*compiler.Program, *ast.SourceFile, error) {
5960
program := l.GetProgram()
6061
file := program.GetSourceFile(fileName)
6162
if file == nil {
62-
panic("file not found")
63+
return nil, nil, fmt.Errorf("file not found")
6364
}
64-
return program, file
65+
return program, file, nil
6566
}

internal/lsp/server.go

+15-3
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,11 @@ func (s *Server) handleDidClose(req *lsproto.RequestMessage) error {
303303
func (s *Server) handleDocumentDiagnostic(req *lsproto.RequestMessage) error {
304304
params := req.Params.(*lsproto.DocumentDiagnosticParams)
305305
file, project := s.getFileAndProject(params.TextDocument.Uri)
306-
diagnostics := project.LanguageService().GetDocumentDiagnostics(file.FileName())
306+
diagnostics, err := project.LanguageService().GetDocumentDiagnostics(file.FileName())
307+
if err != nil {
308+
return s.sendError(req.ID, err)
309+
}
310+
307311
lspDiagnostics := make([]lsproto.Diagnostic, len(diagnostics))
308312
for i, diag := range diagnostics {
309313
if lspDiagnostic, err := s.converters.toLspDiagnostic(diag); err != nil {
@@ -330,7 +334,11 @@ func (s *Server) handleHover(req *lsproto.RequestMessage) error {
330334
return s.sendError(req.ID, err)
331335
}
332336

333-
hoverText := project.LanguageService().ProvideHover(file.FileName(), pos)
337+
hoverText, err := project.LanguageService().ProvideHover(file.FileName(), pos)
338+
if err != nil {
339+
return s.sendError(req.ID, err)
340+
}
341+
334342
return s.sendResult(req.ID, &lsproto.Hover{
335343
Contents: lsproto.MarkupContentOrMarkedStringOrMarkedStrings{
336344
MarkupContent: &lsproto.MarkupContent{
@@ -349,7 +357,11 @@ func (s *Server) handleDefinition(req *lsproto.RequestMessage) error {
349357
return s.sendError(req.ID, err)
350358
}
351359

352-
locations := project.LanguageService().ProvideDefinitions(file.FileName(), pos)
360+
locations, err := project.LanguageService().ProvideDefinitions(file.FileName(), pos)
361+
if err != nil {
362+
return s.sendError(req.ID, err)
363+
}
364+
353365
lspLocations := make([]lsproto.Location, len(locations))
354366
for i, loc := range locations {
355367
if lspLocation, err := s.converters.toLspLocation(loc); err != nil {

0 commit comments

Comments
 (0)