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

src/compiler/java_compiler.nit

index 1dcb169..15baa05 100644 (file)
@@ -210,9 +210,22 @@ class JavaCompiler
                # compile java classes used to represents the runtime model of the program
                rt_model.compile_rtmodel(self)
 
-               # TODO compile classes and methods
+               # compile class structures
+               compile_mclasses_to_java
+
+               # TODO compile methods
                modelbuilder.toolcontext.info("NOT YET IMPLEMENTED", 0)
        end
+
+       # Generate a `RTClass` for each `MClass` found in model
+       #
+       # This is a global phase because we need to know all the program to build
+       # attributes, fill vft and type table.
+       fun compile_mclasses_to_java do
+               for mclass in mainmodule.model.mclasses do
+                       mclass.compile_to_java(new_visitor("{mclass.rt_name}.java"))
+               end
+       end
 end
 
 # The class visiting the AST
@@ -333,6 +346,24 @@ redef class MClass
 
        # Runtime name
        private fun rt_name: String do return "RTClass_{intro.mmodule.jname}_{jname}"
+
+       # Generate a Java RTClass for a Nit MClass
+       fun compile_to_java(v: JavaCompilerVisitor) do
+               v.add("public class {rt_name} extends RTClass \{")
+               v.add("  protected static RTClass instance;")
+               v.add("  private {rt_name}() \{")
+               v.add("    this.class_name = \"{name}\";")
+               # TODO compile_vft(v)
+               # TODO compile_type_table(v)
+               v.add("  \}")
+               v.add("  public static RTClass get{rt_name}() \{")
+               v.add("    if(instance == null) \{")
+               v.add("      instance = new {rt_name}();")
+               v.add("    \}")
+               v.add("    return instance;")
+               v.add("  \}")
+               v.add("\}")
+       end
 end
 
 redef class MMethodDef