contrib/jwrapper: generate constructors
authorAlexis Laferrière <alexis.laf@xymus.net>
Thu, 23 Jul 2015 13:27:12 +0000 (09:27 -0400)
committerAlexis Laferrière <alexis.laf@xymus.net>
Fri, 24 Jul 2015 13:44:24 +0000 (09:44 -0400)
Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

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

index bd47e10..ce4fb80 100644 (file)
@@ -81,6 +81,15 @@ class CodeGenerator
                                end
                        end
 
+                       # Constructors
+                       for constructor in jclass.constructors do
+                               var complex = jclass.constructors.length != 1 and constructor.params.not_empty
+                               var base_name = if complex then "from" else ""
+                               var name = jclass.nit_name_for(base_name, constructor.params, complex)
+
+                               generate_constructor(jclass, constructor, name)
+                       end
+
                        # Attributes
                        for id, java_type in jclass.attributes do
                                generate_getter_setter(jclass, id, java_type)
@@ -261,6 +270,41 @@ class CodeGenerator
 
 """
        end
+
+       # Generate getter and setter to access an attribute, of field
+       private fun generate_constructor(java_class: JavaClass, constructor: JavaConstructor, name: String)
+       do
+               var c = ""
+               var nit_params_s = ""
+               var java_params_s = ""
+
+               if constructor.params.not_empty then
+                       var nit_params = new Array[String]
+                       var java_params = new Array[String]
+                       var param_id = 'a'
+                       for java_type in constructor.params do
+
+                               java_params.add "{java_type.param_cast}{param_id}"
+
+                               var nit_type = model.java_to_nit_type(java_type)
+                               nit_params.add  "{param_id}: {nit_type}"
+                               param_id = param_id.successor(1)
+
+                               if not nit_type.is_known then c = "#"
+                       end
+
+                       nit_params_s = "(" + nit_params.join(", ") + ")"
+                       java_params_s = java_params.join(", ")
+               end
+
+               file_out.write """
+       # Java constructor: {{{java_class}}}
+{{{c}}}        new {{{name}}}{{{nit_params_s}}} in "Java" `{
+{{{c}}}                return new {{{java_class}}}({{{java_params_s}}});
+{{{c}}}        `}
+
+"""
+       end
 end
 
 redef class Sys
index b8557d8..c3e5f98 100644 (file)
@@ -99,7 +99,15 @@ end
 redef class Nproperty_declaration_constructor
        redef fun accept_visitor(v)
        do
-               # TODO
+               # Collect parameters
+               var n_parameters = n_parameters
+               var params
+               if n_parameters != null then
+                       params = n_parameters.to_a
+               else params = new Array[JavaType]
+
+               var method = new JavaConstructor(params)
+               v.java_class.constructors.add method
        end
 end
 
index b2b362b..6200f28 100644 (file)
@@ -192,6 +192,9 @@ class JavaClass
        # Methods of this class organized by their name
        var methods = new MultiHashMap[String, JavaMethod]
 
+       # Constructors of this class
+       var constructors = new Array[JavaConstructor]
+
        # Importations from this class
        var imports = new HashSet[NitModule]
 
@@ -223,6 +226,12 @@ class JavaMethod
        var params: Array[JavaType]
 end
 
+# A Java method, with its signature
+class JavaConstructor
+       # Type of the parameters of this constructor
+       var params: Array[JavaType]
+end
+
 # A Nit module, use to import the referenced extern classes
 class NitModule
        # Relative path to the module