github.com/stackb/rules_proto@v0.0.0-20240221195024-5428336c51f1/pkg/language/protobuf/resolve.go (about) 1 package protobuf 2 3 import ( 4 "log" 5 6 "github.com/bazelbuild/bazel-gazelle/config" 7 "github.com/bazelbuild/bazel-gazelle/label" 8 "github.com/bazelbuild/bazel-gazelle/repo" 9 "github.com/bazelbuild/bazel-gazelle/resolve" 10 "github.com/bazelbuild/bazel-gazelle/rule" 11 12 "github.com/stackb/rules_proto/pkg/protoc" 13 ) 14 15 // Imports returns a list of ImportSpecs that can be used to import the rule r. 16 // This is used to populate RuleIndex. 17 // 18 // If nil is returned, the rule will not be indexed. If any non-nil slice is 19 // returned, including an empty slice, the rule will be indexed. 20 func (pl *protobufLang) Imports(c *config.Config, r *rule.Rule, f *rule.File) []resolve.ImportSpec { 21 from := label.New("", f.Pkg, r.Name()) 22 pkg, ok := pl.packages[from.Pkg] 23 if !ok { 24 // log.Println("protobuf.Imports(): Unknown package", from) 25 return nil 26 } 27 28 provider := pkg.RuleProvider(r) 29 if provider == nil { 30 // log.Printf("Unknown rule provider for %v (rule=%p)", from, r) 31 return nil 32 } 33 34 return provider.Imports(c, r, f) 35 } 36 37 // Embeds returns a list of labels of rules that the given rule embeds. If a 38 // rule is embedded by another importable rule of the same language, only the 39 // embedding rule will be indexed. The embedding rule will inherit the imports 40 // of the embedded rule. Since SkyLark doesn't support embedding this should 41 // always return nil. 42 func (*protobufLang) Embeds(r *rule.Rule, from label.Label) []label.Label { return nil } 43 44 // Resolve translates imported libraries for a given rule into Bazel 45 // dependencies. Information about imported libraries is returned for each rule 46 // generated by language.GenerateRules in language.GenerateResult.Imports. 47 // Resolve generates a "deps" attribute (or the appropriate language-specific 48 // equivalent) for each import according to language-specific rules and 49 // heuristics. 50 func (pl *protobufLang) Resolve( 51 c *config.Config, 52 ix *resolve.RuleIndex, 53 rc *repo.RemoteCache, 54 r *rule.Rule, 55 importsRaw interface{}, 56 from label.Label, 57 ) { 58 if r.Kind() == overrideKindName { 59 resolveOverrideRule(c, from.Pkg, r, protoc.GlobalResolver()) 60 return 61 } 62 63 if pkg, ok := pl.packages[from.Pkg]; ok { 64 provider := pkg.RuleProvider(r) 65 if provider == nil { 66 log.Printf("no known rule provider for %v", from) 67 } 68 if imports, ok := importsRaw.([]string); ok { 69 provider.Resolve(c, ix, r, imports, from) 70 } else { 71 log.Printf("warning: resolve imports: expected []string, got %T", importsRaw) 72 } 73 } else { 74 log.Printf("no known rule package for %v", from.Pkg) 75 } 76 } 77 78 func (*protobufLang) CrossResolve(c *config.Config, ix *resolve.RuleIndex, imp resolve.ImportSpec, lang string) []resolve.FindResult { 79 return protoc.GlobalResolver().CrossResolve(c, ix, imp, lang) 80 }