Sha256: e9626a28513d46e10c716465787ffee8e501256e5b40c5b0744181f68f05fa5c

Contents?: true

Size: 1.9 KB

Versions: 24

Compression:

Stored size: 1.9 KB

Contents

# frozen_string_literal: true

class Code
  class Node
    class If < Node
      IF_KEYWORD = "if"
      UNLESS_KEYWORD = "unless"
      ELSIF_KEYWORD = "elsif"
      ELSE_KEYWORD = "else"

      class Else < Node
        attr_reader :operator, :statement, :body

        def initialize(parsed)
          @operator = parsed.delete(:operator)
          @body = Node::Code.new(parsed.delete(:body))

          return unless parsed.key?(:statement)

          @statement = Node::Statement.new(parsed.delete(:statement))
        end
      end

      def initialize(parsed)
        @first_operator = parsed.delete(:first_operator)
        @first_statement = Node::Statement.new(parsed.delete(:first_statement))
        @first_body = Node::Code.new(parsed.delete(:first_body))
        @elses =
          parsed.delete(:elses) { [] }.map { |elses| Node::If::Else.new(elses) }
        super(parsed)
      end

      def evaluate(**args)
        if @first_operator == IF_KEYWORD &&
             @first_statement.evaluate(**args).truthy?
          @first_body.evaluate(**args)
        elsif @first_operator == UNLESS_KEYWORD &&
              @first_statement.evaluate(**args).falsy?
          @first_body.evaluate(**args)
        else
          @elses.each do |elses|
            if elses.operator == ELSIF_KEYWORD &&
                 elses.statement.evaluate(**args).truthy?
              return elses.body.evaluate(**args)
            elsif elses.operator == IF_KEYWORD &&
                  elses.statement.evaluate(**args).truthy?
              return elses.body.evaluate(**args)
            elsif elses.operator == UNLESS_KEYWORD &&
                  elses.statement.evaluate(**args).falsy?
              return elses.body.evaluate(**args)
            elsif elses.operator == ELSE_KEYWORD
              return elses.body.evaluate(**args)
            end
          end

          ::Code::Object::Nothing.new
        end
      end
    end
  end
end

Version data entries

24 entries across 24 versions & 1 rubygems

Version Path
code-ruby-0.10.4 lib/code/node/if.rb
code-ruby-0.10.3 lib/code/node/if.rb
code-ruby-0.10.2 lib/code/node/if.rb
code-ruby-0.10.1 lib/code/node/if.rb
code-ruby-0.10.0 lib/code/node/if.rb
code-ruby-0.9.3 lib/code/node/if.rb
code-ruby-0.9.2 lib/code/node/if.rb
code-ruby-0.9.1 lib/code/node/if.rb
code-ruby-0.9.0 lib/code/node/if.rb
code-ruby-0.8.5 lib/code/node/if.rb
code-ruby-0.8.4 lib/code/node/if.rb
code-ruby-0.8.3 lib/code/node/if.rb
code-ruby-0.8.2 lib/code/node/if.rb
code-ruby-0.8.1 lib/code/node/if.rb
code-ruby-0.8.0 lib/code/node/if.rb
code-ruby-0.7.8 lib/code/node/if.rb
code-ruby-0.7.7 lib/code/node/if.rb
code-ruby-0.7.6 lib/code/node/if.rb
code-ruby-0.7.5 lib/code/node/if.rb
code-ruby-0.6.4 lib/code/node/if.rb