Has anyone seen this weirdness before? (Javadoc ge...
# announcements
j
Has anyone seen this weirdness before? (Javadoc generation for JDK 9)
Copy code
:junit-jupiter-api:javadocPicked up _JAVA_OPTIONS: -Xmx500m
javadoc: error - An exception occurred while building a component: TagInfo
	(com.sun.tools.javac.code.ClassFinder$BadClassFile: bad class file: /home/travis/build/junit-team/junit5/junit-jupiter-api/build/classes/kotlin/main/org/junit/jupiter/api/AssertionsKt$sam$Supplier$i$44378ebd.class
  undeclared type variable: T
  Please remove or make sure it appears in the correct subdirectory of the classpath.)
Please file a bug against the javadoc tool via the Java bug reporting page
(<http://bugreport.java.com>) after checking the Bug Database (<http://bugs.java.com>)
for duplicates. Include error messages and the following diagnostic in your report. Thank you.
com.sun.tools.javac.code.ClassFinder$BadClassFile: bad class file: /home/travis/build/junit-team/junit5/junit-jupiter-api/build/classes/kotlin/main/org/junit/jupiter/api/AssertionsKt$sam$Supplier$i$44378ebd.class
  undeclared type variable: T
  Please remove or make sure it appears in the correct subdirectory of the classpath.
	at jdk.compiler/com.sun.tools.javac.jvm.ClassReader.badClassFile(ClassReader.java:278)
	at jdk.compiler/com.sun.tools.javac.jvm.ClassReader.findTypeVar(ClassReader.java:963)
	at jdk.compiler/com.sun.tools.javac.jvm.ClassReader.sigToType(ClassReader.java:670)
	at jdk.compiler/com.sun.tools.javac.jvm.ClassReader.sigToType(ClassReader.java:732)
	at jdk.compiler/com.sun.tools.javac.jvm.ClassReader.sigToType(ClassReader.java:656)
	at jdk.compiler/com.sun.tools.javac.jvm.ClassReader.readType(ClassReader.java:499)
	at jdk.compiler/com.sun.tools.javac.jvm.ClassReader$11.read(ClassReader.java:1193)
	at jdk.compiler/com.sun.tools.javac.jvm.ClassReader.readAttrs(ClassReader.java:1537)
	at jdk.compiler/com.sun.tools.javac.jvm.ClassReader.readMemberAttrs(ClassReader.java:1527)
	at jdk.compiler/com.sun.tools.javac.jvm.ClassReader.readMethod(ClassReader.java:2391)
	at jdk.compiler/com.sun.tools.javac.jvm.ClassReader.readClass(ClassReader.java:2641)
	at jdk.compiler/com.sun.tools.javac.jvm.ClassReader.readClassBuffer(ClassReader.java:2706)
	at jdk.compiler/com.sun.tools.javac.jvm.ClassReader.readClassFile(ClassReader.java:2719)
	at jdk.compiler/com.sun.tools.javac.code.ClassFinder.fillIn(ClassFinder.java:348)
	at jdk.compiler/com.sun.tools.javac.code.ClassFinder.complete(ClassFinder.java:285)
	at jdk.compiler/com.sun.tools.javac.code.Symbol.complete(Symbol.java:633)
	at jdk.compiler/com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:1314)
	at jdk.compiler/com.sun.tools.javac.code.Symbol$ClassSymbol.flags(Symbol.java:1248)
https://travis-ci.org/junit-team/junit5/jobs/270479723#L1179
I'm going to guess that the problem is stemming from the
T
in this code block. Is this correct bytecode?
Copy code
// access flags 0x1A
  // signature <T:Ljava/lang/Throwable;>(Ljava/lang/String;Lkotlin/jvm/functions/Function0<Lkotlin/Unit;>;)TT;
  // declaration: T assertThrows<T extends java.lang.Throwable>(java.lang.String, kotlin.jvm.functions.Function0<kotlin.Unit>)
  private final static assertThrows(Ljava/lang/String;Lkotlin/jvm/functions/Function0;)Ljava/lang/Throwable;
  @Lorg/junit/platform/commons/meta/API;(value=Lorg/junit/platform/commons/meta/API$Usage;.Experimental)
   L0
    LINENUMBER 84 L0
    NEW org/junit/jupiter/api/AssertionsKt$assertThrows$1
    DUP
    ALOAD 0
    INVOKESPECIAL org/junit/jupiter/api/AssertionsKt$assertThrows$1.<init> (Ljava/lang/String;)V
    CHECKCAST kotlin/jvm/functions/Function0
    ASTORE 3
   L1
    LINENUMBER 101 L1
    ICONST_4
    LDC "T"
    INVOKESTATIC kotlin/jvm/internal/Intrinsics.reifiedOperationMarker (ILjava/lang/String;)V
    LDC Ljava/lang/Throwable;.class
    ALOAD 1
    DUP
    IFNULL L2
    ASTORE 4
    NEW org/junit/jupiter/api/AssertionsKt$sam$Executable$i$a4d99158
    DUP
    ALOAD 4
    INVOKESPECIAL org/junit/jupiter/api/AssertionsKt$sam$Executable$i$a4d99158.<init> (Lkotlin/jvm/functions/Function0;)V
   L2
   FRAME FULL [java/lang/String kotlin/jvm/functions/Function0 T kotlin/jvm/functions/Function0] [java/lang/Class java/lang/Object]
    CHECKCAST org/junit/jupiter/api/function/Executable
    ALOAD 3
    ASTORE 4
    NEW org/junit/jupiter/api/AssertionsKt$sam$Supplier$i$a7e17ae9
    DUP
    ALOAD 4
    INVOKESPECIAL org/junit/jupiter/api/AssertionsKt$sam$Supplier$i$a7e17ae9.<init> (Lkotlin/jvm/functions/Function0;)V
    CHECKCAST java/util/function/Supplier
    INVOKESTATIC org/junit/jupiter/api/Assertions.assertThrows (Ljava/lang/Class;Lorg/junit/jupiter/api/function/Executable;Ljava/util/function/Supplier;)Ljava/lang/Throwable;
    DUP
    LDC "Assertions.assertThrows(\u2026able), Supplier(message))"
    INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkExpressionValueIsNotNull (Ljava/lang/Object;Ljava/lang/String;)V
   L3
    LINENUMBER 84 L3
    ARETURN
   L4
    LOCALVARIABLE message$iv Lkotlin/jvm/functions/Function0; L1 L3 3
    LOCALVARIABLE $i$f$assertThrows I L1 L3 5
    LOCALVARIABLE message Ljava/lang/String; L0 L4 0
    LOCALVARIABLE executable Lkotlin/jvm/functions/Function0; L0 L4 1
    LOCALVARIABLE $i$f$assertThrows I L0 L4 2
    MAXSTACK = 5
    MAXLOCALS = 6
In particular this line here:
Copy code
FRAME FULL [java/lang/String kotlin/jvm/functions/Function0 T kotlin/jvm/functions/Function0] [java/lang/Class java/lang/Object]
I guess, I'm trying to figure out if this is a Kotlin Compiler Problem or a JDK 9 problem.
This looks like a Kotlin compiler problem. I have a method above that has almost the same signature that generates the correct bytecode.
So I opened an issue with Oracle. I'll also open an issue with Kotlin.
So the minimalist example that fails is this:
Copy code
import java.util.function.Supplier

inline fun testSupplier(noinline message: () -> String) {
    Supplier(message)
}