contrib/jwrapper: Added static overload support
authorFrédéric Vachon <fredvac@gmail.com>
Mon, 21 Jul 2014 20:13:34 +0000 (16:13 -0400)
committerFrédéric Vachon <fredvac@gmail.com>
Mon, 21 Jul 2014 20:41:19 +0000 (16:41 -0400)
Signed-off-by: Frédéric Vachon <fredvac@gmail.com>

contrib/jwrapper/src/code_generator.nit
contrib/jwrapper/src/javap_visitor.nit
contrib/jwrapper/src/types.nit

index 9c5cbc2..e7c471a 100644 (file)
@@ -22,25 +22,48 @@ intrude import types
 class CodeGenerator
 
        var file_out: OFStream
+       var java_class: JavaClass
        fun code_warehouse: CodeWarehouse do return once new CodeWarehouse
 
-       init (file_name: String)
+       init (file_name: String, jclass: JavaClass) 
        do
                file_out = new OFStream.open(file_name)
+               self.java_class = jclass
+       end
+
+       fun generate
+       do
+               var jclass = self.java_class
+
+               file_out.write("import mnit_android\n")
+               gen_class_header(jclass.name)
+
+               # Attributes generation
+               for id, jtype in jclass.attributes do gen_attribute(id, jtype)
+
+               for id, methods_info in jclass.methods do
+                       for method_info in methods_info do
+                               var nid = id
+                               if methods_info.length > 1 then nid += "{methods_info.index_of(method_info)}"
+                               gen_method(id, nid, method_info.return_type, method_info.params)
+                       end
+               end
+
+               file_out.write("\nend")
        end
 
        fun gen_class_header(full_class_name: Array[String])
        do
-               file_out.write("extern class Native{full_class_name.last} in \"Java\" `\{ {full_class_name.join(".")} `\}")
+               file_out.write("extern class Native{full_class_name.last} in \"Java\" `\{ {full_class_name.join(".")} `\}\n")
                file_out.write("\tsuper JavaObject\n\tredef type SELF: Native{full_class_name.last}\n\n")
        end
 
-       fun gen_variable(jid: String, jtype: JavaType)
+       fun gen_attribute(jid: String, jtype: JavaType)
        do
                file_out.write("\tvar {jid.to_snake_case}: {jtype.to_nit_type}\n")
        end
        
-       fun gen_method(jparam_list: Array[JavaType], jreturn_type: JavaType, jmethod_id: String)
+       fun gen_method(jmethod_id: String, nmethod_id: String, jreturn_type: JavaType, jparam_list: Array[JavaType])
        do
                var java_params = ""
                var nit_params  = ""
@@ -74,7 +97,7 @@ class CodeGenerator
                end
 
                # Method identifier
-               var method_id = jmethod_id.to_snake_case
+               var method_id = nmethod_id.to_snake_case
                var nit_signature = new Array[String]
 
                nit_signature.add "\tfun {method_id}"
index 69d0954..5e9896b 100644 (file)
@@ -25,7 +25,7 @@ intrude import types
 class JavaVisitor
        super Visitor
 
-       fun generator: CodeGenerator do return once new CodeGenerator("bundle2.nit")
+       var java_class = new JavaClass
        var declaration_type: nullable String =  null
        var declaration_element: nullable String = null
        var full_class_name = new Array[String]
@@ -282,7 +282,7 @@ redef class Nclass_header
                v.declaration_type = null
                v.declaration_element = null
 
-               v.generator.gen_class_header(v.full_class_name)
+               v.java_class.name = v.full_class_name
        end
 end
 
@@ -318,7 +318,7 @@ redef class Nmethod_declaration
                super
                v.declaration_type = null
 
-               v.generator.gen_method(v.method_params, v.method_return_type, v.method_id)
+               v.java_class.add_method(v.method_id, v.method_return_type, v.method_params)
 
                v.method_params.clear
                v.method_id = ""
@@ -344,7 +344,7 @@ redef class Nvariable_declaration
                super
                v.declaration_type = null
 
-               v.generator.gen_variable(v.variable_id, v.variable_type)
+               v.java_class.attributes[v.variable_id] = v.variable_type
 
                v.variable_id = ""
                v.variable_type = new JavaType
@@ -489,4 +489,5 @@ var tree = p.main
 var visitor = new JavaVisitor
 visitor.enter_visit(tree)
 
-print "end"
+var generator = new CodeGenerator("bundle.nit", visitor.java_class)
+generator.generate
index 068a330..f953d25 100644 (file)
@@ -189,3 +189,28 @@ class NitType
                return id
        end
 end
+
+class JavaClass
+       var name = new Array[String]
+       var attributes = new HashMap[String, JavaType]
+       var methods = new HashMap[String, Array[JReturnAndParams]]
+
+       fun add_method(id: String, return_type: JavaType, params: Array[JavaType])
+       do
+               var ret_and_params = methods.get_or_default(id, new Array[JReturnAndParams])
+               
+               ret_and_params.add(new JReturnAndParams(return_type, new Array[JavaType].from(params)))
+               methods[id] = ret_and_params
+       end
+end
+
+class JReturnAndParams
+       var return_type: JavaType
+       var params: Array[JavaType]
+
+       init(return_type: JavaType, params: Array[JavaType])
+       do
+               self.return_type = return_type
+               self.params = params
+       end
+end