6
6
"fmt"
7
7
"os/exec"
8
8
"path/filepath"
9
+ "strings"
9
10
10
11
"github.com/sourcegraph/jsonrpc2"
11
12
)
@@ -29,6 +30,21 @@ type langHandler struct {
29
30
noLinterName bool
30
31
31
32
rootURI string
33
+ rootDir string
34
+ }
35
+
36
+ func (h * langHandler ) errToDiagnostics (err error ) []Diagnostic {
37
+ var message string
38
+ switch e := err .(type ) {
39
+ case * exec.ExitError :
40
+ message = string (e .Stderr )
41
+ default :
42
+ h .logger .DebugJSON ("golangci-lint-langserver: errToDiagnostics message" , message )
43
+ message = e .Error ()
44
+ }
45
+ return []Diagnostic {
46
+ {Severity : DSError , Message : message },
47
+ }
32
48
}
33
49
34
50
func (h * langHandler ) lint (uri DocumentURI ) ([]Diagnostic , error ) {
@@ -37,18 +53,31 @@ func (h *langHandler) lint(uri DocumentURI) ([]Diagnostic, error) {
37
53
path := uriToPath (string (uri ))
38
54
dir , file := filepath .Split (path )
39
55
56
+ args := make ([]string , 0 , len (h .command ))
57
+ args = append (args , h .command [1 :]... )
58
+ args = append (args , dir )
40
59
//nolint:gosec
41
- cmd := exec .Command (h .command [0 ], h .command [1 :]... )
42
- cmd .Dir = dir
60
+ cmd := exec .Command (h .command [0 ], args ... )
61
+ if strings .HasPrefix (path , h .rootDir ) {
62
+ cmd .Dir = h .rootDir
63
+ file = path [len (h .rootDir )+ 1 :]
64
+ } else {
65
+ cmd .Dir = dir
66
+ }
67
+ h .logger .DebugJSON ("golangci-lint-langserver: golingci-lint cmd" , cmd )
43
68
44
69
b , err := cmd .Output ()
45
70
if err == nil {
46
71
return diagnostics , nil
72
+ } else if len (b ) == 0 {
73
+ // golangci-lint would output critical error to stderr rather than stdout
74
+ // https://github.com/nametake/golangci-lint-langserver/issues/24
75
+ return h .errToDiagnostics (err ), nil
47
76
}
48
77
49
78
var result GolangCILintResult
50
79
if err := json .Unmarshal (b , & result ); err != nil {
51
- return diagnostics , err
80
+ return h . errToDiagnostics ( err ), nil
52
81
}
53
82
54
83
h .logger .DebugJSON ("golangci-lint-langserver: result:" , result )
@@ -141,6 +170,7 @@ func (h *langHandler) handleInitialize(_ context.Context, conn *jsonrpc2.Conn, r
141
170
}
142
171
143
172
h .rootURI = params .RootURI
173
+ h .rootDir = uriToPath (params .RootURI )
144
174
h .conn = conn
145
175
h .command = params .InitializationOptions .Command
146
176
0 commit comments