2017-11-17 42 views
1

표준 in/out 파이프를 통해 String으로. 거의 모든 인수/옵션을 행운과 함께 swiftc으로 시도했습니다.어떻게 JSON 형식으로 스위프트 REPL 컴파일러 오류를 잡을 수 있습니다 내가 할 수있는 최선은 그것을 읽어</p> <p>같은 JSON 또는 XML로 읽을 수있는 형식으로 스위프트 REPL에서 스위프트 컴파일러 오류를 잡아 찾고 있어요

필자는 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; 
           ^~ 

그러나 나는 이런 식으로 뭔가에 관심이있는 moreso 해요 :

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

내가 정규식/문자열 조작을 사용하지 않습니다.

답변

2

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이 식을 구문 분석에 대한 빠른 컴파일러 인스턴스를 사용하는 반면, 그것을 받아들이고 "추가 합격 할 수있는 방법이 없습니다 플래그 "컴파일러, 그래서 현재 REPL이이 형식으로 오류를 방출하는 방법이 있다고 생각하지 않습니다.

이 기능에 관심이 있으시면 swift.org JIRA로 개선 요청을 보내주십시오. 모험이라면 직접 추가 할 수도 있습니다. 이 옵션을 lldb에 전달하고 lldb를 파싱하여 컴파일러에 전달하려면 신속한 드라이버를 얻어야합니다. 아마도 또한 출력에서만 오류를 추출해야하거나 너무 시끄 럽습니다.

+0

좋은 정보입니다. 나는 똑같은 결론에 도달했고 이제는 확증된다. LLDB를 사용하기 위해 Python 스크립트를 작성할 수 있다고 생각하십니까? 아니면 Swift 소스 코드를 확실히 확장해야합니까? – firedev

+1

lldb Python API를 사용하여 컴파일 오류를 얻을 수는 있지만 구조화되지 않은 양식이 될 수 있습니다. Swift 컴파일러가 생성 한 구조화 된 형식을 사용하려면 lldb에 생성 방법을 가르쳐야합니다. –