/
EnumDecl.ooc
72 lines (57 loc) · 2 KB
/
EnumDecl.ooc
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
import structs/HashMap
import ../io/TabbedWriter
import TypeDecl, Declaration, Visitor, Node, VariableAccess, Type, VariableDecl
EnumDecl: class extends TypeDecl {
lastElementValue: Int = 0
elements := HashMap<String, EnumElement> new()
incrementOper: Char = '+'
incrementStep: Int = 1
init: func ~enumDecl(.name, .token) {
super(name, token)
}
addElement: func (element: EnumElement) {
if(isExtern()) {
if(!element isExtern()) {
// Provide a default extern name if none is provided
element setExternName(element getName())
}
} else {
// If no value is provided for a non-extern element,
// calculate it by incrementing the last used value.
if(!element valueSet) {
if(incrementOper == '+') {
lastElementValue += incrementStep
} else if(incrementOper == '*') {
lastElementValue *= incrementStep
}
element setValue(lastElementValue)
} else {
lastElementValue = element getValue()
}
}
element setType(instanceType)
getMeta() addVariable(element)
}
setIncrement: func (=incrementOper, =incrementStep) {}
writeSize: func (w: TabbedWriter, instance: Bool) {
w app("sizeof("). app(isExtern() ? name : "int"). app(")")
}
accept: func (visitor: Visitor) {
visitor visitEnumDecl(this)
}
replace: func (oldie, kiddo: Node) -> Bool { false }
}
EnumElement: class extends VariableDecl {
type: Type
value: Int
valueSet: Bool = false
init: func ~enumElementDecl(.type, .name, .token) {
super(type, name, token)
}
setValue: func (=value) { valueSet = true }
getValue: func -> Int { value }
setType: func (=type) {}
getType: func -> Type { type }
accept: func (visitor: Visitor) {}
replace: func (oldie, kiddo: Node) -> Bool { false }
}