redef class MMSrcLocalClass
redef fun accept_class_visitor(v)
do
- for n in nodes do
+ var n = node
+ while n != null do
v.enter_visit(n)
+ n = n.next_node
end
end
# Accept a class visitor (on class properties)
redef fun accept_properties_visitor(v)
do
- for n in nodes do
+ var n = node
+ while n != null do
v.enter_visit(n)
+ n = n.next_node
end
for p in src_local_properties do
var superclass: nullable MMLocalClass = null # This most specific non-mixin superclass (if any)
if supers.length > 1 then
- v.error(nodes.first, "Error: Explicit constructor required in {self} since multiple inheritance of constructor is forbiden. Conflicting classes are {supers.join(", ")}. Costructors are {super_constructors.join(", ")}.")
+ v.error(node, "Error: Explicit constructor required in {self} since multiple inheritance of constructor is forbiden. Conflicting classes are {supers.join(", ")}. Costructors are {super_constructors.join(", ")}.")
return
else if supers.length == 1 then
superclass = supers.first
local_class = local_classes[name]
if self isa AClassdef then
# If we are not a special implicit class then rant
- v.error(self, "Error: A class {name} is already defined at line {local_class.nodes.first.first_token.location.line_start}.")
+ v.error(self, "Error: A class {name} is already defined at line {local_class.node.location.line_start}.")
return
end
- local_class.nodes.add(self)
+ # Add the new node after the last node
+ var n = local_class.node
+ while n.next_node != null do n = n.next_node
+ n.next_node = self
else
local_class = new MMSrcLocalClass(mod, name, self, arity)
local_classes[name] = local_class
# Concrete NIT source local classes
class MMSrcLocalClass
special MMConcreteClass
- # The related AST nodes
- readable var _nodes: Array[PClassdef]
+ # The first related AST node (if any)
+ readable var _node: nullable PClassdef
# Concrete NIT source generic formal parameter by name
readable var _formal_dict: Map[Symbol, MMTypeFormalParameter] = new HashMap[Symbol, MMTypeFormalParameter]
init(mod: MMSrcModule, n: Symbol, cla: nullable PClassdef, a: Int)
do
super(mod, n, a)
- if cla == null then
- _nodes = new Array[PClassdef]
- else
- _nodes = [cla]
- end
+ _node = cla
_src_local_properties = new HashMap[Symbol, MMLocalProperty]
end
end
redef class PClassdef
# Associated class (MM entity)
fun local_class: MMSrcLocalClass is abstract
+
+ # Next PClassdef of the same class (if any)
+ readable writable var _next_node: nullable PClassdef = null
end
redef class PPropdef