From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Original-To: poffice@blade.nagaokaut.ac.jp Delivered-To: poffice@blade.nagaokaut.ac.jp Received: from kankan.nagaokaut.ac.jp (kankan.nagaokaut.ac.jp [133.44.2.24]) by blade.nagaokaut.ac.jp (Postfix) with ESMTP id 1337319E002E for ; Thu, 24 Dec 2015 11:33:49 +0900 (JST) Received: from voscc.nagaokaut.ac.jp (voscc.nagaokaut.ac.jp [133.44.1.100]) by kankan.nagaokaut.ac.jp (Postfix) with ESMTP id 5F75AB5D85E for ; Thu, 24 Dec 2015 12:06:12 +0900 (JST) Received: from neon.ruby-lang.org (neon.ruby-lang.org [221.186.184.75]) by voscc.nagaokaut.ac.jp (Postfix) with ESMTP id 5B15F18CC7B6 for ; Thu, 24 Dec 2015 12:06:12 +0900 (JST) Received: from [221.186.184.76] (localhost [IPv6:::1]) by neon.ruby-lang.org (Postfix) with ESMTP id DB6D21204A7; Thu, 24 Dec 2015 12:06:11 +0900 (JST) X-Original-To: ruby-core@ruby-lang.org Delivered-To: ruby-core@ruby-lang.org Received: from o10.shared.sendgrid.net (o10.shared.sendgrid.net [173.193.132.135]) by neon.ruby-lang.org (Postfix) with ESMTPS id CD3AF12044D for ; Thu, 24 Dec 2015 12:06:05 +0900 (JST) DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sendgrid.me; h=from:to:references:subject:mime-version:content-type:content-transfer-encoding:list-id; s=smtpapi; bh=e5MwAMuLh19nNgN0kz/WuECv3zA=; b=U5uMy0B5ID43RJDjff vh2q3KuSwDzYau+u2tpyaJtQMUhkkZD6j1ON/WvDYEAYQVH71GlxAQ/2hF0D7aBT 5UmHhExFDIyMpXcbbYj2UsGZKpstg9MjwKZKVYy2m2wzSI2qm/DRSYJV8ly5zWyc rjWBEurrBTdykbis07t19Fvk8= Received: by filter0500p1mdw1.sendgrid.net with SMTP id filter0500p1mdw1.8002.567B61191E 2015-12-24 03:06:01.336573605 +0000 UTC Received: from herokuapp.com (ec2-54-167-161-253.compute-1.amazonaws.com [54.167.161.253]) by ismtpd0003p1iad1.sendgrid.net (SG) with ESMTP id uE0qABCMRs6s_042T_Vi1A Thu, 24 Dec 2015 03:06:01.116 +0000 (UTC) Date: Thu, 24 Dec 2015 03:06:01 +0000 From: jrafanie@gmail.com To: ruby-core@ruby-lang.org Message-ID: References: Mime-Version: 1.0 X-Redmine-MailingListIntegration-Message-Ids: 47064 X-Redmine-Project: ruby-trunk X-Redmine-Issue-Id: 11868 X-Redmine-Issue-Author: jrafanie X-Redmine-Sender: jrafanie X-Mailer: Redmine X-Redmine-Host: bugs.ruby-lang.org X-Redmine-Site: Ruby Issue Tracking System X-Auto-Response-Suppress: All Auto-Submitted: auto-generated X-SG-EID: ync6xU2WACa70kv/Ymy4QrNMhiuLXJG8OTL2vJD1yS7faDrIueRevGPQ28pCIIi/CQ3hWDJFMQGD4l PtSeu23J8j6LjQo9wk51rALZoI306feHfFw0SqHZeqDyR9aWGQq5FSrUEHgxET9SiazDziJM3Jl1MC KpO7K6SJm85T3l9ehm2g9zp77uQPExaDDp9+emPWUmhMf5l5iQMsTfuvGA== X-ML-Name: ruby-core X-Mail-Count: 72464 Subject: [ruby-core:72464] [Ruby trunk - Feature #11868] Proposal for RubyVM::InstructionSequence.compile to return an object containing the syntax error information currently written to STDERR X-BeenThere: ruby-core@ruby-lang.org X-Mailman-Version: 2.1.15 Precedence: list Reply-To: Ruby developers List-Id: Ruby developers List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ruby-core-bounces@ruby-lang.org Sender: "ruby-core" Issue #11868 has been updated by Joe Rafaniello. Nobuyoshi Nakada wrote: > [`assert_valid_syntax`](https://github.com/ruby/ruby/blob/trunk/test/lib/test/unit/assertions.rb#L450) may help you. Thank you for reviewing this so quickly and the suggestion. I forgot that test/unit had such an assertion. Although, I think this assertion doesn't provide the information I need. RubyVM::InstructionSequence.compile provides this information to standard error: the line number(s), specific error(s), and the location "hint(s)". The line number is very important for style checkers such as rubocop as it helps identify the location of the invalid syntax. The hint is also very helpful. For example: ~~~~ $ cat test.rb class Joe def test- end end ~~~~ Running rubocop: ~~~~ $ rubocop test.rb Inspecting 1 file E Offenses: test.rb:2:11: E: unexpected token tMINUS def test- ^ 1 file inspected, 1 offense detected ~~~~ With a 4 line file, this is not that difficult but with much larger files and many changes happening, it's easy to make a mistake or typo and not "see" the problem immediately. It would be great to have access to this useful information directly in ruby through `lineno` and `hint` methods (or better names) and not have to capture and parse STDERR manually. Thank you for the consideration. ---------------------------------------- Feature #11868: Proposal for RubyVM::InstructionSequence.compile to return an object containing the syntax error information currently written to STDERR https://bugs.ruby-lang.org/issues/11868#change-55755 * Author: Joe Rafaniello * Status: Open * Priority: Normal * Assignee: ---------------------------------------- Currently, RubyVM::InstructionSequence.compile or RubyVM::InstructionSequence.new return a new InstructionSequence for valid ruby. For invalid syntax, a SyntaxError is raised with a message of 'compile error'. Meanwhile, the useful information, line number(s) and hint(s) to the invalid syntax location, is printed on standard error. I am proposing this information be returned as an object in the event of a SyntaxError. For example, here's good syntax: ~~~ RubyVM::InstructionSequence.new("x =1") # => @> ~~~ Here's bad syntax: ~~~ RubyVM::InstructionSequence.new("puts 'hi'\n puts 'hi2'\n\nthis.is -> not -> valid $ruby:syntax") # => SyntaxError: compile error # The useful hint and line number(s) are on standard error: :4: syntax error, unexpected keyword_not, expecting keyword_do_LAMBDA or tLAMBEG this.is -> not -> valid $ruby:syntax ^ :4: syntax error, unexpected tGVAR, expecting keyword_do_LAMBDA or tLAMBEG this.is -> not -> valid $ruby:syntax ^ ~~~ Some ideas: 1. Add methods to all SyntaxError exceptions to get all parse failures. For example: `syntax_error.parse_failures.each {|f| puts f.lineno; puts f.hint }`. In the above example, it failed on line 4 twice and we see two "hints." 2. Create a new method to RubyVM::InstructionSequence to check ruby syntax that would allow us to see if the syntax is valid and if not, the lineno and 'hint' for each parse failure. Use case: Rubocop[a] and other utilities[b] are really complicated and check for valid ruby syntax by creating a process to run ruby -wc with the script. [a] https://github.com/bbatsov/rubocop/blob/86e1acf67794bf6dd5d65812b91df475e44fa320/spec/support/mri_syntax_checker.rb#L51-L63 [b] https://github.com/ManageIQ/manageiq/blob/6725fe52222c07d576a18126d2ff825ddc6dffd0/gems/pending/util/miq-syntax-checker.rb#L8-L13 It would be nice to remove all of this complexity and use RubyVM::InstructionSequence, which already has the information we need but in a more user friendly format. Thanks! Joe Rafaniello -- https://bugs.ruby-lang.org/