# Each subclass simply provide the correct name.
private fun property_name: String is abstract
+ # The node identifying the name (id, operator, etc) for messages.
+ #
+ # Is `self` by default
+ private fun property_node: ANode do return self
+
# An array of all arguments (excluding self)
fun raw_arguments: Array[AExpr] do return compute_raw_arguments
redef class ACallExpr
redef fun property_name do return n_id.text
+ redef fun property_node do return n_id
redef fun compute_raw_arguments do return n_args.to_a
end
redef class ACallAssignExpr
redef fun property_name do return n_id.text + "="
+ redef fun property_node do return n_id
redef fun compute_raw_arguments
do
var res = n_args.to_a
do
var recvtype = v.visit_expr(self.n_expr)
var name = self.property_name
+ var node = self.property_node
if recvtype == null then return # Forward error
var for_self = self.n_expr isa ASelfExpr
- var callsite = v.get_method(self, recvtype, name, for_self)
+ var callsite = v.get_method(node, recvtype, name, for_self)
if callsite == null then return
self.callsite = callsite
return
end
- var wcallsite = v.get_method(self, recvtype, name + "=", self.n_expr isa ASelfExpr)
+ var wcallsite = v.get_method(node, recvtype, name + "=", self.n_expr isa ASelfExpr)
if wcallsite == null then return
self.write_callsite = wcallsite
redef class ACallReassignExpr
redef fun property_name do return n_id.text
+ redef fun property_node do return n_id
redef fun compute_raw_arguments do return n_args.to_a
end
redef class AInitExpr
redef fun property_name do return "init"
+ redef fun property_node do return n_kwinit
redef fun compute_raw_arguments do return n_args.to_a
end
end
self.recvtype = recvtype
+ var kind = recvtype.mclass.kind
var name: String
var nid = self.n_id
+ var node: ANode
if nid != null then
name = nid.text
+ node = nid
else
name = "new"
+ node = self.n_kwnew
+ end
+ if name == "intern" then
+ if kind != concrete_kind then
+ v.error(self, "Type Error: Cannot instantiate {kind} {recvtype}.")
+ return
+ end
+ if n_args.n_exprs.not_empty then
+ v.error(n_args, "Type Error: the intern constructor expects no arguments.")
+ return
+ end
+ # Our job is done
+ self.mtype = recvtype
+ return
end
- var callsite = v.get_method(self, recvtype, name, false)
+
+ var callsite = v.get_method(node, recvtype, name, false)
if callsite == null then return
if not callsite.mproperty.is_new then
- var kind = recvtype.mclass.kind
if kind != concrete_kind then
v.error(self, "Type Error: Cannot instantiate {kind} {recvtype}.")
return