diff --git a/src/compiler/crystal/syntax/lexer.cr b/src/compiler/crystal/syntax/lexer.cr index 21c3ab42c804..0f60e555cdac 100644 --- a/src/compiler/crystal/syntax/lexer.cr +++ b/src/compiler/crystal/syntax/lexer.cr @@ -2813,6 +2813,13 @@ module Crystal next_token.tap { @wants_symbol = true } end + def wants_def_or_macro_name(& : ->) + @wants_def_or_macro_name = true + yield + ensure + @wants_def_or_macro_name = false + end + def current_char @reader.current_char end diff --git a/src/compiler/crystal/syntax/parser.cr b/src/compiler/crystal/syntax/parser.cr index 3185fdee6fdc..a9454c73a11c 100644 --- a/src/compiler/crystal/syntax/parser.cr +++ b/src/compiler/crystal/syntax/parser.cr @@ -682,9 +682,9 @@ module Crystal @wants_regex = false - @wants_def_or_macro_name = true - next_token_skip_space_or_newline - @wants_def_or_macro_name = false + wants_def_or_macro_name do + next_token_skip_space_or_newline + end if @token.type.instance_var? ivar_name = @token.value.to_s @@ -6204,10 +6204,10 @@ module Crystal # cases like: def `, def /, def // # that in regular statements states for delimiters # here must be treated as method names. - @wants_def_or_macro_name = true - next_token_skip_space_or_newline - check DefOrMacroCheck1 - @wants_def_or_macro_name = false + wants_def_or_macro_name do + next_token_skip_space_or_newline + check DefOrMacroCheck1 + end @token.to_s end diff --git a/src/compiler/crystal/tools/formatter.cr b/src/compiler/crystal/tools/formatter.cr index 0d7a6115ca71..17c87168414d 100644 --- a/src/compiler/crystal/tools/formatter.cr +++ b/src/compiler/crystal/tools/formatter.cr @@ -1464,9 +1464,9 @@ module Crystal write_token :OP_PERIOD end - @lexer.wants_def_or_macro_name = true - skip_space_or_newline - @lexer.wants_def_or_macro_name = false + @lexer.wants_def_or_macro_name do + skip_space_or_newline + end write node.name @@ -2671,10 +2671,11 @@ module Crystal return false end - @lexer.wants_def_or_macro_name = true - next_token - @lexer.wants_def_or_macro_name = false + @lexer.wants_def_or_macro_name do + next_token + end skip_space + if (@token.type.newline?) || @wrote_newline base_indent = @indent + 2 indent(base_indent) { consume_newlines } @@ -3106,9 +3107,9 @@ module Crystal write_token :OP_AMP skip_space_or_newline write "." - @lexer.wants_def_or_macro_name = true - next_token_skip_space_or_newline - @lexer.wants_def_or_macro_name = false + @lexer.wants_def_or_macro_name do + next_token_skip_space_or_newline + end body = node.body case body