Revision: 81
Author: tim.bunce
Date: Mon Aug 10 10:18:12 2009
Log: Cast java::lang::Object to perl Object instead of Any.
Don't set cast_parent if parent is Object.
Don't output needless "is java::lang::Object"
Cleanup related whitespace.
Refactor code that determines what modules to load so same logic is applied to all references types. (I've broken the /Array of/ hack for now as I suspect it should be elsewhere.)
All tests pass for me

http://code.google.com/p/java2perl6/source/detail?r=81

Modified:
 /trunk/lib/Java/Javap/Generator/Std.pm
 /trunk/lib/Java/Javap/TypeCast.pm
 /trunk/t/03_class.t

=======================================
--- /trunk/lib/Java/Javap/Generator/Std.pm      Tue Aug  4 16:18:14 2009
+++ /trunk/lib/Java/Javap/Generator/Std.pm      Mon Aug 10 10:18:12 2009
@@ -7,6 +7,15 @@

 use Data::Dumper::Simple;

+# http://perlcabal.org/syn/S02.html#Built-In_Data_Types
+# XXX having this info here is suboptimal
+# should at least be integrated with TypeCaster
+my $perl_builtin_types = { map { $_=>1 } qw(
+    Any Object
+    Bool Int Num Complex Rat Str Bit Regex Set Block List Seq
+    Scalar Array Hash Buf Routine Module
+) };
+
 sub new {
     my $class   = shift;
     my $debug   = shift;
@@ -80,7 +89,8 @@
     my $ast     = shift;

     my $type_caster = $self->{type_caster};
- $ast->{cast_parent} = defined $ast->{parent} ? $type_caster->cast($ast->{parent}) : ''; + my $class_parent = defined $ast->{parent} ? $type_caster->cast($ast->{parent}) : '';
+    $ast->{cast_parent} = ($class_parent eq 'Object') ? '' : $class_parent;
     foreach my $element (@{$ast->{contents}}) {
         #$element->{name} =~ s/\$/_/g       if defined $element->{name};
             next unless $element->{body_element} eq 'method';
@@ -137,41 +147,46 @@
     my $ast  = shift;
     my $type_caster = shift;

-    my %mod;
- my %ignore = ( Str => 1, Int => 1, Bool => 1, Num => 1, Any => 1, void => 1, qq{$ast->{perl_qualified_name}} => 1);
-
- #print STDERR "class/role='$ast->{perl_qualified_name}' ignore ='", join(', ', keys %ignore), "\n", Dumper($ast);
-
-    my $target;
+    my %perl_types;
     if (defined $ast->{parent}) {
-        $target = $type_caster->cast($ast->{parent});
-        $mod{$target}++ unless $ignore{$target};
+        my $target = $type_caster->cast($ast->{parent});
+        $perl_types{$target}++;
     }

     foreach my $element (@{$ast->{contents}}) {

         next unless $element->{body_element} eq 'method';
-        $target = $type_caster->cast($element->{returns}->{name});
-
-        next if $ignore{$target};
-
- # at the moment rakudo does not support 'Array of' so don't include the - # dependency on the class as it will just return Array at the moment.
-        next if $element->{returns}->{array_text} =~ /Array of/;
-        next if $target =~ /\$/;
-        $mod{$target}++;
-    }
-
-    foreach my $element (@{$ast->{contents}}) {
-        next unless $element->{body_element} eq 'method';
+
+        my $target = $type_caster->cast($element->{returns}->{name});
+        $perl_types{$target}++;
+
         foreach my $arg (@{$element->{args}}) {
-            $target = $type_caster->cast($arg->{name});
-            next if $ignore{$target};
-            $mod{$target}++;
+            my $target = $type_caster->cast($arg->{name});
+            $perl_types{$target}++;
         }
     }
-    return keys %mod;
-}
+ #warn "$ast->{perl_qualified_name} references types: @{[ keys %perl_types ]}\n";
+
+    for my $perl_type (keys %perl_types) {
+
+        delete $perl_types{$perl_type}
+            if $perl_builtin_types->{$perl_type}
+            # our own class name
+            or $perl_type eq $ast->{perl_qualified_name}
+            # private java class
+            or $perl_type =~ /\$/
+            # void java class
+            or $perl_type eq 'void'
+ # at the moment rakudo does not support 'Array of' so don't include the + # dependency on the class as it will just return Array at the moment.
+            #or $element->{returns}->{array_text} =~ /Array of/;
+            ;
+    }
+ #warn "$ast->{perl_qualified_name} needs to load: @{[ keys %perl_types ]}\n";
+
+    return (sort keys %perl_types);
+}
+

 sub _get_template {
     my $self = shift;
@@ -224,7 +239,7 @@
 use [% package -%];
 [% END %]

-class [% ast.perl_qualified_name %] [% ast.cast_parent == '' ? '' : 'is' %] [% ast.cast_parent %] { +class [% ast.perl_qualified_name %] [%- ast.cast_parent == '' ? '' : 'is' %][% ast.cast_parent -%] {
 [% FOREACH element IN ast.method_list %]
[% ast.methods.${ element.name } > 1 ? 'multi ' : '' %]method [% element.name %](
 [% arg_counter = 0 %]
=======================================
--- /trunk/lib/Java/Javap/TypeCast.pm   Tue Aug  4 16:26:20 2009
+++ /trunk/lib/Java/Javap/TypeCast.pm   Mon Aug 10 10:18:12 2009
@@ -11,7 +11,7 @@
     float              => 'Num',
     double             => 'Num',
     boolean            => 'Bool',
-    'java.lang.Object' => 'Any',
+    'java.lang.Object' => 'Object',
     'java.lang.String' => 'Str',
     'java.lang.Number'  => 'Num',
     'java.lang.Class'  => 'Any',
=======================================
--- /trunk/t/03_class.t Mon Aug 10 09:47:21 2009
+++ /trunk/t/03_class.t Mon Aug 10 10:18:12 2009
@@ -158,9 +158,7 @@
 #use Data::Dumper::Simple;
 #diag($perl_6);
 my @correct_perl_6 = split /\n/, <<'EO_Correct_Perl_6';
-use java::lang::Object;
-
-class ClassTest  is java::lang::Object {
+class ClassTest {
     multi method getGreet(
         Int $v1,
      --> Str    #  Str
@@ -199,9 +197,7 @@
   my @perl_6 = split /\n/, $perl_6;
 #  diag("got: $perl_6");
   my @correct_perl_6 = split /\n/, <<'EO_Correct_Perl_6_a';
-use java::lang::Object;
-
-class dupMethodTest  is java::lang::Object {
+class dupMethodTest {
     multi method dupMethod(
         Str @v1,
      --> Str    #  Str

Reply via email to