gpt4 book ai didi

scala - intellij 无法识别使用 scalameta 生成的代码

转载 作者:行者123 更新时间:2023-12-02 04:32:15 25 4
gpt4 key购买 nike

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

我的目标是转变:

object MyObj {
case class A()
}

进入:

object MyObj {
case class A()
case class B(b: Int, bb: Int)
}

为此我创建了以下注释:

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
}
}

和这个主类来测试它:

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()
}

当我编译并运行主类时,代码的行为符合预期。
在编译期间打印:

============== result ==============
res: object MyObj {
case class A()
case class B(b: Int, bb: Int)
}
====================================

运行代码后:

Hello
B(2,22)

我的问题是当我尝试使用 intellij 处理这段代码时。
代码从intellij编译运行,但是无法识别新类B,因此代码补全和提示都不起作用

enter image description here

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


我已经将完整的项目上传到 git: https://github.com/lev112/scalameta_intellij/tree/master

这是我第一次尝试使用 scalameta,我正在尝试了解它是否是 intellij 中的错误,或者我做错了什么

最佳答案

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

感谢https://www.michaelpollmeier.com/2016/12/01/scalameta-code-generation-tutorial

关于scala - intellij 无法识别使用 scalameta 生成的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47620606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com