Skip to content

Commit cc5efbe

Browse files
committed
Add support of specifying language id in -server and -dial flags
Fixes #37
1 parent 7c528a8 commit cc5efbe

File tree

1 file changed

+39
-13
lines changed

1 file changed

+39
-13
lines changed

internal/lsp/acmelsp/config/config.go

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -253,8 +253,14 @@ func (cfg *Config) ParseFlags(flags Flags, f *flag.FlagSet, arguments []string)
253253
f.BoolVar(&cfg.HideDiagnostics, "hidediag", false, "hide diagnostics sent by LSP server")
254254
f.BoolVar(&cfg.RPCTrace, "rpc.trace", false, "print the full rpc trace in lsp inspector format")
255255
f.StringVar(&workspaces, "workspaces", "", "colon-separated list of initial workspace directories")
256-
f.Var(&userServers, "server", `language server command for filename match (e.g. '\.go$:gopls')`)
257-
f.Var(&dialServers, "dial", `language server address for filename match (e.g. '\.go$:localhost:4389')`)
256+
f.Var(&userServers, "server", `map filename to language server command. The format is
257+
'handlers:cmd' where cmd is the LSP server command and handlers is
258+
a comma separated list of 'regexp[@lang]'. The regexp matches the
259+
filename and lang is a language identifier. (e.g. '\.go$:gopls' or
260+
'go.mod$@go.mod,go.sum$@go.sum,\.go$@go:gopls')`)
261+
f.Var(&dialServers, "dial", `map filename to language server address. The format is
262+
'handlers:host:port'. See -server flag for format of
263+
handlers. (e.g. '\.go$:localhost:4389')`)
258264
}
259265
if err := f.Parse(arguments); err != nil {
260266
return err
@@ -273,20 +279,20 @@ func (cfg *Config) ParseFlags(flags Flags, f *flag.FlagSet, arguments []string)
273279
cfg.Servers[key] = &Server{
274280
Command: strings.Fields(sa.args),
275281
}
276-
handlers = append(handlers, FilenameHandler{
277-
Pattern: sa.pattern,
278-
ServerKey: key,
279-
})
282+
for _, h := range sa.handlers {
283+
h.ServerKey = key
284+
handlers = append(handlers, h)
285+
}
280286
}
281287
for i, sa := range dialServers {
282288
key := fmt.Sprintf("_userDialServer%v", i)
283289
cfg.Servers[key] = &Server{
284290
Address: sa.args,
285291
}
286-
handlers = append(handlers, FilenameHandler{
287-
Pattern: sa.pattern,
288-
ServerKey: key,
289-
})
292+
for _, h := range sa.handlers {
293+
h.ServerKey = key
294+
handlers = append(handlers, h)
295+
}
290296
}
291297
// Prepend to give higher priority to command line flags.
292298
cfg.FilenameHandlers = append(handlers, cfg.FilenameHandlers...)
@@ -295,7 +301,8 @@ func (cfg *Config) ParseFlags(flags Flags, f *flag.FlagSet, arguments []string)
295301
}
296302

297303
type serverArgs struct {
298-
pattern, args string
304+
handlers []FilenameHandler
305+
args string
299306
}
300307

301308
type serverFlag []serverArgs
@@ -309,12 +316,31 @@ func (sf *serverFlag) Set(val string) error {
309316
if len(f) != 2 {
310317
return errors.New("flag value must contain a colon")
311318
}
319+
// allow f[0] to be empty, as that's a valid regexp that matches anything
312320
if len(f[1]) == 0 {
313321
return errors.New("empty server command or addresss")
314322
}
323+
pairs := strings.Split(f[0], ",")
324+
args := f[1]
325+
326+
var handlers []FilenameHandler
327+
for _, pp := range pairs {
328+
f := strings.SplitN(pp, "@", 2)
329+
if len(f) != 2 {
330+
handlers = append(handlers, FilenameHandler{
331+
Pattern: pp,
332+
LanguageID: "",
333+
})
334+
} else {
335+
handlers = append(handlers, FilenameHandler{
336+
Pattern: f[0],
337+
LanguageID: f[1],
338+
})
339+
}
340+
}
315341
*sf = append(*sf, serverArgs{
316-
pattern: f[0],
317-
args: f[1],
342+
handlers: handlers,
343+
args: args,
318344
})
319345
return nil
320346
}

0 commit comments

Comments
 (0)