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 }