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 `}' ?"