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
# Concrete NIT class specialization relation
class MMSrcAncestor
special MMAncestor
- # The related AST node
- readable var _node: ASuperclass
redef readable var _local_class: MMLocalClass
- init(n: ASuperclass, c: MMLocalClass)
+ init(c: MMLocalClass)
do
- _node = n
_local_class = c
end
end
# Information about a signature currently build
private class SignatureBuilder
# Current visited parameter types
- readable writable var _params: Array[PParam] = new Array[PParam]
+ readable writable var _params: Array[AParam] = new Array[AParam]
# Visited parameters without type information added
- readable writable var _untyped_params: Array[PParam] = new Array[PParam]
+ readable writable var _untyped_params: Array[AParam] = new Array[AParam]
# Position of the current star parameter
readable writable var _vararg_rank: Int = -1
###############################################################################
-redef class PNode
+redef class ANode
private fun accept_class_builder(v: ClassBuilderVisitor) do accept_abs_syntax_visitor(v)
private fun accept_class_specialization_builder(v: ClassSpecializationBuilderVisitor) do accept_abs_syntax_visitor(v)
private fun accept_class_ancestor_builder(v: ClassAncestorBuilder) do accept_abs_syntax_visitor(v)
# Import super-modules
var module_names_to_import = new Array[Symbol]
var module_visibility = new HashMap[Symbol, Int]
- var no_import: nullable PImport = null
+ var no_import: nullable AImport = null
for i in n_imports do
var n = i.module_name
if n != null then
end
if no_import != null then
if not module_names_to_import.is_empty then
- tc.error("{no_import.locate}: Error: Top modules cannot import other modules.")
+ tc.error(no_import.location, "Error: Top modules cannot import other modules.")
end
else if module_names_to_import.is_empty then
var stdname = once "standard".to_symbol
end
end
-redef class PImport
+redef class AImport
# Imported module name (or null)
fun module_name: nullable Symbol is abstract
# Visibility level (intrude/public/private)
fun visibility_level: Int is abstract
end
-redef class AImport
+redef class AStdImport
redef fun module_name
do
return n_id.to_symbol
end
end
-redef class PVisibility
+redef class AVisibility
# Visibility level
fun level: Int is abstract
end
end
-redef class PClassdef
+redef class AClassdef
redef fun local_class: MMSrcLocalClass do return _local_class.as(not null)
var _local_class: nullable MMSrcLocalClass
var local_classes = mod.src_local_classes
if (local_classes.has_key(name)) then
local_class = local_classes[name]
- if self isa AClassdef then
+ if self isa AStdClassdef 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
end
end
-redef class PClasskind
+redef class AClasskind
fun is_interface: Bool do return false
fun is_universal: Bool do return false
fun is_abstract: Bool do return false
redef fun is_abstract do return true
end
-redef class AClassdef
+redef class AStdClassdef
redef fun name
do
return n_id.to_symbol
end
end
-class MMSrcTypeFormalParameter
-special MMTypeFormalParameter
- # The associated node
- readable var _node: AFormaldef
-
- init(name: Symbol, pos: Int, local_class: MMLocalClass, n: AFormaldef)
- do
- super(name, pos, local_class)
- _node = n
- end
-end
-
redef class AFormaldef
# The associated formal generic parameter (MM entity)
- var _formal: nullable MMSrcTypeFormalParameter
+ var _formal: nullable MMTypeFormalParameter
redef fun accept_class_builder(v)
do
var name = n_id.to_symbol
- var formal_type = new MMSrcTypeFormalParameter(name, v.local_class_arity, v.local_class, self)
+ var formal_type = new MMTypeFormalParameter(name, v.local_class_arity, v.local_class)
_formal = formal_type
v.local_class_arity = v.local_class_arity + 1
v.local_class.register_formal(formal_type)
super
var c = n_type.get_local_class(v)
if c == null then return
- var ancestor = new MMSrcAncestor(self, c)
+ var ancestor = new MMSrcAncestor(c)
_ancestor = ancestor
v.local_class.add_direct_parent(ancestor)
end
end
end
-redef class PPropdef
+redef class APropdef
# Process and check properties of the property.
# * Distinguish inits and methods
# * Inherit or check visibility.
if s == null then
if v.signature_builder.params.length != isig.arity then
- #prop.node.printl("v.params.length {v.params.length} != isig.arity {isig.arity} ; {prop.full_name} vs {ip.full_name}")
return
end
for p in v.signature_builder.params do
# FIXME: Add the 'unary' keyword
if n_methid.name == (once "-".to_symbol) then
var ns = n_signature
- if ns isa ASignature and ns.n_params.length == 0 then
+ if ns != null and ns.n_params.length == 0 then
name = once "unary -".to_symbol
end
end
end
end
-redef class PMethid
+redef class AMethid
# Method name
readable var _name: nullable Symbol
end
end
-redef class PSignature
- # Check that visibilities of types in the signature are compatible with the visibility of the property.
- fun check_visibility(v: AbsSyntaxVisitor, p: MMLocalProperty) is abstract
-end
-
redef class ASignature
redef fun accept_property_verifier(v)
do
end
end
- redef fun check_visibility(v, p)
+ # Check that visibilities of types in the signature are compatible with the visibility of the property.
+ fun check_visibility(v: AbsSyntaxVisitor, p: MMLocalProperty)
do
if p.global.visibility_level >= 3 then return
for n in n_params do
end
end
-redef class PParam
+redef class AParam
redef readable var _position: Int = 0
redef fun variable: ParamVariable do return _variable.as(not null)
end
end
- fun is_vararg: Bool is abstract
-end
-
-redef class AParam
- redef fun is_vararg do return n_dotdotdot != null
+ fun is_vararg: Bool do return n_dotdotdot != null
end
redef class AClosureDecl
end
end
-redef class PType
- # Check that visibilities of types in the signature are compatible with the visibility of the property.
- private fun check_visibility(v: AbsSyntaxVisitor, p: MMLocalProperty) is abstract
-end
-
redef class AType
- redef fun check_visibility(v, p)
+ # Check that visibilities of types in the signature are compatible with the visibility of the property.
+ private fun check_visibility(v: AbsSyntaxVisitor, p: MMLocalProperty)
do
if p.global.visibility_level >= 3 then return
var t = get_stype(v)
end
end
-redef class PExpr
+redef class AExpr
redef fun accept_class_builder(v) do end
redef fun accept_property_builder(v) do end
redef fun accept_property_verifier(v) do end