/
bitmask_value.go
73 lines (57 loc) · 1.6 KB
/
bitmask_value.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
package def
import (
"fmt"
"io"
"github.com/antchfx/xmlquery"
)
type bitmaskValue struct {
genericValue
bitposString string
comment string
}
func (v *bitmaskValue) ValueString() string {
if v.IsAlias() {
return v.resolvedAliasValue.PublicName()
} else if v.bitposString != "" {
return fmt.Sprintf("1 << %s", v.bitposString)
} else {
return v.valueString
}
}
func (v *bitmaskValue) PrintPublicDeclaration(w io.Writer) {
fmt.Fprintf(w, "%s %s = %s\n", v.PublicName(), v.resolvedType.PublicName(), v.ValueString())
}
func (v *bitmaskValue) Resolve(tr TypeRegistry, vr ValueRegistry) *IncludeSet {
if v.isResolved {
return NewIncludeSet()
}
var rval *IncludeSet
if v.IsAlias() {
v.resolvedAliasValue = vr[v.aliasValueName]
rval = v.resolvedAliasValue.Resolve(tr, vr)
v.valueString = RenameIdentifier(v.ValueString())
v.resolvedType = v.resolvedAliasValue.ResolvedType()
rval.MergeWith(v.resolvedType.Resolve(tr, vr))
} else {
v.resolvedType = tr[v.underlyingTypeName]
rval = v.resolvedType.Resolve(tr, vr)
}
rval.IncludeValues[v.registryName] = true
rval.ResolvedValues[v.registryName] = v
v.isResolved = true
return rval
}
func NewBitmaskValueFromXML(forBitmask TypeDefiner, elt *xmlquery.Node) *bitmaskValue {
rval := bitmaskValue{}
alias := elt.SelectAttr("alias")
if alias == "" {
rval.registryName = elt.SelectAttr("name")
rval.valueString = elt.SelectAttr("value")
rval.bitposString = elt.SelectAttr("bitpos")
} else {
rval.registryName = elt.SelectAttr("name")
rval.aliasValueName = alias
}
rval.underlyingTypeName = forBitmask.RegistryName()
return &rval
}