blob: 0cbcb0909213e08018dc78a5acb037fbe5b4f387 [file] [log] [blame]
###############################################################################
# Copyright (c) 2005, 2007 IBM Corporation and others.
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Eclipse Public License v1.0
# which accompanies this distribution, and is available at
# http://www.eclipse.org/legal/epl-v10.html
#
###############################################################################
require 'bigdecimal'
require 'complex'
require 'date'
require 'set'
def atomic?(obj)
atomic_types = [Bignum, FalseClass, Fixnum, Float, Integer, NilClass,
Numeric, Range, Regexp, String, Symbol, TrueClass]
atomic_types.include?(obj.class)
end
def has_children?(obj)
not atomic?(obj)
end
def get_string(obj)
obj.nil? ? 'nil' : (atomic?(obj) ? obj.to_s : '')
end
def prepare_object(name, obj)
x = { :name => name,
:eval_name => name,
:_type => obj.class,
:is_cosntant => false,
:has_children => has_children?(obj),
:_value => get_string(obj),
:key => obj.object_id }
if x[:has_children]
children = obj.instance_variables.collect { |var|
real_var = obj.instance_variable_get(var)
{ :name => var,
:eval_name => ('self' == name) ? var : sprintf("%s.instance_eval('%s')", name, var),
:_type => real_var.class,
:is_constant => false,
:has_children => has_children?(real_var),
:_value => get_string(real_var),
:key => real_var.object_id }
}
x[:num_children] = children.length
x[:children_props] = children
end
x
end
def prepare_array(name, array)
x = { :name => name,
:eval_name => name,
:_type => array.class,
:is_cosntant => false,
:has_children => true,
:_value => '[...]',
:key => array.object_id }
index = -1
children = array.collect { |value|
index += 1
{ :name => sprintf('[%d]', index),
:eval_name => sprintf('%s[%d]', name, index),
:_type => value.class,
:is_constant => false,
:has_children => has_children?(value),
:_value => get_string(value),
:key => value.object_id }
}
x[:num_children] = children.length
x[:children_props] = children
x
end
def prepare_hash(name, hash)
x = { :name => name,
:eval_name => name,
:_type => hash.class,
:is_cosntant => false,
:has_children => true,
:_value => '{...}',
:key => hash.object_id }
children = hash.collect { |key, value|
{ :name => sprintf("[%s]", key.inspect),
:eval_name => sprintf("%s[%s]", name, key.inspect),
:_type => value.class,
:is_constant => false,
:has_children => has_children?(value),
:_value => get_string(value),
:key => value.object_id }
}
x[:num_children] = children.length
x[:children_props] = children
x
end
def prepare_match_data(name, obj)
x = { :name => name,
:eval_name => name,
:_type => obj.class,
:is_cosntant => false,
:has_children => true,
:_value => '[...]',
:key => obj.object_id }
index = -1
children = obj.to_a.collect { |value|
index += 1
{ :name => sprintf('[%d]', index),
:eval_name => sprintf('%s[%d]', name, index),
:_type => value.class,
:is_constant => false,
:has_children => has_children?(value),
:_value => get_string(value),
:key => value.object_id }
}
x[:num_children] = children.length
x[:children_props] = children
x
end
def make_property(name, obj)
type = obj.class
if type == Hash
prepare_hash(name, obj)
elsif type == Array
prepare_array(name, obj)
elsif type == MatchData
prepare_match_data(name, obj)
else
prepare_object(name, obj)
end
end