@@ -106,41 +106,79 @@ rule
106
106
}
107
107
108
108
module_decl:
109
- annotations kMODULE start_new_scope class_name module_type_params module_self_type class_members kEND {
109
+ annotations kMODULE start_new_scope class_name module_type_params colon_module_self_types class_members kEND {
110
110
reset_variable_scope
111
111
112
112
location = val[1 ].location + val[7 ].location
113
113
result = Declarations::Module.new (
114
114
name: val[3 ].value ,
115
115
type_params: val[4 ]&.value || Declarations::ModuleTypeParams.empty ,
116
- self_type : val[5 ],
116
+ self_types : val[5 ],
117
117
members: val[6 ],
118
118
annotations: val[0 ],
119
119
location: location,
120
120
comment: leading_comment (val[0 ].first &.location || location)
121
121
)
122
122
}
123
- | annotations kMODULE start_new_scope tUKEYWORD type class_members kEND {
123
+ | annotations kMODULE start_new_scope tUKEYWORD module_self_types class_members kEND {
124
124
reset_variable_scope
125
125
126
126
location = val[1 ].location + val[6 ].location
127
127
result = Declarations::Module.new (
128
128
name: val[3 ].value ,
129
129
type_params: Declarations::ModuleTypeParams.empty ,
130
- self_type : val[4 ],
130
+ self_types : val[4 ],
131
131
members: val[5 ],
132
132
annotations: val[0 ],
133
133
location: location,
134
134
comment: leading_comment (val[0 ].first &.location || location)
135
135
)
136
136
}
137
137
138
- module_self_type :
139
- { result = nil }
140
- | kCOLON type {
138
+ colon_module_self_types :
139
+ { result = [] }
140
+ | kCOLON module_self_types {
141
141
result = val[1 ]
142
142
}
143
143
144
+ module_self_types:
145
+ module_self_type {
146
+ result = [val[0 ]]
147
+ }
148
+ | module_self_types kCOMMA module_self_type {
149
+ result = val[0 ].push (val[2 ])
150
+ }
151
+
152
+ module_self_type:
153
+ qualified_name kLBRACKET type_list kRBRACKET {
154
+ name = val[0 ].value
155
+ args = val[2 ]
156
+ location = val[0 ].location + val[3 ].location
157
+
158
+ case
159
+ when name.class ?
160
+ result = Declarations::Module::Self.new (name: name, args: args, location: location)
161
+ when name.interface ?
162
+ result = Declarations::Module::Self.new (name: name, args: args, location: location)
163
+ else
164
+ raise SemanticsError.new (" Module self type should be instance or interface" , subject: val[0 ], location: val[0 ].location )
165
+ end
166
+ }
167
+ | qualified_name {
168
+ name = val[0 ].value
169
+ args = []
170
+ location = val[0 ].location
171
+
172
+ case
173
+ when name.class ?
174
+ result = Declarations::Module::Self.new (name: name, args: args, location: location)
175
+ when name.interface ?
176
+ result = Declarations::Module::Self.new (name: name, args: args, location: location)
177
+ else
178
+ raise SemanticsError.new (" Module self type should be instance or interface" , subject: val[0 ], location: val[0 ].location )
179
+ end
180
+ }
181
+
144
182
class_members:
145
183
{ result = [] }
146
184
| class_members class_member {
0 commit comments