Skip to content

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

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
xuwei-k opened this issue Mar 27, 2022 · 1 comment · Fixed by #14800
Closed

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

xuwei-k opened this issue Mar 27, 2022 · 1 comment · Fixed by #14800
Assignees
Labels
area:tasty-inspector issues relating to the TASTy inspector itype:bug

Comments

@xuwei-k
Copy link
Contributor

xuwei-k commented Mar 27, 2022

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

@xuwei-k xuwei-k added itype:bug stat:needs triage Every issue needs to have an "area" and "itype" label labels Mar 27, 2022
@Kordyjan Kordyjan added area:tasty-inspector issues relating to the TASTy inspector and removed stat:needs triage Every issue needs to have an "area" and "itype" label labels Mar 28, 2022
@nicolasstucki
Copy link
Contributor

Looks similar to #14536

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area:tasty-inspector issues relating to the TASTy inspector itype:bug
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants