Skip to content

Commit

Permalink
Merge: Jwrapper: Fix bug with nested classes
Browse files Browse the repository at this point in the history
Fixes the nested classes bug in jwrapper.

Splits JNI full name and java full name.
Generated comments use JNI full name.

Pull-Request: #1841
Reviewed-by: Alexis Laferrière <alexis.laf@xymus.net>
  • Loading branch information
privat committed Nov 23, 2015
2 parents b4aab8c + 821c7c1 commit f950b90
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 21 deletions.
20 changes: 10 additions & 10 deletions contrib/jwrapper/src/code_generator.nit
Expand Up @@ -200,14 +200,14 @@ class CodeGenerator
end

if effective_supers == 0 then
if java_class.class_type.package_name == "java.lang.Object" or
if java_class.class_type.java_full_name == "java.lang.Object" or
not model.knows_the_object_class then
supers.add "super JavaObject"
else supers.add "super Java_lang_Object"
end

file_out.write """
# Java class: {{{java_type}}}
# Java class: {{{java_type.extern_equivalent}}}
extern class {{{nit_type}}} in "Java" `{ {{{java_type.extern_equivalent}}} `}
{{{supers.join("\n\t")}}}
Expand Down Expand Up @@ -267,7 +267,7 @@ extern class {{{nit_type}}} in "Java" `{ {{{java_type.extern_equivalent}}} `}
# Build the call in Java
var java_call
if is_static == true then
java_call = java_class.class_type.package_name
java_call = java_class.class_type.java_full_name
else java_call = "self"
java_call += ".{java_method_id}({java_args.join(", ")})"

Expand All @@ -280,7 +280,7 @@ extern class {{{nit_type}}} in "Java" `{ {{{java_type.extern_equivalent}}} `}

# Write
file_out.write """
{{{t}}}# Java implementation: {{{java_return_type}}} {{{java_class}}}.{{{java_method_id}}}({{{java_params.join(", ")}}})
{{{t}}}# Java implementation: {{{java_return_type}}} {{{java_class.class_type.extern_equivalent}}}.{{{java_method_id}}}({{{java_params.join(", ")}}})
{{{ct}}}{{{nit_signature.join}}} in "Java" `{
{{{ct}}} {{{java_call}}};
{{{ct}}}`}
Expand All @@ -305,7 +305,7 @@ extern class {{{nit_type}}} in "Java" `{ {{{java_type.extern_equivalent}}} `}

var recv
if attribute.is_static then
recv = java_class.class_type.package_name
recv = java_class.class_type.java_full_name
else recv = "self"

# Tabulation
Expand All @@ -314,12 +314,12 @@ extern class {{{nit_type}}} in "Java" `{ {{{java_type.extern_equivalent}}} `}
var ct = c+t

file_out.write """
{{{t}}}# Java getter: {{{java_class}}}.{{{java_id}}}
{{{t}}}# Java getter: {{{java_class.class_type.extern_equivalent}}}.{{{java_id}}}
{{{ct}}}fun {{{nit_id}}}: {{{nit_type}}} in "Java" `{
{{{ct}}} return {{{recv}}}.{{{java_id}}};
{{{ct}}}`}
{{{t}}}# Java setter: {{{java_class}}}.{{{java_id}}}
{{{t}}}# Java setter: {{{java_class.class_type.extern_equivalent}}}.{{{java_id}}}
{{{ct}}}fun {{{nit_id}}}=(value: {{{nit_type}}}) in "Java" `{
{{{ct}}} {{{recv}}}.{{{java_id}}} = value;
{{{ct}}}`}
Expand Down Expand Up @@ -355,9 +355,9 @@ extern class {{{nit_type}}} in "Java" `{ {{{java_type.extern_equivalent}}} `}
end

file_out.write """
# Java constructor: {{{java_class}}}
# Java constructor: {{{java_class.class_type.extern_equivalent}}}
{{{c}}} new {{{name}}}{{{nit_params_s}}} in "Java" `{
{{{c}}} return new {{{java_class.class_type.package_name}}}({{{java_params_s}}});
{{{c}}} return new {{{java_class.class_type.java_full_name}}}({{{java_params_s}}});
{{{c}}} `}
"""
Expand All @@ -373,7 +373,7 @@ extern class {{{nit_type}}} in "Java" `{ {{{java_type.extern_equivalent}}} `}
var nit_type = model.java_to_nit_type(java_type)

file_out.write """
# Java primitive array: {{{java_type}}}
# Java primitive array: {{{java_type.extern_equivalent}}}
extern class {{{nit_type}}} in "Java" `{ {{{java_type.extern_equivalent}}} `}
super AbstractJavaArray[{{{base_nit_type}}}]
Expand Down
25 changes: 14 additions & 11 deletions contrib/jwrapper/src/model.nit
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -293,7 +296,7 @@ class JavaModel
# 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

Expand Down Expand Up @@ -325,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)
Expand Down Expand Up @@ -390,7 +393,7 @@ class JavaModel
# Remove unavailable super classes
for super_type in super_classes.reverse_iterator do
# Is the super class available?
if not all_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 it is known)
Expand All @@ -401,9 +404,9 @@ class JavaModel

for super_type in super_classes do
# Is the super class available?
if not all_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 = all_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
Expand Down

0 comments on commit f950b90

Please sign in to comment.