Skip to content

Commit

Permalink
Merge branch 'release/0.18'
Browse files Browse the repository at this point in the history
Ary Borenszweig committed Jun 28, 2016

Verified

This commit was signed with the committer’s verified signature.
headius Charles Oliver Nutter
2 parents 152a1d7 + 7d08afc commit 089dd53
Showing 2 changed files with 48 additions and 17 deletions.
4 changes: 4 additions & 0 deletions spec/compiler/formatter/formatter_spec.cr
Original file line number Diff line number Diff line change
@@ -884,6 +884,10 @@ describe Crystal::Formatter do
assert_format "foo.as(T).bar"
assert_format "foo &.as(T)"
assert_format "foo &.bar.as(T)"
assert_format "foo &.as(T).bar"
assert_format "foo &.as?(T).bar"
assert_format "foo &.is_a?(T).bar"
assert_format "foo &.responds_to?(:foo).bar"

assert_format "foo.as? ( Int32* )", "foo.as?(Int32*)"
assert_format "foo.as? Int32*", "foo.as? Int32*"
61 changes: 44 additions & 17 deletions src/compiler/crystal/tools/formatter.cr
Original file line number Diff line number Diff line change
@@ -2397,7 +2397,7 @@ module Crystal
case body
when Call
call = body
clear_obj call
clear_object call

if !call.obj && (call.name == "[]" || call.name == "[]?")
case @token.type
@@ -2501,13 +2501,29 @@ module Crystal
clear_object(node.obj)
end
when IsA
clear_object(node.obj)
if node.obj.is_a?(Var)
node.obj = Nop.new
else
clear_object(node.obj)
end
when RespondsTo
clear_object(node.obj)
if node.obj.is_a?(Var)
node.obj = Nop.new
else
clear_object(node.obj)
end
when Cast
clear_object(node.obj)
if node.obj.is_a?(Var)
node.obj = Nop.new
else
clear_object(node.obj)
end
when NilableCast
clear_object(node.obj)
if node.obj.is_a?(Var)
node.obj = Nop.new
else
clear_object(node.obj)
end
end
end

@@ -2618,9 +2634,11 @@ module Crystal
end

def format_special_call(node, keyword)
accept node.obj
skip_space_or_newline
write_token :"."
unless node.obj.is_a?(Nop)
accept node.obj
skip_space_or_newline
write_token :"."
end
skip_space_or_newline
write_keyword keyword
skip_space_or_newline
@@ -3119,6 +3137,15 @@ module Crystal
end

def visit(node : Cast)
# This is for the case `&.as(...)`
if node.obj.is_a?(Nop)
write_keyword :as
write_token :"("
accept node.to
write_token :")"
return false
end

accept node.obj
skip_space
if @token.type == :"."
@@ -3149,6 +3176,15 @@ module Crystal
end

def visit(node : NilableCast)
# This is for the case `&.as?(...)`
if node.obj.is_a?(Nop)
write_keyword :as?
write_token :"("
accept node.to
write_token :")"
return false
end

accept node.obj
skip_space
check :"."
@@ -3968,15 +4004,6 @@ module Crystal
count.times { increment_line }
end

def clear_obj(call)
obj = call.obj
if obj.is_a?(Call)
clear_obj obj
else
call.obj = nil
end
end

def finish
skip_space
write_line

0 comments on commit 089dd53

Please sign in to comment.