metamodel: move the extern name of a method in the metamodel
authorJean Privat <jean@pryen.org>
Wed, 10 Feb 2010 17:52:16 +0000 (12:52 -0500)
committerJean Privat <jean@pryen.org>
Mon, 15 Feb 2010 16:10:29 +0000 (11:10 -0500)
Signed-off-by: Jean Privat <jean@pryen.org>

src/metamodel/abstractmetamodel.nit
src/syntax/icode_generation.nit
src/syntax/mmbuilder.nit
src/syntax/syntax_base.nit

index 546b9fd..9d93d37 100644 (file)
@@ -661,6 +661,9 @@ special MMLocalProperty
 
        # Is the method abstract
        fun is_abstract: Bool is abstract
+
+       # Is the method extern, if yes what is the extern_name
+       fun extern_name: nullable String is abstract
 end
 
 # Concrete local classes
index 0d60974..b5de2be 100644 (file)
@@ -397,11 +397,7 @@ redef class AExternMethPropdef
        redef fun fill_iroutine(v, method)
        do
                var params = v.iroutine.params
-               var ename = "{method.module.name}_{method.local_class.name}_{method.local_class.name}_{method.name}_{method.signature.arity}"
-               if n_extern != null then
-                       ename = n_extern.text
-                       ename = ename.substring(1, ename.length-2)
-               end
+               var ename = method.extern_name.as(not null)
                var sig = method.signature
                assert params.length == sig.arity + 1
                var args = new Array[String]
index d296fbb..585c70c 100644 (file)
@@ -1050,6 +1050,21 @@ redef class AMainMethPropdef
        end
 end
 
+redef class AExternMethPropdef
+       redef fun accept_property_verifier(v)
+       do
+               super # Compute signature
+               var ename: String
+               if n_extern != null then
+                       ename = n_extern.text
+                       ename = ename.substring(1, ename.length-2)
+               else
+                       ename = "{method.module.name}_{method.local_class.name}_{method.local_class.name}_{method.name}_{method.signature.arity}"
+               end
+               method.extern_name = ename
+       end
+end
+
 redef class ATypePropdef
        redef fun prop do return _prop.as(not null)
        var _prop: nullable MMSrcTypeProperty
index f4060f1..2d0ef27 100644 (file)
@@ -148,6 +148,7 @@ class MMSrcMethod
 special MMMethod
        redef fun is_intern do return false
        redef fun is_abstract do return false
+       redef fun extern_name do return null
 end
 
 # Concrete NIT source method for an automatic accesor
@@ -185,6 +186,7 @@ special MMSrcMethod
        redef readable var _is_init: Bool
        redef readable var _is_intern: Bool
        redef readable var _is_abstract: Bool
+       redef readable writable var _extern_name: nullable String # Will be computed during MMBuilder
        redef fun node: nullable AMethPropdef do return module.nodes(self).as(nullable AMethPropdef)
        init(name: Symbol, cla: MMLocalClass, n: nullable AMethPropdef)
        do
@@ -193,6 +195,7 @@ special MMSrcMethod
                _is_init = node isa AConcreteInitPropdef
                _is_intern = node isa AInternMethPropdef
                _is_abstract = node isa ADeferredMethPropdef
+               _extern_name = null
        end
 end