lib/caricature/clr/descriptor.rb in caricature-0.6.1 vs lib/caricature/clr/descriptor.rb in caricature-0.6.3
- old
+ new
@@ -1,22 +1,52 @@
module Caricature
+ # Contains the logic to collect members from a CLR type
+ module ClrMemberCollector
+
+ private
+ # collects the instance members for a CLR type.
+ # makes sure it can handle indexers for properties etc.
+ def collect_members_from(meths, properties, instance_member=true)
+
+ mem = []
+ mem += meths.collect do |mi|
+ MemberDescriptor.new(mi.name.underscore, mi.return_type, instance_member)
+ end
+ properties.each do |pi|
+ prop_name = property_name_from(pi)
+ mem << MemberDescriptor.new(prop_name, pi.property_type, instance_member)
+ mem << MemberDescriptor.new("__setitem__", nil, instance_member) if prop_name == "__getitem__"
+ mem << MemberDescriptor.new("#{prop_name}=", nil, instance_member) if pi.can_write and prop_name != "__getitem__"
+ end
+ mem
+ end
+
+ # gets the property name from the +PropertyInfo+
+ # when the property is an indexer it will return +[]+
+ def property_name_from(property_info)
+ return property_info.name.underscore if property_info.get_index_parameters.empty?
+ "__getitem__"
+ end
+
+ end
+
# describes clr interfaces.
# Because CLR interfaces can't have static members this descriptor does not collect any class members
class ClrInterfaceDescriptor < TypeDescriptor
+ include ClrMemberCollector
+
# collects instance members on this interface
# it will collect properties, methods and property setters
def initialize_instance_members_for(klass)
clr_type = klass.to_clr_type
properties = clr_type.collect_interface_properties
methods = clr_type.collect_interface_methods
- @instance_members += methods.collect { |mi| MemberDescriptor.new(mi.name.underscore, mi.return_type) }
- @instance_members += properties.collect { |pi| MemberDescriptor.new(pi.name.underscore, pi.property_type) }
- @instance_members += properties.select { |pi| pi.can_write }.collect { |pi| MemberDescriptor.new("#{pi.name.underscore}=", nil) }
+ @instance_members = collect_members_from methods, properties
end
# this method is empty because an interface can't have static members
def initialize_class_members_for(klass); end
@@ -24,31 +54,29 @@
# Describes a CLR class type. it collects the properties and methods on an instance as well as on a static level
class ClrClassDescriptor < TypeDescriptor
+ include ClrMemberCollector
+
# collects all the instance members of the provided CLR class type
def initialize_instance_members_for(klass)
clr_type = klass.to_clr_type
methods = Workarounds::ReflectionHelper.get_instance_methods(clr_type)
properties = Workarounds::ReflectionHelper.get_instance_properties(clr_type)
- @instance_members += methods.collect { |mi| MemberDescriptor.new(mi.name.underscore, mi.return_type) }
- @instance_members += properties.collect { |pi| MemberDescriptor.new(pi.name.underscore, pi.property_type) }
- @instance_members += properties.select{|pi| pi.can_write }.collect { |pi| MemberDescriptor.new("#{pi.name.underscore}=", nil) }
+ @instance_members = collect_members_from methods, properties
end
# collects all the static members of the provided CLR class type
def initialize_class_members_for(klass)
clr_type = klass.to_clr_type
methods = Workarounds::ReflectionHelper.get_class_methods(clr_type)
properties = Workarounds::ReflectionHelper.get_class_properties(clr_type)
- @class_members += methods.collect { |mi| MemberDescriptor.new(mi.name.underscore, mi.return_type, false) }
- @class_members += properties.collect { |pi| MemberDescriptor.new(pi.name.underscore, pi.property_type, false) }
- @class_members += properties.select{|pi| pi.can_write }.collect { |pi| MemberDescriptor.new("#{pi.name.underscore}=", nil, false) }
+ @class_members = collect_members_from methods, properties, false
end
end
end
\ No newline at end of file