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
来生成计算机友好的输出,并构建一些东西将其集成到您喜欢的文本编辑器中。这在 then 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 编程体验。❤