redef fun process_nmodule(nmodule)
do
for nclassdef in nmodule.n_classdefs do
+ if nclassdef.all_defs == null then continue # skip non principal classdef
toolcontext.modelbuilder.build_properties(nclassdef)
end
end
build_properties(mclassdef2nclassdef[superclassdef])
end
- for npropdef in nclassdef.n_propdefs do
- npropdef.build_property(self, nclassdef)
- end
- for npropdef in nclassdef.n_propdefs do
- npropdef.build_signature(self)
- end
- for npropdef in nclassdef.n_propdefs do
- npropdef.check_signature(self)
+ for nclassdef2 in nclassdef.all_defs do
+ for npropdef in nclassdef2.n_propdefs do
+ npropdef.build_property(self, mclassdef)
+ end
+ for npropdef in nclassdef2.n_propdefs do
+ npropdef.build_signature(self)
+ end
+ for npropdef in nclassdef2.n_propdefs do
+ npropdef.check_signature(self)
+ end
end
process_default_constructors(nclassdef)
end
# The free init (implicitely constructed by the class if required)
var mfree_init: nullable MMethodDef = null
+end
+redef class MClassDef
# What is the `APropdef` associated to a `MProperty`?
# Used to check multiple definition of a property.
var mprop2npropdef: Map[MProperty, APropdef] = new HashMap[MProperty, APropdef]
# The associated propdef once build by a `ModelBuilder`
var mpropdef: nullable MPROPDEF writable
- private fun build_property(modelbuilder: ModelBuilder, nclassdef: AClassdef) is abstract
+ private fun build_property(modelbuilder: ModelBuilder, mclassdef: MClassDef) is abstract
private fun build_signature(modelbuilder: ModelBuilder) is abstract
private fun check_signature(modelbuilder: ModelBuilder) is abstract
private fun new_property_visibility(modelbuilder: ModelBuilder, mclassdef: MClassDef, nvisibility: nullable AVisibility): MVisibility
end
end
- private fun check_redef_keyword(modelbuilder: ModelBuilder, nclassdef: AClassdef, kwredef: nullable Token, need_redef: Bool, mprop: MProperty): Bool
+ private fun check_redef_keyword(modelbuilder: ModelBuilder, mclassdef: MClassDef, kwredef: nullable Token, need_redef: Bool, mprop: MProperty): Bool
do
- if nclassdef.mprop2npropdef.has_key(mprop) then
- modelbuilder.error(self, "Error: A property {mprop} is already defined in class {nclassdef.mclassdef.mclass} at line {nclassdef.mprop2npropdef[mprop].location.line_start}.")
+ if mclassdef.mprop2npropdef.has_key(mprop) then
+ modelbuilder.error(self, "Error: A property {mprop} is already defined in class {mclassdef.mclass} at line {mclassdef.mprop2npropdef[mprop].location.line_start}.")
return false
end
- if mprop isa MMethod and mprop.is_toplevel != (nclassdef isa ATopClassdef) then
+ if mprop isa MMethod and mprop.is_toplevel != (parent isa ATopClassdef) then
if mprop.is_toplevel then
modelbuilder.error(self, "Error: {mprop} is a top level method.")
else
end
if kwredef == null then
if need_redef then
- modelbuilder.error(self, "Redef error: {nclassdef.mclassdef.mclass}::{mprop.name} is an inherited property. To redefine it, add the redef keyword.")
+ modelbuilder.error(self, "Redef error: {mclassdef.mclass}::{mprop.name} is an inherited property. To redefine it, add the redef keyword.")
return false
end
else
if not need_redef then
- modelbuilder.error(self, "Error: No property {nclassdef.mclassdef.mclass}::{mprop.name} is inherited. Remove the redef keyword to define a new property.")
+ modelbuilder.error(self, "Error: No property {mclassdef.mclass}::{mprop.name} is inherited. Remove the redef keyword to define a new property.")
return false
end
end
redef class AMethPropdef
redef type MPROPDEF: MMethodDef
- redef fun build_property(modelbuilder, nclassdef)
+ redef fun build_property(modelbuilder, mclassdef)
do
var n_kwinit = n_kwinit
var n_kwnew = n_kwnew
var is_init = n_kwinit != null or n_kwnew != null
- var mclassdef = nclassdef.mclassdef.as(not null)
var name: String
var amethodid = self.n_methid
var name_node: ANode
mprop = new MMethod(mclassdef, name, mvisibility)
mprop.is_init = is_init
mprop.is_new = n_kwnew != null
- if nclassdef isa ATopClassdef then mprop.is_toplevel = true
- if not self.check_redef_keyword(modelbuilder, nclassdef, n_kwredef, false, mprop) then return
+ if parent isa ATopClassdef then mprop.is_toplevel = true
+ if not self.check_redef_keyword(modelbuilder, mclassdef, n_kwredef, false, mprop) then return
else
- if not self.check_redef_keyword(modelbuilder, nclassdef, n_kwredef, not self isa AMainMethPropdef, mprop) then return
+ if not self.check_redef_keyword(modelbuilder, mclassdef, n_kwredef, not self isa AMainMethPropdef, mprop) then return
check_redef_property_visibility(modelbuilder, self.n_visibility, mprop)
end
- nclassdef.mprop2npropdef[mprop] = self
+ mclassdef.mprop2npropdef[mprop] = self
var mpropdef = new MMethodDef(mclassdef, mprop, self.location)
var mreadpropdef: nullable MMethodDef writable
# The associated setter (write accessor) if any
var mwritepropdef: nullable MMethodDef writable
- redef fun build_property(modelbuilder, nclassdef)
+ redef fun build_property(modelbuilder, mclassdef)
do
- var mclassdef = nclassdef.mclassdef.as(not null)
var mclass = mclassdef.mclass
var name: String
if mprop == null then
var mvisibility = new_property_visibility(modelbuilder, mclassdef, self.n_visibility)
mprop = new MAttribute(mclassdef, name, mvisibility)
- if not self.check_redef_keyword(modelbuilder, nclassdef, self.n_kwredef, false, mprop) then return
+ if not self.check_redef_keyword(modelbuilder, mclassdef, self.n_kwredef, false, mprop) then return
else
assert mprop isa MAttribute
check_redef_property_visibility(modelbuilder, self.n_visibility, mprop)
- if not self.check_redef_keyword(modelbuilder, nclassdef, self.n_kwredef, true, mprop) then return
+ if not self.check_redef_keyword(modelbuilder, mclassdef, self.n_kwredef, true, mprop) then return
end
- nclassdef.mprop2npropdef[mprop] = self
+ mclassdef.mprop2npropdef[mprop] = self
var mpropdef = new MAttributeDef(mclassdef, mprop, self.location)
self.mpropdef = mpropdef
if mreadprop == null then
var mvisibility = new_property_visibility(modelbuilder, mclassdef, nreadable.n_visibility)
mreadprop = new MMethod(mclassdef, readname, mvisibility)
- if not self.check_redef_keyword(modelbuilder, nclassdef, nreadable.n_kwredef, false, mreadprop) then return
+ if not self.check_redef_keyword(modelbuilder, mclassdef, nreadable.n_kwredef, false, mreadprop) then return
else
- if not self.check_redef_keyword(modelbuilder, nclassdef, nreadable.n_kwredef, true, mreadprop) then return
+ if not self.check_redef_keyword(modelbuilder, mclassdef, nreadable.n_kwredef, true, mreadprop) then return
check_redef_property_visibility(modelbuilder, nreadable.n_visibility, mreadprop)
end
- nclassdef.mprop2npropdef[mreadprop] = self
+ mclassdef.mprop2npropdef[mreadprop] = self
var mreadpropdef = new MMethodDef(mclassdef, mreadprop, self.location)
self.mreadpropdef = mreadpropdef
if mwriteprop == null then
var mvisibility = new_property_visibility(modelbuilder, mclassdef, nwritable.n_visibility)
mwriteprop = new MMethod(mclassdef, writename, mvisibility)
- if not self.check_redef_keyword(modelbuilder, nclassdef, nwritable.n_kwredef, false, mwriteprop) then return
+ if not self.check_redef_keyword(modelbuilder, mclassdef, nwritable.n_kwredef, false, mwriteprop) then return
else
- if not self.check_redef_keyword(modelbuilder, nclassdef, nwritable.n_kwredef, true, mwriteprop) then return
+ if not self.check_redef_keyword(modelbuilder, mclassdef, nwritable.n_kwredef, true, mwriteprop) then return
check_redef_property_visibility(modelbuilder, nwritable.n_visibility, mwriteprop)
end
- nclassdef.mprop2npropdef[mwriteprop] = self
+ mclassdef.mprop2npropdef[mwriteprop] = self
var mwritepropdef = new MMethodDef(mclassdef, mwriteprop, self.location)
self.mwritepropdef = mwritepropdef
if mreadprop == null then
var mvisibility = new_property_visibility(modelbuilder, mclassdef, self.n_visibility)
mreadprop = new MMethod(mclassdef, readname, mvisibility)
- if not self.check_redef_keyword(modelbuilder, nclassdef, n_kwredef, false, mreadprop) then return
+ if not self.check_redef_keyword(modelbuilder, mclassdef, n_kwredef, false, mreadprop) then return
else
- if not self.check_redef_keyword(modelbuilder, nclassdef, n_kwredef, true, mreadprop) then return
+ if not self.check_redef_keyword(modelbuilder, mclassdef, n_kwredef, true, mreadprop) then return
check_redef_property_visibility(modelbuilder, self.n_visibility, mreadprop)
end
- nclassdef.mprop2npropdef[mreadprop] = self
+ mclassdef.mprop2npropdef[mreadprop] = self
var mreadpropdef = new MMethodDef(mclassdef, mreadprop, self.location)
self.mreadpropdef = mreadpropdef
mvisibility = private_visibility
end
mwriteprop = new MMethod(mclassdef, writename, mvisibility)
- if not self.check_redef_keyword(modelbuilder, nclassdef, nwkwredef, false, mwriteprop) then return
+ if not self.check_redef_keyword(modelbuilder, mclassdef, nwkwredef, false, mwriteprop) then return
else
- if not self.check_redef_keyword(modelbuilder, nclassdef, nwkwredef, true, mwriteprop) then return
+ if not self.check_redef_keyword(modelbuilder, mclassdef, nwkwredef, true, mwriteprop) then return
if nwritable != null then
check_redef_property_visibility(modelbuilder, nwritable.n_visibility, mwriteprop)
end
end
- nclassdef.mprop2npropdef[mwriteprop] = self
+ mclassdef.mprop2npropdef[mwriteprop] = self
var mwritepropdef = new MMethodDef(mclassdef, mwriteprop, self.location)
self.mwritepropdef = mwritepropdef
redef class ATypePropdef
redef type MPROPDEF: MVirtualTypeDef
- redef fun build_property(modelbuilder, nclassdef)
+ redef fun build_property(modelbuilder, mclassdef)
do
- var mclassdef = nclassdef.mclassdef.as(not null)
var name = self.n_id.text
var mprop = modelbuilder.try_get_mproperty_by_name(self.n_id, mclassdef, name)
if mprop == null then
modelbuilder.warning(n_id, "Warning: lowercase in the virtual type {name}")
break
end
- if not self.check_redef_keyword(modelbuilder, nclassdef, self.n_kwredef, false, mprop) then return
+ if not self.check_redef_keyword(modelbuilder, mclassdef, self.n_kwredef, false, mprop) then return
else
- if not self.check_redef_keyword(modelbuilder, nclassdef, self.n_kwredef, true, mprop) then return
+ if not self.check_redef_keyword(modelbuilder, mclassdef, self.n_kwredef, true, mprop) then return
assert mprop isa MVirtualTypeProp
check_redef_property_visibility(modelbuilder, self.n_visibility, mprop)
end
- nclassdef.mprop2npropdef[mprop] = self
+ mclassdef.mprop2npropdef[mprop] = self
var mpropdef = new MVirtualTypeDef(mclassdef, mprop, self.location)
self.mpropdef = mpropdef
std: 0.0
sum: 7
mnbr: number of refinement in module
- avg: 3.0
- max: base_simple3 (3)
- min: base_simple3 (3)
+ avg: 0.0
+ max: base_simple3 (0)
+ min: base_simple3 (0)
std: 0.0
- sum: 3
+ sum: 0
mnbcc: number of concrete class in module (intro + redef)
avg: 4.0
max: base_simple3 (4)
std: 0.0
sum: 0
mnbic: number of interface in module (intro + redef)
- avg: 4.0
- max: base_simple3 (4)
- min: base_simple3 (4)
+ avg: 1.0
+ max: base_simple3 (1)
+ min: base_simple3 (1)
std: 0.0
- sum: 4
+ sum: 1
## project base_empty_module
`- group base_empty_module
std: 3.0
sum: 8
mnbr: number of refinement in module
- avg: 1.0
- max: base_simple3 (3)
- min: base_empty_module (0)
- std: 1.581
- sum: 3
+ avg: 0.0
+ max: base_simple3 (0)
+ min: base_simple3 (0)
+ std: 0.0
+ sum: 0
mnbcc: number of concrete class in module (intro + redef)
avg: 2.0
max: base_simple3 (4)
std: 0.0
sum: 0
mnbic: number of interface in module (intro + redef)
- avg: 2.0
- max: base_simple3 (4)
+ avg: 0.0
+ max: base_simple3 (1)
min: base_empty_module (0)
- std: 2.0
- sum: 4
+ std: 0.707
+ sum: 1
# MClasses metrics
<=0: sub-population=1 (33.33%); cumulated value=0 (0.0%)
<=1: sub-population=2 (66.66%); cumulated value=2 (100.00%)
## Classdef hierarchy
-Number of nodes: 11
-Number of edges: 47 (4.27 per node)
-Number of direct edges: 9 (0.81 per node)
+Number of nodes: 8
+Number of edges: 14 (1.75 per node)
+Number of direct edges: 6 (0.75 per node)
Distribution of greaters
- population: 11
+ population: 8
minimum value: 1
- maximum value: 5
- total value: 47
- average value: 4.27
+ maximum value: 2
+ total value: 14
+ average value: 1.75
distribution:
- <=1: sub-population=1 (9.09%); cumulated value=1 (2.12%)
- <=4: sub-population=4 (36.36%); cumulated value=16 (34.04%)
- <=8: sub-population=6 (54.54%); cumulated value=30 (63.82%)
+ <=1: sub-population=2 (25.00%); cumulated value=2 (14.28%)
+ <=2: sub-population=6 (75.00%); cumulated value=12 (85.71%)
Distribution of direct greaters
- population: 11
+ population: 8
minimum value: 0
- maximum value: 3
- total value: 9
- average value: 0.81
+ maximum value: 1
+ total value: 6
+ average value: 0.75
distribution:
- <=0: sub-population=4 (36.36%); cumulated value=0 (0.0%)
- <=1: sub-population=6 (54.54%); cumulated value=6 (66.66%)
- <=4: sub-population=1 (9.09%); cumulated value=3 (33.33%)
+ <=0: sub-population=2 (25.00%); cumulated value=0 (0.0%)
+ <=1: sub-population=6 (75.00%); cumulated value=6 (100.00%)
Distribution of smallers
- population: 11
+ population: 8
minimum value: 1
- maximum value: 10
- total value: 47
- average value: 4.27
+ maximum value: 7
+ total value: 14
+ average value: 1.75
distribution:
- <=1: sub-population=7 (63.63%); cumulated value=7 (14.89%)
- <=16: sub-population=4 (36.36%); cumulated value=40 (85.10%)
+ <=1: sub-population=7 (87.50%); cumulated value=7 (50.00%)
+ <=8: sub-population=1 (12.50%); cumulated value=7 (50.00%)
Distribution of direct smallers
- population: 11
+ population: 8
minimum value: 0
maximum value: 6
- total value: 9
- average value: 0.81
+ total value: 6
+ average value: 0.75
distribution:
- <=0: sub-population=7 (63.63%); cumulated value=0 (0.0%)
- <=1: sub-population=3 (27.27%); cumulated value=3 (33.33%)
- <=8: sub-population=1 (9.09%); cumulated value=6 (66.66%)
+ <=0: sub-population=7 (87.50%); cumulated value=0 (0.0%)
+ <=8: sub-population=1 (12.50%); cumulated value=6 (100.00%)
## Class hierarchy
Number of nodes: 8
Number of edges: 14 (1.75 per node)
Number of enum kind: 2 (25.00%)
Number of class kind: 5 (62.50%)
-Number of class definitions: 11
-Number of refined classes: 1 (12.50%)
-Average number of class refinments by classes: 0.37
-Average number of class refinments by refined classes: 3.00
+Number of class definitions: 8
+Number of refined classes: 0 (0.0%)
+Average number of class refinments by classes: 0.0
+Average number of class refinments by refined classes: na
Number of properties: 20
Number of MAttribute: 3 (15.00%)
Total number of implicit self: 4 (80.00%)
--- Construction of tables ---
Number of runtime classes: 7 (excluding interfaces and abstract classes)
-Average number of composing class definition by runtime class: 4.42
+Average number of composing class definition by runtime class: 1.85
Total size of tables (classes and instances): 35 (not including stuff like info for subtyping or call-next-method)
Average size of table by runtime class: 5.00
Values never redefined: 35 (100.00%)
blooming mclasses (threshold: 2.388)
B: 3.0
C: 3.0
+generating out/nitmetrics_args1.write/project_hierarchy.dot
+generating out/nitmetrics_args1.write/module_hierarchy.dot
# Nullable metrics
base_simple3#Object#bar: 1 (4.54%)
base_simple3#Object#foo: 1 (4.54%)
base_simple3#C#init: 1 (4.54%)
-generating out/nitmetrics_args1.write/project_hierarchy.dot
-generating out/nitmetrics_args1.write/module_hierarchy.dot
class_hierarchy.dot
classdef_hierarchy.dot
inheritance/