Skip to content

Commit

Permalink
handle more Kernel methods in Java packages "right" (including name)
Browse files Browse the repository at this point in the history
- `pkg.name` has been working since 1.7.22/9.0.1.0 (jruby#2468)
- handling :object_id as it is quite surprising to not have
- can handle :throw/:catch since they're not valid package names
- commented-out methods that would be good to have as well
  • Loading branch information
kares committed Mar 22, 2016
1 parent f15a8ac commit 92f513c
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 21 deletions.
42 changes: 27 additions & 15 deletions core/src/main/java/org/jruby/javasupport/JavaPackage.java
Expand Up @@ -174,7 +174,7 @@ public IRubyObject method_missing(ThreadContext context, final IRubyObject[] arg
}
return method_missing(context, args[0]);
}

@Override
@SuppressWarnings("unchecked")
public Object toJava(final Class target) {
Expand Down Expand Up @@ -217,7 +217,7 @@ public RubyModule defineModuleUnder(RubyModule pkg, String name) {
* discovery.
*
* Because this is in the hierarchy, it does mean any methods that are not Java
* packages or otherwise defined on the JavaPackageModuleTemplate module will
* packages or otherwise defined on the <code>Java::JavaPackage</code> will
* be inaccessible.
*/
static final class BlankSlateWrapper extends IncludedModuleWrapper {
Expand All @@ -230,23 +230,28 @@ static final class BlankSlateWrapper extends IncludedModuleWrapper {
protected DynamicMethod searchMethodCommon(final String name) {
// this module is special and only searches itself;

// TODO implement a switch to allow for 'more-aligned' behavior

// do not go to superclasses except for special methods :
switch (name) {
// TODO implement a switch to allow for 'more-aligned' behavior
case "__constants__" :
case "class" : case "singleton_class" :
case "object_id" : case "name" :
// these are handled already at the JavaPackage.class :
// case "const_get" : case "const_missing" : case "method_missing" :
case "const_set" :
case "inspect" : case "to_s" :
// these are handled bellow in switch (name.charAt(0))
// case "__method__" : case "__send__" : case "__id__" :

//case "require" : case "load" :
case "throw" : case "catch" : //case "fail" : case "raise" :
//case "exit" : case "at_exit" :
return superClass.searchMethodInner(name);

case "__constants__" : // @Deprecated compatibility with 1.7
return superClass.searchMethodInner("constants");
case "__methods__" :
case "__methods__" : // @Deprecated compatibility with 1.7
return superClass.searchMethodInner("methods");

case "class" :
case "object_id" :
case "initialize_copy" :
case "singleton_method_added" :
case "const_missing" :
case "method_missing" :
case "inspect" :
case "to_s" :
return superClass.searchMethodInner(name);
}

final int last = name.length() - 1;
Expand All @@ -265,6 +270,13 @@ protected DynamicMethod searchMethodCommon(final String name) {
}
}

//if ( last >= 5 && (
// name.indexOf("method") >= 0 || // method, instance_methods, singleton_methods ...
// name.indexOf("variable") >= 0 || // class_variables, class_variable_get, instance_variables ...
// name.indexOf("constant") >= 0 ) ) { // constants, :public_constant, :private_constant
// return superClass.searchMethodInner(name);
//}

return NullMethod.INSTANCE;
}

Expand Down
27 changes: 21 additions & 6 deletions spec/java_integration/packages/name_spec.rb
Expand Up @@ -7,19 +7,34 @@

it 'have name' do
expect( Java::JavaLang::Integer.name ).to eql 'Java::JavaLang::Integer'
#expect( Java::JavaLang.name ).to eql 'Java::JavaLang'
#expect( Java::Java.name ).to eql 'Java::Java'
#expect( Java::Javax.name ).to eql 'Java::Javax'
expect( Java::JavaLang.name ).to eql 'Java::JavaLang'
expect( Java::Java.name ).to eql 'Java::Java'
expect( Java::Javax.name ).to eql 'Java::Javax'
expect( Java.name ).to eql 'Java'
#expect( Java::java.util.name ).to eql 'Java::JavaUtil'
#expect( org.xml.name ).to eql 'Java:OrgXml'
#expect( org.xml.sax.name ).to eql 'Java:OrgXmlSax'
expect( Java::java.util.name ).to eql 'Java::JavaUtil'
expect( org.xml.name ).to eql 'Java::OrgXml'
expect( org.xml.sax.name ).to eql 'Java::OrgXmlSax'
#expect( Java::Default.name ).to eql ''
# TODO avoid Default package in favor of Java :
#expect( Java::DefaultPackageClass.name ).to eql 'Java::DefaultPackageClass'
expect( Java::DefaultPackageClass.name ).to eql 'Java::Default::DefaultPackageClass'
end

it 'handles Kernel methods' do
expect( Java::JavaLang::Integer.to_s ).to eql 'Java::JavaLang::Integer'
expect( Java::JavaLang.to_s ).to eql 'Java::JavaLang'
expect( Java::Java.inspect ).to eql 'Java::Java'
expect( Java::Javax.to_s ).to eql 'Java::Javax'
expect( Java.inspect ).to eql 'Java'
expect( Java::java.util.to_s ).to eql 'Java::JavaUtil'
expect( org.xml.object_id ).to be_a Fixnum
expect( org.xml.sax.singleton_class ).to be_a Class
expect( org.xml == org.xml.sax ).to be false
expect( org.xml.eql? Java::org::xml ).to be true
expect( Java::OrgXmlSax.equal?org.xml.sax ).to be true
#expect( Java::OrgXmlSax === org.xml.sax ).to be true
end

it 'have package name' do
expect( Java::JavaLang::Integer.respond_to? :package_name ).to be false
expect( Java::JavaLang.respond_to? :package_name ).to be true
Expand Down

0 comments on commit 92f513c

Please sign in to comment.