如何生成静态成员并将其添加到类型宏中的类?

soc*_*soc 6 reflection macros static scala scala-macros

我想将静态字段(bar在此示例中命名Foo)添加到具有类型宏(命名Static)的类(已命名).

这就是我目前正在尝试这样做的方式:

import language.experimental.macros
import scala.reflect.macros.Context

package object statics {

  type Static = macro Statics.addStaticField

  object Statics {

    def addStaticField(c: Context): c.Tree = {
      import c.universe._

      val STATIC = 1 << 23
      type CompilerSymbol = scala.tools.nsc.Global#Symbol
      def setFlag(symbol: Symbol, flag: Long) {
        val compilerSymbol = symbol.asInstanceOf[CompilerSymbol]
        println("Setting flag ...")
        compilerSymbol.setFlag(flag)
      }
      def printFlags(symbol: Symbol) {
        println("Flags: " + symbol.asInstanceOf[CompilerSymbol].flagString)
      }

      val staticField: ValDef =
        ValDef(
          mods = Modifiers(),
          name = TermName("bar"),
          tpt  = TypeTree(),
          rhs  = Literal(Constant(42))
        )
      printFlags(staticField.symbol)
      setFlag(staticField.symbol, STATIC)
      printFlags(staticField.symbol)

      val Template(parents, _, existingCode) = c.enclosingTemplate

      Template(Nil, emptyValDef, staticField :: existingCode)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

在编译期间,调用setFlag似乎有效,因为标志字符串更改:

Flags: 
Setting flag ...
Flags: <static>
Run Code Online (Sandbox Code Playgroud)

但似乎它在使用现场根本没有实际效果:

package statics

class Foo extends Static

object Main extends App {
  Foo.bar        // Fails to compile
  (new Foo).bar  // Compiles
}
Run Code Online (Sandbox Code Playgroud)

show而且showRaw也没有任何迹象STATIC.

我该如何解决这个问题?

Ale*_*rlo 1

据我所知,您需要生成一个伴生对象才能具有静态字段,而目前类型宏无法实现这一点。