Class: Red::DefinitionNode::ClassNode

Inherits:
Object
  • Object
show all
Defined in:
lib/red/definition_nodes.rb

Overview

:nodoc:

Instance Method Summary collapse

Constructor Details

#initialize(class_name, superclass, scope) ⇒ ClassNode

Returns a new instance of ClassNode.



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# File 'lib/red/definition_nodes.rb', line 4

def initialize(class_name, superclass, scope)
  raise(BuildError::NoClassInheritance, "Class inheritance is currently not supported#{"for the #{@@red_library} JavaScript library";''}") if superclass
  old_class = @@red_class
  @@red_class = @class = class_name
  @class_name, @superclass = [class_name, superclass].build_nodes
  block_node = scope.assoc(:block) || scope
  if initializer_node = block_node.rassoc(:initialize)
    args_node = initializer_node.assoc(:scope).assoc(:block).assoc(:args)
    @arguments = (args_node[1..-1] || []).build_nodes
    @initializer = initializer_node.assoc(:scope).assoc(:block).reject {|node| node == args_node}.build_node
  end
  properties = block_node.select {|node| (node.first == :cvdecl) rescue false }
  functions = block_node.select {|node| (node != initializer_node) && ![:block, :scope].include?(node) }
  @slots = (properties | functions).build_nodes
  @@red_class = old_class
end

Instance Method Details

#compile_as_standard_class(options = {}) ⇒ Object



33
34
35
36
37
38
39
# File 'lib/red/definition_nodes.rb', line 33

def compile_as_standard_class(options = {})
  class_name = @class_name.compile_node
  arguments = @arguments.compile_nodes.join(', ')
  slots = @slots.compile_nodes(:as_attribute => true)
  initializer = @initializer.compile_node
  return "%s%s = function(%s) { %s;%s }" % [self.var?, class_name, arguments, initializer, slots]
end

#compile_as_virtual_class(options = {}) ⇒ Object



41
42
43
44
45
# File 'lib/red/definition_nodes.rb', line 41

def compile_as_virtual_class(options = {})
  class_name = @class_name.compile_node
  slots = @slots.compile_nodes(:as_prototype => true).compact.join(', ')
  return "%s%s = { %s }" % [self.var?, class_name, slots]
end

#compile_node(options = {}) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
# File 'lib/red/definition_nodes.rb', line 21

def compile_node(options = {})
  old_class = @@red_class
  @@red_class = @class
  if @initializer
    output = self.compile_as_standard_class
  else
    output = self.compile_as_virtual_class
  end
  @@red_class = old_class
  return output
end

#var?Boolean

Returns:

  • (Boolean)


47
48
49
# File 'lib/red/definition_nodes.rb', line 47

def var?
  return "var " unless @class_name.is_a?(LiteralNode::NamespaceNode)
end