contrib/jwrapper: collect methods and constructors generic paramters
authorAlexis Laferrière <alexis.laf@xymus.net>
Tue, 28 Jul 2015 18:02:11 +0000 (14:02 -0400)
committerAlexis Laferrière <alexis.laf@xymus.net>
Wed, 29 Jul 2015 19:08:57 +0000 (15:08 -0400)
Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

contrib/jwrapper/grammar/javap.sablecc
contrib/jwrapper/src/javap_visitor.nit
contrib/jwrapper/src/jwrapper.nit
contrib/jwrapper/src/model.nit

index dc46557..718a446 100644 (file)
@@ -44,8 +44,8 @@ type_bound
        | {head:} full_class_name;
 
 generic_identifier
-       = full_class_name
-       | wildcard;
+       = {class:} full_class_name
+       | {wildcard:} wildcard;
 
 full_class_name
        = {tail:} full_class_name separator class_name
index 269f125..899930d 100644 (file)
@@ -87,6 +87,13 @@ redef class Nproperty_declaration_method
                var id = n_identifier.text
                var return_jtype = n_type.to_java_type
 
+               # Generic parameters
+               var n_params = n_generic_parameters
+               var generic_params
+               if n_params != null then
+                       generic_params = n_params.n_parameters.to_a
+               else generic_params = new Array[JavaType]
+
                # Collect parameters
                var n_parameters = n_parameters
                var params
@@ -94,7 +101,7 @@ redef class Nproperty_declaration_method
                        params = n_parameters.to_a
                else params = new Array[JavaType]
 
-               var method = new JavaMethod(is_static, return_jtype, params)
+               var method = new JavaMethod(is_static, return_jtype, params, generic_params)
                v.java_class.methods[id].add method
        end
 end
@@ -110,7 +117,14 @@ redef class Nproperty_declaration_constructor
                        params = n_parameters.to_a
                else params = new Array[JavaType]
 
-               var method = new JavaConstructor(params)
+               # Generic parameters
+               var n_params = n_generic_parameters
+               var generic_params
+               if n_params != null then
+                       generic_params = n_params.n_parameters.to_a
+               else generic_params = new Array[JavaType]
+
+               var method = new JavaConstructor(params, generic_params)
                v.java_class.constructors.add method
        end
 end
@@ -197,6 +211,27 @@ redef class Nbase_type_void
        end
 end
 
+redef class Nbase_type_extends
+       redef fun to_java_type do return n_generic_identifier.to_java_type
+end
+
+redef class Ngeneric_identifier
+       private fun to_java_type: JavaType is abstract
+end
+
+redef class Ngeneric_identifier_class
+       redef fun to_java_type do return n_full_class_name.to_java_type
+end
+
+redef class Ngeneric_identifier_wildcard
+       redef fun to_java_type
+       do
+               var jtype = new JavaType
+               jtype.identifier.add_all(["java", "lang", "Object"])
+               return jtype
+       end
+end
+
 redef class Nfull_class_name
        # All the identifiers composing this class name
        private fun to_a: Array[String] is abstract
index 06e8f44..0a84fa9 100644 (file)
@@ -192,6 +192,9 @@ var visitor = new JavaVisitor(model)
 visitor.enter_visit root_node
 sys.perfs["core model"].add clock.lapse
 
+model.resolve_types
+sys.perfs["core resolve"].add clock.lapse
+
 if opt_verbose.value > 0 then print "# Generating Nit code"
 
 var use_comment = opt_unknown.value == 0
index 25d9cd2..4a82064 100644 (file)
@@ -263,6 +263,9 @@ class JavaMethod
 
        # Type of the arguments of the method
        var params: Array[JavaType]
+
+       # Generic parameters of this method
+       var generic_params: Array[JavaType]
 end
 
 # An attribute in a Java class
@@ -277,6 +280,9 @@ end
 class JavaConstructor
        # Type of the parameters of this constructor
        var params: Array[JavaType]
+
+       # Generic parameters of this constructor
+       var generic_params: Array[JavaType]
 end
 
 # A Nit module, use to import the referenced extern classes