跳至內容
GitHub 儲存庫 論壇 RSS 新聞提要

Crystal 工具

Brian J. Cardiff

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 foodef 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 varpp 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 程式設計體驗。❤