首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用scalameta生成的代码不能被intellij识别

用scalameta生成的代码不能被intellij识别
EN

Stack Overflow用户
提问于 2017-12-03 16:38:05
回答 1查看 320关注 0票数 3

我正在尝试创建一个scalameta注释,它将在现有对象中定义一个新的case类。

我的目标是转变:

代码语言:javascript
复制
object MyObj {
  case class A()
}

转入:

代码语言:javascript
复制
object MyObj {
  case class A()
  case class B(b: Int, bb: Int)
}

为此,我创建了以下注释:

代码语言:javascript
复制
import scala.annotation.StaticAnnotation
import scala.meta._

class schema extends StaticAnnotation {
  inline def apply(defn: Any): Any = meta {
    val q"..$mods object $ename extends $template" = defn

    val generatedClass: Defn.Class =
      q"""
         case class B(b: Int, bb: Int)
       """

    //the stats that were defined in the annotated object
    val existingStats: scala.collection.immutable.Seq[Stat] = template.stats.get

    //new stats
    val stats = Some(existingStats :+ generatedClass)

    //the new template
    val newT = template.copy(stats=stats)

    val res =
      q"""
         ..$mods object $ename extends $newT
       """

    println("============== result ==============")
    println("res: " +res)
    println("====================================")
    res
  }
}

这个主要的类来测试它:

代码语言:javascript
复制
object Main {

  def main(args: Array[String]): Unit = {
    println("Hello")

    val b = new MyObj.B(2,22)
    val q = MyObj.A()
    println(b)

  }
}


@schema
object MyObj {
  case class A()
}

当我编译和运行主类时,代码会按照预期的方式运行。

在编译过程中打印:

代码语言:javascript
复制
============== result ==============
res: object MyObj {
  case class A()
  case class B(b: Int, bb: Int)
}
====================================

在运行代码之后:

代码语言:javascript
复制
Hello
B(2,22)

我的问题是当我尝试使用intellij来处理这段代码时。

代码从intellij编译和运行,但是新的类B无法识别,因此代码完成和提示不起作用

我正在使用最新的intellij和scala插件

我已经将整个项目上传到git:intellij/tree/master

这是我第一次尝试使用scalameta,我试图理解它是intellij中的一个bug,还是我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2018-08-12 16:35:35

就像旧式宏一样,需要在单独的编译单元中定义scalameta代码,以便首先编译它们,然后在编译其他源代码时调用它们。

多亏了https://www.michaelpollmeier.com/2016/12/01/scalameta-code-generation-tutorial

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47620606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档