class NScript::IfNode

Public Class Methods

new(condition, body, else_body=nil, tags={}) click to toggle source
# File lib/nscript/parser/nodes.rb, line 854
def initialize(condition, body, else_body=nil, tags={})
  @condition = condition
  @body      = body && body.unwrap
  @else_body = else_body && else_body.unwrap
  @tags      = tags
  @multiple  = true if @condition.is_a?(Array)
  @condition = OpNode.new("!", ParentheticalNode.new(@condition)) if @tags[:invert]
end

Public Instance Methods

<<(else_body) click to toggle source
# File lib/nscript/parser/nodes.rb, line 863
def <<(else_body)
  eb = else_body.unwrap
  @else_body ? @else_body << eb : @else_body = eb
  self
end
add_comment(comment) click to toggle source
# File lib/nscript/parser/nodes.rb, line 869
def add_comment(comment)
  @comment = comment
  self
end
add_else(exprs) click to toggle source
# File lib/nscript/parser/nodes.rb, line 886
def add_else(exprs)
  chain? ? @else_body.add_else(exprs) : @else_body = (exprs && exprs.unwrap)
  self
end
chain?() click to toggle source
# File lib/nscript/parser/nodes.rb, line 891
def chain?
  @chain ||= @else_body && @else_body.is_a?(IfNode)
end
compile_condition(o) click to toggle source
# File lib/nscript/parser/nodes.rb, line 899
def compile_condition(o)
  [@condition].flatten.map {|c| c.compile(o) }.join(' || ')
end
compile_node(o) click to toggle source
# File lib/nscript/parser/nodes.rb, line 903
def compile_node(o)
  write(statement? ? compile_statement(o) : compile_ternary(o))
end
compile_statement(o) click to toggle source
# File lib/nscript/parser/nodes.rb, line 907
def compile_statement(o)
  child       = o.delete(:chain_child)
  cond_o      = o.dup
  cond_o.delete(:return)
  o[:indent]  = idt(1)
  o[:top]     = true
  if_dent     = child ? '' : idt
  com_dent    = child ? idt : ''
  prefix      = @comment ? @comment.compile(cond_o) + "\n#{com_dent}" : ''
  body        = Expressions.wrap(@body).compile(o)
  if_part     = "#{prefix}#{if_dent}if (#{compile_condition(cond_o)}) {\n#{body}\n#{idt}}"
  return if_part unless @else_body
  else_part = chain? ?
    " else #{@else_body.compile(o.merge(:indent => idt, :chain_child => true))}" :
    " else {\n#{Expressions.wrap(@else_body).compile(o)}\n#{idt}}"
  if_part + else_part
end
compile_ternary(o) click to toggle source
# File lib/nscript/parser/nodes.rb, line 925
def compile_ternary(o)
  if_part   = "#{@condition.compile(o)} ? #{@body.compile(o)}"
  else_part = @else_body ? "#{@else_body.compile(o)}" : 'null'
  "#{if_part} : #{else_part}"
end
force_statement() click to toggle source
# File lib/nscript/parser/nodes.rb, line 874
def force_statement
  @tags[:statement] = true
  self
end
rewrite_condition(expression) click to toggle source
# File lib/nscript/parser/nodes.rb, line 879
def rewrite_condition(expression)
  @condition = @multiple ? @condition.map {|c| OpNode.new("is", expression, c) } :
                           OpNode.new("is", expression, @condition)
  @else_body.rewrite_condition(expression) if chain?
  self
end
statement?() click to toggle source
# File lib/nscript/parser/nodes.rb, line 895
def statement?
  @is_statement ||= !!(@comment || @tags[:statement] || @body.statement? || (@else_body && @else_body.statement?))
end