src: cleanup importations
[nit.git] / src / cached.nit
index 0567a27..830ff66 100644 (file)
 # 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}<cache>", 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}<real>", 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