update c_src
[nit.git] / c_src / model.sep.1.c
index 8c9b1da..ba7a41d 100644 (file)
@@ -6,7 +6,7 @@ val* var1 /* : Array[MClass] */;
 var1 = self->attrs[COLOR_model__Model___mclasses].val; /* _mclasses on <self:Model> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclasses");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 36);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 34);
 show_backtrace(1);
 }
 var = var1;
@@ -22,7 +22,7 @@ val* var3 /* : Array[MClass] */;
 var3 = self->attrs[COLOR_model__Model___mclasses].val; /* _mclasses on <self:Object(Model)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclasses");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 36);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 34);
 show_backtrace(1);
 }
 var1 = var3;
@@ -39,7 +39,7 @@ val* var1 /* : Array[MProperty] */;
 var1 = self->attrs[COLOR_model__Model___mproperties].val; /* _mproperties on <self:Model> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mproperties");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 39);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 37);
 show_backtrace(1);
 }
 var = var1;
@@ -55,7 +55,7 @@ val* var3 /* : Array[MProperty] */;
 var3 = self->attrs[COLOR_model__Model___mproperties].val; /* _mproperties on <self:Object(Model)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mproperties");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 39);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 37);
 show_backtrace(1);
 }
 var1 = var3;
@@ -72,7 +72,7 @@ val* var1 /* : POSet[MClassDef] */;
 var1 = self->attrs[COLOR_model__Model___mclassdef_hierarchy].val; /* _mclassdef_hierarchy on <self:Model> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclassdef_hierarchy");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 42);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 40);
 show_backtrace(1);
 }
 var = var1;
@@ -88,7 +88,7 @@ val* var3 /* : POSet[MClassDef] */;
 var3 = self->attrs[COLOR_model__Model___mclassdef_hierarchy].val; /* _mclassdef_hierarchy on <self:Object(Model)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclassdef_hierarchy");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 42);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 40);
 show_backtrace(1);
 }
 var1 = var3;
@@ -105,7 +105,7 @@ val* var1 /* : POSet[MClassType] */;
 var1 = self->attrs[COLOR_model__Model___intro_mtype_specialization_hierarchy].val; /* _intro_mtype_specialization_hierarchy on <self:Model> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _intro_mtype_specialization_hierarchy");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 48);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 46);
 show_backtrace(1);
 }
 var = var1;
@@ -121,7 +121,7 @@ val* var3 /* : POSet[MClassType] */;
 var3 = self->attrs[COLOR_model__Model___intro_mtype_specialization_hierarchy].val; /* _intro_mtype_specialization_hierarchy on <self:Object(Model)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _intro_mtype_specialization_hierarchy");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 48);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 46);
 show_backtrace(1);
 }
 var1 = var3;
@@ -138,7 +138,7 @@ val* var1 /* : POSet[MClassType] */;
 var1 = self->attrs[COLOR_model__Model___full_mtype_specialization_hierarchy].val; /* _full_mtype_specialization_hierarchy on <self:Model> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _full_mtype_specialization_hierarchy");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 59);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 57);
 show_backtrace(1);
 }
 var = var1;
@@ -154,7 +154,7 @@ val* var3 /* : POSet[MClassType] */;
 var3 = self->attrs[COLOR_model__Model___full_mtype_specialization_hierarchy].val; /* _full_mtype_specialization_hierarchy on <self:Object(Model)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _full_mtype_specialization_hierarchy");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 59);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 57);
 show_backtrace(1);
 }
 var1 = var3;
@@ -171,7 +171,7 @@ val* var1 /* : MultiHashMap[String, MClass] */;
 var1 = self->attrs[COLOR_model__Model___mclasses_by_name].val; /* _mclasses_by_name on <self:Model> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclasses_by_name");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 68);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 66);
 show_backtrace(1);
 }
 var = var1;
@@ -187,7 +187,7 @@ val* var3 /* : MultiHashMap[String, MClass] */;
 var3 = self->attrs[COLOR_model__Model___mclasses_by_name].val; /* _mclasses_by_name on <self:Object(Model)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclasses_by_name");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 68);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 66);
 show_backtrace(1);
 }
 var1 = var3;
@@ -214,7 +214,7 @@ var_name = p0;
 var3 = self->attrs[COLOR_model__Model___mclasses_by_name].val; /* _mclasses_by_name on <self:Model> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclasses_by_name");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 68);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 66);
 show_backtrace(1);
 }
 var1 = var3;
@@ -230,7 +230,7 @@ if (var4){
 var7 = self->attrs[COLOR_model__Model___mclasses_by_name].val; /* _mclasses_by_name on <self:Model> */
 if (unlikely(var7 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclasses_by_name");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 68);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 66);
 show_backtrace(1);
 }
 var5 = var7;
@@ -266,7 +266,7 @@ val* var1 /* : MultiHashMap[String, MProperty] */;
 var1 = self->attrs[COLOR_model__Model___mproperties_by_name].val; /* _mproperties_by_name on <self:Model> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mproperties_by_name");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 86);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 84);
 show_backtrace(1);
 }
 var = var1;
@@ -282,7 +282,7 @@ val* var3 /* : MultiHashMap[String, MProperty] */;
 var3 = self->attrs[COLOR_model__Model___mproperties_by_name].val; /* _mproperties_by_name on <self:Object(Model)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mproperties_by_name");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 86);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 84);
 show_backtrace(1);
 }
 var1 = var3;
@@ -310,7 +310,7 @@ var_name = p0;
 var3 = self->attrs[COLOR_model__Model___mproperties_by_name].val; /* _mproperties_by_name on <self:Model> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mproperties_by_name");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 86);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 84);
 show_backtrace(1);
 }
 var1 = var3;
@@ -331,7 +331,7 @@ goto RET_LABEL;
 var9 = self->attrs[COLOR_model__Model___mproperties_by_name].val; /* _mproperties_by_name on <self:Model> */
 if (unlikely(var9 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mproperties_by_name");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 86);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 84);
 show_backtrace(1);
 }
 var7 = var9;
@@ -363,7 +363,7 @@ val* var1 /* : MNullType */;
 var1 = self->attrs[COLOR_model__Model___null_type].val; /* _null_type on <self:Model> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _null_type");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 104);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 102);
 show_backtrace(1);
 }
 var = var1;
@@ -379,7 +379,7 @@ val* var3 /* : MNullType */;
 var3 = self->attrs[COLOR_model__Model___null_type].val; /* _null_type on <self:Object(Model)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _null_type");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 104);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 102);
 show_backtrace(1);
 }
 var1 = var3;
@@ -396,7 +396,7 @@ val* var1 /* : Array[MClass] */;
 var1 = self->attrs[COLOR_model__MModule___intro_mclasses].val; /* _intro_mclasses on <self:MModule> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _intro_mclasses");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 138);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 136);
 show_backtrace(1);
 }
 var = var1;
@@ -412,7 +412,7 @@ val* var3 /* : Array[MClass] */;
 var3 = self->attrs[COLOR_model__MModule___intro_mclasses].val; /* _intro_mclasses on <self:Object(MModule)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _intro_mclasses");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 138);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 136);
 show_backtrace(1);
 }
 var1 = var3;
@@ -429,7 +429,7 @@ val* var1 /* : Array[MClassDef] */;
 var1 = self->attrs[COLOR_model__MModule___mclassdefs].val; /* _mclassdefs on <self:MModule> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclassdefs");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 141);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 139);
 show_backtrace(1);
 }
 var = var1;
@@ -445,7 +445,7 @@ val* var3 /* : Array[MClassDef] */;
 var3 = self->attrs[COLOR_model__MModule___mclassdefs].val; /* _mclassdefs on <self:Object(MModule)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclassdefs");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 141);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 139);
 show_backtrace(1);
 }
 var1 = var3;
@@ -469,31 +469,37 @@ short int var8 /* : Bool */;
 short int var9 /* : Bool */;
 short int var10 /* : Bool */;
 val* var11 /* : POSet[MClass] */;
-val* var13 /* : POSetElement[MModule] */;
-val* var15 /* : POSetElement[MModule] */;
-val* var16 /* : Collection[Object] */;
-val* var17 /* : Iterator[nullable Object] */;
+val* var12 /* : POSetElement[MModule] */;
+val* var14 /* : POSetElement[MModule] */;
+val* var15 /* : Collection[Object] */;
+val* var_ /* var : Collection[MModule] */;
+val* var16 /* : Iterator[nullable Object] */;
+val* var_17 /* var : Iterator[MModule] */;
 short int var18 /* : Bool */;
 val* var19 /* : nullable Object */;
 val* var_m /* var m: MModule */;
 val* var20 /* : Array[MClassDef] */;
 val* var22 /* : Array[MClassDef] */;
-val* var23 /* : ArrayIterator[nullable Object] */;
-short int var24 /* : Bool */;
-val* var25 /* : nullable Object */;
+val* var_23 /* var : Array[MClassDef] */;
+val* var24 /* : ArrayIterator[nullable Object] */;
+val* var_25 /* var : ArrayIterator[MClassDef] */;
+short int var26 /* : Bool */;
+val* var27 /* : nullable Object */;
 val* var_cd /* var cd: MClassDef */;
-val* var26 /* : MClass */;
 val* var28 /* : MClass */;
+val* var30 /* : MClass */;
 val* var_c /* var c: MClass */;
-val* var29 /* : POSetElement[Object] */;
-val* var30 /* : Array[MClassType] */;
+val* var31 /* : POSetElement[Object] */;
 val* var32 /* : Array[MClassType] */;
-val* var33 /* : ArrayIterator[nullable Object] */;
-short int var34 /* : Bool */;
-val* var35 /* : nullable Object */;
+val* var34 /* : Array[MClassType] */;
+val* var_35 /* var : Array[MClassType] */;
+val* var36 /* : ArrayIterator[nullable Object] */;
+val* var_37 /* var : ArrayIterator[MClassType] */;
+short int var38 /* : Bool */;
+val* var39 /* : nullable Object */;
 val* var_s /* var s: MClassType */;
-val* var36 /* : MClass */;
-val* var38 /* : MClass */;
+val* var40 /* : MClass */;
+val* var42 /* : MClass */;
 {
 { /* Inline model#MModule#flatten_mclass_hierarchy_cache (self) on <self:MModule> */
 var3 = self->attrs[COLOR_model__MModule___flatten_mclass_hierarchy_cache].val; /* _flatten_mclass_hierarchy_cache on <self:MModule> */
@@ -529,36 +535,36 @@ goto RET_LABEL;
 }
 var11 = NEW_poset__POSet(&type_poset__POSetmodel__MClass);
 {
-{ /* Inline poset#POSet#init (var11) on <var11:POSet[MClass]> */
-RET_LABEL12:(void)0;
-}
+((void (*)(val*))(var11->class->vft[COLOR_kernel__Object__init]))(var11) /* init on <var11:POSet[MClass]>*/;
 }
 var_res = var11;
 {
 { /* Inline mmodule#MModule#in_importation (self) on <self:MModule> */
-var15 = self->attrs[COLOR_mmodule__MModule___in_importation].val; /* _in_importation on <self:MModule> */
-if (unlikely(var15 == NULL)) {
+var14 = self->attrs[COLOR_mmodule__MModule___in_importation].val; /* _in_importation on <self:MModule> */
+if (unlikely(var14 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _in_importation");
-PRINT_ERROR(" (%s:%d)\n", "src/model/mmodule.nit", 101);
+PRINT_ERROR(" (%s:%d)\n", "model/mmodule.nit", 93);
 show_backtrace(1);
 }
-var13 = var15;
-RET_LABEL14:(void)0;
+var12 = var14;
+RET_LABEL13:(void)0;
 }
 }
 {
-var16 = poset__POSetElement__greaters(var13);
+var15 = poset__POSetElement__greaters(var12);
 }
+var_ = var15;
 {
-var17 = ((val* (*)(val*))(var16->class->vft[COLOR_abstract_collection__Collection__iterator]))(var16) /* iterator on <var16:Collection[Object](Collection[MModule])>*/;
+var16 = ((val* (*)(val*))(var_->class->vft[COLOR_abstract_collection__Collection__iterator]))(var_) /* iterator on <var_:Collection[MModule]>*/;
 }
+var_17 = var16;
 for(;;) {
 {
-var18 = ((short int (*)(val*))(var17->class->vft[COLOR_abstract_collection__Iterator__is_ok]))(var17) /* is_ok on <var17:Iterator[nullable Object]>*/;
+var18 = ((short int (*)(val*))(var_17->class->vft[COLOR_abstract_collection__Iterator__is_ok]))(var_17) /* is_ok on <var_17:Iterator[MModule]>*/;
 }
-if(!var18) break;
+if (var18){
 {
-var19 = ((val* (*)(val*))(var17->class->vft[COLOR_abstract_collection__Iterator__item]))(var17) /* item on <var17:Iterator[nullable Object]>*/;
+var19 = ((val* (*)(val*))(var_17->class->vft[COLOR_abstract_collection__Iterator__item]))(var_17) /* item on <var_17:Iterator[MModule]>*/;
 }
 var_m = var19;
 {
@@ -566,103 +572,127 @@ var_m = var19;
 var22 = var_m->attrs[COLOR_model__MModule___mclassdefs].val; /* _mclassdefs on <var_m:MModule> */
 if (unlikely(var22 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclassdefs");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 141);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 139);
 show_backtrace(1);
 }
 var20 = var22;
 RET_LABEL21:(void)0;
 }
 }
+var_23 = var20;
 {
-var23 = array__AbstractArrayRead__iterator(var20);
+var24 = array__AbstractArrayRead__iterator(var_23);
 }
+var_25 = var24;
 for(;;) {
 {
-var24 = array__ArrayIterator__is_ok(var23);
+var26 = array__ArrayIterator__is_ok(var_25);
 }
-if(!var24) break;
+if (var26){
 {
-var25 = array__ArrayIterator__item(var23);
+var27 = array__ArrayIterator__item(var_25);
 }
-var_cd = var25;
+var_cd = var27;
 {
 { /* Inline model#MClassDef#mclass (var_cd) on <var_cd:MClassDef> */
-var28 = var_cd->attrs[COLOR_model__MClassDef___mclass].val; /* _mclass on <var_cd:MClassDef> */
-if (unlikely(var28 == NULL)) {
+var30 = var_cd->attrs[COLOR_model__MClassDef___mclass].val; /* _mclass on <var_cd:MClassDef> */
+if (unlikely(var30 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 474);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 492);
 show_backtrace(1);
 }
-var26 = var28;
-RET_LABEL27:(void)0;
+var28 = var30;
+RET_LABEL29:(void)0;
 }
 }
-var_c = var26;
+var_c = var28;
 {
-var29 = poset__POSet__add_node(var_res, var_c);
+var31 = poset__POSet__add_node(var_res, var_c);
 }
-var29;
 {
 { /* Inline model#MClassDef#supertypes (var_cd) on <var_cd:MClassDef> */
-var32 = var_cd->attrs[COLOR_model__MClassDef___supertypes].val; /* _supertypes on <var_cd:MClassDef> */
-if (unlikely(var32 == NULL)) {
+var34 = var_cd->attrs[COLOR_model__MClassDef___supertypes].val; /* _supertypes on <var_cd:MClassDef> */
+if (unlikely(var34 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _supertypes");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 517);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 534);
 show_backtrace(1);
 }
-var30 = var32;
-RET_LABEL31:(void)0;
+var32 = var34;
+RET_LABEL33:(void)0;
 }
 }
+var_35 = var32;
 {
-var33 = array__AbstractArrayRead__iterator(var30);
+var36 = array__AbstractArrayRead__iterator(var_35);
 }
+var_37 = var36;
 for(;;) {
 {
-var34 = array__ArrayIterator__is_ok(var33);
+var38 = array__ArrayIterator__is_ok(var_37);
 }
-if(!var34) break;
+if (var38){
 {
-var35 = array__ArrayIterator__item(var33);
+var39 = array__ArrayIterator__item(var_37);
 }
-var_s = var35;
+var_s = var39;
 {
 { /* Inline model#MClassType#mclass (var_s) on <var_s:MClassType> */
-var38 = var_s->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <var_s:MClassType> */
-if (unlikely(var38 == NULL)) {
+var42 = var_s->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <var_s:MClassType> */
+if (unlikely(var42 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 969);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 986);
 show_backtrace(1);
 }
-var36 = var38;
-RET_LABEL37:(void)0;
+var40 = var42;
+RET_LABEL41:(void)0;
 }
 }
 {
-poset__POSet__add_edge(var_res, var_c, var36); /* Direct call poset#POSet#add_edge on <var_res:nullable POSet[MClass](POSet[MClass])>*/
+poset__POSet__add_edge(var_res, var_c, var40); /* Direct call poset#POSet#add_edge on <var_res:nullable POSet[MClass](POSet[MClass])>*/
 }
-CONTINUE_label: (void)0;
 {
-array__ArrayIterator__next(var33); /* Direct call array#ArrayIterator#next on <var33:ArrayIterator[nullable Object]>*/
+array__ArrayIterator__next(var_37); /* Direct call array#ArrayIterator#next on <var_37:ArrayIterator[MClassType]>*/
+}
+} else {
+goto BREAK_label;
 }
 }
 BREAK_label: (void)0;
-CONTINUE_label39: (void)0;
 {
-array__ArrayIterator__next(var23); /* Direct call array#ArrayIterator#next on <var23:ArrayIterator[nullable Object]>*/
+{ /* Inline abstract_collection#Iterator#finish (var_37) on <var_37:ArrayIterator[MClassType]> */
+RET_LABEL43:(void)0;
+}
+}
+{
+array__ArrayIterator__next(var_25); /* Direct call array#ArrayIterator#next on <var_25:ArrayIterator[MClassDef]>*/
+}
+} else {
+goto BREAK_label44;
+}
+}
+BREAK_label44: (void)0;
+{
+{ /* Inline abstract_collection#Iterator#finish (var_25) on <var_25:ArrayIterator[MClassDef]> */
+RET_LABEL45:(void)0;
+}
+}
+{
+((void (*)(val*))(var_17->class->vft[COLOR_abstract_collection__Iterator__next]))(var_17) /* next on <var_17:Iterator[MModule]>*/;
+}
+} else {
+goto BREAK_label46;
 }
 }
-BREAK_label39: (void)0;
-CONTINUE_label40: (void)0;
+BREAK_label46: (void)0;
 {
-((void (*)(val*))(var17->class->vft[COLOR_abstract_collection__Iterator__next]))(var17) /* next on <var17:Iterator[nullable Object]>*/;
+{ /* Inline abstract_collection#Iterator#finish (var_17) on <var_17:Iterator[MModule]> */
+RET_LABEL47:(void)0;
 }
 }
-BREAK_label40: (void)0;
 {
 { /* Inline model#MModule#flatten_mclass_hierarchy_cache= (self,var_res) on <self:MModule> */
 self->attrs[COLOR_model__MModule___flatten_mclass_hierarchy_cache].val = var_res; /* _flatten_mclass_hierarchy_cache on <self:MModule> */
-RET_LABEL41:(void)0;
+RET_LABEL48:(void)0;
 }
 }
 var = var_res;
@@ -705,10 +735,10 @@ val* var_sorter /* var sorter: MClassDefSorter */;
 var_mclassdefs = p0;
 var = NEW_model__MClassDefSorter(&type_model__MClassDefSorter);
 {
-{ /* Inline model#MClassDefSorter#init (var,self) on <var:MClassDefSorter> */
-var->attrs[COLOR_model__MClassDefSorter___mmodule].val = self; /* _mmodule on <var:MClassDefSorter> */
-RET_LABEL1:(void)0;
+((void (*)(val*, val*))(var->class->vft[COLOR_model__MClassDefSorter__mmodule_61d]))(var, self) /* mmodule= on <var:MClassDefSorter>*/;
 }
+{
+((void (*)(val*))(var->class->vft[COLOR_kernel__Object__init]))(var) /* init on <var:MClassDefSorter>*/;
 }
 var_sorter = var;
 {
@@ -729,10 +759,10 @@ val* var_sorter /* var sorter: MPropDefSorter */;
 var_mpropdefs = p0;
 var = NEW_model__MPropDefSorter(&type_model__MPropDefSorter);
 {
-{ /* Inline model#MPropDefSorter#init (var,self) on <var:MPropDefSorter> */
-var->attrs[COLOR_model__MPropDefSorter___mmodule].val = self; /* _mmodule on <var:MPropDefSorter> */
-RET_LABEL1:(void)0;
+((void (*)(val*, val*))(var->class->vft[COLOR_model__MPropDefSorter__mmodule_61d]))(var, self) /* mmodule= on <var:MPropDefSorter>*/;
 }
+{
+((void (*)(val*))(var->class->vft[COLOR_kernel__Object__init]))(var) /* init on <var:MPropDefSorter>*/;
 }
 var_sorter = var;
 {
@@ -852,7 +882,7 @@ var15 = model__MModule__get_primitive_class(self, var11);
 var18 = var15->attrs[COLOR_model__MClass___mclass_type].val; /* _mclass_type on <var15:MClass> */
 if (unlikely(var18 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass_type");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 417);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 435);
 show_backtrace(1);
 }
 var16 = var18;
@@ -916,6 +946,117 @@ RET_LABEL1:(void)0;
 }
 RET_LABEL:;
 }
+/* method model#MModule#pointer_type for (self: MModule): MClassType */
+val* model__MModule__pointer_type(val* self) {
+val* var /* : MClassType */;
+short int var1 /* : Bool */;
+val* var2 /* : MClassType */;
+static val* varonce;
+val* var3 /* : String */;
+char* var4 /* : NativeString */;
+long var5 /* : Int */;
+val* var6 /* : FlatString */;
+val* var7 /* : MClass */;
+val* var8 /* : MClassType */;
+val* var10 /* : MClassType */;
+var1 = self->attrs[COLOR_model__MModule___pointer_type].val != NULL; /* _pointer_type on <self:MModule> */
+if(likely(var1)) {
+var2 = self->attrs[COLOR_model__MModule___pointer_type].val; /* _pointer_type on <self:MModule> */
+if (unlikely(var2 == NULL)) {
+PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _pointer_type");
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 217);
+show_backtrace(1);
+}
+} else {
+if (varonce) {
+var3 = varonce;
+} else {
+var4 = "Pointer";
+var5 = 7;
+var6 = string__NativeString__to_s_with_length(var4, var5);
+var3 = var6;
+varonce = var3;
+}
+{
+var7 = model__MModule__get_primitive_class(self, var3);
+}
+{
+{ /* Inline model#MClass#mclass_type (var7) on <var7:MClass> */
+var10 = var7->attrs[COLOR_model__MClass___mclass_type].val; /* _mclass_type on <var7:MClass> */
+if (unlikely(var10 == NULL)) {
+PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass_type");
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 435);
+show_backtrace(1);
+}
+var8 = var10;
+RET_LABEL9:(void)0;
+}
+}
+self->attrs[COLOR_model__MModule___pointer_type].val = var8; /* _pointer_type on <self:MModule> */
+var2 = var8;
+}
+var = var2;
+RET_LABEL:;
+return var;
+}
+/* method model#MModule#pointer_type for (self: Object): MClassType */
+val* VIRTUAL_model__MModule__pointer_type(val* self) {
+val* var /* : MClassType */;
+val* var1 /* : MClassType */;
+short int var3 /* : Bool */;
+val* var4 /* : MClassType */;
+static val* varonce;
+val* var5 /* : String */;
+char* var6 /* : NativeString */;
+long var7 /* : Int */;
+val* var8 /* : FlatString */;
+val* var9 /* : MClass */;
+val* var10 /* : MClassType */;
+val* var12 /* : MClassType */;
+{ /* Inline model#MModule#pointer_type (self) on <self:Object(MModule)> */
+var3 = self->attrs[COLOR_model__MModule___pointer_type].val != NULL; /* _pointer_type on <self:Object(MModule)> */
+if(likely(var3)) {
+var4 = self->attrs[COLOR_model__MModule___pointer_type].val; /* _pointer_type on <self:Object(MModule)> */
+if (unlikely(var4 == NULL)) {
+PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _pointer_type");
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 217);
+show_backtrace(1);
+}
+} else {
+if (varonce) {
+var5 = varonce;
+} else {
+var6 = "Pointer";
+var7 = 7;
+var8 = string__NativeString__to_s_with_length(var6, var7);
+var5 = var8;
+varonce = var5;
+}
+{
+var9 = model__MModule__get_primitive_class(self, var5);
+}
+{
+{ /* Inline model#MClass#mclass_type (var9) on <var9:MClass> */
+var12 = var9->attrs[COLOR_model__MClass___mclass_type].val; /* _mclass_type on <var9:MClass> */
+if (unlikely(var12 == NULL)) {
+PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass_type");
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 435);
+show_backtrace(1);
+}
+var10 = var12;
+RET_LABEL11:(void)0;
+}
+}
+self->attrs[COLOR_model__MModule___pointer_type].val = var10; /* _pointer_type on <self:Object(MModule)> */
+var4 = var10;
+}
+var1 = var4;
+RET_LABEL2:(void)0;
+}
+var = var1;
+RET_LABEL:;
+return var;
+}
 /* method model#MModule#bool_type for (self: MModule): MClassType */
 val* model__MModule__bool_type(val* self) {
 val* var /* : MClassType */;
@@ -987,7 +1128,7 @@ var15 = model__MModule__get_primitive_class(self, var11);
 var18 = var15->attrs[COLOR_model__MClass___mclass_type].val; /* _mclass_type on <var15:MClass> */
 if (unlikely(var18 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass_type");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 417);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 435);
 show_backtrace(1);
 }
 var16 = var18;
@@ -1080,7 +1221,7 @@ val* var21 /* : MClassType */;
 var3 = self->attrs[COLOR_mmodule__MModule___model].val; /* _model on <self:MModule> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _model");
-PRINT_ERROR(" (%s:%d)\n", "src/model/mmodule.nit", 74);
+PRINT_ERROR(" (%s:%d)\n", "model/mmodule.nit", 72);
 show_backtrace(1);
 }
 var1 = var3;
@@ -1107,7 +1248,7 @@ var10 = 1; /* is null */
 var10 = 0; /* arg is null but recv is not */
 }
 if (0) {
-var11 = abstract_collection__SequenceRead___61d_61d(var_clas, var9);
+var11 = array__Array___61d_61d(var_clas, var9);
 var10 = var11;
 }
 if (var10){
@@ -1133,7 +1274,7 @@ var18 = model__MModule__get_primitive_class(self, var14);
 var21 = var18->attrs[COLOR_model__MClass___mclass_type].val; /* _mclass_type on <var18:MClass> */
 if (unlikely(var21 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass_type");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 417);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 435);
 show_backtrace(1);
 }
 var19 = var21;
@@ -1154,6 +1295,109 @@ var = var1;
 RET_LABEL:;
 return var;
 }
+/* method model#MModule#finalizable_type for (self: MModule): nullable MClassType */
+val* model__MModule__finalizable_type(val* self) {
+val* var /* : nullable MClassType */;
+val* var1 /* : Model */;
+val* var3 /* : Model */;
+static val* varonce;
+val* var4 /* : String */;
+char* var5 /* : NativeString */;
+long var6 /* : Int */;
+val* var7 /* : FlatString */;
+val* var8 /* : nullable Array[MClass] */;
+val* var_clas /* var clas: nullable Array[MClass] */;
+val* var9 /* : null */;
+short int var10 /* : Bool */;
+short int var11 /* : Bool */;
+val* var12 /* : null */;
+static val* varonce13;
+val* var14 /* : String */;
+char* var15 /* : NativeString */;
+long var16 /* : Int */;
+val* var17 /* : FlatString */;
+val* var18 /* : MClass */;
+val* var19 /* : MClassType */;
+val* var21 /* : MClassType */;
+{
+{ /* Inline mmodule#MModule#model (self) on <self:MModule> */
+var3 = self->attrs[COLOR_mmodule__MModule___model].val; /* _model on <self:MModule> */
+if (unlikely(var3 == NULL)) {
+PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _model");
+PRINT_ERROR(" (%s:%d)\n", "model/mmodule.nit", 72);
+show_backtrace(1);
+}
+var1 = var3;
+RET_LABEL2:(void)0;
+}
+}
+if (varonce) {
+var4 = varonce;
+} else {
+var5 = "Finalizable";
+var6 = 11;
+var7 = string__NativeString__to_s_with_length(var5, var6);
+var4 = var7;
+varonce = var4;
+}
+{
+var8 = model__Model__get_mclasses_by_name(var1, var4);
+}
+var_clas = var8;
+var9 = NULL;
+if (var_clas == NULL) {
+var10 = 1; /* is null */
+} else {
+var10 = 0; /* arg is null but recv is not */
+}
+if (0) {
+var11 = array__Array___61d_61d(var_clas, var9);
+var10 = var11;
+}
+if (var10){
+var12 = NULL;
+var = var12;
+goto RET_LABEL;
+} else {
+}
+if (varonce13) {
+var14 = varonce13;
+} else {
+var15 = "Finalizable";
+var16 = 11;
+var17 = string__NativeString__to_s_with_length(var15, var16);
+var14 = var17;
+varonce13 = var14;
+}
+{
+var18 = model__MModule__get_primitive_class(self, var14);
+}
+{
+{ /* Inline model#MClass#mclass_type (var18) on <var18:MClass> */
+var21 = var18->attrs[COLOR_model__MClass___mclass_type].val; /* _mclass_type on <var18:MClass> */
+if (unlikely(var21 == NULL)) {
+PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass_type");
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 435);
+show_backtrace(1);
+}
+var19 = var21;
+RET_LABEL20:(void)0;
+}
+}
+var = var19;
+goto RET_LABEL;
+RET_LABEL:;
+return var;
+}
+/* method model#MModule#finalizable_type for (self: Object): nullable MClassType */
+val* VIRTUAL_model__MModule__finalizable_type(val* self) {
+val* var /* : nullable MClassType */;
+val* var1 /* : nullable MClassType */;
+var1 = model__MModule__finalizable_type(self);
+var = var1;
+RET_LABEL:;
+return var;
+}
 /* method model#MModule#get_primitive_class for (self: MModule, String): MClass */
 val* model__MModule__get_primitive_class(val* self, val* p0) {
 val* var /* : MClass */;
@@ -1173,7 +1417,7 @@ val* var11 /* : FlatString */;
 short int var12 /* : Bool */;
 short int var13 /* : Bool */;
 val* var14 /* : MClass */;
-long var15 /* : Int */;
+val* var15 /* : null */;
 val* var16 /* : MClassKind */;
 val* var17 /* : MVisibility */;
 val* var_c /* var c: MClass */;
@@ -1186,63 +1430,65 @@ long var24 /* : Int */;
 long var25 /* : Int */;
 long var26 /* : Int */;
 long var27 /* : Int */;
-val* var28 /* : Array[String] */;
 val* var_cladef /* var cladef: MClassDef */;
-static val* varonce29;
-val* var30 /* : String */;
-char* var31 /* : NativeString */;
-long var32 /* : Int */;
-val* var33 /* : FlatString */;
-val* var34 /* : Array[Object] */;
-long var35 /* : Int */;
-val* var36 /* : NativeArray[Object] */;
-val* var37 /* : String */;
-long var38 /* : Int */;
-long var40 /* : Int */;
+static val* varonce28;
+val* var29 /* : String */;
+char* var30 /* : NativeString */;
+long var31 /* : Int */;
+val* var32 /* : FlatString */;
+val* var33 /* : Array[Object] */;
+long var34 /* : Int */;
+val* var35 /* : NativeArray[Object] */;
+val* var36 /* : String */;
+long var37 /* : Int */;
+long var39 /* : Int */;
 long var41 /* : Int */;
-short int var42 /* : Bool */;
+long var42 /* : Int */;
 short int var43 /* : Bool */;
-short int var45 /* : Bool */;
+short int var44 /* : Bool */;
 short int var46 /* : Bool */;
-static val* varonce47;
-val* var48 /* : String */;
-char* var49 /* : NativeString */;
-long var50 /* : Int */;
-val* var51 /* : FlatString */;
-static val* varonce52;
-val* var53 /* : String */;
-char* var54 /* : NativeString */;
-long var55 /* : Int */;
-val* var56 /* : FlatString */;
-val* var57 /* : Array[Object] */;
-long var58 /* : Int */;
-val* var59 /* : NativeArray[Object] */;
-val* var60 /* : String */;
+short int var47 /* : Bool */;
+static val* varonce48;
+val* var49 /* : String */;
+char* var50 /* : NativeString */;
+long var51 /* : Int */;
+val* var52 /* : FlatString */;
+static val* varonce53;
+val* var54 /* : String */;
+char* var55 /* : NativeString */;
+long var56 /* : Int */;
+val* var57 /* : FlatString */;
+val* var58 /* : Array[Object] */;
+long var59 /* : Int */;
+val* var60 /* : NativeArray[Object] */;
+val* var61 /* : String */;
 val* var_msg /* var msg: String */;
-val* var61 /* : ArrayIterator[nullable Object] */;
-short int var62 /* : Bool */;
-val* var63 /* : nullable Object */;
-val* var_c64 /* var c: MClass */;
-static val* varonce65;
-val* var66 /* : String */;
-char* var67 /* : NativeString */;
-long var68 /* : Int */;
-val* var69 /* : FlatString */;
-val* var70 /* : String */;
-val* var71 /* : Array[Object] */;
-long var72 /* : Int */;
-val* var73 /* : NativeArray[Object] */;
-val* var74 /* : String */;
-val* var75 /* : String */;
-long var76 /* : Int */;
-val* var78 /* : nullable Object */;
+val* var_ /* var : nullable Array[MClass] */;
+val* var62 /* : ArrayIterator[nullable Object] */;
+val* var_63 /* var : ArrayIterator[MClass] */;
+short int var64 /* : Bool */;
+val* var65 /* : nullable Object */;
+val* var_c66 /* var c: MClass */;
+static val* varonce67;
+val* var68 /* : String */;
+char* var69 /* : NativeString */;
+long var70 /* : Int */;
+val* var71 /* : FlatString */;
+val* var72 /* : String */;
+val* var73 /* : Array[Object] */;
+long var74 /* : Int */;
+val* var75 /* : NativeArray[Object] */;
+val* var76 /* : String */;
+val* var77 /* : String */;
+long var79 /* : Int */;
+val* var81 /* : nullable Object */;
 var_name = p0;
 {
 { /* Inline mmodule#MModule#model (self) on <self:MModule> */
 var3 = self->attrs[COLOR_mmodule__MModule___model].val; /* _model on <self:MModule> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _model");
-PRINT_ERROR(" (%s:%d)\n", "src/model/mmodule.nit", 74);
+PRINT_ERROR(" (%s:%d)\n", "model/mmodule.nit", 72);
 show_backtrace(1);
 }
 var1 = var3;
@@ -1260,7 +1506,7 @@ var6 = 1; /* is null */
 var6 = 0; /* arg is null but recv is not */
 }
 if (0) {
-var7 = abstract_collection__SequenceRead___61d_61d(var_cla, var5);
+var7 = array__Array___61d_61d(var_cla, var5);
 var6 = var7;
 }
 if (var6){
@@ -1279,7 +1525,7 @@ var12 = var13;
 }
 if (var12){
 var14 = NEW_model__MClass(&type_model__MClass);
-var15 = 0;
+var15 = NULL;
 {
 var16 = model__Object__enum_kind(self);
 }
@@ -1296,7 +1542,7 @@ var18 = NEW_model__MClassDef(&type_model__MClassDef);
 var21 = var_c->attrs[COLOR_model__MClass___mclass_type].val; /* _mclass_type on <var_c:MClass> */
 if (unlikely(var21 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass_type");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 417);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 435);
 show_backtrace(1);
 }
 var19 = var21;
@@ -1312,175 +1558,189 @@ var27 = 0;
 {
 location__Location__init(var22, var23, var24, var25, var26, var27); /* Direct call location#Location#init on <var22:Location>*/
 }
-var28 = NEW_array__Array(&type_array__Arraystring__String);
-{
-array__Array__init(var28); /* Direct call array#Array#init on <var28:Array[String]>*/
-}
 {
-model__MClassDef__init(var18, self, var19, var22, var28); /* Direct call model#MClassDef#init on <var18:MClassDef>*/
+model__MClassDef__init(var18, self, var19, var22); /* Direct call model#MClassDef#init on <var18:MClassDef>*/
 }
 var_cladef = var18;
 var = var_c;
 goto RET_LABEL;
 } else {
 }
-if (varonce29) {
-var30 = varonce29;
+if (varonce28) {
+var29 = varonce28;
 } else {
-var31 = "Fatal Error: no primitive class ";
-var32 = 32;
-var33 = string__NativeString__to_s_with_length(var31, var32);
-var30 = var33;
-varonce29 = var30;
+var30 = "Fatal Error: no primitive class ";
+var31 = 32;
+var32 = string__NativeString__to_s_with_length(var30, var31);
+var29 = var32;
+varonce28 = var29;
 }
-var34 = NEW_array__Array(&type_array__Arraykernel__Object);
-{ /* var34 = array_instance Array[Object] */
-var35 = 2;
-var36 = NEW_array__NativeArray(var35, &type_array__NativeArraykernel__Object);
-((struct instance_array__NativeArray*)var36)->values[0] = (val*) var30;
-((struct instance_array__NativeArray*)var36)->values[1] = (val*) var_name;
+var33 = NEW_array__Array(&type_array__Arraykernel__Object);
+{ /* var33 = array_instance Array[Object] */
+var34 = 2;
+var35 = NEW_array__NativeArray(var34, &type_array__NativeArraykernel__Object);
+((struct instance_array__NativeArray*)var35)->values[0] = (val*) var29;
+((struct instance_array__NativeArray*)var35)->values[1] = (val*) var_name;
 {
-((void (*)(val*, val*, long))(var34->class->vft[COLOR_array__Array__with_native]))(var34, var36, var35) /* with_native on <var34:Array[Object]>*/;
+((void (*)(val*, val*, long))(var33->class->vft[COLOR_array__Array__with_native]))(var33, var35, var34) /* with_native on <var33:Array[Object]>*/;
 }
 }
 {
-var37 = ((val* (*)(val*))(var34->class->vft[COLOR_string__Object__to_s]))(var34) /* to_s on <var34:Array[Object]>*/;
+var36 = ((val* (*)(val*))(var33->class->vft[COLOR_string__Object__to_s]))(var33) /* to_s on <var33:Array[Object]>*/;
 }
 {
-file__Object__print(self, var37); /* Direct call file#Object#print on <self:MModule>*/
+file__Object__print(self, var36); /* Direct call file#Object#print on <self:MModule>*/
 }
-var38 = 1;
+var37 = 1;
 {
-{ /* Inline kernel#Object#exit (self,var38) on <self:MModule> */
-exit(var38);
-RET_LABEL39:(void)0;
+{ /* Inline kernel#Object#exit (self,var37) on <self:MModule> */
+exit(var37);
+RET_LABEL38:(void)0;
 }
 }
 } else {
 }
 if (var_cla == NULL) {
 PRINT_ERROR("Runtime error: %s", "Receiver is null");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 252);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 262);
 show_backtrace(1);
 } else {
-var40 = array__AbstractArrayRead__length(var_cla);
+{ /* Inline array#AbstractArrayRead#length (var_cla) on <var_cla:nullable Array[MClass]> */
+if (unlikely(var_cla == NULL)) {
+PRINT_ERROR("Runtime error: %s", "Receiver is null");
+PRINT_ERROR(" (%s:%d)\n", "../lib/standard/collection/array.nit", 24);
+show_backtrace(1);
 }
-var41 = 1;
+var41 = var_cla->attrs[COLOR_array__AbstractArrayRead___length].l; /* _length on <var_cla:nullable Array[MClass]> */
+var39 = var41;
+RET_LABEL40:(void)0;
+}
+}
+var42 = 1;
 {
-{ /* Inline kernel#Int#!= (var40,var41) on <var40:Int> */
-var45 = var40 == var41;
-var46 = !var45;
-var43 = var46;
-goto RET_LABEL44;
-RET_LABEL44:(void)0;
+{ /* Inline kernel#Int#!= (var39,var42) on <var39:Int> */
+var46 = var39 == var42;
+var47 = !var46;
+var44 = var47;
+goto RET_LABEL45;
+RET_LABEL45:(void)0;
 }
-var42 = var43;
+var43 = var44;
 }
-if (var42){
-if (varonce47) {
-var48 = varonce47;
+if (var43){
+if (varonce48) {
+var49 = varonce48;
 } else {
-var49 = "Fatal Error: more than one primitive class ";
-var50 = 43;
-var51 = string__NativeString__to_s_with_length(var49, var50);
-var48 = var51;
-varonce47 = var48;
+var50 = "Fatal Error: more than one primitive class ";
+var51 = 43;
+var52 = string__NativeString__to_s_with_length(var50, var51);
+var49 = var52;
+varonce48 = var49;
 }
-if (varonce52) {
-var53 = varonce52;
+if (varonce53) {
+var54 = varonce53;
 } else {
-var54 = ":";
-var55 = 1;
-var56 = string__NativeString__to_s_with_length(var54, var55);
-var53 = var56;
-varonce52 = var53;
+var55 = ":";
+var56 = 1;
+var57 = string__NativeString__to_s_with_length(var55, var56);
+var54 = var57;
+varonce53 = var54;
 }
-var57 = NEW_array__Array(&type_array__Arraykernel__Object);
-{ /* var57 = array_instance Array[Object] */
-var58 = 3;
-var59 = NEW_array__NativeArray(var58, &type_array__NativeArraykernel__Object);
-((struct instance_array__NativeArray*)var59)->values[0] = (val*) var48;
-((struct instance_array__NativeArray*)var59)->values[1] = (val*) var_name;
-((struct instance_array__NativeArray*)var59)->values[2] = (val*) var53;
+var58 = NEW_array__Array(&type_array__Arraykernel__Object);
+{ /* var58 = array_instance Array[Object] */
+var59 = 3;
+var60 = NEW_array__NativeArray(var59, &type_array__NativeArraykernel__Object);
+((struct instance_array__NativeArray*)var60)->values[0] = (val*) var49;
+((struct instance_array__NativeArray*)var60)->values[1] = (val*) var_name;
+((struct instance_array__NativeArray*)var60)->values[2] = (val*) var54;
 {
-((void (*)(val*, val*, long))(var57->class->vft[COLOR_array__Array__with_native]))(var57, var59, var58) /* with_native on <var57:Array[Object]>*/;
+((void (*)(val*, val*, long))(var58->class->vft[COLOR_array__Array__with_native]))(var58, var60, var59) /* with_native on <var58:Array[Object]>*/;
 }
 }
 {
-var60 = ((val* (*)(val*))(var57->class->vft[COLOR_string__Object__to_s]))(var57) /* to_s on <var57:Array[Object]>*/;
+var61 = ((val* (*)(val*))(var58->class->vft[COLOR_string__Object__to_s]))(var58) /* to_s on <var58:Array[Object]>*/;
 }
-var_msg = var60;
-if (var_cla == NULL) {
+var_msg = var61;
+var_ = var_cla;
+if (var_ == NULL) {
 PRINT_ERROR("Runtime error: %s", "Receiver is null");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 254);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 264);
 show_backtrace(1);
 } else {
-var61 = array__AbstractArrayRead__iterator(var_cla);
+var62 = array__AbstractArrayRead__iterator(var_);
 }
+var_63 = var62;
 for(;;) {
 {
-var62 = array__ArrayIterator__is_ok(var61);
+var64 = array__ArrayIterator__is_ok(var_63);
 }
-if(!var62) break;
+if (var64){
 {
-var63 = array__ArrayIterator__item(var61);
+var65 = array__ArrayIterator__item(var_63);
 }
-var_c64 = var63;
-if (varonce65) {
-var66 = varonce65;
+var_c66 = var65;
+if (varonce67) {
+var68 = varonce67;
 } else {
-var67 = " ";
-var68 = 1;
-var69 = string__NativeString__to_s_with_length(var67, var68);
-var66 = var69;
-varonce65 = var66;
+var69 = " ";
+var70 = 1;
+var71 = string__NativeString__to_s_with_length(var69, var70);
+var68 = var71;
+varonce67 = var68;
 }
 {
-var70 = model__MClass__full_name(var_c64);
+var72 = model__MClass__full_name(var_c66);
 }
-var71 = NEW_array__Array(&type_array__Arraykernel__Object);
-{ /* var71 = array_instance Array[Object] */
-var72 = 2;
-var73 = NEW_array__NativeArray(var72, &type_array__NativeArraykernel__Object);
-((struct instance_array__NativeArray*)var73)->values[0] = (val*) var66;
-((struct instance_array__NativeArray*)var73)->values[1] = (val*) var70;
+var73 = NEW_array__Array(&type_array__Arraykernel__Object);
+{ /* var73 = array_instance Array[Object] */
+var74 = 2;
+var75 = NEW_array__NativeArray(var74, &type_array__NativeArraykernel__Object);
+((struct instance_array__NativeArray*)var75)->values[0] = (val*) var68;
+((struct instance_array__NativeArray*)var75)->values[1] = (val*) var72;
 {
-((void (*)(val*, val*, long))(var71->class->vft[COLOR_array__Array__with_native]))(var71, var73, var72) /* with_native on <var71:Array[Object]>*/;
+((void (*)(val*, val*, long))(var73->class->vft[COLOR_array__Array__with_native]))(var73, var75, var74) /* with_native on <var73:Array[Object]>*/;
 }
 }
 {
-var74 = ((val* (*)(val*))(var71->class->vft[COLOR_string__Object__to_s]))(var71) /* to_s on <var71:Array[Object]>*/;
+var76 = ((val* (*)(val*))(var73->class->vft[COLOR_string__Object__to_s]))(var73) /* to_s on <var73:Array[Object]>*/;
 }
 {
-var75 = string__FlatString___43d(var_msg, var74);
+var77 = string__FlatString___43d(var_msg, var76);
 }
-var_msg = var75;
-CONTINUE_label: (void)0;
+var_msg = var77;
 {
-array__ArrayIterator__next(var61); /* Direct call array#ArrayIterator#next on <var61:ArrayIterator[nullable Object]>*/
+array__ArrayIterator__next(var_63); /* Direct call array#ArrayIterator#next on <var_63:ArrayIterator[MClass]>*/
+}
+} else {
+goto BREAK_label;
 }
 }
 BREAK_label: (void)0;
 {
+{ /* Inline abstract_collection#Iterator#finish (var_63) on <var_63:ArrayIterator[MClass]> */
+RET_LABEL78:(void)0;
+}
+}
+{
 file__Object__print(self, var_msg); /* Direct call file#Object#print on <self:MModule>*/
 }
-var76 = 1;
+var79 = 1;
 {
-{ /* Inline kernel#Object#exit (self,var76) on <self:MModule> */
-exit(var76);
-RET_LABEL77:(void)0;
+{ /* Inline kernel#Object#exit (self,var79) on <self:MModule> */
+exit(var79);
+RET_LABEL80:(void)0;
 }
 }
 } else {
 }
 if (var_cla == NULL) {
 PRINT_ERROR("Runtime error: %s", "Receiver is null");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 258);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 268);
 show_backtrace(1);
 } else {
-var78 = abstract_collection__SequenceRead__first(var_cla);
+var81 = abstract_collection__SequenceRead__first(var_cla);
 }
-var = var78;
+var = var81;
 goto RET_LABEL;
 RET_LABEL:;
 return var;
@@ -1509,67 +1769,71 @@ short int var7 /* : Bool */;
 val* var8 /* : null */;
 val* var9 /* : null */;
 val* var_res /* var res: nullable MMethod */;
+val* var_ /* var : Array[MProperty] */;
 val* var10 /* : ArrayIterator[nullable Object] */;
-short int var11 /* : Bool */;
-val* var12 /* : nullable Object */;
+val* var_11 /* var : ArrayIterator[MProperty] */;
+short int var12 /* : Bool */;
+val* var13 /* : nullable Object */;
 val* var_mprop /* var mprop: MProperty */;
-short int var13 /* : Bool */;
+short int var14 /* : Bool */;
 int cltype;
 int idtype;
-val* var14 /* : MClassDef */;
-val* var16 /* : MClassDef */;
+val* var15 /* : MClassDef */;
+val* var17 /* : MClassDef */;
 val* var_intro /* var intro: MClassDef */;
-val* var17 /* : Array[MClassDef] */;
-val* var19 /* : Array[MClassDef] */;
-val* var20 /* : ArrayIterator[nullable Object] */;
-short int var21 /* : Bool */;
-val* var22 /* : nullable Object */;
+val* var18 /* : Array[MClassDef] */;
+val* var20 /* : Array[MClassDef] */;
+val* var_21 /* var : Array[MClassDef] */;
+val* var22 /* : ArrayIterator[nullable Object] */;
+val* var_23 /* var : ArrayIterator[MClassDef] */;
+short int var24 /* : Bool */;
+val* var25 /* : nullable Object */;
 val* var_mclassdef /* var mclassdef: MClassDef */;
-val* var23 /* : POSetElement[MModule] */;
-val* var25 /* : POSetElement[MModule] */;
-val* var26 /* : Collection[Object] */;
-val* var27 /* : MModule */;
-val* var29 /* : MModule */;
-short int var30 /* : Bool */;
-short int var31 /* : Bool */;
-val* var32 /* : nullable POSetElement[MClassDef] */;
-val* var34 /* : nullable POSetElement[MClassDef] */;
-val* var35 /* : Collection[Object] */;
-short int var36 /* : Bool */;
-short int var37 /* : Bool */;
-val* var38 /* : null */;
+val* var26 /* : POSetElement[MModule] */;
+val* var28 /* : POSetElement[MModule] */;
+val* var29 /* : Collection[Object] */;
+val* var30 /* : MModule */;
+val* var32 /* : MModule */;
+short int var33 /* : Bool */;
+short int var34 /* : Bool */;
+val* var35 /* : nullable POSetElement[MClassDef] */;
+val* var37 /* : nullable POSetElement[MClassDef] */;
+val* var38 /* : Collection[Object] */;
 short int var39 /* : Bool */;
 short int var40 /* : Bool */;
-val* var_other /* var other: nullable Object */;
+val* var41 /* : null */;
 short int var42 /* : Bool */;
-short int var44 /* : Bool */;
+short int var43 /* : Bool */;
+val* var_other /* var other: nullable Object */;
 short int var45 /* : Bool */;
-short int var46 /* : Bool */;
-val* var_other48 /* var other: nullable Object */;
+short int var47 /* : Bool */;
+short int var48 /* : Bool */;
 short int var49 /* : Bool */;
-short int var50 /* : Bool */;
-short int var51 /* : Bool */;
+val* var_other51 /* var other: nullable Object */;
+short int var52 /* : Bool */;
+short int var53 /* : Bool */;
+short int var54 /* : Bool */;
 static val* varonce;
-val* var52 /* : String */;
-char* var53 /* : NativeString */;
-long var54 /* : Int */;
-val* var55 /* : FlatString */;
-static val* varonce56;
-val* var57 /* : String */;
-char* var58 /* : NativeString */;
-long var59 /* : Int */;
-val* var60 /* : FlatString */;
-val* var61 /* : String */;
-static val* varonce62;
-val* var63 /* : String */;
-char* var64 /* : NativeString */;
-long var65 /* : Int */;
-val* var66 /* : FlatString */;
-val* var67 /* : String */;
-val* var68 /* : Array[Object] */;
-long var69 /* : Int */;
-val* var70 /* : NativeArray[Object] */;
-val* var71 /* : String */;
+val* var55 /* : String */;
+char* var56 /* : NativeString */;
+long var57 /* : Int */;
+val* var58 /* : FlatString */;
+static val* varonce59;
+val* var60 /* : String */;
+char* var61 /* : NativeString */;
+long var62 /* : Int */;
+val* var63 /* : FlatString */;
+val* var64 /* : String */;
+static val* varonce65;
+val* var66 /* : String */;
+char* var67 /* : NativeString */;
+long var68 /* : Int */;
+val* var69 /* : FlatString */;
+val* var70 /* : String */;
+val* var71 /* : Array[Object] */;
+long var72 /* : Int */;
+val* var73 /* : NativeArray[Object] */;
+val* var74 /* : String */;
 var_name = p0;
 var_recv = p1;
 {
@@ -1577,7 +1841,7 @@ var_recv = p1;
 var3 = self->attrs[COLOR_mmodule__MModule___model].val; /* _model on <self:MModule> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _model");
-PRINT_ERROR(" (%s:%d)\n", "src/model/mmodule.nit", 74);
+PRINT_ERROR(" (%s:%d)\n", "model/mmodule.nit", 72);
 show_backtrace(1);
 }
 var1 = var3;
@@ -1595,7 +1859,7 @@ var6 = 1; /* is null */
 var6 = 0; /* arg is null but recv is not */
 }
 if (0) {
-var7 = abstract_collection__SequenceRead___61d_61d(var_props, var5);
+var7 = array__Array___61d_61d(var_props, var5);
 var6 = var7;
 }
 if (var6){
@@ -1606,237 +1870,256 @@ goto RET_LABEL;
 }
 var9 = NULL;
 var_res = var9;
+var_ = var_props;
 {
-var10 = array__AbstractArrayRead__iterator(var_props);
+var10 = array__AbstractArrayRead__iterator(var_);
 }
+var_11 = var10;
 for(;;) {
 {
-var11 = array__ArrayIterator__is_ok(var10);
+var12 = array__ArrayIterator__is_ok(var_11);
 }
-if(!var11) break;
+if (var12){
 {
-var12 = array__ArrayIterator__item(var10);
+var13 = array__ArrayIterator__item(var_11);
 }
-var_mprop = var12;
+var_mprop = var13;
 /* <var_mprop:MProperty> isa MMethod */
 cltype = type_model__MMethod.color;
 idtype = type_model__MMethod.id;
 if(cltype >= var_mprop->type->table_size) {
-var13 = 0;
+var14 = 0;
 } else {
-var13 = var_mprop->type->type_table[cltype] == idtype;
+var14 = var_mprop->type->type_table[cltype] == idtype;
 }
-if (unlikely(!var13)) {
+if (unlikely(!var14)) {
 PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 268);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 278);
 show_backtrace(1);
 }
 {
 { /* Inline model#MProperty#intro_mclassdef (var_mprop) on <var_mprop:MProperty(MMethod)> */
-var16 = var_mprop->attrs[COLOR_model__MProperty___intro_mclassdef].val; /* _intro_mclassdef on <var_mprop:MProperty(MMethod)> */
-if (unlikely(var16 == NULL)) {
+var17 = var_mprop->attrs[COLOR_model__MProperty___intro_mclassdef].val; /* _intro_mclassdef on <var_mprop:MProperty(MMethod)> */
+if (unlikely(var17 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _intro_mclassdef");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1602);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1615);
 show_backtrace(1);
 }
-var14 = var16;
-RET_LABEL15:(void)0;
+var15 = var17;
+RET_LABEL16:(void)0;
 }
 }
-var_intro = var14;
+var_intro = var15;
 {
 { /* Inline model#MClass#mclassdefs (var_recv) on <var_recv:MClass> */
-var19 = var_recv->attrs[COLOR_model__MClass___mclassdefs].val; /* _mclassdefs on <var_recv:MClass> */
-if (unlikely(var19 == NULL)) {
+var20 = var_recv->attrs[COLOR_model__MClass___mclassdefs].val; /* _mclassdefs on <var_recv:MClass> */
+if (unlikely(var20 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclassdefs");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 392);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 414);
 show_backtrace(1);
 }
-var17 = var19;
-RET_LABEL18:(void)0;
+var18 = var20;
+RET_LABEL19:(void)0;
 }
 }
+var_21 = var18;
 {
-var20 = array__AbstractArrayRead__iterator(var17);
+var22 = array__AbstractArrayRead__iterator(var_21);
 }
+var_23 = var22;
 for(;;) {
 {
-var21 = array__ArrayIterator__is_ok(var20);
+var24 = array__ArrayIterator__is_ok(var_23);
 }
-if(!var21) break;
+if (var24){
 {
-var22 = array__ArrayIterator__item(var20);
+var25 = array__ArrayIterator__item(var_23);
 }
-var_mclassdef = var22;
+var_mclassdef = var25;
 {
 { /* Inline mmodule#MModule#in_importation (self) on <self:MModule> */
-var25 = self->attrs[COLOR_mmodule__MModule___in_importation].val; /* _in_importation on <self:MModule> */
-if (unlikely(var25 == NULL)) {
+var28 = self->attrs[COLOR_mmodule__MModule___in_importation].val; /* _in_importation on <self:MModule> */
+if (unlikely(var28 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _in_importation");
-PRINT_ERROR(" (%s:%d)\n", "src/model/mmodule.nit", 101);
+PRINT_ERROR(" (%s:%d)\n", "model/mmodule.nit", 93);
 show_backtrace(1);
 }
-var23 = var25;
-RET_LABEL24:(void)0;
+var26 = var28;
+RET_LABEL27:(void)0;
 }
 }
 {
-var26 = poset__POSetElement__greaters(var23);
+var29 = poset__POSetElement__greaters(var26);
 }
 {
 { /* Inline model#MClassDef#mmodule (var_mclassdef) on <var_mclassdef:MClassDef> */
-var29 = var_mclassdef->attrs[COLOR_model__MClassDef___mmodule].val; /* _mmodule on <var_mclassdef:MClassDef> */
-if (unlikely(var29 == NULL)) {
+var32 = var_mclassdef->attrs[COLOR_model__MClassDef___mmodule].val; /* _mmodule on <var_mclassdef:MClassDef> */
+if (unlikely(var32 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mmodule");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 471);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 489);
 show_backtrace(1);
 }
-var27 = var29;
-RET_LABEL28:(void)0;
+var30 = var32;
+RET_LABEL31:(void)0;
 }
 }
 {
-var30 = ((short int (*)(val*, val*))(var26->class->vft[COLOR_abstract_collection__Collection__has]))(var26, var27) /* has on <var26:Collection[Object](Collection[MModule])>*/;
+var33 = ((short int (*)(val*, val*))(var29->class->vft[COLOR_abstract_collection__Collection__has]))(var29, var30) /* has on <var29:Collection[Object](Collection[MModule])>*/;
 }
-var31 = !var30;
-if (var31){
-goto CONTINUE_label;
+var34 = !var33;
+if (var34){
+goto BREAK_label;
 } else {
 }
 {
 { /* Inline model#MClassDef#in_hierarchy (var_mclassdef) on <var_mclassdef:MClassDef> */
-var34 = var_mclassdef->attrs[COLOR_model__MClassDef___in_hierarchy].val; /* _in_hierarchy on <var_mclassdef:MClassDef> */
-var32 = var34;
-RET_LABEL33:(void)0;
+var37 = var_mclassdef->attrs[COLOR_model__MClassDef___in_hierarchy].val; /* _in_hierarchy on <var_mclassdef:MClassDef> */
+var35 = var37;
+RET_LABEL36:(void)0;
 }
 }
-if (var32 == NULL) {
+if (var35 == NULL) {
 PRINT_ERROR("Runtime error: %s", "Receiver is null");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 272);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 282);
 show_backtrace(1);
 } else {
-var35 = poset__POSetElement__greaters(var32);
+var38 = poset__POSetElement__greaters(var35);
 }
 {
-var36 = ((short int (*)(val*, val*))(var35->class->vft[COLOR_abstract_collection__Collection__has]))(var35, var_intro) /* has on <var35:Collection[Object](Collection[MClassDef])>*/;
+var39 = ((short int (*)(val*, val*))(var38->class->vft[COLOR_abstract_collection__Collection__has]))(var38, var_intro) /* has on <var38:Collection[Object](Collection[MClassDef])>*/;
 }
-var37 = !var36;
-if (var37){
-goto CONTINUE_label;
+var40 = !var39;
+if (var40){
+goto BREAK_label;
 } else {
 }
-var38 = NULL;
+var41 = NULL;
 if (var_res == NULL) {
-var39 = 1; /* is null */
+var42 = 1; /* is null */
 } else {
-var39 = 0; /* arg is null but recv is not */
+var42 = 0; /* arg is null but recv is not */
 }
 if (0) {
-{ /* Inline kernel#Object#== (var_res,var38) on <var_res:nullable MMethod> */
-var_other = var38;
+{ /* Inline kernel#Object#== (var_res,var41) on <var_res:nullable MMethod> */
+var_other = var41;
 {
 { /* Inline kernel#Object#is_same_instance (var_res,var_other) on <var_res:nullable MMethod(MMethod)> */
-var44 = var_res == var_other;
-var42 = var44;
-goto RET_LABEL43;
-RET_LABEL43:(void)0;
+var47 = var_res == var_other;
+var45 = var47;
+goto RET_LABEL46;
+RET_LABEL46:(void)0;
 }
 }
-var40 = var42;
-goto RET_LABEL41;
-RET_LABEL41:(void)0;
+var43 = var45;
+goto RET_LABEL44;
+RET_LABEL44:(void)0;
 }
-var39 = var40;
+var42 = var43;
 }
-if (var39){
+if (var42){
 var_res = var_mprop;
 } else {
 {
 { /* Inline kernel#Object#!= (var_res,var_mprop) on <var_res:nullable MMethod(MMethod)> */
-var_other48 = var_mprop;
+var_other51 = var_mprop;
 {
-var50 = ((short int (*)(val*, val*))(var_res->class->vft[COLOR_kernel__Object___61d_61d]))(var_res, var_other48) /* == on <var_res:nullable MMethod(MMethod)>*/;
-var49 = var50;
+var53 = ((short int (*)(val*, val*))(var_res->class->vft[COLOR_kernel__Object___61d_61d]))(var_res, var_other51) /* == on <var_res:nullable MMethod(MMethod)>*/;
+var52 = var53;
 }
-var51 = !var49;
-var46 = var51;
-goto RET_LABEL47;
-RET_LABEL47:(void)0;
+var54 = !var52;
+var49 = var54;
+goto RET_LABEL50;
+RET_LABEL50:(void)0;
 }
-var45 = var46;
+var48 = var49;
 }
-if (var45){
+if (var48){
 if (varonce) {
-var52 = varonce;
+var55 = varonce;
 } else {
-var53 = "Fatal Error: ambigous property name \'";
-var54 = 37;
-var55 = string__NativeString__to_s_with_length(var53, var54);
-var52 = var55;
-varonce = var52;
+var56 = "Fatal Error: ambigous property name \'";
+var57 = 37;
+var58 = string__NativeString__to_s_with_length(var56, var57);
+var55 = var58;
+varonce = var55;
 }
-if (varonce56) {
-var57 = varonce56;
+if (varonce59) {
+var60 = varonce59;
 } else {
-var58 = "\'; conflict between ";
-var59 = 20;
-var60 = string__NativeString__to_s_with_length(var58, var59);
-var57 = var60;
-varonce56 = var57;
+var61 = "\'; conflict between ";
+var62 = 20;
+var63 = string__NativeString__to_s_with_length(var61, var62);
+var60 = var63;
+varonce59 = var60;
 }
 {
-var61 = model__MProperty__full_name(var_mprop);
+var64 = model__MProperty__full_name(var_mprop);
 }
-if (varonce62) {
-var63 = varonce62;
+if (varonce65) {
+var66 = varonce65;
 } else {
-var64 = " and ";
-var65 = 5;
-var66 = string__NativeString__to_s_with_length(var64, var65);
-var63 = var66;
-varonce62 = var63;
+var67 = " and ";
+var68 = 5;
+var69 = string__NativeString__to_s_with_length(var67, var68);
+var66 = var69;
+varonce65 = var66;
 }
 {
-var67 = model__MProperty__full_name(var_res);
+var70 = model__MProperty__full_name(var_res);
 }
-var68 = NEW_array__Array(&type_array__Arraykernel__Object);
-{ /* var68 = array_instance Array[Object] */
-var69 = 6;
-var70 = NEW_array__NativeArray(var69, &type_array__NativeArraykernel__Object);
-((struct instance_array__NativeArray*)var70)->values[0] = (val*) var52;
-((struct instance_array__NativeArray*)var70)->values[1] = (val*) var_name;
-((struct instance_array__NativeArray*)var70)->values[2] = (val*) var57;
-((struct instance_array__NativeArray*)var70)->values[3] = (val*) var61;
-((struct instance_array__NativeArray*)var70)->values[4] = (val*) var63;
-((struct instance_array__NativeArray*)var70)->values[5] = (val*) var67;
+var71 = NEW_array__Array(&type_array__Arraykernel__Object);
+{ /* var71 = array_instance Array[Object] */
+var72 = 6;
+var73 = NEW_array__NativeArray(var72, &type_array__NativeArraykernel__Object);
+((struct instance_array__NativeArray*)var73)->values[0] = (val*) var55;
+((struct instance_array__NativeArray*)var73)->values[1] = (val*) var_name;
+((struct instance_array__NativeArray*)var73)->values[2] = (val*) var60;
+((struct instance_array__NativeArray*)var73)->values[3] = (val*) var64;
+((struct instance_array__NativeArray*)var73)->values[4] = (val*) var66;
+((struct instance_array__NativeArray*)var73)->values[5] = (val*) var70;
 {
-((void (*)(val*, val*, long))(var68->class->vft[COLOR_array__Array__with_native]))(var68, var70, var69) /* with_native on <var68:Array[Object]>*/;
+((void (*)(val*, val*, long))(var71->class->vft[COLOR_array__Array__with_native]))(var71, var73, var72) /* with_native on <var71:Array[Object]>*/;
 }
 }
 {
-var71 = ((val* (*)(val*))(var68->class->vft[COLOR_string__Object__to_s]))(var68) /* to_s on <var68:Array[Object]>*/;
+var74 = ((val* (*)(val*))(var71->class->vft[COLOR_string__Object__to_s]))(var71) /* to_s on <var71:Array[Object]>*/;
 }
 {
-file__Object__print(self, var71); /* Direct call file#Object#print on <self:MModule>*/
+file__Object__print(self, var74); /* Direct call file#Object#print on <self:MModule>*/
 }
 PRINT_ERROR("Runtime error: %s", "Aborted");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 277);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 287);
 show_backtrace(1);
 } else {
 }
 }
-CONTINUE_label: (void)0;
+BREAK_label: (void)0;
 {
-array__ArrayIterator__next(var20); /* Direct call array#ArrayIterator#next on <var20:ArrayIterator[nullable Object]>*/
+array__ArrayIterator__next(var_23); /* Direct call array#ArrayIterator#next on <var_23:ArrayIterator[MClassDef]>*/
+}
+} else {
+goto BREAK_label75;
+}
+}
+BREAK_label75: (void)0;
+{
+{ /* Inline abstract_collection#Iterator#finish (var_23) on <var_23:ArrayIterator[MClassDef]> */
+RET_LABEL76:(void)0;
 }
 }
-BREAK_label: (void)0;
-CONTINUE_label72: (void)0;
 {
-array__ArrayIterator__next(var10); /* Direct call array#ArrayIterator#next on <var10:ArrayIterator[nullable Object]>*/
+array__ArrayIterator__next(var_11); /* Direct call array#ArrayIterator#next on <var_11:ArrayIterator[MProperty]>*/
+}
+} else {
+goto BREAK_label77;
+}
+}
+BREAK_label77: (void)0;
+{
+{ /* Inline abstract_collection#Iterator#finish (var_11) on <var_11:ArrayIterator[MProperty]> */
+RET_LABEL78:(void)0;
 }
 }
-BREAK_label72: (void)0;
 var = var_res;
 goto RET_LABEL;
 RET_LABEL:;
@@ -1858,7 +2141,7 @@ val* var1 /* : MModule */;
 var1 = self->attrs[COLOR_model__MClassDefSorter___mmodule].val; /* _mmodule on <self:MClassDefSorter> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mmodule");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 287);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 298);
 show_backtrace(1);
 }
 var = var1;
@@ -1874,7 +2157,7 @@ val* var3 /* : MModule */;
 var3 = self->attrs[COLOR_model__MClassDefSorter___mmodule].val; /* _mmodule on <self:Object(MClassDefSorter)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mmodule");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 287);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 298);
 show_backtrace(1);
 }
 var1 = var3;
@@ -1884,165 +2167,194 @@ var = var1;
 RET_LABEL:;
 return var;
 }
+/* method model#MClassDefSorter#mmodule= for (self: MClassDefSorter, MModule) */
+void model__MClassDefSorter__mmodule_61d(val* self, val* p0) {
+self->attrs[COLOR_model__MClassDefSorter___mmodule].val = p0; /* _mmodule on <self:MClassDefSorter> */
+RET_LABEL:;
+}
+/* method model#MClassDefSorter#mmodule= for (self: Object, MModule) */
+void VIRTUAL_model__MClassDefSorter__mmodule_61d(val* self, val* p0) {
+{ /* Inline model#MClassDefSorter#mmodule= (self,p0) on <self:Object(MClassDefSorter)> */
+self->attrs[COLOR_model__MClassDefSorter___mmodule].val = p0; /* _mmodule on <self:Object(MClassDefSorter)> */
+RET_LABEL1:(void)0;
+}
+RET_LABEL:;
+}
 /* method model#MClassDefSorter#compare for (self: MClassDefSorter, MClassDef, MClassDef): Int */
 long model__MClassDefSorter__compare(val* self, val* p0, val* p1) {
 long var /* : Int */;
 short int var1 /* : Bool */;
 int cltype;
 int idtype;
+const struct type* type_struct;
 const char* var_class_name;
 short int var2 /* : Bool */;
 int cltype3;
 int idtype4;
-const char* var_class_name5;
+const struct type* type_struct5;
+const char* var_class_name6;
 val* var_a /* var a: MClassDef */;
 val* var_b /* var b: MClassDef */;
-val* var6 /* : MClass */;
-val* var8 /* : MClass */;
-val* var_ca /* var ca: MClass */;
+val* var7 /* : MClass */;
 val* var9 /* : MClass */;
-val* var11 /* : MClass */;
+val* var_ca /* var ca: MClass */;
+val* var10 /* : MClass */;
+val* var12 /* : MClass */;
 val* var_cb /* var cb: MClass */;
-short int var12 /* : Bool */;
 short int var13 /* : Bool */;
+short int var14 /* : Bool */;
 val* var_other /* var other: nullable Object */;
-short int var15 /* : Bool */;
 short int var16 /* : Bool */;
 short int var17 /* : Bool */;
-val* var18 /* : MModule */;
-val* var20 /* : MModule */;
-val* var21 /* : POSet[MClass] */;
-long var22 /* : Int */;
-val* var23 /* : MModule */;
-val* var25 /* : MModule */;
-val* var26 /* : Model */;
-val* var28 /* : Model */;
-val* var29 /* : POSet[MClassDef] */;
-val* var31 /* : POSet[MClassDef] */;
-long var32 /* : Int */;
-/* Covariant cast for argument 0 (a) <p0:MClassDef> isa Comparator#0 */
-/* <p0:MClassDef> isa Comparator#0 */
-var1 = 1; /* easy <p0:MClassDef> isa Comparator#0*/
+short int var18 /* : Bool */;
+val* var19 /* : MModule */;
+val* var21 /* : MModule */;
+val* var22 /* : POSet[MClass] */;
+long var23 /* : Int */;
+val* var24 /* : MModule */;
+val* var26 /* : MModule */;
+val* var27 /* : Model */;
+val* var29 /* : Model */;
+val* var30 /* : POSet[MClassDef] */;
+val* var32 /* : POSet[MClassDef] */;
+long var33 /* : Int */;
+/* Covariant cast for argument 0 (a) <p0:MClassDef> isa COMPARED */
+/* <p0:MClassDef> isa COMPARED */
+type_struct = self->type->resolution_table->types[COLOR_sorter__Comparator_VTCOMPARED];
+cltype = type_struct->color;
+idtype = type_struct->id;
+if(cltype >= p0->type->table_size) {
+var1 = 0;
+} else {
+var1 = p0->type->type_table[cltype] == idtype;
+}
 if (unlikely(!var1)) {
 var_class_name = p0 == NULL ? "null" : p0->type->name;
-PRINT_ERROR("Runtime error: Cast failed. Expected `%s`, got `%s`", "Comparator#0", var_class_name);
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 288);
+PRINT_ERROR("Runtime error: Cast failed. Expected `%s`, got `%s`", "COMPARED", var_class_name);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 299);
 show_backtrace(1);
 }
-/* Covariant cast for argument 1 (b) <p1:MClassDef> isa Comparator#0 */
-/* <p1:MClassDef> isa Comparator#0 */
-var2 = 1; /* easy <p1:MClassDef> isa Comparator#0*/
+/* Covariant cast for argument 1 (b) <p1:MClassDef> isa COMPARED */
+/* <p1:MClassDef> isa COMPARED */
+type_struct5 = self->type->resolution_table->types[COLOR_sorter__Comparator_VTCOMPARED];
+cltype3 = type_struct5->color;
+idtype4 = type_struct5->id;
+if(cltype3 >= p1->type->table_size) {
+var2 = 0;
+} else {
+var2 = p1->type->type_table[cltype3] == idtype4;
+}
 if (unlikely(!var2)) {
-var_class_name5 = p1 == NULL ? "null" : p1->type->name;
-PRINT_ERROR("Runtime error: Cast failed. Expected `%s`, got `%s`", "Comparator#0", var_class_name5);
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 288);
+var_class_name6 = p1 == NULL ? "null" : p1->type->name;
+PRINT_ERROR("Runtime error: Cast failed. Expected `%s`, got `%s`", "COMPARED", var_class_name6);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 299);
 show_backtrace(1);
 }
 var_a = p0;
 var_b = p1;
 {
 { /* Inline model#MClassDef#mclass (var_a) on <var_a:MClassDef> */
-var8 = var_a->attrs[COLOR_model__MClassDef___mclass].val; /* _mclass on <var_a:MClassDef> */
-if (unlikely(var8 == NULL)) {
+var9 = var_a->attrs[COLOR_model__MClassDef___mclass].val; /* _mclass on <var_a:MClassDef> */
+if (unlikely(var9 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 474);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 492);
 show_backtrace(1);
 }
-var6 = var8;
-RET_LABEL7:(void)0;
+var7 = var9;
+RET_LABEL8:(void)0;
 }
 }
-var_ca = var6;
+var_ca = var7;
 {
 { /* Inline model#MClassDef#mclass (var_b) on <var_b:MClassDef> */
-var11 = var_b->attrs[COLOR_model__MClassDef___mclass].val; /* _mclass on <var_b:MClassDef> */
-if (unlikely(var11 == NULL)) {
+var12 = var_b->attrs[COLOR_model__MClassDef___mclass].val; /* _mclass on <var_b:MClassDef> */
+if (unlikely(var12 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 474);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 492);
 show_backtrace(1);
 }
-var9 = var11;
-RET_LABEL10:(void)0;
+var10 = var12;
+RET_LABEL11:(void)0;
 }
 }
-var_cb = var9;
+var_cb = var10;
 {
 { /* Inline kernel#Object#!= (var_ca,var_cb) on <var_ca:MClass> */
 var_other = var_cb;
 {
-var16 = ((short int (*)(val*, val*))(var_ca->class->vft[COLOR_kernel__Object___61d_61d]))(var_ca, var_other) /* == on <var_ca:MClass>*/;
-var15 = var16;
+var17 = ((short int (*)(val*, val*))(var_ca->class->vft[COLOR_kernel__Object___61d_61d]))(var_ca, var_other) /* == on <var_ca:MClass>*/;
+var16 = var17;
 }
-var17 = !var15;
-var13 = var17;
-goto RET_LABEL14;
-RET_LABEL14:(void)0;
+var18 = !var16;
+var14 = var18;
+goto RET_LABEL15;
+RET_LABEL15:(void)0;
 }
-var12 = var13;
+var13 = var14;
 }
-if (var12){
+if (var13){
 {
 { /* Inline model#MClassDefSorter#mmodule (self) on <self:MClassDefSorter> */
-var20 = self->attrs[COLOR_model__MClassDefSorter___mmodule].val; /* _mmodule on <self:MClassDefSorter> */
-if (unlikely(var20 == NULL)) {
+var21 = self->attrs[COLOR_model__MClassDefSorter___mmodule].val; /* _mmodule on <self:MClassDefSorter> */
+if (unlikely(var21 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mmodule");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 287);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 298);
 show_backtrace(1);
 }
-var18 = var20;
-RET_LABEL19:(void)0;
+var19 = var21;
+RET_LABEL20:(void)0;
 }
 }
 {
-var21 = model__MModule__flatten_mclass_hierarchy(var18);
+var22 = model__MModule__flatten_mclass_hierarchy(var19);
 }
 {
-var22 = poset__POSet__compare(var21, var_ca, var_cb);
+var23 = poset__POSet__compare(var22, var_ca, var_cb);
 }
-var = var22;
+var = var23;
 goto RET_LABEL;
 } else {
 }
 {
 { /* Inline model#MClassDefSorter#mmodule (self) on <self:MClassDefSorter> */
-var25 = self->attrs[COLOR_model__MClassDefSorter___mmodule].val; /* _mmodule on <self:MClassDefSorter> */
-if (unlikely(var25 == NULL)) {
+var26 = self->attrs[COLOR_model__MClassDefSorter___mmodule].val; /* _mmodule on <self:MClassDefSorter> */
+if (unlikely(var26 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mmodule");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 287);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 298);
 show_backtrace(1);
 }
-var23 = var25;
-RET_LABEL24:(void)0;
+var24 = var26;
+RET_LABEL25:(void)0;
 }
 }
 {
-{ /* Inline mmodule#MModule#model (var23) on <var23:MModule> */
-var28 = var23->attrs[COLOR_mmodule__MModule___model].val; /* _model on <var23:MModule> */
-if (unlikely(var28 == NULL)) {
+{ /* Inline mmodule#MModule#model (var24) on <var24:MModule> */
+var29 = var24->attrs[COLOR_mmodule__MModule___model].val; /* _model on <var24:MModule> */
+if (unlikely(var29 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _model");
-PRINT_ERROR(" (%s:%d)\n", "src/model/mmodule.nit", 74);
+PRINT_ERROR(" (%s:%d)\n", "model/mmodule.nit", 72);
 show_backtrace(1);
 }
-var26 = var28;
-RET_LABEL27:(void)0;
+var27 = var29;
+RET_LABEL28:(void)0;
 }
 }
 {
-{ /* Inline model#Model#mclassdef_hierarchy (var26) on <var26:Model> */
-var31 = var26->attrs[COLOR_model__Model___mclassdef_hierarchy].val; /* _mclassdef_hierarchy on <var26:Model> */
-if (unlikely(var31 == NULL)) {
+{ /* Inline model#Model#mclassdef_hierarchy (var27) on <var27:Model> */
+var32 = var27->attrs[COLOR_model__Model___mclassdef_hierarchy].val; /* _mclassdef_hierarchy on <var27:Model> */
+if (unlikely(var32 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclassdef_hierarchy");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 42);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 40);
 show_backtrace(1);
 }
-var29 = var31;
-RET_LABEL30:(void)0;
+var30 = var32;
+RET_LABEL31:(void)0;
 }
 }
 {
-var32 = poset__POSet__compare(var29, var_a, var_b);
+var33 = poset__POSet__compare(var30, var_a, var_b);
 }
-var = var32;
+var = var33;
 goto RET_LABEL;
 RET_LABEL:;
 return var;
@@ -2056,15 +2368,19 @@ var = var1;
 RET_LABEL:;
 return var;
 }
-/* method model#MClassDefSorter#init for (self: MClassDefSorter, MModule) */
-void model__MClassDefSorter__init(val* self, val* p0) {
-self->attrs[COLOR_model__MClassDefSorter___mmodule].val = p0; /* _mmodule on <self:MClassDefSorter> */
+/* method model#MClassDefSorter#init for (self: MClassDefSorter) */
+void model__MClassDefSorter__init(val* self) {
+{
+((void (*)(val*))(self->class->vft[COLOR_model__MClassDefSorter__init]))(self) /* init on <self:MClassDefSorter>*/;
+}
 RET_LABEL:;
 }
-/* method model#MClassDefSorter#init for (self: Object, MModule) */
-void VIRTUAL_model__MClassDefSorter__init(val* self, val* p0) {
-{ /* Inline model#MClassDefSorter#init (self,p0) on <self:Object(MClassDefSorter)> */
-self->attrs[COLOR_model__MClassDefSorter___mmodule].val = p0; /* _mmodule on <self:Object(MClassDefSorter)> */
+/* method model#MClassDefSorter#init for (self: Object) */
+void VIRTUAL_model__MClassDefSorter__init(val* self) {
+{ /* Inline model#MClassDefSorter#init (self) on <self:Object(MClassDefSorter)> */
+{
+((void (*)(val*))(self->class->vft[COLOR_model__MClassDefSorter__init]))(self) /* init on <self:Object(MClassDefSorter)>*/;
+}
 RET_LABEL1:(void)0;
 }
 RET_LABEL:;
@@ -2076,7 +2392,7 @@ val* var1 /* : MModule */;
 var1 = self->attrs[COLOR_model__MPropDefSorter___mmodule].val; /* _mmodule on <self:MPropDefSorter> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mmodule");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 299);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 311);
 show_backtrace(1);
 }
 var = var1;
@@ -2092,7 +2408,7 @@ val* var3 /* : MModule */;
 var3 = self->attrs[COLOR_model__MPropDefSorter___mmodule].val; /* _mmodule on <self:Object(MPropDefSorter)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mmodule");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 299);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 311);
 show_backtrace(1);
 }
 var1 = var3;
@@ -2102,197 +2418,226 @@ var = var1;
 RET_LABEL:;
 return var;
 }
+/* method model#MPropDefSorter#mmodule= for (self: MPropDefSorter, MModule) */
+void model__MPropDefSorter__mmodule_61d(val* self, val* p0) {
+self->attrs[COLOR_model__MPropDefSorter___mmodule].val = p0; /* _mmodule on <self:MPropDefSorter> */
+RET_LABEL:;
+}
+/* method model#MPropDefSorter#mmodule= for (self: Object, MModule) */
+void VIRTUAL_model__MPropDefSorter__mmodule_61d(val* self, val* p0) {
+{ /* Inline model#MPropDefSorter#mmodule= (self,p0) on <self:Object(MPropDefSorter)> */
+self->attrs[COLOR_model__MPropDefSorter___mmodule].val = p0; /* _mmodule on <self:Object(MPropDefSorter)> */
+RET_LABEL1:(void)0;
+}
+RET_LABEL:;
+}
 /* method model#MPropDefSorter#compare for (self: MPropDefSorter, MPropDef, MPropDef): Int */
 long model__MPropDefSorter__compare(val* self, val* p0, val* p1) {
 long var /* : Int */;
 short int var1 /* : Bool */;
 int cltype;
 int idtype;
+const struct type* type_struct;
 const char* var_class_name;
 short int var2 /* : Bool */;
 int cltype3;
 int idtype4;
-const char* var_class_name5;
+const struct type* type_struct5;
+const char* var_class_name6;
 val* var_pa /* var pa: MPropDef */;
 val* var_pb /* var pb: MPropDef */;
-val* var6 /* : MClassDef */;
-val* var8 /* : MClassDef */;
-val* var_a /* var a: MClassDef */;
+val* var7 /* : MClassDef */;
 val* var9 /* : MClassDef */;
-val* var11 /* : MClassDef */;
+val* var_a /* var a: MClassDef */;
+val* var10 /* : MClassDef */;
+val* var12 /* : MClassDef */;
 val* var_b /* var b: MClassDef */;
-val* var12 /* : MClass */;
-val* var14 /* : MClass */;
-val* var_ca /* var ca: MClass */;
+val* var13 /* : MClass */;
 val* var15 /* : MClass */;
-val* var17 /* : MClass */;
+val* var_ca /* var ca: MClass */;
+val* var16 /* : MClass */;
+val* var18 /* : MClass */;
 val* var_cb /* var cb: MClass */;
-short int var18 /* : Bool */;
 short int var19 /* : Bool */;
+short int var20 /* : Bool */;
 val* var_other /* var other: nullable Object */;
-short int var21 /* : Bool */;
 short int var22 /* : Bool */;
 short int var23 /* : Bool */;
-val* var24 /* : MModule */;
-val* var26 /* : MModule */;
-val* var27 /* : POSet[MClass] */;
-long var28 /* : Int */;
-val* var29 /* : MModule */;
-val* var31 /* : MModule */;
-val* var32 /* : Model */;
-val* var34 /* : Model */;
-val* var35 /* : POSet[MClassDef] */;
-val* var37 /* : POSet[MClassDef] */;
-long var38 /* : Int */;
-/* Covariant cast for argument 0 (pa) <p0:MPropDef> isa Comparator#0 */
-/* <p0:MPropDef> isa Comparator#0 */
-var1 = 1; /* easy <p0:MPropDef> isa Comparator#0*/
+short int var24 /* : Bool */;
+val* var25 /* : MModule */;
+val* var27 /* : MModule */;
+val* var28 /* : POSet[MClass] */;
+long var29 /* : Int */;
+val* var30 /* : MModule */;
+val* var32 /* : MModule */;
+val* var33 /* : Model */;
+val* var35 /* : Model */;
+val* var36 /* : POSet[MClassDef] */;
+val* var38 /* : POSet[MClassDef] */;
+long var39 /* : Int */;
+/* Covariant cast for argument 0 (pa) <p0:MPropDef> isa COMPARED */
+/* <p0:MPropDef> isa COMPARED */
+type_struct = self->type->resolution_table->types[COLOR_sorter__Comparator_VTCOMPARED];
+cltype = type_struct->color;
+idtype = type_struct->id;
+if(cltype >= p0->type->table_size) {
+var1 = 0;
+} else {
+var1 = p0->type->type_table[cltype] == idtype;
+}
 if (unlikely(!var1)) {
 var_class_name = p0 == NULL ? "null" : p0->type->name;
-PRINT_ERROR("Runtime error: Cast failed. Expected `%s`, got `%s`", "Comparator#0", var_class_name);
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 300);
+PRINT_ERROR("Runtime error: Cast failed. Expected `%s`, got `%s`", "COMPARED", var_class_name);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 312);
 show_backtrace(1);
 }
-/* Covariant cast for argument 1 (pb) <p1:MPropDef> isa Comparator#0 */
-/* <p1:MPropDef> isa Comparator#0 */
-var2 = 1; /* easy <p1:MPropDef> isa Comparator#0*/
+/* Covariant cast for argument 1 (pb) <p1:MPropDef> isa COMPARED */
+/* <p1:MPropDef> isa COMPARED */
+type_struct5 = self->type->resolution_table->types[COLOR_sorter__Comparator_VTCOMPARED];
+cltype3 = type_struct5->color;
+idtype4 = type_struct5->id;
+if(cltype3 >= p1->type->table_size) {
+var2 = 0;
+} else {
+var2 = p1->type->type_table[cltype3] == idtype4;
+}
 if (unlikely(!var2)) {
-var_class_name5 = p1 == NULL ? "null" : p1->type->name;
-PRINT_ERROR("Runtime error: Cast failed. Expected `%s`, got `%s`", "Comparator#0", var_class_name5);
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 300);
+var_class_name6 = p1 == NULL ? "null" : p1->type->name;
+PRINT_ERROR("Runtime error: Cast failed. Expected `%s`, got `%s`", "COMPARED", var_class_name6);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 312);
 show_backtrace(1);
 }
 var_pa = p0;
 var_pb = p1;
 {
 { /* Inline model#MPropDef#mclassdef (var_pa) on <var_pa:MPropDef> */
-var8 = var_pa->attrs[COLOR_model__MPropDef___mclassdef].val; /* _mclassdef on <var_pa:MPropDef> */
-if (unlikely(var8 == NULL)) {
+var9 = var_pa->attrs[COLOR_model__MPropDef___mclassdef].val; /* _mclassdef on <var_pa:MPropDef> */
+if (unlikely(var9 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclassdef");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1879);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1895);
 show_backtrace(1);
 }
-var6 = var8;
-RET_LABEL7:(void)0;
+var7 = var9;
+RET_LABEL8:(void)0;
 }
 }
-var_a = var6;
+var_a = var7;
 {
 { /* Inline model#MPropDef#mclassdef (var_pb) on <var_pb:MPropDef> */
-var11 = var_pb->attrs[COLOR_model__MPropDef___mclassdef].val; /* _mclassdef on <var_pb:MPropDef> */
-if (unlikely(var11 == NULL)) {
+var12 = var_pb->attrs[COLOR_model__MPropDef___mclassdef].val; /* _mclassdef on <var_pb:MPropDef> */
+if (unlikely(var12 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclassdef");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1879);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1895);
 show_backtrace(1);
 }
-var9 = var11;
-RET_LABEL10:(void)0;
+var10 = var12;
+RET_LABEL11:(void)0;
 }
 }
-var_b = var9;
+var_b = var10;
 {
 { /* Inline model#MClassDef#mclass (var_a) on <var_a:MClassDef> */
-var14 = var_a->attrs[COLOR_model__MClassDef___mclass].val; /* _mclass on <var_a:MClassDef> */
-if (unlikely(var14 == NULL)) {
+var15 = var_a->attrs[COLOR_model__MClassDef___mclass].val; /* _mclass on <var_a:MClassDef> */
+if (unlikely(var15 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 474);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 492);
 show_backtrace(1);
 }
-var12 = var14;
-RET_LABEL13:(void)0;
+var13 = var15;
+RET_LABEL14:(void)0;
 }
 }
-var_ca = var12;
+var_ca = var13;
 {
 { /* Inline model#MClassDef#mclass (var_b) on <var_b:MClassDef> */
-var17 = var_b->attrs[COLOR_model__MClassDef___mclass].val; /* _mclass on <var_b:MClassDef> */
-if (unlikely(var17 == NULL)) {
+var18 = var_b->attrs[COLOR_model__MClassDef___mclass].val; /* _mclass on <var_b:MClassDef> */
+if (unlikely(var18 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 474);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 492);
 show_backtrace(1);
 }
-var15 = var17;
-RET_LABEL16:(void)0;
+var16 = var18;
+RET_LABEL17:(void)0;
 }
 }
-var_cb = var15;
+var_cb = var16;
 {
 { /* Inline kernel#Object#!= (var_ca,var_cb) on <var_ca:MClass> */
 var_other = var_cb;
 {
-var22 = ((short int (*)(val*, val*))(var_ca->class->vft[COLOR_kernel__Object___61d_61d]))(var_ca, var_other) /* == on <var_ca:MClass>*/;
-var21 = var22;
+var23 = ((short int (*)(val*, val*))(var_ca->class->vft[COLOR_kernel__Object___61d_61d]))(var_ca, var_other) /* == on <var_ca:MClass>*/;
+var22 = var23;
 }
-var23 = !var21;
-var19 = var23;
-goto RET_LABEL20;
-RET_LABEL20:(void)0;
+var24 = !var22;
+var20 = var24;
+goto RET_LABEL21;
+RET_LABEL21:(void)0;
 }
-var18 = var19;
+var19 = var20;
 }
-if (var18){
+if (var19){
 {
 { /* Inline model#MPropDefSorter#mmodule (self) on <self:MPropDefSorter> */
-var26 = self->attrs[COLOR_model__MPropDefSorter___mmodule].val; /* _mmodule on <self:MPropDefSorter> */
-if (unlikely(var26 == NULL)) {
+var27 = self->attrs[COLOR_model__MPropDefSorter___mmodule].val; /* _mmodule on <self:MPropDefSorter> */
+if (unlikely(var27 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mmodule");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 299);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 311);
 show_backtrace(1);
 }
-var24 = var26;
-RET_LABEL25:(void)0;
+var25 = var27;
+RET_LABEL26:(void)0;
 }
 }
 {
-var27 = model__MModule__flatten_mclass_hierarchy(var24);
+var28 = model__MModule__flatten_mclass_hierarchy(var25);
 }
 {
-var28 = poset__POSet__compare(var27, var_ca, var_cb);
+var29 = poset__POSet__compare(var28, var_ca, var_cb);
 }
-var = var28;
+var = var29;
 goto RET_LABEL;
 } else {
 }
 {
 { /* Inline model#MPropDefSorter#mmodule (self) on <self:MPropDefSorter> */
-var31 = self->attrs[COLOR_model__MPropDefSorter___mmodule].val; /* _mmodule on <self:MPropDefSorter> */
-if (unlikely(var31 == NULL)) {
+var32 = self->attrs[COLOR_model__MPropDefSorter___mmodule].val; /* _mmodule on <self:MPropDefSorter> */
+if (unlikely(var32 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mmodule");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 299);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 311);
 show_backtrace(1);
 }
-var29 = var31;
-RET_LABEL30:(void)0;
+var30 = var32;
+RET_LABEL31:(void)0;
 }
 }
 {
-{ /* Inline mmodule#MModule#model (var29) on <var29:MModule> */
-var34 = var29->attrs[COLOR_mmodule__MModule___model].val; /* _model on <var29:MModule> */
-if (unlikely(var34 == NULL)) {
+{ /* Inline mmodule#MModule#model (var30) on <var30:MModule> */
+var35 = var30->attrs[COLOR_mmodule__MModule___model].val; /* _model on <var30:MModule> */
+if (unlikely(var35 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _model");
-PRINT_ERROR(" (%s:%d)\n", "src/model/mmodule.nit", 74);
+PRINT_ERROR(" (%s:%d)\n", "model/mmodule.nit", 72);
 show_backtrace(1);
 }
-var32 = var34;
-RET_LABEL33:(void)0;
+var33 = var35;
+RET_LABEL34:(void)0;
 }
 }
 {
-{ /* Inline model#Model#mclassdef_hierarchy (var32) on <var32:Model> */
-var37 = var32->attrs[COLOR_model__Model___mclassdef_hierarchy].val; /* _mclassdef_hierarchy on <var32:Model> */
-if (unlikely(var37 == NULL)) {
+{ /* Inline model#Model#mclassdef_hierarchy (var33) on <var33:Model> */
+var38 = var33->attrs[COLOR_model__Model___mclassdef_hierarchy].val; /* _mclassdef_hierarchy on <var33:Model> */
+if (unlikely(var38 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclassdef_hierarchy");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 42);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 40);
 show_backtrace(1);
 }
-var35 = var37;
-RET_LABEL36:(void)0;
+var36 = var38;
+RET_LABEL37:(void)0;
 }
 }
 {
-var38 = poset__POSet__compare(var35, var_a, var_b);
+var39 = poset__POSet__compare(var36, var_a, var_b);
 }
-var = var38;
+var = var39;
 goto RET_LABEL;
 RET_LABEL:;
 return var;
@@ -2306,15 +2651,19 @@ var = var1;
 RET_LABEL:;
 return var;
 }
-/* method model#MPropDefSorter#init for (self: MPropDefSorter, MModule) */
-void model__MPropDefSorter__init(val* self, val* p0) {
-self->attrs[COLOR_model__MPropDefSorter___mmodule].val = p0; /* _mmodule on <self:MPropDefSorter> */
+/* method model#MPropDefSorter#init for (self: MPropDefSorter) */
+void model__MPropDefSorter__init(val* self) {
+{
+((void (*)(val*))(self->class->vft[COLOR_model__MPropDefSorter__init]))(self) /* init on <self:MPropDefSorter>*/;
+}
 RET_LABEL:;
 }
-/* method model#MPropDefSorter#init for (self: Object, MModule) */
-void VIRTUAL_model__MPropDefSorter__init(val* self, val* p0) {
-{ /* Inline model#MPropDefSorter#init (self,p0) on <self:Object(MPropDefSorter)> */
-self->attrs[COLOR_model__MPropDefSorter___mmodule].val = p0; /* _mmodule on <self:Object(MPropDefSorter)> */
+/* method model#MPropDefSorter#init for (self: Object) */
+void VIRTUAL_model__MPropDefSorter__init(val* self) {
+{ /* Inline model#MPropDefSorter#init (self) on <self:Object(MPropDefSorter)> */
+{
+((void (*)(val*))(self->class->vft[COLOR_model__MPropDefSorter__init]))(self) /* init on <self:Object(MPropDefSorter)>*/;
+}
 RET_LABEL1:(void)0;
 }
 RET_LABEL:;
@@ -2326,7 +2675,7 @@ val* var1 /* : MModule */;
 var1 = self->attrs[COLOR_model__MClass___intro_mmodule].val; /* _intro_mmodule on <self:MClass> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _intro_mmodule");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 335);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 347);
 show_backtrace(1);
 }
 var = var1;
@@ -2342,7 +2691,7 @@ val* var3 /* : MModule */;
 var3 = self->attrs[COLOR_model__MClass___intro_mmodule].val; /* _intro_mmodule on <self:Object(MClass)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _intro_mmodule");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 335);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 347);
 show_backtrace(1);
 }
 var1 = var3;
@@ -2372,7 +2721,7 @@ val* var1 /* : String */;
 var1 = self->attrs[COLOR_model__MClass___name].val; /* _name on <self:MClass> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _name");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 340);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 352);
 show_backtrace(1);
 }
 var = var1;
@@ -2388,7 +2737,7 @@ val* var3 /* : String */;
 var3 = self->attrs[COLOR_model__MClass___name].val; /* _name on <self:Object(MClass)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _name");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 340);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 352);
 show_backtrace(1);
 }
 var1 = var3;
@@ -2433,7 +2782,7 @@ val* var15 /* : String */;
 var3 = self->attrs[COLOR_model__MClass___intro_mmodule].val; /* _intro_mmodule on <self:MClass> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _intro_mmodule");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 335);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 347);
 show_backtrace(1);
 }
 var1 = var3;
@@ -2457,7 +2806,7 @@ varonce = var5;
 var11 = self->attrs[COLOR_model__MClass___name].val; /* _name on <self:MClass> */
 if (unlikely(var11 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _name");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 340);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 352);
 show_backtrace(1);
 }
 var9 = var11;
@@ -2528,6 +2877,52 @@ RET_LABEL1:(void)0;
 }
 RET_LABEL:;
 }
+/* method model#MClass#mparameters for (self: MClass): Array[MParameterType] */
+val* model__MClass__mparameters(val* self) {
+val* var /* : Array[MParameterType] */;
+val* var1 /* : Array[MParameterType] */;
+var1 = self->attrs[COLOR_model__MClass___mparameters].val; /* _mparameters on <self:MClass> */
+if (unlikely(var1 == NULL)) {
+PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mparameters");
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 367);
+show_backtrace(1);
+}
+var = var1;
+RET_LABEL:;
+return var;
+}
+/* method model#MClass#mparameters for (self: Object): Array[MParameterType] */
+val* VIRTUAL_model__MClass__mparameters(val* self) {
+val* var /* : Array[MParameterType] */;
+val* var1 /* : Array[MParameterType] */;
+val* var3 /* : Array[MParameterType] */;
+{ /* Inline model#MClass#mparameters (self) on <self:Object(MClass)> */
+var3 = self->attrs[COLOR_model__MClass___mparameters].val; /* _mparameters on <self:Object(MClass)> */
+if (unlikely(var3 == NULL)) {
+PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mparameters");
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 367);
+show_backtrace(1);
+}
+var1 = var3;
+RET_LABEL2:(void)0;
+}
+var = var1;
+RET_LABEL:;
+return var;
+}
+/* method model#MClass#mparameters= for (self: MClass, Array[MParameterType]) */
+void model__MClass__mparameters_61d(val* self, val* p0) {
+self->attrs[COLOR_model__MClass___mparameters].val = p0; /* _mparameters on <self:MClass> */
+RET_LABEL:;
+}
+/* method model#MClass#mparameters= for (self: Object, Array[MParameterType]) */
+void VIRTUAL_model__MClass__mparameters_61d(val* self, val* p0) {
+{ /* Inline model#MClass#mparameters= (self,p0) on <self:Object(MClass)> */
+self->attrs[COLOR_model__MClass___mparameters].val = p0; /* _mparameters on <self:Object(MClass)> */
+RET_LABEL1:(void)0;
+}
+RET_LABEL:;
+}
 /* method model#MClass#kind for (self: MClass): MClassKind */
 val* model__MClass__kind(val* self) {
 val* var /* : MClassKind */;
@@ -2535,7 +2930,7 @@ val* var1 /* : MClassKind */;
 var1 = self->attrs[COLOR_model__MClass___kind].val; /* _kind on <self:MClass> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _kind");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 355);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 371);
 show_backtrace(1);
 }
 var = var1;
@@ -2551,7 +2946,7 @@ val* var3 /* : MClassKind */;
 var3 = self->attrs[COLOR_model__MClass___kind].val; /* _kind on <self:Object(MClass)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _kind");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 355);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 371);
 show_backtrace(1);
 }
 var1 = var3;
@@ -2581,7 +2976,7 @@ val* var1 /* : MVisibility */;
 var1 = self->attrs[COLOR_model__MClass___visibility].val; /* _visibility on <self:MClass> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _visibility");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 359);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 375);
 show_backtrace(1);
 }
 var = var1;
@@ -2597,7 +2992,7 @@ val* var3 /* : MVisibility */;
 var3 = self->attrs[COLOR_model__MClass___visibility].val; /* _visibility on <self:Object(MClass)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _visibility");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 359);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 375);
 show_backtrace(1);
 }
 var1 = var3;
@@ -2620,245 +3015,344 @@ RET_LABEL1:(void)0;
 }
 RET_LABEL:;
 }
-/* method model#MClass#init for (self: MClass, MModule, String, Int, MClassKind, MVisibility) */
-void model__MClass__init(val* self, val* p0, val* p1, long p2, val* p3, val* p4) {
+/* method model#MClass#init for (self: MClass, MModule, String, nullable Array[String], MClassKind, MVisibility) */
+void model__MClass__init(val* self, val* p0, val* p1, val* p2, val* p3, val* p4) {
 val* var_intro_mmodule /* var intro_mmodule: MModule */;
 val* var_name /* var name: String */;
-long var_arity /* var arity: Int */;
+val* var_parameter_names /* var parameter_names: nullable Array[String] */;
 val* var_kind /* var kind: MClassKind */;
 val* var_visibility /* var visibility: MVisibility */;
-val* var /* : Array[MClass] */;
-val* var8 /* : Array[MClass] */;
-val* var9 /* : Model */;
-val* var11 /* : Model */;
-val* var_model /* var model: Model */;
-val* var12 /* : MultiHashMap[String, MClass] */;
-val* var14 /* : MultiHashMap[String, MClass] */;
+val* var /* : null */;
+short int var3 /* : Bool */;
+short int var4 /* : Bool */;
+long var5 /* : Int */;
+long var7 /* : Int */;
+long var9 /* : Int */;
+val* var13 /* : Array[MClass] */;
 val* var15 /* : Array[MClass] */;
-val* var17 /* : Array[MClass] */;
-long var18 /* : Int */;
-short int var19 /* : Bool */;
-short int var21 /* : Bool */;
+val* var16 /* : Model */;
+val* var18 /* : Model */;
+val* var_model /* var model: Model */;
+val* var19 /* : MultiHashMap[String, MClass] */;
+val* var21 /* : MultiHashMap[String, MClass] */;
+val* var22 /* : Array[MClass] */;
+val* var24 /* : Array[MClass] */;
+long var25 /* : Int */;
+long var27 /* : Int */;
+long var28 /* : Int */;
+short int var29 /* : Bool */;
+short int var31 /* : Bool */;
 int cltype;
 int idtype;
 const char* var_class_name;
-short int var22 /* : Bool */;
-val* var23 /* : Array[MParameterType] */;
+short int var32 /* : Bool */;
+val* var33 /* : null */;
+short int var34 /* : Bool */;
+short int var35 /* : Bool */;
+val* var_other /* var other: nullable Object */;
+short int var37 /* : Bool */;
+short int var38 /* : Bool */;
+short int var39 /* : Bool */;
+val* var40 /* : Array[MParameterType] */;
 val* var_mparametertypes /* var mparametertypes: Array[MParameterType] */;
-val* var24 /* : Range[Int] */;
-long var25 /* : Int */;
-val* var26 /* : Discrete */;
-val* var27 /* : Discrete */;
-val* var28 /* : Iterator[Discrete] */;
-short int var29 /* : Bool */;
-val* var30 /* : nullable Object */;
+long var41 /* : Int */;
 long var_i /* var i: Int */;
-long var31 /* : Int */;
-val* var32 /* : MParameterType */;
+long var42 /* : Int */;
+long var44 /* : Int */;
+long var_ /* var : Int */;
+short int var45 /* : Bool */;
+short int var47 /* : Bool */;
+int cltype48;
+int idtype49;
+const char* var_class_name50;
+short int var51 /* : Bool */;
+val* var52 /* : MParameterType */;
+val* var53 /* : nullable Object */;
 val* var_mparametertype /* var mparametertype: MParameterType */;
-val* var33 /* : MGenericType */;
+long var54 /* : Int */;
+long var55 /* : Int */;
+val* var57 /* : MGenericType */;
 val* var_mclass_type /* var mclass_type: MGenericType */;
-val* var35 /* : Array[MGenericType] */;
-val* var37 /* : Array[MGenericType] */;
-val* var38 /* : MClassType */;
+val* var59 /* : Array[MGenericType] */;
+val* var61 /* : Array[MGenericType] */;
+val* var62 /* : MClassType */;
 {
-{ /* Inline model_base#MEntity#init (self) on <self:MClass> */
-RET_LABEL1:(void)0;
-}
+((void (*)(val*))(self->class->vft[COLOR_kernel__Object__init]))(self) /* init on <self:MClass>*/;
 }
 var_intro_mmodule = p0;
 var_name = p1;
-var_arity = p2;
+var_parameter_names = p2;
 var_kind = p3;
 var_visibility = p4;
 {
 { /* Inline model#MClass#intro_mmodule= (self,var_intro_mmodule) on <self:MClass> */
 self->attrs[COLOR_model__MClass___intro_mmodule].val = var_intro_mmodule; /* _intro_mmodule on <self:MClass> */
-RET_LABEL2:(void)0;
+RET_LABEL1:(void)0;
 }
 }
 {
 { /* Inline model#MClass#name= (self,var_name) on <self:MClass> */
 self->attrs[COLOR_model__MClass___name].val = var_name; /* _name on <self:MClass> */
-RET_LABEL3:(void)0;
+RET_LABEL2:(void)0;
+}
+}
+var = NULL;
+if (var_parameter_names == NULL) {
+var3 = 1; /* is null */
+} else {
+var3 = 0; /* arg is null but recv is not */
 }
+if (0) {
+var4 = array__Array___61d_61d(var_parameter_names, var);
+var3 = var4;
 }
+if (var3){
+var5 = 0;
 {
-{ /* Inline model#MClass#arity= (self,var_arity) on <self:MClass> */
-self->attrs[COLOR_model__MClass___arity].l = var_arity; /* _arity on <self:MClass> */
-RET_LABEL4:(void)0;
+{ /* Inline model#MClass#arity= (self,var5) on <self:MClass> */
+self->attrs[COLOR_model__MClass___arity].l = var5; /* _arity on <self:MClass> */
+RET_LABEL6:(void)0;
+}
+}
+} else {
+{
+{ /* Inline array#AbstractArrayRead#length (var_parameter_names) on <var_parameter_names:nullable Array[String](Array[String])> */
+var9 = var_parameter_names->attrs[COLOR_array__AbstractArrayRead___length].l; /* _length on <var_parameter_names:nullable Array[String](Array[String])> */
+var7 = var9;
+RET_LABEL8:(void)0;
+}
+}
+{
+{ /* Inline model#MClass#arity= (self,var7) on <self:MClass> */
+self->attrs[COLOR_model__MClass___arity].l = var7; /* _arity on <self:MClass> */
+RET_LABEL10:(void)0;
+}
 }
 }
 {
 { /* Inline model#MClass#kind= (self,var_kind) on <self:MClass> */
 self->attrs[COLOR_model__MClass___kind].val = var_kind; /* _kind on <self:MClass> */
-RET_LABEL5:(void)0;
+RET_LABEL11:(void)0;
 }
 }
 {
 { /* Inline model#MClass#visibility= (self,var_visibility) on <self:MClass> */
 self->attrs[COLOR_model__MClass___visibility].val = var_visibility; /* _visibility on <self:MClass> */
-RET_LABEL6:(void)0;
+RET_LABEL12:(void)0;
 }
 }
 {
 { /* Inline model#MModule#intro_mclasses (var_intro_mmodule) on <var_intro_mmodule:MModule> */
-var8 = var_intro_mmodule->attrs[COLOR_model__MModule___intro_mclasses].val; /* _intro_mclasses on <var_intro_mmodule:MModule> */
-if (unlikely(var8 == NULL)) {
+var15 = var_intro_mmodule->attrs[COLOR_model__MModule___intro_mclasses].val; /* _intro_mclasses on <var_intro_mmodule:MModule> */
+if (unlikely(var15 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _intro_mclasses");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 138);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 136);
 show_backtrace(1);
 }
-var = var8;
-RET_LABEL7:(void)0;
+var13 = var15;
+RET_LABEL14:(void)0;
 }
 }
 {
-array__Array__add(var, self); /* Direct call array#Array#add on <var:Array[MClass]>*/
+array__Array__add(var13, self); /* Direct call array#Array#add on <var13:Array[MClass]>*/
 }
 {
 { /* Inline mmodule#MModule#model (var_intro_mmodule) on <var_intro_mmodule:MModule> */
-var11 = var_intro_mmodule->attrs[COLOR_mmodule__MModule___model].val; /* _model on <var_intro_mmodule:MModule> */
-if (unlikely(var11 == NULL)) {
+var18 = var_intro_mmodule->attrs[COLOR_mmodule__MModule___model].val; /* _model on <var_intro_mmodule:MModule> */
+if (unlikely(var18 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _model");
-PRINT_ERROR(" (%s:%d)\n", "src/model/mmodule.nit", 74);
+PRINT_ERROR(" (%s:%d)\n", "model/mmodule.nit", 72);
 show_backtrace(1);
 }
-var9 = var11;
-RET_LABEL10:(void)0;
+var16 = var18;
+RET_LABEL17:(void)0;
 }
 }
-var_model = var9;
+var_model = var16;
 {
 { /* Inline model#Model#mclasses_by_name (var_model) on <var_model:Model> */
-var14 = var_model->attrs[COLOR_model__Model___mclasses_by_name].val; /* _mclasses_by_name on <var_model:Model> */
-if (unlikely(var14 == NULL)) {
+var21 = var_model->attrs[COLOR_model__Model___mclasses_by_name].val; /* _mclasses_by_name on <var_model:Model> */
+if (unlikely(var21 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclasses_by_name");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 68);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 66);
 show_backtrace(1);
 }
-var12 = var14;
-RET_LABEL13:(void)0;
+var19 = var21;
+RET_LABEL20:(void)0;
 }
 }
 {
-more_collections__MultiHashMap__add_one(var12, var_name, self); /* Direct call more_collections#MultiHashMap#add_one on <var12:MultiHashMap[String, MClass]>*/
+more_collections__MultiHashMap__add_one(var19, var_name, self); /* Direct call more_collections#MultiHashMap#add_one on <var19:MultiHashMap[String, MClass]>*/
 }
 {
 { /* Inline model#Model#mclasses (var_model) on <var_model:Model> */
-var17 = var_model->attrs[COLOR_model__Model___mclasses].val; /* _mclasses on <var_model:Model> */
-if (unlikely(var17 == NULL)) {
+var24 = var_model->attrs[COLOR_model__Model___mclasses].val; /* _mclasses on <var_model:Model> */
+if (unlikely(var24 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclasses");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 36);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 34);
 show_backtrace(1);
 }
-var15 = var17;
-RET_LABEL16:(void)0;
+var22 = var24;
+RET_LABEL23:(void)0;
 }
 }
 {
-array__Array__add(var15, self); /* Direct call array#Array#add on <var15:Array[MClass]>*/
+array__Array__add(var22, self); /* Direct call array#Array#add on <var22:Array[MClass]>*/
 }
-var18 = 0;
 {
-{ /* Inline kernel#Int#> (var_arity,var18) on <var_arity:Int> */
-/* Covariant cast for argument 0 (i) <var18:Int> isa OTHER */
-/* <var18:Int> isa OTHER */
-var21 = 1; /* easy <var18:Int> isa OTHER*/
-if (unlikely(!var21)) {
+{ /* Inline model#MClass#arity (self) on <self:MClass> */
+var27 = self->attrs[COLOR_model__MClass___arity].l; /* _arity on <self:MClass> */
+var25 = var27;
+RET_LABEL26:(void)0;
+}
+}
+var28 = 0;
+{
+{ /* Inline kernel#Int#> (var25,var28) on <var25:Int> */
+/* Covariant cast for argument 0 (i) <var28:Int> isa OTHER */
+/* <var28:Int> isa OTHER */
+var31 = 1; /* easy <var28:Int> isa OTHER*/
+if (unlikely(!var31)) {
 var_class_name = type_kernel__Int.name;
 PRINT_ERROR("Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name);
-PRINT_ERROR(" (%s:%d)\n", "lib/standard/kernel.nit", 327);
+PRINT_ERROR(" (%s:%d)\n", "../lib/standard/kernel.nit", 373);
 show_backtrace(1);
 }
-var22 = var_arity > var18;
-var19 = var22;
-goto RET_LABEL20;
-RET_LABEL20:(void)0;
+var32 = var25 > var28;
+var29 = var32;
+goto RET_LABEL30;
+RET_LABEL30:(void)0;
 }
 }
-if (var19){
-var23 = NEW_array__Array(&type_array__Arraymodel__MParameterType);
+if (var29){
+var33 = NULL;
+if (var_parameter_names == NULL) {
+var34 = 0; /* is null */
+} else {
+var34 = 1; /* arg is null and recv is not */
+}
+if (0) {
+{ /* Inline kernel#Object#!= (var_parameter_names,var33) on <var_parameter_names:nullable Array[String]> */
+var_other = var33;
 {
-array__Array__init(var23); /* Direct call array#Array#init on <var23:Array[MParameterType]>*/
+var38 = ((short int (*)(val*, val*))(var_parameter_names->class->vft[COLOR_kernel__Object___61d_61d]))(var_parameter_names, var_other) /* == on <var_parameter_names:nullable Array[String](Array[String])>*/;
+var37 = var38;
 }
-var_mparametertypes = var23;
-var24 = NEW_range__Range(&type_range__Rangekernel__Int);
-var25 = 0;
+var39 = !var37;
+var35 = var39;
+goto RET_LABEL36;
+RET_LABEL36:(void)0;
+}
+var34 = var35;
+}
+if (unlikely(!var34)) {
+PRINT_ERROR("Runtime error: %s", "Assert failed");
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 397);
+show_backtrace(1);
+}
+var40 = NEW_array__Array(&type_array__Arraymodel__MParameterType);
 {
-var26 = BOX_kernel__Int(var25); /* autobox from Int to Discrete */
-var27 = BOX_kernel__Int(var_arity); /* autobox from Int to Discrete */
-range__Range__without_last(var24, var26, var27); /* Direct call range#Range#without_last on <var24:Range[Int]>*/
+((void (*)(val*))(var40->class->vft[COLOR_kernel__Object__init]))(var40) /* init on <var40:Array[MParameterType]>*/;
 }
+var_mparametertypes = var40;
+var41 = 0;
+var_i = var41;
 {
-var28 = range__Range__iterator(var24);
+{ /* Inline model#MClass#arity (self) on <self:MClass> */
+var44 = self->attrs[COLOR_model__MClass___arity].l; /* _arity on <self:MClass> */
+var42 = var44;
+RET_LABEL43:(void)0;
 }
+}
+var_ = var42;
 for(;;) {
 {
-var29 = ((short int (*)(val*))(var28->class->vft[COLOR_abstract_collection__Iterator__is_ok]))(var28) /* is_ok on <var28:Iterator[Discrete]>*/;
+{ /* Inline kernel#Int#< (var_i,var_) on <var_i:Int> */
+/* Covariant cast for argument 0 (i) <var_:Int> isa OTHER */
+/* <var_:Int> isa OTHER */
+var47 = 1; /* easy <var_:Int> isa OTHER*/
+if (unlikely(!var47)) {
+var_class_name50 = type_kernel__Int.name;
+PRINT_ERROR("Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name50);
+PRINT_ERROR(" (%s:%d)\n", "../lib/standard/kernel.nit", 371);
+show_backtrace(1);
 }
-if(!var29) break;
+var51 = var_i < var_;
+var45 = var51;
+goto RET_LABEL46;
+RET_LABEL46:(void)0;
+}
+}
+if (var45){
+var52 = NEW_model__MParameterType(&type_model__MParameterType);
 {
-var30 = ((val* (*)(val*))(var28->class->vft[COLOR_abstract_collection__Iterator__item]))(var28) /* item on <var28:Iterator[Discrete]>*/;
+var53 = array__Array___91d_93d(var_parameter_names, var_i);
 }
-var31 = ((struct instance_kernel__Int*)var30)->value; /* autounbox from nullable Object to Int */;
-var_i = var31;
-var32 = NEW_model__MParameterType(&type_model__MParameterType);
 {
-model__MParameterType__init(var32, self, var_i); /* Direct call model#MParameterType#init on <var32:MParameterType>*/
+model__MParameterType__init(var52, self, var_i, var53); /* Direct call model#MParameterType#init on <var52:MParameterType>*/
 }
-var_mparametertype = var32;
+var_mparametertype = var52;
 {
 array__Array__add(var_mparametertypes, var_mparametertype); /* Direct call array#Array#add on <var_mparametertypes:Array[MParameterType]>*/
 }
-CONTINUE_label: (void)0;
+var54 = 1;
 {
-((void (*)(val*))(var28->class->vft[COLOR_abstract_collection__Iterator__next]))(var28) /* next on <var28:Iterator[Discrete]>*/;
+var55 = kernel__Int__successor(var_i, var54);
+}
+var_i = var55;
+} else {
+goto BREAK_label;
 }
 }
 BREAK_label: (void)0;
-var33 = NEW_model__MGenericType(&type_model__MGenericType);
 {
-model__MGenericType__init(var33, self, var_mparametertypes); /* Direct call model#MGenericType#init on <var33:MGenericType>*/
+{ /* Inline model#MClass#mparameters= (self,var_mparametertypes) on <self:MClass> */
+self->attrs[COLOR_model__MClass___mparameters].val = var_mparametertypes; /* _mparameters on <self:MClass> */
+RET_LABEL56:(void)0;
+}
+}
+var57 = NEW_model__MGenericType(&type_model__MGenericType);
+{
+model__MGenericType__init(var57, self, var_mparametertypes); /* Direct call model#MGenericType#init on <var57:MGenericType>*/
 }
-var_mclass_type = var33;
+var_mclass_type = var57;
 {
 { /* Inline model#MClass#mclass_type= (self,var_mclass_type) on <self:MClass> */
 self->attrs[COLOR_model__MClass___mclass_type].val = var_mclass_type; /* _mclass_type on <self:MClass> */
-RET_LABEL34:(void)0;
+RET_LABEL58:(void)0;
 }
 }
 {
 { /* Inline model#MClass#get_mtype_cache (self) on <self:MClass> */
-var37 = self->attrs[COLOR_model__MClass___get_mtype_cache].val; /* _get_mtype_cache on <self:MClass> */
-if (unlikely(var37 == NULL)) {
+var61 = self->attrs[COLOR_model__MClass___get_mtype_cache].val; /* _get_mtype_cache on <self:MClass> */
+if (unlikely(var61 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _get_mtype_cache");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 452);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 470);
 show_backtrace(1);
 }
-var35 = var37;
-RET_LABEL36:(void)0;
+var59 = var61;
+RET_LABEL60:(void)0;
 }
 }
 {
-array__Array__add(var35, var_mclass_type); /* Direct call array#Array#add on <var35:Array[MGenericType]>*/
+array__Array__add(var59, var_mclass_type); /* Direct call array#Array#add on <var59:Array[MGenericType]>*/
 }
 } else {
-var38 = NEW_model__MClassType(&type_model__MClassType);
+var62 = NEW_model__MClassType(&type_model__MClassType);
 {
-model__MClassType__init(var38, self); /* Direct call model#MClassType#init on <var38:MClassType>*/
+model__MClassType__init(var62, self); /* Direct call model#MClassType#init on <var62:MClassType>*/
 }
 {
-{ /* Inline model#MClass#mclass_type= (self,var38) on <self:MClass> */
-self->attrs[COLOR_model__MClass___mclass_type].val = var38; /* _mclass_type on <self:MClass> */
-RET_LABEL39:(void)0;
+{ /* Inline model#MClass#mclass_type= (self,var62) on <self:MClass> */
+self->attrs[COLOR_model__MClass___mclass_type].val = var62; /* _mclass_type on <self:MClass> */
+RET_LABEL63:(void)0;
 }
 }
 }
 RET_LABEL:;
 }
-/* method model#MClass#init for (self: Object, MModule, String, Int, MClassKind, MVisibility) */
-void VIRTUAL_model__MClass__init(val* self, val* p0, val* p1, long p2, val* p3, val* p4) {
+/* method model#MClass#init for (self: Object, MModule, String, nullable Array[String], MClassKind, MVisibility) */
+void VIRTUAL_model__MClass__init(val* self, val* p0, val* p1, val* p2, val* p3, val* p4) {
 model__MClass__init(self, p0, p1, p2, p3, p4); /* Direct call model#MClass#init on <self:Object(MClass)>*/
 RET_LABEL:;
 }
@@ -2874,7 +3368,7 @@ val* var6 /* : Model */;
 var3 = self->attrs[COLOR_model__MClass___intro_mmodule].val; /* _intro_mmodule on <self:MClass> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _intro_mmodule");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 335);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 347);
 show_backtrace(1);
 }
 var1 = var3;
@@ -2886,7 +3380,7 @@ RET_LABEL2:(void)0;
 var6 = var1->attrs[COLOR_mmodule__MModule___model].val; /* _model on <var1:MModule> */
 if (unlikely(var6 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _model");
-PRINT_ERROR(" (%s:%d)\n", "src/model/mmodule.nit", 74);
+PRINT_ERROR(" (%s:%d)\n", "model/mmodule.nit", 72);
 show_backtrace(1);
 }
 var4 = var6;
@@ -2914,7 +3408,7 @@ val* var1 /* : Array[MClassDef] */;
 var1 = self->attrs[COLOR_model__MClass___mclassdefs].val; /* _mclassdefs on <self:MClass> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclassdefs");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 392);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 414);
 show_backtrace(1);
 }
 var = var1;
@@ -2930,7 +3424,7 @@ val* var3 /* : Array[MClassDef] */;
 var3 = self->attrs[COLOR_model__MClass___mclassdefs].val; /* _mclassdefs on <self:Object(MClass)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclassdefs");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 392);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 414);
 show_backtrace(1);
 }
 var1 = var3;
@@ -2950,7 +3444,7 @@ val* var3 /* : String */;
 var3 = self->attrs[COLOR_model__MClass___name].val; /* _name on <self:MClass> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _name");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 340);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 352);
 show_backtrace(1);
 }
 var1 = var3;
@@ -2974,51 +3468,14 @@ return var;
 /* method model#MClass#intro for (self: MClass): MClassDef */
 val* model__MClass__intro(val* self) {
 val* var /* : MClassDef */;
-val* var1 /* : Array[MClassDef] */;
-val* var3 /* : Array[MClassDef] */;
-short int var4 /* : Bool */;
-short int var5 /* : Bool */;
-val* var6 /* : Array[MClassDef] */;
-val* var8 /* : Array[MClassDef] */;
-val* var9 /* : nullable Object */;
-{
-{ /* Inline model#MClass#mclassdefs (self) on <self:MClass> */
-var3 = self->attrs[COLOR_model__MClass___mclassdefs].val; /* _mclassdefs on <self:MClass> */
-if (unlikely(var3 == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclassdefs");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 392);
-show_backtrace(1);
-}
-var1 = var3;
-RET_LABEL2:(void)0;
-}
-}
-{
-var4 = array__AbstractArrayRead__is_empty(var1);
-}
-var5 = !var4;
-if (unlikely(!var5)) {
-PRINT_ERROR("Runtime error: %s", "Assert \'has_a_first_definition\' failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 404);
-show_backtrace(1);
-}
-{
-{ /* Inline model#MClass#mclassdefs (self) on <self:MClass> */
-var8 = self->attrs[COLOR_model__MClass___mclassdefs].val; /* _mclassdefs on <self:MClass> */
-if (unlikely(var8 == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclassdefs");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 392);
+val* var1 /* : MClassDef */;
+var1 = self->attrs[COLOR_model__MClass___intro].val; /* _intro on <self:MClass> */
+if (unlikely(var1 == NULL)) {
+PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _intro");
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 420);
 show_backtrace(1);
 }
-var6 = var8;
-RET_LABEL7:(void)0;
-}
-}
-{
-var9 = abstract_collection__SequenceRead__first(var6);
-}
-var = var9;
-goto RET_LABEL;
+var = var1;
 RET_LABEL:;
 return var;
 }
@@ -3026,15 +3483,38 @@ return var;
 val* VIRTUAL_model__MClass__intro(val* self) {
 val* var /* : MClassDef */;
 val* var1 /* : MClassDef */;
-var1 = model__MClass__intro(self);
+val* var3 /* : MClassDef */;
+{ /* Inline model#MClass#intro (self) on <self:Object(MClass)> */
+var3 = self->attrs[COLOR_model__MClass___intro].val; /* _intro on <self:Object(MClass)> */
+if (unlikely(var3 == NULL)) {
+PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _intro");
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 420);
+show_backtrace(1);
+}
+var1 = var3;
+RET_LABEL2:(void)0;
+}
 var = var1;
 RET_LABEL:;
 return var;
 }
-/* method model#MClass#in_hierarchy for (self: MClass, MModule): POSetElement[MClass] */
-val* model__MClass__in_hierarchy(val* self, val* p0) {
-val* var /* : POSetElement[MClass] */;
-val* var_mmodule /* var mmodule: MModule */;
+/* method model#MClass#intro= for (self: MClass, MClassDef) */
+void model__MClass__intro_61d(val* self, val* p0) {
+self->attrs[COLOR_model__MClass___intro].val = p0; /* _intro on <self:MClass> */
+RET_LABEL:;
+}
+/* method model#MClass#intro= for (self: Object, MClassDef) */
+void VIRTUAL_model__MClass__intro_61d(val* self, val* p0) {
+{ /* Inline model#MClass#intro= (self,p0) on <self:Object(MClass)> */
+self->attrs[COLOR_model__MClass___intro].val = p0; /* _intro on <self:Object(MClass)> */
+RET_LABEL1:(void)0;
+}
+RET_LABEL:;
+}
+/* method model#MClass#in_hierarchy for (self: MClass, MModule): POSetElement[MClass] */
+val* model__MClass__in_hierarchy(val* self, val* p0) {
+val* var /* : POSetElement[MClass] */;
+val* var_mmodule /* var mmodule: MModule */;
 val* var1 /* : POSet[MClass] */;
 val* var2 /* : POSetElement[Object] */;
 var_mmodule = p0;
@@ -3065,7 +3545,7 @@ val* var1 /* : MClassType */;
 var1 = self->attrs[COLOR_model__MClass___mclass_type].val; /* _mclass_type on <self:MClass> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass_type");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 417);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 435);
 show_backtrace(1);
 }
 var = var1;
@@ -3081,7 +3561,7 @@ val* var3 /* : MClassType */;
 var3 = self->attrs[COLOR_model__MClass___mclass_type].val; /* _mclass_type on <self:Object(MClass)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass_type");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 417);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 435);
 show_backtrace(1);
 }
 var1 = var3;
@@ -3109,162 +3589,178 @@ val* model__MClass__get_mtype(val* self, val* p0) {
 val* var /* : MClassType */;
 val* var_mtype_arguments /* var mtype_arguments: Array[MType] */;
 long var1 /* : Int */;
-long var2 /* : Int */;
+long var3 /* : Int */;
 long var4 /* : Int */;
-short int var5 /* : Bool */;
-short int var6 /* : Bool */;
+long var6 /* : Int */;
+short int var7 /* : Bool */;
 short int var8 /* : Bool */;
-long var9 /* : Int */;
+short int var10 /* : Bool */;
 long var11 /* : Int */;
-long var12 /* : Int */;
-short int var13 /* : Bool */;
-short int var14 /* : Bool */;
+long var13 /* : Int */;
+long var14 /* : Int */;
+short int var15 /* : Bool */;
 short int var16 /* : Bool */;
-val* var17 /* : MClassType */;
+short int var18 /* : Bool */;
 val* var19 /* : MClassType */;
-val* var20 /* : Array[MGenericType] */;
+val* var21 /* : MClassType */;
 val* var22 /* : Array[MGenericType] */;
-val* var23 /* : ArrayIterator[nullable Object] */;
-short int var24 /* : Bool */;
-val* var25 /* : nullable Object */;
+val* var24 /* : Array[MGenericType] */;
+val* var_ /* var : Array[MGenericType] */;
+val* var25 /* : ArrayIterator[nullable Object] */;
+val* var_26 /* var : ArrayIterator[MGenericType] */;
+short int var27 /* : Bool */;
+val* var28 /* : nullable Object */;
 val* var_t /* var t: MGenericType */;
-val* var26 /* : Array[MType] */;
-val* var28 /* : Array[MType] */;
-short int var29 /* : Bool */;
-short int var30 /* : Bool */;
-val* var31 /* : MGenericType */;
+val* var29 /* : Array[MType] */;
+val* var31 /* : Array[MType] */;
+short int var32 /* : Bool */;
+short int var33 /* : Bool */;
+val* var35 /* : MGenericType */;
 val* var_res /* var res: MGenericType */;
-val* var32 /* : Array[MGenericType] */;
-val* var34 /* : Array[MGenericType] */;
+val* var36 /* : Array[MGenericType] */;
+val* var38 /* : Array[MGenericType] */;
 var_mtype_arguments = p0;
 {
-var1 = array__AbstractArrayRead__length(var_mtype_arguments);
+{ /* Inline array#AbstractArrayRead#length (var_mtype_arguments) on <var_mtype_arguments:Array[MType]> */
+var3 = var_mtype_arguments->attrs[COLOR_array__AbstractArrayRead___length].l; /* _length on <var_mtype_arguments:Array[MType]> */
+var1 = var3;
+RET_LABEL2:(void)0;
+}
 }
 {
 { /* Inline model#MClass#arity (self) on <self:MClass> */
-var4 = self->attrs[COLOR_model__MClass___arity].l; /* _arity on <self:MClass> */
-var2 = var4;
-RET_LABEL3:(void)0;
+var6 = self->attrs[COLOR_model__MClass___arity].l; /* _arity on <self:MClass> */
+var4 = var6;
+RET_LABEL5:(void)0;
 }
 }
 {
-{ /* Inline kernel#Int#== (var1,var2) on <var1:Int> */
-var8 = var1 == var2;
-var6 = var8;
-goto RET_LABEL7;
-RET_LABEL7:(void)0;
+{ /* Inline kernel#Int#== (var1,var4) on <var1:Int> */
+var10 = var1 == var4;
+var8 = var10;
+goto RET_LABEL9;
+RET_LABEL9:(void)0;
 }
-var5 = var6;
+var7 = var8;
 }
-if (unlikely(!var5)) {
+if (unlikely(!var7)) {
 PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 440);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 458);
 show_backtrace(1);
 }
 {
 { /* Inline model#MClass#arity (self) on <self:MClass> */
-var11 = self->attrs[COLOR_model__MClass___arity].l; /* _arity on <self:MClass> */
-var9 = var11;
-RET_LABEL10:(void)0;
+var13 = self->attrs[COLOR_model__MClass___arity].l; /* _arity on <self:MClass> */
+var11 = var13;
+RET_LABEL12:(void)0;
 }
 }
-var12 = 0;
+var14 = 0;
 {
-{ /* Inline kernel#Int#== (var9,var12) on <var9:Int> */
-var16 = var9 == var12;
-var14 = var16;
-goto RET_LABEL15;
-RET_LABEL15:(void)0;
+{ /* Inline kernel#Int#== (var11,var14) on <var11:Int> */
+var18 = var11 == var14;
+var16 = var18;
+goto RET_LABEL17;
+RET_LABEL17:(void)0;
 }
-var13 = var14;
+var15 = var16;
 }
-if (var13){
+if (var15){
 {
 { /* Inline model#MClass#mclass_type (self) on <self:MClass> */
-var19 = self->attrs[COLOR_model__MClass___mclass_type].val; /* _mclass_type on <self:MClass> */
-if (unlikely(var19 == NULL)) {
+var21 = self->attrs[COLOR_model__MClass___mclass_type].val; /* _mclass_type on <self:MClass> */
+if (unlikely(var21 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass_type");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 417);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 435);
 show_backtrace(1);
 }
-var17 = var19;
-RET_LABEL18:(void)0;
+var19 = var21;
+RET_LABEL20:(void)0;
 }
 }
-var = var17;
+var = var19;
 goto RET_LABEL;
 } else {
 }
 {
 { /* Inline model#MClass#get_mtype_cache (self) on <self:MClass> */
-var22 = self->attrs[COLOR_model__MClass___get_mtype_cache].val; /* _get_mtype_cache on <self:MClass> */
-if (unlikely(var22 == NULL)) {
+var24 = self->attrs[COLOR_model__MClass___get_mtype_cache].val; /* _get_mtype_cache on <self:MClass> */
+if (unlikely(var24 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _get_mtype_cache");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 452);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 470);
 show_backtrace(1);
 }
-var20 = var22;
-RET_LABEL21:(void)0;
+var22 = var24;
+RET_LABEL23:(void)0;
 }
 }
+var_ = var22;
 {
-var23 = array__AbstractArrayRead__iterator(var20);
+var25 = array__AbstractArrayRead__iterator(var_);
 }
+var_26 = var25;
 for(;;) {
 {
-var24 = array__ArrayIterator__is_ok(var23);
+var27 = array__ArrayIterator__is_ok(var_26);
 }
-if(!var24) break;
+if (var27){
 {
-var25 = array__ArrayIterator__item(var23);
+var28 = array__ArrayIterator__item(var_26);
 }
-var_t = var25;
+var_t = var28;
 {
 { /* Inline model#MClassType#arguments (var_t) on <var_t:MGenericType> */
-var28 = var_t->attrs[COLOR_model__MClassType___arguments].val; /* _arguments on <var_t:MGenericType> */
-if (unlikely(var28 == NULL)) {
+var31 = var_t->attrs[COLOR_model__MClassType___arguments].val; /* _arguments on <var_t:MGenericType> */
+if (unlikely(var31 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _arguments");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 979);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 996);
 show_backtrace(1);
 }
-var26 = var28;
-RET_LABEL27:(void)0;
+var29 = var31;
+RET_LABEL30:(void)0;
 }
 }
 {
-var30 = abstract_collection__SequenceRead___61d_61d(var26, var_mtype_arguments);
-var29 = var30;
+var33 = array__Array___61d_61d(var29, var_mtype_arguments);
+var32 = var33;
 }
-if (var29){
+if (var32){
 var = var_t;
 goto RET_LABEL;
 } else {
 }
-CONTINUE_label: (void)0;
 {
-array__ArrayIterator__next(var23); /* Direct call array#ArrayIterator#next on <var23:ArrayIterator[nullable Object]>*/
+array__ArrayIterator__next(var_26); /* Direct call array#ArrayIterator#next on <var_26:ArrayIterator[MGenericType]>*/
+}
+} else {
+goto BREAK_label;
 }
 }
 BREAK_label: (void)0;
-var31 = NEW_model__MGenericType(&type_model__MGenericType);
 {
-model__MGenericType__init(var31, self, var_mtype_arguments); /* Direct call model#MGenericType#init on <var31:MGenericType>*/
+{ /* Inline abstract_collection#Iterator#finish (var_26) on <var_26:ArrayIterator[MGenericType]> */
+RET_LABEL34:(void)0;
+}
+}
+var35 = NEW_model__MGenericType(&type_model__MGenericType);
+{
+model__MGenericType__init(var35, self, var_mtype_arguments); /* Direct call model#MGenericType#init on <var35:MGenericType>*/
 }
-var_res = var31;
+var_res = var35;
 {
 { /* Inline model#MClass#get_mtype_cache (self) on <self:MClass> */
-var34 = self->attrs[COLOR_model__MClass___get_mtype_cache].val; /* _get_mtype_cache on <self:MClass> */
-if (unlikely(var34 == NULL)) {
+var38 = self->attrs[COLOR_model__MClass___get_mtype_cache].val; /* _get_mtype_cache on <self:MClass> */
+if (unlikely(var38 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _get_mtype_cache");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 452);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 470);
 show_backtrace(1);
 }
-var32 = var34;
-RET_LABEL33:(void)0;
+var36 = var38;
+RET_LABEL37:(void)0;
 }
 }
 {
-array__Array__add(var32, var_res); /* Direct call array#Array#add on <var32:Array[MGenericType]>*/
+array__Array__add(var36, var_res); /* Direct call array#Array#add on <var36:Array[MGenericType]>*/
 }
 var = var_res;
 goto RET_LABEL;
@@ -3287,7 +3783,7 @@ val* var1 /* : Array[MGenericType] */;
 var1 = self->attrs[COLOR_model__MClass___get_mtype_cache].val; /* _get_mtype_cache on <self:MClass> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _get_mtype_cache");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 452);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 470);
 show_backtrace(1);
 }
 var = var1;
@@ -3303,7 +3799,7 @@ val* var3 /* : Array[MGenericType] */;
 var3 = self->attrs[COLOR_model__MClass___get_mtype_cache].val; /* _get_mtype_cache on <self:Object(MClass)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _get_mtype_cache");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 452);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 470);
 show_backtrace(1);
 }
 var1 = var3;
@@ -3320,7 +3816,7 @@ val* var1 /* : MModule */;
 var1 = self->attrs[COLOR_model__MClassDef___mmodule].val; /* _mmodule on <self:MClassDef> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mmodule");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 471);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 489);
 show_backtrace(1);
 }
 var = var1;
@@ -3336,7 +3832,7 @@ val* var3 /* : MModule */;
 var3 = self->attrs[COLOR_model__MClassDef___mmodule].val; /* _mmodule on <self:Object(MClassDef)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mmodule");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 471);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 489);
 show_backtrace(1);
 }
 var1 = var3;
@@ -3366,7 +3862,7 @@ val* var1 /* : MClass */;
 var1 = self->attrs[COLOR_model__MClassDef___mclass].val; /* _mclass on <self:MClassDef> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 474);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 492);
 show_backtrace(1);
 }
 var = var1;
@@ -3382,7 +3878,7 @@ val* var3 /* : MClass */;
 var3 = self->attrs[COLOR_model__MClassDef___mclass].val; /* _mclass on <self:Object(MClassDef)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 474);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 492);
 show_backtrace(1);
 }
 var1 = var3;
@@ -3412,7 +3908,7 @@ val* var1 /* : MClassType */;
 var1 = self->attrs[COLOR_model__MClassDef___bound_mtype].val; /* _bound_mtype on <self:MClassDef> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _bound_mtype");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 477);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 495);
 show_backtrace(1);
 }
 var = var1;
@@ -3428,7 +3924,7 @@ val* var3 /* : MClassType */;
 var3 = self->attrs[COLOR_model__MClassDef___bound_mtype].val; /* _bound_mtype on <self:Object(MClassDef)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _bound_mtype");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 477);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 495);
 show_backtrace(1);
 }
 var1 = var3;
@@ -3451,52 +3947,6 @@ RET_LABEL1:(void)0;
 }
 RET_LABEL:;
 }
-/* method model#MClassDef#parameter_names for (self: MClassDef): Array[String] */
-val* model__MClassDef__parameter_names(val* self) {
-val* var /* : Array[String] */;
-val* var1 /* : Array[String] */;
-var1 = self->attrs[COLOR_model__MClassDef___parameter_names].val; /* _parameter_names on <self:MClassDef> */
-if (unlikely(var1 == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _parameter_names");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 489);
-show_backtrace(1);
-}
-var = var1;
-RET_LABEL:;
-return var;
-}
-/* method model#MClassDef#parameter_names for (self: Object): Array[String] */
-val* VIRTUAL_model__MClassDef__parameter_names(val* self) {
-val* var /* : Array[String] */;
-val* var1 /* : Array[String] */;
-val* var3 /* : Array[String] */;
-{ /* Inline model#MClassDef#parameter_names (self) on <self:Object(MClassDef)> */
-var3 = self->attrs[COLOR_model__MClassDef___parameter_names].val; /* _parameter_names on <self:Object(MClassDef)> */
-if (unlikely(var3 == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _parameter_names");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 489);
-show_backtrace(1);
-}
-var1 = var3;
-RET_LABEL2:(void)0;
-}
-var = var1;
-RET_LABEL:;
-return var;
-}
-/* method model#MClassDef#parameter_names= for (self: MClassDef, Array[String]) */
-void model__MClassDef__parameter_names_61d(val* self, val* p0) {
-self->attrs[COLOR_model__MClassDef___parameter_names].val = p0; /* _parameter_names on <self:MClassDef> */
-RET_LABEL:;
-}
-/* method model#MClassDef#parameter_names= for (self: Object, Array[String]) */
-void VIRTUAL_model__MClassDef__parameter_names_61d(val* self, val* p0) {
-{ /* Inline model#MClassDef#parameter_names= (self,p0) on <self:Object(MClassDef)> */
-self->attrs[COLOR_model__MClassDef___parameter_names].val = p0; /* _parameter_names on <self:Object(MClassDef)> */
-RET_LABEL1:(void)0;
-}
-RET_LABEL:;
-}
 /* method model#MClassDef#location= for (self: MClassDef, Location) */
 void model__MClassDef__location_61d(val* self, val* p0) {
 self->attrs[COLOR_model__MClassDef___location].val = p0; /* _location on <self:MClassDef> */
@@ -3517,7 +3967,7 @@ val* var1 /* : String */;
 var1 = self->attrs[COLOR_model__MClassDef___to_s].val; /* _to_s on <self:MClassDef> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _to_s");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 495);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 510);
 show_backtrace(1);
 }
 var = var1;
@@ -3533,7 +3983,7 @@ val* var3 /* : String */;
 var3 = self->attrs[COLOR_model__MClassDef___to_s].val; /* _to_s on <self:Object(MClassDef)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _to_s");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 495);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 510);
 show_backtrace(1);
 }
 var1 = var3;
@@ -3556,229 +4006,271 @@ RET_LABEL1:(void)0;
 }
 RET_LABEL:;
 }
-/* method model#MClassDef#init for (self: MClassDef, MModule, MClassType, Location, Array[String]) */
-void model__MClassDef__init(val* self, val* p0, val* p1, val* p2, val* p3) {
+/* method model#MClassDef#init for (self: MClassDef, MModule, MClassType, Location) */
+void model__MClassDef__init(val* self, val* p0, val* p1, val* p2) {
 val* var_mmodule /* var mmodule: MModule */;
 val* var_bound_mtype /* var bound_mtype: MClassType */;
 val* var_location /* var location: Location */;
-val* var_parameter_names /* var parameter_names: Array[String] */;
 val* var /* : MClass */;
-val* var3 /* : MClass */;
-long var4 /* : Int */;
-long var6 /* : Int */;
-long var7 /* : Int */;
-short int var8 /* : Bool */;
-short int var9 /* : Bool */;
-short int var11 /* : Bool */;
-val* var14 /* : MClass */;
+val* var4 /* : MClass */;
+val* var7 /* : Array[MClassDef] */;
+val* var9 /* : Array[MClassDef] */;
+val* var10 /* : MClass */;
+val* var12 /* : MClass */;
+val* var13 /* : Array[MClassDef] */;
+val* var15 /* : Array[MClassDef] */;
 val* var16 /* : MClass */;
-val* var19 /* : Array[MClassDef] */;
-val* var21 /* : Array[MClassDef] */;
-val* var22 /* : MClass */;
-val* var24 /* : MClass */;
-val* var25 /* : Array[MClassDef] */;
-val* var27 /* : Array[MClassDef] */;
-static val* varonce;
-val* var29 /* : String */;
-char* var30 /* : NativeString */;
-long var31 /* : Int */;
-val* var32 /* : FlatString */;
+val* var18 /* : MClass */;
+val* var19 /* : MModule */;
+val* var21 /* : MModule */;
+short int var22 /* : Bool */;
+short int var23 /* : Bool */;
+val* var_other /* var other: nullable Object */;
+short int var25 /* : Bool */;
+short int var27 /* : Bool */;
+val* var28 /* : MClass */;
+val* var30 /* : MClass */;
+short int var31 /* : Bool */;
+short int var32 /* : Bool */;
 val* var33 /* : MClass */;
 val* var35 /* : MClass */;
-val* var36 /* : Array[Object] */;
-long var37 /* : Int */;
-val* var38 /* : NativeArray[Object] */;
-val* var39 /* : String */;
+static val* varonce;
+val* var37 /* : String */;
+char* var38 /* : NativeString */;
+long var39 /* : Int */;
+val* var40 /* : FlatString */;
+val* var41 /* : MClass */;
+val* var43 /* : MClass */;
+val* var44 /* : Array[Object] */;
+long var45 /* : Int */;
+val* var46 /* : NativeArray[Object] */;
+val* var47 /* : String */;
 {
-{ /* Inline model_base#MEntity#init (self) on <self:MClassDef> */
-RET_LABEL1:(void)0;
-}
+((void (*)(val*))(self->class->vft[COLOR_kernel__Object__init]))(self) /* init on <self:MClassDef>*/;
 }
 var_mmodule = p0;
 var_bound_mtype = p1;
 var_location = p2;
-var_parameter_names = p3;
-{
-{ /* Inline model#MClassType#mclass (var_bound_mtype) on <var_bound_mtype:MClassType> */
-var3 = var_bound_mtype->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <var_bound_mtype:MClassType> */
-if (unlikely(var3 == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 969);
-show_backtrace(1);
-}
-var = var3;
-RET_LABEL2:(void)0;
-}
-}
-{
-{ /* Inline model#MClass#arity (var) on <var:MClass> */
-var6 = var->attrs[COLOR_model__MClass___arity].l; /* _arity on <var:MClass> */
-var4 = var6;
-RET_LABEL5:(void)0;
-}
-}
-{
-var7 = array__AbstractArrayRead__length(var_parameter_names);
-}
-{
-{ /* Inline kernel#Int#== (var4,var7) on <var4:Int> */
-var11 = var4 == var7;
-var9 = var11;
-goto RET_LABEL10;
-RET_LABEL10:(void)0;
-}
-var8 = var9;
-}
-if (unlikely(!var8)) {
-PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 501);
-show_backtrace(1);
-}
 {
 { /* Inline model#MClassDef#bound_mtype= (self,var_bound_mtype) on <self:MClassDef> */
 self->attrs[COLOR_model__MClassDef___bound_mtype].val = var_bound_mtype; /* _bound_mtype on <self:MClassDef> */
-RET_LABEL12:(void)0;
+RET_LABEL1:(void)0;
 }
 }
 {
 { /* Inline model#MClassDef#mmodule= (self,var_mmodule) on <self:MClassDef> */
 self->attrs[COLOR_model__MClassDef___mmodule].val = var_mmodule; /* _mmodule on <self:MClassDef> */
-RET_LABEL13:(void)0;
+RET_LABEL2:(void)0;
 }
 }
 {
 { /* Inline model#MClassType#mclass (var_bound_mtype) on <var_bound_mtype:MClassType> */
-var16 = var_bound_mtype->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <var_bound_mtype:MClassType> */
-if (unlikely(var16 == NULL)) {
+var4 = var_bound_mtype->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <var_bound_mtype:MClassType> */
+if (unlikely(var4 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 969);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 986);
 show_backtrace(1);
 }
-var14 = var16;
-RET_LABEL15:(void)0;
+var = var4;
+RET_LABEL3:(void)0;
 }
 }
 {
-{ /* Inline model#MClassDef#mclass= (self,var14) on <self:MClassDef> */
-self->attrs[COLOR_model__MClassDef___mclass].val = var14; /* _mclass on <self:MClassDef> */
-RET_LABEL17:(void)0;
+{ /* Inline model#MClassDef#mclass= (self,var) on <self:MClassDef> */
+self->attrs[COLOR_model__MClassDef___mclass].val = var; /* _mclass on <self:MClassDef> */
+RET_LABEL5:(void)0;
 }
 }
 {
 { /* Inline model#MClassDef#location= (self,var_location) on <self:MClassDef> */
 self->attrs[COLOR_model__MClassDef___location].val = var_location; /* _location on <self:MClassDef> */
-RET_LABEL18:(void)0;
+RET_LABEL6:(void)0;
 }
 }
 {
 { /* Inline model#MModule#mclassdefs (var_mmodule) on <var_mmodule:MModule> */
-var21 = var_mmodule->attrs[COLOR_model__MModule___mclassdefs].val; /* _mclassdefs on <var_mmodule:MModule> */
-if (unlikely(var21 == NULL)) {
+var9 = var_mmodule->attrs[COLOR_model__MModule___mclassdefs].val; /* _mclassdefs on <var_mmodule:MModule> */
+if (unlikely(var9 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclassdefs");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 141);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 139);
 show_backtrace(1);
 }
-var19 = var21;
-RET_LABEL20:(void)0;
+var7 = var9;
+RET_LABEL8:(void)0;
 }
 }
 {
-array__Array__add(var19, self); /* Direct call array#Array#add on <var19:Array[MClassDef]>*/
+array__Array__add(var7, self); /* Direct call array#Array#add on <var7:Array[MClassDef]>*/
 }
 {
 { /* Inline model#MClassDef#mclass (self) on <self:MClassDef> */
-var24 = self->attrs[COLOR_model__MClassDef___mclass].val; /* _mclass on <self:MClassDef> */
-if (unlikely(var24 == NULL)) {
+var12 = self->attrs[COLOR_model__MClassDef___mclass].val; /* _mclass on <self:MClassDef> */
+if (unlikely(var12 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 474);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 492);
 show_backtrace(1);
 }
-var22 = var24;
-RET_LABEL23:(void)0;
+var10 = var12;
+RET_LABEL11:(void)0;
 }
 }
 {
-{ /* Inline model#MClass#mclassdefs (var22) on <var22:MClass> */
-var27 = var22->attrs[COLOR_model__MClass___mclassdefs].val; /* _mclassdefs on <var22:MClass> */
-if (unlikely(var27 == NULL)) {
+{ /* Inline model#MClass#mclassdefs (var10) on <var10:MClass> */
+var15 = var10->attrs[COLOR_model__MClass___mclassdefs].val; /* _mclassdefs on <var10:MClass> */
+if (unlikely(var15 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclassdefs");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 392);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 414);
 show_backtrace(1);
 }
-var25 = var27;
-RET_LABEL26:(void)0;
-}
+var13 = var15;
+RET_LABEL14:(void)0;
 }
-{
-array__Array__add(var25, self); /* Direct call array#Array#add on <var25:Array[MClassDef]>*/
 }
 {
-{ /* Inline model#MClassDef#parameter_names= (self,var_parameter_names) on <self:MClassDef> */
-self->attrs[COLOR_model__MClassDef___parameter_names].val = var_parameter_names; /* _parameter_names on <self:MClassDef> */
-RET_LABEL28:(void)0;
-}
-}
-if (varonce) {
-var29 = varonce;
-} else {
-var30 = "#";
-var31 = 1;
-var32 = string__NativeString__to_s_with_length(var30, var31);
-var29 = var32;
-varonce = var29;
+array__Array__add(var13, self); /* Direct call array#Array#add on <var13:Array[MClassDef]>*/
 }
 {
 { /* Inline model#MClassDef#mclass (self) on <self:MClassDef> */
-var35 = self->attrs[COLOR_model__MClassDef___mclass].val; /* _mclass on <self:MClassDef> */
-if (unlikely(var35 == NULL)) {
+var18 = self->attrs[COLOR_model__MClassDef___mclass].val; /* _mclass on <self:MClassDef> */
+if (unlikely(var18 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 474);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 492);
 show_backtrace(1);
 }
-var33 = var35;
-RET_LABEL34:(void)0;
+var16 = var18;
+RET_LABEL17:(void)0;
 }
 }
-var36 = NEW_array__Array(&type_array__Arraykernel__Object);
-{ /* var36 = array_instance Array[Object] */
-var37 = 3;
-var38 = NEW_array__NativeArray(var37, &type_array__NativeArraykernel__Object);
-((struct instance_array__NativeArray*)var38)->values[0] = (val*) var_mmodule;
-((struct instance_array__NativeArray*)var38)->values[1] = (val*) var29;
-((struct instance_array__NativeArray*)var38)->values[2] = (val*) var33;
 {
-((void (*)(val*, val*, long))(var36->class->vft[COLOR_array__Array__with_native]))(var36, var38, var37) /* with_native on <var36:Array[Object]>*/;
+{ /* Inline model#MClass#intro_mmodule (var16) on <var16:MClass> */
+var21 = var16->attrs[COLOR_model__MClass___intro_mmodule].val; /* _intro_mmodule on <var16:MClass> */
+if (unlikely(var21 == NULL)) {
+PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _intro_mmodule");
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 347);
+show_backtrace(1);
 }
+var19 = var21;
+RET_LABEL20:(void)0;
 }
-{
-var39 = ((val* (*)(val*))(var36->class->vft[COLOR_string__Object__to_s]))(var36) /* to_s on <var36:Array[Object]>*/;
 }
 {
-{ /* Inline model#MClassDef#to_s= (self,var39) on <self:MClassDef> */
-self->attrs[COLOR_model__MClassDef___to_s].val = var39; /* _to_s on <self:MClassDef> */
-RET_LABEL40:(void)0;
+{ /* Inline kernel#Object#== (var19,var_mmodule) on <var19:MModule> */
+var_other = var_mmodule;
+{
+{ /* Inline kernel#Object#is_same_instance (var19,var_other) on <var19:MModule> */
+var27 = var19 == var_other;
+var25 = var27;
+goto RET_LABEL26;
+RET_LABEL26:(void)0;
 }
 }
-RET_LABEL:;
+var23 = var25;
+goto RET_LABEL24;
+RET_LABEL24:(void)0;
 }
-/* method model#MClassDef#init for (self: Object, MModule, MClassType, Location, Array[String]) */
-void VIRTUAL_model__MClassDef__init(val* self, val* p0, val* p1, val* p2, val* p3) {
-model__MClassDef__init(self, p0, p1, p2, p3); /* Direct call model#MClassDef#init on <self:Object(MClassDef)>*/
-RET_LABEL:;
+var22 = var23;
 }
-/* method model#MClassDef#name for (self: MClassDef): String */
-val* model__MClassDef__name(val* self) {
-val* var /* : String */;
-val* var1 /* : MClass */;
-val* var3 /* : MClass */;
-val* var4 /* : String */;
-val* var6 /* : String */;
+if (var22){
 {
 { /* Inline model#MClassDef#mclass (self) on <self:MClassDef> */
-var3 = self->attrs[COLOR_model__MClassDef___mclass].val; /* _mclass on <self:MClassDef> */
-if (unlikely(var3 == NULL)) {
+var30 = self->attrs[COLOR_model__MClassDef___mclass].val; /* _mclass on <self:MClassDef> */
+if (unlikely(var30 == NULL)) {
+PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 492);
+show_backtrace(1);
+}
+var28 = var30;
+RET_LABEL29:(void)0;
+}
+}
+var31 = var28->attrs[COLOR_model__MClass___intro].val != NULL; /* _intro on <var28:MClass> */
+var32 = !var31;
+if (unlikely(!var32)) {
+PRINT_ERROR("Runtime error: %s", "Assert failed");
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 523);
+show_backtrace(1);
+}
+{
+{ /* Inline model#MClassDef#mclass (self) on <self:MClassDef> */
+var35 = self->attrs[COLOR_model__MClassDef___mclass].val; /* _mclass on <self:MClassDef> */
+if (unlikely(var35 == NULL)) {
+PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 492);
+show_backtrace(1);
+}
+var33 = var35;
+RET_LABEL34:(void)0;
+}
+}
+{
+{ /* Inline model#MClass#intro= (var33,self) on <var33:MClass> */
+var33->attrs[COLOR_model__MClass___intro].val = self; /* _intro on <var33:MClass> */
+RET_LABEL36:(void)0;
+}
+}
+} else {
+}
+if (varonce) {
+var37 = varonce;
+} else {
+var38 = "#";
+var39 = 1;
+var40 = string__NativeString__to_s_with_length(var38, var39);
+var37 = var40;
+varonce = var37;
+}
+{
+{ /* Inline model#MClassDef#mclass (self) on <self:MClassDef> */
+var43 = self->attrs[COLOR_model__MClassDef___mclass].val; /* _mclass on <self:MClassDef> */
+if (unlikely(var43 == NULL)) {
+PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 492);
+show_backtrace(1);
+}
+var41 = var43;
+RET_LABEL42:(void)0;
+}
+}
+var44 = NEW_array__Array(&type_array__Arraykernel__Object);
+{ /* var44 = array_instance Array[Object] */
+var45 = 3;
+var46 = NEW_array__NativeArray(var45, &type_array__NativeArraykernel__Object);
+((struct instance_array__NativeArray*)var46)->values[0] = (val*) var_mmodule;
+((struct instance_array__NativeArray*)var46)->values[1] = (val*) var37;
+((struct instance_array__NativeArray*)var46)->values[2] = (val*) var41;
+{
+((void (*)(val*, val*, long))(var44->class->vft[COLOR_array__Array__with_native]))(var44, var46, var45) /* with_native on <var44:Array[Object]>*/;
+}
+}
+{
+var47 = ((val* (*)(val*))(var44->class->vft[COLOR_string__Object__to_s]))(var44) /* to_s on <var44:Array[Object]>*/;
+}
+{
+{ /* Inline model#MClassDef#to_s= (self,var47) on <self:MClassDef> */
+self->attrs[COLOR_model__MClassDef___to_s].val = var47; /* _to_s on <self:MClassDef> */
+RET_LABEL48:(void)0;
+}
+}
+RET_LABEL:;
+}
+/* method model#MClassDef#init for (self: Object, MModule, MClassType, Location) */
+void VIRTUAL_model__MClassDef__init(val* self, val* p0, val* p1, val* p2) {
+model__MClassDef__init(self, p0, p1, p2); /* Direct call model#MClassDef#init on <self:Object(MClassDef)>*/
+RET_LABEL:;
+}
+/* method model#MClassDef#name for (self: MClassDef): String */
+val* model__MClassDef__name(val* self) {
+val* var /* : String */;
+val* var1 /* : MClass */;
+val* var3 /* : MClass */;
+val* var4 /* : String */;
+val* var6 /* : String */;
+{
+{ /* Inline model#MClassDef#mclass (self) on <self:MClassDef> */
+var3 = self->attrs[COLOR_model__MClassDef___mclass].val; /* _mclass on <self:MClassDef> */
+if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 474);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 492);
 show_backtrace(1);
 }
 var1 = var3;
@@ -3790,7 +4282,7 @@ RET_LABEL2:(void)0;
 var6 = var1->attrs[COLOR_model__MClass___name].val; /* _name on <var1:MClass> */
 if (unlikely(var6 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _name");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 340);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 352);
 show_backtrace(1);
 }
 var4 = var6;
@@ -3823,7 +4315,7 @@ val* var6 /* : Model */;
 var3 = self->attrs[COLOR_model__MClassDef___mmodule].val; /* _mmodule on <self:MClassDef> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mmodule");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 471);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 489);
 show_backtrace(1);
 }
 var1 = var3;
@@ -3835,7 +4327,7 @@ RET_LABEL2:(void)0;
 var6 = var1->attrs[COLOR_mmodule__MModule___model].val; /* _model on <var1:MModule> */
 if (unlikely(var6 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _model");
-PRINT_ERROR(" (%s:%d)\n", "src/model/mmodule.nit", 74);
+PRINT_ERROR(" (%s:%d)\n", "model/mmodule.nit", 72);
 show_backtrace(1);
 }
 var4 = var6;
@@ -3863,7 +4355,7 @@ val* var1 /* : Array[MClassType] */;
 var1 = self->attrs[COLOR_model__MClassDef___supertypes].val; /* _supertypes on <self:MClassDef> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _supertypes");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 517);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 534);
 show_backtrace(1);
 }
 var = var1;
@@ -3879,7 +4371,7 @@ val* var3 /* : Array[MClassType] */;
 var3 = self->attrs[COLOR_model__MClassDef___supertypes].val; /* _supertypes on <self:Object(MClassDef)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _supertypes");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 517);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 534);
 show_backtrace(1);
 }
 var1 = var3;
@@ -3909,34 +4401,36 @@ val* var_model /* var model: Model */;
 val* var16 /* : MClassType */;
 val* var18 /* : MClassType */;
 val* var_mtype /* var mtype: MClassType */;
+val* var_ /* var : Array[MClassType] */;
 val* var19 /* : ArrayIterator[nullable Object] */;
-short int var20 /* : Bool */;
-val* var21 /* : nullable Object */;
+val* var_20 /* var : ArrayIterator[MClassType] */;
+short int var21 /* : Bool */;
+val* var22 /* : nullable Object */;
 val* var_supertype /* var supertype: MClassType */;
-val* var22 /* : Array[MClassType] */;
-val* var24 /* : Array[MClassType] */;
-val* var25 /* : POSet[MClassType] */;
-val* var27 /* : POSet[MClassType] */;
-short int var28 /* : Bool */;
-val* var29 /* : MClass */;
-val* var31 /* : MClass */;
-val* var32 /* : MModule */;
-val* var34 /* : MModule */;
-short int var35 /* : Bool */;
+val* var23 /* : Array[MClassType] */;
+val* var25 /* : Array[MClassType] */;
+val* var26 /* : POSet[MClassType] */;
+val* var28 /* : POSet[MClassType] */;
+short int var29 /* : Bool */;
+val* var30 /* : MClass */;
+val* var32 /* : MClass */;
+val* var33 /* : MModule */;
+val* var35 /* : MModule */;
 short int var36 /* : Bool */;
-short int var38 /* : Bool */;
-short int var40 /* : Bool */;
-short int var_ /* var : Bool */;
-val* var41 /* : MClass */;
+short int var37 /* : Bool */;
+short int var39 /* : Bool */;
+short int var41 /* : Bool */;
+short int var_42 /* var : Bool */;
 val* var43 /* : MClass */;
-val* var44 /* : MModule */;
+val* var45 /* : MClass */;
 val* var46 /* : MModule */;
-short int var47 /* : Bool */;
-short int var48 /* : Bool */;
+val* var48 /* : MModule */;
+short int var49 /* : Bool */;
 short int var50 /* : Bool */;
 short int var52 /* : Bool */;
-val* var53 /* : POSet[MClassType] */;
+short int var54 /* : Bool */;
 val* var55 /* : POSet[MClassType] */;
+val* var57 /* : POSet[MClassType] */;
 var_supertypes = p0;
 {
 { /* Inline model#MClassDef#in_hierarchy (self) on <self:MClassDef> */
@@ -3970,7 +4464,7 @@ var4 = var5;
 }
 if (unlikely(!var4)) {
 PRINT_ERROR("Runtime error: %s", "Assert \'unique_invocation\' failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 527);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 544);
 show_backtrace(1);
 }
 {
@@ -3978,7 +4472,7 @@ show_backtrace(1);
 var12 = self->attrs[COLOR_model__MClassDef___mmodule].val; /* _mmodule on <self:MClassDef> */
 if (unlikely(var12 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mmodule");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 471);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 489);
 show_backtrace(1);
 }
 var10 = var12;
@@ -3991,7 +4485,7 @@ var_mmodule = var10;
 var15 = var_mmodule->attrs[COLOR_mmodule__MModule___model].val; /* _model on <var_mmodule:MModule> */
 if (unlikely(var15 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _model");
-PRINT_ERROR(" (%s:%d)\n", "src/model/mmodule.nit", 74);
+PRINT_ERROR(" (%s:%d)\n", "model/mmodule.nit", 72);
 show_backtrace(1);
 }
 var13 = var15;
@@ -4004,7 +4498,7 @@ var_model = var13;
 var18 = self->attrs[COLOR_model__MClassDef___bound_mtype].val; /* _bound_mtype on <self:MClassDef> */
 if (unlikely(var18 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _bound_mtype");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 477);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 495);
 show_backtrace(1);
 }
 var16 = var18;
@@ -4012,160 +4506,169 @@ RET_LABEL17:(void)0;
 }
 }
 var_mtype = var16;
+var_ = var_supertypes;
 {
-var19 = array__AbstractArrayRead__iterator(var_supertypes);
+var19 = array__AbstractArrayRead__iterator(var_);
 }
+var_20 = var19;
 for(;;) {
 {
-var20 = array__ArrayIterator__is_ok(var19);
+var21 = array__ArrayIterator__is_ok(var_20);
 }
-if(!var20) break;
+if (var21){
 {
-var21 = array__ArrayIterator__item(var19);
+var22 = array__ArrayIterator__item(var_20);
 }
-var_supertype = var21;
+var_supertype = var22;
 {
 { /* Inline model#MClassDef#supertypes (self) on <self:MClassDef> */
-var24 = self->attrs[COLOR_model__MClassDef___supertypes].val; /* _supertypes on <self:MClassDef> */
-if (unlikely(var24 == NULL)) {
+var25 = self->attrs[COLOR_model__MClassDef___supertypes].val; /* _supertypes on <self:MClassDef> */
+if (unlikely(var25 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _supertypes");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 517);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 534);
 show_backtrace(1);
 }
-var22 = var24;
-RET_LABEL23:(void)0;
+var23 = var25;
+RET_LABEL24:(void)0;
 }
 }
 {
-array__Array__add(var22, var_supertype); /* Direct call array#Array#add on <var22:Array[MClassType]>*/
+array__Array__add(var23, var_supertype); /* Direct call array#Array#add on <var23:Array[MClassType]>*/
 }
 {
 { /* Inline model#Model#full_mtype_specialization_hierarchy (var_model) on <var_model:Model> */
-var27 = var_model->attrs[COLOR_model__Model___full_mtype_specialization_hierarchy].val; /* _full_mtype_specialization_hierarchy on <var_model:Model> */
-if (unlikely(var27 == NULL)) {
+var28 = var_model->attrs[COLOR_model__Model___full_mtype_specialization_hierarchy].val; /* _full_mtype_specialization_hierarchy on <var_model:Model> */
+if (unlikely(var28 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _full_mtype_specialization_hierarchy");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 59);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 57);
 show_backtrace(1);
 }
-var25 = var27;
-RET_LABEL26:(void)0;
+var26 = var28;
+RET_LABEL27:(void)0;
 }
 }
 {
-poset__POSet__add_edge(var25, var_mtype, var_supertype); /* Direct call poset#POSet#add_edge on <var25:POSet[MClassType]>*/
+poset__POSet__add_edge(var26, var_mtype, var_supertype); /* Direct call poset#POSet#add_edge on <var26:POSet[MClassType]>*/
 }
 {
 { /* Inline model#MClassDef#mclass (self) on <self:MClassDef> */
-var31 = self->attrs[COLOR_model__MClassDef___mclass].val; /* _mclass on <self:MClassDef> */
-if (unlikely(var31 == NULL)) {
+var32 = self->attrs[COLOR_model__MClassDef___mclass].val; /* _mclass on <self:MClassDef> */
+if (unlikely(var32 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 474);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 492);
 show_backtrace(1);
 }
-var29 = var31;
-RET_LABEL30:(void)0;
+var30 = var32;
+RET_LABEL31:(void)0;
 }
 }
 {
-{ /* Inline model#MClass#intro_mmodule (var29) on <var29:MClass> */
-var34 = var29->attrs[COLOR_model__MClass___intro_mmodule].val; /* _intro_mmodule on <var29:MClass> */
-if (unlikely(var34 == NULL)) {
+{ /* Inline model#MClass#intro_mmodule (var30) on <var30:MClass> */
+var35 = var30->attrs[COLOR_model__MClass___intro_mmodule].val; /* _intro_mmodule on <var30:MClass> */
+if (unlikely(var35 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _intro_mmodule");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 335);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 347);
 show_backtrace(1);
 }
-var32 = var34;
-RET_LABEL33:(void)0;
+var33 = var35;
+RET_LABEL34:(void)0;
 }
 }
 {
-{ /* Inline kernel#Object#== (var32,var_mmodule) on <var32:MModule> */
+{ /* Inline kernel#Object#== (var33,var_mmodule) on <var33:MModule> */
 var_other = var_mmodule;
 {
-{ /* Inline kernel#Object#is_same_instance (var32,var_other) on <var32:MModule> */
-var40 = var32 == var_other;
-var38 = var40;
-goto RET_LABEL39;
-RET_LABEL39:(void)0;
+{ /* Inline kernel#Object#is_same_instance (var33,var_other) on <var33:MModule> */
+var41 = var33 == var_other;
+var39 = var41;
+goto RET_LABEL40;
+RET_LABEL40:(void)0;
 }
 }
-var36 = var38;
-goto RET_LABEL37;
-RET_LABEL37:(void)0;
+var37 = var39;
+goto RET_LABEL38;
+RET_LABEL38:(void)0;
 }
-var35 = var36;
+var36 = var37;
 }
-var_ = var35;
-if (var35){
+var_42 = var36;
+if (var36){
 {
 { /* Inline model#MClassType#mclass (var_supertype) on <var_supertype:MClassType> */
-var43 = var_supertype->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <var_supertype:MClassType> */
-if (unlikely(var43 == NULL)) {
+var45 = var_supertype->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <var_supertype:MClassType> */
+if (unlikely(var45 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 969);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 986);
 show_backtrace(1);
 }
-var41 = var43;
-RET_LABEL42:(void)0;
+var43 = var45;
+RET_LABEL44:(void)0;
 }
 }
 {
-{ /* Inline model#MClass#intro_mmodule (var41) on <var41:MClass> */
-var46 = var41->attrs[COLOR_model__MClass___intro_mmodule].val; /* _intro_mmodule on <var41:MClass> */
-if (unlikely(var46 == NULL)) {
+{ /* Inline model#MClass#intro_mmodule (var43) on <var43:MClass> */
+var48 = var43->attrs[COLOR_model__MClass___intro_mmodule].val; /* _intro_mmodule on <var43:MClass> */
+if (unlikely(var48 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _intro_mmodule");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 335);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 347);
 show_backtrace(1);
 }
-var44 = var46;
-RET_LABEL45:(void)0;
+var46 = var48;
+RET_LABEL47:(void)0;
 }
 }
 {
-{ /* Inline kernel#Object#== (var44,var_mmodule) on <var44:MModule> */
+{ /* Inline kernel#Object#== (var46,var_mmodule) on <var46:MModule> */
 var_other = var_mmodule;
 {
-{ /* Inline kernel#Object#is_same_instance (var44,var_other) on <var44:MModule> */
-var52 = var44 == var_other;
+{ /* Inline kernel#Object#is_same_instance (var46,var_other) on <var46:MModule> */
+var54 = var46 == var_other;
+var52 = var54;
+goto RET_LABEL53;
+RET_LABEL53:(void)0;
+}
+}
 var50 = var52;
 goto RET_LABEL51;
 RET_LABEL51:(void)0;
 }
+var49 = var50;
 }
-var48 = var50;
-goto RET_LABEL49;
-RET_LABEL49:(void)0;
-}
-var47 = var48;
-}
-var28 = var47;
+var29 = var49;
 } else {
-var28 = var_;
+var29 = var_42;
 }
-if (var28){
+if (var29){
 {
 { /* Inline model#Model#intro_mtype_specialization_hierarchy (var_model) on <var_model:Model> */
-var55 = var_model->attrs[COLOR_model__Model___intro_mtype_specialization_hierarchy].val; /* _intro_mtype_specialization_hierarchy on <var_model:Model> */
-if (unlikely(var55 == NULL)) {
+var57 = var_model->attrs[COLOR_model__Model___intro_mtype_specialization_hierarchy].val; /* _intro_mtype_specialization_hierarchy on <var_model:Model> */
+if (unlikely(var57 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _intro_mtype_specialization_hierarchy");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 48);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 46);
 show_backtrace(1);
 }
-var53 = var55;
-RET_LABEL54:(void)0;
+var55 = var57;
+RET_LABEL56:(void)0;
 }
 }
 {
-poset__POSet__add_edge(var53, var_mtype, var_supertype); /* Direct call poset#POSet#add_edge on <var53:POSet[MClassType]>*/
+poset__POSet__add_edge(var55, var_mtype, var_supertype); /* Direct call poset#POSet#add_edge on <var55:POSet[MClassType]>*/
 }
 } else {
 }
-CONTINUE_label: (void)0;
 {
-array__ArrayIterator__next(var19); /* Direct call array#ArrayIterator#next on <var19:ArrayIterator[nullable Object]>*/
+array__ArrayIterator__next(var_20); /* Direct call array#ArrayIterator#next on <var_20:ArrayIterator[MClassType]>*/
+}
+} else {
+goto BREAK_label;
 }
 }
 BREAK_label: (void)0;
+{
+{ /* Inline abstract_collection#Iterator#finish (var_20) on <var_20:ArrayIterator[MClassType]> */
+RET_LABEL58:(void)0;
+}
+}
 RET_LABEL:;
 }
 /* method model#MClassDef#set_supertypes for (self: Object, Array[MClassType]) */
@@ -4198,12 +4701,14 @@ val* var_mtype /* var mtype: MClassType */;
 val* var24 /* : MModule */;
 val* var26 /* : MModule */;
 val* var27 /* : Set[MClassDef] */;
+val* var_ /* var : Set[MClassDef] */;
 val* var28 /* : Iterator[nullable Object] */;
-short int var29 /* : Bool */;
-val* var30 /* : nullable Object */;
+val* var_29 /* var : Iterator[MClassDef] */;
+short int var30 /* : Bool */;
+val* var31 /* : nullable Object */;
 val* var_mclassdef /* var mclassdef: MClassDef */;
-val* var31 /* : POSet[Object] */;
-val* var33 /* : POSet[Object] */;
+val* var32 /* : POSet[Object] */;
+val* var34 /* : POSet[Object] */;
 {
 { /* Inline model#MClassDef#in_hierarchy (self) on <self:MClassDef> */
 var2 = self->attrs[COLOR_model__MClassDef___in_hierarchy].val; /* _in_hierarchy on <self:MClassDef> */
@@ -4236,7 +4741,7 @@ var4 = var5;
 }
 if (unlikely(!var4)) {
 PRINT_ERROR("Runtime error: %s", "Assert \'unique_invocation\' failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 552);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 569);
 show_backtrace(1);
 }
 {
@@ -4244,7 +4749,7 @@ show_backtrace(1);
 var12 = self->attrs[COLOR_model__MClassDef___mmodule].val; /* _mmodule on <self:MClassDef> */
 if (unlikely(var12 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mmodule");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 471);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 489);
 show_backtrace(1);
 }
 var10 = var12;
@@ -4256,7 +4761,7 @@ RET_LABEL11:(void)0;
 var15 = var10->attrs[COLOR_mmodule__MModule___model].val; /* _model on <var10:MModule> */
 if (unlikely(var15 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _model");
-PRINT_ERROR(" (%s:%d)\n", "src/model/mmodule.nit", 74);
+PRINT_ERROR(" (%s:%d)\n", "model/mmodule.nit", 72);
 show_backtrace(1);
 }
 var13 = var15;
@@ -4269,7 +4774,7 @@ var_model = var13;
 var18 = var_model->attrs[COLOR_model__Model___mclassdef_hierarchy].val; /* _mclassdef_hierarchy on <var_model:Model> */
 if (unlikely(var18 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclassdef_hierarchy");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 42);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 40);
 show_backtrace(1);
 }
 var16 = var18;
@@ -4291,7 +4796,7 @@ RET_LABEL20:(void)0;
 var23 = self->attrs[COLOR_model__MClassDef___bound_mtype].val; /* _bound_mtype on <self:MClassDef> */
 if (unlikely(var23 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _bound_mtype");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 477);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 495);
 show_backtrace(1);
 }
 var21 = var23;
@@ -4304,7 +4809,7 @@ var_mtype = var21;
 var26 = self->attrs[COLOR_model__MClassDef___mmodule].val; /* _mmodule on <self:MClassDef> */
 if (unlikely(var26 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mmodule");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 471);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 489);
 show_backtrace(1);
 }
 var24 = var26;
@@ -4314,39 +4819,48 @@ RET_LABEL25:(void)0;
 {
 var27 = model__MClassType__collect_mclassdefs(var_mtype, var24);
 }
+var_ = var27;
 {
-var28 = ((val* (*)(val*))(var27->class->vft[COLOR_abstract_collection__Collection__iterator]))(var27) /* iterator on <var27:Set[MClassDef]>*/;
+var28 = ((val* (*)(val*))(var_->class->vft[COLOR_abstract_collection__Collection__iterator]))(var_) /* iterator on <var_:Set[MClassDef]>*/;
 }
+var_29 = var28;
 for(;;) {
 {
-var29 = ((short int (*)(val*))(var28->class->vft[COLOR_abstract_collection__Iterator__is_ok]))(var28) /* is_ok on <var28:Iterator[nullable Object]>*/;
+var30 = ((short int (*)(val*))(var_29->class->vft[COLOR_abstract_collection__Iterator__is_ok]))(var_29) /* is_ok on <var_29:Iterator[MClassDef]>*/;
 }
-if(!var29) break;
+if (var30){
 {
-var30 = ((val* (*)(val*))(var28->class->vft[COLOR_abstract_collection__Iterator__item]))(var28) /* item on <var28:Iterator[nullable Object]>*/;
+var31 = ((val* (*)(val*))(var_29->class->vft[COLOR_abstract_collection__Iterator__item]))(var_29) /* item on <var_29:Iterator[MClassDef]>*/;
 }
-var_mclassdef = var30;
+var_mclassdef = var31;
 {
 { /* Inline poset#POSetElement#poset (var_res) on <var_res:POSetElement[MClassDef]> */
-var33 = var_res->attrs[COLOR_poset__POSetElement___poset].val; /* _poset on <var_res:POSetElement[MClassDef]> */
-if (unlikely(var33 == NULL)) {
+var34 = var_res->attrs[COLOR_poset__POSetElement___poset].val; /* _poset on <var_res:POSetElement[MClassDef]> */
+if (unlikely(var34 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _poset");
-PRINT_ERROR(" (%s:%d)\n", "lib/poset.nit", 188);
+PRINT_ERROR(" (%s:%d)\n", "../lib/poset.nit", 239);
 show_backtrace(1);
 }
-var31 = var33;
-RET_LABEL32:(void)0;
+var32 = var34;
+RET_LABEL33:(void)0;
 }
 }
 {
-poset__POSet__add_edge(var31, self, var_mclassdef); /* Direct call poset#POSet#add_edge on <var31:POSet[Object](POSet[MClassDef])>*/
+poset__POSet__add_edge(var32, self, var_mclassdef); /* Direct call poset#POSet#add_edge on <var32:POSet[Object](POSet[MClassDef])>*/
 }
-CONTINUE_label: (void)0;
 {
-((void (*)(val*))(var28->class->vft[COLOR_abstract_collection__Iterator__next]))(var28) /* next on <var28:Iterator[nullable Object]>*/;
+((void (*)(val*))(var_29->class->vft[COLOR_abstract_collection__Iterator__next]))(var_29) /* next on <var_29:Iterator[MClassDef]>*/;
+}
+} else {
+goto BREAK_label;
 }
 }
 BREAK_label: (void)0;
+{
+{ /* Inline abstract_collection#Iterator#finish (var_29) on <var_29:Iterator[MClassDef]> */
+RET_LABEL35:(void)0;
+}
+}
 RET_LABEL:;
 }
 /* method model#MClassDef#add_in_hierarchy for (self: Object) */
@@ -4396,17 +4910,18 @@ short int var /* : Bool */;
 val* var1 /* : MClass */;
 val* var3 /* : MClass */;
 val* var4 /* : MClassDef */;
-short int var5 /* : Bool */;
-short int var6 /* : Bool */;
-val* var_other /* var other: nullable Object */;
+val* var6 /* : MClassDef */;
+short int var7 /* : Bool */;
 short int var8 /* : Bool */;
+val* var_other /* var other: nullable Object */;
 short int var10 /* : Bool */;
+short int var12 /* : Bool */;
 {
 { /* Inline model#MClassDef#mclass (self) on <self:MClassDef> */
 var3 = self->attrs[COLOR_model__MClassDef___mclass].val; /* _mclass on <self:MClassDef> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 474);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 492);
 show_backtrace(1);
 }
 var1 = var3;
@@ -4414,26 +4929,35 @@ RET_LABEL2:(void)0;
 }
 }
 {
-var4 = model__MClass__intro(var1);
+{ /* Inline model#MClass#intro (var1) on <var1:MClass> */
+var6 = var1->attrs[COLOR_model__MClass___intro].val; /* _intro on <var1:MClass> */
+if (unlikely(var6 == NULL)) {
+PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _intro");
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 420);
+show_backtrace(1);
+}
+var4 = var6;
+RET_LABEL5:(void)0;
+}
 }
 {
 { /* Inline kernel#Object#== (var4,self) on <var4:MClassDef> */
 var_other = self;
 {
 { /* Inline kernel#Object#is_same_instance (var4,var_other) on <var4:MClassDef> */
-var10 = var4 == var_other;
+var12 = var4 == var_other;
+var10 = var12;
+goto RET_LABEL11;
+RET_LABEL11:(void)0;
+}
+}
 var8 = var10;
 goto RET_LABEL9;
 RET_LABEL9:(void)0;
 }
+var7 = var8;
 }
-var6 = var8;
-goto RET_LABEL7;
-RET_LABEL7:(void)0;
-}
-var5 = var6;
-}
-var = var5;
+var = var7;
 goto RET_LABEL;
 RET_LABEL:;
 return var;
@@ -4454,7 +4978,7 @@ val* var1 /* : Array[MProperty] */;
 var1 = self->attrs[COLOR_model__MClassDef___intro_mproperties].val; /* _intro_mproperties on <self:MClassDef> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _intro_mproperties");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 571);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 588);
 show_backtrace(1);
 }
 var = var1;
@@ -4470,7 +4994,7 @@ val* var3 /* : Array[MProperty] */;
 var3 = self->attrs[COLOR_model__MClassDef___intro_mproperties].val; /* _intro_mproperties on <self:Object(MClassDef)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _intro_mproperties");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 571);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 588);
 show_backtrace(1);
 }
 var1 = var3;
@@ -4487,7 +5011,7 @@ val* var1 /* : Array[MPropDef] */;
 var1 = self->attrs[COLOR_model__MClassDef___mpropdefs].val; /* _mpropdefs on <self:MClassDef> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mpropdefs");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 574);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 591);
 show_backtrace(1);
 }
 var = var1;
@@ -4503,7 +5027,7 @@ val* var3 /* : Array[MPropDef] */;
 var3 = self->attrs[COLOR_model__MClassDef___mpropdefs].val; /* _mpropdefs on <self:Object(MClassDef)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mpropdefs");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 574);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 591);
 show_backtrace(1);
 }
 var1 = var3;
@@ -4709,19 +5233,19 @@ short int var182 /* : Bool */;
 short int var183 /* : Bool */;
 short int var185 /* : Bool */;
 short int var187 /* : Bool */;
-val* var188 /* : Range[Int] */;
-long var189 /* : Int */;
-val* var190 /* : MClass */;
-val* var192 /* : MClass */;
-long var193 /* : Int */;
-long var195 /* : Int */;
-val* var196 /* : Discrete */;
-val* var197 /* : Discrete */;
-val* var198 /* : Iterator[Discrete] */;
-short int var199 /* : Bool */;
-val* var200 /* : nullable Object */;
+long var188 /* : Int */;
 long var_i /* var i: Int */;
-long var201 /* : Int */;
+val* var189 /* : MClass */;
+val* var191 /* : MClass */;
+long var192 /* : Int */;
+long var194 /* : Int */;
+long var_195 /* var : Int */;
+short int var196 /* : Bool */;
+short int var198 /* : Bool */;
+int cltype199;
+int idtype200;
+const char* var_class_name;
+short int var201 /* : Bool */;
 val* var202 /* : Array[MType] */;
 val* var204 /* : Array[MType] */;
 val* var205 /* : nullable Object */;
@@ -4736,7 +5260,9 @@ short int var212 /* : Bool */;
 short int var213 /* : Bool */;
 short int var215 /* : Bool */;
 short int var216 /* : Bool */;
-short int var217 /* : Bool */;
+long var217 /* : Int */;
+long var218 /* : Int */;
+short int var219 /* : Bool */;
 var_mmodule = p0;
 var_anchor = p1;
 var_sup = p2;
@@ -4794,7 +5320,7 @@ var15 = ((short int (*)(val*))(var_sub->class->vft[COLOR_model__MType__need_anch
 var16 = !var15;
 if (unlikely(!var16)) {
 PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 620);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 637);
 show_backtrace(1);
 }
 {
@@ -4803,7 +5329,7 @@ var17 = ((short int (*)(val*))(var_sup->class->vft[COLOR_model__MType__need_anch
 var18 = !var17;
 if (unlikely(!var18)) {
 PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 621);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 638);
 show_backtrace(1);
 }
 } else {
@@ -4813,7 +5339,7 @@ var20 = ((short int (*)(val*, val*, val*, val*))(var_sub->class->vft[COLOR_model
 }
 if (unlikely(!var20)) {
 PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 623);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 640);
 show_backtrace(1);
 }
 var21 = NULL;
@@ -4822,7 +5348,7 @@ var22 = ((short int (*)(val*, val*, val*, val*))(var_sup->class->vft[COLOR_model
 }
 if (unlikely(!var22)) {
 PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 624);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 641);
 show_backtrace(1);
 }
 }
@@ -4871,7 +5397,7 @@ var29 = var30;
 }
 if (unlikely(!var29)) {
 PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 631);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 648);
 show_backtrace(1);
 }
 {
@@ -4879,7 +5405,7 @@ show_backtrace(1);
 var38 = var_anchor->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <var_anchor:nullable MClassType(MClassType)> */
 if (unlikely(var38 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 969);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 986);
 show_backtrace(1);
 }
 var36 = var38;
@@ -4891,7 +5417,7 @@ RET_LABEL37:(void)0;
 var41 = var36->attrs[COLOR_model__MClass___mclass_type].val; /* _mclass_type on <var36:MClass> */
 if (unlikely(var41 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass_type");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 417);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 435);
 show_backtrace(1);
 }
 var39 = var41;
@@ -4950,7 +5476,7 @@ var53 = var54;
 }
 if (unlikely(!var53)) {
 PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 635);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 652);
 show_backtrace(1);
 }
 {
@@ -4958,7 +5484,7 @@ show_backtrace(1);
 var61 = var_anchor->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <var_anchor:nullable MClassType(MClassType)> */
 if (unlikely(var61 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 969);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 986);
 show_backtrace(1);
 }
 var59 = var61;
@@ -4970,7 +5496,7 @@ RET_LABEL60:(void)0;
 var64 = var59->attrs[COLOR_model__MClass___mclass_type].val; /* _mclass_type on <var59:MClass> */
 if (unlikely(var64 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass_type");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 417);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 435);
 show_backtrace(1);
 }
 var62 = var64;
@@ -5002,7 +5528,7 @@ var_sup_accept_null = var71;
 var74 = var_sup->attrs[COLOR_model__MNullableType___mtype].val; /* _mtype on <var_sup:MType(MNullableType)> */
 if (unlikely(var74 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mtype");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1375);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1388);
 show_backtrace(1);
 }
 var72 = var74;
@@ -5046,7 +5572,7 @@ goto RET_LABEL;
 var86 = var_sub->attrs[COLOR_model__MNullableType___mtype].val; /* _mtype on <var_sub:MType(MNullableType)> */
 if (unlikely(var86 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mtype");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1375);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1388);
 show_backtrace(1);
 }
 var84 = var86;
@@ -5158,7 +5684,7 @@ var113 = var114;
 }
 if (unlikely(!var113)) {
 PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 667);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 684);
 show_backtrace(1);
 }
 {
@@ -5186,7 +5712,7 @@ goto RET_LABEL;
 var127 = var_sub->attrs[COLOR_model__MNullableType___mtype].val; /* _mtype on <var_sub:MType(MNullableType)> */
 if (unlikely(var127 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mtype");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1375);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1388);
 show_backtrace(1);
 }
 var125 = var127;
@@ -5221,7 +5747,7 @@ var131 = var_sub->type->type_table[cltype132] == idtype133;
 }
 if (unlikely(!var131)) {
 PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 679);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 696);
 show_backtrace(1);
 }
 /* <var_sup:MType> isa MNullType */
@@ -5248,7 +5774,7 @@ var138 = var_sup->type->type_table[cltype139] == idtype140;
 }
 if (unlikely(!var138)) {
 PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 686);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 703);
 show_backtrace(1);
 }
 {
@@ -5313,7 +5839,7 @@ var156 = model__MClassType__collect_mclasses(var_resolved_sub, var_mmodule);
 var159 = var_sup->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <var_sup:MType(MClassType)> */
 if (unlikely(var159 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 969);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 986);
 show_backtrace(1);
 }
 var157 = var159;
@@ -5360,7 +5886,7 @@ goto RET_LABEL;
 var174 = var_sup->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <var_sup:MType(MGenericType)> */
 if (unlikely(var174 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 969);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 986);
 show_backtrace(1);
 }
 var172 = var174;
@@ -5376,7 +5902,7 @@ var_sub2 = var175;
 var178 = var_sub2->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <var_sub2:MClassType> */
 if (unlikely(var178 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 969);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 986);
 show_backtrace(1);
 }
 var176 = var178;
@@ -5388,7 +5914,7 @@ RET_LABEL177:(void)0;
 var181 = var_sup->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <var_sup:MType(MGenericType)> */
 if (unlikely(var181 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 969);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 986);
 show_backtrace(1);
 }
 var179 = var181;
@@ -5414,54 +5940,56 @@ var182 = var183;
 }
 if (unlikely(!var182)) {
 PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 698);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 715);
 show_backtrace(1);
 }
-var188 = NEW_range__Range(&type_range__Rangekernel__Int);
-var189 = 0;
+var188 = 0;
+var_i = var188;
 {
 { /* Inline model#MClassType#mclass (var_sup) on <var_sup:MType(MGenericType)> */
-var192 = var_sup->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <var_sup:MType(MGenericType)> */
-if (unlikely(var192 == NULL)) {
+var191 = var_sup->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <var_sup:MType(MGenericType)> */
+if (unlikely(var191 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 969);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 986);
 show_backtrace(1);
 }
-var190 = var192;
-RET_LABEL191:(void)0;
-}
-}
-{
-{ /* Inline model#MClass#arity (var190) on <var190:MClass> */
-var195 = var190->attrs[COLOR_model__MClass___arity].l; /* _arity on <var190:MClass> */
-var193 = var195;
-RET_LABEL194:(void)0;
+var189 = var191;
+RET_LABEL190:(void)0;
 }
 }
 {
-var196 = BOX_kernel__Int(var189); /* autobox from Int to Discrete */
-var197 = BOX_kernel__Int(var193); /* autobox from Int to Discrete */
-range__Range__without_last(var188, var196, var197); /* Direct call range#Range#without_last on <var188:Range[Int]>*/
+{ /* Inline model#MClass#arity (var189) on <var189:MClass> */
+var194 = var189->attrs[COLOR_model__MClass___arity].l; /* _arity on <var189:MClass> */
+var192 = var194;
+RET_LABEL193:(void)0;
 }
-{
-var198 = range__Range__iterator(var188);
 }
+var_195 = var192;
 for(;;) {
 {
-var199 = ((short int (*)(val*))(var198->class->vft[COLOR_abstract_collection__Iterator__is_ok]))(var198) /* is_ok on <var198:Iterator[Discrete]>*/;
+{ /* Inline kernel#Int#< (var_i,var_195) on <var_i:Int> */
+/* Covariant cast for argument 0 (i) <var_195:Int> isa OTHER */
+/* <var_195:Int> isa OTHER */
+var198 = 1; /* easy <var_195:Int> isa OTHER*/
+if (unlikely(!var198)) {
+var_class_name = type_kernel__Int.name;
+PRINT_ERROR("Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name);
+PRINT_ERROR(" (%s:%d)\n", "../lib/standard/kernel.nit", 371);
+show_backtrace(1);
 }
-if(!var199) break;
-{
-var200 = ((val* (*)(val*))(var198->class->vft[COLOR_abstract_collection__Iterator__item]))(var198) /* item on <var198:Iterator[Discrete]>*/;
+var201 = var_i < var_195;
+var196 = var201;
+goto RET_LABEL197;
+RET_LABEL197:(void)0;
 }
-var201 = ((struct instance_kernel__Int*)var200)->value; /* autounbox from nullable Object to Int */;
-var_i = var201;
+}
+if (var196){
 {
 { /* Inline model#MClassType#arguments (var_sub2) on <var_sub2:MClassType> */
 var204 = var_sub2->attrs[COLOR_model__MClassType___arguments].val; /* _arguments on <var_sub2:MClassType> */
 if (unlikely(var204 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _arguments");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 979);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 996);
 show_backtrace(1);
 }
 var202 = var204;
@@ -5477,7 +6005,7 @@ var_sub_arg = var205;
 var208 = var_sup->attrs[COLOR_model__MClassType___arguments].val; /* _arguments on <var_sup:MType(MGenericType)> */
 if (unlikely(var208 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _arguments");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 979);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 996);
 show_backtrace(1);
 }
 var206 = var208;
@@ -5508,14 +6036,18 @@ var = var216;
 goto RET_LABEL;
 } else {
 }
-CONTINUE_label: (void)0;
+var217 = 1;
 {
-((void (*)(val*))(var198->class->vft[COLOR_abstract_collection__Iterator__next]))(var198) /* next on <var198:Iterator[Discrete]>*/;
+var218 = kernel__Int__successor(var_i, var217);
+}
+var_i = var218;
+} else {
+goto BREAK_label;
 }
 }
 BREAK_label: (void)0;
-var217 = 1;
-var = var217;
+var219 = 1;
+var = var219;
 goto RET_LABEL;
 RET_LABEL:;
 return var;
@@ -5561,7 +6093,7 @@ var3 = ((short int (*)(val*))(var_anchor->class->vft[COLOR_model__MType__need_an
 var4 = !var3;
 if (unlikely(!var4)) {
 PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 743);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 760);
 show_backtrace(1);
 }
 var5 = NULL;
@@ -5576,7 +6108,7 @@ var8 = ((short int (*)(val*))(var_res->class->vft[COLOR_model__MType__need_ancho
 var9 = !var8;
 if (unlikely(!var9)) {
 PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 746);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 763);
 show_backtrace(1);
 }
 var = var_res;
@@ -5650,18 +6182,20 @@ val* var32 /* : MType */;
 val* var_resolved_self /* var resolved_self: nullable Object */;
 val* var33 /* : Set[MClassType] */;
 val* var_supertypes /* var supertypes: Set[MClassType] */;
-val* var34 /* : Iterator[nullable Object] */;
-short int var35 /* : Bool */;
-val* var36 /* : nullable Object */;
+val* var_34 /* var : Set[MClassType] */;
+val* var35 /* : Iterator[nullable Object] */;
+val* var_36 /* var : Iterator[MClassType] */;
+short int var37 /* : Bool */;
+val* var38 /* : nullable Object */;
 val* var_supertype /* var supertype: MClassType */;
-val* var37 /* : MClass */;
 val* var39 /* : MClass */;
-short int var40 /* : Bool */;
-short int var41 /* : Bool */;
+val* var41 /* : MClass */;
+short int var42 /* : Bool */;
 short int var43 /* : Bool */;
 short int var45 /* : Bool */;
-short int var46 /* : Bool */;
-val* var47 /* : MType */;
+short int var47 /* : Bool */;
+short int var48 /* : Bool */;
+val* var49 /* : MType */;
 var_mmodule = p0;
 var_anchor = p1;
 var_super_mclass = p2;
@@ -5688,7 +6222,7 @@ if (var5){
 var11 = var_super_mclass->attrs[COLOR_model__MClass___mclass_type].val; /* _mclass_type on <var_super_mclass:MClass> */
 if (unlikely(var11 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass_type");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 417);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 435);
 show_backtrace(1);
 }
 var9 = var11;
@@ -5714,7 +6248,7 @@ if (var13){
 var16 = self->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <self:MType(MClassType)> */
 if (unlikely(var16 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 969);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 986);
 show_backtrace(1);
 }
 var14 = var16;
@@ -5773,7 +6307,7 @@ var25 = var26;
 }
 if (unlikely(!var25)) {
 PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 772);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 789);
 show_backtrace(1);
 }
 {
@@ -5787,64 +6321,73 @@ var_resolved_self = self;
 var33 = ((val* (*)(val*, val*))(var_resolved_self->class->vft[COLOR_model__MType__collect_mtypes]))(var_resolved_self, var_mmodule) /* collect_mtypes on <var_resolved_self:nullable Object(MType)>*/;
 }
 var_supertypes = var33;
+var_34 = var_supertypes;
 {
-var34 = ((val* (*)(val*))(var_supertypes->class->vft[COLOR_abstract_collection__Collection__iterator]))(var_supertypes) /* iterator on <var_supertypes:Set[MClassType]>*/;
+var35 = ((val* (*)(val*))(var_34->class->vft[COLOR_abstract_collection__Collection__iterator]))(var_34) /* iterator on <var_34:Set[MClassType]>*/;
 }
+var_36 = var35;
 for(;;) {
 {
-var35 = ((short int (*)(val*))(var34->class->vft[COLOR_abstract_collection__Iterator__is_ok]))(var34) /* is_ok on <var34:Iterator[nullable Object]>*/;
+var37 = ((short int (*)(val*))(var_36->class->vft[COLOR_abstract_collection__Iterator__is_ok]))(var_36) /* is_ok on <var_36:Iterator[MClassType]>*/;
 }
-if(!var35) break;
+if (var37){
 {
-var36 = ((val* (*)(val*))(var34->class->vft[COLOR_abstract_collection__Iterator__item]))(var34) /* item on <var34:Iterator[nullable Object]>*/;
+var38 = ((val* (*)(val*))(var_36->class->vft[COLOR_abstract_collection__Iterator__item]))(var_36) /* item on <var_36:Iterator[MClassType]>*/;
 }
-var_supertype = var36;
+var_supertype = var38;
 {
 { /* Inline model#MClassType#mclass (var_supertype) on <var_supertype:MClassType> */
-var39 = var_supertype->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <var_supertype:MClassType> */
-if (unlikely(var39 == NULL)) {
+var41 = var_supertype->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <var_supertype:MClassType> */
+if (unlikely(var41 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 969);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 986);
 show_backtrace(1);
 }
-var37 = var39;
-RET_LABEL38:(void)0;
+var39 = var41;
+RET_LABEL40:(void)0;
 }
 }
 {
-{ /* Inline kernel#Object#== (var37,var_super_mclass) on <var37:MClass> */
+{ /* Inline kernel#Object#== (var39,var_super_mclass) on <var39:MClass> */
 var_other = var_super_mclass;
 {
-{ /* Inline kernel#Object#is_same_instance (var37,var_other) on <var37:MClass> */
-var45 = var37 == var_other;
+{ /* Inline kernel#Object#is_same_instance (var39,var_other) on <var39:MClass> */
+var47 = var39 == var_other;
+var45 = var47;
+goto RET_LABEL46;
+RET_LABEL46:(void)0;
+}
+}
 var43 = var45;
 goto RET_LABEL44;
 RET_LABEL44:(void)0;
 }
+var42 = var43;
 }
-var41 = var43;
-goto RET_LABEL42;
-RET_LABEL42:(void)0;
-}
-var40 = var41;
-}
-if (var40){
-var46 = 0;
+if (var42){
+var48 = 0;
 {
-var47 = ((val* (*)(val*, val*, val*, val*, short int))(var_supertype->class->vft[COLOR_model__MType__resolve_for]))(var_supertype, self, var_anchor, var_mmodule, var46) /* resolve_for on <var_supertype:MClassType>*/;
+var49 = ((val* (*)(val*, val*, val*, val*, short int))(var_supertype->class->vft[COLOR_model__MType__resolve_for]))(var_supertype, self, var_anchor, var_mmodule, var48) /* resolve_for on <var_supertype:MClassType>*/;
 }
-var = var47;
+var = var49;
 goto RET_LABEL;
 } else {
 }
-CONTINUE_label: (void)0;
 {
-((void (*)(val*))(var34->class->vft[COLOR_abstract_collection__Iterator__next]))(var34) /* next on <var34:Iterator[nullable Object]>*/;
+((void (*)(val*))(var_36->class->vft[COLOR_abstract_collection__Iterator__next]))(var_36) /* next on <var_36:Iterator[MClassType]>*/;
+}
+} else {
+goto BREAK_label;
 }
 }
 BREAK_label: (void)0;
+{
+{ /* Inline abstract_collection#Iterator#finish (var_36) on <var_36:Iterator[MClassType]> */
+RET_LABEL50:(void)0;
+}
+}
 PRINT_ERROR("Runtime error: %s", "Aborted");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 784);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 801);
 show_backtrace(1);
 RET_LABEL:;
 return var;
@@ -5864,7 +6407,7 @@ short int var /* : Bool */;
 const char* var_class_name;
 var_class_name = self == NULL ? "null" : self->type->name;
 PRINT_ERROR("Runtime error: Abstract method `%s` called on `%s`", "can_resolve_for", var_class_name);
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 857);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 874);
 show_backtrace(1);
 RET_LABEL:;
 return var;
@@ -5877,7 +6420,7 @@ const char* var_class_name;
 { /* Inline model#MType#can_resolve_for (self,p0,p1,p2) on <self:Object(MType)> */
 var_class_name = self == NULL ? "null" : self->type->name;
 PRINT_ERROR("Runtime error: Abstract method `%s` called on `%s`", "can_resolve_for", var_class_name);
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 857);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 874);
 show_backtrace(1);
 RET_LABEL2:(void)0;
 }
@@ -6035,7 +6578,7 @@ val* var /* : Set[MClassDef] */;
 const char* var_class_name;
 var_class_name = self == NULL ? "null" : self->type->name;
 PRINT_ERROR("Runtime error: Abstract method `%s` called on `%s`", "collect_mclassdefs", var_class_name);
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 929);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 946);
 show_backtrace(1);
 RET_LABEL:;
 return var;
@@ -6048,7 +6591,7 @@ const char* var_class_name;
 { /* Inline model#MType#collect_mclassdefs (self,p0) on <self:Object(MType)> */
 var_class_name = self == NULL ? "null" : self->type->name;
 PRINT_ERROR("Runtime error: Abstract method `%s` called on `%s`", "collect_mclassdefs", var_class_name);
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 929);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 946);
 show_backtrace(1);
 RET_LABEL2:(void)0;
 }
@@ -6062,7 +6605,7 @@ val* var /* : Set[MClass] */;
 const char* var_class_name;
 var_class_name = self == NULL ? "null" : self->type->name;
 PRINT_ERROR("Runtime error: Abstract method `%s` called on `%s`", "collect_mclasses", var_class_name);
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 939);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 956);
 show_backtrace(1);
 RET_LABEL:;
 return var;
@@ -6075,7 +6618,7 @@ const char* var_class_name;
 { /* Inline model#MType#collect_mclasses (self,p0) on <self:Object(MType)> */
 var_class_name = self == NULL ? "null" : self->type->name;
 PRINT_ERROR("Runtime error: Abstract method `%s` called on `%s`", "collect_mclasses", var_class_name);
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 939);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 956);
 show_backtrace(1);
 RET_LABEL2:(void)0;
 }
@@ -6089,7 +6632,7 @@ val* var /* : Set[MClassType] */;
 const char* var_class_name;
 var_class_name = self == NULL ? "null" : self->type->name;
 PRINT_ERROR("Runtime error: Abstract method `%s` called on `%s`", "collect_mtypes", var_class_name);
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 945);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 962);
 show_backtrace(1);
 RET_LABEL:;
 return var;
@@ -6102,7 +6645,7 @@ const char* var_class_name;
 { /* Inline model#MType#collect_mtypes (self,p0) on <self:Object(MType)> */
 var_class_name = self == NULL ? "null" : self->type->name;
 PRINT_ERROR("Runtime error: Abstract method `%s` called on `%s`", "collect_mtypes", var_class_name);
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 945);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 962);
 show_backtrace(1);
 RET_LABEL2:(void)0;
 }
@@ -6129,7 +6672,7 @@ var1 = ((short int (*)(val*))(self->class->vft[COLOR_model__MType__need_anchor])
 var2 = !var1;
 if (unlikely(!var2)) {
 PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 958);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 975);
 show_backtrace(1);
 }
 {
@@ -6140,7 +6683,7 @@ var3 = ((val* (*)(val*, val*))(self->class->vft[COLOR_model__MType__collect_mcla
 var6 = var_mproperty->attrs[COLOR_model__MProperty___intro_mclassdef].val; /* _intro_mclassdef on <var_mproperty:MProperty> */
 if (unlikely(var6 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _intro_mclassdef");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1602);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1615);
 show_backtrace(1);
 }
 var4 = var6;
@@ -6171,7 +6714,7 @@ val* var1 /* : MClass */;
 var1 = self->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <self:MClassType> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 969);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 986);
 show_backtrace(1);
 }
 var = var1;
@@ -6187,7 +6730,7 @@ val* var3 /* : MClass */;
 var3 = self->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <self:Object(MClassType)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 969);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 986);
 show_backtrace(1);
 }
 var1 = var3;
@@ -6224,7 +6767,7 @@ val* var9 /* : Model */;
 var3 = self->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <self:MClassType> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 969);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 986);
 show_backtrace(1);
 }
 var1 = var3;
@@ -6236,7 +6779,7 @@ RET_LABEL2:(void)0;
 var6 = var1->attrs[COLOR_model__MClass___intro_mmodule].val; /* _intro_mmodule on <var1:MClass> */
 if (unlikely(var6 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _intro_mmodule");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 335);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 347);
 show_backtrace(1);
 }
 var4 = var6;
@@ -6248,7 +6791,7 @@ RET_LABEL5:(void)0;
 var9 = var4->attrs[COLOR_mmodule__MModule___model].val; /* _model on <var4:MModule> */
 if (unlikely(var9 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _model");
-PRINT_ERROR(" (%s:%d)\n", "src/model/mmodule.nit", 74);
+PRINT_ERROR(" (%s:%d)\n", "model/mmodule.nit", 72);
 show_backtrace(1);
 }
 var7 = var9;
@@ -6273,15 +6816,13 @@ return var;
 void model__MClassType__init(val* self, val* p0) {
 val* var_mclass /* var mclass: MClass */;
 {
-{ /* Inline model_base#MEntity#init (self) on <self:MClassType> */
-RET_LABEL1:(void)0;
-}
+((void (*)(val*))(self->class->vft[COLOR_kernel__Object__init]))(self) /* init on <self:MClassType>*/;
 }
 var_mclass = p0;
 {
 { /* Inline model#MClassType#mclass= (self,var_mclass) on <self:MClassType> */
 self->attrs[COLOR_model__MClassType___mclass].val = var_mclass; /* _mclass on <self:MClassType> */
-RET_LABEL2:(void)0;
+RET_LABEL1:(void)0;
 }
 }
 RET_LABEL:;
@@ -6298,7 +6839,7 @@ val* var1 /* : Array[MType] */;
 var1 = self->attrs[COLOR_model__MClassType___arguments].val; /* _arguments on <self:MClassType> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _arguments");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 979);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 996);
 show_backtrace(1);
 }
 var = var1;
@@ -6314,7 +6855,7 @@ val* var3 /* : Array[MType] */;
 var3 = self->attrs[COLOR_model__MClassType___arguments].val; /* _arguments on <self:Object(MClassType)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _arguments");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 979);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 996);
 show_backtrace(1);
 }
 var1 = var3;
@@ -6348,7 +6889,7 @@ val* var4 /* : String */;
 var3 = self->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <self:MClassType> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 969);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 986);
 show_backtrace(1);
 }
 var1 = var3;
@@ -6417,7 +6958,7 @@ var2 = var1->type->type_table[cltype] == idtype;
 if (unlikely(!var2)) {
 var_class_name = var1 == NULL ? "null" : var1->type->name;
 PRINT_ERROR("Runtime error: Cast failed. Expected `%s`, got `%s`", "MClassType", var_class_name);
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 989);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1006);
 show_backtrace(1);
 }
 var = var1;
@@ -6503,7 +7044,7 @@ var1 = ((short int (*)(val*))(self->class->vft[COLOR_model__MType__need_anchor])
 var2 = !var1;
 if (unlikely(!var2)) {
 PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 998);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1015);
 show_backtrace(1);
 }
 {
@@ -6511,7 +7052,7 @@ show_backtrace(1);
 var5 = self->attrs[COLOR_model__MClassType___collect_mclassdefs_cache].val; /* _collect_mclassdefs_cache on <self:MClassType> */
 if (unlikely(var5 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _collect_mclassdefs_cache");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1056);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1073);
 show_backtrace(1);
 }
 var3 = var5;
@@ -6565,7 +7106,7 @@ var1 = ((short int (*)(val*))(self->class->vft[COLOR_model__MType__need_anchor])
 var2 = !var1;
 if (unlikely(!var2)) {
 PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1008);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1025);
 show_backtrace(1);
 }
 {
@@ -6573,7 +7114,7 @@ show_backtrace(1);
 var5 = self->attrs[COLOR_model__MClassType___collect_mclasses_cache].val; /* _collect_mclasses_cache on <self:MClassType> */
 if (unlikely(var5 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _collect_mclasses_cache");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1057);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1074);
 show_backtrace(1);
 }
 var3 = var5;
@@ -6627,7 +7168,7 @@ var1 = ((short int (*)(val*))(self->class->vft[COLOR_model__MType__need_anchor])
 var2 = !var1;
 if (unlikely(!var2)) {
 PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1018);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1035);
 show_backtrace(1);
 }
 {
@@ -6635,7 +7176,7 @@ show_backtrace(1);
 var5 = self->attrs[COLOR_model__MClassType___collect_mtypes_cache].val; /* _collect_mtypes_cache on <self:MClassType> */
 if (unlikely(var5 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _collect_mtypes_cache");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1058);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1075);
 show_backtrace(1);
 }
 var3 = var5;
@@ -6693,46 +7234,50 @@ val* var13 /* : nullable Object */;
 val* var_mclass /* var mclass: MClass */;
 val* var14 /* : Array[MClassDef] */;
 val* var16 /* : Array[MClassDef] */;
-val* var17 /* : ArrayIterator[nullable Object] */;
-short int var18 /* : Bool */;
-val* var19 /* : nullable Object */;
+val* var_17 /* var : Array[MClassDef] */;
+val* var18 /* : ArrayIterator[nullable Object] */;
+val* var_19 /* var : ArrayIterator[MClassDef] */;
+short int var20 /* : Bool */;
+val* var21 /* : nullable Object */;
 val* var_mclassdef /* var mclassdef: MClassDef */;
-val* var20 /* : POSetElement[MModule] */;
 val* var22 /* : POSetElement[MModule] */;
-val* var23 /* : MModule */;
+val* var24 /* : POSetElement[MModule] */;
 val* var25 /* : MModule */;
-short int var26 /* : Bool */;
-short int var27 /* : Bool */;
-val* var28 /* : Array[MClassType] */;
+val* var27 /* : MModule */;
+short int var28 /* : Bool */;
+short int var29 /* : Bool */;
 val* var30 /* : Array[MClassType] */;
-val* var31 /* : ArrayIterator[nullable Object] */;
-short int var32 /* : Bool */;
-val* var33 /* : nullable Object */;
+val* var32 /* : Array[MClassType] */;
+val* var_33 /* var : Array[MClassType] */;
+val* var34 /* : ArrayIterator[nullable Object] */;
+val* var_35 /* var : ArrayIterator[MClassType] */;
+short int var36 /* : Bool */;
+val* var37 /* : nullable Object */;
 val* var_supertype /* var supertype: MClassType */;
-val* var34 /* : MClass */;
-val* var36 /* : MClass */;
+val* var38 /* : MClass */;
+val* var40 /* : MClass */;
 val* var_superclass /* var superclass: MClass */;
-short int var37 /* : Bool */;
-val* var40 /* : HashMap[MModule, Set[MClassDef]] */;
-val* var42 /* : HashMap[MModule, Set[MClassDef]] */;
-val* var43 /* : HashMap[MModule, Set[MClass]] */;
-val* var45 /* : HashMap[MModule, Set[MClass]] */;
-val* var46 /* : HashMap[MModule, Set[MClassType]] */;
-val* var48 /* : HashMap[MModule, Set[MClassType]] */;
+short int var41 /* : Bool */;
+val* var48 /* : HashMap[MModule, Set[MClassDef]] */;
+val* var50 /* : HashMap[MModule, Set[MClassDef]] */;
+val* var51 /* : HashMap[MModule, Set[MClass]] */;
+val* var53 /* : HashMap[MModule, Set[MClass]] */;
+val* var54 /* : HashMap[MModule, Set[MClassType]] */;
+val* var56 /* : HashMap[MModule, Set[MClassType]] */;
 var_mmodule = p0;
 var = NEW_hash_collection__HashSet(&type_hash_collection__HashSetmodel__MClassDef);
 {
-hash_collection__HashSet__init(var); /* Direct call hash_collection#HashSet#init on <var:HashSet[MClassDef]>*/
+((void (*)(val*))(var->class->vft[COLOR_kernel__Object__init]))(var) /* init on <var:HashSet[MClassDef]>*/;
 }
 var_res = var;
 var1 = NEW_hash_collection__HashSet(&type_hash_collection__HashSetmodel__MClass);
 {
-hash_collection__HashSet__init(var1); /* Direct call hash_collection#HashSet#init on <var1:HashSet[MClass]>*/
+((void (*)(val*))(var1->class->vft[COLOR_kernel__Object__init]))(var1) /* init on <var1:HashSet[MClass]>*/;
 }
 var_seen = var1;
 var2 = NEW_hash_collection__HashSet(&type_hash_collection__HashSetmodel__MClassType);
 {
-hash_collection__HashSet__init(var2); /* Direct call hash_collection#HashSet#init on <var2:HashSet[MClassType]>*/
+((void (*)(val*))(var2->class->vft[COLOR_kernel__Object__init]))(var2) /* init on <var2:HashSet[MClassType]>*/;
 }
 var_types = var2;
 {
@@ -6740,7 +7285,7 @@ var_types = var2;
 var5 = self->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <self:MClassType> */
 if (unlikely(var5 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 969);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 986);
 show_backtrace(1);
 }
 var3 = var5;
@@ -6761,7 +7306,7 @@ var_ = var6;
 var10 = self->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <self:MClassType> */
 if (unlikely(var10 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 969);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 986);
 show_backtrace(1);
 }
 var8 = var10;
@@ -6777,7 +7322,7 @@ for(;;) {
 var11 = array__AbstractArrayRead__is_empty(var_todo);
 }
 var12 = !var11;
-if (!var12) break;
+if (var12){
 {
 var13 = array__AbstractArray__pop(var_todo);
 }
@@ -6787,55 +7332,57 @@ var_mclass = var13;
 var16 = var_mclass->attrs[COLOR_model__MClass___mclassdefs].val; /* _mclassdefs on <var_mclass:MClass> */
 if (unlikely(var16 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclassdefs");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 392);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 414);
 show_backtrace(1);
 }
 var14 = var16;
 RET_LABEL15:(void)0;
 }
 }
+var_17 = var14;
 {
-var17 = array__AbstractArrayRead__iterator(var14);
+var18 = array__AbstractArrayRead__iterator(var_17);
 }
+var_19 = var18;
 for(;;) {
 {
-var18 = array__ArrayIterator__is_ok(var17);
+var20 = array__ArrayIterator__is_ok(var_19);
 }
-if(!var18) break;
+if (var20){
 {
-var19 = array__ArrayIterator__item(var17);
+var21 = array__ArrayIterator__item(var_19);
 }
-var_mclassdef = var19;
+var_mclassdef = var21;
 {
 { /* Inline mmodule#MModule#in_importation (var_mmodule) on <var_mmodule:MModule> */
-var22 = var_mmodule->attrs[COLOR_mmodule__MModule___in_importation].val; /* _in_importation on <var_mmodule:MModule> */
-if (unlikely(var22 == NULL)) {
+var24 = var_mmodule->attrs[COLOR_mmodule__MModule___in_importation].val; /* _in_importation on <var_mmodule:MModule> */
+if (unlikely(var24 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _in_importation");
-PRINT_ERROR(" (%s:%d)\n", "src/model/mmodule.nit", 101);
+PRINT_ERROR(" (%s:%d)\n", "model/mmodule.nit", 93);
 show_backtrace(1);
 }
-var20 = var22;
-RET_LABEL21:(void)0;
+var22 = var24;
+RET_LABEL23:(void)0;
 }
 }
 {
 { /* Inline model#MClassDef#mmodule (var_mclassdef) on <var_mclassdef:MClassDef> */
-var25 = var_mclassdef->attrs[COLOR_model__MClassDef___mmodule].val; /* _mmodule on <var_mclassdef:MClassDef> */
-if (unlikely(var25 == NULL)) {
+var27 = var_mclassdef->attrs[COLOR_model__MClassDef___mmodule].val; /* _mmodule on <var_mclassdef:MClassDef> */
+if (unlikely(var27 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mmodule");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 471);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 489);
 show_backtrace(1);
 }
-var23 = var25;
-RET_LABEL24:(void)0;
+var25 = var27;
+RET_LABEL26:(void)0;
 }
 }
 {
-var26 = poset__POSetElement___60d_61d(var20, var23);
+var28 = poset__POSetElement___60d_61d(var22, var25);
 }
-var27 = !var26;
-if (var27){
-goto CONTINUE_label;
+var29 = !var28;
+if (var29){
+goto BREAK_label;
 } else {
 }
 {
@@ -6843,49 +7390,51 @@ hash_collection__HashSet__add(var_res, var_mclassdef); /* Direct call hash_colle
 }
 {
 { /* Inline model#MClassDef#supertypes (var_mclassdef) on <var_mclassdef:MClassDef> */
-var30 = var_mclassdef->attrs[COLOR_model__MClassDef___supertypes].val; /* _supertypes on <var_mclassdef:MClassDef> */
-if (unlikely(var30 == NULL)) {
+var32 = var_mclassdef->attrs[COLOR_model__MClassDef___supertypes].val; /* _supertypes on <var_mclassdef:MClassDef> */
+if (unlikely(var32 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _supertypes");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 517);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 534);
 show_backtrace(1);
 }
-var28 = var30;
-RET_LABEL29:(void)0;
+var30 = var32;
+RET_LABEL31:(void)0;
 }
 }
+var_33 = var30;
 {
-var31 = array__AbstractArrayRead__iterator(var28);
+var34 = array__AbstractArrayRead__iterator(var_33);
 }
+var_35 = var34;
 for(;;) {
 {
-var32 = array__ArrayIterator__is_ok(var31);
+var36 = array__ArrayIterator__is_ok(var_35);
 }
-if(!var32) break;
+if (var36){
 {
-var33 = array__ArrayIterator__item(var31);
+var37 = array__ArrayIterator__item(var_35);
 }
-var_supertype = var33;
+var_supertype = var37;
 {
 hash_collection__HashSet__add(var_types, var_supertype); /* Direct call hash_collection#HashSet#add on <var_types:HashSet[MClassType]>*/
 }
 {
 { /* Inline model#MClassType#mclass (var_supertype) on <var_supertype:MClassType> */
-var36 = var_supertype->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <var_supertype:MClassType> */
-if (unlikely(var36 == NULL)) {
+var40 = var_supertype->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <var_supertype:MClassType> */
+if (unlikely(var40 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 969);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 986);
 show_backtrace(1);
 }
-var34 = var36;
-RET_LABEL35:(void)0;
+var38 = var40;
+RET_LABEL39:(void)0;
 }
 }
-var_superclass = var34;
+var_superclass = var38;
 {
-var37 = hash_collection__HashSet__has(var_seen, var_superclass);
+var41 = hash_collection__HashSet__has(var_seen, var_superclass);
 }
-if (var37){
-goto CONTINUE_label38;
+if (var41){
+goto BREAK_label42;
 } else {
 }
 {
@@ -6894,65 +7443,83 @@ hash_collection__HashSet__add(var_seen, var_superclass); /* Direct call hash_col
 {
 array__Array__add(var_todo, var_superclass); /* Direct call array#Array#add on <var_todo:Array[MClass]>*/
 }
-CONTINUE_label38: (void)0;
+BREAK_label42: (void)0;
 {
-array__ArrayIterator__next(var31); /* Direct call array#ArrayIterator#next on <var31:ArrayIterator[nullable Object]>*/
+array__ArrayIterator__next(var_35); /* Direct call array#ArrayIterator#next on <var_35:ArrayIterator[MClassType]>*/
+}
+} else {
+goto BREAK_label43;
 }
 }
-BREAK_label38: (void)0;
-CONTINUE_label: (void)0;
+BREAK_label43: (void)0;
 {
-array__ArrayIterator__next(var17); /* Direct call array#ArrayIterator#next on <var17:ArrayIterator[nullable Object]>*/
+{ /* Inline abstract_collection#Iterator#finish (var_35) on <var_35:ArrayIterator[MClassType]> */
+RET_LABEL44:(void)0;
 }
 }
 BREAK_label: (void)0;
-CONTINUE_label39: (void)0;
+{
+array__ArrayIterator__next(var_19); /* Direct call array#ArrayIterator#next on <var_19:ArrayIterator[MClassDef]>*/
+}
+} else {
+goto BREAK_label45;
+}
+}
+BREAK_label45: (void)0;
+{
+{ /* Inline abstract_collection#Iterator#finish (var_19) on <var_19:ArrayIterator[MClassDef]> */
+RET_LABEL46:(void)0;
 }
-BREAK_label39: (void)0;
+}
+} else {
+goto BREAK_label47;
+}
+}
+BREAK_label47: (void)0;
 {
 { /* Inline model#MClassType#collect_mclassdefs_cache (self) on <self:MClassType> */
-var42 = self->attrs[COLOR_model__MClassType___collect_mclassdefs_cache].val; /* _collect_mclassdefs_cache on <self:MClassType> */
-if (unlikely(var42 == NULL)) {
+var50 = self->attrs[COLOR_model__MClassType___collect_mclassdefs_cache].val; /* _collect_mclassdefs_cache on <self:MClassType> */
+if (unlikely(var50 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _collect_mclassdefs_cache");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1056);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1073);
 show_backtrace(1);
 }
-var40 = var42;
-RET_LABEL41:(void)0;
+var48 = var50;
+RET_LABEL49:(void)0;
 }
 }
 {
-hash_collection__HashMap___91d_93d_61d(var40, var_mmodule, var_res); /* Direct call hash_collection#HashMap#[]= on <var40:HashMap[MModule, Set[MClassDef]]>*/
+hash_collection__HashMap___91d_93d_61d(var48, var_mmodule, var_res); /* Direct call hash_collection#HashMap#[]= on <var48:HashMap[MModule, Set[MClassDef]]>*/
 }
 {
 { /* Inline model#MClassType#collect_mclasses_cache (self) on <self:MClassType> */
-var45 = self->attrs[COLOR_model__MClassType___collect_mclasses_cache].val; /* _collect_mclasses_cache on <self:MClassType> */
-if (unlikely(var45 == NULL)) {
+var53 = self->attrs[COLOR_model__MClassType___collect_mclasses_cache].val; /* _collect_mclasses_cache on <self:MClassType> */
+if (unlikely(var53 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _collect_mclasses_cache");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1057);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1074);
 show_backtrace(1);
 }
-var43 = var45;
-RET_LABEL44:(void)0;
+var51 = var53;
+RET_LABEL52:(void)0;
 }
 }
 {
-hash_collection__HashMap___91d_93d_61d(var43, var_mmodule, var_seen); /* Direct call hash_collection#HashMap#[]= on <var43:HashMap[MModule, Set[MClass]]>*/
+hash_collection__HashMap___91d_93d_61d(var51, var_mmodule, var_seen); /* Direct call hash_collection#HashMap#[]= on <var51:HashMap[MModule, Set[MClass]]>*/
 }
 {
 { /* Inline model#MClassType#collect_mtypes_cache (self) on <self:MClassType> */
-var48 = self->attrs[COLOR_model__MClassType___collect_mtypes_cache].val; /* _collect_mtypes_cache on <self:MClassType> */
-if (unlikely(var48 == NULL)) {
+var56 = self->attrs[COLOR_model__MClassType___collect_mtypes_cache].val; /* _collect_mtypes_cache on <self:MClassType> */
+if (unlikely(var56 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _collect_mtypes_cache");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1058);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1075);
 show_backtrace(1);
 }
-var46 = var48;
-RET_LABEL47:(void)0;
+var54 = var56;
+RET_LABEL55:(void)0;
 }
 }
 {
-hash_collection__HashMap___91d_93d_61d(var46, var_mmodule, var_types); /* Direct call hash_collection#HashMap#[]= on <var46:HashMap[MModule, Set[MClassType]]>*/
+hash_collection__HashMap___91d_93d_61d(var54, var_mmodule, var_types); /* Direct call hash_collection#HashMap#[]= on <var54:HashMap[MModule, Set[MClassType]]>*/
 }
 RET_LABEL:;
 }
@@ -6968,7 +7535,7 @@ val* var1 /* : HashMap[MModule, Set[MClassDef]] */;
 var1 = self->attrs[COLOR_model__MClassType___collect_mclassdefs_cache].val; /* _collect_mclassdefs_cache on <self:MClassType> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _collect_mclassdefs_cache");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1056);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1073);
 show_backtrace(1);
 }
 var = var1;
@@ -6984,7 +7551,7 @@ val* var3 /* : HashMap[MModule, Set[MClassDef]] */;
 var3 = self->attrs[COLOR_model__MClassType___collect_mclassdefs_cache].val; /* _collect_mclassdefs_cache on <self:Object(MClassType)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _collect_mclassdefs_cache");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1056);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1073);
 show_backtrace(1);
 }
 var1 = var3;
@@ -7001,7 +7568,7 @@ val* var1 /* : HashMap[MModule, Set[MClass]] */;
 var1 = self->attrs[COLOR_model__MClassType___collect_mclasses_cache].val; /* _collect_mclasses_cache on <self:MClassType> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _collect_mclasses_cache");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1057);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1074);
 show_backtrace(1);
 }
 var = var1;
@@ -7017,7 +7584,7 @@ val* var3 /* : HashMap[MModule, Set[MClass]] */;
 var3 = self->attrs[COLOR_model__MClassType___collect_mclasses_cache].val; /* _collect_mclasses_cache on <self:Object(MClassType)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _collect_mclasses_cache");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1057);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1074);
 show_backtrace(1);
 }
 var1 = var3;
@@ -7034,7 +7601,7 @@ val* var1 /* : HashMap[MModule, Set[MClassType]] */;
 var1 = self->attrs[COLOR_model__MClassType___collect_mtypes_cache].val; /* _collect_mtypes_cache on <self:MClassType> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _collect_mtypes_cache");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1058);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1075);
 show_backtrace(1);
 }
 var = var1;
@@ -7050,7 +7617,7 @@ val* var3 /* : HashMap[MModule, Set[MClassType]] */;
 var3 = self->attrs[COLOR_model__MClassType___collect_mtypes_cache].val; /* _collect_mtypes_cache on <self:Object(MClassType)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _collect_mtypes_cache");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1058);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1075);
 show_backtrace(1);
 }
 var1 = var3;
@@ -7069,36 +7636,39 @@ val* var2 /* : MClass */;
 long var3 /* : Int */;
 long var5 /* : Int */;
 long var6 /* : Int */;
-short int var7 /* : Bool */;
-short int var8 /* : Bool */;
+long var8 /* : Int */;
+short int var9 /* : Bool */;
 short int var10 /* : Bool */;
 short int var12 /* : Bool */;
-val* var14 /* : ArrayIterator[nullable Object] */;
-short int var15 /* : Bool */;
-val* var16 /* : nullable Object */;
-val* var_t /* var t: MType */;
-short int var17 /* : Bool */;
+short int var14 /* : Bool */;
+val* var_ /* var : Array[MType] */;
+val* var16 /* : ArrayIterator[nullable Object] */;
+val* var_17 /* var : ArrayIterator[MType] */;
 short int var18 /* : Bool */;
+val* var19 /* : nullable Object */;
+val* var_t /* var t: MType */;
+short int var20 /* : Bool */;
+short int var21 /* : Bool */;
 static val* varonce;
-val* var20 /* : String */;
-char* var21 /* : NativeString */;
-long var22 /* : Int */;
-val* var23 /* : FlatString */;
-static val* varonce24;
-val* var25 /* : String */;
-char* var26 /* : NativeString */;
-long var27 /* : Int */;
-val* var28 /* : FlatString */;
+val* var24 /* : String */;
+char* var25 /* : NativeString */;
+long var26 /* : Int */;
+val* var27 /* : FlatString */;
+static val* varonce28;
 val* var29 /* : String */;
-static val* varonce30;
-val* var31 /* : String */;
-char* var32 /* : NativeString */;
-long var33 /* : Int */;
-val* var34 /* : FlatString */;
-val* var35 /* : Array[Object] */;
-long var36 /* : Int */;
-val* var37 /* : NativeArray[Object] */;
-val* var38 /* : String */;
+char* var30 /* : NativeString */;
+long var31 /* : Int */;
+val* var32 /* : FlatString */;
+val* var33 /* : String */;
+static val* varonce34;
+val* var35 /* : String */;
+char* var36 /* : NativeString */;
+long var37 /* : Int */;
+val* var38 /* : FlatString */;
+val* var39 /* : Array[Object] */;
+long var40 /* : Int */;
+val* var41 /* : NativeArray[Object] */;
+val* var42 /* : String */;
 var_mclass = p0;
 var_arguments = p1;
 {
@@ -7109,7 +7679,7 @@ model__MClassType__init(self, var_mclass); /* Direct call model#MClassType#init
 var2 = self->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <self:MGenericType> */
 if (unlikely(var2 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 969);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 986);
 show_backtrace(1);
 }
 var = var2;
@@ -7124,116 +7694,129 @@ RET_LABEL4:(void)0;
 }
 }
 {
-var6 = array__AbstractArrayRead__length(var_arguments);
+{ /* Inline array#AbstractArrayRead#length (var_arguments) on <var_arguments:Array[MType]> */
+var8 = var_arguments->attrs[COLOR_array__AbstractArrayRead___length].l; /* _length on <var_arguments:Array[MType]> */
+var6 = var8;
+RET_LABEL7:(void)0;
+}
 }
 {
 { /* Inline kernel#Int#== (var3,var6) on <var3:Int> */
-var10 = var3 == var6;
-var8 = var10;
-goto RET_LABEL9;
-RET_LABEL9:(void)0;
+var12 = var3 == var6;
+var10 = var12;
+goto RET_LABEL11;
+RET_LABEL11:(void)0;
 }
-var7 = var8;
+var9 = var10;
 }
-if (unlikely(!var7)) {
+if (unlikely(!var9)) {
 PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1070);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1087);
 show_backtrace(1);
 }
 {
 { /* Inline model#MClassType#arguments= (self,var_arguments) on <self:MGenericType> */
 self->attrs[COLOR_model__MClassType___arguments].val = var_arguments; /* _arguments on <self:MGenericType> */
-RET_LABEL11:(void)0;
+RET_LABEL13:(void)0;
 }
 }
-var12 = 0;
+var14 = 0;
 {
-{ /* Inline model#MGenericType#need_anchor= (self,var12) on <self:MGenericType> */
-self->attrs[COLOR_model__MGenericType___need_anchor].s = var12; /* _need_anchor on <self:MGenericType> */
-RET_LABEL13:(void)0;
+{ /* Inline model#MGenericType#need_anchor= (self,var14) on <self:MGenericType> */
+self->attrs[COLOR_model__MGenericType___need_anchor].s = var14; /* _need_anchor on <self:MGenericType> */
+RET_LABEL15:(void)0;
 }
 }
+var_ = var_arguments;
 {
-var14 = array__AbstractArrayRead__iterator(var_arguments);
+var16 = array__AbstractArrayRead__iterator(var_);
 }
+var_17 = var16;
 for(;;) {
 {
-var15 = array__ArrayIterator__is_ok(var14);
+var18 = array__ArrayIterator__is_ok(var_17);
 }
-if(!var15) break;
+if (var18){
 {
-var16 = array__ArrayIterator__item(var14);
+var19 = array__ArrayIterator__item(var_17);
 }
-var_t = var16;
+var_t = var19;
 {
-var17 = ((short int (*)(val*))(var_t->class->vft[COLOR_model__MType__need_anchor]))(var_t) /* need_anchor on <var_t:MType>*/;
+var20 = ((short int (*)(val*))(var_t->class->vft[COLOR_model__MType__need_anchor]))(var_t) /* need_anchor on <var_t:MType>*/;
 }
-if (var17){
-var18 = 1;
+if (var20){
+var21 = 1;
 {
-{ /* Inline model#MGenericType#need_anchor= (self,var18) on <self:MGenericType> */
-self->attrs[COLOR_model__MGenericType___need_anchor].s = var18; /* _need_anchor on <self:MGenericType> */
-RET_LABEL19:(void)0;
+{ /* Inline model#MGenericType#need_anchor= (self,var21) on <self:MGenericType> */
+self->attrs[COLOR_model__MGenericType___need_anchor].s = var21; /* _need_anchor on <self:MGenericType> */
+RET_LABEL22:(void)0;
 }
 }
 goto BREAK_label;
 } else {
 }
-CONTINUE_label: (void)0;
 {
-array__ArrayIterator__next(var14); /* Direct call array#ArrayIterator#next on <var14:ArrayIterator[nullable Object]>*/
+array__ArrayIterator__next(var_17); /* Direct call array#ArrayIterator#next on <var_17:ArrayIterator[MType]>*/
+}
+} else {
+goto BREAK_label;
 }
 }
 BREAK_label: (void)0;
+{
+{ /* Inline abstract_collection#Iterator#finish (var_17) on <var_17:ArrayIterator[MType]> */
+RET_LABEL23:(void)0;
+}
+}
 if (varonce) {
-var20 = varonce;
+var24 = varonce;
 } else {
-var21 = "[";
-var22 = 1;
-var23 = string__NativeString__to_s_with_length(var21, var22);
-var20 = var23;
-varonce = var20;
+var25 = "[";
+var26 = 1;
+var27 = string__NativeString__to_s_with_length(var25, var26);
+var24 = var27;
+varonce = var24;
 }
-if (varonce24) {
-var25 = varonce24;
+if (varonce28) {
+var29 = varonce28;
 } else {
-var26 = ", ";
-var27 = 2;
-var28 = string__NativeString__to_s_with_length(var26, var27);
-var25 = var28;
-varonce24 = var25;
+var30 = ", ";
+var31 = 2;
+var32 = string__NativeString__to_s_with_length(var30, var31);
+var29 = var32;
+varonce28 = var29;
 }
 {
-var29 = string__Collection__join(var_arguments, var25);
+var33 = string__Collection__join(var_arguments, var29);
 }
-if (varonce30) {
-var31 = varonce30;
+if (varonce34) {
+var35 = varonce34;
 } else {
-var32 = "]";
-var33 = 1;
-var34 = string__NativeString__to_s_with_length(var32, var33);
-var31 = var34;
-varonce30 = var31;
+var36 = "]";
+var37 = 1;
+var38 = string__NativeString__to_s_with_length(var36, var37);
+var35 = var38;
+varonce34 = var35;
 }
-var35 = NEW_array__Array(&type_array__Arraykernel__Object);
-{ /* var35 = array_instance Array[Object] */
-var36 = 4;
-var37 = NEW_array__NativeArray(var36, &type_array__NativeArraykernel__Object);
-((struct instance_array__NativeArray*)var37)->values[0] = (val*) var_mclass;
-((struct instance_array__NativeArray*)var37)->values[1] = (val*) var20;
-((struct instance_array__NativeArray*)var37)->values[2] = (val*) var29;
-((struct instance_array__NativeArray*)var37)->values[3] = (val*) var31;
+var39 = NEW_array__Array(&type_array__Arraykernel__Object);
+{ /* var39 = array_instance Array[Object] */
+var40 = 4;
+var41 = NEW_array__NativeArray(var40, &type_array__NativeArraykernel__Object);
+((struct instance_array__NativeArray*)var41)->values[0] = (val*) var_mclass;
+((struct instance_array__NativeArray*)var41)->values[1] = (val*) var24;
+((struct instance_array__NativeArray*)var41)->values[2] = (val*) var33;
+((struct instance_array__NativeArray*)var41)->values[3] = (val*) var35;
 {
-((void (*)(val*, val*, long))(var35->class->vft[COLOR_array__Array__with_native]))(var35, var37, var36) /* with_native on <var35:Array[Object]>*/;
+((void (*)(val*, val*, long))(var39->class->vft[COLOR_array__Array__with_native]))(var39, var41, var40) /* with_native on <var39:Array[Object]>*/;
 }
 }
 {
-var38 = ((val* (*)(val*))(var35->class->vft[COLOR_string__Object__to_s]))(var35) /* to_s on <var35:Array[Object]>*/;
+var42 = ((val* (*)(val*))(var39->class->vft[COLOR_string__Object__to_s]))(var39) /* to_s on <var39:Array[Object]>*/;
 }
 {
-{ /* Inline model#MGenericType#to_s= (self,var38) on <self:MGenericType> */
-self->attrs[COLOR_model__MGenericType___to_s].val = var38; /* _to_s on <self:MGenericType> */
-RET_LABEL39:(void)0;
+{ /* Inline model#MGenericType#to_s= (self,var42) on <self:MGenericType> */
+self->attrs[COLOR_model__MGenericType___to_s].val = var42; /* _to_s on <self:MGenericType> */
+RET_LABEL43:(void)0;
 }
 }
 RET_LABEL:;
@@ -7250,7 +7833,7 @@ val* var1 /* : String */;
 var1 = self->attrs[COLOR_model__MGenericType___to_s].val; /* _to_s on <self:MGenericType> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _to_s");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1084);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1101);
 show_backtrace(1);
 }
 var = var1;
@@ -7266,7 +7849,7 @@ val* var3 /* : String */;
 var3 = self->attrs[COLOR_model__MGenericType___to_s].val; /* _to_s on <self:Object(MGenericType)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _to_s");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1084);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1101);
 show_backtrace(1);
 }
 var1 = var3;
@@ -7340,14 +7923,16 @@ val* var6 /* : Array[MType] */;
 val* var_types /* var types: Array[MType] */;
 val* var7 /* : Array[MType] */;
 val* var9 /* : Array[MType] */;
+val* var_ /* var : Array[MType] */;
 val* var10 /* : ArrayIterator[nullable Object] */;
-short int var11 /* : Bool */;
-val* var12 /* : nullable Object */;
+val* var_11 /* var : ArrayIterator[MType] */;
+short int var12 /* : Bool */;
+val* var13 /* : nullable Object */;
 val* var_t /* var t: MType */;
-val* var13 /* : MType */;
-val* var14 /* : MClass */;
+val* var14 /* : MType */;
 val* var16 /* : MClass */;
-val* var17 /* : MClassType */;
+val* var18 /* : MClass */;
+val* var19 /* : MClassType */;
 var_mtype = p0;
 var_anchor = p1;
 var_mmodule = p2;
@@ -7370,12 +7955,12 @@ var5 = model__MGenericType__can_resolve_for(self, var_mtype, var_anchor, var_mmo
 }
 if (unlikely(!var5)) {
 PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1093);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1110);
 show_backtrace(1);
 }
 var6 = NEW_array__Array(&type_array__Arraymodel__MType);
 {
-array__Array__init(var6); /* Direct call array#Array#init on <var6:Array[MType]>*/
+((void (*)(val*))(var6->class->vft[COLOR_kernel__Object__init]))(var6) /* init on <var6:Array[MType]>*/;
 }
 var_types = var6;
 {
@@ -7383,53 +7968,62 @@ var_types = var6;
 var9 = self->attrs[COLOR_model__MClassType___arguments].val; /* _arguments on <self:MGenericType> */
 if (unlikely(var9 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _arguments");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 979);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 996);
 show_backtrace(1);
 }
 var7 = var9;
 RET_LABEL8:(void)0;
 }
 }
+var_ = var7;
 {
-var10 = array__AbstractArrayRead__iterator(var7);
+var10 = array__AbstractArrayRead__iterator(var_);
 }
+var_11 = var10;
 for(;;) {
 {
-var11 = array__ArrayIterator__is_ok(var10);
+var12 = array__ArrayIterator__is_ok(var_11);
 }
-if(!var11) break;
+if (var12){
 {
-var12 = array__ArrayIterator__item(var10);
+var13 = array__ArrayIterator__item(var_11);
 }
-var_t = var12;
+var_t = var13;
 {
-var13 = ((val* (*)(val*, val*, val*, val*, short int))(var_t->class->vft[COLOR_model__MType__resolve_for]))(var_t, var_mtype, var_anchor, var_mmodule, var_cleanup_virtual) /* resolve_for on <var_t:MType>*/;
+var14 = ((val* (*)(val*, val*, val*, val*, short int))(var_t->class->vft[COLOR_model__MType__resolve_for]))(var_t, var_mtype, var_anchor, var_mmodule, var_cleanup_virtual) /* resolve_for on <var_t:MType>*/;
 }
 {
-array__Array__add(var_types, var13); /* Direct call array#Array#add on <var_types:Array[MType]>*/
+array__Array__add(var_types, var14); /* Direct call array#Array#add on <var_types:Array[MType]>*/
 }
-CONTINUE_label: (void)0;
 {
-array__ArrayIterator__next(var10); /* Direct call array#ArrayIterator#next on <var10:ArrayIterator[nullable Object]>*/
+array__ArrayIterator__next(var_11); /* Direct call array#ArrayIterator#next on <var_11:ArrayIterator[MType]>*/
+}
+} else {
+goto BREAK_label;
 }
 }
 BREAK_label: (void)0;
 {
+{ /* Inline abstract_collection#Iterator#finish (var_11) on <var_11:ArrayIterator[MType]> */
+RET_LABEL15:(void)0;
+}
+}
+{
 { /* Inline model#MClassType#mclass (self) on <self:MGenericType> */
-var16 = self->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <self:MGenericType> */
-if (unlikely(var16 == NULL)) {
+var18 = self->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <self:MGenericType> */
+if (unlikely(var18 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 969);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 986);
 show_backtrace(1);
 }
-var14 = var16;
-RET_LABEL15:(void)0;
+var16 = var18;
+RET_LABEL17:(void)0;
 }
 }
 {
-var17 = model__MClass__get_mtype(var14, var_types);
+var19 = model__MClass__get_mtype(var16, var_types);
 }
-var = var17;
+var = var19;
 goto RET_LABEL;
 RET_LABEL:;
 return var;
@@ -7455,14 +8049,16 @@ short int var4 /* : Bool */;
 short int var5 /* : Bool */;
 val* var6 /* : Array[MType] */;
 val* var8 /* : Array[MType] */;
+val* var_ /* var : Array[MType] */;
 val* var9 /* : ArrayIterator[nullable Object] */;
-short int var10 /* : Bool */;
-val* var11 /* : nullable Object */;
+val* var_10 /* var : ArrayIterator[MType] */;
+short int var11 /* : Bool */;
+val* var12 /* : nullable Object */;
 val* var_t /* var t: MType */;
-short int var12 /* : Bool */;
 short int var13 /* : Bool */;
 short int var14 /* : Bool */;
 short int var15 /* : Bool */;
+short int var17 /* : Bool */;
 var_mtype = p0;
 var_anchor = p1;
 var_mmodule = p2;
@@ -7485,43 +8081,52 @@ goto RET_LABEL;
 var8 = self->attrs[COLOR_model__MClassType___arguments].val; /* _arguments on <self:MGenericType> */
 if (unlikely(var8 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _arguments");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 979);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 996);
 show_backtrace(1);
 }
 var6 = var8;
 RET_LABEL7:(void)0;
 }
 }
+var_ = var6;
 {
-var9 = array__AbstractArrayRead__iterator(var6);
+var9 = array__AbstractArrayRead__iterator(var_);
 }
+var_10 = var9;
 for(;;) {
 {
-var10 = array__ArrayIterator__is_ok(var9);
+var11 = array__ArrayIterator__is_ok(var_10);
 }
-if(!var10) break;
+if (var11){
 {
-var11 = array__ArrayIterator__item(var9);
+var12 = array__ArrayIterator__item(var_10);
 }
-var_t = var11;
+var_t = var12;
 {
-var12 = ((short int (*)(val*, val*, val*, val*))(var_t->class->vft[COLOR_model__MType__can_resolve_for]))(var_t, var_mtype, var_anchor, var_mmodule) /* can_resolve_for on <var_t:MType>*/;
+var13 = ((short int (*)(val*, val*, val*, val*))(var_t->class->vft[COLOR_model__MType__can_resolve_for]))(var_t, var_mtype, var_anchor, var_mmodule) /* can_resolve_for on <var_t:MType>*/;
 }
-var13 = !var12;
-if (var13){
-var14 = 0;
-var = var14;
+var14 = !var13;
+if (var14){
+var15 = 0;
+var = var15;
 goto RET_LABEL;
 } else {
 }
-CONTINUE_label: (void)0;
 {
-array__ArrayIterator__next(var9); /* Direct call array#ArrayIterator#next on <var9:ArrayIterator[nullable Object]>*/
+array__ArrayIterator__next(var_10); /* Direct call array#ArrayIterator#next on <var_10:ArrayIterator[MType]>*/
+}
+} else {
+goto BREAK_label;
 }
 }
 BREAK_label: (void)0;
-var15 = 1;
-var = var15;
+{
+{ /* Inline abstract_collection#Iterator#finish (var_10) on <var_10:ArrayIterator[MType]> */
+RET_LABEL16:(void)0;
+}
+}
+var17 = 1;
+var = var17;
 goto RET_LABEL;
 RET_LABEL:;
 return var;
@@ -7542,17 +8147,19 @@ long var1 /* : Int */;
 long var_res /* var res: Int */;
 val* var2 /* : Array[MType] */;
 val* var4 /* : Array[MType] */;
+val* var_ /* var : Array[MType] */;
 val* var5 /* : ArrayIterator[nullable Object] */;
-short int var6 /* : Bool */;
-val* var7 /* : nullable Object */;
+val* var_6 /* var : ArrayIterator[MType] */;
+short int var7 /* : Bool */;
+val* var8 /* : nullable Object */;
 val* var_a /* var a: MType */;
-long var8 /* : Int */;
 long var9 /* : Int */;
-short int var11 /* : Bool */;
+long var10 /* : Int */;
+short int var12 /* : Bool */;
 int cltype;
 int idtype;
 const char* var_class_name;
-long var12 /* : Int */;
+long var13 /* : Int */;
 var1 = 1;
 var_res = var1;
 {
@@ -7560,52 +8167,61 @@ var_res = var1;
 var4 = self->attrs[COLOR_model__MClassType___arguments].val; /* _arguments on <self:MGenericType> */
 if (unlikely(var4 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _arguments");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 979);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 996);
 show_backtrace(1);
 }
 var2 = var4;
 RET_LABEL3:(void)0;
 }
 }
+var_ = var2;
 {
-var5 = array__AbstractArrayRead__iterator(var2);
+var5 = array__AbstractArrayRead__iterator(var_);
 }
+var_6 = var5;
 for(;;) {
 {
-var6 = array__ArrayIterator__is_ok(var5);
+var7 = array__ArrayIterator__is_ok(var_6);
 }
-if(!var6) break;
+if (var7){
 {
-var7 = array__ArrayIterator__item(var5);
+var8 = array__ArrayIterator__item(var_6);
 }
-var_a = var7;
+var_a = var8;
 {
-var8 = ((long (*)(val*))(var_a->class->vft[COLOR_model__MType__length]))(var_a) /* length on <var_a:MType>*/;
+var9 = ((long (*)(val*))(var_a->class->vft[COLOR_model__MType__length]))(var_a) /* length on <var_a:MType>*/;
 }
 {
-{ /* Inline kernel#Int#+ (var_res,var8) on <var_res:Int> */
-/* Covariant cast for argument 0 (i) <var8:Int> isa OTHER */
-/* <var8:Int> isa OTHER */
-var11 = 1; /* easy <var8:Int> isa OTHER*/
-if (unlikely(!var11)) {
+{ /* Inline kernel#Int#+ (var_res,var9) on <var_res:Int> */
+/* Covariant cast for argument 0 (i) <var9:Int> isa OTHER */
+/* <var9:Int> isa OTHER */
+var12 = 1; /* easy <var9:Int> isa OTHER*/
+if (unlikely(!var12)) {
 var_class_name = type_kernel__Int.name;
 PRINT_ERROR("Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name);
-PRINT_ERROR(" (%s:%d)\n", "lib/standard/kernel.nit", 328);
+PRINT_ERROR(" (%s:%d)\n", "../lib/standard/kernel.nit", 374);
 show_backtrace(1);
 }
-var12 = var_res + var8;
-var9 = var12;
-goto RET_LABEL10;
-RET_LABEL10:(void)0;
+var13 = var_res + var9;
+var10 = var13;
+goto RET_LABEL11;
+RET_LABEL11:(void)0;
 }
 }
-var_res = var9;
-CONTINUE_label: (void)0;
+var_res = var10;
 {
-array__ArrayIterator__next(var5); /* Direct call array#ArrayIterator#next on <var5:ArrayIterator[nullable Object]>*/
+array__ArrayIterator__next(var_6); /* Direct call array#ArrayIterator#next on <var_6:ArrayIterator[MType]>*/
+}
+} else {
+goto BREAK_label;
 }
 }
 BREAK_label: (void)0;
+{
+{ /* Inline abstract_collection#Iterator#finish (var_6) on <var_6:ArrayIterator[MType]> */
+RET_LABEL14:(void)0;
+}
+}
 var = var_res;
 goto RET_LABEL;
 RET_LABEL:;
@@ -7627,7 +8243,7 @@ val* var1 /* : MProperty */;
 var1 = self->attrs[COLOR_model__MVirtualType___mproperty].val; /* _mproperty on <self:MVirtualType> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mproperty");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1135);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1152);
 show_backtrace(1);
 }
 var = var1;
@@ -7643,7 +8259,7 @@ val* var3 /* : MProperty */;
 var3 = self->attrs[COLOR_model__MVirtualType___mproperty].val; /* _mproperty on <self:Object(MVirtualType)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mproperty");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1135);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1152);
 show_backtrace(1);
 }
 var1 = var3;
@@ -7682,7 +8298,7 @@ val* var12 /* : Model */;
 var3 = self->attrs[COLOR_model__MVirtualType___mproperty].val; /* _mproperty on <self:MVirtualType> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mproperty");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1135);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1152);
 show_backtrace(1);
 }
 var1 = var3;
@@ -7694,7 +8310,7 @@ RET_LABEL2:(void)0;
 var6 = var1->attrs[COLOR_model__MProperty___intro_mclassdef].val; /* _intro_mclassdef on <var1:MProperty> */
 if (unlikely(var6 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _intro_mclassdef");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1602);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1615);
 show_backtrace(1);
 }
 var4 = var6;
@@ -7706,7 +8322,7 @@ RET_LABEL5:(void)0;
 var9 = var4->attrs[COLOR_model__MClassDef___mmodule].val; /* _mmodule on <var4:MClassDef> */
 if (unlikely(var9 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mmodule");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 471);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 489);
 show_backtrace(1);
 }
 var7 = var9;
@@ -7718,7 +8334,7 @@ RET_LABEL8:(void)0;
 var12 = var7->attrs[COLOR_mmodule__MModule___model].val; /* _model on <var7:MModule> */
 if (unlikely(var12 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _model");
-PRINT_ERROR(" (%s:%d)\n", "src/model/mmodule.nit", 74);
+PRINT_ERROR(" (%s:%d)\n", "model/mmodule.nit", 72);
 show_backtrace(1);
 }
 var10 = var12;
@@ -7752,35 +8368,38 @@ val* var6 /* : Array[MPropDef] */;
 val* var_props /* var props: Array[MPropDef] */;
 short int var7 /* : Bool */;
 long var8 /* : Int */;
-long var9 /* : Int */;
-short int var10 /* : Bool */;
-short int var11 /* : Bool */;
+long var10 /* : Int */;
+long var11 /* : Int */;
+short int var12 /* : Bool */;
 short int var13 /* : Bool */;
-val* var14 /* : nullable Object */;
 short int var15 /* : Bool */;
+val* var16 /* : nullable Object */;
+short int var17 /* : Bool */;
 int cltype;
 int idtype;
 const char* var_class_name;
-val* var16 /* : nullable MType */;
 val* var18 /* : nullable MType */;
-val* var19 /* : ArraySet[MType] */;
+val* var20 /* : nullable MType */;
+val* var21 /* : ArraySet[MType] */;
 val* var_types /* var types: ArraySet[MType] */;
-val* var20 /* : ArrayIterator[nullable Object] */;
-short int var21 /* : Bool */;
-val* var22 /* : nullable Object */;
+val* var_ /* var : Array[MPropDef] */;
+val* var22 /* : ArrayIterator[nullable Object] */;
+val* var_23 /* var : ArrayIterator[MPropDef] */;
+short int var24 /* : Bool */;
+val* var25 /* : nullable Object */;
 val* var_p /* var p: MPropDef */;
-short int var23 /* : Bool */;
-int cltype24;
-int idtype25;
-const char* var_class_name26;
-val* var27 /* : nullable MType */;
-val* var29 /* : nullable MType */;
-long var30 /* : Int */;
-long var31 /* : Int */;
-short int var32 /* : Bool */;
-short int var33 /* : Bool */;
-short int var35 /* : Bool */;
-val* var36 /* : Object */;
+short int var26 /* : Bool */;
+int cltype27;
+int idtype28;
+const char* var_class_name29;
+val* var30 /* : nullable MType */;
+val* var32 /* : nullable MType */;
+long var34 /* : Int */;
+long var35 /* : Int */;
+short int var36 /* : Bool */;
+short int var37 /* : Bool */;
+short int var39 /* : Bool */;
+val* var40 /* : Object */;
 var_mmodule = p0;
 var_resolved_receiver = p1;
 {
@@ -7789,7 +8408,7 @@ var1 = ((short int (*)(val*))(var_resolved_receiver->class->vft[COLOR_model__MTy
 var2 = !var1;
 if (unlikely(!var2)) {
 PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1149);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1166);
 show_backtrace(1);
 }
 {
@@ -7797,7 +8416,7 @@ show_backtrace(1);
 var5 = self->attrs[COLOR_model__MVirtualType___mproperty].val; /* _mproperty on <self:MVirtualType> */
 if (unlikely(var5 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mproperty");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1135);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1152);
 show_backtrace(1);
 }
 var3 = var5;
@@ -7813,132 +8432,145 @@ var7 = array__AbstractArrayRead__is_empty(var_props);
 }
 if (var7){
 PRINT_ERROR("Runtime error: %s", "Aborted");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1152);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1169);
 show_backtrace(1);
 } else {
 {
-var8 = array__AbstractArrayRead__length(var_props);
+{ /* Inline array#AbstractArrayRead#length (var_props) on <var_props:Array[MPropDef]> */
+var10 = var_props->attrs[COLOR_array__AbstractArrayRead___length].l; /* _length on <var_props:Array[MPropDef]> */
+var8 = var10;
+RET_LABEL9:(void)0;
+}
 }
-var9 = 1;
+var11 = 1;
 {
-{ /* Inline kernel#Int#== (var8,var9) on <var8:Int> */
-var13 = var8 == var9;
-var11 = var13;
-goto RET_LABEL12;
-RET_LABEL12:(void)0;
+{ /* Inline kernel#Int#== (var8,var11) on <var8:Int> */
+var15 = var8 == var11;
+var13 = var15;
+goto RET_LABEL14;
+RET_LABEL14:(void)0;
 }
-var10 = var11;
+var12 = var13;
 }
-if (var10){
+if (var12){
 {
-var14 = abstract_collection__SequenceRead__first(var_props);
+var16 = abstract_collection__SequenceRead__first(var_props);
 }
-/* <var14:nullable Object(MPropDef)> isa MVirtualTypeDef */
+/* <var16:nullable Object(MPropDef)> isa MVirtualTypeDef */
 cltype = type_model__MVirtualTypeDef.color;
 idtype = type_model__MVirtualTypeDef.id;
-if(cltype >= var14->type->table_size) {
-var15 = 0;
+if(cltype >= var16->type->table_size) {
+var17 = 0;
 } else {
-var15 = var14->type->type_table[cltype] == idtype;
+var17 = var16->type->type_table[cltype] == idtype;
 }
-if (unlikely(!var15)) {
-var_class_name = var14 == NULL ? "null" : var14->type->name;
+if (unlikely(!var17)) {
+var_class_name = var16 == NULL ? "null" : var16->type->name;
 PRINT_ERROR("Runtime error: Cast failed. Expected `%s`, got `%s`", "MVirtualTypeDef", var_class_name);
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1154);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1171);
 show_backtrace(1);
 }
 {
-{ /* Inline model#MVirtualTypeDef#bound (var14) on <var14:MPropDef(MVirtualTypeDef)> */
-var18 = var14->attrs[COLOR_model__MVirtualTypeDef___bound].val; /* _bound on <var14:MPropDef(MVirtualTypeDef)> */
-var16 = var18;
-RET_LABEL17:(void)0;
+{ /* Inline model#MVirtualTypeDef#bound (var16) on <var16:MPropDef(MVirtualTypeDef)> */
+var20 = var16->attrs[COLOR_model__MVirtualTypeDef___bound].val; /* _bound on <var16:MPropDef(MVirtualTypeDef)> */
+var18 = var20;
+RET_LABEL19:(void)0;
 }
 }
-if (unlikely(var16 == NULL)) {
+if (unlikely(var18 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Cast failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1154);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1171);
 show_backtrace(1);
 }
-var = var16;
+var = var18;
 goto RET_LABEL;
 } else {
 }
 }
-var19 = NEW_array__ArraySet(&type_array__ArraySetmodel__MType);
+var21 = NEW_array__ArraySet(&type_array__ArraySetmodel__MType);
 {
-array__ArraySet__init(var19); /* Direct call array#ArraySet#init on <var19:ArraySet[MType]>*/
+((void (*)(val*))(var21->class->vft[COLOR_kernel__Object__init]))(var21) /* init on <var21:ArraySet[MType]>*/;
 }
-var_types = var19;
+var_types = var21;
+var_ = var_props;
 {
-var20 = array__AbstractArrayRead__iterator(var_props);
+var22 = array__AbstractArrayRead__iterator(var_);
 }
+var_23 = var22;
 for(;;) {
 {
-var21 = array__ArrayIterator__is_ok(var20);
+var24 = array__ArrayIterator__is_ok(var_23);
 }
-if(!var21) break;
+if (var24){
 {
-var22 = array__ArrayIterator__item(var20);
+var25 = array__ArrayIterator__item(var_23);
 }
-var_p = var22;
+var_p = var25;
 /* <var_p:MPropDef> isa MVirtualTypeDef */
-cltype24 = type_model__MVirtualTypeDef.color;
-idtype25 = type_model__MVirtualTypeDef.id;
-if(cltype24 >= var_p->type->table_size) {
-var23 = 0;
+cltype27 = type_model__MVirtualTypeDef.color;
+idtype28 = type_model__MVirtualTypeDef.id;
+if(cltype27 >= var_p->type->table_size) {
+var26 = 0;
 } else {
-var23 = var_p->type->type_table[cltype24] == idtype25;
+var26 = var_p->type->type_table[cltype27] == idtype28;
 }
-if (unlikely(!var23)) {
-var_class_name26 = var_p == NULL ? "null" : var_p->type->name;
-PRINT_ERROR("Runtime error: Cast failed. Expected `%s`, got `%s`", "MVirtualTypeDef", var_class_name26);
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1158);
+if (unlikely(!var26)) {
+var_class_name29 = var_p == NULL ? "null" : var_p->type->name;
+PRINT_ERROR("Runtime error: Cast failed. Expected `%s`, got `%s`", "MVirtualTypeDef", var_class_name29);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1175);
 show_backtrace(1);
 }
 {
 { /* Inline model#MVirtualTypeDef#bound (var_p) on <var_p:MPropDef(MVirtualTypeDef)> */
-var29 = var_p->attrs[COLOR_model__MVirtualTypeDef___bound].val; /* _bound on <var_p:MPropDef(MVirtualTypeDef)> */
-var27 = var29;
-RET_LABEL28:(void)0;
+var32 = var_p->attrs[COLOR_model__MVirtualTypeDef___bound].val; /* _bound on <var_p:MPropDef(MVirtualTypeDef)> */
+var30 = var32;
+RET_LABEL31:(void)0;
 }
 }
-if (unlikely(var27 == NULL)) {
+if (unlikely(var30 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Cast failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1158);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1175);
 show_backtrace(1);
 }
 {
-array__ArraySet__add(var_types, var27); /* Direct call array#ArraySet#add on <var_types:ArraySet[MType]>*/
+array__ArraySet__add(var_types, var30); /* Direct call array#ArraySet#add on <var_types:ArraySet[MType]>*/
 }
-CONTINUE_label: (void)0;
 {
-array__ArrayIterator__next(var20); /* Direct call array#ArrayIterator#next on <var20:ArrayIterator[nullable Object]>*/
+array__ArrayIterator__next(var_23); /* Direct call array#ArrayIterator#next on <var_23:ArrayIterator[MPropDef]>*/
+}
+} else {
+goto BREAK_label;
 }
 }
 BREAK_label: (void)0;
 {
-var30 = array__ArraySet__length(var_types);
+{ /* Inline abstract_collection#Iterator#finish (var_23) on <var_23:ArrayIterator[MPropDef]> */
+RET_LABEL33:(void)0;
+}
 }
-var31 = 1;
 {
-{ /* Inline kernel#Int#== (var30,var31) on <var30:Int> */
-var35 = var30 == var31;
-var33 = var35;
-goto RET_LABEL34;
-RET_LABEL34:(void)0;
+var34 = array__ArraySet__length(var_types);
 }
-var32 = var33;
+var35 = 1;
+{
+{ /* Inline kernel#Int#== (var34,var35) on <var34:Int> */
+var39 = var34 == var35;
+var37 = var39;
+goto RET_LABEL38;
+RET_LABEL38:(void)0;
 }
-if (var32){
+var36 = var37;
+}
+if (var36){
 {
-var36 = array__ArraySet__first(var_types);
+var40 = array__ArraySet__first(var_types);
 }
-var = var36;
+var = var40;
 goto RET_LABEL;
 } else {
 }
 PRINT_ERROR("Runtime error: %s", "Aborted");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1163);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1180);
 show_backtrace(1);
 RET_LABEL:;
 return var;
@@ -7964,18 +8596,20 @@ val* var5 /* : MProperty */;
 val* var6 /* : Array[MPropDef] */;
 val* var_props /* var props: Array[MPropDef] */;
 short int var7 /* : Bool */;
+val* var_ /* var : Array[MPropDef] */;
 val* var8 /* : ArrayIterator[nullable Object] */;
-short int var9 /* : Bool */;
-val* var10 /* : nullable Object */;
+val* var_9 /* var : ArrayIterator[MPropDef] */;
+short int var10 /* : Bool */;
+val* var11 /* : nullable Object */;
 val* var_p /* var p: MPropDef */;
-short int var11 /* : Bool */;
+short int var12 /* : Bool */;
 int cltype;
 int idtype;
 const char* var_class_name;
-short int var12 /* : Bool */;
-short int var14 /* : Bool */;
+short int var13 /* : Bool */;
 short int var15 /* : Bool */;
 short int var16 /* : Bool */;
+short int var18 /* : Bool */;
 var_mmodule = p0;
 var_resolved_receiver = p1;
 {
@@ -7984,7 +8618,7 @@ var1 = ((short int (*)(val*))(var_resolved_receiver->class->vft[COLOR_model__MTy
 var2 = !var1;
 if (unlikely(!var2)) {
 PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1169);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1186);
 show_backtrace(1);
 }
 {
@@ -7992,7 +8626,7 @@ show_backtrace(1);
 var5 = self->attrs[COLOR_model__MVirtualType___mproperty].val; /* _mproperty on <self:MVirtualType> */
 if (unlikely(var5 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mproperty");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1135);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1152);
 show_backtrace(1);
 }
 var3 = var5;
@@ -8008,57 +8642,66 @@ var7 = array__AbstractArrayRead__is_empty(var_props);
 }
 if (var7){
 PRINT_ERROR("Runtime error: %s", "Aborted");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1172);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1189);
 show_backtrace(1);
 } else {
 }
+var_ = var_props;
 {
-var8 = array__AbstractArrayRead__iterator(var_props);
+var8 = array__AbstractArrayRead__iterator(var_);
 }
+var_9 = var8;
 for(;;) {
 {
-var9 = array__ArrayIterator__is_ok(var8);
+var10 = array__ArrayIterator__is_ok(var_9);
 }
-if(!var9) break;
+if (var10){
 {
-var10 = array__ArrayIterator__item(var8);
+var11 = array__ArrayIterator__item(var_9);
 }
-var_p = var10;
+var_p = var11;
 /* <var_p:MPropDef> isa MVirtualTypeDef */
 cltype = type_model__MVirtualTypeDef.color;
 idtype = type_model__MVirtualTypeDef.id;
 if(cltype >= var_p->type->table_size) {
-var11 = 0;
+var12 = 0;
 } else {
-var11 = var_p->type->type_table[cltype] == idtype;
+var12 = var_p->type->type_table[cltype] == idtype;
 }
-if (unlikely(!var11)) {
+if (unlikely(!var12)) {
 var_class_name = var_p == NULL ? "null" : var_p->type->name;
 PRINT_ERROR("Runtime error: Cast failed. Expected `%s`, got `%s`", "MVirtualTypeDef", var_class_name);
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1175);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1192);
 show_backtrace(1);
 }
 {
 { /* Inline model#MVirtualTypeDef#is_fixed (var_p) on <var_p:MPropDef(MVirtualTypeDef)> */
-var14 = var_p->attrs[COLOR_model__MVirtualTypeDef___is_fixed].s; /* _is_fixed on <var_p:MPropDef(MVirtualTypeDef)> */
-var12 = var14;
-RET_LABEL13:(void)0;
+var15 = var_p->attrs[COLOR_model__MVirtualTypeDef___is_fixed].s; /* _is_fixed on <var_p:MPropDef(MVirtualTypeDef)> */
+var13 = var15;
+RET_LABEL14:(void)0;
 }
 }
-if (var12){
-var15 = 1;
-var = var15;
-goto RET_LABEL;
+if (var13){
+var16 = 1;
+var = var16;
+goto RET_LABEL;
 } else {
 }
-CONTINUE_label: (void)0;
 {
-array__ArrayIterator__next(var8); /* Direct call array#ArrayIterator#next on <var8:ArrayIterator[nullable Object]>*/
+array__ArrayIterator__next(var_9); /* Direct call array#ArrayIterator#next on <var_9:ArrayIterator[MPropDef]>*/
+}
+} else {
+goto BREAK_label;
 }
 }
 BREAK_label: (void)0;
-var16 = 0;
-var = var16;
+{
+{ /* Inline abstract_collection#Iterator#finish (var_9) on <var_9:ArrayIterator[MPropDef]> */
+RET_LABEL17:(void)0;
+}
+}
+var18 = 0;
+var = var18;
 goto RET_LABEL;
 RET_LABEL:;
 return var;
@@ -8142,7 +8785,7 @@ var1 = model__MVirtualType__can_resolve_for(self, var_mtype, var_anchor, var_mmo
 }
 if (unlikely(!var1)) {
 PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1182);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1199);
 show_backtrace(1);
 }
 {
@@ -8171,7 +8814,7 @@ var4 = var5;
 }
 if (unlikely(!var4)) {
 PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1189);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1206);
 show_backtrace(1);
 }
 var10 = NULL;
@@ -8210,7 +8853,7 @@ if (var15){
 var18 = var_resolved_reciever->attrs[COLOR_model__MNullableType___mtype].val; /* _mtype on <var_resolved_reciever:nullable Object(MNullableType)> */
 if (unlikely(var18 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mtype");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1375);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1388);
 show_backtrace(1);
 }
 var16 = var18;
@@ -8231,7 +8874,7 @@ var19 = var_resolved_reciever->type->type_table[cltype20] == idtype21;
 if (unlikely(!var19)) {
 var_class_name = var_resolved_reciever == NULL ? "null" : var_resolved_reciever->type->name;
 PRINT_ERROR("Runtime error: Cast failed. Expected `%s`, got `%s`", "MClassType", var_class_name);
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1205);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1222);
 show_backtrace(1);
 }
 {
@@ -8239,7 +8882,7 @@ show_backtrace(1);
 var24 = var_resolved_reciever->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <var_resolved_reciever:MType(MClassType)> */
 if (unlikely(var24 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 969);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 986);
 show_backtrace(1);
 }
 var22 = var24;
@@ -8251,7 +8894,7 @@ RET_LABEL23:(void)0;
 var27 = var22->attrs[COLOR_model__MClass___kind].val; /* _kind on <var22:MClass> */
 if (unlikely(var27 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _kind");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 355);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 371);
 show_backtrace(1);
 }
 var25 = var27;
@@ -8319,7 +8962,7 @@ if (var41){
 var46 = var_res->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <var_res:MType(MClassType)> */
 if (unlikely(var46 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 969);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 986);
 show_backtrace(1);
 }
 var44 = var46;
@@ -8331,7 +8974,7 @@ RET_LABEL45:(void)0;
 var49 = var44->attrs[COLOR_model__MClass___kind].val; /* _kind on <var44:MClass> */
 if (unlikely(var49 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _kind");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 355);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 371);
 show_backtrace(1);
 }
 var47 = var49;
@@ -8428,7 +9071,7 @@ var3 = var4;
 }
 if (unlikely(!var3)) {
 PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1223);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1239);
 show_backtrace(1);
 }
 {
@@ -8442,7 +9085,7 @@ var_mtype = var9;
 var12 = self->attrs[COLOR_model__MVirtualType___mproperty].val; /* _mproperty on <self:MVirtualType> */
 if (unlikely(var12 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mproperty");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1135);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1152);
 show_backtrace(1);
 }
 var10 = var12;
@@ -8477,7 +9120,7 @@ val* var4 /* : String */;
 var3 = self->attrs[COLOR_model__MVirtualType___mproperty].val; /* _mproperty on <self:MVirtualType> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mproperty");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1135);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1152);
 show_backtrace(1);
 }
 var1 = var3;
@@ -8505,15 +9148,13 @@ return var;
 void model__MVirtualType__init(val* self, val* p0) {
 val* var_mproperty /* var mproperty: MProperty */;
 {
-{ /* Inline model_base#MEntity#init (self) on <self:MVirtualType> */
-RET_LABEL1:(void)0;
-}
+((void (*)(val*))(self->class->vft[COLOR_kernel__Object__init]))(self) /* init on <self:MVirtualType>*/;
 }
 var_mproperty = p0;
 {
 { /* Inline model#MVirtualType#mproperty= (self,var_mproperty) on <self:MVirtualType> */
 self->attrs[COLOR_model__MVirtualType___mproperty].val = var_mproperty; /* _mproperty on <self:MVirtualType> */
-RET_LABEL2:(void)0;
+RET_LABEL1:(void)0;
 }
 }
 RET_LABEL:;
@@ -8530,7 +9171,7 @@ val* var1 /* : MClass */;
 var1 = self->attrs[COLOR_model__MParameterType___mclass].val; /* _mclass on <self:MParameterType> */
 if (unlikely(var1 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1265);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1280);
 show_backtrace(1);
 }
 var = var1;
@@ -8546,7 +9187,7 @@ val* var3 /* : MClass */;
 var3 = self->attrs[COLOR_model__MParameterType___mclass].val; /* _mclass on <self:Object(MParameterType)> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1265);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1280);
 show_backtrace(1);
 }
 var1 = var3;
@@ -8583,7 +9224,7 @@ val* var9 /* : Model */;
 var3 = self->attrs[COLOR_model__MParameterType___mclass].val; /* _mclass on <self:MParameterType> */
 if (unlikely(var3 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1265);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1280);
 show_backtrace(1);
 }
 var1 = var3;
@@ -8595,7 +9236,7 @@ RET_LABEL2:(void)0;
 var6 = var1->attrs[COLOR_model__MClass___intro_mmodule].val; /* _intro_mmodule on <var1:MClass> */
 if (unlikely(var6 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _intro_mmodule");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 335);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 347);
 show_backtrace(1);
 }
 var4 = var6;
@@ -8607,7 +9248,7 @@ RET_LABEL5:(void)0;
 var9 = var4->attrs[COLOR_mmodule__MModule___model].val; /* _model on <var4:MModule> */
 if (unlikely(var9 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _model");
-PRINT_ERROR(" (%s:%d)\n", "src/model/mmodule.nit", 74);
+PRINT_ERROR(" (%s:%d)\n", "model/mmodule.nit", 72);
 show_backtrace(1);
 }
 var7 = var9;
@@ -8664,67 +9305,70 @@ RET_LABEL1:(void)0;
 }
 RET_LABEL:;
 }
-/* method model#MParameterType#to_s for (self: MParameterType): String */
-val* model__MParameterType__to_s(val* self) {
+/* method model#MParameterType#name for (self: MParameterType): String */
+val* model__MParameterType__name(val* self) {
 val* var /* : String */;
-val* var1 /* : MClass */;
-val* var3 /* : MClass */;
-static val* varonce;
-val* var4 /* : String */;
-char* var5 /* : NativeString */;
-long var6 /* : Int */;
-val* var7 /* : FlatString */;
-long var8 /* : Int */;
-long var10 /* : Int */;
-val* var11 /* : Array[Object] */;
-long var12 /* : Int */;
-val* var13 /* : NativeArray[Object] */;
-val* var14 /* : Object */;
-val* var15 /* : String */;
-{
-{ /* Inline model#MParameterType#mclass (self) on <self:MParameterType> */
-var3 = self->attrs[COLOR_model__MParameterType___mclass].val; /* _mclass on <self:MParameterType> */
+val* var1 /* : String */;
+var1 = self->attrs[COLOR_model__MParameterType___name].val; /* _name on <self:MParameterType> */
+if (unlikely(var1 == NULL)) {
+PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _name");
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1289);
+show_backtrace(1);
+}
+var = var1;
+RET_LABEL:;
+return var;
+}
+/* method model#MParameterType#name for (self: Object): String */
+val* VIRTUAL_model__MParameterType__name(val* self) {
+val* var /* : String */;
+val* var1 /* : String */;
+val* var3 /* : String */;
+{ /* Inline model#MParameterType#name (self) on <self:Object(MParameterType)> */
+var3 = self->attrs[COLOR_model__MParameterType___name].val; /* _name on <self:Object(MParameterType)> */
 if (unlikely(var3 == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1265);
+PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _name");
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1289);
 show_backtrace(1);
 }
 var1 = var3;
 RET_LABEL2:(void)0;
 }
+var = var1;
+RET_LABEL:;
+return var;
 }
-if (varonce) {
-var4 = varonce;
-} else {
-var5 = "#";
-var6 = 1;
-var7 = string__NativeString__to_s_with_length(var5, var6);
-var4 = var7;
-varonce = var4;
+/* method model#MParameterType#name= for (self: MParameterType, String) */
+void model__MParameterType__name_61d(val* self, val* p0) {
+self->attrs[COLOR_model__MParameterType___name].val = p0; /* _name on <self:MParameterType> */
+RET_LABEL:;
 }
-{
-{ /* Inline model#MParameterType#rank (self) on <self:MParameterType> */
-var10 = self->attrs[COLOR_model__MParameterType___rank].l; /* _rank on <self:MParameterType> */
-var8 = var10;
-RET_LABEL9:(void)0;
+/* method model#MParameterType#name= for (self: Object, String) */
+void VIRTUAL_model__MParameterType__name_61d(val* self, val* p0) {
+{ /* Inline model#MParameterType#name= (self,p0) on <self:Object(MParameterType)> */
+self->attrs[COLOR_model__MParameterType___name].val = p0; /* _name on <self:Object(MParameterType)> */
+RET_LABEL1:(void)0;
 }
+RET_LABEL:;
 }
-var11 = NEW_array__Array(&type_array__Arraykernel__Object);
-{ /* var11 = array_instance Array[Object] */
-var12 = 3;
-var13 = NEW_array__NativeArray(var12, &type_array__NativeArraykernel__Object);
-((struct instance_array__NativeArray*)var13)->values[0] = (val*) var1;
-((struct instance_array__NativeArray*)var13)->values[1] = (val*) var4;
-var14 = BOX_kernel__Int(var8); /* autobox from Int to Object */
-((struct instance_array__NativeArray*)var13)->values[2] = (val*) var14;
+/* method model#MParameterType#to_s for (self: MParameterType): String */
+val* model__MParameterType__to_s(val* self) {
+val* var /* : String */;
+val* var1 /* : String */;
+val* var3 /* : String */;
 {
-((void (*)(val*, val*, long))(var11->class->vft[COLOR_array__Array__with_native]))(var11, var13, var12) /* with_native on <var11:Array[Object]>*/;
+{ /* Inline model#MParameterType#name (self) on <self:MParameterType> */
+var3 = self->attrs[COLOR_model__MParameterType___name].val; /* _name on <self:MParameterType> */
+if (unlikely(var3 == NULL)) {
+PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _name");
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1289);
+show_backtrace(1);
 }
+var1 = var3;
+RET_LABEL2:(void)0;
 }
-{
-var15 = ((val* (*)(val*))(var11->class->vft[COLOR_string__Object__to_s]))(var11) /* to_s on <var11:Array[Object]>*/;
 }
-var = var15;
+var = var1;
 goto RET_LABEL;
 RET_LABEL:;
 return var;
@@ -8750,22 +9394,24 @@ val* var5 /* : MClass */;
 val* var_goalclass /* var goalclass: MClass */;
 val* var6 /* : Set[MClassType] */;
 val* var_supertypes /* var supertypes: Set[MClassType] */;
+val* var_ /* var : Set[MClassType] */;
 val* var7 /* : Iterator[nullable Object] */;
-short int var8 /* : Bool */;
-val* var9 /* : nullable Object */;
+val* var_8 /* var : Iterator[MClassType] */;
+short int var9 /* : Bool */;
+val* var10 /* : nullable Object */;
 val* var_t /* var t: MClassType */;
-val* var10 /* : MClass */;
-val* var12 /* : MClass */;
-short int var13 /* : Bool */;
+val* var11 /* : MClass */;
+val* var13 /* : MClass */;
 short int var14 /* : Bool */;
+short int var15 /* : Bool */;
 val* var_other /* var other: nullable Object */;
-short int var16 /* : Bool */;
-short int var18 /* : Bool */;
-val* var19 /* : Array[MType] */;
-val* var21 /* : Array[MType] */;
-long var22 /* : Int */;
-long var24 /* : Int */;
-val* var25 /* : nullable Object */;
+short int var17 /* : Bool */;
+short int var19 /* : Bool */;
+val* var20 /* : Array[MType] */;
+val* var22 /* : Array[MType] */;
+long var23 /* : Int */;
+long var25 /* : Int */;
+val* var26 /* : nullable Object */;
 val* var_res /* var res: MType */;
 var_mmodule = p0;
 var_resolved_receiver = p1;
@@ -8775,7 +9421,7 @@ var1 = ((short int (*)(val*))(var_resolved_receiver->class->vft[COLOR_model__MTy
 var2 = !var1;
 if (unlikely(!var2)) {
 PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1285);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1297);
 show_backtrace(1);
 }
 {
@@ -8783,7 +9429,7 @@ show_backtrace(1);
 var5 = self->attrs[COLOR_model__MParameterType___mclass].val; /* _mclass on <self:MParameterType> */
 if (unlikely(var5 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1265);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1280);
 show_backtrace(1);
 }
 var3 = var5;
@@ -8795,83 +9441,92 @@ var_goalclass = var3;
 var6 = ((val* (*)(val*, val*))(var_resolved_receiver->class->vft[COLOR_model__MType__collect_mtypes]))(var_resolved_receiver, var_mmodule) /* collect_mtypes on <var_resolved_receiver:MType>*/;
 }
 var_supertypes = var6;
+var_ = var_supertypes;
 {
-var7 = ((val* (*)(val*))(var_supertypes->class->vft[COLOR_abstract_collection__Collection__iterator]))(var_supertypes) /* iterator on <var_supertypes:Set[MClassType]>*/;
+var7 = ((val* (*)(val*))(var_->class->vft[COLOR_abstract_collection__Collection__iterator]))(var_) /* iterator on <var_:Set[MClassType]>*/;
 }
+var_8 = var7;
 for(;;) {
 {
-var8 = ((short int (*)(val*))(var7->class->vft[COLOR_abstract_collection__Iterator__is_ok]))(var7) /* is_ok on <var7:Iterator[nullable Object]>*/;
+var9 = ((short int (*)(val*))(var_8->class->vft[COLOR_abstract_collection__Iterator__is_ok]))(var_8) /* is_ok on <var_8:Iterator[MClassType]>*/;
 }
-if(!var8) break;
+if (var9){
 {
-var9 = ((val* (*)(val*))(var7->class->vft[COLOR_abstract_collection__Iterator__item]))(var7) /* item on <var7:Iterator[nullable Object]>*/;
+var10 = ((val* (*)(val*))(var_8->class->vft[COLOR_abstract_collection__Iterator__item]))(var_8) /* item on <var_8:Iterator[MClassType]>*/;
 }
-var_t = var9;
+var_t = var10;
 {
 { /* Inline model#MClassType#mclass (var_t) on <var_t:MClassType> */
-var12 = var_t->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <var_t:MClassType> */
-if (unlikely(var12 == NULL)) {
+var13 = var_t->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <var_t:MClassType> */
+if (unlikely(var13 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 969);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 986);
 show_backtrace(1);
 }
-var10 = var12;
-RET_LABEL11:(void)0;
+var11 = var13;
+RET_LABEL12:(void)0;
 }
 }
 {
-{ /* Inline kernel#Object#== (var10,var_goalclass) on <var10:MClass> */
+{ /* Inline kernel#Object#== (var11,var_goalclass) on <var11:MClass> */
 var_other = var_goalclass;
 {
-{ /* Inline kernel#Object#is_same_instance (var10,var_other) on <var10:MClass> */
-var18 = var10 == var_other;
-var16 = var18;
-goto RET_LABEL17;
-RET_LABEL17:(void)0;
+{ /* Inline kernel#Object#is_same_instance (var11,var_other) on <var11:MClass> */
+var19 = var11 == var_other;
+var17 = var19;
+goto RET_LABEL18;
+RET_LABEL18:(void)0;
 }
 }
-var14 = var16;
-goto RET_LABEL15;
-RET_LABEL15:(void)0;
+var15 = var17;
+goto RET_LABEL16;
+RET_LABEL16:(void)0;
 }
-var13 = var14;
+var14 = var15;
 }
-if (var13){
+if (var14){
 {
 { /* Inline model#MClassType#arguments (var_t) on <var_t:MClassType> */
-var21 = var_t->attrs[COLOR_model__MClassType___arguments].val; /* _arguments on <var_t:MClassType> */
-if (unlikely(var21 == NULL)) {
+var22 = var_t->attrs[COLOR_model__MClassType___arguments].val; /* _arguments on <var_t:MClassType> */
+if (unlikely(var22 == NULL)) {
 PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _arguments");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 979);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 996);
 show_backtrace(1);
 }
-var19 = var21;
-RET_LABEL20:(void)0;
+var20 = var22;
+RET_LABEL21:(void)0;
 }
 }
 {
 { /* Inline model#MParameterType#rank (self) on <self:MParameterType> */
-var24 = self->attrs[COLOR_model__MParameterType___rank].l; /* _rank on <self:MParameterType> */
-var22 = var24;
-RET_LABEL23:(void)0;
+var25 = self->attrs[COLOR_model__MParameterType___rank].l; /* _rank on <self:MParameterType> */
+var23 = var25;
+RET_LABEL24:(void)0;
 }
 }
 {
-var25 = array__Array___91d_93d(var19, var22);
+var26 = array__Array___91d_93d(var20, var23);
 }
-var_res = var25;
+var_res = var26;
 var = var_res;
 goto RET_LABEL;
 } else {
 }
-CONTINUE_label: (void)0;
 {
-((void (*)(val*))(var7->class->vft[COLOR_abstract_collection__Iterator__next]))(var7) /* next on <var7:Iterator[nullable Object]>*/;
+((void (*)(val*))(var_8->class->vft[COLOR_abstract_collection__Iterator__next]))(var_8) /* next on <var_8:Iterator[MClassType]>*/;
+}
+} else {
+goto BREAK_label;
 }
 }
 BREAK_label: (void)0;
+{
+{ /* Inline abstract_collection#Iterator#finish (var_8) on <var_8:Iterator[MClassType]> */
+RET_LABEL27:(void)0;
+}
+}
 PRINT_ERROR("Runtime error: %s", "Aborted");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1296);
+PRINT_ERROR(" (%s:%d)\n", "model/model.nit", 1308);
 show_backtrace(1);
 RET_LABEL:;
 return var;
@@ -8885,1111 +9540,3 @@ var = var1;
 RET_LABEL:;
 return var;
 }
-/* method model#MParameterType#resolve_for for (self: MParameterType, MType, nullable MClassType, MModule, Bool): MType */
-val* model__MParameterType__resolve_for(val* self, val* p0, val* p1, val* p2, short int p3) {
-val* var /* : MType */;
-val* var_mtype /* var mtype: MType */;
-val* var_anchor /* var anchor: nullable MClassType */;
-val* var_mmodule /* var mmodule: MModule */;
-short int var_cleanup_virtual /* var cleanup_virtual: Bool */;
-short int var1 /* : Bool */;
-short int var2 /* : Bool */;
-short int var3 /* : Bool */;
-int cltype;
-int idtype;
-short int var_ /* var : Bool */;
-val* var4 /* : MClass */;
-val* var6 /* : MClass */;
-val* var7 /* : MClass */;
-val* var9 /* : MClass */;
-short int var10 /* : Bool */;
-short int var11 /* : Bool */;
-val* var_other /* var other: nullable Object */;
-short int var13 /* : Bool */;
-short int var15 /* : Bool */;
-val* var16 /* : Array[MType] */;
-val* var18 /* : Array[MType] */;
-long var19 /* : Int */;
-long var21 /* : Int */;
-val* var22 /* : nullable Object */;
-val* var_res /* var res: MType */;
-short int var23 /* : Bool */;
-val* var24 /* : null */;
-short int var25 /* : Bool */;
-short int var26 /* : Bool */;
-val* var_other28 /* var other: nullable Object */;
-short int var29 /* : Bool */;
-short int var30 /* : Bool */;
-short int var31 /* : Bool */;
-short int var_32 /* var : Bool */;
-short int var33 /* : Bool */;
-val* var34 /* : MType */;
-val* var_r2 /* var r2: MType */;
-short int var35 /* : Bool */;
-short int var36 /* : Bool */;
-int cltype37;
-int idtype38;
-short int var_39 /* var : Bool */;
-val* var40 /* : MClass */;
-val* var42 /* : MClass */;
-val* var43 /* : MClassKind */;
-val* var45 /* : MClassKind */;
-val* var46 /* : MClassKind */;
-short int var47 /* : Bool */;
-short int var48 /* : Bool */;
-short int var50 /* : Bool */;
-short int var52 /* : Bool */;
-short int var53 /* : Bool */;
-val* var54 /* : null */;
-short int var55 /* : Bool */;
-short int var56 /* : Bool */;
-short int var58 /* : Bool */;
-short int var59 /* : Bool */;
-short int var60 /* : Bool */;
-val* var61 /* : MClass */;
-val* var63 /* : MClass */;
-val* var64 /* : MClassType */;
-val* var66 /* : MClassType */;
-short int var67 /* : Bool */;
-val* var68 /* : MType */;
-val* var_resolved_receiver /* var resolved_receiver: nullable Object */;
-short int var69 /* : Bool */;
-int cltype70;
-int idtype71;
-val* var72 /* : MType */;
-val* var74 /* : MType */;
-short int var75 /* : Bool */;
-int cltype76;
-int idtype77;
-val* var78 /* : MClass */;
-val* var80 /* : MClass */;
-val* var81 /* : MClass */;
-val* var83 /* : MClass */;
-short int var84 /* : Bool */;
-short int var85 /* : Bool */;
-short int var87 /* : Bool */;
-short int var89 /* : Bool */;
-val* var90 /* : Array[MType] */;
-val* var92 /* : Array[MType] */;
-long var93 /* : Int */;
-long var95 /* : Int */;
-val* var96 /* : nullable Object */;
-short int var97 /* : Bool */;
-int cltype98;
-int idtype99;
-val* var100 /* : MType */;
-val* var102 /* : MType */;
-short int var103 /* : Bool */;
-int cltype104;
-int idtype105;
-val* var106 /* : MClass */;
-val* var108 /* : MClass */;
-val* var109 /* : MClass */;
-val* var111 /* : MClass */;
-short int var112 /* : Bool */;
-short int var113 /* : Bool */;
-short int var115 /* : Bool */;
-short int var117 /* : Bool */;
-val* var118 /* : Array[MType] */;
-val* var120 /* : Array[MType] */;
-long var121 /* : Int */;
-long var123 /* : Int */;
-val* var124 /* : nullable Object */;
-val* var_res125 /* var res: MType */;
-short int var126 /* : Bool */;
-val* var127 /* : null */;
-short int var128 /* : Bool */;
-short int var129 /* : Bool */;
-short int var131 /* : Bool */;
-short int var132 /* : Bool */;
-short int var133 /* : Bool */;
-val* var134 /* : null */;
-short int var135 /* : Bool */;
-val* var136 /* : MType */;
-val* var137 /* : MType */;
-val* var_verbatim_bound /* var verbatim_bound: MType */;
-val* var138 /* : MType */;
-val* var_res139 /* var res: MType */;
-var_mtype = p0;
-var_anchor = p1;
-var_mmodule = p2;
-var_cleanup_virtual = p3;
-{
-var1 = model__MParameterType__can_resolve_for(self, var_mtype, var_anchor, var_mmodule);
-}
-if (unlikely(!var1)) {
-PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1301);
-show_backtrace(1);
-}
-/* <var_mtype:MType> isa MGenericType */
-cltype = type_model__MGenericType.color;
-idtype = type_model__MGenericType.id;
-if(cltype >= var_mtype->type->table_size) {
-var3 = 0;
-} else {
-var3 = var_mtype->type->type_table[cltype] == idtype;
-}
-var_ = var3;
-if (var3){
-{
-{ /* Inline model#MClassType#mclass (var_mtype) on <var_mtype:MType(MGenericType)> */
-var6 = var_mtype->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <var_mtype:MType(MGenericType)> */
-if (unlikely(var6 == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 969);
-show_backtrace(1);
-}
-var4 = var6;
-RET_LABEL5:(void)0;
-}
-}
-{
-{ /* Inline model#MParameterType#mclass (self) on <self:MParameterType> */
-var9 = self->attrs[COLOR_model__MParameterType___mclass].val; /* _mclass on <self:MParameterType> */
-if (unlikely(var9 == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1265);
-show_backtrace(1);
-}
-var7 = var9;
-RET_LABEL8:(void)0;
-}
-}
-{
-{ /* Inline kernel#Object#== (var4,var7) on <var4:MClass> */
-var_other = var7;
-{
-{ /* Inline kernel#Object#is_same_instance (var4,var_other) on <var4:MClass> */
-var15 = var4 == var_other;
-var13 = var15;
-goto RET_LABEL14;
-RET_LABEL14:(void)0;
-}
-}
-var11 = var13;
-goto RET_LABEL12;
-RET_LABEL12:(void)0;
-}
-var10 = var11;
-}
-var2 = var10;
-} else {
-var2 = var_;
-}
-if (var2){
-{
-{ /* Inline model#MClassType#arguments (var_mtype) on <var_mtype:MType(MGenericType)> */
-var18 = var_mtype->attrs[COLOR_model__MClassType___arguments].val; /* _arguments on <var_mtype:MType(MGenericType)> */
-if (unlikely(var18 == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _arguments");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 979);
-show_backtrace(1);
-}
-var16 = var18;
-RET_LABEL17:(void)0;
-}
-}
-{
-{ /* Inline model#MParameterType#rank (self) on <self:MParameterType> */
-var21 = self->attrs[COLOR_model__MParameterType___rank].l; /* _rank on <self:MParameterType> */
-var19 = var21;
-RET_LABEL20:(void)0;
-}
-}
-{
-var22 = array__Array___91d_93d(var16, var19);
-}
-var_res = var22;
-var24 = NULL;
-if (var_anchor == NULL) {
-var25 = 0; /* is null */
-} else {
-var25 = 1; /* arg is null and recv is not */
-}
-if (0) {
-{ /* Inline kernel#Object#!= (var_anchor,var24) on <var_anchor:nullable MClassType> */
-var_other28 = var24;
-{
-var30 = ((short int (*)(val*, val*))(var_anchor->class->vft[COLOR_kernel__Object___61d_61d]))(var_anchor, var_other28) /* == on <var_anchor:nullable MClassType(MClassType)>*/;
-var29 = var30;
-}
-var31 = !var29;
-var26 = var31;
-goto RET_LABEL27;
-RET_LABEL27:(void)0;
-}
-var25 = var26;
-}
-var_32 = var25;
-if (var25){
-{
-var33 = ((short int (*)(val*))(var_res->class->vft[COLOR_model__MType__need_anchor]))(var_res) /* need_anchor on <var_res:MType>*/;
-}
-var23 = var33;
-} else {
-var23 = var_32;
-}
-if (var23){
-{
-var34 = ((val* (*)(val*, val*, val*))(var_res->class->vft[COLOR_model__MType__anchor_to]))(var_res, var_mmodule, var_anchor) /* anchor_to on <var_res:MType>*/;
-}
-var_r2 = var34;
-/* <var_r2:MType> isa MClassType */
-cltype37 = type_model__MClassType.color;
-idtype38 = type_model__MClassType.id;
-if(cltype37 >= var_r2->type->table_size) {
-var36 = 0;
-} else {
-var36 = var_r2->type->type_table[cltype37] == idtype38;
-}
-var_39 = var36;
-if (var36){
-{
-{ /* Inline model#MClassType#mclass (var_r2) on <var_r2:MType(MClassType)> */
-var42 = var_r2->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <var_r2:MType(MClassType)> */
-if (unlikely(var42 == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 969);
-show_backtrace(1);
-}
-var40 = var42;
-RET_LABEL41:(void)0;
-}
-}
-{
-{ /* Inline model#MClass#kind (var40) on <var40:MClass> */
-var45 = var40->attrs[COLOR_model__MClass___kind].val; /* _kind on <var40:MClass> */
-if (unlikely(var45 == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _kind");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 355);
-show_backtrace(1);
-}
-var43 = var45;
-RET_LABEL44:(void)0;
-}
-}
-{
-var46 = model__Object__enum_kind(self);
-}
-{
-{ /* Inline kernel#Object#== (var43,var46) on <var43:MClassKind> */
-var_other = var46;
-{
-{ /* Inline kernel#Object#is_same_instance (var43,var_other) on <var43:MClassKind> */
-var52 = var43 == var_other;
-var50 = var52;
-goto RET_LABEL51;
-RET_LABEL51:(void)0;
-}
-}
-var48 = var50;
-goto RET_LABEL49;
-RET_LABEL49:(void)0;
-}
-var47 = var48;
-}
-var35 = var47;
-} else {
-var35 = var_39;
-}
-if (var35){
-var = var_r2;
-goto RET_LABEL;
-} else {
-}
-} else {
-}
-var = var_res;
-goto RET_LABEL;
-} else {
-}
-{
-var53 = ((short int (*)(val*))(var_mtype->class->vft[COLOR_model__MType__need_anchor]))(var_mtype) /* need_anchor on <var_mtype:MType>*/;
-}
-if (var53){
-var54 = NULL;
-if (var_anchor == NULL) {
-var55 = 0; /* is null */
-} else {
-var55 = 1; /* arg is null and recv is not */
-}
-if (0) {
-{ /* Inline kernel#Object#!= (var_anchor,var54) on <var_anchor:nullable MClassType> */
-var_other28 = var54;
-{
-var59 = ((short int (*)(val*, val*))(var_anchor->class->vft[COLOR_kernel__Object___61d_61d]))(var_anchor, var_other28) /* == on <var_anchor:nullable MClassType(MClassType)>*/;
-var58 = var59;
-}
-var60 = !var58;
-var56 = var60;
-goto RET_LABEL57;
-RET_LABEL57:(void)0;
-}
-var55 = var56;
-}
-if (unlikely(!var55)) {
-PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1320);
-show_backtrace(1);
-}
-{
-{ /* Inline model#MClassType#mclass (var_anchor) on <var_anchor:nullable MClassType(MClassType)> */
-var63 = var_anchor->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <var_anchor:nullable MClassType(MClassType)> */
-if (unlikely(var63 == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 969);
-show_backtrace(1);
-}
-var61 = var63;
-RET_LABEL62:(void)0;
-}
-}
-{
-{ /* Inline model#MClass#mclass_type (var61) on <var61:MClass> */
-var66 = var61->attrs[COLOR_model__MClass___mclass_type].val; /* _mclass_type on <var61:MClass> */
-if (unlikely(var66 == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass_type");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 417);
-show_backtrace(1);
-}
-var64 = var66;
-RET_LABEL65:(void)0;
-}
-}
-var67 = 1;
-{
-var68 = ((val* (*)(val*, val*, val*, val*, short int))(var_mtype->class->vft[COLOR_model__MType__resolve_for]))(var_mtype, var64, var_anchor, var_mmodule, var67) /* resolve_for on <var_mtype:MType>*/;
-}
-var_resolved_receiver = var68;
-} else {
-var_resolved_receiver = var_mtype;
-}
-/* <var_resolved_receiver:nullable Object(MType)> isa MNullableType */
-cltype70 = type_model__MNullableType.color;
-idtype71 = type_model__MNullableType.id;
-if(cltype70 >= var_resolved_receiver->type->table_size) {
-var69 = 0;
-} else {
-var69 = var_resolved_receiver->type->type_table[cltype70] == idtype71;
-}
-if (var69){
-{
-{ /* Inline model#MNullableType#mtype (var_resolved_receiver) on <var_resolved_receiver:nullable Object(MNullableType)> */
-var74 = var_resolved_receiver->attrs[COLOR_model__MNullableType___mtype].val; /* _mtype on <var_resolved_receiver:nullable Object(MNullableType)> */
-if (unlikely(var74 == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mtype");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1375);
-show_backtrace(1);
-}
-var72 = var74;
-RET_LABEL73:(void)0;
-}
-}
-var_resolved_receiver = var72;
-} else {
-}
-/* <var_resolved_receiver:nullable Object(MType)> isa MParameterType */
-cltype76 = type_model__MParameterType.color;
-idtype77 = type_model__MParameterType.id;
-if(cltype76 >= var_resolved_receiver->type->table_size) {
-var75 = 0;
-} else {
-var75 = var_resolved_receiver->type->type_table[cltype76] == idtype77;
-}
-if (var75){
-{
-{ /* Inline model#MParameterType#mclass (var_resolved_receiver) on <var_resolved_receiver:nullable Object(MParameterType)> */
-var80 = var_resolved_receiver->attrs[COLOR_model__MParameterType___mclass].val; /* _mclass on <var_resolved_receiver:nullable Object(MParameterType)> */
-if (unlikely(var80 == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1265);
-show_backtrace(1);
-}
-var78 = var80;
-RET_LABEL79:(void)0;
-}
-}
-if (var_anchor == NULL) {
-PRINT_ERROR("Runtime error: %s", "Receiver is null");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1327);
-show_backtrace(1);
-} else {
-{ /* Inline model#MClassType#mclass (var_anchor) on <var_anchor:nullable MClassType> */
-if (unlikely(var_anchor == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Receiver is null");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 969);
-show_backtrace(1);
-}
-var83 = var_anchor->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <var_anchor:nullable MClassType> */
-if (unlikely(var83 == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 969);
-show_backtrace(1);
-}
-var81 = var83;
-RET_LABEL82:(void)0;
-}
-}
-{
-{ /* Inline kernel#Object#== (var78,var81) on <var78:MClass> */
-var_other = var81;
-{
-{ /* Inline kernel#Object#is_same_instance (var78,var_other) on <var78:MClass> */
-var89 = var78 == var_other;
-var87 = var89;
-goto RET_LABEL88;
-RET_LABEL88:(void)0;
-}
-}
-var85 = var87;
-goto RET_LABEL86;
-RET_LABEL86:(void)0;
-}
-var84 = var85;
-}
-if (unlikely(!var84)) {
-PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1327);
-show_backtrace(1);
-}
-if (var_anchor == NULL) {
-PRINT_ERROR("Runtime error: %s", "Receiver is null");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1328);
-show_backtrace(1);
-} else {
-{ /* Inline model#MClassType#arguments (var_anchor) on <var_anchor:nullable MClassType> */
-if (unlikely(var_anchor == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Receiver is null");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 979);
-show_backtrace(1);
-}
-var92 = var_anchor->attrs[COLOR_model__MClassType___arguments].val; /* _arguments on <var_anchor:nullable MClassType> */
-if (unlikely(var92 == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _arguments");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 979);
-show_backtrace(1);
-}
-var90 = var92;
-RET_LABEL91:(void)0;
-}
-}
-{
-{ /* Inline model#MParameterType#rank (var_resolved_receiver) on <var_resolved_receiver:nullable Object(MParameterType)> */
-var95 = var_resolved_receiver->attrs[COLOR_model__MParameterType___rank].l; /* _rank on <var_resolved_receiver:nullable Object(MParameterType)> */
-var93 = var95;
-RET_LABEL94:(void)0;
-}
-}
-{
-var96 = array__Array___91d_93d(var90, var93);
-}
-var_resolved_receiver = var96;
-/* <var_resolved_receiver:nullable Object(MType)> isa MNullableType */
-cltype98 = type_model__MNullableType.color;
-idtype99 = type_model__MNullableType.id;
-if(cltype98 >= var_resolved_receiver->type->table_size) {
-var97 = 0;
-} else {
-var97 = var_resolved_receiver->type->type_table[cltype98] == idtype99;
-}
-if (var97){
-{
-{ /* Inline model#MNullableType#mtype (var_resolved_receiver) on <var_resolved_receiver:nullable Object(MNullableType)> */
-var102 = var_resolved_receiver->attrs[COLOR_model__MNullableType___mtype].val; /* _mtype on <var_resolved_receiver:nullable Object(MNullableType)> */
-if (unlikely(var102 == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mtype");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1375);
-show_backtrace(1);
-}
-var100 = var102;
-RET_LABEL101:(void)0;
-}
-}
-var_resolved_receiver = var100;
-} else {
-}
-} else {
-}
-/* <var_resolved_receiver:nullable Object(MType)> isa MClassType */
-cltype104 = type_model__MClassType.color;
-idtype105 = type_model__MClassType.id;
-if(cltype104 >= var_resolved_receiver->type->table_size) {
-var103 = 0;
-} else {
-var103 = var_resolved_receiver->type->type_table[cltype104] == idtype105;
-}
-if (unlikely(!var103)) {
-PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1331);
-show_backtrace(1);
-}
-{
-{ /* Inline model#MClassType#mclass (var_resolved_receiver) on <var_resolved_receiver:nullable Object(MClassType)> */
-var108 = var_resolved_receiver->attrs[COLOR_model__MClassType___mclass].val; /* _mclass on <var_resolved_receiver:nullable Object(MClassType)> */
-if (unlikely(var108 == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 969);
-show_backtrace(1);
-}
-var106 = var108;
-RET_LABEL107:(void)0;
-}
-}
-{
-{ /* Inline model#MParameterType#mclass (self) on <self:MParameterType> */
-var111 = self->attrs[COLOR_model__MParameterType___mclass].val; /* _mclass on <self:MParameterType> */
-if (unlikely(var111 == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1265);
-show_backtrace(1);
-}
-var109 = var111;
-RET_LABEL110:(void)0;
-}
-}
-{
-{ /* Inline kernel#Object#== (var106,var109) on <var106:MClass> */
-var_other = var109;
-{
-{ /* Inline kernel#Object#is_same_instance (var106,var_other) on <var106:MClass> */
-var117 = var106 == var_other;
-var115 = var117;
-goto RET_LABEL116;
-RET_LABEL116:(void)0;
-}
-}
-var113 = var115;
-goto RET_LABEL114;
-RET_LABEL114:(void)0;
-}
-var112 = var113;
-}
-if (var112){
-{
-{ /* Inline model#MClassType#arguments (var_resolved_receiver) on <var_resolved_receiver:nullable Object(MClassType)> */
-var120 = var_resolved_receiver->attrs[COLOR_model__MClassType___arguments].val; /* _arguments on <var_resolved_receiver:nullable Object(MClassType)> */
-if (unlikely(var120 == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _arguments");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 979);
-show_backtrace(1);
-}
-var118 = var120;
-RET_LABEL119:(void)0;
-}
-}
-{
-{ /* Inline model#MParameterType#rank (self) on <self:MParameterType> */
-var123 = self->attrs[COLOR_model__MParameterType___rank].l; /* _rank on <self:MParameterType> */
-var121 = var123;
-RET_LABEL122:(void)0;
-}
-}
-{
-var124 = array__Array___91d_93d(var118, var121);
-}
-var_res125 = var124;
-var = var_res125;
-goto RET_LABEL;
-} else {
-}
-{
-var126 = ((short int (*)(val*))(var_resolved_receiver->class->vft[COLOR_model__MType__need_anchor]))(var_resolved_receiver) /* need_anchor on <var_resolved_receiver:nullable Object(MClassType)>*/;
-}
-if (var126){
-var127 = NULL;
-if (var_anchor == NULL) {
-var128 = 0; /* is null */
-} else {
-var128 = 1; /* arg is null and recv is not */
-}
-if (0) {
-{ /* Inline kernel#Object#!= (var_anchor,var127) on <var_anchor:nullable MClassType> */
-var_other28 = var127;
-{
-var132 = ((short int (*)(val*, val*))(var_anchor->class->vft[COLOR_kernel__Object___61d_61d]))(var_anchor, var_other28) /* == on <var_anchor:nullable MClassType(MClassType)>*/;
-var131 = var132;
-}
-var133 = !var131;
-var129 = var133;
-goto RET_LABEL130;
-RET_LABEL130:(void)0;
-}
-var128 = var129;
-}
-if (unlikely(!var128)) {
-PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1342);
-show_backtrace(1);
-}
-var134 = NULL;
-var135 = 0;
-{
-var136 = ((val* (*)(val*, val*, val*, val*, short int))(var_resolved_receiver->class->vft[COLOR_model__MType__resolve_for]))(var_resolved_receiver, var_anchor, var134, var_mmodule, var135) /* resolve_for on <var_resolved_receiver:nullable Object(MClassType)>*/;
-}
-var_resolved_receiver = var136;
-} else {
-}
-{
-var137 = model__MParameterType__lookup_bound(self, var_mmodule, var_resolved_receiver);
-}
-var_verbatim_bound = var137;
-{
-var138 = ((val* (*)(val*, val*, val*, val*, short int))(var_verbatim_bound->class->vft[COLOR_model__MType__resolve_for]))(var_verbatim_bound, var_mtype, var_anchor, var_mmodule, var_cleanup_virtual) /* resolve_for on <var_verbatim_bound:MType>*/;
-}
-var_res139 = var138;
-var = var_res139;
-goto RET_LABEL;
-RET_LABEL:;
-return var;
-}
-/* method model#MParameterType#resolve_for for (self: Object, MType, nullable MClassType, MModule, Bool): MType */
-val* VIRTUAL_model__MParameterType__resolve_for(val* self, val* p0, val* p1, val* p2, short int p3) {
-val* var /* : MType */;
-val* var1 /* : MType */;
-var1 = model__MParameterType__resolve_for(self, p0, p1, p2, p3);
-var = var1;
-RET_LABEL:;
-return var;
-}
-/* method model#MParameterType#can_resolve_for for (self: MParameterType, MType, nullable MClassType, MModule): Bool */
-short int model__MParameterType__can_resolve_for(val* self, val* p0, val* p1, val* p2) {
-short int var /* : Bool */;
-val* var_mtype /* var mtype: MType */;
-val* var_anchor /* var anchor: nullable MClassType */;
-val* var_mmodule /* var mmodule: MModule */;
-short int var1 /* : Bool */;
-val* var2 /* : null */;
-short int var3 /* : Bool */;
-short int var4 /* : Bool */;
-val* var_other /* var other: nullable Object */;
-short int var6 /* : Bool */;
-short int var7 /* : Bool */;
-short int var8 /* : Bool */;
-val* var9 /* : MType */;
-val* var10 /* : Set[MClassDef] */;
-val* var11 /* : MClass */;
-val* var13 /* : MClass */;
-val* var14 /* : MClassDef */;
-short int var15 /* : Bool */;
-var_mtype = p0;
-var_anchor = p1;
-var_mmodule = p2;
-{
-var1 = ((short int (*)(val*))(var_mtype->class->vft[COLOR_model__MType__need_anchor]))(var_mtype) /* need_anchor on <var_mtype:MType>*/;
-}
-if (var1){
-var2 = NULL;
-if (var_anchor == NULL) {
-var3 = 0; /* is null */
-} else {
-var3 = 1; /* arg is null and recv is not */
-}
-if (0) {
-{ /* Inline kernel#Object#!= (var_anchor,var2) on <var_anchor:nullable MClassType> */
-var_other = var2;
-{
-var7 = ((short int (*)(val*, val*))(var_anchor->class->vft[COLOR_kernel__Object___61d_61d]))(var_anchor, var_other) /* == on <var_anchor:nullable MClassType(MClassType)>*/;
-var6 = var7;
-}
-var8 = !var6;
-var4 = var8;
-goto RET_LABEL5;
-RET_LABEL5:(void)0;
-}
-var3 = var4;
-}
-if (unlikely(!var3)) {
-PRINT_ERROR("Runtime error: %s", "Assert failed");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1358);
-show_backtrace(1);
-}
-{
-var9 = ((val* (*)(val*, val*, val*))(var_mtype->class->vft[COLOR_model__MType__anchor_to]))(var_mtype, var_mmodule, var_anchor) /* anchor_to on <var_mtype:MType>*/;
-}
-var_mtype = var9;
-} else {
-}
-{
-var10 = ((val* (*)(val*, val*))(var_mtype->class->vft[COLOR_model__MType__collect_mclassdefs]))(var_mtype, var_mmodule) /* collect_mclassdefs on <var_mtype:MType>*/;
-}
-{
-{ /* Inline model#MParameterType#mclass (self) on <self:MParameterType> */
-var13 = self->attrs[COLOR_model__MParameterType___mclass].val; /* _mclass on <self:MParameterType> */
-if (unlikely(var13 == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mclass");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1265);
-show_backtrace(1);
-}
-var11 = var13;
-RET_LABEL12:(void)0;
-}
-}
-{
-var14 = model__MClass__intro(var11);
-}
-{
-var15 = ((short int (*)(val*, val*))(var10->class->vft[COLOR_abstract_collection__Collection__has]))(var10, var14) /* has on <var10:Set[MClassDef]>*/;
-}
-var = var15;
-goto RET_LABEL;
-RET_LABEL:;
-return var;
-}
-/* method model#MParameterType#can_resolve_for for (self: Object, MType, nullable MClassType, MModule): Bool */
-short int VIRTUAL_model__MParameterType__can_resolve_for(val* self, val* p0, val* p1, val* p2) {
-short int var /* : Bool */;
-short int var1 /* : Bool */;
-var1 = model__MParameterType__can_resolve_for(self, p0, p1, p2);
-var = var1;
-RET_LABEL:;
-return var;
-}
-/* method model#MParameterType#init for (self: MParameterType, MClass, Int) */
-void model__MParameterType__init(val* self, val* p0, long p1) {
-val* var_mclass /* var mclass: MClass */;
-long var_rank /* var rank: Int */;
-{
-{ /* Inline model_base#MEntity#init (self) on <self:MParameterType> */
-RET_LABEL1:(void)0;
-}
-}
-var_mclass = p0;
-var_rank = p1;
-{
-{ /* Inline model#MParameterType#mclass= (self,var_mclass) on <self:MParameterType> */
-self->attrs[COLOR_model__MParameterType___mclass].val = var_mclass; /* _mclass on <self:MParameterType> */
-RET_LABEL2:(void)0;
-}
-}
-{
-{ /* Inline model#MParameterType#rank= (self,var_rank) on <self:MParameterType> */
-self->attrs[COLOR_model__MParameterType___rank].l = var_rank; /* _rank on <self:MParameterType> */
-RET_LABEL3:(void)0;
-}
-}
-RET_LABEL:;
-}
-/* method model#MParameterType#init for (self: Object, MClass, Int) */
-void VIRTUAL_model__MParameterType__init(val* self, val* p0, long p1) {
-model__MParameterType__init(self, p0, p1); /* Direct call model#MParameterType#init on <self:Object(MParameterType)>*/
-RET_LABEL:;
-}
-/* method model#MNullableType#mtype for (self: MNullableType): MType */
-val* model__MNullableType__mtype(val* self) {
-val* var /* : MType */;
-val* var1 /* : MType */;
-var1 = self->attrs[COLOR_model__MNullableType___mtype].val; /* _mtype on <self:MNullableType> */
-if (unlikely(var1 == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mtype");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1375);
-show_backtrace(1);
-}
-var = var1;
-RET_LABEL:;
-return var;
-}
-/* method model#MNullableType#mtype for (self: Object): MType */
-val* VIRTUAL_model__MNullableType__mtype(val* self) {
-val* var /* : MType */;
-val* var1 /* : MType */;
-val* var3 /* : MType */;
-{ /* Inline model#MNullableType#mtype (self) on <self:Object(MNullableType)> */
-var3 = self->attrs[COLOR_model__MNullableType___mtype].val; /* _mtype on <self:Object(MNullableType)> */
-if (unlikely(var3 == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mtype");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1375);
-show_backtrace(1);
-}
-var1 = var3;
-RET_LABEL2:(void)0;
-}
-var = var1;
-RET_LABEL:;
-return var;
-}
-/* method model#MNullableType#mtype= for (self: MNullableType, MType) */
-void model__MNullableType__mtype_61d(val* self, val* p0) {
-self->attrs[COLOR_model__MNullableType___mtype].val = p0; /* _mtype on <self:MNullableType> */
-RET_LABEL:;
-}
-/* method model#MNullableType#mtype= for (self: Object, MType) */
-void VIRTUAL_model__MNullableType__mtype_61d(val* self, val* p0) {
-{ /* Inline model#MNullableType#mtype= (self,p0) on <self:Object(MNullableType)> */
-self->attrs[COLOR_model__MNullableType___mtype].val = p0; /* _mtype on <self:Object(MNullableType)> */
-RET_LABEL1:(void)0;
-}
-RET_LABEL:;
-}
-/* method model#MNullableType#model for (self: MNullableType): Model */
-val* model__MNullableType__model(val* self) {
-val* var /* : Model */;
-val* var1 /* : MType */;
-val* var3 /* : MType */;
-val* var4 /* : Model */;
-{
-{ /* Inline model#MNullableType#mtype (self) on <self:MNullableType> */
-var3 = self->attrs[COLOR_model__MNullableType___mtype].val; /* _mtype on <self:MNullableType> */
-if (unlikely(var3 == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mtype");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1375);
-show_backtrace(1);
-}
-var1 = var3;
-RET_LABEL2:(void)0;
-}
-}
-{
-var4 = ((val* (*)(val*))(var1->class->vft[COLOR_model_base__MEntity__model]))(var1) /* model on <var1:MType>*/;
-}
-var = var4;
-goto RET_LABEL;
-RET_LABEL:;
-return var;
-}
-/* method model#MNullableType#model for (self: Object): Model */
-val* VIRTUAL_model__MNullableType__model(val* self) {
-val* var /* : Model */;
-val* var1 /* : Model */;
-var1 = model__MNullableType__model(self);
-var = var1;
-RET_LABEL:;
-return var;
-}
-/* method model#MNullableType#init for (self: MNullableType, MType) */
-void model__MNullableType__init(val* self, val* p0) {
-val* var_mtype /* var mtype: MType */;
-static val* varonce;
-val* var /* : String */;
-char* var3 /* : NativeString */;
-long var4 /* : Int */;
-val* var5 /* : FlatString */;
-val* var6 /* : Array[Object] */;
-long var7 /* : Int */;
-val* var8 /* : NativeArray[Object] */;
-val* var9 /* : String */;
-{
-{ /* Inline model_base#MEntity#init (self) on <self:MNullableType> */
-RET_LABEL1:(void)0;
-}
-}
-var_mtype = p0;
-{
-{ /* Inline model#MNullableType#mtype= (self,var_mtype) on <self:MNullableType> */
-self->attrs[COLOR_model__MNullableType___mtype].val = var_mtype; /* _mtype on <self:MNullableType> */
-RET_LABEL2:(void)0;
-}
-}
-if (varonce) {
-var = varonce;
-} else {
-var3 = "nullable ";
-var4 = 9;
-var5 = string__NativeString__to_s_with_length(var3, var4);
-var = var5;
-varonce = var;
-}
-var6 = NEW_array__Array(&type_array__Arraykernel__Object);
-{ /* var6 = array_instance Array[Object] */
-var7 = 2;
-var8 = NEW_array__NativeArray(var7, &type_array__NativeArraykernel__Object);
-((struct instance_array__NativeArray*)var8)->values[0] = (val*) var;
-((struct instance_array__NativeArray*)var8)->values[1] = (val*) var_mtype;
-{
-((void (*)(val*, val*, long))(var6->class->vft[COLOR_array__Array__with_native]))(var6, var8, var7) /* with_native on <var6:Array[Object]>*/;
-}
-}
-{
-var9 = ((val* (*)(val*))(var6->class->vft[COLOR_string__Object__to_s]))(var6) /* to_s on <var6:Array[Object]>*/;
-}
-{
-{ /* Inline model#MNullableType#to_s= (self,var9) on <self:MNullableType> */
-self->attrs[COLOR_model__MNullableType___to_s].val = var9; /* _to_s on <self:MNullableType> */
-RET_LABEL10:(void)0;
-}
-}
-RET_LABEL:;
-}
-/* method model#MNullableType#init for (self: Object, MType) */
-void VIRTUAL_model__MNullableType__init(val* self, val* p0) {
-model__MNullableType__init(self, p0); /* Direct call model#MNullableType#init on <self:Object(MNullableType)>*/
-RET_LABEL:;
-}
-/* method model#MNullableType#to_s for (self: MNullableType): String */
-val* model__MNullableType__to_s(val* self) {
-val* var /* : String */;
-val* var1 /* : String */;
-var1 = self->attrs[COLOR_model__MNullableType___to_s].val; /* _to_s on <self:MNullableType> */
-if (unlikely(var1 == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _to_s");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1386);
-show_backtrace(1);
-}
-var = var1;
-RET_LABEL:;
-return var;
-}
-/* method model#MNullableType#to_s for (self: Object): String */
-val* VIRTUAL_model__MNullableType__to_s(val* self) {
-val* var /* : String */;
-val* var1 /* : String */;
-val* var3 /* : String */;
-{ /* Inline model#MNullableType#to_s (self) on <self:Object(MNullableType)> */
-var3 = self->attrs[COLOR_model__MNullableType___to_s].val; /* _to_s on <self:Object(MNullableType)> */
-if (unlikely(var3 == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _to_s");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1386);
-show_backtrace(1);
-}
-var1 = var3;
-RET_LABEL2:(void)0;
-}
-var = var1;
-RET_LABEL:;
-return var;
-}
-/* method model#MNullableType#to_s= for (self: MNullableType, String) */
-void model__MNullableType__to_s_61d(val* self, val* p0) {
-self->attrs[COLOR_model__MNullableType___to_s].val = p0; /* _to_s on <self:MNullableType> */
-RET_LABEL:;
-}
-/* method model#MNullableType#to_s= for (self: Object, String) */
-void VIRTUAL_model__MNullableType__to_s_61d(val* self, val* p0) {
-{ /* Inline model#MNullableType#to_s= (self,p0) on <self:Object(MNullableType)> */
-self->attrs[COLOR_model__MNullableType___to_s].val = p0; /* _to_s on <self:Object(MNullableType)> */
-RET_LABEL1:(void)0;
-}
-RET_LABEL:;
-}
-/* method model#MNullableType#need_anchor for (self: MNullableType): Bool */
-short int model__MNullableType__need_anchor(val* self) {
-short int var /* : Bool */;
-val* var1 /* : MType */;
-val* var3 /* : MType */;
-short int var4 /* : Bool */;
-{
-{ /* Inline model#MNullableType#mtype (self) on <self:MNullableType> */
-var3 = self->attrs[COLOR_model__MNullableType___mtype].val; /* _mtype on <self:MNullableType> */
-if (unlikely(var3 == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mtype");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1375);
-show_backtrace(1);
-}
-var1 = var3;
-RET_LABEL2:(void)0;
-}
-}
-{
-var4 = ((short int (*)(val*))(var1->class->vft[COLOR_model__MType__need_anchor]))(var1) /* need_anchor on <var1:MType>*/;
-}
-var = var4;
-goto RET_LABEL;
-RET_LABEL:;
-return var;
-}
-/* method model#MNullableType#need_anchor for (self: Object): Bool */
-short int VIRTUAL_model__MNullableType__need_anchor(val* self) {
-short int var /* : Bool */;
-short int var1 /* : Bool */;
-var1 = model__MNullableType__need_anchor(self);
-var = var1;
-RET_LABEL:;
-return var;
-}
-/* method model#MNullableType#as_nullable for (self: MNullableType): MType */
-val* model__MNullableType__as_nullable(val* self) {
-val* var /* : MType */;
-var = self;
-goto RET_LABEL;
-RET_LABEL:;
-return var;
-}
-/* method model#MNullableType#as_nullable for (self: Object): MType */
-val* VIRTUAL_model__MNullableType__as_nullable(val* self) {
-val* var /* : MType */;
-val* var1 /* : MType */;
-var1 = model__MNullableType__as_nullable(self);
-var = var1;
-RET_LABEL:;
-return var;
-}
-/* method model#MNullableType#as_notnullable for (self: MNullableType): MType */
-val* model__MNullableType__as_notnullable(val* self) {
-val* var /* : MType */;
-val* var1 /* : MType */;
-val* var3 /* : MType */;
-{
-{ /* Inline model#MNullableType#mtype (self) on <self:MNullableType> */
-var3 = self->attrs[COLOR_model__MNullableType___mtype].val; /* _mtype on <self:MNullableType> */
-if (unlikely(var3 == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mtype");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1375);
-show_backtrace(1);
-}
-var1 = var3;
-RET_LABEL2:(void)0;
-}
-}
-var = var1;
-goto RET_LABEL;
-RET_LABEL:;
-return var;
-}
-/* method model#MNullableType#as_notnullable for (self: Object): MType */
-val* VIRTUAL_model__MNullableType__as_notnullable(val* self) {
-val* var /* : MType */;
-val* var1 /* : MType */;
-var1 = model__MNullableType__as_notnullable(self);
-var = var1;
-RET_LABEL:;
-return var;
-}
-/* method model#MNullableType#resolve_for for (self: MNullableType, MType, nullable MClassType, MModule, Bool): MType */
-val* model__MNullableType__resolve_for(val* self, val* p0, val* p1, val* p2, short int p3) {
-val* var /* : MType */;
-val* var_mtype /* var mtype: MType */;
-val* var_anchor /* var anchor: nullable MClassType */;
-val* var_mmodule /* var mmodule: MModule */;
-short int var_cleanup_virtual /* var cleanup_virtual: Bool */;
-val* var1 /* : MType */;
-val* var3 /* : MType */;
-val* var4 /* : MType */;
-val* var_res /* var res: MType */;
-val* var5 /* : MType */;
-var_mtype = p0;
-var_anchor = p1;
-var_mmodule = p2;
-var_cleanup_virtual = p3;
-{
-{ /* Inline model#MNullableType#mtype (self) on <self:MNullableType> */
-var3 = self->attrs[COLOR_model__MNullableType___mtype].val; /* _mtype on <self:MNullableType> */
-if (unlikely(var3 == NULL)) {
-PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _mtype");
-PRINT_ERROR(" (%s:%d)\n", "src/model/model.nit", 1375);
-show_backtrace(1);
-}
-var1 = var3;
-RET_LABEL2:(void)0;
-}
-}
-{
-var4 = ((val* (*)(val*, val*, val*, val*, short int))(var1->class->vft[COLOR_model__MType__resolve_for]))(var1, var_mtype, var_anchor, var_mmodule, var_cleanup_virtual) /* resolve_for on <var1:MType>*/;
-}
-var_res = var4;
-{
-var5 = ((val* (*)(val*))(var_res->class->vft[COLOR_model__MType__as_nullable]))(var_res) /* as_nullable on <var_res:MType>*/;
-}
-var = var5;
-goto RET_LABEL;
-RET_LABEL:;
-return var;
-}
-/* method model#MNullableType#resolve_for for (self: Object, MType, nullable MClassType, MModule, Bool): MType */
-val* VIRTUAL_model__MNullableType__resolve_for(val* self, val* p0, val* p1, val* p2, short int p3) {
-val* var /* : MType */;
-val* var1 /* : MType */;
-var1 = model__MNullableType__resolve_for(self, p0, p1, p2, p3);
-var = var1;
-RET_LABEL:;
-return var;
-}