Skip to content

Expr match throws ClassCastException: scala.Tuple1 cannot be cast to scala.Tuple2 #14788

Closed
@xuwei-k

Description

@xuwei-k

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions