Class: Sfp::SasTranslator::ParameterGrounder

Inherits:
Object
  • Object
show all
Defined in:
lib/sfp/sas_translator.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(root, map = {}) ⇒ ParameterGrounder

Returns a new instance of ParameterGrounder.



1778
1779
1780
1781
# File 'lib/sfp/sas_translator.rb', line 1778

def initialize(root, map={})
	@root = root
	@map = map
end

Instance Attribute Details

#mapObject

Returns the value of attribute map.



1776
1777
1778
# File 'lib/sfp/sas_translator.rb', line 1776

def map
  @map
end

Instance Method Details

#visit(name, value, obj) ⇒ Object



1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
# File 'lib/sfp/sas_translator.rb', line 1783

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