class TypeProf::Core::Type::Instance - typeprof: Ruby Standard Library Documentation

# class TypeProf::Core::Type::Instance

### Attributes

args[R]
mod[R]

### Public Class Methods

new(genv, mod, args) click to toggle source

: (`GlobalEnv`, `ModuleEntity`, ::Array[Vertex]) -> void

    # File typeprof-0.30.1/lib/typeprof/core/type.rb, line 78
    def initialize(genv, mod, args)
      raise mod.class.to_s unless mod.is_a?(ModuleEntity)
      @mod = mod
      @args = args
      raise unless @args.is_a?(::Array)
    end

### Public Instance Methods

base_type(_) click to toggle source

    # File typeprof-0.30.1/lib/typeprof/core/type.rb, line 87
    def base_type(_)
      self
    end

check_match(genv, changes, vtx) click to toggle source

    # File typeprof-0.30.1/lib/typeprof/core/type.rb, line 91
    def check_match(genv, changes, vtx)
      vtx.each_type do |other_ty|
        case other_ty
        when Instance
          ty = self
          while ty
            if ty.mod == other_ty.mod
              args_all_match = true
              ty.args.zip(other_ty.args) do |arg, other_arg|
                unless arg.check_match(genv, changes, other_arg)
                  args_all_match = false
                  break
                end
              end
              return true if args_all_match
            end
            changes.add_depended_superclass(ty.mod)

            if other_ty.mod.module?
              return true if check_match_included_modules(genv, changes, ty, other_ty)
            end

            ty = genv.get_superclass_type(ty, changes, {})
          end
        end
      end
      return false
    end

check_match_included_modules(genv, changes, ty, other_ty) click to toggle source

    # File typeprof-0.30.1/lib/typeprof/core/type.rb, line 120
    def check_match_included_modules(genv, changes, ty, other_ty)
      ty.mod.included_modules.each do |inc_decl, inc_mod|
        if inc_decl.is_a?(AST::SigIncludeNode) && inc_mod.type_params
          inc_ty = genv.get_instance_type(inc_mod, inc_decl.args, changes, {}, ty)
        else
          type_params = inc_mod.type_params.map {|ty_param| Source.new() } # TODO: better support
          inc_ty = Type::Instance.new(genv, inc_mod, type_params)
        end
        if inc_ty.mod == other_ty.mod
          args_all_match = true
          inc_ty.args.zip(other_ty.args) do |arg, other_arg|
            if other_arg && !arg.check_match(genv, changes, other_arg)
              args_all_match = false
              break
            end
          end
          return true if args_all_match
        end
        changes.add_depended_superclass(inc_ty.mod)

        return true if check_match_included_modules(genv, changes, inc_ty, other_ty)
      end
      return false
    end

show() click to toggle source

    # File typeprof-0.30.1/lib/typeprof/core/type.rb, line 145
    def show
      case @mod.cpath
      when [:NilClass] then "nil"
      when [:TrueClass] then "true"
      when [:FalseClass] then "false"
      else
        "#{ @mod.show_cpath }#{ @args.empty? ? "" : "[#{ @args.map {|arg| Type.strip_parens(arg.show) }.join(", ") }]" }"
      end
    end