Class: Duby::AST::ClassDefinition

Inherits:
Node show all
Includes:
Named, Scope
Defined in:
lib/duby/compiler.rb,
lib/duby/ast/class.rb

Direct Known Subclasses

InterfaceDeclaration

Instance Attribute Summary collapse

Attributes included from Named

#name

Attributes inherited from Node

#children, #inferred_type, #newline, #parent, #position

Instance Method Summary collapse

Methods included from Named

#to_s

Methods inherited from Node

#[], #each, #expr?, #inspect, #line_number, #log, #precompile, #resolve_if, #resolved!, #resolved?, #simple_name, #temp, #to_s

Constructor Details

#initialize(parent, line_number, name, &block) ⇒ ClassDefinition

Returns a new instance of ClassDefinition.



7
8
9
10
11
12
13
14
15
# File 'lib/duby/ast/class.rb', line 7

def initialize(parent, line_number, name, &block)
  @interfaces = []
  @name = name
  if Duby::AST.type_factory.respond_to? :declare_type
    Duby::AST.type_factory.declare_type(self)
  end
  super(parent, line_number, &block)
  @superclass, @body = children
end

Instance Attribute Details

#bodyObject

Returns the value of attribute body.



5
6
7
# File 'lib/duby/ast/class.rb', line 5

def body
  @body
end

#interfacesObject

Returns the value of attribute interfaces.



5
6
7
# File 'lib/duby/ast/class.rb', line 5

def interfaces
  @interfaces
end

#superclassObject

Returns the value of attribute superclass.



5
6
7
# File 'lib/duby/ast/class.rb', line 5

def superclass
  @superclass
end

Instance Method Details

#compile(compiler, expression) ⇒ Object



167
168
169
# File 'lib/duby/compiler.rb', line 167

def compile(compiler, expression)
  compiler.define_class(self, expression)
end

#implements(*types) ⇒ Object

Raises:

  • (ArgumentError)


32
33
34
35
# File 'lib/duby/ast/class.rb', line 32

def implements(*types)
  raise ArgumentError if types.any? {|x| x.nil?}
  @interfaces.concat types
end

#infer(typer) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/duby/ast/class.rb', line 17

def infer(typer)
  unless resolved?
    @inferred_type ||= typer.define_type(name, superclass, @interfaces) do
      if body
        typer.infer(body)
      else
        typer.no_type
      end
    end
    @inferred_type ? resolved! : typer.defer(self)
  end

  @inferred_type
end