gpt4 book ai didi

scala - 处理宏注释时无法访问父级成员

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

我有点被以下(宏注释)阻止
情况。假设我有一个名为 @factory 的注释哪一个
旨在生成 apply相应伴随对象中注释特征的方法。例如,给定 trait A :

@factory
trait A {
val a1: Int
}

要生成的预期代码如下:
object A extends Factory[A] {
def apply(_a1: Int) = new A {
val a1 = _a1
}
}

现在假设我们有一个特征 B继承自 A :
@factory
trait B extends A {
val b1: String
}

这应该产生:
object B extends Factory[B] {
def apply(_a1: Int, _b1: String) = new B {
val a1 = _a1
val b1 = _b1
}
}

在后一种情况下,我需要知道 A 中存在哪些属性。 , 但我不知道如何获得有关他们的任何信息 .在处理宏注释时,我只能访问 B特征 AST(作为 ClassDef)。虽然它的 template包含对父项的引用(如 TypeTrees ),两个字段 tpesymbol是空的。

访问 A 对我来说很棒AST。但是,我认为这是不可行的。因此,任何符号或类型(指向父类型或当前类型)都足够好。

如果想看更多实现细节,我已经把项目上传到 https://github.com/jesuslopez-gonzalez/cool-factory .它可以生成 apply为本地值(value)观。

最佳答案

进入宏注释参数的树是故意无类型的。但是正在运行 c.typeCheck(q"(??? : <tree that represents the parent>)").tpe将提供缺失的信息。别忘了duplicate类型检查之前的那棵树,因为 c.typeCheck使树就地发生变异,这可能是不可取的。

如果 parent 和 child 都声明在同一个 non-toplevel 作用域中,就会出现 typeCheck 看不到 parent 的问题,因为宏注解中的 c.typeCheck 是在父词法作用域中执行的,所以注解不会得到查看半构建的范围。这里也有类似的报道:https://github.com/aztek/scala-workflow/issues/2#issuecomment-23947943 .

从类型检查中排除当前范围的决定不是最终决定。本周我将更多地思考宏注释应该如何与封闭的作用域交互,并且可能会更改它以执行您希望它执行的操作。我会立即进行更改,但我需要确保该更改不会引起任何疯狂的行为。

关于scala - 处理宏注释时无法访问父级成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19379436/

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