# Is the method abstract
fun is_abstract: Bool is abstract
+
+ # Is the method extern, if yes what is the extern_name
+ fun extern_name: nullable String is abstract
end
# Concrete local classes
redef fun fill_iroutine(v, method)
do
var params = v.iroutine.params
- var ename = "{method.module.name}_{method.local_class.name}_{method.local_class.name}_{method.name}_{method.signature.arity}"
- if n_extern != null then
- ename = n_extern.text
- ename = ename.substring(1, ename.length-2)
- end
+ var ename = method.extern_name.as(not null)
var sig = method.signature
assert params.length == sig.arity + 1
var args = new Array[String]
end
end
+redef class AExternMethPropdef
+ redef fun accept_property_verifier(v)
+ do
+ super # Compute signature
+ var ename: String
+ if n_extern != null then
+ ename = n_extern.text
+ ename = ename.substring(1, ename.length-2)
+ else
+ ename = "{method.module.name}_{method.local_class.name}_{method.local_class.name}_{method.name}_{method.signature.arity}"
+ end
+ method.extern_name = ename
+ end
+end
+
redef class ATypePropdef
redef fun prop do return _prop.as(not null)
var _prop: nullable MMSrcTypeProperty
special MMMethod
redef fun is_intern do return false
redef fun is_abstract do return false
+ redef fun extern_name do return null
end
# Concrete NIT source method for an automatic accesor
redef readable var _is_init: Bool
redef readable var _is_intern: Bool
redef readable var _is_abstract: Bool
+ redef readable writable var _extern_name: nullable String # Will be computed during MMBuilder
redef fun node: nullable AMethPropdef do return module.nodes(self).as(nullable AMethPropdef)
init(name: Symbol, cla: MMLocalClass, n: nullable AMethPropdef)
do
_is_init = node isa AConcreteInitPropdef
_is_intern = node isa AInternMethPropdef
_is_abstract = node isa ADeferredMethPropdef
+ _extern_name = null
end
end