Class.getInterfaces works
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Sun, 23 Nov 2014 21:55:46 +0100
changeset 172786e61729f754
parent 1726 1cf2e7cb9e91
child 1728 1d850aa501bb
Class.getInterfaces works
rt/emul/mini/src/main/java/java/lang/Class.java
rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
rt/vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java
rt/vm/src/test/java/org/apidesign/vm4brwsr/Classes.java
     1.1 --- a/rt/emul/mini/src/main/java/java/lang/Class.java	Sun Nov 23 20:50:19 2014 +0100
     1.2 +++ b/rt/emul/mini/src/main/java/java/lang/Class.java	Sun Nov 23 21:55:46 2014 +0100
     1.3 @@ -1547,6 +1547,7 @@
     1.4       *
     1.5       * @return an array of interfaces implemented by this class.
     1.6       */
     1.7 +    @JavaScriptBody(args = {  }, body = "return this.interfaces();")
     1.8      public native Class<?>[] getInterfaces();
     1.9      
    1.10      /**
     2.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Sun Nov 23 20:50:19 2014 +0100
     2.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Sun Nov 23 21:55:46 2014 +0100
     2.3 @@ -296,6 +296,21 @@
     2.4          append(accessClass("java_lang_Class(true);"));
     2.5          append("\n    CLS.$class.jvmName = '").append(cn).append("';");
     2.6          append("\n    CLS.$class.superclass = sprcls;");
     2.7 +        append("\n    CLS.$class.interfaces = function() { return [");
     2.8 +        {
     2.9 +            boolean first = true;
    2.10 +            for (String intrfc : jc.getSuperInterfaces()) {
    2.11 +                if (!first) {
    2.12 +                    append(",");
    2.13 +                }
    2.14 +                requireReference(intrfc);
    2.15 +                String mangledIface = mangleClassName(intrfc);
    2.16 +                append("\n        ");
    2.17 +                append(accessClass(mangledIface)).append("(false).constructor.$class");
    2.18 +                first = false;
    2.19 +            }
    2.20 +        }
    2.21 +        append("\n    ]; };");
    2.22          append("\n    CLS.$class.access = ").append(jc.getAccessFlags()+";");
    2.23          append("\n    CLS.$class.cnstr = CLS;");
    2.24          byte[] classAnno = jc.findAnnotationData(false);
     3.1 --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java	Sun Nov 23 20:50:19 2014 +0100
     3.2 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java	Sun Nov 23 21:55:46 2014 +0100
     3.3 @@ -246,4 +246,12 @@
     3.4              1.0
     3.5          );
     3.6      }
     3.7 +
     3.8 +    @Test public void nameOfSuperInterface() throws Exception {
     3.9 +        String exp = Classes.superInterface();
    3.10 +        assertExec("Can get name of superinterface?", Classes.class,
    3.11 +            "superInterface__Ljava_lang_String_2",
    3.12 +            exp
    3.13 +        );
    3.14 +    }
    3.15  }
     4.1 --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/Classes.java	Sun Nov 23 20:50:19 2014 +0100
     4.2 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/Classes.java	Sun Nov 23 21:55:46 2014 +0100
     4.3 @@ -260,6 +260,23 @@
     4.4          return obj instanceof Serializable;
     4.5      }
     4.6      
     4.7 +    public static String superInterface() {
     4.8 +        return dumpInterfaces(SuperSerial.class);
     4.9 +    }
    4.10 +
    4.11 +    private static String dumpInterfaces(final Class<?> aClass) {
    4.12 +        final Class<?>[] arr = aClass.getInterfaces();
    4.13 +        StringBuilder sb = new StringBuilder();
    4.14 +        for (Class<?> c : arr) {
    4.15 +            sb.append(c.getName()).append("\n");
    4.16 +        }
    4.17 +        return sb.toString();
    4.18 +    }
    4.19 +
    4.20 +    public static String superInterfaceInst() {
    4.21 +        return dumpInterfaces(new SuperSerial() {}.getClass());
    4.22 +    }
    4.23 +    
    4.24      private static interface SuperSerial extends Serializable {
    4.25      }
    4.26  }