Sha256: c2926ac577b52e8b4b6e5f057f92cb77fa143ac5c054eeaf1caaaaadbfcf8895

Contents?: true

Size: 1.88 KB

Versions: 1

Compression:

Stored size: 1.88 KB

Contents

module Duby::AST
  class FunctionalCall < Node
    include Named
    attr_accessor :parameters, :block, :cast
    alias cast? cast
        
    def initialize(parent, line_number, name, &kids)
      super(parent, line_number, &kids)
      @parameters, @block = children
      @name = name
      @cast = false
    end
        
    def infer(typer)
      @self_type ||= typer.self_type

      unless @inferred_type
        receiver_type = @self_type
        should_defer = false
        
        parameter_types = parameters.map do |param|
          typer.infer(param) || should_defer = true
        end
        
        unless should_defer
          if parameters.size == 1 && typer.known_types[name]
            # cast operation
            resolved!
            self.cast = true
            @inferred_type = typer.known_types[name]
          else
            @inferred_type = typer.method_type(receiver_type, name,
                                               parameter_types)
          end
        end
        
        @inferred_type ? resolved! : typer.defer(self)
      end
        
      @inferred_type
    end
  end
  
  class Call < Node
    include Named
    attr_accessor :target, :parameters, :block

    def initialize(parent, line_number, name, &kids)
      super(parent, line_number, children, &kids)
      @target, @parameters, @block = children
      @name = name
    end

    def infer(typer)
      unless @inferred_type
        receiver_type = typer.infer(target)
        should_defer = false
        parameter_types = parameters.map do |param|
          typer.infer(param) || should_defer = true
        end
        
        unless should_defer
          @inferred_type = typer.method_type(receiver_type, name,
                                             parameter_types)
        end
        
        @inferred_type ? resolved! : typer.defer(self)
      end
        
      @inferred_type
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
duby-0.0.1 lib/duby/ast/call.rb