github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/lsp/lsp.go (about)

     1  package lsp
     2  
     3  import (
     4  	"context"
     5  
     6  	"go.lsp.dev/uri"
     7  
     8  	"github.com/tilt-dev/starlark-lsp/pkg/document"
     9  
    10  	"github.com/tilt-dev/tilt/internal/controllers/core/extension"
    11  	"github.com/tilt-dev/tilt/internal/controllers/core/extensionrepo"
    12  	"github.com/tilt-dev/tilt/internal/tiltfile/starkit"
    13  	"github.com/tilt-dev/tilt/internal/tiltfile/tiltextension"
    14  	tiltfilev1alpha1 "github.com/tilt-dev/tilt/internal/tiltfile/v1alpha1"
    15  )
    16  
    17  type ExtensionFinder interface {
    18  	ManagerOptions() []document.ManagerOpt
    19  	Initialize(context context.Context, repo *extensionrepo.Reconciler, ext *extension.Reconciler)
    20  }
    21  
    22  func NewExtensionFinder() ExtensionFinder {
    23  	return &extensionFinder{}
    24  }
    25  
    26  type extensionFinder struct {
    27  	plugins     []starkit.Plugin
    28  	interceptor starkit.LoadInterceptor
    29  	ctx         context.Context
    30  }
    31  
    32  var _ ExtensionFinder = &extensionFinder{}
    33  
    34  func (f *extensionFinder) Initialize(ctx context.Context, repo *extensionrepo.Reconciler, ext *extension.Reconciler) {
    35  	f.ctx = ctx
    36  	f.initializePlugins(tiltextension.NewPlugin(repo, ext))
    37  }
    38  
    39  func (f *extensionFinder) initializePlugins(extPlugin *tiltextension.Plugin) {
    40  	f.plugins = []starkit.Plugin{
    41  		extPlugin,
    42  		tiltfilev1alpha1.NewPlugin(),
    43  	}
    44  	f.interceptor = extPlugin
    45  }
    46  
    47  func (f *extensionFinder) ManagerOptions() []document.ManagerOpt {
    48  	return []document.ManagerOpt{
    49  		document.WithReadDocumentFunc(f.readDocument),
    50  		document.WithResolveURIFunc(f.resolveURI),
    51  	}
    52  }
    53  
    54  func (f *extensionFinder) readDocument(u uri.URI) ([]byte, error) {
    55  	path, err := f.extensionPath(string(u))
    56  
    57  	if err != nil {
    58  		return nil, err
    59  	}
    60  
    61  	if path != "" {
    62  		u = uri.File(path)
    63  	}
    64  
    65  	return document.ReadDocument(u)
    66  }
    67  
    68  func (f *extensionFinder) extensionPath(module string) (string, error) {
    69  	model, err := starkit.NewModel(f.plugins...)
    70  	if err != nil {
    71  		return "", err
    72  	}
    73  	thread := starkit.NewThread(f.ctx, model)
    74  	return f.interceptor.LocalPath(thread, module)
    75  }
    76  
    77  func (f *extensionFinder) resolveURI(u uri.URI) (string, error) {
    78  	path, err := f.extensionPath(string(u))
    79  	if err != nil {
    80  		return "", err
    81  	}
    82  	if path != "" {
    83  		return path, nil
    84  	}
    85  	return document.ResolveURI(u)
    86  }