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