smallrye / jandex

Java Annotation Indexer

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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)

See https://issues.apache.org/jira/browse/CALCITE-4459

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.