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 fails to generate documentation due to parsing problems/assertion errors #16180

Closed jgongo closed 1 year ago

jgongo commented 1 year ago

Scaladoc fails just by creating some trait which extends spray.json.DefaultJsonProtocol. I have included a build.sbt file with the needed dependency defined. I'm using CrossVersion because this comes from a project which is using Akka HTTP which hasn't released yet a Scala 3.x version (could this be related with the problem?)

Similar reports exist at #15927 and #16034. I have anyway created a new bug report because I'm not sure the root cause is the same as in those cases.

Compiler version

sbt:docs-testcase> print scalaVersion
3.2.0

Minimized code

build.sbt ```scala ThisBuild / scalaVersion := "3.2.0" lazy val root = (project in file(".")).settings( name := "docs-testcase", // Dependencies libraryDependencies ++= { val akkaHttpVersion = "10.2.9" Seq( "com.typesafe.akka" %% "akka-http-spray-json" % "10.2.9", ).map(_.cross(CrossVersion.for3Use2_13)) } ) ```
project/build.properties ``` sbt.version = 1.7.1 ```
src/main/scala/SomeJsonProtocol.scala ```scala import spray.json.DefaultJsonProtocol trait SomeJsonProtocol extends DefaultJsonProtocol ```

Output

sbt output ```console doc-testcase % sbt [info] welcome to sbt 1.7.1 (Eclipse Adoptium Java 17.0.2) [info] loading global plugins from /Users/[redacted]/.sbt/1.0/plugins [info] loading project definition from /Users/[redacted]/doc-testcase/project [info] loading settings for project root from build.sbt ... [info] set current project to docs-testcase (in build file:/Users/[redacted]/doc-testcase/) [info] sbt server started at local:///Users/[redacted]/.sbt/1.0/server/d6434a60858d350de2b8/sock [info] started sbt server sbt:docs-testcase> doc [info] compiling 1 Scala source to /Users/[redacted]/doc-testcase/target/scala-3.2.0/classes ... [info] Main Scala API documentation to /Users/[redacted]/doc-testcase/target/scala-3.2.0/api... Problem parsing src/main/scala/SomeJsonProtocol.scala:<0..89>, documentation may not be generated. java.lang.AssertionError: assertion failed | => rat scala.runtime.Scala3RunTime$.assertFailed(Scala3RunTime.scala:11) at dotty.tools.dotc.util.Spans$Span$.start$extension(Spans.scala:45) at dotty.tools.dotc.util.SourcePosition.start(SourcePosition.scala:52) at scala.quoted.runtime.impl.QuotesImpl$reflect$PositionMethods$.start(QuotesImpl.scala:2813) at scala.quoted.runtime.impl.QuotesImpl$reflect$PositionMethods$.start(QuotesImpl.scala:2813) at dotty.tools.scaladoc.tasty.ClassLikeSupport.getParentsAsTreeSymbolTuples$$anonfun$1(ClassLikeSupport.scala:260) at scala.collection.Iterator$$anon$6.hasNext(Iterator.scala:472) at scala.collection.Iterator$$anon$9.hasNext(Iterator.scala:576) at scala.collection.immutable.List.prependedAll(List.scala:152) at scala.collection.immutable.List$.from(List.scala:684) at scala.collection.immutable.List$.from(List.scala:681) at scala.collection.IterableOps$WithFilter.map(Iterable.scala:891) at dotty.tools.scaladoc.tasty.ClassLikeSupport.getParentsAsTreeSymbolTuples(ClassLikeSupport.scala:264) at dotty.tools.scaladoc.tasty.ClassLikeSupport.getParentsAsTreeSymbolTuples$(ClassLikeSupport.scala:15) at dotty.tools.scaladoc.tasty.TastyParser.getParentsAsTreeSymbolTuples(TastyParser.scala:169) at dotty.tools.scaladoc.tasty.ClassLikeSupport.getParentsAsLinkToTypes(ClassLikeSupport.scala:253) at dotty.tools.scaladoc.tasty.ClassLikeSupport.getParentsAsLinkToTypes$(ClassLikeSupport.scala:15) at dotty.tools.scaladoc.tasty.TastyParser.getParentsAsLinkToTypes(TastyParser.scala:169) at dotty.tools.scaladoc.tasty.ClassLikeSupport.mkClass(ClassLikeSupport.scala:106) at dotty.tools.scaladoc.tasty.ClassLikeSupport.mkClass$(ClassLikeSupport.scala:15) at dotty.tools.scaladoc.tasty.TastyParser.mkClass(TastyParser.scala:169) at dotty.tools.scaladoc.tasty.ClassLikeSupport.parseClasslike(ClassLikeSupport.scala:290) at dotty.tools.scaladoc.tasty.ClassLikeSupport.parseClasslike$(ClassLikeSupport.scala:15) at dotty.tools.scaladoc.tasty.TastyParser.parseClasslike(TastyParser.scala:169) at dotty.tools.scaladoc.tasty.ClassLikeSupport.parseInheritedMember$$anonfun$1(ClassLikeSupport.scala:190) at dotty.tools.scaladoc.tasty.TastyParser.processTreeOpt(TastyParser.scala:204) at dotty.tools.scaladoc.tasty.ClassLikeSupport.parseInheritedMember(ClassLikeSupport.scala:202) at dotty.tools.scaladoc.tasty.ClassLikeSupport.extractMembers$$anonfun$2(ClassLikeSupport.scala:221) at scala.collection.immutable.List.flatMap(List.scala:293) at dotty.tools.scaladoc.tasty.ClassLikeSupport.extractMembers(ClassLikeSupport.scala:221) at dotty.tools.scaladoc.tasty.ClassLikeSupport.extractMembers$(ClassLikeSupport.scala:15) at dotty.tools.scaladoc.tasty.TastyParser.extractMembers(TastyParser.scala:169) at dotty.tools.scaladoc.tasty.ClassLikeSupport.extractPatchedMembers(ClassLikeSupport.scala:226) at dotty.tools.scaladoc.tasty.ClassLikeSupport.extractPatchedMembers$(ClassLikeSupport.scala:15) at dotty.tools.scaladoc.tasty.TastyParser.extractPatchedMembers(TastyParser.scala:169) at dotty.tools.scaladoc.tasty.ClassLikeSupport.mkClass(ClassLikeSupport.scala:113) at dotty.tools.scaladoc.tasty.ClassLikeSupport.mkClass$(ClassLikeSupport.scala:15) at dotty.tools.scaladoc.tasty.TastyParser.mkClass(TastyParser.scala:169) at dotty.tools.scaladoc.tasty.ClassLikeSupport.parseClasslike(ClassLikeSupport.scala:290) at dotty.tools.scaladoc.tasty.ClassLikeSupport.parseClasslike$(ClassLikeSupport.scala:15) at dotty.tools.scaladoc.tasty.TastyParser.parseClasslike(TastyParser.scala:169) at dotty.tools.scaladoc.tasty.TastyParser$Traverser$2$.traverseTree(TastyParser.scala:223) at scala.quoted.Quotes$reflectModule$TreeTraverser.foldTree(Quotes.scala:4666) at scala.quoted.Quotes$reflectModule$TreeTraverser.foldTree$(Quotes.scala:4662) at dotty.tools.scaladoc.tasty.TastyParser$Traverser$2$.foldTree(TastyParser.scala:211) at dotty.tools.scaladoc.tasty.TastyParser$Traverser$2$.foldTree(TastyParser.scala:211) at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldTrees$$anonfun$1(Quotes.scala:4554) at scala.collection.LinearSeqOps.foldLeft(LinearSeq.scala:169) at scala.collection.LinearSeqOps.foldLeft$(LinearSeq.scala:165) at scala.collection.immutable.List.foldLeft(List.scala:79) at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldTrees(Quotes.scala:4554) at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldTrees$(Quotes.scala:4549) at dotty.tools.scaladoc.tasty.TastyParser$Traverser$2$.foldTrees(TastyParser.scala:211) at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree(Quotes.scala:4617) at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree$(Quotes.scala:4549) at dotty.tools.scaladoc.tasty.TastyParser$Traverser$2$.foldOverTree(TastyParser.scala:211) at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTreeChildren(Quotes.scala:4668) at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTreeChildren$(Quotes.scala:4662) at dotty.tools.scaladoc.tasty.TastyParser$Traverser$2$.traverseTreeChildren(TastyParser.scala:211) at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTree(Quotes.scala:4664) at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTree$(Quotes.scala:4662) at dotty.tools.scaladoc.tasty.TastyParser$Traverser$2$.traverseTree(TastyParser.scala:219) at dotty.tools.scaladoc.tasty.TastyParser.parseRootTree(TastyParser.scala:228) at dotty.tools.scaladoc.tasty.ScaladocTastyInspector.$anonfun$4(TastyParser.scala:123) at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15) at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10) at dotty.tools.scaladoc.tasty.ScaladocTastyInspector.postProcess$$anonfun$2(TastyParser.scala:42) at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15) at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10) at scala.collection.immutable.List.foreach(List.scala:333) at dotty.tools.scaladoc.tasty.ScaladocTastyInspector.postProcess(TastyParser.scala:42) at scala.tasty.inspector.OldTastyInspector$TastyInspectorFinishPhase$1.runOn(OldTastyInspector.scala:91) 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.dottydoc.Main$.process(Main.scala:25) at dotty.tools.dottydoc.Main.process(Main.scala) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at xsbt.DottydocRunner.run(DottydocRunner.java:61) at xsbt.ScaladocInterface.run(ScaladocInterface.java:11) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at sbt.internal.inc.AnalyzingCompiler.invoke(AnalyzingCompiler.scala:329) at sbt.internal.inc.AnalyzingCompiler.doc(AnalyzingCompiler.scala:175) at sbt.internal.inc.AnalyzingCompiler.doc(AnalyzingCompiler.scala:133) at sbt.Doc$.$anonfun$scaladoc$1(Doc.scala:52) at sbt.Doc$.$anonfun$scaladoc$1$adapted(Doc.scala:40) at sbt.RawCompileLike$.$anonfun$prepare$1(RawCompileLike.scala:79) at sbt.RawCompileLike$.$anonfun$prepare$1$adapted(RawCompileLike.scala:72) at sbt.RawCompileLike$.$anonfun$cached$4(RawCompileLike.scala:63) at sbt.RawCompileLike$.$anonfun$cached$4$adapted(RawCompileLike.scala:61) at sbt.util.Tracked$.$anonfun$inputChangedW$1(Tracked.scala:219) at sbt.RawCompileLike$.$anonfun$cached$1(RawCompileLike.scala:68) at sbt.RawCompileLike$.$anonfun$cached$1$adapted(RawCompileLike.scala:52) at sbt.Defaults$.$anonfun$docTaskSettings$4(Defaults.scala:2157) at scala.Function1.$anonfun$compose$1(Function1.scala:49) at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:62) at sbt.std.Transform$$anon$4.work(Transform.scala:68) at sbt.Execute.$anonfun$submit$2(Execute.scala:282) at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:23) at sbt.Execute.work(Execute.scala:291) at sbt.Execute.$anonfun$submit$1(Execute.scala:282) at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:265) at sbt.CompletionService$$anon$2.call(CompletionService.scala:64) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:833) [info] Main Scala API documentation successful. [success] Total time: 2 s, completed Oct 13, 2022, 4:42:30 PM sbt:docs-testcase> ```

Expectation

Scaladoc should be able to generate the documentation of the project without any problem

SethTisue commented 1 year ago

very likely a duplicate of #15927

Dedelweiss commented 1 year ago

Seems to be corrected @ckipp01

ckipp01 commented 1 year ago

Cool, thanks for checking @Dedelweiss! @jgongo this seems to be fixed on the latest nightly. If you do hit on it again, please don't hesitate to comment back!