From 490af8dbdb66263f29d0b4e43752fbb298b94862 Mon Sep 17 00:00:00 2001 From: schneems Date: Tue, 26 Jul 2022 15:21:09 -0500 Subject: Sync SyntaxSuggest ``` $ tool/sync_default_gems.rb syntax_suggest ``` --- lib/syntax_suggest/lex_value.rb | 70 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 lib/syntax_suggest/lex_value.rb (limited to 'lib/syntax_suggest/lex_value.rb') diff --git a/lib/syntax_suggest/lex_value.rb b/lib/syntax_suggest/lex_value.rb new file mode 100644 index 0000000000..008cc105b5 --- /dev/null +++ b/lib/syntax_suggest/lex_value.rb @@ -0,0 +1,70 @@ +# frozen_string_literal: true + +module SyntaxSuggest + # Value object for accessing lex values + # + # This lex: + # + # [1, 0], :on_ident, "describe", CMDARG + # + # Would translate into: + # + # lex.line # => 1 + # lex.type # => :on_indent + # lex.token # => "describe" + class LexValue + attr_reader :line, :type, :token, :state + + def initialize(line, type, token, state, last_lex = nil) + @line = line + @type = type + @token = token + @state = state + + set_kw_end(last_lex) + end + + private def set_kw_end(last_lex) + @is_end = false + @is_kw = false + return if type != :on_kw + # + return if last_lex && last_lex.fname? # https://github.com/ruby/ruby/commit/776759e300e4659bb7468e2b97c8c2d4359a2953 + + case token + when "if", "unless", "while", "until" + # Only count if/unless when it's not a "trailing" if/unless + # https://github.com/ruby/ruby/blob/06b44f819eb7b5ede1ff69cecb25682b56a1d60c/lib/irb/ruby-lex.rb#L374-L375 + @is_kw = true unless expr_label? + when "def", "case", "for", "begin", "class", "module", "do" + @is_kw = true + when "end" + @is_end = true + end + end + + def fname? + state.allbits?(Ripper::EXPR_FNAME) + end + + def ignore_newline? + type == :on_ignored_nl + end + + def is_end? + @is_end + end + + def is_kw? + @is_kw + end + + def expr_beg? + state.anybits?(Ripper::EXPR_BEG) + end + + def expr_label? + state.allbits?(Ripper::EXPR_LABEL) + end + end +end -- cgit v1.2.1