模块 Builtin_attributes

module Builtin_attributes: sig .. end

对内置属性的支持

  • ocaml.alert
  • ocaml.boxed
  • ocaml.deprecated
  • ocaml.deprecated_mutable
  • ocaml.explicit_arity
  • ocaml.immediate
  • ocaml.immediate64
  • ocaml.inline
  • ocaml.inlined
  • ocaml.noalloc
  • ocaml.poll
  • ocaml.ppwarning
  • ocaml.specialise
  • ocaml.specialised
  • ocaml.tailcall
  • ocaml.tail_mod_cons
  • ocaml.unboxed
  • ocaml.untagged
  • ocaml.unrolled
  • ocaml.warnerror
  • ocaml.warning
  • ocaml.warn_on_literal_pattern

警告:此模块不稳定,属于 compiler-libs 的一部分。


警告 53 的属性跟踪

type current_phase = 
| 解析器
| 不变式检查

register_attr 必须在所有应为放置错误属性警告目的而跟踪的属性位置上调用。特别是,它应该在源程序中存在的、除了包含在另一个属性有效负载中的属性之外的所有属性上调用(因为这些属性可能被 ppx 遗留并且被编译器有意忽略)。

current_phase 参数指示何时调用此函数

  • 在解析器中创建属性时,或者在 Ast_invariants 模块中运行检查时看到属性时。这样做是为了确保我们只跟踪解析树最终版本的属性:如果我们能看到 ppx 将在稍后运行,那么我们会跳过在解析时添加看到的属性,因为 Ast_invariants 检查始终在 ppx 的结果上运行。

请注意,如果未使用 ppx,则 Ast_invariants 检查也会在从序列化 ast 文件创建的解析树上运行,确保在这种情况下我们不会错过属性。

val register_attr : current_phase -> string Location.loc -> unit
val mark_payload_attrs_used : Parsetree.payload -> unit

标记隐藏在另一个属性有效负载中的属性,用于放置错误属性警告(请参阅上面关于 current_phase 的注释)。在解析器中,最简单的方法是将它们添加到表中,然后稍后删除它们,而不是传递状态跟踪我们是否处于属性有效负载中。

val warn_unused : unit -> unit

为所有使用 mk_internal 创建但尚未标记为已使用的属性发出放置错误属性警告。

环境属性的警告 53 辅助函数

一些属性,如弃用标记,不会影响其出现定义的编译,而是会导致在以后使用该定义时产生警告。这是通过将原始属性移动到环境中来实现的,在那里它们将在以后的访问中被注意到。

为了使放置错误属性警告对这些属性有效地工作,我们在将它们移入环境时将它们标记为“已使用”。这是使用本节中的辅助函数完成的。

val mark_alert_used : Parsetree.attribute -> unit

如果属性是警报,则为放置错误属性警告的目的标记属性已使用。在将允许具有警报属性的内容移动到环境中时调用它。

val mark_alerts_used : Parsetree.attributes -> unit

List.iter mark_alert_used 相同。

val mark_warn_on_literal_pattern_used : Parsetree.attributes -> unit

为放置错误属性警告的目的标记“warn_on_literal_pattern”属性已使用。在将构造函数移动到环境中时调用它。

val mark_deprecated_mutable_used : Parsetree.attributes -> unit

为放置错误属性警告的目的标记“deprecated_mutable”属性已使用。在将可变字段的标签移动到环境中时调用它。

警报和警告属性的辅助函数

val check_alerts : Location.t -> Parsetree.attributes -> string -> unit
val check_alerts_inclusion : def:Location.t ->
use:Location.t ->
Location.t -> Parsetree.attributes -> Parsetree.attributes -> string -> unit
val alerts_of_attrs : Parsetree.attributes -> Misc.alerts
val alerts_of_sig : Parsetree.signature -> Misc.alerts
val alerts_of_str : Parsetree.structure -> Misc.alerts
val check_deprecated_mutable : Location.t -> Parsetree.attributes -> string -> unit
val check_deprecated_mutable_inclusion : def:Location.t ->
use:Location.t ->
Location.t -> Parsetree.attributes -> Parsetree.attributes -> string -> unit
val error_of_extension : Parsetree.extension -> Location.error
val warning_attribute : ?ppwarning:bool -> Parsetree.attribute -> unit

应用指定属性的警告设置。“ocaml.warning”/“ocaml.warnerror”(以及没有前缀的变体)将被处理并标记为已使用以警告 53。其他属性将被忽略。

还实现 ocaml.ppwarning(除非传递 ~ppwarning:false)。

val warning_scope : ?ppwarning:bool -> Parsetree.attributes -> (unit -> 'a) -> 'a

在新的警告设置范围内执行函数。这意味着在执行此函数期间对 warning_attribute 的任何调用的效果将在执行后被丢弃。

该函数还接收一个属性列表,这些属性将在函数执行之前在新范围内使用 warning_attribute 进行处理。

搜索特定属性的辅助函数

val has_attribute : string -> Parsetree.attributes -> bool

has_attribute name attrs 如果在 attrs 中存在名称为 name"ocaml." ^ name 的属性,则为真。它将该属性标记为已使用,用于放置错误属性警告。

type attr_action = 
| Mark_used_only
| 返回

select_attributes actions attrs 找到出现在 actions 中的 attrs 的元素,并根据相应的 attr_action 返回它们或仅将它们标记为已使用。

actions 列表的每个元素 (nm, action) 是一个属性以及一个 attr_action,用于指定如何处理该属性。该操作用于适应不同的编译器配置。如果一个属性只在某些编译器配置中使用,那么在我们使用其他配置进行编译时,我们仍然需要查找它并标记它为已使用。否则,我们将发出虚假的放置错误属性警告。

val select_attributes : (string * attr_action) list ->
Parsetree.attributes -> Parsetree.attributes
val attr_equals_builtin : Parsetree.attribute -> string -> bool

attr_equals_builtin attr s 如果属性的名称为 s"ocaml." ^ s,则为真。这对于手动检查属性名称很有用,但请注意,这样做不会导致将属性标记为已使用以用于警告 53,因此通常最好使用 has_attributeselect_attributes

val warn_on_literal_pattern : Parsetree.attributes -> bool
val explicit_arity : Parsetree.attributes -> bool
val immediate : Parsetree.attributes -> bool
val immediate64 : Parsetree.attributes -> bool
val has_unboxed : Parsetree.attributes -> bool
val has_boxed : Parsetree.attributes -> bool