X-Git-Url: http://nitlanguage.org diff --git a/src/modelize_property.nit b/src/modelize_property.nit index 93f0e00..8273fb8 100644 --- a/src/modelize_property.nit +++ b/src/modelize_property.nit @@ -187,7 +187,7 @@ redef class ModelBuilder # It is a case-by case var vis_type: nullable MVisibility = null # The own visibility of the type var mmodule_type: nullable MModule = null # The origial module of the type - if mtype isa MNullableType then mtype = mtype.mtype + mtype = mtype.as_notnullable if mtype isa MClassType then vis_type = mtype.mclass.visibility mmodule_type = mtype.mclass.intro.mmodule @@ -645,10 +645,20 @@ redef class AAttrPropdef # Is the node tagged `noinit`? var noinit = false + # Is the node taggeg lazy? + var is_lazy = false + + # The guard associated to a lasy attribute. + # Because some engines does not have a working `isset`, + # this additionnal attribute is used to guard the lazy initialization. + # TODO: to remove once isset is correctly implemented + var mlazypropdef: nullable MAttributeDef + # The associated getter (read accessor) if any var mreadpropdef: nullable MMethodDef writable # The associated setter (write accessor) if any var mwritepropdef: nullable MMethodDef writable + redef fun build_property(modelbuilder, mclassdef) do var mclass = mclassdef.mclass @@ -718,6 +728,17 @@ redef class AAttrPropdef modelbuilder.mpropdef2npropdef[mreadpropdef] = self mreadpropdef.mdoc = mpropdef.mdoc + var atlazy = self.get_single_annotation("lazy", modelbuilder) + if atlazy != null then + if n_expr == null then + modelbuilder.error(atlazy, "Error: a lazy attribute needs a value") + end + is_lazy = true + var mlazyprop = new MAttribute(mclassdef, "lazy _" + name, none_visibility) + var mlazypropdef = new MAttributeDef(mclassdef, mlazyprop, self.location) + self.mlazypropdef = mlazypropdef + end + var atreadonly = self.get_single_annotation("readonly", modelbuilder) if atreadonly != null then if n_expr == null then @@ -840,7 +861,7 @@ redef class AAttrPropdef mreadpropdef.msignature = msignature end - var msritepropdef = self.mwritepropdef + var mwritepropdef = self.mwritepropdef if mwritepropdef != null then var name: String if n_id != null then @@ -852,6 +873,11 @@ redef class AAttrPropdef var msignature = new MSignature([mparameter], null) mwritepropdef.msignature = msignature end + + var mlazypropdef = self.mlazypropdef + if mlazypropdef != null then + mlazypropdef.static_mtype = modelbuilder.model.get_mclasses_by_name("Bool").first.mclass_type + end end redef fun check_signature(modelbuilder) @@ -975,6 +1001,11 @@ redef class ATypePropdef self.mpropdef = mpropdef modelbuilder.mpropdef2npropdef[mpropdef] = self set_doc(mpropdef) + + var atfixed = get_single_annotation("fixed", modelbuilder) + if atfixed != null then + mpropdef.is_fixed = true + end end redef fun build_signature(modelbuilder) @@ -1028,6 +1059,10 @@ redef class ATypePropdef bound = mpropdef.bound.as(not null) for p in mpropdef.mproperty.lookup_super_definitions(mmodule, anchor) do var supbound = p.bound.as(not null) + if p.is_fixed then + modelbuilder.error(self, "Redef Error: Virtual type {mpropdef.mproperty} is fixed in super-class {p.mclassdef.mclass}") + break + end if p.mclassdef.mclass == mclassdef.mclass then # Still a warning to pass existing bad code modelbuilder.warning(n_type, "Redef Error: a virtual type cannot be refined.")