Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 32 additions & 34 deletions src/compiler/crystal/syntax/lexer.cr
Original file line number Diff line number Diff line change
Expand Up @@ -1953,43 +1953,41 @@ module Crystal
next
end
else
if !delimiter_state && whitespace && lookahead { char == 'y' && char_sequence?('i', 'e', 'l', 'd') && !ident_part_or_end?(peek_next_char) }
yields = true
char = current_char
whitespace = true
beginning_of_line = false
elsif !delimiter_state && whitespace && (keyword = lookahead { macro_starts_with_keyword?(beginning_of_line) })
char = current_char

nest += 1 unless keyword.abstract_def?
whitespace = true
beginning_of_line = false
next
else
char = current_char

if delimiter_state
case char
when delimiter_state.end
if delimiter_state.open_count == 0
delimiter_state = nil
else
delimiter_state = delimiter_state.with_open_count_delta(-1)
end
when delimiter_state.nest
delimiter_state = delimiter_state.with_open_count_delta(+1)
if delimiter_state
case char
when delimiter_state.end
if delimiter_state.open_count == 0
delimiter_state = nil
else
delimiter_state = delimiter_state.with_open_count_delta(-1)
end
when delimiter_state.nest
delimiter_state = delimiter_state.with_open_count_delta(+1)
end
elsif whitespace
if lookahead { char == 'y' && char_sequence?('i', 'e', 'l', 'd') && !ident_part_or_end?(peek_next_char) }
yields = true
char = current_char
whitespace = true
beginning_of_line = false
elsif keyword = lookahead { macro_starts_with_keyword?(beginning_of_line) }
char = current_char

# If an assignment comes, we accept if/unless/while/until as nesting
if char == '=' && peek_next_char.ascii_whitespace?
whitespace = false
beginning_of_line = true
else
whitespace = char.ascii_whitespace? || char.in?(';', '(', '[', '{')
if beginning_of_line && !whitespace
beginning_of_line = false
end
nest += 1 unless keyword.abstract_def?
whitespace = true
beginning_of_line = false
next
end
end

# If an assignment comes, we accept if/unless/while/until as nesting
if char == '=' && peek_next_char.ascii_whitespace?
whitespace = false
beginning_of_line = true
else
whitespace = char.ascii_whitespace? || char.in?(';', '(', '[', '{')
if beginning_of_line && !whitespace
beginning_of_line = false
end
end
end
Expand Down
Loading