...
1
15
16 package main
17
18 import (
19 "github.com/bazelbuild/bazel-gazelle/config"
20 "github.com/bazelbuild/bazel-gazelle/label"
21 "github.com/bazelbuild/bazel-gazelle/repo"
22 "github.com/bazelbuild/bazel-gazelle/resolve"
23 "github.com/bazelbuild/bazel-gazelle/rule"
24 )
25
26
27 type metaResolver struct {
28
29 builtins map[string]resolve.Resolver
30
31
32 mappedKinds map[string][]config.MappedKind
33 }
34
35 func newMetaResolver() *metaResolver {
36 return &metaResolver{
37 builtins: make(map[string]resolve.Resolver),
38 mappedKinds: make(map[string][]config.MappedKind),
39 }
40 }
41
42
43 func (mr *metaResolver) AddBuiltin(kindName string, resolver resolve.Resolver) {
44 mr.builtins[kindName] = resolver
45 }
46
47
48
49 func (mr *metaResolver) MappedKind(pkgRel string, kind config.MappedKind) {
50 mr.mappedKinds[pkgRel] = append(mr.mappedKinds[pkgRel], kind)
51 }
52
53
54
55
56 func (mr *metaResolver) Resolver(r *rule.Rule, pkgRel string) resolve.Resolver {
57 for _, mappedKind := range mr.mappedKinds[pkgRel] {
58 if mappedKind.KindName == r.Kind() {
59 fromKindResolver := mr.builtins[mappedKind.FromKind]
60 if fromKindResolver == nil {
61 return nil
62 }
63 return inverseMapKindResolver{
64 fromKind: mappedKind.FromKind,
65 delegate: fromKindResolver,
66 }
67 }
68 }
69 return mr.builtins[r.Kind()]
70 }
71
72
73
74
75 type inverseMapKindResolver struct {
76 fromKind string
77 delegate resolve.Resolver
78 }
79
80 var _ resolve.Resolver = inverseMapKindResolver{}
81
82 func (imkr inverseMapKindResolver) Name() string {
83 return imkr.delegate.Name()
84 }
85
86 func (imkr inverseMapKindResolver) Imports(c *config.Config, r *rule.Rule, f *rule.File) []resolve.ImportSpec {
87 r = imkr.inverseMapKind(r)
88 return imkr.delegate.Imports(c, r, f)
89 }
90
91 func (imkr inverseMapKindResolver) Embeds(r *rule.Rule, from label.Label) []label.Label {
92 r = imkr.inverseMapKind(r)
93 return imkr.delegate.Embeds(r, from)
94 }
95
96 func (imkr inverseMapKindResolver) Resolve(c *config.Config, ix *resolve.RuleIndex, rc *repo.RemoteCache, r *rule.Rule, imports interface{}, from label.Label) {
97 r = imkr.inverseMapKind(r)
98 imkr.delegate.Resolve(c, ix, rc, r, imports, from)
99 }
100
101 func (imkr inverseMapKindResolver) inverseMapKind(r *rule.Rule) *rule.Rule {
102 rCopy := *r
103 rCopy.SetKind(imkr.fromKind)
104 return &rCopy
105 }
106
View as plain text