【问题标题】:How can I grab the Swift REPL compiler errors in JSON format如何获取 JSON 格式的 Swift REPL 编译器错误
【发布时间】:2018-04-30 16:34:38
【问题描述】:

我希望以 JSON 或 XML 等可读格式从 Swift REPL 中获取 Swift 编译器错误

我能做的最好的就是通过标准输入/输出管道将其作为字符串读入。我用swiftc 尝试了几乎所有参数/选项,但没有运气。

我读到我可以编写扩展 LLDB 的 Python 脚本,但我不知道从哪里开始。

目前格式为:

/Users/joeblow/Desktop/pre-compiled.swift:1:38: error: cannot convert value of type 'Int' to specified type 'String'
var age = 10; var name: String = 12;
                                 ^~

但我对这样的事情更感兴趣:

{
  path: "/Users/joeblow/Desktop/compiled.swift",
  line: 1,
  position: 38,
  error: "cannot convert value of type 'Int' to specified type 'String'"
}

我不想使用正则表达式/字符串操作。

【问题讨论】:

    标签: swift clang lldb read-eval-print-loop


    【解决方案1】:

    swift 编译器接受 -parseable-output 标志,它会生成包含错误的结构化输出。例如,如果wrong.swift 包含您示例的内容,我会看到:

     > swiftc -g -Onone -parseable-output wrong.swift
    1149
    {
      "kind": "began",
      "name": "compile",
      "command": "\/Applications\/Xcode.app\/Contents\/Developer\/Toolchains\/XcodeDefault.xctoolchain\/usr\/bin\/swift -frontend -c -primary-file wrong.swift -target x86_64-apple-macosx10.9 -enable-objc-interop -sdk \/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/MacOSX.platform\/Developer\/SDKs\/MacOSX10.13.sdk -g -emit-module-doc-path \/var\/folders\/zc\/dp8ptx_10pg8m6pnwpbnjms00000gp\/T\/wrong-bc5f07.swiftdoc -color-diagnostics -Onone -module-name wrong -emit-module-path \/var\/folders\/zc\/dp8ptx_10pg8m6pnwpbnjms00000gp\/T\/wrong-bc5f07.swiftmodule -o \/var\/folders\/zc\/dp8ptx_10pg8m6pnwpbnjms00000gp\/T\/wrong-bc5f07.o",
      "inputs": [
        "wrong.swift"
      ],
      "outputs": [
        {
          "type": "object",
          "path": "\/var\/folders\/zc\/dp8ptx_10pg8m6pnwpbnjms00000gp\/T\/wrong-bc5f07.o"
        },
        {
          "type": "swiftmodule",
          "path": "\/var\/folders\/zc\/dp8ptx_10pg8m6pnwpbnjms00000gp\/T\/wrong-bc5f07.swiftmodule"
        },
        {
          "type": "swiftdoc",
          "path": "\/var\/folders\/zc\/dp8ptx_10pg8m6pnwpbnjms00000gp\/T\/wrong-bc5f07.swiftdoc"
        }
      ],
      "pid": 33440
    }
    306
    {
      "kind": "finished",
      "name": "compile",
      "pid": 33440,
      "output": "\u001B[1mwrong.swift:1:21: \u001B[0;1;31merror: \u001B[0m\u001B[1mcannot convert value of type 'Int' to specified type 'String'\n\u001B[0mvar name : String = 12\n\u001B[0;1;32m                    ^~\n\u001B[0m",
      "exit-status": 1
    }
    

    然而,虽然 REPL 使用 swift 编译器实例来解析您的表达式,但它没有办法接受并将“额外标志”传递给该编译器,所以目前我认为没有任何方法可以得到REPL 以这种形式发出错误。

    如果您对此功能感兴趣,请向 swift.org JIRA 提交增强请求。如果您喜欢冒险,您甚至可以尝试自己添加。您必须让 swift 驱动程序将此选项传递给 lldb,然后让 lldb 解析并将其传递给其编译器。可能还必须仅从输出中提取错误,否则会太嘈杂。

    【讨论】:

    • 这是很棒的信息。我得出了同样的结论,现在得到了证实。你认为我可以编写一个 Python 脚本来使用 LLDB,还是我确实需要扩展 Swift 源代码?
    • 您可以使用 lldb Python API 从编译中获取错误,但它们将是非结构化形式。你说你不想手动解析它们,所以如果你想使用 Swift 编译器生成的结构化形式,你必须教 lldb 如何生成它们。
    猜你喜欢
    • 1970-01-01
    • 2020-05-02
    • 2017-06-07
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 2017-02-23
    • 1970-01-01
    相关资源
    最近更新 更多