Closed
Description
Compiler version
3.1.3-RC1-bin-20220325-6f3fe05-NIGHTLY
Minimized code
build.sbt
scalaVersion := "3.1.3-RC1-bin-20220325-6f3fe05-NIGHTLY"
libraryDependencies += "org.scala-lang" %% "scala3-tasty-inspector" % scalaVersion.value
Main.scala
package example
import scala.quoted.*
import scala.tasty.inspector.Inspector
import scala.tasty.inspector.Tasty
import scala.tasty.inspector.TastyInspector
import scala.reflect.ClassTag
class MySeq(override val length: Int) extends collection.Seq[String] {
def foo: Int = length // error
def apply(v1: Int): String = ???
def iterator: Iterator[String] = ???
}
object Main {
def main(args: Array[String]): Unit = {
val inspector = new Inspector {
def inspect(using Quotes)(tastys: List[Tasty[quotes.type]]): Unit = {
import quotes.reflect.*
val traverser = new TreeTraverser {
override def traverseTree(tree: Tree)(owner: Symbol): Unit = {
if (tree.isExpr) {
try {
tree.asExpr match {
case '{ ($x: collection.Seq[t]).length } =>
super.traverseTree(tree)(owner)
case _ =>
super.traverseTree(tree)(owner)
}
} catch {
case e =>
report.error(s"unexpected error ${e}", tree.pos)
throw e
}
} else {
super.traverseTree(tree)(owner)
}
}
}
tastys.foreach{ tasty =>
traverser.traverseTree(tasty.ast)(tasty.ast.symbol)
}
}
}
TastyInspector.inspectAllTastyFiles(
tastyFiles = Nil,
jars = classOf[MySeq].getProtectionDomain.getCodeSource.getLocation.getPath :: Nil,
dependenciesClasspath = Nil,
)(inspector)
}
}
Output
[info] running example.Main
-- Error: Main.scala:10:17 -----------------------------------------------------
10 | def foo: Int = length // error
| ^^^^^^
|unexpected error java.lang.ClassCastException: scala.Tuple1 cannot be cast to scala.Tuple2
java.lang.ClassCastException: scala.Tuple1 cannot be cast to scala.Tuple2 while compiling /Users/kenji/expr-match-ClassCastException/target/bg-jobs/sbt_3a36233a/job-19/target/c4977ccb/91bd736c/expr-match-classcastexception_3-0.1.0-SNAPSHOT.jar
[error] java.lang.ClassCastException: scala.Tuple1 cannot be cast to scala.Tuple2
[error] at example.Main$$anon$2.traverseTree(Main.scala:26)
[error] at scala.quoted.Quotes$reflectModule$TreeTraverser.foldTree(Quotes.scala:4642)
[error] at scala.quoted.Quotes$reflectModule$TreeTraverser.foldTree$(Quotes.scala:4638)
[error] at example.Main$$anon$2.foldTree(Main.scala:21)
[error] at example.Main$$anon$2.foldTree(Main.scala:21)
[error] at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldTrees$$anonfun$1(Quotes.scala:4539)
[error] at scala.collection.IterableOnceOps.foldLeft(IterableOnce.scala:646)
[error] at scala.collection.IterableOnceOps.foldLeft$(IterableOnce.scala:642)
[error] at scala.collection.AbstractIterable.foldLeft(Iterable.scala:926)
[error] at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldTrees(Quotes.scala:4539)
[error] at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldTrees$(Quotes.scala:4534)
[error] at example.Main$$anon$2.foldTrees(Main.scala:21)
[error] at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree(Quotes.scala:4590)
[error] at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree$(Quotes.scala:4534)
[error] at example.Main$$anon$2.foldOverTree(Main.scala:21)
[error] at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTreeChildren(Quotes.scala:4644)
[error] at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTreeChildren$(Quotes.scala:4638)
[error] at example.Main$$anon$2.traverseTreeChildren(Main.scala:21)
[error] at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTree(Quotes.scala:4640)
[error] at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTree$(Quotes.scala:4638)
[error] at example.Main$$anon$2.traverseTree(Main.scala:37)
[error] at scala.quoted.Quotes$reflectModule$TreeTraverser.foldTree(Quotes.scala:4642)
[error] at scala.quoted.Quotes$reflectModule$TreeTraverser.foldTree$(Quotes.scala:4638)
[error] at example.Main$$anon$2.foldTree(Main.scala:21)
[error] at example.Main$$anon$2.foldTree(Main.scala:21)
[error] at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldTrees$$anonfun$1(Quotes.scala:4539)
[error] at scala.collection.LinearSeqOps.foldLeft(LinearSeq.scala:169)
[error] at scala.collection.LinearSeqOps.foldLeft$(LinearSeq.scala:165)
[error] at scala.collection.immutable.List.foldLeft(List.scala:79)
[error] at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldTrees(Quotes.scala:4539)
[error] at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldTrees$(Quotes.scala:4534)
[error] at example.Main$$anon$2.foldTrees(Main.scala:21)
[error] at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree(Quotes.scala:4596)
[error] at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree$(Quotes.scala:4534)
[error] at example.Main$$anon$2.foldOverTree(Main.scala:21)
[error] at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTreeChildren(Quotes.scala:4644)
[error] at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTreeChildren$(Quotes.scala:4638)
[error] at example.Main$$anon$2.traverseTreeChildren(Main.scala:21)
[error] at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTree(Quotes.scala:4640)
[error] at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTree$(Quotes.scala:4638)
[error] at example.Main$$anon$2.traverseTree(Main.scala:37)
[error] at scala.quoted.Quotes$reflectModule$TreeTraverser.foldTree(Quotes.scala:4642)
[error] at scala.quoted.Quotes$reflectModule$TreeTraverser.foldTree$(Quotes.scala:4638)
[error] at example.Main$$anon$2.foldTree(Main.scala:21)
[error] at example.Main$$anon$2.foldTree(Main.scala:21)
[error] at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldTrees$$anonfun$1(Quotes.scala:4539)
[error] at scala.collection.LinearSeqOps.foldLeft(LinearSeq.scala:169)
[error] at scala.collection.LinearSeqOps.foldLeft$(LinearSeq.scala:165)
[error] at scala.collection.immutable.List.foldLeft(List.scala:79)
[error] at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldTrees(Quotes.scala:4539)
[error] at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldTrees$(Quotes.scala:4534)
[error] at example.Main$$anon$2.foldTrees(Main.scala:21)
[error] at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree(Quotes.scala:4602)
[error] at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree$(Quotes.scala:4534)
[error] at example.Main$$anon$2.foldOverTree(Main.scala:21)
[error] at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTreeChildren(Quotes.scala:4644)
[error] at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTreeChildren$(Quotes.scala:4638)
[error] at example.Main$$anon$2.traverseTreeChildren(Main.scala:21)
[error] at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTree(Quotes.scala:4640)
[error] at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTree$(Quotes.scala:4638)
[error] at example.Main$$anon$2.traverseTree(Main.scala:29)
[error] at example.Main$.example$Main$$anon$1$$_$inspect$$anonfun$1(Main.scala:42)
[error] at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
[error] at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
[error] at scala.collection.immutable.List.foreach(List.scala:333)
[error] at example.Main$$anon$1.inspect(Main.scala:42)
[error] at scala.tasty.inspector.TastyInspector$TastyInspectorPhase$1.runOnImpl(TastyInspector.scala:78)
[error] at scala.tasty.inspector.TastyInspector$TastyInspectorPhase$1.runOn(TastyInspector.scala:70)
[error] at dotty.tools.dotc.Run.runPhases$1$$anonfun$1(Run.scala:225)
[error] at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
[error] at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
[error] at scala.collection.ArrayOps$.foreach$extension(ArrayOps.scala:1328)
[error] at dotty.tools.dotc.Run.runPhases$1(Run.scala:236)
[error] at dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:244)
[error] at dotty.tools.dotc.Run.compileUnits$$anonfun$adapted$1(Run.scala:253)
[error] at dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:68)
[error] at dotty.tools.dotc.Run.compileUnits(Run.scala:253)
[error] at dotty.tools.dotc.Run.compileUnits(Run.scala:192)
[error] at dotty.tools.dotc.fromtasty.TASTYRun.compile(TASTYRun.scala:14)
[error] at dotty.tools.dotc.Driver.doCompile(Driver.scala:35)
[error] at dotty.tools.dotc.Driver.process(Driver.scala:195)
[error] at dotty.tools.dotc.Driver.process(Driver.scala:163)
[error] at dotty.tools.dotc.Driver.process(Driver.scala:175)
[error] at scala.tasty.inspector.TastyInspector$.inspectFiles(TastyInspector.scala:117)
[error] at scala.tasty.inspector.TastyInspector$.inspectAllTastyFiles(TastyInspector.scala:59)
[error] at example.Main$.main(Main.scala:50)
[error] at example.Main.main(Main.scala)
[error] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[error] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[error] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[error] at java.lang.reflect.Method.invoke(Method.java:498)
[error] stack trace is suppressed; run last Compile / run for the full output
[error] (Compile / run) java.lang.ClassCastException: scala.Tuple1 cannot be cast to scala.Tuple2
Expectation
don't throw ClassCastException