modelize: new annotation `autoinit` for manual setters
authorJean Privat <privat@pryen.org>
Mon, 29 Sep 2014 19:54:59 +0000 (15:54 -0400)
committerJean Privat <jean@pryen.org>
Mon, 29 Sep 2014 20:18:03 +0000 (16:18 -0400)
Signed-off-by: Jean Privat <privat@pryen.org>

src/frontend/check_annotation.nit
src/modelize/modelize_property.nit

index 41abe43..7cd186e 100644 (file)
@@ -81,6 +81,7 @@ lazy
 noinit
 readonly
 writable
+autoinit
 cached
 nosuper
 old_style_init
index 487110f..5b51894 100644 (file)
@@ -122,6 +122,26 @@ redef class ModelBuilder
                var mparameters = new Array[MParameter]
                var initializers = new Array[MProperty]
                for npropdef in nclassdef.n_propdefs do
+                       if npropdef isa AMethPropdef then
+                               if npropdef.mpropdef == null then return # Skip broken attribute
+                               var at = npropdef.get_single_annotation("autoinit", self)
+                               if at == null then continue # Skip non tagged init
+
+                               var sig = npropdef.mpropdef.msignature
+                               if sig == null then continue # Skip broken method
+
+                               if not npropdef.mpropdef.is_intro then
+                                       self.error(at, "Error: `autoinit` cannot be set on redefinitions")
+                                       continue
+                               end
+
+                               for param in sig.mparameters do
+                                       var ret_type = param.mtype
+                                       var mparameter = new MParameter(param.name, ret_type, false)
+                                       mparameters.add(mparameter)
+                               end
+                               initializers.add(npropdef.mpropdef.mproperty)
+                       end
                        if npropdef isa AAttrPropdef then
                                if npropdef.mpropdef == null then return # Skip broken attribute
                                var at = npropdef.get_single_annotation("noinit", self)