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  }