diff --git a/build.mill b/build.mill index 0d30e64..11e25fc 100644 --- a/build.mill +++ b/build.mill @@ -19,7 +19,7 @@ import mill.scalalib.publish.{Developer, License, PomSettings, VersionControl} import mill.util.{Tasks, VcsVersion} object Versions { - def scala = "3.3.8" + def scala = "3.9.0" def graalVmVersion = "22.3.1" def coursier = "2.1.25-M26" def osLib = "0.11.8" @@ -54,10 +54,8 @@ trait JavaMainClassNativeImage extends NativeImage { } trait JavaClassNameModule extends ScalaModule with ScalafixModule { - private val futureLazyValOpts = Seq("-Yfuture-lazy-vals", "-java-output-version:17") - override def scalacOptions: T[Seq[String]] = - super.scalacOptions() ++ Seq("-Wunused:all", "-deprecation", "-Werror") ++ futureLazyValOpts + super.scalacOptions() ++ Seq("-Wunused:all", "-deprecation", "-Werror") override def scalaVersion: T[String] = Versions.scala } diff --git a/java-class-name/src/scala/cli/javaclassname/JavaParser.scala b/java-class-name/src/scala/cli/javaclassname/JavaParser.scala index f9efd55..0ac62e4 100644 --- a/java-class-name/src/scala/cli/javaclassname/JavaParser.scala +++ b/java-class-name/src/scala/cli/javaclassname/JavaParser.scala @@ -4,6 +4,7 @@ import dotty.tools.dotc.ast.untpd.ModuleDef import dotty.tools.dotc.ast.{Trees, untpd} import dotty.tools.dotc.core.Contexts.{Context, ContextBase} import dotty.tools.dotc.core.Flags +import dotty.tools.dotc.core.StdNames.tpnme import dotty.tools.dotc.parsing.JavaParsers.OutlineJavaParser import dotty.tools.dotc.util.SourceFile import dotty.tools.io.VirtualFile @@ -11,11 +12,27 @@ import dotty.tools.io.VirtualFile import scala.io.Codec object JavaParser { + + /** The stock parser emits typed trees for `java.lang.Object` and `Unit`, which require the + * compiler definitions to be initialized (and thus the Scala library on the classpath). We only + * need names and modifiers, so we fall back to untyped trees and skip the dummy constructors. + */ + private class UntypedOutlineJavaParser(source: SourceFile)(using Context) + extends OutlineJavaParser(source) { + override def ObjectTpt(): untpd.Tree = javaLangDot(tpnme.Object) + override def makeTemplate( + parents: List[untpd.Tree], + stats: List[untpd.Tree], + tparams: List[untpd.TypeDef], + needsDummyConstr: Boolean + ): untpd.Template = super.makeTemplate(parents, stats, tparams, needsDummyConstr = false) + } + private def parseOutline(byteContent: Array[Byte]): untpd.Tree = { given Context = ContextBase().initialCtx.fresh val virtualFile = VirtualFile("placeholder.java", byteContent) val sourceFile = SourceFile(virtualFile, Codec.UTF8) - val outlineParser = OutlineJavaParser(sourceFile) + val outlineParser = UntypedOutlineJavaParser(sourceFile) outlineParser.parse() }