# All importations
var imports = new HashSet[String]
- imports.add "import mnit_android\n"
- for jclass in model.classes do
+ imports.add "import java\n"
+ for key, jclass in model.classes do
for import_ in jclass.imports do imports.add "import android::{import_}\n"
end
file_out.write imports.join("\n")
+ file_out.write "\n"
- for jclass in model.classes do
+ for key, jclass in model.classes do
file_out.write gen_class_header(jclass.class_type)
fun gen_class_header(jtype: JavaType): String
do
var temp = new Array[String]
- temp.add("extern class Native{jtype.id} in \"Java\" `\{ {jtype} `\}\n")
- temp.add("\tsuper JavaObject\n\n")
+ var nit_type = jtype.to_nit_type
+ temp.add "# Java class: {jtype.to_package_name}\n"
+ temp.add "extern class {nit_type} in \"Java\" `\{ {jtype.to_package_name} `\}\n"
+ temp.add "\tsuper JavaObject\n\n"
return temp.join
end
fun gen_unknown_class_header(jtype: JavaType): String
do
- var nit_type: NitType
- if jtype.extern_name.has_generic_params then
- nit_type = jtype.extern_name.generic_params.first
- else
- nit_type = jtype.extern_name
- end
+ var nit_type = jtype.extern_name
var temp = new Array[String]
temp.add("extern class {nit_type} in \"Java\" `\{ {jtype.to_package_name} `\}\n")
if not jparam.is_collection then cast = jparam.param_cast
nit_types.add(nit_type)
- nit_type.arg_id = "{nit_id}{nit_id_no}"
if i == jparam_list.length - 1 then
java_params += "{cast}{nit_id}{nit_id_no}"
nit_id_no += 1
end
+ # Method documentation
+ var doc = "\t# Java implementation: {java_class}.{jmethod_id}\n"
+
# Method identifier
var method_id = nmethod_id.to_nit_method_name
+ method_id = java_class.nit_name_for(method_id, jparam_list, java_class.methods[jmethod_id].length > 1)
var nit_signature = new Array[String]
nit_signature.add "\tfun {method_id}"
var temp = new Array[String]
+ temp.add doc
temp.add(comment + nit_signature.join)
- # FIXME : This huge `if` block is only necessary to copy primitive arrays as long as there's no better way to do it
if comment == "#" then
temp.add(" in \"Java\" `\{\n{comment}\t\tself.{jmethod_id}({java_params});\n{comment}\t`\}\n")
# Methods with return type
#
# These may also be keywords in Java, but there they would be used capitalized.
private var nit_keywords: Array[String] = ["abort", "abstract", "and", "assert",
- "break", "class", "continue", "do", "else", "end", "enum", "extern", "implies",
- "import", "init", "interface", "intrude", "if", "in", "is", "isa", "for", "label",
+ "break", "class", "continue", "do", "else", "end", "enum", "extern", "false", "implies",
+ "import", "init", "interface", "intrude", "if", "in", "is", "isa", "isset", "for", "label",
"loop", "module", "new", "not", "null", "nullable", "or", "package", "private",
- "protected", "public", "return", "self", "super", "then", "type", "var", "while"]
+ "protected", "public", "return", "self", "super", "then", "true", "type", "var", "while"]
end
redef class String
return name
end
end
+
+redef class JavaClass
+ # Property names used in this class
+ private var used_name = new HashSet[String]
+
+ # Get an available property name for the Java property with `name` and parameters
+ #
+ # If `use_parameters_name` then expect that there will be conflicts,
+ # so use the types of `parameters` to build the name.
+ private fun nit_name_for(name: String, parameters: Array[JavaType], use_parameters_name: Bool): String
+ do
+ # Append the name of each parameter
+ if use_parameters_name then
+ for param in parameters do
+ name += "_" + param.id
+ end
+ end
+
+ # As a last resort, append numbers to the name
+ var base_name = name
+ var count = 1
+ while used_name.has(name) do
+ name = base_name + count.to_s
+ count += 1
+ end
+
+ used_name.add name
+ return name
+ end
+end