unparser 0.1.0 → 0.1.1
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.
- data/lib/unparser/constants.rb +3 -1
- data/lib/unparser/emitter/assignment.rb +1 -3
- data/lib/unparser/emitter/binary.rb +1 -1
- data/lib/unparser/emitter/block.rb +1 -3
- data/lib/unparser/emitter/break.rb +4 -4
- data/lib/unparser/emitter/def.rb +1 -3
- data/lib/unparser/emitter/defined.rb +1 -3
- data/lib/unparser/emitter/if.rb +8 -3
- data/lib/unparser/emitter/literal/dynamic.rb +1 -3
- data/lib/unparser/emitter/literal/dynamic_body.rb +1 -1
- data/lib/unparser/emitter/literal/execute_string.rb +1 -3
- data/lib/unparser/emitter/literal/regexp.rb +0 -2
- data/lib/unparser/emitter/next.rb +5 -3
- data/lib/unparser/emitter/return.rb +1 -13
- data/lib/unparser/emitter.rb +32 -3
- data/spec/unit/unparser_spec.rb +68 -1
- data/unparser.gemspec +1 -1
- metadata +2 -2
    
        data/lib/unparser/constants.rb
    CHANGED
    
    | @@ -76,7 +76,9 @@ module Unparser | |
| 76 76 | 
             
                K_THEN     = 'then'
         | 
| 77 77 |  | 
| 78 78 | 
             
                TERMINATED = [
         | 
| 79 | 
            -
                  :int, :float, :self, :kwbegin, :const, :regexp
         | 
| 79 | 
            +
                  :int, :float, :self, :kwbegin, :const, :regexp, :args, :lvar,
         | 
| 80 | 
            +
                  :ivar, :gvar, :cvar, :if, :case, :module, :class, :sclass, :super,
         | 
| 81 | 
            +
                  :yield, :zsuper, :break, :next, :defined?, :str, :block
         | 
| 80 82 | 
             
                ].to_set
         | 
| 81 83 |  | 
| 82 84 | 
             
                KEYWORDS = constants.each_with_object([]) do |name, keywords|
         | 
| @@ -16,10 +16,10 @@ module Unparser | |
| 16 16 | 
             
                  # @api private
         | 
| 17 17 | 
             
                  #
         | 
| 18 18 | 
             
                  def dispatch
         | 
| 19 | 
            -
                     | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
                       | 
| 19 | 
            +
                    maybe_parentheses(parent_type == :or || parent_type == :and) do
         | 
| 20 | 
            +
                      write(K_BREAK)
         | 
| 21 | 
            +
                      return unless arguments
         | 
| 22 | 
            +
                      visit_parentheses(arguments)
         | 
| 23 23 | 
             
                    end
         | 
| 24 24 | 
             
                  end
         | 
| 25 25 |  | 
    
        data/lib/unparser/emitter/def.rb
    CHANGED
    
    
    
        data/lib/unparser/emitter/if.rb
    CHANGED
    
    | @@ -34,7 +34,7 @@ module Unparser | |
| 34 34 | 
             
                  # @api private
         | 
| 35 35 | 
             
                  #
         | 
| 36 36 | 
             
                  def unless?
         | 
| 37 | 
            -
                    !if_branch
         | 
| 37 | 
            +
                    !if_branch && else_branch
         | 
| 38 38 | 
             
                  end
         | 
| 39 39 |  | 
| 40 40 | 
             
                  # Return keyword
         | 
| @@ -64,8 +64,13 @@ module Unparser | |
| 64 64 | 
             
                  # @api private
         | 
| 65 65 | 
             
                  #
         | 
| 66 66 | 
             
                  def emit_if_branch
         | 
| 67 | 
            -
                     | 
| 68 | 
            -
             | 
| 67 | 
            +
                    if if_branch
         | 
| 68 | 
            +
                      visit_indented(if_branch)
         | 
| 69 | 
            +
                    end
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                    if !if_branch && !else_branch
         | 
| 72 | 
            +
                      nl
         | 
| 73 | 
            +
                    end
         | 
| 69 74 | 
             
                  end
         | 
| 70 75 |  | 
| 71 76 | 
             
                  # Emit else branch
         | 
| @@ -14,9 +14,11 @@ module Unparser | |
| 14 14 | 
             
                  # @api private
         | 
| 15 15 | 
             
                  #
         | 
| 16 16 | 
             
                  def dispatch
         | 
| 17 | 
            -
                     | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 17 | 
            +
                    maybe_parentheses(parent_type == :or || parent_type == :and) do
         | 
| 18 | 
            +
                      write(K_NEXT)
         | 
| 19 | 
            +
                      return if children.empty?
         | 
| 20 | 
            +
                      visit_parentheses(children.first)
         | 
| 21 | 
            +
                    end
         | 
| 20 22 | 
             
                  end
         | 
| 21 23 |  | 
| 22 24 | 
             
                end # Next
         | 
| @@ -17,20 +17,8 @@ module Unparser | |
| 17 17 | 
             
                  #
         | 
| 18 18 | 
             
                  def dispatch
         | 
| 19 19 | 
             
                    write(K_RETURN)
         | 
| 20 | 
            -
                    emit_argument
         | 
| 21 | 
            -
                  end
         | 
| 22 | 
            -
             | 
| 23 | 
            -
                  # Emit argument
         | 
| 24 | 
            -
                  #
         | 
| 25 | 
            -
                  # @return [undefined]
         | 
| 26 | 
            -
                  #
         | 
| 27 | 
            -
                  # @api private
         | 
| 28 | 
            -
                  #
         | 
| 29 | 
            -
                  def emit_argument
         | 
| 30 20 | 
             
                    return unless argument
         | 
| 31 | 
            -
                     | 
| 32 | 
            -
                      visit(argument)
         | 
| 33 | 
            -
                    end
         | 
| 21 | 
            +
                    visit_parentheses(argument)
         | 
| 34 22 | 
             
                  end
         | 
| 35 23 |  | 
| 36 24 | 
             
                end # Return
         | 
    
        data/lib/unparser/emitter.rb
    CHANGED
    
    | @@ -202,13 +202,42 @@ module Unparser | |
| 202 202 | 
             
                #
         | 
| 203 203 | 
             
                def visit_terminated(node)
         | 
| 204 204 | 
             
                  emitter = emitter(node)
         | 
| 205 | 
            -
                   | 
| 206 | 
            -
                     | 
| 207 | 
            -
                    return
         | 
| 205 | 
            +
                  maybe_parentheses(!emitter.terminated?) do
         | 
| 206 | 
            +
                    emitter.write_to_buffer
         | 
| 208 207 | 
             
                  end
         | 
| 209 208 | 
             
                  emitter.write_to_buffer
         | 
| 210 209 | 
             
                end
         | 
| 211 210 |  | 
| 211 | 
            +
                # Visit within parentheses
         | 
| 212 | 
            +
                #
         | 
| 213 | 
            +
                # @param [Parser::AST::Node] node
         | 
| 214 | 
            +
                #
         | 
| 215 | 
            +
                # @return [undefined]
         | 
| 216 | 
            +
                #
         | 
| 217 | 
            +
                # @api private
         | 
| 218 | 
            +
                #
         | 
| 219 | 
            +
                def visit_parentheses(node, *arguments)
         | 
| 220 | 
            +
                  parentheses(*arguments) do
         | 
| 221 | 
            +
                    visit(node)
         | 
| 222 | 
            +
                  end
         | 
| 223 | 
            +
                end
         | 
| 224 | 
            +
             | 
| 225 | 
            +
                # Call block in optional parentheses
         | 
| 226 | 
            +
                #
         | 
| 227 | 
            +
                # @param [true, false] flag
         | 
| 228 | 
            +
                #
         | 
| 229 | 
            +
                # @return [undefined]
         | 
| 230 | 
            +
                #
         | 
| 231 | 
            +
                # @api private
         | 
| 232 | 
            +
                #
         | 
| 233 | 
            +
                def maybe_parentheses(flag)
         | 
| 234 | 
            +
                  if flag
         | 
| 235 | 
            +
                    parentheses { yield }
         | 
| 236 | 
            +
                  else
         | 
| 237 | 
            +
                    yield
         | 
| 238 | 
            +
                  end
         | 
| 239 | 
            +
                end
         | 
| 240 | 
            +
             | 
| 212 241 | 
             
                # Return emitter for node
         | 
| 213 242 | 
             
                #
         | 
| 214 243 | 
             
                # @param [Parser::AST::Node] node
         | 
    
        data/spec/unit/unparser_spec.rb
    CHANGED
    
    | @@ -143,6 +143,7 @@ describe Unparser do | |
| 143 143 | 
             
                    assert_generates '1..2', %q(1..2)
         | 
| 144 144 | 
             
                    assert_source   '(0.0 / 0.0)..1'
         | 
| 145 145 | 
             
                    assert_source   '1..(0.0 / 0.0)'
         | 
| 146 | 
            +
                    assert_source   '(0.0 / 0.0)..100'
         | 
| 146 147 | 
             
                  end
         | 
| 147 148 |  | 
| 148 149 | 
             
                  context 'erange' do
         | 
| @@ -317,9 +318,67 @@ describe Unparser do | |
| 317 318 | 
             
                    end
         | 
| 318 319 | 
             
                  RUBY
         | 
| 319 320 |  | 
| 320 | 
            -
                   | 
| 321 | 
            +
                  assert_source <<-RUBY
         | 
| 322 | 
            +
                    foo.bar do
         | 
| 323 | 
            +
                    end.baz
         | 
| 324 | 
            +
                  RUBY
         | 
| 325 | 
            +
             | 
| 321 326 | 
             
                  assert_source '(1..2).max'
         | 
| 327 | 
            +
                  assert_source '1..2.max'
         | 
| 322 328 | 
             
                  assert_source '(a = b).bar'
         | 
| 329 | 
            +
                  assert_source '@ivar.bar'
         | 
| 330 | 
            +
                  assert_source '//.bar'
         | 
| 331 | 
            +
                  assert_source '$var.bar'
         | 
| 332 | 
            +
                  assert_source '"".bar'
         | 
| 333 | 
            +
                  assert_source 'defined?(@foo).bar'
         | 
| 334 | 
            +
             | 
| 335 | 
            +
                  assert_source <<-RUBY
         | 
| 336 | 
            +
                    begin
         | 
| 337 | 
            +
                    rescue
         | 
| 338 | 
            +
                    end.bar
         | 
| 339 | 
            +
                  RUBY
         | 
| 340 | 
            +
             | 
| 341 | 
            +
                  assert_source <<-RUBY
         | 
| 342 | 
            +
                    case foo
         | 
| 343 | 
            +
                    when bar
         | 
| 344 | 
            +
                    end.baz
         | 
| 345 | 
            +
                  RUBY
         | 
| 346 | 
            +
             | 
| 347 | 
            +
                  assert_source <<-RUBY
         | 
| 348 | 
            +
                    class << self
         | 
| 349 | 
            +
                    end.bar
         | 
| 350 | 
            +
                  RUBY
         | 
| 351 | 
            +
             | 
| 352 | 
            +
                  assert_source 'break.foo'
         | 
| 353 | 
            +
                  assert_source 'next.foo'
         | 
| 354 | 
            +
                  assert_source 'super(a).foo'
         | 
| 355 | 
            +
                  assert_source 'super.foo'
         | 
| 356 | 
            +
                  assert_source 'yield(a).foo'
         | 
| 357 | 
            +
                  assert_source 'yield.foo'
         | 
| 358 | 
            +
                  assert_source 'array[i].foo'
         | 
| 359 | 
            +
                  assert_source '(array[i] = 1).foo'
         | 
| 360 | 
            +
                  assert_source 'array[1..2].foo'
         | 
| 361 | 
            +
                  assert_source '(a.attribute ||= foo).bar'
         | 
| 362 | 
            +
             | 
| 363 | 
            +
                  assert_source <<-RUBY
         | 
| 364 | 
            +
                    class Foo
         | 
| 365 | 
            +
                    end.bar
         | 
| 366 | 
            +
                  RUBY
         | 
| 367 | 
            +
             | 
| 368 | 
            +
                  assert_source <<-RUBY
         | 
| 369 | 
            +
                    module Foo
         | 
| 370 | 
            +
                    end.bar
         | 
| 371 | 
            +
                  RUBY
         | 
| 372 | 
            +
             | 
| 373 | 
            +
                  assert_source <<-RUBY
         | 
| 374 | 
            +
                    if foo
         | 
| 375 | 
            +
                    end.baz
         | 
| 376 | 
            +
                  RUBY
         | 
| 377 | 
            +
             | 
| 378 | 
            +
                  assert_source <<-RUBY
         | 
| 379 | 
            +
                    local = 1
         | 
| 380 | 
            +
                    local.bar
         | 
| 381 | 
            +
                  RUBY
         | 
| 323 382 |  | 
| 324 383 | 
             
                  assert_source 'foo.bar(*args)'
         | 
| 325 384 | 
             
                  assert_source 'foo.bar(*arga, foo, *argb)'
         | 
| @@ -604,6 +663,11 @@ describe Unparser do | |
| 604 663 | 
             
                      9
         | 
| 605 664 | 
             
                    end
         | 
| 606 665 | 
             
                  RUBY
         | 
| 666 | 
            +
             | 
| 667 | 
            +
                  assert_source <<-RUBY
         | 
| 668 | 
            +
                    if foo
         | 
| 669 | 
            +
                    end
         | 
| 670 | 
            +
                  RUBY
         | 
| 607 671 | 
             
                end
         | 
| 608 672 |  | 
| 609 673 | 
             
                context 'def' do
         | 
| @@ -900,6 +964,8 @@ describe Unparser do | |
| 900 964 | 
             
                    assert_source "a #{operator} b"
         | 
| 901 965 | 
             
                    assert_source "(a #{operator} b).foo"
         | 
| 902 966 | 
             
                  end
         | 
| 967 | 
            +
             | 
| 968 | 
            +
                  assert_source 'left / right'
         | 
| 903 969 | 
             
                end
         | 
| 904 970 |  | 
| 905 971 | 
             
                context 'nested binary operators' do
         | 
| @@ -917,6 +983,7 @@ describe Unparser do | |
| 917 983 |  | 
| 918 984 | 
             
                { :or => :'||', :and => :'&&' }.each do |word, symbol|
         | 
| 919 985 | 
             
                  assert_generates "a #{word} break foo", "a #{symbol} (break(foo))"
         | 
| 986 | 
            +
                  assert_generates "a #{word} next foo", "a #{symbol} (next(foo))"
         | 
| 920 987 | 
             
                end
         | 
| 921 988 |  | 
| 922 989 | 
             
                context 'expansion of shortcuts' do
         | 
    
        data/unparser.gemspec
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: unparser
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.1. | 
| 4 | 
            +
              version: 0.1.1
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| @@ -9,7 +9,7 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2013-09- | 
| 12 | 
            +
            date: 2013-09-06 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: parser
         |