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
# 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 }.build_nodes
  @functions = block_node.select {|node| (node != initializer_node) && ![:block, :scope].include?(node) && ((node.first != :cvdecl) rescue false) }.build_nodes
  @@red_class = old_class
end

Instance Method Details

#compile_as_standard_class(options = {}) ⇒ Object



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

def compile_as_standard_class(options = {})
  class_name = @class_name.compile_node
  arguments = @arguments.compile_nodes.join(', ')
  initializer = @initializer.compile_node
  functions = @functions.compile_nodes(:as_attribute => true).join('; ')
  properties = @properties.compile_nodes.join('; ')
  return "%s%s = function(%s) { %s;%s }; %s" % [self.var?, class_name, arguments, initializer, functions, properties]
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 = (@properties | @functions).compile_nodes(:as_prototype => true).compact.join(', ')
  return "%s%s = { %s }" % [self.var?, class_name, slots]
end

#compile_node(options = {}) ⇒ Object



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

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