背景 我有一个sbtpipe理的Scala项目,为scala项目使用通常的sbt项目布局 ,也就是说,一个包含macros的子项目是一个主要的项目,它是实际的应用程序,依赖于macros的子项目。 macros是实质上为常规类生成伴随对象的macros注释 。 生成的伴随对象声明,除其他成员之外,应用/不适用的方法。 我使用sbt-idea插件来生成相应的IntelliJ IDEA项目,并使用IDEA的sbt-plugin中的sbt控制台来编译和运行我的Scala应用程序。 除了生成的伴侣对象,更重要的是它们的成员(如apply / unapply),IDEA不能识别所有的东西,所有的东西都或多或less都是正常的。 因此,我在任何地方都会得到一条曲线,例如一个应用方法。 我的设置是IntelliJ IDEA CE 133.471,在Windows 7 x64上安装了插件SBT 1.5.1和Scala 0.28.363。 问题 如何让IntelliJ IDEA识别由Scalamacros生成的代码(类,对象,方法,…)(macros注释,准确地说)? 已知其他IDE(例如Eclipse)在这种环境中能够更好地工作吗? 有关 这个问题 (不太详细)本质上是一样的,但还没有得到答复(2014-02-26)。 根据JetBrains的开发者 ,我所要求的function是在他们的长期待办事项清单上,但不会很快实施(2014-03-05)。
在哪里我可以学习如何构buildScala的macros生成的AST? Scaladoc没有我想要的那么有帮助。 例如: abstract def Apply(sym: Universe.Symbol, args: Universe.Tree*): Universe.Tree A factory method for Apply nodes. 但是,我怎么知道一个Apply节点是什么? 我在哪里可以findAST的节点types列表,以及它们如何组合在一起?
我将从一个例子开始。 这里有一个相当于List.fill的元组作为Scala 2.10中的一个macros: import scala.language.experimental.macros import scala.reflect.macros.Context object TupleExample { def fill[A](arity: Int)(a: A): Product = macro fill_impl[A] def fill_impl[A](c: Context)(arity: c.Expr[Int])(a: c.Expr[A]) = { import c.universe._ arity.tree match { case Literal(Constant(n: Int)) if n < 23 => c.Expr( Apply( Select(Ident("Tuple" + n.toString), "apply"), List.fill(n)(a.tree) ) ) case _ => c.abort( c.enclosingPosition, "Desired arity must […]
假设我们要编写一个macros来定义一个具有某种types成员或方法的匿名类,然后创build一个静态types为该类方法的类的实例,等等。2.10中的这个macros系统是可能的。 0,types成员部分非常简单: object MacroExample extends ReflectionUtils { import scala.language.experimental.macros import scala.reflect.macros.Context def foo(name: String): Any = macro foo_impl def foo_impl(c: Context)(name: c.Expr[String]) = { import c.universe._ val Literal(Constant(lit: String)) = name.tree val anon = newTypeName(c.fresh) c.Expr(Block( ClassDef( Modifiers(Flag.FINAL), anon, Nil, Template( Nil, emptyValDef, List( constructor(c.universe), TypeDef(Modifiers(), newTypeName(lit), Nil, TypeTree(typeOf[Int])) ) ) ), Apply(Select(New(Ident(anon)), nme.CONSTRUCTOR), Nil) […]