class Sfp::SasTranslator::ParameterGrounder
Attributes
map[RW]
Public Class Methods
new(root, map={})
click to toggle source
# File lib/sfp/sas_translator.rb, line 1805 def initialize(root, map={}) @root = root @map = map end
Public Instance Methods
visit(name, value, obj)
click to toggle source
# File lib/sfp/sas_translator.rb, line 1810 def visit(name, value, obj) return if name[0,1] == '_' and name != '_value' and name != '_template' # substituting left side if name[0,1] != '_' modified = false map.each { |k,v| #puts k + ',' + name if v.is_a?(Sfp::Undefined) or v.is_a?(Sfp::Unknown) next if v.is_a?(Sfp::Undefined) or v.is_a?(Sfp::Unknown) if name == k obj[v] = value obj.delete(name) name = v value['_self'] = name if value.is_a?(Hash) modified = true break elsif name.length > k.length and name[k.length,1] == '.' and name[0, k.length] == k #next if v.is_a?(Sfp::Undefined) or v.is_a?(Sfp::Unknown) grounded = v + name[k.length, (name.length-k.length)] obj[grounded] = value obj.delete(name) name = grounded value['_self'] = name if value.is_a?(Hash) modified = true break end } if modified and (name =~ /.*\.parent(\..*)?/ ) parent, last = name.pop_ref parent_value = @root.at?(parent) raise VariableNotFoundException, parent if parent_value.nil? new_name = @root.at?(parent).ref.push(last) if last != 'parent' new_name = @root.at?(parent).ref.to_top if last == 'parent' obj[new_name] = value obj.delete(name) name = new_name value['_self'] = name if value.is_a?(Hash) end end # TODO ----- HACK! ----- if obj.is_a?(Hash) and obj.isconstraint and obj['_type'] == 'iterator' and value.is_a?(String) and value.isref and map.has_key?(value) obj[name] = value = map[value] #puts map[value].inspect #puts "==>> " + obj.ref.push(name) end # ------ END of HACK! ---- # substituting right side if value.is_a?(String) and value.isref map.each { |k,v| if value == k obj[name] = v break elsif value.length > k.length and value[k.length,1] == '.' and value[0,k.length] == k and not(v.is_a?(Sfp::Undefined) or v.is_a?(Sfp::Unknown)) obj[name] = v + value[k.length, (value.length-k.length)] break end } end return true end