2.0.3...2.2.2: IllegalArgumentException: Not an array type for method like void method(@Nullable Object[])
vlsi opened this issue · comments
Sample:
public interface EqualityComparer<T> {
boolean equal(T v1, T v2);
int hashCode(T t);
}
private static class ArrayEqualityComparer
implements EqualityComparer<@Nullable Object[]> {
@Override public boolean equal(@Nullable Object[] v1, @Nullable Object[] v2) {
return Arrays.deepEquals(v1, v2);
}
@Override public int hashCode(@Nullable Object[] t) {
return Arrays.deepHashCode(t);
}
}
Error (in jandex 2.0.3.Final and 2.2.2.Final):
Caused by: java.lang.IllegalArgumentException: Not an array type!
at org.jboss.jandex.Type.asArrayType(Type.java:254)
at org.jboss.jandex.Indexer.resolveTypePath(Indexer.java:621)
at org.jboss.jandex.Indexer.resolveTypeAnnotation(Indexer.java:593)
at org.jboss.jandex.Indexer.resolveTypeAnnotations(Indexer.java:478)
at org.jboss.jandex.Indexer.index(Indexer.java:1458)
at com.github.vlsi.jandex.JandexWork.execute(JandexWork.kt:52)
Smaller case:
public interface EqualityComparer<T> {
boolean equal(T v1, T v2);
int hashCode(T t);
}
private static class ArrayEqualityComparer
implements EqualityComparer<Object[]> {
@Override public boolean equal(Object[] v1, Object[] v2) {
return Arrays.deepEquals(v1, v2);
}
@Override public int hashCode(@Nullable Object[] t) {
return Arrays.deepHashCode(t);
}
}
javac 11, javap:
public int hashCode(java.lang.Object[]);
descriptor: ([Ljava/lang/Object;)I
flags: (0x0001) ACC_PUBLIC
Code:
stack=1, locals=2, args_size=2
0: aload_1
1: invokestatic #4 // Method java/util/Arrays.deepHashCode:([Ljava/lang/Object;)I
4: ireturn
LineNumberTable:
line 497: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lorg/apache/calcite/linq4j/function/Functions$ArrayEqualityComparer;
0 5 1 t [Ljava/lang/Object;
RuntimeVisibleTypeAnnotations:
0: #29(): METHOD_FORMAL_PARAMETER, param_index=0, location=[ARRAY]
org.checkerframework.checker.nullness.qual.Nullable
public int hashCode(java.lang.Object);
descriptor: (Ljava/lang/Object;)I
flags: (0x1041) ACC_PUBLIC, ACC_BRIDGE, ACC_SYNTHETIC
Code:
stack=2, locals=2, args_size=2
0: aload_0
1: aload_1
2: checkcast #5 // class "[Ljava/lang/Object;"
5: invokevirtual #6 // Method hashCode:([Ljava/lang/Object;)I
8: ireturn
LineNumberTable:
line 490: 0
LocalVariableTable:
Start Length Slot Name Signature
0 9 0 this Lorg/apache/calcite/linq4j/function/Functions$ArrayEqualityComparer;
RuntimeVisibleTypeAnnotations:
0: #29(): METHOD_FORMAL_PARAMETER, param_index=0, location=[ARRAY]
org.checkerframework.checker.nullness.qual.Nullable
I guess the issue is caused by ACC_BRIDGE, ACC_SYNTHETIC
method.
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=6695379 Copy method annotations and parameter annotations to synthetic bridge methods
might be relevant.
Thanks for the report. I'll need to research various compiler outputs. It looks like the generated bridge is referring to a type path that is not valid with this signature. This will probably need to be gracefully ignored.
What do you think if a GitHub Action was added that tried to parse Apache Calcite codebase with the current jandex? Calcite has a significant amount of type annotations added in apache/calcite#2268
It won't make debug easier, however, it might help to prevent regressions.
@vlsi i think thats a great idea. I would be happy to regression test with calcite.