nitc :: ANodes :: defaultinit
# A sequence of nodes
# It is a specific class (instead of using a Array) to track the parent/child relation when nodes are added or removed
class ANodes[E: ANode]
super Sequence[E]
private var parent: ANode
private var items = new Array[E]
redef fun iterator do return items.iterator
redef fun reverse_iterator do return items.reverse_iterator
redef fun length do return items.length
redef fun is_empty do return items.is_empty
redef fun push(e)
do
hook_add(e)
items.push(e)
end
redef fun pop
do
var res = items.pop
hook_remove(res)
return res
end
redef fun unshift(e)
do
hook_add(e)
items.unshift(e)
end
redef fun shift
do
var res = items.shift
hook_remove(res)
return res
end
redef fun has(e)
do
return items.has(e)
end
redef fun [](index)
do
return items[index]
end
redef fun []=(index, e)
do
hook_remove(self[index])
hook_add(e)
items[index]=e
end
redef fun remove_at(index)
do
hook_remove(items[index])
items.remove_at(index)
end
private fun hook_add(e: E)
do
#assert e.parent == null
e.parent = parent
end
private fun hook_remove(e: E)
do
assert e.parent == parent
e.parent = null
end
# Used in parent constructor to fill elements
private fun unsafe_add_all(nodes: Collection[Object])
do
var parent = self.parent
for n in nodes do
assert n isa E
add n
n.parent = parent
end
end
private fun replace_child(old_child: ANode, new_child: nullable ANode): Bool
do
var parent = self.parent
for i in [0..length[ do
if self[i] == old_child then
if new_child != null then
assert new_child isa E
self[i] = new_child
new_child.parent = parent
else
self.remove_at(i)
end
return true
end
end
return false
end
private fun visit_all(v: Visitor)
do
for n in self do v.enter_visit(n)
end
end
src/parser/parser_nodes.nit:248,1--343,3