X-Git-Url: http://nitlanguage.org diff --git a/src/cached.nit b/src/cached.nit index 0567a27..830ff66 100644 --- a/src/cached.nit +++ b/src/cached.nit @@ -18,9 +18,10 @@ # complex annotation that modify both the model and the AST of a Nit program module cached -import modelize_property -import parser_util +import modelize +private import parser_util import simple_misc_analysis +private import annotation redef class ToolContext var cached_phase: Phase = new CachedPhase(self, [modelize_property_phase]) @@ -41,12 +42,12 @@ private class CachedPhase redef fun process_annotated_node(npropdef, nat) do # Skip if we are not interested - if nat.n_atid.n_id.text != "cached" then return + if nat.name != "cached" then return # Do some validity checks and print errors if the annotation is used incorrectly var modelbuilder = toolcontext.modelbuilder - if not npropdef isa AConcreteMethPropdef then + if not npropdef isa AMethPropdef then modelbuilder.error(npropdef, "Syntax error: only a function can be cached.") return end @@ -68,9 +69,14 @@ private class CachedPhase var location = npropdef.location var name = mpropdef.mproperty.name - var nclassdef = npropdef.parent.as(AStdClassdef) + var nclassdef = npropdef.parent.as(AClassdef) var mclassdef = nclassdef.mclassdef.as(not null) + if not mclassdef.mclass.kind.need_init then + modelbuilder.error(npropdef, "Error: only abstract and concrete classes can have cached functions.") + return + end + # Create a new private attribute to store the cache var cache_mpropdef = new MAttributeDef(mclassdef, new MAttribute(mclassdef, "@{name}", private_visibility), location) cache_mpropdef.static_mtype = mtype.as_nullable @@ -87,7 +93,7 @@ private class CachedPhase var real_mpropdef = new MMethodDef(mclassdef, new MMethod(mclassdef, "{name}", private_visibility), location) real_mpropdef.msignature = mpropdef.msignature # FIXME: Again, if the engine require a real propdef even if it is empty - var real_npropdef = toolcontext.parse_propdef("fun real do end").as(AConcreteMethPropdef) + var real_npropdef = toolcontext.parse_propdef("fun real do end").as(AMethPropdef) associate_propdef(real_mpropdef, real_npropdef) # Note: the body is set at the last line of this function