@@ -10,36 +10,41 @@ import (
1010
1111 "github.com/function61/gokit/os/osutil"
1212 "github.com/function61/turbobob/pkg/bobfile"
13+ "github.com/samber/lo"
1314 "github.com/spf13/cobra"
1415)
1516
1617func langserverEntry () * cobra.Command {
1718 lang := ""
19+ langGeneric := ""
1820
1921 cmd := & cobra.Command {
2022 Use : "langserver" ,
2123 Short : "Launch a langserver process. Must be run in project's root dir. Intended to be run by your editor." ,
2224 Args : cobra .NoArgs ,
2325 Run : func (cmd * cobra.Command , _ []string ) {
24- if lang != "" { // explicit requested language (not defined by project)
25- osutil .ExitIfError (langserverRunGeneric (osutil .CancelOnInterruptOrTerminate (nil ), lang ))
26+ if langGeneric != "" { // explicit requested language (not defined by project)
27+ osutil .ExitIfError (langserverRunGeneric (osutil .CancelOnInterruptOrTerminate (nil ), langGeneric ))
2628 return
2729 } else {
2830 // project's defined langserver
2931 osutil .ExitIfError (langserverRunShim (
30- osutil .CancelOnInterruptOrTerminate (nil )))
32+ osutil .CancelOnInterruptOrTerminate (nil ),
33+ lang ))
3134
3235 }
3336 },
3437 }
3538
36- cmd .Flags ().StringVarP (& lang , "lang-generic" , "" , "" , "Generic (= defined outside of project) language server to start" )
39+ cmd .Flags ().StringVarP (& lang , "lang-from-project" , "" , lang , "Language (go / ts / ...) whose language server to start" )
40+ cmd .Flags ().StringVarP (& langGeneric , "lang-generic" , "" , langGeneric , "Generic (= defined outside of project) language server to start" )
3741
3842 return cmd
3943}
4044
41- // automatically detects which project this invocation concerns
42- func langserverRunShim (ctx context.Context ) error {
45+ // automatically detects which project this invocation concerns.
46+ // if `langCodeRequested` empty, accepts first language server that is found from builders.
47+ func langserverRunShim (ctx context.Context , langCodeRequested string ) error {
4348 // access chosen project's details (so we know which langserver to start)
4449 projectFile , err := bobfile .Read ()
4550 if err != nil {
@@ -54,11 +59,13 @@ func langserverRunShim(ctx context.Context) error {
5459 return nil , nil , fmt .Errorf ("loadNonOptionalBaseImageConf: %w" , err )
5560 }
5661
57- if baseImageConf .Langserver == nil {
62+ lsDetails := baseImageConf .Langserver
63+ languageMatches := langCodeRequested == "" || lo .Contains (lsDetails .Languages , langCodeRequested )
64+ if lsDetails == nil || ! languageMatches {
5865 continue
5966 }
6067
61- return baseImageConf . Langserver .Command , & builder , nil
68+ return lsDetails .Command , & builder , nil
6269 }
6370
6471 return nil , nil , fmt .Errorf ("%s doesn't define a compatible language server" , projectFile .ProjectName )
0 commit comments