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 = ""
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}"
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]
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
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 = ""
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
var visitor = new JavaVisitor
visitor.enter_visit(tree)
-print "end"
+var generator = new CodeGenerator("bundle.nit", visitor.java_class)
+generator.generate
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