redparse 0.8.4 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -0
- data/COPYING.LGPL +503 -158
- data/History.txt +192 -0
- data/Makefile +9 -0
- data/README.txt +72 -39
- data/bin/redparse +108 -14
- data/lib/miniredparse.rb +1543 -0
- data/lib/redparse.rb +971 -105
- data/lib/redparse/ReduceWithsFor_RedParse_1_8.rb +17412 -0
- data/lib/redparse/ReduceWithsFor_RedParse_1_9.rb +17633 -0
- data/lib/redparse/babynodes.rb +17 -0
- data/lib/redparse/babyparser.rb +17 -0
- data/lib/redparse/cache.rb +290 -6
- data/lib/redparse/compile.rb +6 -97
- data/lib/redparse/decisiontree.rb +1 -1
- data/lib/redparse/float_accurate_to_s.rb +30 -6
- data/lib/redparse/generate.rb +18 -0
- data/lib/redparse/node.rb +415 -124
- data/lib/redparse/parse_tree_server.rb +20 -2
- data/lib/redparse/problemfiles.rb +1 -1
- data/lib/redparse/pthelper.rb +17 -31
- data/lib/redparse/reg_more_sugar.rb +1 -1
- data/lib/redparse/replacing/parse_tree.rb +30 -0
- data/lib/redparse/replacing/ripper.rb +20 -0
- data/lib/redparse/replacing/ruby_parser.rb +28 -0
- data/lib/redparse/ripper.rb +393 -0
- data/lib/redparse/ripper_sexp.rb +153 -0
- data/lib/redparse/stackableclasses.rb +113 -0
- data/lib/redparse/version.rb +18 -1
- data/redparse.gemspec +29 -9
- data/rplt.txt +31 -0
- data/test/data/hd_with_blank_string.rb +3 -0
- data/test/data/pt_known_output.rb +13273 -0
- data/test/data/wp.pp +0 -0
- data/test/generate_parse_tree_server_rc.rb +17 -0
- data/test/rp-locatetest.rb +2 -2
- data/test/test_1.9.rb +338 -35
- data/test/test_all.rb +22 -3
- data/test/test_part.rb +32 -0
- data/test/test_redparse.rb +396 -74
- data/test/test_xform_tree.rb +18 -0
- data/test/unparse_1.9_exceptions.txt +85 -0
- data/test/unparse_1.9_exceptions.txt.old +81 -0
- metadata +71 -46
- data/Rakefile +0 -35
    
        data/test/test_all.rb
    CHANGED
    
    | @@ -1,3 +1,22 @@ | |
| 1 | 
            -
             | 
| 2 | 
            -
             | 
| 3 | 
            -
             | 
| 1 | 
            +
            =begin copyright
         | 
| 2 | 
            +
                redparse - a ruby parser written in ruby
         | 
| 3 | 
            +
                Copyright (C) 2008,2009, 2012, 2016  Caleb Clausen
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                This program is free software: you can redistribute it and/or modify
         | 
| 6 | 
            +
                it under the terms of the GNU Lesser General Public License as published by
         | 
| 7 | 
            +
                the Free Software Foundation, either version 3 of the License, or
         | 
| 8 | 
            +
                (at your option) any later version.
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                This program is distributed in the hope that it will be useful,
         | 
| 11 | 
            +
                but WITHOUT ANY WARRANTY; without even the implied warranty of
         | 
| 12 | 
            +
                MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
         | 
| 13 | 
            +
                GNU Lesser General Public License for more details.
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                You should have received a copy of the GNU Lesser General Public License
         | 
| 16 | 
            +
                along with this program.  If not, see <http://www.gnu.org/licenses/>.
         | 
| 17 | 
            +
            =end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            $:.push File.expand_path(File.dirname(__FILE__))
         | 
| 20 | 
            +
            require 'test_redparse'
         | 
| 21 | 
            +
            #require 'test_xform_tree' #these are broken, gyaaah, not actually used
         | 
| 22 | 
            +
            require 'test_1.9'  #should be enabled eventually, too many broken cases for now
         | 
    
        data/test/test_part.rb
    ADDED
    
    | @@ -0,0 +1,32 @@ | |
| 1 | 
            +
            =begin copyright
         | 
| 2 | 
            +
                redparse - a ruby parser written in ruby
         | 
| 3 | 
            +
                Copyright (C) 2008,2009, 2012, 2016  Caleb Clausen
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                This program is free software: you can redistribute it and/or modify
         | 
| 6 | 
            +
                it under the terms of the GNU Lesser General Public License as published by
         | 
| 7 | 
            +
                the Free Software Foundation, either version 3 of the License, or
         | 
| 8 | 
            +
                (at your option) any later version.
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                This program is distributed in the hope that it will be useful,
         | 
| 11 | 
            +
                but WITHOUT ANY WARRANTY; without even the implied warranty of
         | 
| 12 | 
            +
                MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
         | 
| 13 | 
            +
                GNU Lesser General Public License for more details.
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                You should have received a copy of the GNU Lesser General Public License
         | 
| 16 | 
            +
                along with this program.  If not, see <http://www.gnu.org/licenses/>.
         | 
| 17 | 
            +
            =end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            $:.push File.expand_path(File.dirname(__FILE__))
         | 
| 20 | 
            +
            require 'test_redparse'
         | 
| 21 | 
            +
             | 
| 22 | 
            +
            HASH=(ENV['PART']||0).to_i 
         | 
| 23 | 
            +
            ObjectSpace.each_object(Class){|k|
         | 
| 24 | 
            +
              next unless k<=Test::Unit::TestCase
         | 
| 25 | 
            +
              kn=k.name
         | 
| 26 | 
            +
              k.instance_methods.each{|m| mm=m.to_s
         | 
| 27 | 
            +
                if /^test_/===mm and (mm+kn).hash.&(0xFF) != HASH
         | 
| 28 | 
            +
                  k.instance_eval{undef_method(m.to_sym)} 
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
              }
         | 
| 31 | 
            +
            }
         | 
| 32 | 
            +
             | 
    
        data/test/test_redparse.rb
    CHANGED
    
    | @@ -1,6 +1,6 @@ | |
| 1 | 
            -
            =begin | 
| 1 | 
            +
            =begin copyright
         | 
| 2 2 | 
             
                redparse - a ruby parser written in ruby
         | 
| 3 | 
            -
                Copyright (C) 2008  Caleb Clausen
         | 
| 3 | 
            +
                Copyright (C) 2008, 2012, 2016  Caleb Clausen
         | 
| 4 4 |  | 
| 5 5 | 
             
                This library is free software; you can redistribute it and/or
         | 
| 6 6 | 
             
                modify it under the terms of the GNU Lesser General Public
         | 
| @@ -19,7 +19,77 @@ | |
| 19 19 |  | 
| 20 20 | 
             
            $VERBOSE=1
         | 
| 21 21 | 
             
            $Debug=1
         | 
| 22 | 
            +
             | 
| 22 23 | 
             
            require 'test/unit'
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            if ENV['MULTIPROCESS'] #or ENV['MANGLE']
         | 
| 26 | 
            +
            def (Test::Unit).run?; true end #the sense of this flag is inverted
         | 
| 27 | 
            +
              filters=(0..0xFF).map{|h|
         | 
| 28 | 
            +
                #exit Test::Unit::AutoRunner.run{|r| r.filters<<
         | 
| 29 | 
            +
                 proc{|tc| tc.method_name.+(tc.class.name).hash&0xFF==h} #}
         | 
| 30 | 
            +
              }
         | 
| 31 | 
            +
            Test::Unit::AutoRunner.run{|r| r.filters<<filters.pop }
         | 
| 32 | 
            +
            at_exit do
         | 
| 33 | 
            +
             | 
| 34 | 
            +
              workers=[]
         | 
| 35 | 
            +
             | 
| 36 | 
            +
              sock2idx={}
         | 
| 37 | 
            +
              results=[]
         | 
| 38 | 
            +
              10.times{
         | 
| 39 | 
            +
                si,co=IO.pipe
         | 
| 40 | 
            +
                so,ci=IO.pipe
         | 
| 41 | 
            +
                sock2idx[ci]=workers.size
         | 
| 42 | 
            +
                workers<<co
         | 
| 43 | 
            +
                results<<ci
         | 
| 44 | 
            +
                fork{
         | 
| 45 | 
            +
                  #co.close
         | 
| 46 | 
            +
                  #ci.close
         | 
| 47 | 
            +
                  r=si
         | 
| 48 | 
            +
                  while l=r.gets
         | 
| 49 | 
            +
                    i=l.to_i
         | 
| 50 | 
            +
                    begin
         | 
| 51 | 
            +
                      p :autorunner
         | 
| 52 | 
            +
                      Test::Unit::AutoRunner.run{|r| r.filters<<filters[i] }
         | 
| 53 | 
            +
                    rescue Exception=>e
         | 
| 54 | 
            +
                      puts "ar error!"
         | 
| 55 | 
            +
                      so.puts "error: #{e.message}\t#{e.backtrace.join(%<\t>)}".gsub("\n","\t")
         | 
| 56 | 
            +
                    else
         | 
| 57 | 
            +
                      puts "ar done"
         | 
| 58 | 
            +
                      so.puts 'done'
         | 
| 59 | 
            +
                    end
         | 
| 60 | 
            +
                  end
         | 
| 61 | 
            +
                  exit!
         | 
| 62 | 
            +
                }
         | 
| 63 | 
            +
                #si.close
         | 
| 64 | 
            +
                #so.close
         | 
| 65 | 
            +
                filters.pop
         | 
| 66 | 
            +
                co.puts filters.size.to_s
         | 
| 67 | 
            +
              }
         | 
| 68 | 
            +
              until filters.empty?
         | 
| 69 | 
            +
                readable,=IO.select(results)
         | 
| 70 | 
            +
                p readable
         | 
| 71 | 
            +
                readable.each{|rd|
         | 
| 72 | 
            +
                  l=rd.gets
         | 
| 73 | 
            +
                  if /\Aerror: /===l
         | 
| 74 | 
            +
                    l[0,7]=''
         | 
| 75 | 
            +
                    l.gsub!("\t","\n")
         | 
| 76 | 
            +
                    warn "exception in autorunner instance:"
         | 
| 77 | 
            +
                    warn l
         | 
| 78 | 
            +
                  elsif /\Adone\Z/===l
         | 
| 79 | 
            +
                    sockidx=sock2idx[rd]
         | 
| 80 | 
            +
                    filter=filters.pop
         | 
| 81 | 
            +
                    i=filters.size
         | 
| 82 | 
            +
                    workers[sockidx].puts i.to_s
         | 
| 83 | 
            +
                  else fail "expected done or error in: '#{l.chomp}'"
         | 
| 84 | 
            +
                  end
         | 
| 85 | 
            +
                }
         | 
| 86 | 
            +
              end
         | 
| 87 | 
            +
              readable.each{|rd| rd.close}
         | 
| 88 | 
            +
             | 
| 89 | 
            +
              exit
         | 
| 90 | 
            +
            end
         | 
| 91 | 
            +
            end
         | 
| 92 | 
            +
             | 
| 23 93 | 
             
            #require 'parse_tree'
         | 
| 24 94 | 
             
            require 'tempfile'
         | 
| 25 95 | 
             
            begin
         | 
| @@ -31,21 +101,53 @@ end | |
| 31 101 | 
             
            require "redparse"
         | 
| 32 102 | 
             
            require "redparse/pthelper"
         | 
| 33 103 | 
             
            require "rubylexer/test/testcases"
         | 
| 104 | 
            +
            require File.expand_path(__FILE__+"/../data/pt_known_output")
         | 
| 105 | 
            +
            require_relative 'ptlog' if ENV['PTLOG']
         | 
| 34 106 |  | 
| 35 107 | 
             
            $VERBOSE=1
         | 
| 36 108 |  | 
| 109 | 
            +
            begin
         | 
| 110 | 
            +
            require 'test/unit/ui/console/testrunner'
         | 
| 111 | 
            +
            class Test::Unit::UI::Console::TestRunner
         | 
| 112 | 
            +
              @@Extra_Summarizers=[]
         | 
| 113 | 
            +
              alias finished__without_extra_summaries finished
         | 
| 114 | 
            +
              def finished x
         | 
| 115 | 
            +
                print "\nTests complete\n"
         | 
| 116 | 
            +
                @@Extra_Summarizers.each{|sz| sz[x] }
         | 
| 117 | 
            +
                finished__without_extra_summaries x
         | 
| 118 | 
            +
              end
         | 
| 119 | 
            +
              def self.extra_summary &code
         | 
| 120 | 
            +
                @@Extra_Summarizers<<code
         | 
| 121 | 
            +
              end
         | 
| 122 | 
            +
            end
         | 
| 123 | 
            +
            class Test::Unit::TestCase
         | 
| 124 | 
            +
              def extra_summary &code
         | 
| 125 | 
            +
                Test::Unit::UI::Console::TestRunner.extra_summary &code
         | 
| 126 | 
            +
              end
         | 
| 127 | 
            +
            end
         | 
| 128 | 
            +
            rescue LoadError
         | 
| 129 | 
            +
            class Test::Unit::TestCase
         | 
| 130 | 
            +
              def extra_summary &code
         | 
| 131 | 
            +
                at_exit &code
         | 
| 132 | 
            +
              end
         | 
| 133 | 
            +
            end
         | 
| 134 | 
            +
            end
         | 
| 135 | 
            +
             | 
| 37 136 | 
             
            class Test::Unit::TestCase
         | 
| 38 | 
            -
              def known_error
         | 
| 137 | 
            +
              def known_error x
         | 
| 39 138 | 
             
                from=caller.first
         | 
| 40 139 | 
             
                from=from[/ in `.*'\Z/] || from[/\A[^:]*:[^:]*/]
         | 
| 41 | 
            -
                yield
         | 
| 140 | 
            +
                yield x
         | 
| 42 141 | 
             
              rescue Test::Unit::AssertionFailedError=>e
         | 
| 43 142 | 
             
                warn "an expected error occurred in #{from}: #{e.message}"
         | 
| 44 143 | 
             
                if defined? @@known_errors
         | 
| 45 | 
            -
                  @@known_errors | 
| 144 | 
            +
                  @@known_errors<<x
         | 
| 46 145 | 
             
                else
         | 
| 47 | 
            -
                  @@known_errors= | 
| 48 | 
            -
                   | 
| 146 | 
            +
                  @@known_errors=[x]
         | 
| 147 | 
            +
                  extra_summary {
         | 
| 148 | 
            +
                    warn "!!!UNFIXED KNOWN ERRORS!!!: #{@@known_errors.size}"
         | 
| 149 | 
            +
                    @@known_errors.each{|err| warn "  "+err unless err["\n"] }
         | 
| 150 | 
            +
                  }
         | 
| 49 151 | 
             
                end
         | 
| 50 152 | 
             
              rescue Exception=>e
         | 
| 51 153 | 
             
                raise
         | 
| @@ -55,21 +157,21 @@ class Test::Unit::TestCase | |
| 55 157 | 
             
                  @@known_errors_fixed+=1
         | 
| 56 158 | 
             
                else
         | 
| 57 159 | 
             
                  @@known_errors_fixed=1
         | 
| 58 | 
            -
                   | 
| 160 | 
            +
                  extra_summary {warn "unexpectedly fixed known errors: #@@known_errors_fixed"}
         | 
| 59 161 | 
             
                end
         | 
| 60 162 | 
             
              end
         | 
| 61 163 |  | 
| 62 | 
            -
              def known_failure
         | 
| 164 | 
            +
              def known_failure x
         | 
| 63 165 | 
             
                from=caller.first
         | 
| 64 166 | 
             
                from=from[/ in `.*'\Z/] || from[/\A[^:]*:[^:]*/]
         | 
| 65 | 
            -
                yield
         | 
| 167 | 
            +
                yield x
         | 
| 66 168 | 
             
              rescue Exception=>e
         | 
| 67 169 | 
             
                warn "an expected failure occurred in #{from}: #{e}"
         | 
| 68 170 | 
             
                if defined? @@known_failures
         | 
| 69 171 | 
             
                  @@known_failures+=1
         | 
| 70 172 | 
             
                else
         | 
| 71 173 | 
             
                  @@known_failures=1
         | 
| 72 | 
            -
                   | 
| 174 | 
            +
                  extra_summary {warn "!!!UNFIXED KNOWN FAILURES!!!: #@@known_failures"}
         | 
| 73 175 | 
             
                end
         | 
| 74 176 | 
             
              else
         | 
| 75 177 | 
             
                warn "expected failure in #{from}, but was fixed(?!)"
         | 
| @@ -77,24 +179,25 @@ class Test::Unit::TestCase | |
| 77 179 | 
             
                  @@known_failures_fixed+=1
         | 
| 78 180 | 
             
                else
         | 
| 79 181 | 
             
                  @@known_failures_fixed=1
         | 
| 80 | 
            -
                   | 
| 182 | 
            +
                  extra_summary {warn "unexpectedly fixed known failures: #@@known_failures_fixed"}
         | 
| 81 183 | 
             
                end
         | 
| 82 184 | 
             
              end
         | 
| 83 185 |  | 
| 84 | 
            -
              def slow
         | 
| 186 | 
            +
              def slow x
         | 
| 85 187 | 
             
                if ENV['SLOW']
         | 
| 86 | 
            -
                  yield
         | 
| 188 | 
            +
                  yield x
         | 
| 87 189 | 
             
                else
         | 
| 88 190 | 
             
                  if defined? @@slow_spots
         | 
| 89 191 | 
             
                    @@slow_spots+=1
         | 
| 90 192 | 
             
                  else
         | 
| 91 193 | 
             
                    @@slow_spots=1
         | 
| 92 | 
            -
                     | 
| 194 | 
            +
                    extra_summary {warn "slow test code skipped in #@@slow_spots places. (set SLOW to enable)"}
         | 
| 93 195 | 
             
                  end
         | 
| 94 196 | 
             
                end
         | 
| 95 197 | 
             
              end
         | 
| 96 198 | 
             
            end
         | 
| 97 199 |  | 
| 200 | 
            +
            if ENV['IMMED']
         | 
| 98 201 | 
             
            #print output immediately on failing test (at end too....)
         | 
| 99 202 | 
             
            begin
         | 
| 100 203 | 
             
              require 'test/unit/ui/console/testrunner'
         | 
| @@ -117,7 +220,7 @@ class MiniTest::Unit | |
| 117 220 | 
             
                return result
         | 
| 118 221 | 
             
              end
         | 
| 119 222 | 
             
            end if defined? MiniTest::Unit
         | 
| 120 | 
            -
             | 
| 223 | 
            +
            end
         | 
| 121 224 |  | 
| 122 225 | 
             
            =begin nice idea, don't work yet
         | 
| 123 226 | 
             
            class Test::Unit::TestResult
         | 
| @@ -169,7 +272,9 @@ end | |
| 169 272 | 
             
            =end
         | 
| 170 273 |  | 
| 171 274 | 
             
            require 'redparse/parse_tree_server'
         | 
| 172 | 
            -
            class ParseTree
         | 
| 275 | 
            +
            class ParseTree #todo: move this to parse_tree_server.rb. 
         | 
| 276 | 
            +
                            #also, slight fork of 
         | 
| 277 | 
            +
                            #parse_tree_and_warnings_leaks_stderr in bin/parsetree
         | 
| 173 278 | 
             
              class<<self
         | 
| 174 279 | 
             
              include ParseTreeComm
         | 
| 175 280 | 
             
              def old_fork_server?
         | 
| @@ -250,7 +355,7 @@ class ParseTree | |
| 250 355 | 
             
                rescue Exception
         | 
| 251 356 | 
             
                  return nil,nil
         | 
| 252 357 | 
             
                end
         | 
| 253 | 
            -
                raise tree if Exception===tree
         | 
| 358 | 
            +
                #raise tree if Exception===tree
         | 
| 254 359 | 
             
                return tree,warnings
         | 
| 255 360 | 
             
              end
         | 
| 256 361 | 
             
              end
         | 
| @@ -296,8 +401,9 @@ class RedParseTest<Test::Unit::TestCase | |
| 296 401 | 
             
              FAILURE_EXAMPLES=[
         | 
| 297 402 | 
             
              ]
         | 
| 298 403 | 
             
              RUBYBUG_EXAMPLES=[
         | 
| 299 | 
            -
             | 
| 300 404 | 
             
                #bugs in ruby itself
         | 
| 405 | 
            +
                "a=a i? -R",
         | 
| 406 | 
            +
                "b=1;b p %s[jim];",
         | 
| 301 407 | 
             
                "c do p (110).m end",
         | 
| 302 408 | 
             
                "p = p m %(1)",
         | 
| 303 409 | 
             
                "p = p m %(1) ,&t",
         | 
| @@ -308,6 +414,7 @@ class RedParseTest<Test::Unit::TestCase | |
| 308 414 | 
             
                "z{|| p (1).m}",
         | 
| 309 415 |  | 
| 310 416 | 
             
                #bugs in ParseTree
         | 
| 417 | 
            +
                'def a c=d=1; end',
         | 
| 311 418 | 
             
            '    case
         | 
| 312 419 | 
             
                when 0
         | 
| 313 420 | 
             
                  guecoding
         | 
| @@ -334,12 +441,23 @@ class RedParseTest<Test::Unit::TestCase | |
| 334 441 | 
             
                'c while d and /8/..2.a?(b)',
         | 
| 335 442 | 
             
                'c while d and /8/../2.a?(b)/',
         | 
| 336 443 | 
             
                'a if 1..2',
         | 
| 444 | 
            +
                'status, err_args = Documeh_status{fcgi_state = 3; docespond do doc_response =fcgi_state =  1; end }',
         | 
| 445 | 
            +
                "case;when I; JIS;else case; when sjis__length; EJP ;else 55; end;end",
         | 
| 446 | 
            +
                "case;when 0;ng = 'JIS';else case; when sjis__length; ding = 'EUC-JP' ;end;end",
         | 
| 447 | 
            +
                "doc_status, err_args = Documeh_status{fcgi_state = 3; docespond do doc_response =fcgi_state =  1; end }",
         | 
| 337 448 |  | 
| 338 449 | 
             
                #not sure which, doesn't really matter anyway
         | 
| 339 450 | 
             
                "$11111111111111111111111111111111111111111111111111111111111111111111",
         | 
| 451 | 
            +
                "module Array ([Array]).first::E include M end",
         | 
| 452 | 
            +
                "module Array ([Array]).first::E include M; end",
         | 
| 453 | 
            +
                "module Array ([Array]).first::E; end",
         | 
| 340 454 | 
             
              ]
         | 
| 341 455 |  | 
| 342 456 | 
             
              ONELINERS=[
         | 
| 457 | 
            +
                'TRUE'...'',
         | 
| 458 | 
            +
                'FALSE'...'',
         | 
| 459 | 
            +
                'NIL'...'',
         | 
| 460 | 
            +
                'n||u n'...'',
         | 
| 343 461 | 
             
                'yield [a_i, *p] '...'',
         | 
| 344 462 | 
             
                '0.113725'...'',
         | 
| 345 463 | 
             
                '0.777777'...'',
         | 
| @@ -356,7 +474,7 @@ class RedParseTest<Test::Unit::TestCase | |
| 356 474 | 
             
                'module self::A include B; c end'...'',
         | 
| 357 475 | 
             
                'class a.b.c.d.e.f::Quux; YYY=534 end'...'',
         | 
| 358 476 | 
             
                'class[Array][0]::Foo; Bazz=556 end'...'',
         | 
| 359 | 
            -
                 | 
| 477 | 
            +
                "=begin\r\nfoo\r\n=end\r\n"...'',
         | 
| 360 478 | 
             
                'a!`b'...'',
         | 
| 361 479 | 
             
                'fetch_named { {} }'...'',
         | 
| 362 480 | 
             
                'def subject::Builder.foo; bar end'...'',
         | 
| @@ -1610,7 +1728,8 @@ class RedParseTest<Test::Unit::TestCase | |
| 1610 1728 | 
             
                '%W[a #{b} c]'...'',
         | 
| 1611 1729 |  | 
| 1612 1730 | 
             
                '"a b c #{d}"'...'',
         | 
| 1613 | 
            -
                '"a b c #{d} | 
| 1731 | 
            +
                '"a b c #{d}\\n"'...'',
         | 
| 1732 | 
            +
                %*"a b c \#{d}\n"*...'',
         | 
| 1614 1733 | 
             
                '"a b c #{d} "'...'',
         | 
| 1615 1734 | 
             
                '"#{a} b c"'...'',
         | 
| 1616 1735 |  | 
| @@ -2856,7 +2975,91 @@ class RedParseTest<Test::Unit::TestCase | |
| 2856 2975 | 
             
                  "$-\v"...'',
         | 
| 2857 2976 | 
             
                  '$-[]'...'',
         | 
| 2858 2977 | 
             
                  'a,b=(*c=b,a)'...'',
         | 
| 2859 | 
            -
                  
         | 
| 2978 | 
            +
                  '"__A#{a=b,c=d}"'...'',
         | 
| 2979 | 
            +
                  '"#{ * =f,g}"'...'',
         | 
| 2980 | 
            +
                  '"#{*a0 = (*a= c)}"'...'',
         | 
| 2981 | 
            +
                  '"#{*a0= begin a end rescue b0}"'...'',
         | 
| 2982 | 
            +
                  '"#{*a=b rescue c}"'...'',
         | 
| 2983 | 
            +
                  '"#{*a=b}"'...'',
         | 
| 2984 | 
            +
                  '"#{*a[*b]=c}"'...'',
         | 
| 2985 | 
            +
                  '"#{BEGIN{a}}"'...'',
         | 
| 2986 | 
            +
                  '"#{END{a}}"'...'',
         | 
| 2987 | 
            +
                  '"#{a=b,d rescue c}"'...'',
         | 
| 2988 | 
            +
                  '"#{begin begin; ync; p1; end;rr end}"'...'',
         | 
| 2989 | 
            +
                  '"1#{begin; r; t end;p (1).m}2"'...'',
         | 
| 2990 | 
            +
                  'a=a i? -R'...'',
         | 
| 2991 | 
            +
                  'begin; r; t end;q p'...'',
         | 
| 2992 | 
            +
                  'begin; p (1..10).method(:each); rescue b; end.m'...'',
         | 
| 2993 | 
            +
                  'begin; p (1..10).method(:each); rescue B=>c; end'...'',
         | 
| 2994 | 
            +
                  'begin begin; ync; p1; end;rr end'...'',
         | 
| 2995 | 
            +
                  '"#{"#{*a0 = (*a= c)}"}"'...'',
         | 
| 2996 | 
            +
                  '"#{ * =f,g}"'...'',
         | 
| 2997 | 
            +
                  'b=1;b p %s[jim];'...'',
         | 
| 2998 | 
            +
                  '"#{*a=b}"'...'',
         | 
| 2999 | 
            +
                  'a0 rescue b0=b,d rescue c'...'',
         | 
| 3000 | 
            +
                  'a0 = ~begin; a; rescue b; end rescue b0'...'',
         | 
| 3001 | 
            +
                  'def a c=d=1; end'...'',
         | 
| 3002 | 
            +
                  '"#{a=1,2}"'...'',
         | 
| 3003 | 
            +
                  '"#{a,=1}"'...'',
         | 
| 3004 | 
            +
                  'a0 = ("#{a=b,d rescue c}") rescue b0'...'',
         | 
| 3005 | 
            +
                  'a.b[]=a=b,c=d'...'',
         | 
| 3006 | 
            +
                  'a rescue begin; p (1..10).method(:each); rescue b; end.m'...'',
         | 
| 3007 | 
            +
                  'a rescue a=1,2 rescue 4'...'',
         | 
| 3008 | 
            +
                  'a rescue a=*b rescue c rescue d'...'',
         | 
| 3009 | 
            +
                  'a rescue BEGIN {a}'...'',
         | 
| 3010 | 
            +
                  'a rescue "#{a=b,d rescue c}"'...'',
         | 
| 3011 | 
            +
                  '__END__  #with a comment'...'',
         | 
| 3012 | 
            +
                  '"sdfgfg#{"dfgdh"}";g'...'',
         | 
| 3013 | 
            +
                  '+ ?c;p'...'',
         | 
| 3014 | 
            +
                  '+?c;p'...'',
         | 
| 3015 | 
            +
                  '+:s;p'...'',
         | 
| 3016 | 
            +
                  "+:'s';p"...'',
         | 
| 3017 | 
            +
                  '+/r/;p'...'',
         | 
| 3018 | 
            +
                  '+"r";p'...'',
         | 
| 3019 | 
            +
                  '+++++++++++1;p'...'',
         | 
| 3020 | 
            +
                  '+++++++++++-1;p'...'',
         | 
| 3021 | 
            +
                  '+%s{s};p'...'',
         | 
| 3022 | 
            +
                  '* =f,g rescue b and c'...'',
         | 
| 3023 | 
            +
                  '(begin; r; t end;b;c);d;e;f;(g;h;i)'...'',
         | 
| 3024 | 
            +
                  '(BEGIN {})'...'',
         | 
| 3025 | 
            +
                  '(;1;2;);p'...'',
         | 
| 3026 | 
            +
                  '(/ 1/);p'...'',
         | 
| 3027 | 
            +
                  '(mkk,(a=b,c).kk)=3'...'',
         | 
| 3028 | 
            +
                  '"#{a=b,d rescue c}"'...'', 
         | 
| 3029 | 
            +
                  "\r\n\n__END__\n\r\n\r\n\r\n\r\n\r\n"...'',
         | 
| 3030 | 
            +
                  "%\n__END__\n[a]"...'',
         | 
| 3031 | 
            +
                  "?\\\n__END__\n-?"...'',
         | 
| 3032 | 
            +
                  "a0 = def a.\n__END__\n; end rescue b0"...'',
         | 
| 3033 | 
            +
                  "def a.b(c=\n__END__\n); end"...'',
         | 
| 3034 | 
            +
                  "<<x.\n 1111\nx\na0 rescue b0()\n"...'',
         | 
| 3035 | 
            +
                  'a rescue BEGIN{b}'...'',
         | 
| 3036 | 
            +
                  'a rescue a=*b rescue c'...'',
         | 
| 3037 | 
            +
                  'a rescue a rescue a=1,2 rescue 4'...'',
         | 
| 3038 | 
            +
                  'a rescue a0 = b 1 do end rescue c'...'',
         | 
| 3039 | 
            +
                  'a0 = ~bend'...'',
         | 
| 3040 | 
            +
                  'a,((BEGIN {})).w,c=d,e,f'...'',
         | 
| 3041 | 
            +
                  'a,(* =f,g rescue b and c).w,c=d,e,f'...'',
         | 
| 3042 | 
            +
                  'a,(a0 rescue b0=b,d rescue c).w=d'...'',
         | 
| 3043 | 
            +
                  'a[*b]=a=b,c=d'...'',
         | 
| 3044 | 
            +
                  'class<<a; begin; r; t end;c end'...'',
         | 
| 3045 | 
            +
                  'def a0unde;  undef new, ne; end'...'',
         | 
| 3046 | 
            +
                  'def a0.a & b; end'...'',
         | 
| 3047 | 
            +
                  'def a0.a  b=c do end; hhh end'...'',
         | 
| 3048 | 
            +
                  'def a0.a b=c,d=e do f end; end'...'',
         | 
| 3049 | 
            +
                  'def a0.a b=c,d=e e2 do f end; end'...'',
         | 
| 3050 | 
            +
                  'def a0.a b=c,d=e e2 e3 do f end; end'...'',
         | 
| 3051 | 
            +
                  'def a0.a b=c,d=e e2 e3 e4 do f end; end'...'',
         | 
| 3052 | 
            +
                  'def a0.a b=c,d=e() do f end; end'...'',
         | 
| 3053 | 
            +
                  'def a0.a( b=c,d=e do f end ); end'...'',
         | 
| 3054 | 
            +
                  'def a0.a( b=c,d=e() do f end ); end'...'',
         | 
| 3055 | 
            +
                  'def a0.a*b; end'...'',
         | 
| 3056 | 
            +
                  'def a0.a* b; end'...'',
         | 
| 3057 | 
            +
                  'def a0.a * b; end'...'',
         | 
| 3058 | 
            +
                  'def a0.a&b; end'...'',
         | 
| 3059 | 
            +
                  'def a0.a& b; end'...'',
         | 
| 3060 | 
            +
                  'def a0.a & b; end'...'',
         | 
| 3061 | 
            +
                  'begin undef a,b;rr end'...'',
         | 
| 3062 | 
            +
                  '"foo#{"dfg#{"sdfsd"}" }"; sdfasd'...'',
         | 
| 2860 3063 | 
             
                ]
         | 
| 2861 3064 |  | 
| 2862 3065 |  | 
| @@ -2929,9 +3132,17 @@ class RedParseTest<Test::Unit::TestCase | |
| 2929 3132 | 
             
                   \\"
         | 
| 2930 3133 | 
             
                 foo
         | 
| 2931 3134 |  | 
| 3135 | 
            +
            def a1(a2=  %s[\
         | 
| 3136 | 
            +
            ]);end
         | 
| 2932 3137 | 
             
            END
         | 
| 2933 3138 |  | 
| 2934 3139 | 
             
              STANZAS=PASSTHRU_BSLASHES_ENTIRE+%q[
         | 
| 3140 | 
            +
              "#{p "#{<<-kekerz}#{"foob"
         | 
| 3141 | 
            +
                 zimpler
         | 
| 3142 | 
            +
                 kekerz
         | 
| 3143 | 
            +
                 }"
         | 
| 3144 | 
            +
              }"
         | 
| 3145 | 
            +
             | 
| 2935 3146 | 
             
              @@anon = Module.new
         | 
| 2936 3147 | 
             
              class @@anon::I
         | 
| 2937 3148 | 
             
                bindtextd 
         | 
| @@ -3415,8 +3626,7 @@ end | |
| 3415 3626 | 
             
                assert(!$bad)
         | 
| 3416 3627 | 
             
                s = "a string"
         | 
| 3417 3628 | 
             
                s[0..s.size]="another string"
         | 
| 3418 | 
            -
                assert_equal("another string",  | 
| 3419 | 
            -
                s = <<EOS
         | 
| 3629 | 
            +
                assert_equal("another string",    s = <<EOS
         | 
| 3420 3630 | 
             
            #{
         | 
| 3421 3631 | 
             
            [1,2,3].join(",")
         | 
| 3422 3632 | 
             
            }
         | 
| @@ -3660,6 +3870,92 @@ end | |
| 3660 3870 | 
             
            <<-EOS<<__LINE__
         | 
| 3661 3871 | 
             
            EOS
         | 
| 3662 3872 |  | 
| 3873 | 
            +
            def (
         | 
| 3874 | 
            +
            __END__
         | 
| 3875 | 
            +
            ).foo; end
         | 
| 3876 | 
            +
             | 
| 3877 | 
            +
            def (a=
         | 
| 3878 | 
            +
            __END__
         | 
| 3879 | 
            +
            ).foo; end
         | 
| 3880 | 
            +
             | 
| 3881 | 
            +
            -0.0
         | 
| 3882 | 
            +
            __END__
         | 
| 3883 | 
            +
            **31
         | 
| 3884 | 
            +
             | 
| 3885 | 
            +
            p (M.
         | 
| 3886 | 
            +
            __END__
         | 
| 3887 | 
            +
            )
         | 
| 3888 | 
            +
             | 
| 3889 | 
            +
            module
         | 
| 3890 | 
            +
            __END__
         | 
| 3891 | 
            +
            ::Foo; end
         | 
| 3892 | 
            +
             | 
| 3893 | 
            +
            a,(%
         | 
| 3894 | 
            +
            __END__
         | 
| 3895 | 
            +
            [a]).w,c=d,e,f
         | 
| 3896 | 
            +
             | 
| 3897 | 
            +
            alias :"
         | 
| 3898 | 
            +
            __END__
         | 
| 3899 | 
            +
            #{bar}" :"baz#{quux}"
         | 
| 3900 | 
            +
             | 
| 3901 | 
            +
            undef :"
         | 
| 3902 | 
            +
            __END__
         | 
| 3903 | 
            +
            #{bar}"
         | 
| 3904 | 
            +
             | 
| 3905 | 
            +
            p Module.
         | 
| 3906 | 
            +
            __END__
         | 
| 3907 | 
            +
             | 
| 3908 | 
            +
            p (
         | 
| 3909 | 
            +
            __END__
         | 
| 3910 | 
            +
            )
         | 
| 3911 | 
            +
             | 
| 3912 | 
            +
            def (  def test_endblockwarn
         | 
| 3913 | 
            +
                ruby = EnvUtil.rubybin
         | 
| 3914 | 
            +
                # Use Tempfile to create temporary file path.
         | 
| 3915 | 
            +
                launcher = Tempfile.new(self.class.name)
         | 
| 3916 | 
            +
                errout = Tempfile.new(self.class.name)
         | 
| 3917 | 
            +
                launcher << <<EOF
         | 
| 3918 | 
            +
            errout = ARGV.shift
         | 
| 3919 | 
            +
            STDERR.reopen(File.open(errout, "w"))
         | 
| 3920 | 
            +
            STDERR.sync = true
         | 
| 3921 | 
            +
            Dir.chdir(#{q(DIR)})
         | 
| 3922 | 
            +
            cmd = "\\"#{ruby}\\" \\"endblockwarn.rb\\""
         | 
| 3923 | 
            +
            system(cmd)
         | 
| 3924 | 
            +
            EOF
         | 
| 3925 | 
            +
                launcher.close
         | 
| 3926 | 
            +
                launcherpath = launcher.path
         | 
| 3927 | 
            +
                errout.close
         | 
| 3928 | 
            +
                erroutpath = errout.path
         | 
| 3929 | 
            +
                system("#{q(ruby)} #{q(launcherpath)} #{q(erroutpath)}")
         | 
| 3930 | 
            +
                expected = <<EOW
         | 
| 3931 | 
            +
            endblockwarn.rb:2: warning: END in method; use at_exit
         | 
| 3932 | 
            +
            (eval):2: warning: END in method; use at_exit
         | 
| 3933 | 
            +
            EOW
         | 
| 3934 | 
            +
                assert_equal(expected, File.read(erroutpath))
         | 
| 3935 | 
            +
                # expecting Tempfile to unlink launcher and errout file.
         | 
| 3936 | 
            +
              end).foo; end
         | 
| 3937 | 
            +
             | 
| 3938 | 
            +
            def (  def test_endblockwarn
         | 
| 3939 | 
            +
            <<EOF
         | 
| 3940 | 
            +
            irqDIR
         | 
| 3941 | 
            +
            cmd
         | 
| 3942 | 
            +
            EOF
         | 
| 3943 | 
            +
            <<EOW
         | 
| 3944 | 
            +
            endblat_exit
         | 
| 3945 | 
            +
            EOW
         | 
| 3946 | 
            +
              end).foo; end
         | 
| 3947 | 
            +
             | 
| 3948 | 
            +
            def (
         | 
| 3949 | 
            +
            <<EOF
         | 
| 3950 | 
            +
            irqDIR
         | 
| 3951 | 
            +
            cmd
         | 
| 3952 | 
            +
            EOF
         | 
| 3953 | 
            +
            <<EOW
         | 
| 3954 | 
            +
            endblat_exit
         | 
| 3955 | 
            +
            EOW
         | 
| 3956 | 
            +
            ).foo; end
         | 
| 3957 | 
            +
             | 
| 3958 | 
            +
             | 
| 3663 3959 | 
             
              ] ##############################END OF STANZAS#################################################
         | 
| 3664 3960 | 
             
              ###############################################################################################
         | 
| 3665 3961 |  | 
| @@ -3725,6 +4021,8 @@ EOS | |
| 3725 4021 | 
             
                'a rescue (...)',
         | 
| 3726 4022 | 
             
                "((...))",
         | 
| 3727 4023 | 
             
                'def ((...)).foo; end',
         | 
| 4024 | 
            +
                'def a0.(...); end',
         | 
| 4025 | 
            +
                'def a0.a1(a2=(...)); end',
         | 
| 3728 4026 | 
             
                'a0 = (...) rescue b0',
         | 
| 3729 4027 | 
             
                'a0 = ((...)) rescue b0',    
         | 
| 3730 4028 | 
             
                '(...)  #with a comment',
         | 
| @@ -3736,12 +4034,40 @@ EOS | |
| 3736 4034 | 
             
                "b=1;b (...)",
         | 
| 3737 4035 | 
             
                "return (...)",
         | 
| 3738 4036 | 
             
                '"#{(...)}"',
         | 
| 4037 | 
            +
                '"#{*(...)}"',
         | 
| 4038 | 
            +
                '*(...)',
         | 
| 4039 | 
            +
                '*(...)=y',
         | 
| 4040 | 
            +
                'a,*((...)).w=d,e,f',
         | 
| 4041 | 
            +
                'a,((...)).w,c=d,e,f',
         | 
| 4042 | 
            +
                '[(...),1,2,3]',
         | 
| 4043 | 
            +
                '{(...)=>x}',
         | 
| 4044 | 
            +
                '{x=>(...)}',
         | 
| 4045 | 
            +
                'm((...))',
         | 
| 4046 | 
            +
                'm (...)',
         | 
| 3739 4047 | 
             
              ]
         | 
| 3740 4048 | 
             
              INJECTABLES=[  #take it easy with these too
         | 
| 3741 4049 | 
             
                'p (1..10).method(:each)',
         | 
| 3742 4050 | 
             
                'a0 rescue b0',
         | 
| 3743 4051 | 
             
                'begin; r; t end',
         | 
| 3744 4052 | 
             
                'a=b,c=d',
         | 
| 4053 | 
            +
                "\n__END__\n",
         | 
| 4054 | 
            +
                '* =f,g',
         | 
| 4055 | 
            +
                '
         | 
| 4056 | 
            +
                 <<-foo
         | 
| 4057 | 
            +
                   xxx
         | 
| 4058 | 
            +
                 foo
         | 
| 4059 | 
            +
                 <<-bar
         | 
| 4060 | 
            +
                   yyy
         | 
| 4061 | 
            +
                 bar
         | 
| 4062 | 
            +
                ',
         | 
| 4063 | 
            +
                '
         | 
| 4064 | 
            +
                 <<-foo
         | 
| 4065 | 
            +
                   xxx
         | 
| 4066 | 
            +
                 foo
         | 
| 4067 | 
            +
                ',
         | 
| 4068 | 
            +
               'm;n',
         | 
| 4069 | 
            +
               'undef rth, hty',
         | 
| 4070 | 
            +
               'alias rth hty',
         | 
| 3745 4071 | 
             
              ]
         | 
| 3746 4072 | 
             
              if ENV['MANGLE']
         | 
| 3747 4073 | 
             
              else
         | 
| @@ -3750,9 +4076,16 @@ EOS | |
| 3750 4076 | 
             
                puts "warning: most data fuzzing is disabled; set MANGLE to enable"
         | 
| 3751 4077 | 
             
              end
         | 
| 3752 4078 |  | 
| 3753 | 
            -
              RUBYIDENT=/(( | 
| 4079 | 
            +
              RUBYIDENT=/((?:\$|@@?)?#{RubyLexer::LETTER}#{RubyLexer::LETTER_DIGIT}*[?!]?)/o
         | 
| 4080 | 
            +
             | 
| 4081 | 
            +
              SEEN_SNIPPETS={}
         | 
| 3754 4082 |  | 
| 3755 4083 | 
             
              def self.snippet2testmethod(snippet,wrap=nil)
         | 
| 4084 | 
            +
                if SEEN_SNIPPETS[snippet]
         | 
| 4085 | 
            +
                  return
         | 
| 4086 | 
            +
                else
         | 
| 4087 | 
            +
                  SEEN_SNIPPETS[snippet]=1
         | 
| 4088 | 
            +
                end
         | 
| 3756 4089 | 
             
                escaped=snippet.gsub(/[\\']/){"\\"+$&}
         | 
| 3757 4090 | 
             
                safe=escaped.gsub(/([^ -~])/){
         | 
| 3758 4091 | 
             
                  x=$1[0]
         | 
| @@ -3764,7 +4097,7 @@ EOS | |
| 3764 4097 | 
             
                safe.gsub! /\\\\/,"__"
         | 
| 3765 4098 | 
             
                safe[/[^ -~]|\\\\/] and fail
         | 
| 3766 4099 | 
             
                cp="check_parsing '#{escaped}'"
         | 
| 3767 | 
            -
                cp="#{wrap} | 
| 4100 | 
            +
                cp="#{wrap}('#{escaped}'){|x| check_parsing x}" if wrap
         | 
| 3768 4101 | 
             
                "
         | 
| 3769 4102 | 
             
                  define_method 'test_parsing_of_#{safe}' do
         | 
| 3770 4103 | 
             
                    #puts 'test_parsing_of_#{safe}'
         | 
| @@ -3836,27 +4169,31 @@ EOS | |
| 3836 4169 |  | 
| 3837 4170 | 
             
              Test::Unit::AssertionFailedError=MiniTest::Assertion unless defined? Test::Unit::AssertionFailedError
         | 
| 3838 4171 |  | 
| 3839 | 
            -
              def known_ruby_bug
         | 
| 4172 | 
            +
              def known_ruby_bug x
         | 
| 3840 4173 | 
             
                from=caller.first
         | 
| 3841 4174 | 
             
                from=from[/ in `.*'\Z/] || from[/\A[^:]*:[^:]*/]
         | 
| 3842 | 
            -
                yield
         | 
| 4175 | 
            +
                yield x
         | 
| 3843 4176 | 
             
              rescue Test::Unit::AssertionFailedError=>e
         | 
| 3844 | 
            -
                warn "a known bug in MRI reared its head in #{from}: #{ | 
| 4177 | 
            +
                warn "a known bug in ParseTree/MRI reared its head in #{from}: '#{x unless /\n./===x or x.size>65}'"
         | 
| 3845 4178 | 
             
                if defined? @@known_ruby_bugs
         | 
| 3846 | 
            -
                  @@known_ruby_bugs | 
| 4179 | 
            +
                  @@known_ruby_bugs<<x
         | 
| 3847 4180 | 
             
                else
         | 
| 3848 | 
            -
                   | 
| 3849 | 
            -
                   | 
| 4181 | 
            +
                  warn e.message
         | 
| 4182 | 
            +
                  @@known_ruby_bugs=[x]
         | 
| 4183 | 
            +
                  extra_summary {
         | 
| 4184 | 
            +
                    warn "unfixed bugs in ParseTree/MRI: #{@@known_ruby_bugs.size}"
         | 
| 4185 | 
            +
                    @@known_ruby_bugs.each{|bug| warn "  "+bug unless bug["\n"] }
         | 
| 4186 | 
            +
                  }
         | 
| 3850 4187 | 
             
                end
         | 
| 3851 4188 | 
             
              rescue Exception=>e
         | 
| 3852 4189 | 
             
                raise
         | 
| 3853 4190 | 
             
              else
         | 
| 3854 | 
            -
                warn "expected bug in MRI in #{from}, but was fixed(?!)"
         | 
| 4191 | 
            +
                warn "expected bug in ParseTree/MRI in #{from}, but was fixed(?!)"
         | 
| 3855 4192 | 
             
                if defined? @@known_ruby_bugs_fixed
         | 
| 3856 4193 | 
             
                  @@known_ruby_bugs_fixed+=1
         | 
| 3857 4194 | 
             
                else
         | 
| 3858 4195 | 
             
                  @@known_ruby_bugs_fixed=1
         | 
| 3859 | 
            -
                   | 
| 4196 | 
            +
                  extra_summary {warn "unexpectedly fixed known ParseTree/MRI bugs: #@@known_ruby_bugs_fixed"}
         | 
| 3860 4197 | 
             
                end
         | 
| 3861 4198 | 
             
              end
         | 
| 3862 4199 |  | 
| @@ -3936,7 +4273,6 @@ EOS | |
| 3936 4273 | 
             
                    foo
         | 
| 3937 4274 | 
             
                  "=>[[:str, "        \\\\\\\\\\\\'\n"]],
         | 
| 3938 4275 |  | 
| 3939 | 
            -
             | 
| 3940 4276 | 
             
                }.each_pair{|code,tree| 
         | 
| 3941 4277 | 
             
                  assert_equal tree,RedParse.new(code,'-',1,[],:cache_mode=>:none).parse.to_parsetree(:quirks)
         | 
| 3942 4278 | 
             
                }
         | 
| @@ -3959,7 +4295,7 @@ EOS | |
| 3959 4295 | 
             
                    @@missed_syntax_errors+=1
         | 
| 3960 4296 | 
             
                  else
         | 
| 3961 4297 | 
             
                    @@missed_syntax_errors=1
         | 
| 3962 | 
            -
                     | 
| 4298 | 
            +
                    extra_summary{warn "missed syntax errors: #@@missed_syntax_errors"}
         | 
| 3963 4299 | 
             
                  end
         | 
| 3964 4300 | 
             
                  #puts "warning: syntax error expected, but none was seen, expression: <<< #{xmpl} >>>" if 
         | 
| 3965 4301 | 
             
                  #  POWERS_OF_2[@@missed_syntax_errors]
         | 
| @@ -3979,6 +4315,7 @@ EOS | |
| 3979 4315 |  | 
| 3980 4316 | 
             
              def ParseTree.server_running_187?
         | 
| 3981 4317 | 
             
                #@server_running_187||=nil
         | 
| 4318 | 
            +
                return nil if !defined? @out
         | 
| 3982 4319 | 
             
                return @server_running_187 unless @server_running_187.nil?
         | 
| 3983 4320 | 
             
                put :version
         | 
| 3984 4321 | 
             
                version=get
         | 
| @@ -3992,41 +4329,25 @@ EOS | |
| 3992 4329 | 
             
                return @server_running_187= version=="1.8.7"
         | 
| 3993 4330 | 
             
              end
         | 
| 3994 4331 |  | 
| 4332 | 
            +
             | 
| 4333 | 
            +
             | 
| 4334 | 
            +
              @@differed_by_begin=0
         | 
| 3995 4335 | 
             
              def check_parsing xmpl
         | 
| 3996 | 
            -
                 | 
| 4336 | 
            +
                xmpl.force_encoding "binary"
         | 
| 3997 4337 | 
             
                xmpl=xmpl.dup.freeze
         | 
| 3998 4338 | 
             
                pt_opts=[:quirks]
         | 
| 3999 4339 | 
             
                pt_opts<<:ruby187 if ParseTree.server_running_187?
         | 
| 4000 4340 | 
             
                /unparse/===xmpl and warn 'unparse in parser test data!'
         | 
| 4001 4341 | 
             
                problem_exprs=problem_exprs()
         | 
| 4002 4342 | 
             
                nodes=warnings=warnings2=nil
         | 
| 4003 | 
            -
             | 
| 4004 | 
            -
                   | 
| 4005 | 
            -
                     | 
| 4006 | 
            -
             | 
| 4007 | 
            -
             | 
| 4008 | 
            -
             | 
| 4009 | 
            -
             | 
| 4010 | 
            -
                   | 
| 4011 | 
            -
                    ;0
         | 
| 4012 | 
            -
                  suffix
         | 
| 4013 | 
            -
            =end
         | 
| 4014 | 
            -
            #        tree=nil
         | 
| 4015 | 
            -
            #        output=false
         | 
| 4016 | 
            -
            #        loops=0
         | 
| 4017 | 
            -
                  begin
         | 
| 4018 | 
            -
            #        output=
         | 
| 4019 | 
            -
            #        catch(:never_exec_parse_data_try1){
         | 
| 4020 | 
            -
            #          catch(:never_exec_parse_data_try2){
         | 
| 4021 | 
            -
            #            catch(:never_exec_parse_data_try3){
         | 
| 4022 | 
            -
                          tree,warnings=ParseTree.parse_tree_and_warnings(xmpl)
         | 
| 4023 | 
            -
            #            }
         | 
| 4024 | 
            -
            #          }
         | 
| 4025 | 
            -
            #        }
         | 
| 4026 | 
            -
            #        break if loops+=1 > 3
         | 
| 4027 | 
            -
                  rescue Interrupt; raise
         | 
| 4028 | 
            -
                  rescue Exception=>e
         | 
| 4029 | 
            -
                    tree=e
         | 
| 4343 | 
            +
                if tree=$pt_known_output[xmpl]
         | 
| 4344 | 
            +
                  tree=tree.dup
         | 
| 4345 | 
            +
                  warnings=tree.pop[:warnings] if Array===tree and Hash===tree.last        #+[__,+{warnings:String}]
         | 
| 4346 | 
            +
                else
         | 
| 4347 | 
            +
                  tree,warnings=ParseTree.parse_tree_and_warnings(xmpl)
         | 
| 4348 | 
            +
                  PTLOG.record_pt_output(xmpl,tree,warnings) if ENV['PTLOG']
         | 
| 4349 | 
            +
                end
         | 
| 4350 | 
            +
                  if Exception===tree
         | 
| 4030 4351 | 
             
                    tree2=nodes=h=nil
         | 
| 4031 4352 | 
             
                    assert_hopefully_raises_Exception(xmpl){
         | 
| 4032 4353 | 
             
                      nodes=RedParse.new(xmpl,"-",1,[],:cache_mode=>:write_only).parse
         | 
| @@ -4044,8 +4365,14 @@ EOS | |
| 4044 4365 | 
             
                        assert true
         | 
| 4045 4366 | 
             
                      else
         | 
| 4046 4367 | 
             
                        assert_equal tree, RedParse.remove_silly_begins(tree2)
         | 
| 4047 | 
            -
                        warn "parse_trees differed by a :begin in #{xmpl}"
         | 
| 4048 4368 | 
             
                        differed_by_begin=true
         | 
| 4369 | 
            +
                        if @@differed_by_begin==0 or ENV['DIFFER_BY_BEGIN']
         | 
| 4370 | 
            +
                          warn "parse_trees differed by a :begin in #{xmpl}"
         | 
| 4371 | 
            +
                          extra_summary{warn "differed by begin: #@@differed_by_begin"} unless ENV['DIFFER_BY_BEGIN']
         | 
| 4372 | 
            +
                        elsif @@differed_by_begin==1
         | 
| 4373 | 
            +
                          warn "more parse_trees differ by a :begin (set DIFFER_BY_BEGIN for details)"
         | 
| 4374 | 
            +
                        end
         | 
| 4375 | 
            +
                        @@differed_by_begin+=1
         | 
| 4049 4376 | 
             
                      end
         | 
| 4050 4377 | 
             
                      assert_equal warnings, warnings2 if ENV['WARN_PICKINESS']
         | 
| 4051 4378 | 
             
                      if warnings != warnings2
         | 
| @@ -4053,7 +4380,7 @@ EOS | |
| 4053 4380 | 
             
                          @@mismatched_warnings+=1
         | 
| 4054 4381 | 
             
                        else
         | 
| 4055 4382 | 
             
                          @@mismatched_warnings=1
         | 
| 4056 | 
            -
                           | 
| 4383 | 
            +
                          extra_summary{warn "mismatched warnings: #@@mismatched_warnings (set WARN_PICKINESS for details)"}
         | 
| 4057 4384 | 
             
                        end
         | 
| 4058 4385 | 
             
                      end
         | 
| 4059 4386 | 
             
                    rescue Interrupt; raise
         | 
| @@ -4063,11 +4390,6 @@ EOS | |
| 4063 4390 | 
             
                        problem_exprs.flush
         | 
| 4064 4391 | 
             
                      end
         | 
| 4065 4392 | 
             
                      raise e
         | 
| 4066 | 
            -
                    else
         | 
| 4067 | 
            -
                      if false and problem_exprs and tree!=tree2
         | 
| 4068 | 
            -
                        problem_exprs.write xmpl+"\n"
         | 
| 4069 | 
            -
                        problem_exprs.flush
         | 
| 4070 | 
            -
                      end
         | 
| 4071 4393 | 
             
                    end #rescue false
         | 
| 4072 4394 |  | 
| 4073 4395 | 
             
                  end #until output.equal? tree 
         | 
| @@ -4078,7 +4400,7 @@ EOS | |
| 4078 4400 | 
             
                    assert_equal nodes,nodes2
         | 
| 4079 4401 |  | 
| 4080 4402 | 
             
                    begin
         | 
| 4081 | 
            -
                      unparsed=nodes.unparse
         | 
| 4403 | 
            +
                      unparsed=nodes.unparse :exact=>true, :linenum=>1
         | 
| 4082 4404 | 
             
                      if unparsed==xmpl
         | 
| 4083 4405 | 
             
                        assert true
         | 
| 4084 4406 | 
             
                        done_already=true
         | 
| @@ -4095,7 +4417,7 @@ EOS | |
| 4095 4417 | 
             
                            @@unparse_mismatched_linenums+=1
         | 
| 4096 4418 | 
             
                        else
         | 
| 4097 4419 | 
             
                            @@unparse_mismatched_linenums=1
         | 
| 4098 | 
            -
                             | 
| 4420 | 
            +
                            extra_summary{warn "unparse mismatched linenums: #@@unparse_mismatched_linenums"}
         | 
| 4099 4421 | 
             
                        end
         | 
| 4100 4422 | 
             
                      else
         | 
| 4101 4423 | 
             
                        assert true 
         | 
| @@ -4105,7 +4427,7 @@ EOS | |
| 4105 4427 | 
             
                    end unless done_already
         | 
| 4106 4428 |  | 
| 4107 4429 | 
             
                    assert_equal nodes, Marshal.load(Marshal.dump(nodes))
         | 
| 4108 | 
            -
                    assert_equal nodes, Ron.load(Ron.dump(nodes)) if defined? Ron
         | 
| 4430 | 
            +
                    #assert_equal nodes, Ron.load(Ron.dump(nodes)) if defined? Ron
         | 
| 4109 4431 | 
             
                    assert_equal nodes, nodes.deep_copy
         | 
| 4110 4432 |  | 
| 4111 4433 | 
             
                    unless done_already or Exception===tree or differed_by_begin
         |