nitj: generate runtime mmethodef structure stubs
authorAlexandre Terrasa <alexandre@moz-code.org>
Fri, 17 Jul 2015 17:44:32 +0000 (13:44 -0400)
committerAlexandre Terrasa <alexandre@moz-code.org>
Tue, 21 Jul 2015 21:23:20 +0000 (17:23 -0400)
Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

src/compiler/java_compiler.nit

index 15baa05..8bee357 100644 (file)
@@ -213,7 +213,10 @@ class JavaCompiler
                # compile class structures
                compile_mclasses_to_java
 
-               # TODO compile methods
+               # compile method structures
+               compile_mmethods_to_java
+
+               # TODO compile main
                modelbuilder.toolcontext.info("NOT YET IMPLEMENTED", 0)
        end
 
@@ -226,6 +229,21 @@ class JavaCompiler
                        mclass.compile_to_java(new_visitor("{mclass.rt_name}.java"))
                end
        end
+
+       # Generate a `RTMethod` for each `MMethodDef` found in model
+       #
+       # This is a separate phase.
+       fun compile_mmethods_to_java do
+               for mmodule in mainmodule.in_importation.greaters do
+                       for mclassdef in mmodule.mclassdefs do
+                               for mdef in mclassdef.mpropdefs do
+                                       if mdef isa MMethodDef then
+                                               mdef.compile_to_java(new_visitor("{mdef.rt_name}.java"))
+                                       end
+                               end
+                       end
+               end
+       end
 end
 
 # The class visiting the AST
@@ -372,4 +390,22 @@ redef class MMethodDef
        private fun rt_name: String do
                return "RTMethod_{mclassdef.mmodule.jname}_{mclassdef.mclass.jname}_{mproperty.jname}"
        end
+
+       # Generate a Java RTMethod for `self`
+       fun compile_to_java(v: JavaCompilerVisitor) do
+               v.add("public class {rt_name} extends RTMethod \{")
+               v.add("  protected static RTMethod instance;")
+               v.add("  public static RTMethod get{rt_name}() \{")
+               v.add("    if(instance == null) \{")
+               v.add("      instance = new {rt_name}();")
+               v.add("    \}")
+               v.add("    return instance;")
+               v.add("  \}")
+               v.add("  @Override")
+               v.add("  public RTVal exec(RTVal[] args) \{")
+               # TODO compile_inside_to_java(v)
+               v.add("    return null;")
+               v.add("  \}")
+               v.add("\}")
+       end
 end