如何以 JSON 格式获取 Swift REPL 编译器错误
How can I grab the Swift REPL compiler errors in JSON format
我希望从 Swift REPL 中以可读格式(例如 JSON 或 XML
抓取 Swift 编译器错误
我能做的最好的事情就是通过标准 in/out 管道将其作为字符串读入。我几乎用 swiftc
尝试了每一个 argument/option,但没有成功。
我读到我可以编写 Python 扩展 LLDB 的脚本,但我不知道从哪里开始。
当前格式为:
/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'"
}
我不想使用 Regex/String 操纵。
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 编译器实例来解析您的表达式,但它没有办法接受 "extra flags" 并将其传递给该编译器,所以目前我不不认为有任何方法可以让 REPL 以这种形式发出错误。
如果您对此功能感兴趣,请向 swift.org JIRA 提交增强请求。如果你喜欢冒险,你甚至可以尝试自己添加。你必须让 swift 驱动程序将这个选项传递给 lldb,然后让 lldb 解析并将它传递给它的编译器。可能还必须仅从输出中提取错误,否则噪音太大。
我希望从 Swift REPL 中以可读格式(例如 JSON 或 XML
抓取 Swift 编译器错误我能做的最好的事情就是通过标准 in/out 管道将其作为字符串读入。我几乎用 swiftc
尝试了每一个 argument/option,但没有成功。
我读到我可以编写 Python 扩展 LLDB 的脚本,但我不知道从哪里开始。
当前格式为:
/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'"
}
我不想使用 Regex/String 操纵。
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 编译器实例来解析您的表达式,但它没有办法接受 "extra flags" 并将其传递给该编译器,所以目前我不不认为有任何方法可以让 REPL 以这种形式发出错误。
如果您对此功能感兴趣,请向 swift.org JIRA 提交增强请求。如果你喜欢冒险,你甚至可以尝试自己添加。你必须让 swift 驱动程序将这个选项传递给 lldb,然后让 lldb 解析并将它传递给它的编译器。可能还必须仅从输出中提取错误,否则噪音太大。