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  }