1. SyntaxSuggest::
  2. ExplainSyntax

class SyntaxSuggest::ExplainSyntax

Explains syntax errors based on their source

example:

source ="def foo; puts 'lol'"# Note missing endexplainExplainSyntax.new(code_lines:CodeLine.from_source(source)).callexplain.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 numberexplainExplainSyntax.new(code_lines:CodeLine.from_source(source)).callexplain.errors.first# => "syntax error, unexpected end-of-input"

Constants

INVERSE

Public Class Methods

Source
# File lib/syntax_suggest/explain_syntax.rb, line 54definitialize(code_lines:)@code_lines =code_lines@left_right =LeftRightLexCount.new@missing =nilend

Public Instance Methods

Source
# File lib/syntax_suggest/explain_syntax.rb, line 60defcall@code_lines.eachdo|line|line.lex.eachdo|lex|@left_right.count_lex(lex)endendselfend
Source
# File lib/syntax_suggest/explain_syntax.rb, line 109deferrorsifmissing.empty?returnGetParseErrors.errors(@code_lines.map(&:original).join).uniqendmissing.map {|miss|why(miss) }end

Returns an array of syntax error messages

If no missing pairs are found it falls back on the original error messages

Source
# File lib/syntax_suggest/explain_syntax.rb, line 79defmissing@missing||=@left_right.missingend

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

Source
# File lib/syntax_suggest/explain_syntax.rb, line 91defwhy(miss)casemisswhen"keyword""Unmatched `end', missing keyword (`do', `def`, `if`, etc.) ?"when"end""Unmatched keyword, missing `end' ?"elseinverse =INVERSE.fetch(miss) {raise"Unknown explain syntax char or key: #{miss.inspect}"    }"Unmatched `#{inverse}', missing `#{miss}' ?"endend

Converts a missing string to an human understandable explanation.

Example:

explain.why("}")# => "Unmatched `{', missing `}' ?"