modelize: works if abstract, intern and extern are annotations
authorJean Privat <jean@pryen.org>
Tue, 9 Sep 2014 19:34:57 +0000 (15:34 -0400)
committerJean Privat <jean@pryen.org>
Tue, 9 Sep 2014 19:34:57 +0000 (15:34 -0400)
Signed-off-by: Jean Privat <jean@pryen.org>

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

index 5bb29e6..a4c55f8 100644 (file)
@@ -21,6 +21,7 @@ import literal
 import semantize
 import platform
 import c_tools
+private import annotation
 
 # Add compiling options
 redef class ToolContext
@@ -2143,9 +2144,15 @@ redef class AMethPropdef
        fun compile_externmeth_to_c(v: AbstractCompilerVisitor, mpropdef: MMethodDef, arguments: Array[RuntimeVariable]): Bool
        do
                var externname
-               var nextern = self.n_extern
-               if nextern == null then return false
-               externname = nextern.text.substring(1, nextern.text.length-2)
+               var at = self.get_single_annotation("extern", v.compiler.modelbuilder)
+               if at != null then
+                       externname = at.arg_as_string(v.compiler.modelbuilder)
+                       if externname == null then return false
+               else
+                       var nextern = self.n_extern
+                       if nextern == null then return false
+                       externname = nextern.text.substring(1, nextern.text.length-2)
+               end
                if location.file != null then
                        var file = location.file.filename
                        v.add_extern(file)
@@ -2172,9 +2179,15 @@ redef class AMethPropdef
        fun compile_externinit_to_c(v: AbstractCompilerVisitor, mpropdef: MMethodDef, arguments: Array[RuntimeVariable]): Bool
        do
                var externname
-               var nextern = self.n_extern
-               if nextern == null then return false
-               externname = nextern.text.substring(1, nextern.text.length-2)
+               var at = self.get_single_annotation("extern", v.compiler.modelbuilder)
+               if at != null then
+                       externname = at.arg_as_string(v.compiler.modelbuilder)
+                       if externname == null then return false
+               else
+                       var nextern = self.n_extern
+                       if nextern == null then return false
+                       externname = nextern.text.substring(1, nextern.text.length-2)
+               end
                if location.file != null then
                        var file = location.file.filename
                        v.add_extern(file)
index 6249e91..6178a39 100644 (file)
@@ -84,6 +84,9 @@ writable
 cached
 nosuper
 old_style_init
+abstract
+intern
+extern
 
 pkgconfig
 c_compiler_option
index db77b76..f0c46a5 100644 (file)
@@ -724,9 +724,9 @@ redef class AMethPropdef
 
                msignature = new MSignature(mparameters, ret_type)
                mpropdef.msignature = msignature
-               mpropdef.is_abstract = self isa ADeferredMethPropdef
-               mpropdef.is_intern = self isa AInternMethPropdef
-               mpropdef.is_extern = self isa AExternPropdef
+               mpropdef.is_abstract = self isa ADeferredMethPropdef or self.get_single_annotation("abstract", modelbuilder) != null
+               mpropdef.is_intern = self isa AInternMethPropdef or self.get_single_annotation("intern", modelbuilder) != null
+               mpropdef.is_extern = self isa AExternPropdef or self.n_extern_code_block != null or self.get_single_annotation("extern", modelbuilder) != null
        end
 
        redef fun check_signature(modelbuilder)