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 }