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 7CDDA19E0040 for ; Tue, 2 Feb 2016 23:22:29 +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 A9CA8B5D853 for ; Tue, 2 Feb 2016 23:56:44 +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 777A118CC7B1 for ; Tue, 2 Feb 2016 23:56:45 +0900 (JST) Received: from [221.186.184.76] (localhost [IPv6:::1]) by neon.ruby-lang.org (Postfix) with ESMTP id A3275120468; Tue, 2 Feb 2016 23:56:44 +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 8DDB1120459 for ; Tue, 2 Feb 2016 23:56:41 +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=eu98fHIxvG5r78/i+bQSQQ2jVqg=; b=hHJ1bnufJx89Fr/IE+ ku5FerEqCPhqpOFaPQO7rjt56OOhsPHlF94uAaYw29JY+8VYGb+XTJ1V3lM0fucw j4o6yhvFaHuMfr6JByE4pkQJzt1ammHUZ3Rb4XR1dFFWendL+KSljgCxU+jRNiaq l/E/1wBSZL2io+OJY2pvdvgZ0= Received: by filter0439p1mdw1.sendgrid.net with SMTP id filter0439p1mdw1.9522.56B0C3A057 2016-02-02 14:56:32.645405362 +0000 UTC Received: from herokuapp.com (ec2-54-82-27-158.compute-1.amazonaws.com [54.82.27.158]) by ismtpd0002p1iad1.sendgrid.net (SG) with ESMTP id s3qgMLOcQF-tkR1WErhTfA Tue, 02 Feb 2016 14:56:32.495 +0000 (UTC) Date: Tue, 02 Feb 2016 14:56:31 +0000 From: jrafanie@gmail.com To: ruby-core@ruby-lang.org Message-ID: References: Mime-Version: 1.0 X-Redmine-MailingListIntegration-Message-Ids: 48248 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/Ymy4QrNMhiuLXJG8OTL2vJD1yS4y7CT67Lr5alYw3dsrWDEL3jTRL5HGJ+ZqlE eGYirdBiXHUmfjjpUfyxaZSLwmFc+nueW4nT24t/5Kz/tnlR9XwZfwkMiSvbH6zE4kMWzHRXT6Id40 JM166T0hHL1Wy1xNF2J0Nw/IiUbf7sVl4Q7si4DXcjR82fPltEcoePiimQ== X-ML-Name: ruby-core X-Mail-Count: 73654 Subject: [ruby-core:73654] [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. I agree, it seems the best place to put this information is in the SyntaxError exception. If we need to keep compatibility by keeping the output to $stderr, I'm OK with that but I want to be able to rescue the SyntaxError and get the "file", "lineno" and the problem code (hint). The hint or problem code could even be reconstructed exactly as Tsuyoshi Sawada says if we know the column position of the syntax error. Tools like rubocop would most likely want exactly what is currently printed to $stderr but as methods on some object such as the exception. ---------------------------------------- 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-56845 * 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/