-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathhandle_type.go
107 lines (81 loc) · 2.54 KB
/
handle_type.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
package def
import (
"fmt"
"io"
"sort"
"github.com/antchfx/xmlquery"
"github.com/sirupsen/logrus"
"github.com/tidwall/gjson"
)
type handleType struct {
internalType
}
func (t *handleType) Category() TypeCategory { return CatHandle }
func (t *handleType) Resolve(tr TypeRegistry, vr ValueRegistry) *IncludeSet {
if t.isResolved {
return NewIncludeSet()
}
rval := t.internalType.Resolve(tr, vr)
rval.ResolvedTypes[t.registryName] = t
t.isResolved = true
return rval
}
func (t *handleType) PrintPublicDeclaration(w io.Writer) {
t.internalType.PrintPublicDeclaration(w)
sort.Sort(ByValue(t.values))
if len(t.values) > 0 {
fmt.Fprint(w, "const (\n")
for _, v := range t.values {
v.PrintPublicDeclaration(w)
}
fmt.Fprint(w, ")\n\n")
}
}
func ReadHandleTypesFromXML(doc *xmlquery.Node, tr TypeRegistry, _ ValueRegistry, api string) {
queryString := fmt.Sprintf("//types/type[@category='handle' and (@api='%s' or not(@api))]", api)
for _, node := range xmlquery.Find(doc, queryString) {
newType := NewHandleTypeFromXML(node)
if tr[newType.RegistryName()] != nil {
logrus.WithField("registry name", newType.RegistryName()).Warn("Overwriting handle type in registry")
}
tr[newType.RegistryName()] = newType
}
}
func NewHandleTypeFromXML(node *xmlquery.Node) TypeDefiner {
rval := handleType{}
if alias := node.SelectAttr("alias"); alias != "" {
rval.aliasTypeName = alias
rval.registryName = node.SelectAttr("name")
} else {
rval.registryName = xmlquery.FindOne(node, "name").InnerText()
rval.underlyingTypeName = xmlquery.FindOne(node, "type").InnerText()
}
rval.publicName = RenameIdentifier(rval.registryName)
return &rval
}
func ReadHandleExceptionsFromJSON(exceptions gjson.Result, tr TypeRegistry, vr ValueRegistry) {
exceptions.Get("handle").ForEach(func(key, exVal gjson.Result) bool {
if key.String() == "!comment" {
return true
} // Ignore comments
entry := NewHandleTypeFromJSON(key, exVal)
tr[key.String()] = entry
exVal.Get("constants").ForEach(func(ck, cv gjson.Result) bool {
newVal := enumValue{}
newVal.registryName = ck.String()
newVal.valueString = cv.String()
newVal.underlyingTypeName = key.String()
vr[newVal.RegistryName()] = &newVal
return true
})
return true
})
}
func NewHandleTypeFromJSON(key, json gjson.Result) TypeDefiner {
rval := handleType{}
rval.registryName = key.String()
rval.publicName = json.Get("publicName").String()
rval.underlyingTypeName = json.Get("underlyingType").String()
rval.comment = json.Get("comment").String()
return &rval
}