Merge: Jwrapper: Fix bug with nested classes
[nit.git] / contrib / jwrapper / src / model.nit
index d2706d2..9013bff 100644 (file)
@@ -109,15 +109,18 @@ class JavaType
        # Short name of the class, mangled to remove `$` (e.g. `Set`)
        fun id: String do return identifier.last.replace("$", "")
 
-       # Full name of this class as used in an importation (e.g. `java.lang.Set`)
-       fun package_name: String do return identifier.join(".")
+       # Full name of this class as used in java code (e.g. `java.lang.Set`)
+       fun java_full_name: String do return identifier.join(".").replace("$", ".")
+
+       # Full name of this class as used by jni (e.g. `android.graphics.BitmapFactory$Options`)
+       fun jni_full_name: String do return identifier.join(".")
 
        # Name of this class for the extern declaration in Nit (e.g. `java.lang.Set[]`)
-       fun extern_equivalent: String do return package_name + "[]" * array_dimension
+       fun extern_equivalent: String do return jni_full_name + "[]" * array_dimension
 
        # Full name of this class with arrays and generic values (e.g. `java.lang.Set<E>[]`)
        redef fun to_s do
-               var id = self.package_name
+               var id = self.java_full_name
 
                if self.is_primitive_array then
                        id += "[]" * array_dimension
@@ -143,10 +146,10 @@ class JavaType
 
        # Comparison based on fully qualified named
        redef fun ==(other) do return other isa JavaType and
-               self.package_name == other.package_name and
+               self.java_full_name == other.java_full_name and
                self.array_dimension == other.array_dimension
 
-       redef fun hash do return self.package_name.hash
+       redef fun hash do return self.java_full_name.hash
 end
 
 class NitType
@@ -287,10 +290,13 @@ class JavaModel
                return classes
        end
 
+       # Does this model have access to the `java.lang.Object`?
+       var knows_the_object_class: Bool = all_classes.keys.has("java.lang.Object") is lazy
+
        # Add a class in `classes`
        fun add_class(jclass: JavaClass)
        do
-               var key = jclass.class_type.package_name
+               var key = jclass.class_type.java_full_name
                classes[key] = jclass
        end
 
@@ -322,7 +328,7 @@ class JavaModel
                end
 
                # Is being wrapped in this pass?
-               var key = jtype.package_name
+               var key = jtype.java_full_name
                if classes.keys.has(key) then
                        if jtype.array_dimension <= opt_arrays.value then
                                var nit_type = new NitType(jtype.extern_name)
@@ -373,7 +379,7 @@ class JavaModel
                object_type.identifier = ["java","lang","Object"]
 
                # Fill POSet
-               for name, java_class in classes do
+               for name, java_class in all_classes do
                        # Skip anonymous classes
                        if java_class.class_type.is_anonymous then continue
 
@@ -387,19 +393,20 @@ class JavaModel
                        # Remove unavailable super classes
                        for super_type in super_classes.reverse_iterator do
                                # Is the super class available?
-                               if not classes.keys.has(super_type.package_name) then super_classes.remove(super_type)
+                               if not all_classes.keys.has(super_type.java_full_name) then super_classes.remove(super_type)
                        end
 
-                       # If the is no explicit supers, add `java.lang.Object`
-                       if super_classes.is_empty and java_class.class_type != object_type then
+                       # If the is no explicit supers, add `java.lang.Object` (if it is known)
+                       if super_classes.is_empty and java_class.class_type != object_type and
+                          knows_the_object_class then
                                super_classes.add object_type
                        end
 
                        for super_type in super_classes do
                                # Is the super class available?
-                               if not classes.keys.has(super_type.package_name) then continue
+                               if not all_classes.keys.has(super_type.java_full_name) then continue
 
-                               var super_class = classes[super_type.package_name]
+                               var super_class = all_classes[super_type.java_full_name]
                                class_hierarchy.add_edge(java_class, super_class)
                        end
                end