Skip to content

ClassFormatError when extending Kotlin interface with interior enum class #13110

Open
@SekoiaTree

Description

@SekoiaTree

Title is not 100% accurate, but I'm not sure exactly what is broken with the interface.

Reproduction steps

The following class launches a ClassFormatError whenever loaded:

import org.intellij.markdown.parser.LookaheadText
import org.intellij.markdown.parser.constraints.MarkdownConstraints
import org.intellij.markdown.parser.markerblocks.MarkerBlock

object Main {
  def main(args: Array[String]): Unit = {
    println(new MyClass)
  }
}

class MyClass extends org.intellij.markdown.parser.markerblocks.MarkerBlock {
  override def acceptAction(closingAction: MarkerBlock.ClosingAction): Boolean = ???
  override def allowsSubBlocks(): Boolean = ???
  override def getBlockConstraints: MarkdownConstraints = ???
  override def getNextInterestingOffset(position: LookaheadText#Position): Int = ???
  override def isInterestingOffset(position: LookaheadText#Position): Boolean = ???
  override def processToken(position: LookaheadText#Position, markdownConstraints: MarkdownConstraints): MarkerBlock.ProcessingResult = ???
}

The class is https://github.com/JetBrains/markdown/blob/master/src/commonMain/kotlin/org/intellij/markdown/parser/markerblocks/MarkerBlock.kt, and the following build.sbt imports it:

ThisBuild / version := "0.1.0-SNAPSHOT"

ThisBuild / scalaVersion := "2.13.16"
//ThisBuild / scalaVersion := "3.7.1"

lazy val root = (project in file("."))
  .settings(
    name := "untitled358",
    libraryDependencies ++= Seq(
      "org.jetbrains" % "markdown-jvm" % "0.7.3"
    )
  )

Here is this reproduction project as a zip: InnerEnumBug.zip

And the error:

Exception in thread "sbt-bg-threads-1" java.lang.ClassFormatError: Illegal class modifiers in class MyClass: 0x4419
	at java.base/java.lang.ClassLoader.defineClass1(Native Method)
	at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1027)
	at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
	at java.base/java.net.URLClassLoader.defineClass(URLClassLoader.java:524)
	at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:427)
	at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:421)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:714)
	at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:420)
	at sbt.internal.ManagedClassLoader.findClass(ManagedClassLoader.java:103)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:593)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
	at Main$.main(Main.scala:8)
	at Main.main(Main.scala)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at sbt.Run.invokeMain(Run.scala:135)
	at sbt.Run.execute$1(Run.scala:85)
	at sbt.Run.$anonfun$runWithLoader$5(Run.scala:112)
	at sbt.Run$.executeSuccess(Run.scala:178)
	at sbt.Run.runWithLoader(Run.scala:112)
	at sbt.Defaults$.$anonfun$bgRunTask$6(Defaults.scala:2091)
	at sbt.Defaults$.$anonfun$termWrapper$2(Defaults.scala:2030)
	at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
	at scala.util.Try$.apply(Try.scala:213)
	at sbt.internal.BackgroundThreadPool$BackgroundRunnable.run(DefaultBackgroundJobService.scala:378)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
	at java.base/java.lang.Thread.run(Thread.java:1583)

Java can implement the interface fine, so it's some kind of interaction between Kotlin and Scala here. Best theory I have is that acceptAction(action: ClosingAction): Boolean breaks it somehow, because ClosingAction is a bit of a strange enum, with anonymous class values.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions