forked from pharo-project/pharo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
CDTraitCompositionBuilder.class.st
99 lines (77 loc) · 2.58 KB
/
CDTraitCompositionBuilder.class.st
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
"
I am in charge of building a Trait composition.
aTraitCompositionNode is composed of TraitNode.
"
Class {
#name : #CDTraitCompositionBuilder,
#superclass : #Object,
#category : #'ClassParser-Model'
}
{ #category : #building }
CDTraitCompositionBuilder >> buildFrom: aNode [
^ aNode acceptVisitor: self
]
{ #category : #visiting }
CDTraitCompositionBuilder >> visitArrayNode: aRBArrayNode [
| parent argumentName |
self flag: #todo.
"It needs to be refactored. I do not know how it was supposed to be handle properly.
Here is workaround to fix issue with empty #uses section"
parent := aRBArrayNode parent.
parent isMessage ifTrue: [
argumentName := parent keywords at: (parent arguments indexOf: aRBArrayNode).
argumentName = #uses: ifTrue: [
aRBArrayNode statements ifEmpty: [
^CDTraitCompositionSequenceNode new
sequence: #();
originalNode: aRBArrayNode;
yourself].
self error: 'Is not supported yet']].
^aRBArrayNode statements collect: [ :each |
each isLiteralNode
ifTrue: [ each value ]
ifFalse: [ each receiver value -> each arguments first value ] ]
]
{ #category : #visiting }
CDTraitCompositionBuilder >> visitGlobalNode: aRBGlobalNode [
^self visitVariableNode: aRBGlobalNode
]
{ #category : #visiting }
CDTraitCompositionBuilder >> visitGlobalVariableNode: aRBGlobalNode [
^self visitVariableNode: aRBGlobalNode
]
{ #category : #visiting }
CDTraitCompositionBuilder >> visitLiteralNode: aRBLiteralValueNode [
^ aRBLiteralValueNode value
]
{ #category : #visiting }
CDTraitCompositionBuilder >> visitLiteralValueNode: aRBLiteralValueNode [
"Redirect the message by default to #visitLiteralNode: for retrocompatibility (pharo 8)"
^ self visitLiteralNode: aRBLiteralValueNode
]
{ #category : #visiting }
CDTraitCompositionBuilder >> visitLiteralVariableNode: aRBGlobalNode [
^self visitVariableNode: aRBGlobalNode
]
{ #category : #visiting }
CDTraitCompositionBuilder >> visitMessageNode: aRBMessageNode [
| node receiver argument |
aRBMessageNode selector = #classTrait
ifTrue: [
^ CDClassTraitNode new
originalNode: aRBMessageNode;
name: aRBMessageNode receiver name;
yourself ].
receiver := aRBMessageNode receiver acceptVisitor: self.
argument := aRBMessageNode arguments first acceptVisitor: self.
node := receiver perform: aRBMessageNode selector with: argument.
node originalNode: aRBMessageNode.
^ node
]
{ #category : #visiting }
CDTraitCompositionBuilder >> visitVariableNode: aRBVariableNode [
^ CDTraitNode new
originalNode: aRBVariableNode;
name: aRBVariableNode name;
yourself
]