mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
71 lines
1.5 KiB
Ruby
71 lines
1.5 KiB
Ruby
|
# 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
|