lib/raap/value/module.rb in raap-0.3.0 vs lib/raap/value/module.rb in raap-0.4.0

- old
+ new

@@ -1,18 +1,57 @@ module RaaP module Value # FIXME: consider self_types # HINT: intersection? - class Module - attr_reader :type + class Module < BasicObject + def initialize(type, size: 3) + @type = type.is_a?(::String) ? ::RaaP::RBS.parse_type(type) : type + @size = size + unless @type.instance_of?(::RBS::Types::ClassInstance) + ::Kernel.raise ::TypeError, "not a module type: #{@type}" + end - def initialize(type) - @type = type - const = ::Object.const_get(type.name.absolute!.to_s) - extend(const) + one_instance_ancestors = ::RaaP::RBS.builder.ancestor_builder.one_instance_ancestors(@type.name.absolute!).self_types + @self_type = if one_instance_ancestors.nil? || one_instance_ancestors.empty? + ::Object.new + else + one_instance_ancestors.map do |a_instance| + if a_instance.args.empty? + # : BasicObject + a_instance.name.absolute!.to_s + else + # : _Each[Integer] + args = a_instance.args.zip(@type.args).map do |_var, instance| + if instance + instance.to_s + else + 'untyped' + end + end + "#{a_instance.name}[#{args.map(&:to_s).join(', ')}]" + end + end.then do |ts| + ts << 'Object' if !ts.include?('::BasicObject') + Type.new(ts.join(' & ')).pick(size:) + end + end + const = ::Object.const_get(@type.name.absolute!.to_s) + BindCall.extend(@self_type, const) end - def inspect = "#<module #{@type}>" + def method_missing(name, *args, **kwargs, &block) + @self_type.__send__(name, *args, **kwargs, &block) + end + + def respond_to?(name, include_all = false) + if BindCall.instance_of?(@self_type, ::BasicObject) + BindCall.respond_to?(@self_type, name, include_all) + else + @self_type.respond_to?(name, include_all) + end + end + + def inspect = "#<module #{@type} : #{BindCall.class(@self_type)} size=#{@size}>" def class = Value::Module end end end