1

いくつかのメソッドを持ついくつかのクラスがあるとします


class Clz ... {

  def someMethod: Map[String, Long] = ... 

  def id: Long = 0L
}

someMethod を再利用して ID を上書きする必要があります。理由はわかりませんが、Stackoverflow がスローされます。また、結果を返さずに Clz の params/methods を使用して何かを行う必要があります。

私が試したこと:

object Macros {


    def impl(c: whitebox.Context)(annottees: c.Tree*): c.Tree = {
      import c.universe._

      annottees match {

        case (cls @ q"$_ class $tpname[..$_] $_(...$paramss) extends { ..$_ } with ..$_ { $_ => ..$stats }") :: Nil =>

          val someMethodM = stats
            .filter(case q"$_ def $methodName: $_ = $_" => methodName.toString == "someMethod")
            .map {
              case q"$_ def $_: $_ = $res" => res
            }

          q"""
             $cls

             object ClzCompanion {

               val someMethodsRef: Map[String, Int] = Map.apply(..$someMethodM)

               ..${
                  paramss
                    .flatten
                    .foreach {
                      case q"$_ val $nname: $tpt = $valuee" => 
                        // simply do something with valuee and nothing else
                        // "fire and forget"
                     }
                  }

               ..${
                  paramss
                    .flatten
                    .map {
                      case q"$_ val $nname: $tpt = $valuee" => 
                        // here logic, if this nname in someMethodsRef then
                        // someMethodsRef.find({ case (key, _) => key == nname) match {
                        //    case Some(_) => "def $nname: ($tpt, Int) = ... // new method with body
                        //    case None => do nothing...  
                     }
                  }

               }
           """
      }
    }
  }

Clz で id メソッドを上書きするにはどうすればよいですか?

なぜStackOverflowをスローするのですか??

4

0 に答える 0