/
enumeration.go
84 lines (68 loc) · 1.92 KB
/
enumeration.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
package generate
import (
"github.com/pekim/jennifer/jen"
)
type Enumeration struct {
Namespace *Namespace
Name string `xml:"name,attr"`
Blacklist bool `xml:"blacklist,attr"`
GoTypeName string `xml:"goname,attr"` // used in addenda files
Version string `xml:"version,attr"`
CType string `xml:"http://www.gtk.org/introspection/c/1.0 type,attr"`
GlibTypeName string `xml:"http://www.gtk.org/introspection/glib/1.0 type-name,attr"`
GlibGetType string `xml:"http://www.gtk.org/introspection/glib/1.0 get-type,attr"`
Doc *Doc `xml:"doc"`
Members Members `xml:"member"`
Functions Functions `xml:"function"`
goTypeName string
}
func (e *Enumeration) init(ns *Namespace) {
e.Namespace = ns
e.goTypeName = e.Name
if e.GoTypeName != "" {
e.goTypeName = e.GoTypeName
}
memberNamePrefix := e.Namespace.CIdentifierPrefixes + "_"
for _, member := range e.Members {
member.init(ns, memberNamePrefix)
}
e.Functions.init(ns, e.Name)
}
func (e *Enumeration) version() string {
return e.Version
}
func (e *Enumeration) mergeAddenda(addenda *Enumeration) {
e.Blacklist = addenda.Blacklist
e.GoTypeName = addenda.GoTypeName
if addenda.CType != "" {
e.CType = addenda.CType
}
if addenda.Version != "" {
e.Version = addenda.Version
}
e.Members.mergeAddenda(addenda.Members)
e.Functions.mergeAddenda(addenda.Functions)
}
func (e *Enumeration) blacklisted() (bool, string) {
return e.Blacklist, e.CType
}
func (e *Enumeration) supported() (supported bool, reason string) {
return true, ""
}
func (e *Enumeration) generate(g *jen.Group, version *Version) {
if !supportedByVersion(e, version) {
return
}
// define the type
g.
Type().
Id(e.goTypeName).
Qual("C", e.CType)
// define members
g.Const().DefsFunc(func(g *jen.Group) {
for _, member := range e.Members {
member.generate(g, e.goTypeName)
}
})
e.Functions.generate(g, version)
}