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.



1805
1806
1807
1808
# File 'lib/sfp/sas_translator.rb', line 1805

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

Instance Attribute Details

#mapObject

Returns the value of attribute map.



1803
1804
1805
# File 'lib/sfp/sas_translator.rb', line 1803

def map
  @map
end

Instance Method Details

#visit(name, value, obj) ⇒ Object



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
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
# 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