使用 ppx 时启用关于 unused/invalid 属性的警告
Enable warning about unused/invalid attributes when using ppx
我正在尝试使用一些 ppx 扩展,我刚刚发现 OCaml 没有针对 unused/invalid 属性发出警告。例如,如果我这样写:
let[@blaa] () = ()
即使使用 -w +A
,OCaml 也不会说 @blaa
从未被使用过,并且可能打错了。
当尝试使用 ppx 重写器并错误键入给定属性(例如 @blaa
而不是 @bla
)并且无法找出它时,这尤其令人沮丧。或者当一个给定的 ppx 重写器根本没有被启用时,所有的属性都被默默地忽略了。
有没有办法为这种情况启用警告?
注意:我在 4.03.0 和 4.04.0 上都试过了,在这两种情况下都没有收到任何警告。
嗯,一般来说,这是不可能的,因为属性只是添加到语法树元素中,然后树被多次处理,处理器可能会寻找不同的属性,而忽略其他的。处理器不需要报告他们已经处理了一个属性,或者他们没有找到预期的属性。属性语义非常通用,默认情况下所有属性都是不必要的。
但是,您可以在它们之上构建自己的语义。例如,来自 JaneStreet 的 deriving
driver 将施加一个限制,预处理器应该存在:
# type t = Hello [@@deriving some];;
Cannot locate deriver some
我正在尝试使用一些 ppx 扩展,我刚刚发现 OCaml 没有针对 unused/invalid 属性发出警告。例如,如果我这样写:
let[@blaa] () = ()
即使使用 -w +A
,OCaml 也不会说 @blaa
从未被使用过,并且可能打错了。
当尝试使用 ppx 重写器并错误键入给定属性(例如 @blaa
而不是 @bla
)并且无法找出它时,这尤其令人沮丧。或者当一个给定的 ppx 重写器根本没有被启用时,所有的属性都被默默地忽略了。
有没有办法为这种情况启用警告?
注意:我在 4.03.0 和 4.04.0 上都试过了,在这两种情况下都没有收到任何警告。
嗯,一般来说,这是不可能的,因为属性只是添加到语法树元素中,然后树被多次处理,处理器可能会寻找不同的属性,而忽略其他的。处理器不需要报告他们已经处理了一个属性,或者他们没有找到预期的属性。属性语义非常通用,默认情况下所有属性都是不必要的。
但是,您可以在它们之上构建自己的语义。例如,来自 JaneStreet 的 deriving
driver 将施加一个限制,预处理器应该存在:
# type t = Hello [@@deriving some];;
Cannot locate deriver some