Merge: glesv2: more services from OpenGL ES 2.0 to prepare for gamnit
[nit.git] / contrib / jwrapper / src / javap_visitor.nit
index 269f125..115dbcd 100644 (file)
@@ -61,7 +61,7 @@ end
 redef class Nextends_declaration
        redef fun accept_visitor(v)
        do
-               # TODO
+               v.java_class.extends.add_all n_types.to_a
        end
 end
 
@@ -69,7 +69,7 @@ end
 redef class Nimplements_declaration
        redef fun accept_visitor(v)
        do
-               # TODO
+               v.java_class.implements.add_all n_types.to_a
        end
 end
 
@@ -87,14 +87,21 @@ 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_types.to_a
+               else generic_params = new Array[JavaType]
+
                # Collect parameters
-               var n_parameters = n_parameters
+               var n_types = n_types
                var params
-               if n_parameters != null then
-                       params = n_parameters.to_a
+               if n_types != null then
+                       params = n_types.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
@@ -104,13 +111,20 @@ redef class Nproperty_declaration_constructor
        redef fun accept_visitor(v)
        do
                # Collect parameters
-               var n_parameters = n_parameters
+               var n_types = n_types
                var params
-               if n_parameters != null then
-                       params = n_parameters.to_a
+               if n_types != null then
+                       params = n_types.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_types.to_a
+               else generic_params = new Array[JavaType]
+
+               var method = new JavaConstructor(params, generic_params)
                v.java_class.constructors.add method
        end
 end
@@ -153,6 +167,9 @@ redef class Ntype
                var brackets = n_brackets
                if brackets != null then jtype.array_dimension += brackets.children.length
 
+               var dots = n_dots
+               if dots != null then jtype.is_vararg = true
+
                return jtype
        end
 end
@@ -161,7 +178,6 @@ redef class Nbase_type
        private fun to_java_type: JavaType
        do
                # By default, everything is bound by object
-               # TODO use a more precise bound
                var jtype = new JavaType
                jtype.identifier.add_all(["java", "lang", "object"])
                return jtype
@@ -197,6 +213,41 @@ 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 Nbase_type_super
+       redef fun to_java_type
+       do
+               var bounds = n_type_bound.to_a
+
+               # Java use more than one lower bound,
+               # it can't be translated statically to Nit,
+               # so we use the only the first one.
+               # This may cause problems on complex generic types,
+               # but these cases can be handled manually.
+               return bounds.first
+       end
+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
@@ -211,7 +262,7 @@ redef class Nfull_class_name
 
                # Generic parameters
                var n_params = n_class_name_common.n_generic_parameters
-               if n_params != null then jtype.generic_params = n_params.n_parameters.to_a
+               if n_params != null then jtype.generic_params = n_params.n_types.to_a
 
                return jtype
        end
@@ -234,38 +285,26 @@ redef class Nfull_class_name_tail
        end
 end
 
-redef class Nparameters
+redef class Ntypes
        # Get the types composing this list of parameters
        #
        # This is used both on methods signatures and type parameters.
        private fun to_a: Array[JavaType] is abstract
 end
 
-redef class Nparameters_head
-       redef fun to_a do return [n_parameter.to_java_type]
+redef class Ntypes_head
+       redef fun to_a do return [n_type.to_java_type]
 end
 
-redef class Nparameters_tail
+redef class Ntypes_tail
        redef fun to_a
        do
-               var a = n_parameters.to_a
-               a.add n_parameter.to_java_type
+               var a = n_types.to_a
+               a.add n_type.to_java_type
                return a
        end
 end
 
-redef class Nparameter
-       private fun to_java_type: JavaType
-       do
-               var jtype = n_type.to_java_type
-
-               var dots = n_dots
-               if dots != null then jtype.is_vararg = true
-
-               return jtype
-       end
-end
-
 redef class Nodes
        private fun has_static: Bool
        do
@@ -276,3 +315,21 @@ redef class Nodes
                return false
        end
 end
+
+redef class Ntype_bound
+       # Get the types composing this bound
+       private fun to_a: Array[JavaType] is abstract
+end
+
+redef class Ntype_bound_head
+       redef fun to_a do return [n_full_class_name.to_java_type]
+end
+
+redef class Ntype_bound_tail
+       redef fun to_a
+       do
+               var a = n_type_bound.to_a
+               a.add n_full_class_name.to_java_type
+               return a
+       end
+end