contrib/jwrapper: generate primitive array variants for each extern classes
authorAlexis Laferrière <alexis.laf@xymus.net>
Tue, 28 Jul 2015 18:07:16 +0000 (14:07 -0400)
committerAlexis Laferrière <alexis.laf@xymus.net>
Wed, 29 Jul 2015 19:05:13 +0000 (15:05 -0400)
Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

contrib/jwrapper/src/code_generator.nit
contrib/jwrapper/src/jwrapper.nit
contrib/jwrapper/src/model.nit

index 1431458..f6f45f7 100644 (file)
@@ -107,6 +107,11 @@ class CodeGenerator
                        for id, attribute in jclass.attributes do if attribute.is_static then
                                generate_getter_setter(jclass, id, attribute)
                        end
+
+                       # Primitive arrays
+                       for d in [1..opt_arrays.value] do
+                               generate_primitive_array(jclass, d)
+                       end
                end
 
                if stub_for_unknown_types then
@@ -292,6 +297,33 @@ class CodeGenerator
 
 """
        end
+
+       private fun generate_primitive_array(java_class: JavaClass, dimensions: Int)
+       do
+               var base_java_type = java_class.class_type
+               var java_type = base_java_type.clone
+               java_type.array_dimension = dimensions
+
+               var base_nit_type = model.java_to_nit_type(base_java_type)
+               var nit_type = model.java_to_nit_type(java_type)
+
+               file_out.write """
+# Java primitive array: {{{java_type}}}
+extern class {{{nit_type}}} in "Java" `{ {{{java_type.extern_equivalent}}} `}
+       super AbstractJavaArray[{{{base_nit_type}}}]
+
+       # Get a new array of the given `size`
+       new(size: Int) in "Java" `{ return new {{{base_java_type}}}[(int)size]; `}
+
+       redef fun [](i) in "Java" `{ return self[(int)i]; `}
+
+       redef fun []=(i, e) in "Java" `{ self[(int)i] = e; `}
+
+       redef fun length in "Java" `{ return self.length; `}
+end
+
+"""
+       end
 end
 
 redef class Sys
index 04878da..b6d8123 100644 (file)
@@ -44,7 +44,7 @@ var opt_output = new OptionString("Output file", "-o")
 var opt_regex = new OptionString("Regex pattern to filter classes in Jar archives", "-r")
 var opt_help = new OptionBool("Show this help message", "-h", "--help")
 
-opts.add_option(opt_output, opt_unknown, opt_extern_class_prefix, opt_libs, opt_regex, opt_cast_objects, opt_verbose, opt_help)
+opts.add_option(opt_output, opt_unknown, opt_extern_class_prefix, opt_libs, opt_regex, opt_cast_objects, opt_arrays, opt_verbose, opt_help)
 opts.parse args
 
 if opts.errors.not_empty or opts.rest.is_empty or opt_help.value then
index 011d0a8..21f6c63 100644 (file)
@@ -82,6 +82,10 @@ class JavaType
                        name = prefix + id
                end
 
+               if is_primitive_array then
+                       name += "_" + "Array" * array_dimension
+               end
+
                name = name.replace("-", "_")
                name = name.replace("$", "_")
                return name
@@ -219,10 +223,11 @@ class JavaModel
                # Is being wrapped in this pass?
                var key = jtype.full_id
                if classes.keys.has(key) then
-                       var nit_type = new NitType(jtype.extern_name)
-                       known_types[jtype] = nit_type
-
-                       return nit_type
+                       if jtype.array_dimension <= opt_arrays.value then
+                               var nit_type = new NitType(jtype.extern_name)
+                               known_types[jtype] = nit_type
+                               return nit_type
+                       end
                end
 
                # Search in lib
@@ -353,6 +358,9 @@ redef class Sys
 
        # Libraries to search for existing wrappers
        var opt_libs = new OptionArray("Paths to libraries with wrappers of Java classes ('auto' to use the full Nit lib)", "-i")
+
+       # Generate the primitive array version of each class up to the given depth
+       var opt_arrays = new OptionInt("Depth of the primitive array for each wrapped class (default: 1)", 1, "-a")
 end
 
 redef class Text