scala3
scala3 copied to clipboard
Scaladoc crashes due to cyclic reference when parsing java classfiles
Compiler version
Every Scala 3 version Fails with 3.2.0-RC3
Minimized code
Not yet minimized, can be reproduced using scala-cli
// test.scala
//> using lib "software.amazon.awssdk:s3:2.17.249"
import software.amazon.awssdk.services.s3.model.*
@main def Test =
val request: HeadObjectRequest = HeadObjectRequest
.builder()
.build()
// run using: scala-cli doc test.scala -S 3.nightly
Output (click arrow to expand)
exception caught when loading trait Builder: Cyclic reference involving object HeadObjectRequest
exception caught when loading module class HeadObjectRequest$: Cyclic reference involving object HeadObjectRequest
Cyclic reference involving object HeadObjectRequest while compiling /home/wmazur/projects/virtuslab/dotty/.scala-build/project_9a1f6e0edb_9a1f6e0edb-3a1a426571/classes/main/test$package.tasty, /home/wmazur/projects/virtuslab/dotty/.scala-build/project_9a1f6e0edb_9a1f6e0edb-3a1a426571/classes/main/Test.tasty
dotty.tools.dotc.core.CyclicReference:
at dotty.tools.dotc.core.CyclicReference$.apply(TypeErrors.scala:156)
at dotty.tools.dotc.core.SymDenotations$SymDenotation.completeFrom(SymDenotations.scala:169)
at dotty.tools.dotc.core.Denotations$Denotation.completeInfo$1(Denotations.scala:187)
at dotty.tools.dotc.core.Denotations$Denotation.info(Denotations.scala:189)
at dotty.tools.dotc.core.classfile.ClassfileParser$innerClasses$.getMember$1(ClassfileParser.scala:1088)
at dotty.tools.dotc.core.classfile.ClassfileParser$innerClasses$.classSymbol(ClassfileParser.scala:1109)
at dotty.tools.dotc.core.classfile.ClassfileParser.classNameToSymbol(ClassfileParser.scala:116)
at dotty.tools.dotc.core.classfile.ClassfileParser.sig2type$1(ClassfileParser.scala:425)
at dotty.tools.dotc.core.classfile.ClassfileParser.processTypeArgs$1(ClassfileParser.scala:412)
at dotty.tools.dotc.core.classfile.ClassfileParser.sig2type$1(ClassfileParser.scala:427)
at dotty.tools.dotc.core.classfile.ClassfileParser.dotty$tools$dotc$core$classfile$ClassfileParser$$sigToType(ClassfileParser.scala:551)
at dotty.tools.dotc.core.classfile.ClassfileParser$AttributeCompleter.complete(ClassfileParser.scala:694)
at dotty.tools.dotc.core.classfile.ClassfileParser.parseClass(ClassfileParser.scala:219)
at dotty.tools.dotc.core.classfile.ClassfileParser.$anonfun$1(ClassfileParser.scala:87)
at dotty.tools.dotc.core.classfile.ClassfileParser.run(ClassfileParser.scala:82)
at dotty.tools.dotc.core.ClassfileLoader.load(SymbolLoaders.scala:411)
at dotty.tools.dotc.core.ClassfileLoader.doComplete(SymbolLoaders.scala:406)
at dotty.tools.dotc.core.SymbolLoader.complete(SymbolLoaders.scala:340)
at dotty.tools.dotc.core.SymDenotations$SymDenotation.completeFrom(SymDenotations.scala:171)
at dotty.tools.dotc.core.SymDenotations$SymDenotation.completeOnce(SymDenotations.scala:365)
at dotty.tools.dotc.core.SymDenotations$SymDenotation.unforcedDecls(SymDenotations.scala:389)
at dotty.tools.dotc.core.SymDenotations$ClassDenotation.typeParamsFromDecls(SymDenotations.scala:1796)
at dotty.tools.dotc.core.SymDenotations$ClassDenotation.typeParams(SymDenotations.scala:1809)
at dotty.tools.dotc.core.classfile.ClassfileParser$$anon$2.apply(ClassfileParser.scala:38)
at dotty.tools.dotc.core.classfile.ClassfileParser$$anon$2.apply(ClassfileParser.scala:37)
at scala.collection.immutable.List.mapConserve(List.scala:472)
at dotty.tools.dotc.core.classfile.ClassfileParser$$anon$2.apply(ClassfileParser.scala:42)
at dotty.tools.dotc.core.classfile.ClassfileParser$$anon$2.apply(ClassfileParser.scala:37)
at scala.collection.immutable.List.mapConserve(List.scala:472)
at dotty.tools.dotc.core.classfile.ClassfileParser$$anon$2.apply(ClassfileParser.scala:47)
at dotty.tools.dotc.core.classfile.ClassfileParser$AttributeCompleter.complete(ClassfileParser.scala:720)
at dotty.tools.dotc.core.classfile.ClassfileParser.parseClass(ClassfileParser.scala:219)
at dotty.tools.dotc.core.classfile.ClassfileParser.$anonfun$1(ClassfileParser.scala:87)
at dotty.tools.dotc.core.classfile.ClassfileParser.run(ClassfileParser.scala:82)
at dotty.tools.dotc.core.ClassfileLoader.load(SymbolLoaders.scala:411)
at dotty.tools.dotc.core.ClassfileLoader.doComplete(SymbolLoaders.scala:406)
at dotty.tools.dotc.core.SymbolLoader$$anon$1.doComplete(SymbolLoaders.scala:325)
at dotty.tools.dotc.core.SymbolLoader.complete(SymbolLoaders.scala:340)
at dotty.tools.dotc.core.SymDenotations$SymDenotation.completeFrom(SymDenotations.scala:171)
at dotty.tools.dotc.core.Denotations$Denotation.completeInfo$1(Denotations.scala:187)
at dotty.tools.dotc.core.Denotations$Denotation.info(Denotations.scala:189)
at dotty.tools.dotc.core.SymDenotations$SymDenotation.ensureCompleted(SymDenotations.scala:373)
at dotty.tools.dotc.core.SymDenotations$SymDenotation.flags(SymDenotations.scala:64)
at dotty.tools.dotc.core.SymDenotations$ModuleCompleter.complete(SymDenotations.scala:2696)
at dotty.tools.dotc.core.SymDenotations$SymDenotation.completeFrom(SymDenotations.scala:171)
at dotty.tools.dotc.core.Denotations$Denotation.completeInfo$1(Denotations.scala:187)
at dotty.tools.dotc.core.Denotations$Denotation.info(Denotations.scala:189)
at dotty.tools.dotc.core.SymDenotations$SymDenotation.ensureCompleted(SymDenotations.scala:373)
at dotty.tools.dotc.core.SymDenotations$SymDenotation.flags(SymDenotations.scala:64)
at dotty.tools.dotc.core.SymDenotations$SymDenotation.is(SymDenotations.scala:110)
at dotty.tools.dotc.core.SymDenotations$SymDenotation.isStableMember(SymDenotations.scala:745)
at dotty.tools.dotc.core.Types$Type.widenIfUnstable(Types.scala:1250)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.readLengthTerm$1(TreeUnpickler.scala:1278)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.readTerm(TreeUnpickler.scala:1373)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.readLengthTerm$1(TreeUnpickler.scala:1210)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.readTerm(TreeUnpickler.scala:1373)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.readLengthTerm$1(TreeUnpickler.scala:1274)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.readTerm(TreeUnpickler.scala:1373)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.readLengthTerm$1(TreeUnpickler.scala:1210)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.readTerm(TreeUnpickler.scala:1373)
at dotty.tools.dotc.core.tasty.TreeUnpickler.readRhs$1$$anonfun$1$$anonfun$1(TreeUnpickler.scala:836)
at dotty.tools.dotc.core.tasty.TreeUnpickler$LazyReader.complete(TreeUnpickler.scala:1510)
at dotty.tools.dotc.ast.Trees$WithLazyField.forceIfLazy(Trees.scala:1029)
at dotty.tools.dotc.ast.Trees$WithLazyField.forceIfLazy$(Trees.scala:1024)
at dotty.tools.dotc.ast.Trees$ValOrDefDef.forceIfLazy(Trees.scala:418)
at dotty.tools.dotc.ast.Trees$ValOrDefDef.rhs(Trees.scala:423)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1619)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1664)
at dotty.tools.dotc.CompilationUnit$Force.traverse(CompilationUnit.scala:146)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1663)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1663)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.fold$1(Trees.scala:1535)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.apply(Trees.scala:1537)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1568)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1664)
at dotty.tools.dotc.CompilationUnit$Force.traverse(CompilationUnit.scala:146)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1663)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1663)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1623)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1664)
at dotty.tools.dotc.CompilationUnit$Force.traverse(CompilationUnit.scala:146)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1663)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1663)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.fold$1(Trees.scala:1535)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.apply(Trees.scala:1537)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1630)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1664)
at dotty.tools.dotc.CompilationUnit$Force.traverse(CompilationUnit.scala:146)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1663)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1663)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1627)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1664)
at dotty.tools.dotc.CompilationUnit$Force.traverse(CompilationUnit.scala:146)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1663)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1663)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.fold$1(Trees.scala:1535)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.apply(Trees.scala:1537)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1636)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1541)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1664)
at dotty.tools.dotc.CompilationUnit$Force.traverse(CompilationUnit.scala:146)
at dotty.tools.dotc.CompilationUnit$.apply(CompilationUnit.scala:111)
at dotty.tools.dotc.CompilationUnit$.apply(CompilationUnit.scala:102)
at dotty.tools.dotc.fromtasty.ReadTasty.compilationUnit$1(ReadTasty.scala:42)
at dotty.tools.dotc.fromtasty.ReadTasty.readTASTY(ReadTasty.scala:70)
at dotty.tools.dotc.fromtasty.ReadTasty.runOn$$anonfun$1(ReadTasty.scala:25)
at scala.collection.immutable.List.flatMap(List.scala:293)
at dotty.tools.dotc.fromtasty.ReadTasty.runOn(ReadTasty.scala:25)
at dotty.tools.dotc.Run.runPhases$1$$anonfun$1(Run.scala:234)
at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
at scala.collection.ArrayOps$.foreach$extension(ArrayOps.scala:1328)
at dotty.tools.dotc.Run.runPhases$1(Run.scala:245)
at dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:253)
at dotty.tools.dotc.Run.compileUnits$$anonfun$adapted$1(Run.scala:262)
at dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:68)
at dotty.tools.dotc.Run.compileUnits(Run.scala:262)
at dotty.tools.dotc.Run.compileUnits(Run.scala:192)
at dotty.tools.dotc.fromtasty.TASTYRun.compile(TASTYRun.scala:14)
at dotty.tools.dotc.Driver.doCompile(Driver.scala:35)
at dotty.tools.dotc.Driver.process(Driver.scala:195)
at scala.tasty.inspector.OldTastyInspector.inspectFilesInContext(OldTastyInspector.scala:72)
at scala.tasty.inspector.OldTastyInspector.inspectFilesInContext$(OldTastyInspector.scala:22)
at scala.tasty.inspector.DocTastyInspector.inspectFilesInContext(DocTastyInspector.scala:5)
at dotty.tools.scaladoc.tasty.ScaladocTastyInspector.result(TastyParser.scala:147)
at dotty.tools.scaladoc.ScalaModuleProvider$.mkModule(ScalaModuleProvider.scala:11)
at dotty.tools.scaladoc.Scaladoc$.run(Scaladoc.scala:230)
at dotty.tools.scaladoc.Scaladoc$.run$$anonfun$1(Scaladoc.scala:72)
at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
at scala.Option.map(Option.scala:242)
at dotty.tools.scaladoc.Scaladoc$.run(Scaladoc.scala:76)
at dotty.tools.scaladoc.Main.run(Main.scala:18)
at dotty.tools.scaladoc.Main$.main(Main.scala:24)
at dotty.tools.scaladoc.Main.main(Main.scala)
[error] Scaladoc generation failed (exit code: 1)
Looks like a duplicate of #15288
Testing this is no longer an issue and is closed as of https://github.com/lampepfl/dotty/pull/16882. Since the example here contains an external library and the original PR does have a test illustrating this I'll just go ahead and close this.