From a456c4469b709324a1625faac22f3405dcf82ee8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fr=C3=A9d=C3=A9ric=20Vachon?= Date: Mon, 21 Jul 2014 16:13:34 -0400 Subject: [PATCH] contrib/jwrapper: Added static overload support MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Frédéric Vachon --- contrib/jwrapper/src/code_generator.nit | 33 ++++++++++++++++++++++++++----- contrib/jwrapper/src/javap_visitor.nit | 11 ++++++----- contrib/jwrapper/src/types.nit | 25 +++++++++++++++++++++++ 3 files changed, 59 insertions(+), 10 deletions(-) diff --git a/contrib/jwrapper/src/code_generator.nit b/contrib/jwrapper/src/code_generator.nit index 9c5cbc2..e7c471a 100644 --- a/contrib/jwrapper/src/code_generator.nit +++ b/contrib/jwrapper/src/code_generator.nit @@ -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}" diff --git a/contrib/jwrapper/src/javap_visitor.nit b/contrib/jwrapper/src/javap_visitor.nit index 69d0954..5e9896b 100644 --- a/contrib/jwrapper/src/javap_visitor.nit +++ b/contrib/jwrapper/src/javap_visitor.nit @@ -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 diff --git a/contrib/jwrapper/src/types.nit b/contrib/jwrapper/src/types.nit index 068a330..f953d25 100644 --- a/contrib/jwrapper/src/types.nit +++ b/contrib/jwrapper/src/types.nit @@ -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 -- 1.7.9.5