import ffi_base
redef class ToolContext
- var extern_classes_typing_phase_ast: Phase = new ExternClassesTypingPhaseAst(self, [ffi_language_assignation_phase])
+ var extern_classes_typing_phase_ast: Phase = new ExternClassesTypingPhaseAst(self, [ffi_language_assignation_phase, modelize_class_phase])
var extern_classes_typing_phase_model: Phase = new ExternClassesTypingPhaseModel(self,
[extern_classes_typing_phase_ast, modelize_class_phase, modelize_property_phase])
if code_block == null then return
if nclassdef.n_kwredef != null then
- # A redef cannot specifiy a different extern type
- toolcontext.error(nclassdef.location, "Only the introduction of a class can specify an extern type.")
+ # A redef cannot specify a different extern type
+ toolcontext.error(nclassdef.location, "FFI Error: only the introduction of a class can declare an extern type.")
return
end
var ftype = code_block.language.get_ftype(code_block, nclassdef)
- nclassdef.ftype_cache = ftype
- nclassdef.ftype_computed = true
+ nclassdef.mclassdef.ftype_cache = ftype
+ nclassdef.mclassdef.ftype_computed = true
end
end
-redef class AClassdef
+redef class MClassDef
private var ftype_cache: nullable ForeignType = null
private var ftype_computed = false
if not nclassdef isa AStdClassdef then return
var mclassdef = nclassdef.mclassdef
- var mclass = nclassdef.mclass
+ if mclassdef == null then return
+ var mclass = mclassdef.mclass
# We only need to do this once per class
- if mclass.intro != mclassdef then return
+ if not mclassdef.is_intro then return
if mclass.kind != extern_kind then return
return ftype_cache
end
- var intro_nclassdef = v.toolcontext.modelbuilder.mclassdef2nclassdef[intro]
- var ftype = intro_nclassdef.ftype
+ var ftype = intro.ftype
if ftype == null then
var ftype_b: nullable ForeignType = null # FIXME hack to circumvent bug where ftype is typed null
else
# detect conflict
if super_ftype != ftype_b then
- v.toolcontext.error(null, "Extern type conflict in {self}")
+ v.toolcontext.error(null, "FFI Error: extern type conflict in `{self}`.")
return null
end
end