Crystal Code Formatter: What Does It Do?
Crystal code formatter comes with 0.9.0 release. It is a tool for automatically checking and correcting the style of code in a project. Like Ruby, Crystal does not force styling in format, but following a specific way of formatting code will make your project more accessible to others.
Run Formatter
Currently the you can run the following command in a Crystal project to initiate the formatter.
crystal tool format
It checks for all .cr
file and changing the format. All files will be altered and saved, so remember to commit everything (or make them revertible) before you run this command.
What It Does
The following formats will be corrected with the formatter. Not all examples are included here.
Indentaion is always two spaces
All nested indentation is two spaces.
def foo
"bar"
end
Tabs, and any number of spaces other than two will be altered.
Spaces between operators, commas, and comments
a+b # => a + b
hash[a+b] # => hash[a + b]
array.inject(0){|r,v|r+=1} # => array.inject(0) { |r, v| r += 1 }
#todo # => # todo
Extra spaces will be removed if there are more than one space.
No parentheses for methods with no arguments
foo() # => foo
def foo() # => def foo
Many developers from C, Java, or JavaScript tend to write functions with parentheses; however, Crystal prefers no parentheses in such cases.
Arguments in method definitions should be surrounded with parantheses
def foo val : Bool
end
# should be
def foo(val : Bool)
end
I believe this one is very important with type restrictions, since type restrictions without parentheses can either be the type of arguments or of returned types. It will not be misunderstood by the programs, but might be a little confusing to readers.
Removing extra spaces between code and comments
The following
foo # => "bar"
will turn into:
foo # => "bar"
However, it won't remove the spaces if it's for alignment like:
foo # => "bar"
foobar # => "foobar"
Furthermore, it aligns the code and comments for you. Sweet, isn't it :)
Extra line between class property and methods
The following
class Foo
property bar
def foobar
will turn into:
class Foo
property bar
def foobar
Extra space in documenting code
If we document method foo
we might do this:
foo #=> "bar"
But Crystal prefers a space between the sharp sign and the equal sign:
foo # => "bar"
Also...
There's an alternative for Sublime Text users to use this feature with Crystal package, instead of running commands in terminal. I believe plugins in other editors will include this feature soon.
I'm really glad that Crystal has released a tool as a reference for all Crystal developers. It helps projects more accessible for others, which also helps Crystal to be production-ready quickly.