contrib/jwrapper: revamp and merge extern_name and extern_class_name
authorAlexis Laferrière <alexis.laf@xymus.net>
Thu, 23 Jul 2015 13:31:57 +0000 (09:31 -0400)
committerAlexis Laferrière <alexis.laf@xymus.net>
Fri, 24 Jul 2015 13:59:55 +0000 (09:59 -0400)
Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

contrib/jwrapper/src/model.nit

index c25e9e2..c4c0366 100644 (file)
@@ -79,24 +79,33 @@ class JavaType
 
        fun is_wrapped: Bool do return find_extern_class[full_id] != null
 
-       fun extern_name: NitType
+       # Name to give an extern class wrapping this type
+       fun extern_name: String
        do
-               var nit_type = find_extern_class[full_id]
-               if nit_type != null then return nit_type
-
                var name
-               if is_primitive_array then
-                       # Primitive arrays have a special naming convention
-                       name = "Java" + extern_class_name.join.capitalized + "Array"
+               var prefix = extern_class_prefix
+               if prefix == null then
+                       # Use the namespace, e.g. java.lang.String -> Java_lang_String
+                       assert not identifier.is_empty
+                       if identifier.length == 1 then
+                               name = identifier.last
+                       else
+                               var first = identifier.first
+                               var last = identifier.last
+                               var mid = identifier.subarray(1, identifier.length-2)
+                               name = first.simple_capitalized + "_"
+                               if mid.not_empty then name += mid.join("_") + "_"
+                               name += last
+                       end
                else
-                       name = "Java" + extern_class_name.join
+                       # Use the prefix and the short class name
+                       # e.g. given the prefix Native: java.lang.String -> NativeString
+                       name = prefix + id
                end
 
                name = name.replace("-", "_")
-
-               var nit_type = new NitType(name)
-               nit_type.is_complete = false
-               return nit_type
+               name = name.replace("$", "_")
+               return name
        end
 
        fun to_cast(jtype: String, is_param: Bool): String
@@ -144,20 +153,6 @@ class JavaType
                end
        end
 
-       private fun extern_class_name: Array[String]
-       do
-               var class_name = new Array[String]
-               class_name.add(self.id)
-
-               if not self.has_generic_params then return class_name
-
-               class_name.add "Of"
-
-               for param in generic_params do class_name.add_all param.extern_class_name
-
-               return class_name
-       end
-
        # Comparison based on fully qualified named and generic params
        # Ignores primitive array so `a.b.c[][] == a.b.c`
        redef fun ==(other) do return other isa JavaType and self.full_id == other.full_id
@@ -305,3 +300,15 @@ redef class Sys
        # Prefix used to name extern classes, if `null` use the full namespace
        var extern_class_prefix: nullable String is lazy do return opt_extern_class_prefix.value
 end
+
+redef class Text
+       # Get a copy of `self` where the first letter is capitalized
+       fun simple_capitalized: String
+       do
+               if is_empty then return to_s
+
+               var c = chars.first.to_upper
+               var s = c.to_s + substring_from(1)
+               return s
+       end
+end