# Services to generate extern class `in "Java"`
module code_generator
-intrude import types
+intrude import model
class CodeGenerator
var file_out: OFStream
var java_class: JavaClass
var nb_params: Int
- var module_name: String
- fun code_warehouse: CodeWarehouse do return once new CodeWarehouse
+ var module_name: nullable String = null
init (file_name: String, jclass: JavaClass, with_attributes, comment: Bool)
do
file_out = new OFStream.open(file_name)
- module_name = file_name.substring(0, file_name.search(".nit").from)
+
+ var nit_ext = ".nit"
+ if file_name.has_suffix(nit_ext) then
+ # Output file ends with .nit, we expect it to be a valid name
+ module_name = file_name.strip_extension(nit_ext)
+
+ # Otherwise, it may be anything so do not declare a module
+ end
+
self.java_class = jclass
self.with_attributes = with_attributes
self.comment_unknown_types = comment
end
file_out.write(gen_licence)
- file_out.write("module {module_name}\n")
+
+ var module_name = module_name
+ if module_name != null then file_out.write "module {module_name}\n"
+
+ file_out.write("\n")
file_out.write(imports.join(""))
file_out.write("\n")
file_out.write(class_content.join(""))
fun gen_licence: String
do
- return """# This file is part of NIT (http://www.nitlanguage.org).
-#
-# Copyright [Year] [Author name] <Author e-mail>
+ return """
+# This file is part of NIT (http://www.nitlanguage.org).
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# See the License for the specific language governing permissions and
# limitations under the License.
-# This code has been generated using `javap`
+# This code has been generated using `jwrapper`
"""
end
fun gen_attribute(jid: String, jtype: JavaType): String
do
- return "\tvar {jid.to_snake_case}: {jtype.to_nit_type}\n"
+ return "\tvar {jid.to_nit_method_name}: {jtype.to_nit_type}\n"
end
-
+
fun gen_method(jmethod_id: String, nmethod_id: String, jreturn_type: JavaType, jparam_list: Array[JavaType]): String
do
var java_params = ""
var nit_id = "arg"
var nit_id_no = 0
var nit_types = new Array[NitType]
- var comment = ""
+ var comment = ""
# Parameters
for i in [0..jparam_list.length[ do
end
# Method identifier
- var method_id = nmethod_id.to_snake_case
+ var method_id = nmethod_id.to_nit_method_name
var nit_signature = new Array[String]
nit_signature.add "\tfun {method_id}"
temp.add(" in \"Java\" `\{\n{comment}\t\trecv.{jmethod_id}({java_params});\n{comment}\t`\}\n")
# Methods with return type
else if return_type != null then
- temp.add(" in \"Java\" `\{\n{comment}\t\treturn {jreturn_type.return_cast} recv.{jmethod_id}({java_params});\n{comment}\t`\}\n")
+ temp.add(" in \"Java\" `\{\n{comment}\t\treturn {jreturn_type.return_cast}recv.{jmethod_id}({java_params});\n{comment}\t`\}\n")
# Methods without return type
else if jreturn_type.is_void then
temp.add(" in \"Java\" `\{\n{comment}\t\trecv.{jmethod_id}({java_params});\n{comment}\t`\}\n")
end
end
-# Contains raw code mostly used to copy collections
-class CodeWarehouse
-
- private fun create_imports(nit_type: NitType, is_param: Bool): String
+redef class String
+ # Convert the Java method name `self` to the Nit style
+ #
+ # * Converts to snake case
+ # * Strips `Get` and `Set`
+ # * Add suffix `=` to setters
+ fun to_nit_method_name: String
do
- var imports = ""
- var ntype = nit_type.to_s
- var gen_type = nit_type.generic_params.join(", ")
-
- if not is_param then
- if nit_type.is_map then
- imports = """ import {{{ntype}}}, {{{ntype}}}.[]="""
- else
- imports = """ import {{{ntype}}}, {{{ntype}}}.add"""
- end
- else if nit_type.id == "Array" then
- imports = """ import {{{ntype}}}, {{{ntype}}}.length, {{{ntype}}}.[]"""
- else if nit_type.is_map then
- imports = """ import {{{ntype}}}.iterator, Iterator[{{{gen_type}}}].is_ok, Iterator[{{{gen_type}}}].next, Iterator[{{{gen_type}}}].item, Iterator[{{{gen_type}}}].key"""
- else
- imports = """ import {{{ntype}}}.iterator, Iterator[{{{gen_type}}}].is_ok, Iterator[{{{gen_type}}}].next, Iterator[{{{gen_type}}}].item"""
+ var name = self.to_snake_case
+ if name.has_prefix("get_") then
+ name = name.substring_from(4)
+ else if name.has_prefix("set_") then
+ name = name.substring_from(4) + "="
end
- return imports
+ return name
end
end