class Sfp::SasTranslator::VariableCollector
collecting all variables and put them into @bucket
Public Class Methods
new(main)
click to toggle source
Calls superclass method
Sfp::SasTranslator::Visitor::new
# File lib/sfp/sas_translator.rb, line 1665 def initialize(main) super(main) @init = main.root['initial'] end
Public Instance Methods
add_value(type, value)
click to toggle source
# File lib/sfp/sas_translator.rb, line 1725 def add_value(type, value) if not @types.has_key?(type) @types[type] = Array.new @types[type] << Sfp::SasTranslator.null_of(type) if @types[type].length <= 0 end @types[type] << value if not (value.is_a?(Hash) and value.isnull) end
get_type(name, value, parent)
click to toggle source
# File lib/sfp/sas_translator.rb, line 1702 def get_type(name, value, parent) return value.type if value.is_a?(Sfp::Undefined) or value.is_a?(Sfp::Unknown) type = nil if parent.has_key?('_isa') isa = @main.root.at?(parent['_isa']) if not isa.nil? type = isa.type?(name) return type if not type.nil? end end type = self.isa?(value) return "(#{value['_isa']})" if value.is_a?(Hash) and value.isset and value.has_key?('_isa') return nil if type == nil return type if type.is_a?(String) and type.isref parent_class = @root.at?( @vars[parent.ref].type ) return parent_class[name]['_isa'] end
is_final(value)
click to toggle source
# File lib/sfp/sas_translator.rb, line 1741 def is_final(value) return true if value.is_a?(Hash) and not value.isnull and not value.isset return false end
isa?(value)
click to toggle source
# File lib/sfp/sas_translator.rb, line 1733 def isa?(value) return '$.Boolean' if value.is_a?(TrueClass) or value.is_a?(FalseClass) return '$.Integer' if value.is_a?(Numeric) return '$.String' if value.is_a?(String) and not value.isref return value['_isa'] if value.is_a?(Hash) and value.isobject return nil end
null_value(isa)
click to toggle source
# File lib/sfp/sas_translator.rb, line 1698 def null_value(isa) return {'_context' => 'null', '_isa' => isa} end
visit(name, value, parent)
click to toggle source
# File lib/sfp/sas_translator.rb, line 1670 def visit(name, value, parent) return false if name[0,1] == '_' return false if (value.is_a?(Hash) and not (value.isobject or value.isnull or value.isset)) # or value.is_a?(Array) var_name = parent.ref.push(name) isfinal = self.is_final(value) isref = (value.is_a?(String) and value.isref) isset = false value = @init.at?(value) if isref type = (isfinal ? self.isa?(value) : self.get_type(name, value, parent)) if type == nil raise Exception, "Unrecognized type of variable: #{var_name}:#{value.class}" else value = null_value(type) if value == nil isset = true if type[0,1] == '(' var = Variable.new(var_name, type, -1, value, nil, isfinal) var.isset = isset @vars[var.name] = var if isfinal and value.is_a?(Hash) value['_classes'].each { |c| add_value(c, value) } elsif not isref add_value(type, value) end end return true end