Sha256: eed40111ae0ae9296b47434e181d50484c17cc894078597506c13b75f2b0a558

Contents?: true

Size: 1.58 KB

Versions: 34

Compression:

Stored size: 1.58 KB

Contents

# frozen_string_literal: true

class Code
  class Node
    class Call < Node
      class Block < Node
        def initialize(parsed)
          return if parsed.blank?

          @parameters = parsed.delete(:parameters) { [] }.presence || []
          @parameters.map! { |parameter| FunctionParameter.new(parameter) }

          @body = Code.new(parsed.delete(:body).presence)
        end

        def evaluate(**_args)
          Object::Function.new(@parameters, @body)
        end
      end

      def initialize(parsed)
        return if parsed.blank?

        @name = parsed.delete(:name).presence
        @arguments = parsed.delete(:arguments).presence || []
        @arguments.map! { |argument| CallArgument.new(argument) }

        return unless parsed.key?(:block)

        @block = Call::Block.new(parsed.delete(:block).presence)
      end

      def evaluate(**args)
        arguments = []

        (@arguments || []).each do |argument|
          if argument.keyword?
            if arguments.last.is_a?(Object::Dictionary)
              arguments.last.code_merge!(argument.evaluate(**args))
            else
              arguments << argument.evaluate(**args)
            end
          else
            arguments << argument.evaluate(**args)
          end
        end

        arguments << @block.evaluate(**args) if @block

        name = Object::String.new(@name)

        args.fetch(:object).call(
          operator: name,
          arguments: Object::List.new(arguments),
          **args
        )
      end

      def resolve(**_args)
        Object::String.new(@name)
      end
    end
  end
end

Version data entries

34 entries across 34 versions & 1 rubygems

Version Path
code-ruby-1.2.5 lib/code/node/call.rb
code-ruby-1.2.4 lib/code/node/call.rb
code-ruby-1.2.3 lib/code/node/call.rb
code-ruby-1.2.2 lib/code/node/call.rb
code-ruby-1.2.1 lib/code/node/call.rb
code-ruby-1.1.3 lib/code/node/call.rb
code-ruby-1.1.1 lib/code/node/call.rb
code-ruby-1.1.0 lib/code/node/call.rb
code-ruby-1.0.0 lib/code/node/call.rb
code-ruby-0.15.16 lib/code/node/call.rb
code-ruby-0.15.15 lib/code/node/call.rb
code-ruby-0.15.14 lib/code/node/call.rb
code-ruby-0.15.13 lib/code/node/call.rb
code-ruby-0.15.12 lib/code/node/call.rb
code-ruby-0.15.11 lib/code/node/call.rb
code-ruby-0.15.10 lib/code/node/call.rb
code-ruby-0.15.9 lib/code/node/call.rb
code-ruby-0.15.8 lib/code/node/call.rb
code-ruby-0.15.7 lib/code/node/call.rb
code-ruby-0.15.6 lib/code/node/call.rb