For more, please visit my GitHub repo: github.com/kingcos/Per…html
做者 | 發表時間 | 原文連接 |
---|---|---|
JP Simard | 20140706 | www.jpsim.com/uncovering-… |
爲了支持一門奇特的新編程語言(譯者注:即 Swift),漂亮的實時 IDE 特性,以及使人印象深入的跨語言協同性(譯者注:即 Swift 與 Obj-C),Apple 不得不開發一些新的底層工具。這裏咱們將專一於 SourceKit,Xcode 背後的功臣。ios
SourceKit 是一套工具集,使得大多數 Swift 源代碼層面的操做特性得以支持,例如源代碼解析、語法高亮、排版(typesetting)、自動補全、跨語言頭文件生成,等等。git
傳統上,Xcode 在運行時跑着其編譯器(Clang),即意味着編譯器將可能在任什麼時候候崩潰,IDE 一樣。github
更有甚者,Xcode 容易喚起編譯器進行成千上萬次解析、高亮、以及排版源代碼,全部這一切都在用戶鍵入「⌘ + B」以前。這是由於不像大多數編輯器(Vim/Sublime/...),Xcode 並不使用正則表達式解析源代碼,而是使用 Clang 強大的(也更加複雜的)解析器(parser)和標記器(tokenizer)。正則表達式
慶幸的是,Xcode 6 中的 Swift 移除了該特性1,合併全部源代碼操做特性至一個獨立的進程,並和 Xcode 經過 XPC 交流:sourcekitd
。不管 Xcode 6 什麼時候加載任何 Swift 代碼,該 XPC 守護進程將被啓動。macos
由於 SourceKit 是一個私有且無文檔的工具,咱們須要得到一些小點子來學習如何使用它。經過設定 SOURCEKIT_LOGGING
2 環境變量,Xcode 將記錄 SourceKit 與 stdout
間的通訊,容許咱們觀察到它們的實時通訊。這就是如何發現本文中的許多命令。編程
SourceKit 藉助 Clang 中稱做 USR(Unified Symbol Resolution,即統一符號解析)的特性,爲源代碼令牌(token,例如類,屬性,方法等)對應一個惟一標識符。這使得你可使用 「⌘ + 點擊」Xcode 編輯器中任何一處令牌,便可以導航至其定義處。USR 如今甚至更增強大了,能夠跨語言(Swift/Obj-C)統一一個表明。swift
爲了從一個 Swift 文件(以及其位置)中打印 USR,你能夠運行如下命令:xcode
$ xcrun swift-ide-test -print-usrs -source-filename=Musician.swift
10:7 s:C14swift_ide_test8Musician
14:9 s:vC14swift_ide_test8Musician4nameSS
19:9 s:vC14swift_ide_test8Musician9birthyearSu
33:5 s:FC14swift_ide_test8MusiciancFMS0_FT4nameSS9birthyearSu_S0_
33:10 s:vFC14swift_ide_test8MusiciancFMS0_FT4nameSS9birthyearSu_S0_L_4nameSS
33:24 s:vFC14swift_ide_test8MusiciancFMS0_FT4nameSS9birthyearSu_S0_L_9birthyearSu
34:9 s:vFC14swift_ide_test8MusiciancFMS0_FT4nameSS9birthyearSu_S0_L_4selfS0_
34:21 s:vFC14swift_ide_test8MusiciancFMS0_FT4nameSS9birthyearSu_S0_L_4nameSS
35:9 s:vFC14swift_ide_test8MusiciancFMS0_FT4nameSS9birthyearSu_S0_L_4selfS0_
35:26 s:vFC14swift_ide_test8MusiciancFMS0_FT4nameSS9birthyearSu_S0_L_9birthyearSu
複製代碼
在 Swift 中使用「⌘ + 點擊」一個定義在 Obj-C 中令牌,Xcode 將會觸發生成一個類 Swift 頭文件。稱其爲類 Swift 是由於該生成的文件並不是有效的 Swift3,但至少顯示了等效於 Obj-C 令牌的 Swift 語法。bash
主要有 3 個命令行工具容許和 SourceKit 交互:sourcekitd-test
,swift-ide-test
,以及 swift
。
筆者編譯了一個帶有文檔的 Shell 腳本,其運行了許多有用的命令,例如:語法高亮,接口生成,AST 解析,還原(demangling)等。
該腳本可在 GitHub 中得到:GitHub Gist。
由於 SourceKit 獨立於 Xcode 以外,使其能夠利用以構建從 Swift IDE 到文檔生成器等任何東西。
jazzy 是一個命令行工具,能夠爲你的 Swift 或 Obj-C 項目生成文檔。其利用 SourceKit 以得到從 Obj-C 定義令牌(例如類,屬性,方法等)的 Swift 語法。
SwiftEdit 是一款支持 Swift 文件語法高亮的概念型編輯器。
咱們剛剛初探了使用 SourceKit 的可能。這些工具能夠作出來處理跨語言代碼覆蓋,或者提供支持 Swift 和 Obj-C 同時編輯的編輯器。但願本文能啓發你利用 SourceKit 開發一些什麼,並在這過程當中改善咱們的工具。
export SOURCEKIT_LOGGING=3 && /Applications/Xcode6-Beta2.app/Contents/MacOS/Xcode
。