Class: SyntaxSuggest::ExplainSyntax
- Inherits:
-
Object
- Object
- SyntaxSuggest::ExplainSyntax
- Defined in:
- lib/syntax_suggest/explain_syntax.rb
Overview
Explains syntax errors based on their source
example:
source = "def foo; puts 'lol'" # Note missing end
explain ExplainSyntax.new(
code_lines: CodeLine.from_source(source)
).call
explain.errors.first
# => "Unmatched keyword, missing `end' ?"
When the error cannot be determined by lexical counting then the parser is run against the input and the raw errors are returned.
Example:
source = "1 * " # Note missing a second number
explain ExplainSyntax.new(
code_lines: CodeLine.from_source(source)
).call
explain.errors.first
# => "syntax error, unexpected end-of-input"
Constant Summary collapse
- INVERSE =
{ "{" => "}", "}" => "{", "[" => "]", "]" => "[", "(" => ")", ")" => "(", "|" => "|" }.freeze
Instance Method Summary collapse
- #call ⇒ Object
-
#errors ⇒ Object
Returns an array of syntax error messages.
-
#initialize(code_lines:) ⇒ ExplainSyntax
constructor
A new instance of ExplainSyntax.
-
#missing ⇒ Object
Returns an array of missing elements.
-
#why(miss) ⇒ Object
Converts a missing string to an human understandable explanation.
Constructor Details
#initialize(code_lines:) ⇒ ExplainSyntax
Returns a new instance of ExplainSyntax.
54 55 56 57 58 |
# File 'lib/syntax_suggest/explain_syntax.rb', line 54 def initialize(code_lines:) @code_lines = code_lines @left_right = LeftRightLexCount.new @missing = nil end |
Instance Method Details
#call ⇒ Object
60 61 62 63 64 65 66 67 68 |
# File 'lib/syntax_suggest/explain_syntax.rb', line 60 def call @code_lines.each do |line| line.lex.each do |lex| @left_right.count_lex(lex) end end self end |
#errors ⇒ Object
Returns an array of syntax error messages
If no missing pairs are found it falls back on the original error messages
109 110 111 112 113 114 115 |
# File 'lib/syntax_suggest/explain_syntax.rb', line 109 def errors if missing.empty? return GetParseErrors.errors(@code_lines.map(&:original).join).uniq end missing.map { |miss| why(miss) } end |
#missing ⇒ Object
Returns an array of missing elements
For example this:
ExplainSyntax.new(code_lines: lines).missing
# => ["}"]
Would indicate that the source is missing a ‘}` character in the source code
79 80 81 |
# File 'lib/syntax_suggest/explain_syntax.rb', line 79 def missing @missing ||= @left_right.missing end |
#why(miss) ⇒ Object
Converts a missing string to an human understandable explanation.
Example:
explain.why("}")
# => "Unmatched `{', missing `}' ?"
91 92 93 94 95 96 97 98 99 100 101 102 103 |
# File 'lib/syntax_suggest/explain_syntax.rb', line 91 def why(miss) case miss when "keyword" "Unmatched `end', missing keyword (`do', `def`, `if`, etc.) ?" when "end" "Unmatched keyword, missing `end' ?" else inverse = INVERSE.fetch(miss) { raise "Unknown explain syntax char or key: #{miss.inspect}" } "Unmatched `#{inverse}', missing `#{miss}' ?" end end |