modelize: introduce annotation
authorJean Privat <jean@pryen.org>
Sat, 6 Sep 2014 13:39:31 +0000 (09:39 -0400)
committerJean Privat <jean@pryen.org>
Sat, 6 Sep 2014 13:39:31 +0000 (09:39 -0400)
Signed-off-by: Jean Privat <jean@pryen.org>

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

index 367ba4d..6249e91 100644 (file)
@@ -75,6 +75,7 @@ private class CheckAnnotationPhase
        var primtives_annotations_list = """
 new_annotation
 
+deprecated
 fixed
 lazy
 noinit
index 6b96137..4b1c129 100644 (file)
@@ -420,6 +420,18 @@ redef class APropdef
                        mpropdef.mdoc = mdoc
                        mdoc.original_mentity = mpropdef
                end
+
+               var at_deprecated = get_single_annotation("deprecated", modelbuilder)
+               if at_deprecated != null then
+                       if not mpropdef.is_intro then
+                               modelbuilder.error(self, "Error: method redefinition cannot be deprecated.")
+                       else
+                               var info = new MDeprecationInfo
+                               ndoc = at_deprecated.n_doc
+                               if ndoc != null then info.mdoc = ndoc.to_mdoc
+                               mpropdef.mproperty.deprecation = info
+                       end
+               end
        end
 
        private fun check_redef_property_visibility(modelbuilder: ModelBuilder, nvisibility: nullable AVisibility, mprop: MProperty)
@@ -851,6 +863,7 @@ redef class AAttrPropdef
                                var mvisibility = new_property_visibility(modelbuilder, mclassdef, self.n_visibility)
                                mreadprop = new MMethod(mclassdef, readname, mvisibility)
                                if not self.check_redef_keyword(modelbuilder, mclassdef, n_kwredef, false, mreadprop) then return
+                               mreadprop.deprecation = mprop.deprecation
                        else
                                if not self.check_redef_keyword(modelbuilder, mclassdef, n_kwredef, true, mreadprop) then return
                                check_redef_property_visibility(modelbuilder, self.n_visibility, mreadprop)
@@ -905,6 +918,7 @@ redef class AAttrPropdef
                                end
                                mwriteprop = new MMethod(mclassdef, writename, mvisibility)
                                if not self.check_redef_keyword(modelbuilder, mclassdef, nwkwredef, false, mwriteprop) then return
+                               mwriteprop.deprecation = mprop.deprecation
                        else
                                if not self.check_redef_keyword(modelbuilder, mclassdef, nwkwredef or else n_kwredef, true, mwriteprop) then return
                                if nwritable != null then
index 462fe04..e5f131d 100644 (file)
@@ -262,6 +262,16 @@ private class TypeVisitor
                        return null
                end
 
+               var info = mproperty.deprecation
+               if info != null and self.mpropdef.mproperty.deprecation == null then
+                       var mdoc = info.mdoc
+                       if mdoc != null then
+                               self.modelbuilder.warning(node, "Deprecation Warning: Method '{name}' is deprecated: {mdoc.content.first}")
+                       else
+                               self.modelbuilder.warning(node, "Deprecation Warning: Method '{name}' is deprecated.")
+                       end
+               end
+
                var propdefs = mproperty.lookup_definitions(self.mmodule, unsafe_type)
                var mpropdef
                if propdefs.length == 0 then