Crystal 工具
Crystal 編譯器做了很多工作,以允許程式設計師更具表達力、生產力,並且……更懶惰。
自 0.7.7 版本以來,編譯器帶有一些初始工具,可以幫助程式設計師了解編譯器從程式碼中理解的內容,並以更有趣的方式導覽。
跳至實作工具
在編譯方法呼叫時,編譯器確切知道將呼叫哪個方法定義。但是,當程式設計師正在檢視原始程式碼時,除了字串搜尋之外,沒有其他方法可以找到方法定義。
專案越大,就越難找到定義。
因此,如果你的 *program.cr* 有以下程式碼
def add(a, b)
a + b
end
add(1, 2)
$ crystal tool implementations --cursor program.cr:5:1 program.cr 1 implementation found /path/to/program.cr:1:1
你可以傳遞 --format json
以產生電腦友好的輸出,並建立一些東西將其整合到你最喜歡的文字編輯器中。這在 crystal-tools atom 套件中使用,而且看起來很棒。每個位置都是可點擊的。
如果你使用 Atom,請下載它們,然後當你的游標停在第 5 行的 add
上時,只需按下 ⌘⌥i
/ ctrl-alt-i
。
多重實作
此工具不僅可以讓你避免 def foo
與 def self.foo
字串匹配的混亂,還會指出方法呼叫的真正候選者。
class A
def foo
end
end
class B
def foo
end
end
def use_foo(o)
o.foo # put the cursor in this #foo call
end
use_foo(A.new)
use_foo(B.new) # if removed, line 7 won't be an implementation of line 12
深入巨集
一個程式碼片段勝過千言萬語。
class Person
property name
end
p = Person.new
p.name = "John" # put the cursor in over #name= call
$ crystal tool implementations --cursor program.cr:6:6 program.cr 1 implementation found /path/to/program.cr:2:3 ~> macro property: /path/to/crystal-src/object.cr:365:5 ~> macro setter: /path/to/crystal-src/object.cr:324:9
而且你知道 *object.cr* 看起來像什麼嗎?
class Object
# ...
macro setter(*names){% for name in names %}
{%- if name.is_a?(DeclareVar) %}
def {{name.var.id}}=(@{{name.var.id}} : {{name.type}}) # line 324
end
{%- else %}
def {{name.id}}=(@{{name.id}})
end
{%- end %}
{%- end %}
end
# ...
macro property(*names)
getter {{*names}}
setter {{*names}} # line 365
end
# ...
end
我喜歡這個!
顯示內容工具
另一個有用的工具可以幫助你避免使用 pp var
或 pp typeof(var)
執行的所有程式碼,它是內容工具。只需將游標放在某個位置,按下 ⌘⌥c
/ ctrl-alt-c
,你將看到所有變數類型資訊。
就像之前的工具一樣,程式本身永遠不會執行。顯示的所有資訊都來自產生二進位檔的相同建置流程。
該工具可以透過命令列方式使用。
a = "a string"
b = 1
$ crystal tool context --cursor program.cr:3:1 program.cr 1 possible context found | Expr | Type | ----------------- | a | String | | b | Int32 |
看看 def
持有的所有多載是很有趣的。
最終注意事項
正在開發中
這還在開發中 :-) 。我們想要更多的工具,並使它們足夠健壯以供所有人使用。我們認為它們已足夠準備好讓你享受它們,並幫助我們使它們變得更好。
下一步
crystal-tools atom 套件可能會獲得 crystal spec
支援,因此從編輯器執行單一檔案/單一規格會更容易。
另一個所需的工具是取得給定方法的所有呼叫者。這有點像是實作的雙重工具,可以回答問題:「誰在使用這段程式碼?」
綠色編譯狀態是必要條件
由於這些工具建立在 Crystal 編譯器之上,並具有所有型別推論和編譯器階段,如果程式碼無法編譯,你將無法執行任何工具。
主程式
此處呈現的所有範例都是單一檔案中的程式,但這些工具適用於較大的專案。為此,這些工具需要知道要編譯的主檔案。這是命令的最後一個參數。--cursor
參數指定文字游標在編輯器中的位置。
對於單一檔案程式,主程式就是它。對於較大的程式,則沒那麼容易。身為開發人員,你將知道要編譯哪個檔案。
crystal-tools atom 套件將使用所有規格作為主程式。如果這不是你需要的,你可以從設定頁面變更要編譯的檔案以及其他事項。
...邁向更好的 Crystal 程式設計體驗。❤