X-Git-Url: http://nitlanguage.org diff --git a/contrib/jwrapper/src/code_generator.nit b/contrib/jwrapper/src/code_generator.nit index 6ea8974..7aaac04 100644 --- a/contrib/jwrapper/src/code_generator.nit +++ b/contrib/jwrapper/src/code_generator.nit @@ -112,20 +112,17 @@ class CodeGenerator 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") @@ -166,7 +163,6 @@ class CodeGenerator 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}" @@ -179,6 +175,9 @@ class CodeGenerator 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 var nit_signature = new Array[String] @@ -212,9 +211,9 @@ class CodeGenerator 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 @@ -232,7 +231,19 @@ class CodeGenerator end end +redef class Sys + # List of Nit keywords + # + # 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", + "loop", "module", "new", "not", "null", "nullable", "or", "package", "private", + "protected", "public", "return", "self", "super", "then", "type", "var", "while"] +end + redef class String + # Convert the Java method name `self` to the Nit style # # * Converts to snake case @@ -244,9 +255,22 @@ redef class String if name.has_prefix("get_") then name = name.substring_from(4) else if name.has_prefix("set_") then - name = name.substring_from(4) + "=" + name = name.substring_from(4) + if nit_keywords.has(name) then name += "_" + name += "=" end + # Strip the '_' prefix + while name.has_prefix("_") do name = name.substring(1, name.length-1) + + # Escape Nit keywords + if nit_keywords.has(name) then name += "_" + + # If the name starts by something other than a letter, prefix with `java_` + if not name.chars.first.is_letter then name = "java_" + name + + name = name.replace("$", "_") + return name end end