nitc :: MMethod :: create_facet
See define_contract_facet
for more information about two types of facets.
called
: is the property to call in this facet.
# Method to create a facet of the method.
# See `define_contract_facet` for more information about two types of facets.
#
# `called` : is the property to call in this facet.
private fun create_facet(v: ContractsVisitor, classdef: MClassDef, facet: MFacet, called: MMethod): AMethPropdef
is
expect( called.is_same_instance(self) or called.is_same_instance(self.mcontract_facet) )
do
# Defines the contract facet is an init or not
# it is necessary to use the contracts with in a constructor
facet.is_init = is_init
var n_contractdef = v.toolcontext.modelbuilder.create_method_from_property(facet, classdef, false, self.intro.msignature)
# FIXME set the location because the callsite creation need the node location
n_contractdef.location = v.current_location
n_contractdef.validate
var block = v.ast_builder.make_block
# Arguments to call the `called` property
var args: Array[AExpr]
args = n_contractdef.n_signature.make_parameter_read(v.ast_builder)
var callsite = v.ast_builder.create_callsite(v.toolcontext.modelbuilder, n_contractdef, called, true)
var n_call = v.ast_builder.make_call(new ASelfExpr, callsite, args)
if self.intro.msignature.return_mtype == null then
block.add(n_call)
else
block.add(v.ast_builder.make_return(n_call))
end
n_contractdef.n_block = block
n_contractdef.do_all(v.toolcontext)
return n_contractdef
end
src/contracts.nit:622,2--656,4