Skip to content

TreeTraverser throw MatchError: InlineMatch #14789

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 · 0 comments · Fixed by #14809
Closed

TreeTraverser throw MatchError: InlineMatch #14789

xuwei-k opened this issue Mar 27, 2022 · 0 comments · Fixed by #14809
Assignees
Labels
area:metaprogramming:reflection Issues related to the quotes reflection API itype:bug
Milestone

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.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

@xuwei-k xuwei-k added itype:bug stat:needs triage Every issue needs to have an "area" and "itype" label labels Mar 27, 2022
@nicolasstucki nicolasstucki added area:metaprogramming:reflection Issues related to the quotes reflection API and removed stat:needs triage Every issue needs to have an "area" and "itype" label labels Mar 28, 2022
@nicolasstucki nicolasstucki self-assigned this Mar 28, 2022
@Kordyjan Kordyjan added area:tasty-inspector issues relating to the TASTy inspector and removed area:tasty-inspector issues relating to the TASTy inspector labels Mar 28, 2022
nicolasstucki added a commit to dotty-staging/dotty that referenced this issue Mar 29, 2022
@Kordyjan Kordyjan added this to the 3.1.3 milestone Aug 2, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area:metaprogramming:reflection Issues related to the quotes reflection API itype:bug
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants