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