scala / scala3

The Scala 3 compiler, also known as Dotty.
https://dotty.epfl.ch
Apache License 2.0
5.81k stars 1.05k forks source link

Scaladoc crashes due to cyclic reference when parsing java classfiles #15843

Closed WojciechMazur closed 1 year ago

WojciechMazur commented 2 years ago

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)

```scala 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) ```
griggt commented 2 years ago

Looks like a duplicate of #15288

ckipp01 commented 1 year ago

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.