class RubyLex
def check_code_syntax(code)
def check_code_syntax(code) lvars_code = RubyLex.generate_local_variables_assign_code(@context.local_variables) code = "#{lvars_code}\n#{code}" begin # check if parser error are available verbose, $VERBOSE = $VERBOSE, nil case RUBY_ENGINE when 'ruby' self.class.compile_with_errors_suppressed(code) do |inner_code, line_no| RubyVM::InstructionSequence.compile(inner_code, nil, nil, line_no) end when 'jruby' JRuby.compile_ir(code) else catch(:valid) do eval("BEGIN { throw :valid, true }\n#{code}") false end end rescue EncodingError # This is for a hash with invalid encoding symbol, {"\xAE": 1} :unrecoverable_error rescue SyntaxError => e case e.message when /unterminated (?:string|regexp) meets end of file/ # "unterminated regexp meets end of file" # # example: # / # # "unterminated string meets end of file" # # example: # ' return :recoverable_error when /syntax error, unexpected end-of-input/ # "syntax error, unexpected end-of-input, expecting keyword_end" # # example: # if true # hoge # if false # fuga # end return :recoverable_error when /syntax error, unexpected keyword_end/ # "syntax error, unexpected keyword_end" # # example: # if ( # end # # example: # end return :unrecoverable_error when /syntax error, unexpected '\.'/ # "syntax error, unexpected '.'" # # example: # . return :unrecoverable_error when /unexpected tREGEXP_BEG/ # "syntax error, unexpected tREGEXP_BEG, expecting keyword_do or '{' or '('" # # example: # method / f / return :unrecoverable_error else return :other_error end ensure $VERBOSE = verbose end :valid end