# We usualy need specific phases
# NOTE: `frontend` is sufficent in most case (it is often too much)
-import metrics_base
-import mclasses_metrics
-import semantize
+import nitsmell_toolcontext
import mclassdef_collect
-fun call_analyze_methods(mclassdef: MClassDef, model_builder: ModelBuilder): Array[MMethodDef] do
+fun call_analyze_methods(mclassdef: MClassDef, model_builder: ModelBuilder, filter: ModelFilter): Array[MMethodDef] do
var mmethoddefs = new Array[MMethodDef]
- for m_prop in mclassdef.collect_intro_and_redef_mpropdefs(model_builder.model.private_view) do
+ for m_prop in mclassdef.collect_intro_and_redef_mpropdefs(filter) do
var n_prop = model_builder.mpropdef2node(m_prop)
#Check if the property is a method definition
if n_prop isa AMethPropdef and m_prop isa MMethodDef then
end
fun set_analyse_result_methoddef(mmethoddef: MMethodDef, visitor: MethodAnalyzeMetrics): MMethodDef do
- mmethoddef.total_call = visitor.total_call
mmethoddef.line_number = visitor.line_number.length
mmethoddef.total_self_call = visitor.total_self_call
- mmethoddef.total_extern_call = visitor.total_call - visitor.total_self_call
+ mmethoddef.class_call = visitor.class_call
return mmethoddef
end
public class MethodAnalyzeMetrics
super Visitor
var ameth_prop_def: AMethPropdef
- var total_call = 0
var line_number = new Counter[nullable Int]
var total_self_call = 0
+ var class_call = new Counter[MClassType]
redef fun visit(n) do
n.visit_all(self)
end
end
end
-
if n isa ASendExpr then
var callsite = n.callsite
if callsite != null then
- self.total_call += 1
+ var class_site_recv = callsite.recv
+ if class_site_recv isa MClassType then class_call.inc(class_site_recv)
if callsite.recv_is_self then self.total_self_call += 1
end
end
end
redef class MMethodDef
- var total_call = 0
var line_number = 0
var total_self_call = 0
- var total_extern_call = 0
+ var class_call = new Counter[MClassType]
end