Class: SyntaxSuggest::LeftRightTokenCount

Inherits:
Object
  • Object
show all
Defined in:
lib/syntax_suggest/left_right_token_count.rb

Overview

Find mis-matched syntax based on lexical count

Used for detecting missing pairs of elements each keyword needs an end, each ‘needs a ‘’ etc.

Example:

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

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

Constant Summary collapse

PAIRS =
{
  "{" => "}",
  "[" => "]",
  "(" => ")"
}.freeze

Instance Method Summary collapse

Constructor Details

#initializeLeftRightTokenCount

Returns a new instance of LeftRightTokenCount.



25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/syntax_suggest/left_right_token_count.rb', line 25

def initialize
  @kw_count = 0
  @end_count = 0

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

Instance Method Details

#count_endObject



44
45
46
# File 'lib/syntax_suggest/left_right_token_count.rb', line 44

def count_end
  @end_count += 1
end

#count_for_char(char) ⇒ Object



95
96
97
# File 'lib/syntax_suggest/left_right_token_count.rb', line 95

def count_for_char(char)
  @count_for_char[char]
end

#count_kwObject



40
41
42
# File 'lib/syntax_suggest/left_right_token_count.rb', line 40

def count_kw
  @kw_count += 1
end

#count_token(token) ⇒ Object

Count source code characters

Example:

token = CodeLine.from_source("{").first.tokens.first
left_right = LeftRightTokenCount.new
left_right.count_token(Token.new(token)
left_right.count_for_char("{")
# => 1
left_right.count_for_char("}")
# => 0


59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/syntax_suggest/left_right_token_count.rb', line 59

def count_token(token)
  case token.type
  when :STRING_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 :PERCENT_UPPER_W, :PERCENT_UPPER_I, :PERCENT_LOWER_W,
       :PERCENT_LOWER_I, :REGEXP_BEGIN, :STRING_BEGIN
    # ^^^
    # 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 = token.value[-1]
    @count_for_char[char] += 1 if @count_for_char.key?(char)
  when :EMBEXPR_BEGIN
    # ^^^
    # Embedded string expressions like `"#{foo} <-embed"`
    # are parsed with chars:
    #
    # `#{` as :EMBEXPR_BEGIN
    #  `}` as :EMBEXPR_END
    #
    # When we see `#{` count it as a `{` or we will
    # have a mis-match count.
    #
    @count_for_char["{"] += 1
  else
    @end_count += 1 if token.is_end?
    @kw_count += 1 if token.is_kw?
    @count_for_char[token.value] += 1 if @count_for_char.key?(token.value)
  end
end

#missingObject

Returns an array of missing syntax characters or ‘“end”` or `“keyword”`

left_right.missing
# => ["}"]


104
105
106
107
108
109
110
# File 'lib/syntax_suggest/left_right_token_count.rb', line 104

def missing
  out = missing_pairs
  out << missing_pipe
  out << missing_keyword_end
  out.compact!
  out
end