Class: Puppet::Pops::Types::PCallableType

Inherits:
PAnyType show all
Defined in:
lib/puppet/pops/types/types.rb

Constant Summary collapse

DEFAULT =
PCallableType.new(nil, nil, nil)

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from PAnyType

#==, #assignable?, #callable?, #check_self_recursion, #create, #iterable?, #iterable_type, #name, new_function, #new_function, #really_instance?, #simple_name, simple_name, #to_alias_expanded_s, #to_s

Methods inherited from TypedModelObject

_ptype, create_ptype, register_ptypes

Methods included from PuppetObject

#_ptype

Constructor Details

#initialize(param_types, block_type = nil, return_type = nil) ⇒ PCallableType

Returns a new instance of PCallableType.



2141
2142
2143
2144
2145
# File 'lib/puppet/pops/types/types.rb', line 2141

def initialize(param_types, block_type = nil, return_type = nil)
  @param_types = param_types
  @block_type = block_type
  @return_type = return_type == PAnyType::DEFAULT ? nil : return_type
end

Instance Attribute Details

#block_typePAnyType|nil (readonly)

Although being an abstract type reference, only Callable, or all Callables wrapped in Optional or Variant are supported If not set, the meaning is that block is not supported.



2136
2137
2138
# File 'lib/puppet/pops/types/types.rb', line 2136

def block_type
  @block_type
end

#param_typesPTupleType (readonly)

Types of parameters as a Tuple with required/optional count, or an Integer with min (required), max count



2130
2131
2132
# File 'lib/puppet/pops/types/types.rb', line 2130

def param_types
  @param_types
end

#return_typePAnyType (readonly)

Returns The type for the values returned by this callable. Returns ‘nil` if return value is unconstrained.



2126
2127
2128
# File 'lib/puppet/pops/types/types.rb', line 2126

def return_type
  @return_type
end

Class Method Details

.register_ptype(loader, ir) ⇒ Object



2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
# File 'lib/puppet/pops/types/types.rb', line 2108

def self.register_ptype(loader, ir)
  create_ptype(loader, ir, 'AnyType',
    'param_types' => {
      KEY_TYPE => POptionalType.new(PTupleType::DEFAULT),
      KEY_VALUE => nil
    },
    'block_type' => {
      KEY_TYPE => POptionalType.new(PCallableType::DEFAULT),
      KEY_VALUE => nil
    },
    'return_type' => {
      KEY_TYPE => POptionalType.new(PType::DEFAULT),
      KEY_VALUE => PAnyType::DEFAULT
    }
  )
end

Instance Method Details

#accept(visitor, guard) ⇒ Object



2147
2148
2149
2150
2151
2152
# File 'lib/puppet/pops/types/types.rb', line 2147

def accept(visitor, guard)
  super
  @param_types.accept(visitor, guard) unless @param_types.nil?
  @block_type.accept(visitor, guard) unless @block_type.nil?
  @return_type.accept(visitor, guard) unless @return_type.nil?
end

#block_rangeObject

Range [0,0], [0,1], or [1,1] for the block



2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
# File 'lib/puppet/pops/types/types.rb', line 2203

def block_range
  case block_type
  when POptionalType
    [0,1]
  when PVariantType, PCallableType
    [1,1]
  else
    [0,0]
  end
end

#callable_args?(required_callable_t, guard) ⇒ Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



2181
2182
2183
2184
# File 'lib/puppet/pops/types/types.rb', line 2181

def callable_args?(required_callable_t, guard)
  # If the required callable is euqal or more specific than self, self is acceptable arguments
  required_callable_t.assignable?(self, guard)
end

#eql?(o) ⇒ Boolean



2218
2219
2220
# File 'lib/puppet/pops/types/types.rb', line 2218

def eql?(o)
  self.class == o.class && @param_types == o.param_types && @block_type == o.block_type && @return_type == o.return_type
end

#generalizeObject



2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
# File 'lib/puppet/pops/types/types.rb', line 2154

def generalize
  if self == DEFAULT
    DEFAULT
  else
    params_t = @param_types.nil? ? nil : @param_types.generalize
    block_t = @block_type.nil? ? nil : @block_type.generalize
    return_t = @return_type.nil? ? nil : @return_type.generalize
    @param_types.equal?(params_t) && @block_type.equal?(block_t) && @return_type.equal?(return_t) ? self : PCallableType.new(params_t, block_t, return_t)
  end
end

#hashObject



2214
2215
2216
# File 'lib/puppet/pops/types/types.rb', line 2214

def hash
  [@param_types, @block_type, @return_type].hash
end

#instance?(o, guard = nil) ⇒ Boolean



2176
2177
2178
# File 'lib/puppet/pops/types/types.rb', line 2176

def instance?(o, guard = nil)
  assignable?(TypeCalculator.infer(o), guard)
end

#kind_of_callable?(optional = true, guard = nil) ⇒ Boolean



2186
2187
2188
# File 'lib/puppet/pops/types/types.rb', line 2186

def kind_of_callable?(optional=true, guard = nil)
  true
end

#last_rangeObject

Returns the number of accepted arguments for the last parameter type [min, max]



2197
2198
2199
# File 'lib/puppet/pops/types/types.rb', line 2197

def last_range
  @param_types.nil? ? nil : @param_types.repeat_last_range
end

#normalize(guard = nil) ⇒ Object



2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
# File 'lib/puppet/pops/types/types.rb', line 2165

def normalize(guard = nil)
  if self == DEFAULT
    DEFAULT
  else
    params_t = @param_types.nil? ? nil : @param_types.normalize(guard)
    block_t = @block_type.nil? ? nil : @block_type.normalize(guard)
    return_t = @return_type.nil? ? nil : @return_type.normalize(guard)
    @param_types.equal?(params_t) && @block_type.equal?(block_t) && @return_type.equal?(return_t) ? self : PCallableType.new(params_t, block_t, return_t)
  end
end

#resolve(type_parser, loader) ⇒ Object



2222
2223
2224
2225
2226
2227
# File 'lib/puppet/pops/types/types.rb', line 2222

def resolve(type_parser, loader)
  params_t = @param_types.nil? ? nil : @param_types.resolve(type_parser, loader)
  block_t = @block_type.nil? ? nil : @block_type.resolve(type_parser, loader)
  return_t = @return_type.nil? ? nil : @return_type.resolve(type_parser, loader)
  @param_types.equal?(params_t) && @block_type.equal?(block_t) && @return_type.equal?(return_t) ? self : self.class.new(params_t, block_t, return_t)
end

#size_rangeObject

Returns the number of accepted arguments [min, max]



2191
2192
2193
# File 'lib/puppet/pops/types/types.rb', line 2191

def size_range
  @param_types.nil? ? nil : @param_types.size_range
end