jwrapper: accept output files that do not look like Nit modules
[nit.git] / contrib / jwrapper / src / code_generator.nit
index 84682d9..917074d 100644 (file)
@@ -17,7 +17,7 @@
 # Services to generate extern class `in "Java"`
 module code_generator
 
-intrude import types
+intrude import model
 
 class CodeGenerator
 
@@ -26,13 +26,20 @@ 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
@@ -72,7 +79,11 @@ class CodeGenerator
                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(""))
@@ -81,9 +92,8 @@ class CodeGenerator
 
        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.
@@ -97,7 +107,7 @@ class CodeGenerator
 # 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
 
@@ -128,9 +138,9 @@ class CodeGenerator
 
        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 = ""
@@ -138,7 +148,7 @@ class CodeGenerator
                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
@@ -177,7 +187,7 @@ class CodeGenerator
                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}"
@@ -216,7 +226,7 @@ class CodeGenerator
                        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")
@@ -229,29 +239,21 @@ class CodeGenerator
        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