syntax: use chained nodes for MMSrcClasses instead of an array
authorJean Privat <jean@pryen.org>
Sun, 26 Jul 2009 01:48:25 +0000 (21:48 -0400)
committerJean Privat <jean@pryen.org>
Mon, 27 Jul 2009 07:36:20 +0000 (03:36 -0400)
Signed-off-by: Jean Privat <jean@pryen.org>

src/nitdoc.nit
src/syntax/mmbuilder.nit
src/syntax/syntax_base.nit

index d76c2c2..31276ed 100644 (file)
@@ -1072,7 +1072,7 @@ redef class MMSrcLocalClass
 
        redef fun doc
        do
-               var n = nodes.first
+               var n = node
                if not n isa AClassdef then
                        return null
                end
index 436bbe1..a1b178a 100644 (file)
@@ -158,16 +158,20 @@ end
 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
@@ -228,7 +232,7 @@ redef class MMSrcLocalClass
                        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
@@ -538,10 +542,13 @@ redef class PClassdef
                        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
index 5d9c0a8..cbca685 100644 (file)
@@ -59,8 +59,8 @@ end
 # 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]
@@ -71,11 +71,7 @@ special MMConcreteClass
        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
@@ -500,6 +496,9 @@ 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