/
naming.go
129 lines (111 loc) · 3.15 KB
/
naming.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package gen
import (
"fmt"
"strings"
"github.com/IGLOU-EU/go-wildcard"
)
type NamingVisitorParams struct {
Target string
TypeName string
MethodName string
}
type NamingAcceptParams struct {
Target string
MethodName string
}
type NamingVisitorImplParams struct {
Target string
FactoryName string
}
type namingRegistry struct {
visitors []NamingVisitorParams
accepts []NamingAcceptParams
visitorImpls []NamingVisitorImplParams
visitorParamsCache map[string]*NamingVisitorParams
visitorTypeCache map[string]string
visitMethodCache map[string]string
acceptMethodCache map[string]string
}
func newNamingRegistry(visitors []NamingVisitorParams, accepts []NamingAcceptParams, visitorImpls []NamingVisitorImplParams) *namingRegistry {
return &namingRegistry{
visitors: visitors,
accepts: accepts,
visitorImpls: visitorImpls,
visitorParamsCache: map[string]*NamingVisitorParams{},
visitorTypeCache: map[string]string{},
visitMethodCache: map[string]string{},
acceptMethodCache: map[string]string{}, // identEnum to accept method name
}
}
func (r *namingRegistry) namingVisitorParams(enumIdent string) (*NamingVisitorParams, bool) {
if params, ok := r.visitorParamsCache[enumIdent]; ok {
return params, params != nil
}
for _, v := range r.visitors {
if wildcard.MatchSimple(v.Target, enumIdent) {
r.visitorParamsCache[enumIdent] = &v
return &v, true
}
}
r.visitorParamsCache[enumIdent] = nil
return nil, false
}
func (r *namingRegistry) visitorTypeName(enumIdent string) string {
if name, ok := r.visitorTypeCache[enumIdent]; ok {
return name
}
pattern := "*Visitor"
if params, ok := r.namingVisitorParams(enumIdent); ok {
pattern = params.TypeName
}
name := strings.Replace(pattern, "*", enumIdent, 1)
r.visitorTypeCache[enumIdent] = name
return name
}
func (r *namingRegistry) visitMethodName(enumIdent, memberName string) string {
key := fmt.Sprintf("%s:%s", enumIdent, memberName)
if name, ok := r.visitMethodCache[key]; ok {
return name
}
pattern := "Visit*"
if params, ok := r.namingVisitorParams(enumIdent); ok {
pattern = params.MethodName
}
name := strings.Replace(pattern, "*", memberName, 1)
r.visitorTypeCache[key] = name
return name
}
func (r *namingRegistry) acceptMethodName(enumIdent string) string {
if name, ok := r.acceptMethodCache[enumIdent]; ok {
return name
}
var namingParams *NamingAcceptParams
for _, a := range r.accepts {
if wildcard.MatchSimple(a.Target, enumIdent) {
namingParams = &a
break
}
}
if namingParams == nil {
r.acceptMethodCache[enumIdent] = "Accept"
return "Accept"
}
name := strings.Replace(namingParams.MethodName, "*", enumIdent, 1)
r.acceptMethodCache[enumIdent] = name
return name
}
func (r *namingRegistry) visitorImplFactoryName(enumIdent string) (string, bool) {
var namingParams *NamingVisitorImplParams
for _, f := range r.visitorImpls {
if wildcard.MatchSimple(f.Target, enumIdent) {
namingParams = &f
break
}
}
if namingParams == nil {
return "", false
}
visitorTypeName := r.visitorTypeName(enumIdent)
name := strings.Replace(namingParams.FactoryName, "*", visitorTypeName, 1)
return name, true
}