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
No documentation available
Class Methods
lib/syntax_suggest/explain_syntax.rb
View on GitHub
# File tmp/rubies/ruby-3.2.0/lib/syntax_suggest/explain_syntax.rb, line 40
def initialize(code_lines:)
@code_lines = code_lines
@left_right = LeftRightLexCount.new
@missing = nil
end
No documentation available
Instance Methods
#
lib/syntax_suggest/explain_syntax.rb
View on GitHub
# File tmp/rubies/ruby-3.2.0/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
No documentation available
#
lib/syntax_suggest/explain_syntax.rb
View on GitHub
# File tmp/rubies/ruby-3.2.0/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
Returns an array of syntax error messages
If no missing pairs are found it falls back on the original ripper error messages
#
lib/syntax_suggest/explain_syntax.rb
View on GitHub
# File tmp/rubies/ruby-3.2.0/lib/syntax_suggest/explain_syntax.rb, line 65
def missing
@missing ||= @left_right.missing
end
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
lib/syntax_suggest/explain_syntax.rb
View on GitHub
# File tmp/rubies/ruby-3.2.0/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
Converts a missing string to an human understandable explanation.
Example:
explain.why("}") # => "Unmatched `{', missing `}' ?"