Class: RubyLess::RubyLessProcessor

Inherits:
SexpProcessor
  • Object
show all
Defined in:
lib/processor.rb

Constant Summary collapse

INFIX_OPERATOR =
['<=>', '==', '<', '>', '<=', '>=', '-', '+', '*', '/', '%']
PREFIX_OPERATOR =
['-@']

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(helper) ⇒ RubyLessProcessor

Returns a new instance of RubyLessProcessor.



21
22
23
24
25
26
27
28
# File 'lib/processor.rb', line 21

def initialize(helper)
  super()
  @helper = helper
  @indent = "  "
  self.auto_shift_type = true
  self.strict = true
  self.expected = TypedString
end

Instance Attribute Details

#rubyObject (readonly)

Returns the value of attribute ruby.



11
12
13
# File 'lib/processor.rb', line 11

def ruby
  @ruby
end

Class Method Details

.translate(string, helper) ⇒ Object



16
17
18
19
# File 'lib/processor.rb', line 16

def self.translate(string, helper)
  sexp = RubyParser.new.parse(string)
  self.new(helper).process(sexp)
end

Instance Method Details

#process_and(exp) ⇒ Object

def process(exp)

return nil if exp.nil?
method = exp.shift
send("process_#{method}", exp)

end



36
37
38
# File 'lib/processor.rb', line 36

def process_and(exp)
  t "(#{process(exp.shift)} and #{process(exp.shift)})", Boolean
end

#process_arglist(exp) ⇒ Object



77
78
79
80
81
82
83
# File 'lib/processor.rb', line 77

def process_arglist(exp)
  code = t("")
  until exp.empty? do
    code.append_argument(process(exp.shift))
  end
  code
end

#process_array(exp) ⇒ Object



85
86
87
88
# File 'lib/processor.rb', line 85

def process_array(exp)
  res = process_arglist(exp)
  exp.size > 1 ? t("[#{res}]", res.opts) : res
end

#process_call(exp) ⇒ Object



63
64
65
66
67
68
69
70
71
# File 'lib/processor.rb', line 63

def process_call(exp)
  receiver_node_type = exp.first.nil? ? nil : exp.first.first
  receiver = process exp.shift

  # receiver = t("(#{receiver})", receiver.klass) if
  #   Ruby2Ruby::ASSIGN_NODES.include? receiver_node_type

  method_call(receiver, exp)
end

#process_dstr(exp) ⇒ Object



108
109
110
# File 'lib/processor.rb', line 108

def process_dstr(exp)
  t "\"#{parse_dstr(exp)}\"", String
end

#process_evstr(exp) ⇒ Object



112
113
114
# File 'lib/processor.rb', line 112

def process_evstr(exp)
  exp.empty? ? t('', String) : process(exp.shift)
end

#process_fcall(exp) ⇒ Object



73
74
75
# File 'lib/processor.rb', line 73

def process_fcall(exp)
  method_call(nil, exp)
end

#process_if(exp) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/processor.rb', line 48

def process_if(exp)
  cond      = process(exp.shift)
  true_res  = process(exp.shift)
  false_res = process(exp.shift)

  if true_res && false_res && true_res.klass != false_res.klass
    raise "Error in conditional expression: '#{true_res}' and '#{false_res}' do not return results of same type (#{true_res.klass} != #{false_res.klass})."
  end
  raise "Error in conditional expression." unless true_res || false_res
  opts = {}
  opts[:nil] = true_res.nil? || true_res.could_be_nil? || false_res.nil? || false_res.could_be_nil?
  opts[:class] = true_res ? true_res.klass : false_res.klass
  t "#{cond} ? #{true_res || 'nil'} : #{false_res || 'nil'}", opts
end

#process_lit(exp) ⇒ Object



99
100
101
102
# File 'lib/processor.rb', line 99

def process_lit(exp)
  lit = exp.shift
  t lit.inspect, lit.class == Symbol ? Symbol : Number
end

#process_not(exp) ⇒ Object



44
45
46
# File 'lib/processor.rb', line 44

def process_not(exp)
  t "not #{process(exp.shift)}", Boolean
end

#process_or(exp) ⇒ Object



40
41
42
# File 'lib/processor.rb', line 40

def process_or(exp)
  t "(#{process(exp.shift)} or #{process(exp.shift)})", Boolean
end

#process_str(exp) ⇒ Object



104
105
106
# File 'lib/processor.rb', line 104

def process_str(exp)
  t exp.shift.inspect, String
end

#process_vcall(exp) ⇒ Object



90
91
92
93
94
95
96
97
# File 'lib/processor.rb', line 90

def process_vcall(exp)
  var_name = exp.shift
  unless opts = get_method([var_name], @helper, false)
    raise "Unknown variable or method '#{var_name}'."
  end
  method = opts[:method]
  t method, opts
end