class SyntaxSuggest::ExplainSyntax
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 ripper is run against the input and the raw ripper errors 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"
Constants
- INVERSE
Public Class Methods
new(code_lines:)
click to toggle source
# File lib/syntax_suggest/explain_syntax.rb, line 40 def initialize(code_lines:) @code_lines = code_lines @left_right = LeftRightLexCount.new @missing = nil end
Public Instance Methods
call()
click to toggle source
# File lib/syntax_suggest/explain_syntax.rb, line 46 def call @code_lines.each do |line| line.lex.each do |lex| @left_right.count_lex(lex) end end self end
errors()
click to toggle source
Returns an array of syntax error messages
If no missing pairs are found it falls back on the original ripper error messages
# File lib/syntax_suggest/explain_syntax.rb, line 95 def errors if missing.empty? return RipperErrors.new(@code_lines.map(&:original).join).call.errors end missing.map { |miss| why(miss) } end
missing()
click to toggle source
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
# File lib/syntax_suggest/explain_syntax.rb, line 65 def missing @missing ||= @left_right.missing end
why(miss)
click to toggle source
Converts a missing string to an human understandable explanation.
Example:
explain.why("}") # => "Unmatched `{', missing `}' ?"
# File lib/syntax_suggest/explain_syntax.rb, line 77 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