Skip to content

TreeTraverser throw MatchError: InlineMatch #14789

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.compiletime.erasedValue
import scala.compiletime.summonFrom
import scala.quoted.Quotes
import scala.tasty.inspector.Inspector
import scala.tasty.inspector.Tasty
import scala.tasty.inspector.TastyInspector

object Main {
  transparent inline def summonFirst0[T]: Any =
    inline erasedValue[T] match
      case _: (a *: b) => summonFrom {
        case instance: `a` => instance
        case _ => summonFirst0[b]
      }

  def main(args: Array[String]): Unit = {
    val inspector = new Inspector {
      def inspect(using q: Quotes)(tastys: List[Tasty[q.type]]): Unit = {
        import q.reflect.*
        val traverser = new TreeTraverser {
          override def traverseTree(tree: Tree)(owner: Symbol): Unit = {
            try {
              super.traverseTree(tree)(owner)
            } catch {
              case e =>
                report.error(s"unexpected error ${e}", tree.pos)
                throw e
            }
          }
        }
        tastys.foreach{ tasty =>
          traverser.traverseTree(tasty.ast)(tasty.ast.symbol)
        }
      }
    }
    TastyInspector.inspectAllTastyFiles(
      tastyFiles = Nil,
      jars = this.getClass.getProtectionDomain.getCodeSource.getLocation.getPath :: Nil,
      dependenciesClasspath = Nil,
    )(inspector)
  }
}

Output

[info] running example.Main 
-- Error: Main.scala:13:37 -----------------------------------------------------
13 |      case _: (a *: b) => summonFrom {
   |                                     ^
   |unexpected error scala.MatchError: InlineMatch(EmptyTree, List(CaseDef(Bind(instance,Typed(Ident(_),Ident(a))),EmptyTree,Block(List(),Typed(Ident(instance),TypeTree[TypeRef(NoPrefix,type a)]))), CaseDef(Ident(_),EmptyTree,Block(List(),TypeApply(Ident(summonFirst0),List(Ident(b))))))) (of class dotty.tools.dotc.ast.Trees$InlineMatch)
14 |        case instance: `a` => instance
15 |        case _ => summonFirst0[b]
16 |      }
scala.MatchError: InlineMatch(EmptyTree, List(CaseDef(Bind(instance,Typed(Ident(_),Ident(a))),EmptyTree,Block(List(),Typed(Ident(instance),TypeTree[TypeRef(NoPrefix,type a)]))), CaseDef(Ident(_),EmptyTree,Block(List(),TypeApply(Ident(summonFirst0),List(Ident(b))))))) (of class dotty.tools.dotc.ast.Trees$InlineMatch) while compiling /Users/kenji/InlineMatch-inspector-error/target/bg-jobs/sbt_5fef1186/job-7/target/c303e2d0/1377879e/inlinematch-inspector-error_3-0.1.0-SNAPSHOT.jar
[error] scala.MatchError: InlineMatch(EmptyTree, List(CaseDef(Bind(instance,Typed(Ident(_),Ident(a))),EmptyTree,Block(List(),Typed(Ident(instance),TypeTree[TypeRef(NoPrefix,type a)]))), CaseDef(Ident(_),EmptyTree,Block(List(),TypeApply(Ident(summonFirst0),List(Ident(b))))))) (of class dotty.tools.dotc.ast.Trees$InlineMatch)
[error] 	at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree(Quotes.scala:4623)
[error] 	at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree$(Quotes.scala:4534)
[error] 	at example.Main$$anon$2.foldOverTree(Main.scala:22)
[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:22)
[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:25)
[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:22)
[error] 	at example.Main$$anon$2.foldTree(Main.scala:22)
[error] 	at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree(Quotes.scala:4568)
[error] 	at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree$(Quotes.scala:4534)
[error] 	at example.Main$$anon$2.foldOverTree(Main.scala:22)
[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:22)
[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:25)
[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:22)
[error] 	at example.Main$$anon$2.foldTree(Main.scala:22)
[error] 	at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree(Quotes.scala:4619)
[error] 	at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree$(Quotes.scala:4534)
[error] 	at example.Main$$anon$2.foldOverTree(Main.scala:22)
[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:22)
[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:25)
[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:22)
[error] 	at example.Main$$anon$2.foldTree(Main.scala:22)
[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:22)
[error] 	at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree(Quotes.scala:4576)
[error] 	at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree$(Quotes.scala:4534)
[error] 	at example.Main$$anon$2.foldOverTree(Main.scala:22)
[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:22)
[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:25)
[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:22)
[error] 	at example.Main$$anon$2.foldTree(Main.scala:22)
[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:22)
[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:22)
[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:22)
[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:25)
[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:22)
[error] 	at example.Main$$anon$2.foldTree(Main.scala:22)
[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:22)
[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:22)
[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:22)
[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:25)
[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:22)
[error] 	at example.Main$$anon$2.foldTree(Main.scala:22)
[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:22)
[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:22)
[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:22)
[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:25)
[error] 	at example.Main$.example$Main$$anon$1$$_$inspect$$anonfun$1(Main.scala:34)
[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:34)
[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:42)
[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) scala.MatchError: InlineMatch(EmptyTree, List(CaseDef(Bind(instance,Typed(Ident(_),Ident(a))),EmptyTree,Block(List(),Typed(Ident(instance),TypeTree[TypeRef(NoPrefix,type a)]))), CaseDef(Ident(_),EmptyTree,Block(List(),TypeApply(Ident(summonFirst0),List(Ident(b))))))) (of class dotty.tools.dotc.ast.Trees$InlineMatch)

Expectation

Don't throw MatchError

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions