JSON 输出

本章节介绍由 rustc 所发出的 JSON 的结构。可以通过 --error-format=json 标签 启用 JSON。可以使用 --json 标签 指定其他可以更改生成的消息以及消息的格式的选项。

JSON 消息每行都被发送到 stderr 。

如果使用 Rust 解析输出, cargo_metadata crate 提供了解析消息的一些支持。

当解析时,应注意与将来的格式更改保持向前兼容(译者注:向前兼容指的是以前的兼容以后的,而向后兼容就是以后的兼容以前的)。可选值可以为 null 。新的字段可能会添加。枚举字段如 “level” 或 “suggestion_applicability” 可以添加新的值。

诊断 (Diagnostics)

诊断消息会提供错误或在编译中可能产生的问题。 rustc 提供有关诊断来源的详细信息,以及提示和建议。

诊断以 parent/child 关系排列,其中 parent 诊断是诊断的核心,附加的 children 提供了其他的上下文,帮助和信息。

诊断有如下格式:

  1. {
  2. /* 主消息 */
  3. "message": "unused variable: `x`",
  4. /* 诊断码
  5. 一些消息可能将这个值设置为 null 。
  6. */
  7. "code": {
  8. /* 标识了触发哪个诊断的独一的字符串。 */
  9. "code": "unused_variables",
  10. /* 可选字符串,解释关于诊断码的更多细节。*/
  11. "explanation": null
  12. },
  13. /* 诊断信息的重要程度。
  14. 值可能是:
  15. - "error": 无法编译的致命错误。
  16. - "warning": 可能的错误或预警。
  17. - "note": 诊断的附加信息或上下文。
  18. - "help": 解决诊断问题的建议。
  19. - "failure-note": 为了获取更多信息的附带说明。
  20. - "error: internal compiler error": 指明编译器内部的错误。
  21. */
  22. "level": "warning",
  23. /* 一个源代码位置数组,指出有关诊断来源的详细信息。这个数组可能是空的,例如,
  24. 对于一些全局消息,或者附加到 parent 的 child 消息,就可能是空的。
  25. 字符偏移量是 Unicode 标量的偏移量。
  26. */
  27. "spans": [
  28. {
  29. /* span 所在的文件。
  30. 注意,此路径可能不存在。例如,如果路径指向标准库,而
  31. rust src 在系统根目录中不可用, 那么它可能会指向一个不存在的文件。
  32. 注意,这也可能指向外部 crate 源。
  33. */
  34. "file_name": "lib.rs",
  35. /* span 开始的字节偏移量(基于0且包含0)。 */
  36. "byte_start": 21,
  37. /* span 结束的字节偏移量(基于0且不包含0)。 */
  38. "byte_end": 22,
  39. /* span 的第一行编号(基于1且包含1)。 */
  40. "line_start": 2,
  41. /* span 的最后一行编号(基于1且包含1)。 */
  42. "line_end": 2,
  43. /* 行首(line_start)的第一个字符偏移量(基于1且包含1) */
  44. "column_start": 9,
  45. /* 行尾(line_end)的最后一个字符偏移量(基于1且不包含1) */
  46. "column_end": 10,
  47. /* 不管这是不是 "primary" span。
  48. 这表明这个 span 是该诊断的焦点所在(focal)。
  49. 在少数情况下,多个 span 可能被标记为 primary。 例如 "immutable borrow occurs here" 和
  50. "mutable borrow ends here" 可以是两个独立的 primary span。
  51. top (parent) 消息应该有至少一个 rimary span ,除非有 0 个 span 。
  52. child 消息有 0 个或多个 primary span 。
  53. */
  54. "is_primary": true,
  55. /* 一个对象数组,显示该 span 的原始源代码。这将展示 span 所在的整行文本 。跨多行的 span 对于每行会有一个单独对应的值。
  56. */
  57. "text": [
  58. {
  59. /* 完整的原始源代码行。 */
  60. "text": " let x = 123;",
  61. /* span 所指行的首字符偏移量(基于1且包含1)。 */
  62. "highlight_start": 9,
  63. /* span 所指行的最后一个字符偏移量(基于1且不包含1)。 */
  64. "highlight_end": 10
  65. }
  66. ],
  67. /* 一个可选消息,用于显示 span 位置。对于主 span ,这通常为 null 。
  68. */
  69. "label": null,
  70. /* 一个可选字符串,对于解决该问题建议的替换。 工具( Tools )可能会尝试用此文本替换该 span 的内容 。
  71. */
  72. "suggested_replacement": null,
  73. /* 一个可选字符串,指出 "suggested_replacement" 的置信度。工具( Tools )可能会用这个值来决定是否自动应用建议(的替换)。
  74. 可能的值可以是:
  75. - "MachineApplicable": 该建议无疑是用户的意图。该建议应该自动被应用。
  76. - "MaybeIncorrect": 该建议可能是用户的意图,但不确定。如果应用了该建议,则应该产生有效的 Rust 代码。
  77. - "HasPlaceholders": 该建议包含占位符,如
  78. `(...)`。 建议不会被自动应用因为它不会产生有效的 Rust 代码。用户需要填充该占位符。
  79. - "Unspecified": 建议的适用性尚不清楚。
  80. */
  81. "suggestion_applicability": null,
  82. /* 一个可选对象,指出该 span 内的宏展开。
  83. 如果消息发生在宏调用中,该对象将会提供该消息在宏展开所在位置的详细信息。
  84. */
  85. "expansion": {
  86. /* 宏调用的 span 。
  87. 使用与 "spans" 数组相同的 span 定义。
  88. */
  89. "span": {/*...*/}
  90. /* 宏名称, 例如 "foo!" 或 "#[derive(Eq)]"。 */
  91. "macro_decl_name": "some_macro!",
  92. /* 可选的 span ,定义了宏的相关部分 */
  93. "def_site_span": {/*...*/},
  94. }
  95. }
  96. ],
  97. /* 附加诊断消息的数组。
  98. 这是一个对象数组,使用与 parent 消息相同的格式。
  99. children 没有嵌套 ( children 自身不包含 "children" 的定义 )
  100. */
  101. "children": [
  102. {
  103. "message": "`#[warn(unused_variables)]` on by default",
  104. "code": null,
  105. "level": "note",
  106. "spans": [],
  107. "children": [],
  108. "rendered": null
  109. },
  110. {
  111. "message": "if this is intentional, prefix it with an underscore",
  112. "code": null,
  113. "level": "help",
  114. "spans": [
  115. {
  116. "file_name": "lib.rs",
  117. "byte_start": 21,
  118. "byte_end": 22,
  119. "line_start": 2,
  120. "line_end": 2,
  121. "column_start": 9,
  122. "column_end": 10,
  123. "is_primary": true,
  124. "text": [
  125. {
  126. "text": " let x = 123;",
  127. "highlight_start": 9,
  128. "highlight_end": 10
  129. }
  130. ],
  131. "label": null,
  132. "suggested_replacement": "_x",
  133. "suggestion_applicability": "MachineApplicable",
  134. "expansion": null
  135. }
  136. ],
  137. "children": [],
  138. "rendered": null
  139. }
  140. ],
  141. /* 可选字符串,由 rustc 显示的诊断的 rendered 版本。注意这可能会受到 `--json` 标签的影响。
  142. */
  143. "rendered": "warning: unused variable: `x`\n --> lib.rs:2:9\n |\n2 | let x = 123;\n | ^ help: if this is intentional, prefix it with an underscore: `_x`\n |\n = note: `#[warn(unused_variables)]` on by default\n\n"
  144. }

工件通知

当使用 --json=artifacts 标签 时就会触发工件通知( Artifact notification ,译者注,artifact 真的是一个很难恰到其处翻译的词语,所以这里只能约定俗成地翻译为“工件”) 。 它们指明了文件工件已经被保存到了磁盘中。有关发出(工件)类型的更多信息可以在 --emit 标签 文档中找到。

  1. {
  2. /* 生成工件的文件名 */
  3. "artifact": "libfoo.rlib",
  4. /* 生成的工件的种类,可能的值有:
  5. - "link": 根据 crate 类型指定生成的 crate 。
  6. - "dep-info": 具有依赖信息的 `.d` 文件,所用语法类似于 Makefile 文件的语法。
  7. - "metadata": 包含有关 crate 元数据的 Rust `.rmeta` 文件。
  8. - "save-analysis": 由 `-Zsave-analysis` feature 所发出的 JSON 文件 。
  9. */
  10. "emit": "link"
  11. }