github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/cli/lsp.go (about) 1 package cli 2 3 import ( 4 "os" 5 "strings" 6 "time" 7 8 "github.com/spf13/cobra" 9 10 "github.com/tilt-dev/starlark-lsp/pkg/cli" 11 tiltanalytics "github.com/tilt-dev/tilt/internal/analytics" 12 "github.com/tilt-dev/tilt/internal/controllers/core/extension" 13 "github.com/tilt-dev/tilt/internal/controllers/core/extensionrepo" 14 "github.com/tilt-dev/tilt/internal/engine/analytics" 15 "github.com/tilt-dev/tilt/internal/lsp" 16 "github.com/tilt-dev/tilt/internal/tiltfile" 17 "github.com/tilt-dev/tilt/pkg/logger" 18 "github.com/tilt-dev/tilt/pkg/model" 19 ) 20 21 func reportLspInvocation(a *tiltanalytics.TiltAnalytics, cmdParts []string) { 22 a.Incr("cmd."+strings.Join(cmdParts, "."), make(analytics.CmdTags)) 23 a.Flush(time.Second) 24 } 25 26 type cmdLspDeps struct { 27 repo *extensionrepo.Reconciler 28 ext *extension.Reconciler 29 analytics *tiltanalytics.TiltAnalytics 30 } 31 32 func newLspDeps( 33 repo *extensionrepo.Reconciler, 34 ext *extension.Reconciler, 35 analytics *tiltanalytics.TiltAnalytics, 36 ) cmdLspDeps { 37 return cmdLspDeps{ 38 repo: repo, 39 ext: ext, 40 analytics: analytics, 41 } 42 } 43 44 func newLspCmd() *cobra.Command { 45 extFinder := lsp.NewExtensionFinder() 46 rootCmd := cli.NewRootCmd("tilt lsp", tiltfile.ApiStubs, extFinder.ManagerOptions()...) 47 rootCmd.Use = "lsp" 48 origPersistentPreRunE := rootCmd.PersistentPreRunE 49 rootCmd.PersistentPreRunE = func(cmd *cobra.Command, args []string) error { 50 if origPersistentPreRunE != nil { 51 err := origPersistentPreRunE(cmd, args) 52 if err != nil { 53 return err 54 } 55 } else if rootCmd.PersistentPreRun != nil { 56 // cobra will only execute PersistentPreRun if there's no PersistentPreRunE - if the underlying command 57 // defined a PersistentPreRun, we've preempted it by defining a PersistentPreRunE, even though we haven't 58 // replaced it. So, we need to execute it ourselves. 59 rootCmd.PersistentPreRun(cmd, args) 60 } 61 62 l := logger.NewLogger(logLevel(verbose, debug), os.Stdout) 63 ctx := logger.WithLogger(cmd.Context(), l) 64 cmdParts := []string{"lsp"} 65 if cmd.Name() != "lsp" { 66 cmdParts = append(cmdParts, cmd.Name()) 67 } 68 deps, err := wireLsp(ctx, l, model.TiltSubcommand(strings.Join(cmdParts, " "))) 69 if err != nil { 70 return err 71 } 72 73 extFinder.Initialize(ctx, deps.repo, deps.ext) 74 reportLspInvocation(deps.analytics, cmdParts) 75 return nil 76 } 77 return rootCmd.Command 78 }