Skip to content

foldOver in default TreeAccumulator can't process Typed nodes. #14393

Closed
@rssh

Description

@rssh

Compiler version

3.1.1

Minimized code

file M.scala

package x
import scala.quoted.*

object M {

  inline def useFoldTree[X](inline x:X):X = ${
     useFoldTreeImpl('x)
  }

  def useFoldTreeImpl[X:Type](x:Expr[X])(using Quotes):Expr[X] = {
     import quotes.reflect.*
     val search = new TreeAccumulator[Int] {
        def foldTree(s:Int, tree: Tree)(owner: Symbol): Int =
                 foldOverTree(s,tree)(owner)
     }
     search.foldTree(0,x.asTerm)(Symbol.spliceOwner)
     x
  }

}

File X.scala

package x

def thing() =
      M.useFoldTree {

        Option("") match
          case None =>
          case Some(_) =>
            ???

      }

Output

[info] compiling 2 Scala sources to /Users/rssh/tests/dotty/cantiBot1/target/scala-3.1.1/classes ...
[error] -- Error: /Users/rssh/tests/dotty/cantiBot1/src/main/scala/x/X.scala:5:20 ------
[error] 5 |      M.useFoldTree {
[error]    |      ^
[error]    |Exception occurred while executing macro expansion.
[error]    |scala.MatchError: Typed(UnApply(TypeApply(Select(Ident(Some),unapply),List(TypeTree[TypeRef(ThisType(TypeRef(NoPrefix,module class lang)),class String)])),List(),List(Ident(_))),TypeTree[AppliedType(TypeRef(ThisType(TypeRef(NoPrefix,module class scala)),class Some),List(TypeRef(ThisType(TypeRef(NoPrefix,module class lang)),class String)))]) (of class dotty.tools.dotc.ast.Trees$Typed)
[error]    |	at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree(Quotes.scala:4421)
[error]    |	at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree$(Quotes.scala:4334)
[error]    |	at x.M$$anon$1.foldOverTree(M.scala:12)
[error]    |	at x.M$$anon$1.foldTree(M.scala:14)
[error]    |	at x.M$$anon$1.foldTree(M.scala:13)
[error]    |	at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree(Quotes.scala:4417)
[error]    |	at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree$(Quotes.scala:4334)
[error]    |	at x.M$$anon$1.foldOverTree(M.scala:12)
[error]    |	at x.M$$anon$1.foldTree(M.scala:14)
[error]    |	at x.M$$anon$1.foldTree(M.scala:13)
[error]    |	at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldTrees$$anonfun$1(Quotes.scala:4339)
[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:4339)
[error]    |	at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldTrees$(Quotes.scala:4334)
[error]    |	at x.M$$anon$1.foldTrees(M.scala:12)
[error]    |	at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree(Quotes.scala:4374)
[error]    |	at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree$(Quotes.scala:4334)
[error]    |	at x.M$$anon$1.foldOverTree(M.scala:12)
[error]    |	at x.M$$anon$1.foldTree(M.scala:14)
[error]    |	at x.M$$anon$1.foldTree(M.scala:13)
[error]    |	at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree(Quotes.scala:4366)
[error]    |	at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree$(Quotes.scala:4334)
[error]    |	at x.M$$anon$1.foldOverTree(M.scala:12)
[error]    |	at x.M$$anon$1.foldTree(M.scala:14)

Expectation

Should be compiled

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions