類別 SyntaxSuggest::LeftRightLexCount

Find 根據詞彙計數找出語法不匹配

用於偵測缺少的元素配對,每個關鍵字需要一個結尾,每個「{」需要一個「}」等。

範例

left_right = LeftRightLexCount.new
left_right.count_kw
left_right.missing.first
# => "end"

left_right = LeftRightLexCount.new
source = "{ a: b, c: d" # Note missing '}'
LexAll.new(source: source).each do |lex|
  left_right.count_lex(lex)
end
left_right.missing.first
# => "}"

常數

PAIRS

公開類別方法

new() 按一下以切換來源
# File lib/syntax_suggest/left_right_lex_count.rb, line 25
def initialize
  @kw_count = 0
  @end_count = 0

  @count_for_char = {
    "{" => 0,
    "}" => 0,
    "[" => 0,
    "]" => 0,
    "(" => 0,
    ")" => 0,
    "|" => 0
  }
end

公開實例方法

count_end() 按一下以切換來源
# File lib/syntax_suggest/left_right_lex_count.rb, line 44
def count_end
  @end_count += 1
end
count_for_char(char) 按一下以切換來源
# File lib/syntax_suggest/left_right_lex_count.rb, line 101
def count_for_char(char)
  @count_for_char[char]
end
count_kw() 按一下以切換來源
# File lib/syntax_suggest/left_right_lex_count.rb, line 40
def count_kw
  @kw_count += 1
end
count_lex(lex) 按一下以切換來源

計算原始碼字元

範例

left_right = LeftRightLexCount.new
left_right.count_lex(LexValue.new(1, :on_lbrace, "{", Ripper::EXPR_BEG))
left_right.count_for_char("{")
# => 1
left_right.count_for_char("}")
# => 0
# File lib/syntax_suggest/left_right_lex_count.rb, line 58
def count_lex(lex)
  case lex.type
  when :on_tstring_content
    # ^^^
    # Means it's a string or a symbol `"{"` rather than being
    # part of a data structure (like a hash) `{ a: b }`
    # ignore it.
  when :on_words_beg, :on_symbos_beg, :on_qwords_beg,
       :on_qsymbols_beg, :on_regexp_beg, :on_tstring_beg
    # ^^^
    # Handle shorthand syntaxes like `%Q{ i am a string }`
    #
    # The start token will be the full thing `%Q{` but we
    # need to count it as if it's a `{`. Any token
    # can be used
    char = lex.token[-1]
    @count_for_char[char] += 1 if @count_for_char.key?(char)
  when :on_embexpr_beg
    # ^^^
    # Embedded string expressions like `"#{foo} <-embed"`
    # are parsed with chars:
    #
    # `#{` as :on_embexpr_beg
    #  `}` as :on_embexpr_end
    #
    # We cannot ignore both :on_emb_expr_beg and :on_embexpr_end
    # because sometimes the lexer thinks something is an embed
    # string end, when it is not like `lol = }` (no clue why).
    #
    # When we see `#{` count it as a `{` or we will
    # have a mis-match count.
    #
    case lex.token
    when "\#{"
      @count_for_char["{"] += 1
    end
  else
    @end_count += 1 if lex.is_end?
    @kw_count += 1 if lex.is_kw?
    @count_for_char[lex.token] += 1 if @count_for_char.key?(lex.token)
  end
end
missing() 按一下以切換來源

傳回缺少的語法字元或「“end”」或「“keyword”」陣列

left_right.missing
# => ["}"]
# File lib/syntax_suggest/left_right_lex_count.rb, line 110
def missing
  out = missing_pairs
  out << missing_pipe
  out << missing_keyword_end
  out.compact!
  out
end

非公開實例方法

missing_keyword_end() 按一下以切換來源

關鍵字需要結尾,結尾需要關鍵字

如果我們有更多關鍵字,則缺少「end」;如果我們有更多「end」,則缺少關鍵字

# File lib/syntax_suggest/left_right_lex_count.rb, line 148
        def missing_keyword_end
  case @kw_count <=> @end_count
  when 1
    "end"
  when 0
    nil
  when -1
    "keyword"
  end
end
missing_pairs() 按一下以切換來源

像「{」這樣的開啟字元需要像「}」這樣的關閉字元。

偵測到不匹配的計數時,建議缺少的成員。

例如,如果有 3 個「}」和只有兩個「{」,則傳回「“{”」

# File lib/syntax_suggest/left_right_lex_count.rb, line 131
        def missing_pairs
  PAIRS.map do |(left, right)|
    case @count_for_char[left] <=> @count_for_char[right]
    when 1
      right
    when 0
      nil
    when -1
      left
    end
  end
end
missing_pipe() 按一下以切換來源

管線成對出現。如果管線數量為奇數,表示我們遺失了一條

# File lib/syntax_suggest/left_right_lex_count.rb, line 162
        def missing_pipe
  if @count_for_char["|"].odd?
    "|"
  end
end