github.com/stackb/rules_proto@v0.0.0-20240221195024-5428336c51f1/pkg/language/protobuf/kinds.go (about)

     1  package protobuf
     2  
     3  import (
     4  	"log"
     5  	"sort"
     6  
     7  	"github.com/bazelbuild/bazel-gazelle/rule"
     8  
     9  	"github.com/stackb/rules_proto/pkg/protoc"
    10  )
    11  
    12  // Kinds returns a map of maps rule names (kinds) and information on how to
    13  // match and merge attributes that may be found in rules of those kinds. All
    14  // kinds of rules generated for this language may be found here.
    15  func (*protobufLang) Kinds() map[string]rule.KindInfo {
    16  	registry := protoc.Rules()
    17  
    18  	kinds := make(map[string]rule.KindInfo)
    19  	kinds[overrideKindName] = overrideKind
    20  
    21  	for _, name := range registry.RuleNames() {
    22  		rule, err := registry.LookupRule(name)
    23  		if err != nil {
    24  			log.Fatal("Kinds:", err)
    25  		}
    26  		if _, ok := kinds[rule.Name()]; ok {
    27  			log.Fatal("Kinds: duplicate rule name:", rule.Name())
    28  		}
    29  		kinds[rule.Name()] = rule.KindInfo()
    30  	}
    31  
    32  	return kinds
    33  }
    34  
    35  // Loads returns .bzl files and symbols they define. Every rule generated by
    36  // GenerateRules, now or in the past, should be loadable from one of these
    37  // files.
    38  func (pl *protobufLang) Loads() []rule.LoadInfo {
    39  
    40  	// Merge symbols
    41  	symbolsByLoadName := make(map[string][]string)
    42  	for _, name := range pl.rules.RuleNames() {
    43  		rule, err := pl.rules.LookupRule(name)
    44  		if err != nil {
    45  			log.Fatal(err)
    46  		}
    47  		load := rule.LoadInfo()
    48  		if load.Name == "" {
    49  			log.Fatal("Loads: empty load name for rule:", name)
    50  		}
    51  		symbolsByLoadName[load.Name] = append(symbolsByLoadName[load.Name], load.Symbols...)
    52  	}
    53  
    54  	// Ensure names are sorted otherwise order of load statements can be
    55  	// non-deterministic
    56  	keys := make([]string, 0)
    57  	for name := range symbolsByLoadName {
    58  		keys = append(keys, name)
    59  	}
    60  	sort.Strings(keys)
    61  
    62  	// Build final load list
    63  	loads := make([]rule.LoadInfo, 0)
    64  	for _, name := range keys {
    65  		symbols := symbolsByLoadName[name]
    66  		sort.Strings(symbols)
    67  		loads = append(loads, rule.LoadInfo{
    68  			Name:    name,
    69  			Symbols: symbols,
    70  		})
    71  	}
    72  
    73  	return loads
    74  }