Class: Puppet::Pops::Types::PTypeAliasType
Overview
Describes a named alias for another Type.
The alias is created with a name and an unresolved type expression. The type expression may
in turn contain other aliases (including the alias that contains it) which means that an alias
might contain self recursion. Whether or not that is the case is computed and remembered when the alias
is resolved since guarding against self recursive constructs is relatively expensive.
Defined Under Namespace
Classes: AssertOtherTypeAcceptor, AssertSelfRecursionStatusAcceptor
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
-
#accept(visitor, guard) ⇒ Object
-
#assignable?(o, guard = nil) ⇒ Boolean
-
#callable_args?(callable, guard) ⇒ Boolean
-
#check_self_recursion(originator) ⇒ Object
-
#eql?(o) ⇒ Boolean
-
#hash ⇒ Object
-
#initialize(name, type_expr, resolved_type = nil) ⇒ PTypeAliasType
constructor
A new instance of PTypeAliasType.
-
#instance?(o, guard = nil) ⇒ Boolean
-
#iterable?(guard = nil) ⇒ Boolean
-
#iterable_type(guard = nil) ⇒ Object
-
#kind_of_callable?(optional = true, guard = nil) ⇒ Boolean
-
#method_missing(name, *arguments, &block) ⇒ Object
Delegates to resolved type.
-
#really_instance?(o, guard = nil) ⇒ Boolean
private
-
#resolve(type_parser, loader) ⇒ PTypeAliasType
private
Called from the TypeParser once it has found a type using the Loader.
-
#resolved_type ⇒ PAnyType
Returns the resolved type.
-
#respond_to_missing?(name, include_private) ⇒ Boolean
Delegates to resolved type.
-
#self_recursion? ⇒ Boolean
-
#set_self_recursion_status ⇒ Object
-
#to_s ⇒ String
Returns the expanded string the form of the alias, e.g.
-
#type_expr ⇒ Object
private
nil to prevent serialization of the type_expr used when first initializing this instance.
Methods inherited from PAnyType
#==, #callable?, #create, #generalize, new_function, #normalize, #simple_name, simple_name, #to_alias_expanded_s
_ptype, create_ptype, register_ptypes
#_ptype
Constructor Details
#initialize(name, type_expr, resolved_type = nil) ⇒ PTypeAliasType
Returns a new instance of PTypeAliasType.
3100
3101
3102
3103
3104
3105
|
# File 'lib/puppet/pops/types/types.rb', line 3100
def initialize(name, type_expr, resolved_type = nil)
@name = name
@type_expr = type_expr
@resolved_type = resolved_type
@self_recursion = false
end
|
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(name, *arguments, &block) ⇒ Object
Delegates to resolved type
3268
3269
3270
3271
|
# File 'lib/puppet/pops/types/types.rb', line 3268
def method_missing(name, *arguments, &block)
super if @resolved_type.equal?(PTypeReferenceType::DEFAULT)
resolved_type.send(name, *arguments, &block)
end
|
Instance Attribute Details
3095
3096
3097
|
# File 'lib/puppet/pops/types/types.rb', line 3095
def name
@name
end
|
Class Method Details
.register_ptype(loader, ir) ⇒ Object
Instance Method Details
#accept(visitor, guard) ⇒ Object
3243
3244
3245
3246
3247
3248
|
# File 'lib/puppet/pops/types/types.rb', line 3243
def accept(visitor, guard)
guarded_recursion(guard, nil) do |g|
super(visitor, g)
@resolved_type.accept(visitor, g) unless @resolved_type.nil?
end
end
|
#assignable?(o, guard = nil) ⇒ Boolean
3107
3108
3109
3110
3111
3112
3113
3114
|
# File 'lib/puppet/pops/types/types.rb', line 3107
def assignable?(o, guard = nil)
if @self_recursion
guard ||= RecursionGuard.new
guard.with_this(self) { |state| state == RecursionGuard::SELF_RECURSION_IN_BOTH ? true : super(o, guard) }
else
super(o, guard)
end
end
|
#callable_args?(callable, guard) ⇒ Boolean
3126
3127
3128
|
# File 'lib/puppet/pops/types/types.rb', line 3126
def callable_args?(callable, guard)
guarded_recursion(guard, false) { |g| resolved_type.callable_args?(callable, g) }
end
|
#check_self_recursion(originator) ⇒ Object
3130
3131
3132
|
# File 'lib/puppet/pops/types/types.rb', line 3130
def check_self_recursion(originator)
resolved_type.check_self_recursion(originator) unless originator.equal?(self)
end
|
#eql?(o) ⇒ Boolean
3239
3240
3241
|
# File 'lib/puppet/pops/types/types.rb', line 3239
def eql?(o)
super && o.name == @name
end
|
3150
3151
3152
|
# File 'lib/puppet/pops/types/types.rb', line 3150
def hash
@name.hash
end
|
#instance?(o, guard = nil) ⇒ Boolean
3138
3139
3140
|
# File 'lib/puppet/pops/types/types.rb', line 3138
def instance?(o, guard = nil)
really_instance?(o, guard) == 1
end
|
#iterable?(guard = nil) ⇒ Boolean
3142
3143
3144
|
# File 'lib/puppet/pops/types/types.rb', line 3142
def iterable?(guard = nil)
guarded_recursion(guard, false) { |g| resolved_type.iterable?(g) }
end
|
#iterable_type(guard = nil) ⇒ Object
3146
3147
3148
|
# File 'lib/puppet/pops/types/types.rb', line 3146
def iterable_type(guard = nil)
guarded_recursion(guard, nil) { |g| resolved_type.iterable_type(g) }
end
|
#kind_of_callable?(optional = true, guard = nil) ⇒ Boolean
3134
3135
3136
|
# File 'lib/puppet/pops/types/types.rb', line 3134
def kind_of_callable?(optional=true, guard = nil)
guarded_recursion(guard, false) { |g| resolved_type.kind_of_callable?(optional, g) }
end
|
#really_instance?(o, guard = nil) ⇒ 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.
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
|
# File 'lib/puppet/pops/types/types.rb', line 3274
def really_instance?(o, guard = nil)
if @self_recursion
guard ||= RecursionGuard.new
guard.with_that(o) do
guard.with_this(self) { |state| state == RecursionGuard::SELF_RECURSION_IN_BOTH ? 0 : resolved_type.really_instance?(o, guard) }
end
else
resolved_type.really_instance?(o, guard)
end
end
|
#resolve(type_parser, loader) ⇒ PTypeAliasType
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.
Called from the TypeParser once it has found a type using the Loader. The TypeParser will
interpret the contained expression and the resolved type is remembered. This method also
checks and remembers if the resolve type contains self recursion.
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
|
# File 'lib/puppet/pops/types/types.rb', line 3200
def resolve(type_parser, loader)
if @resolved_type.nil?
@resolved_type = PTypeReferenceType::DEFAULT
@self_recursion = true begin
if @type_expr.is_a?(PTypeReferenceType)
@resolved_type = @type_expr.resolve(type_parser, loader)
else
@resolved_type = type_parser.interpret(@type_expr, loader).normalize
end
guard = RecursionGuard.new
real_type_asserter = AssertOtherTypeAcceptor.new
accept(real_type_asserter, guard)
unless real_type_asserter.other_type_detected?
raise ArgumentError, "Type alias '#{name}' cannot be resolved to a real type"
end
@self_recursion = guard.recursive_this?(self)
if @self_recursion
accept(AssertSelfRecursionStatusAcceptor.new, RecursionGuard.new)
when_self_recursion_detected
end
rescue
@resolved_type = nil
raise
end
else
@resolved_type.resolve(type_parser, loader) unless @resolved_type.equal?(PTypeReferenceType::DEFAULT)
end
self
end
|
#resolved_type ⇒ PAnyType
Returns the resolved type. The type must have been resolved by a call prior to calls to this
method or an error will be raised.
3121
3122
3123
3124
|
# File 'lib/puppet/pops/types/types.rb', line 3121
def resolved_type
raise Puppet::Error, "Reference to unresolved type #{@name}" unless @resolved_type
@resolved_type
end
|
#respond_to_missing?(name, include_private) ⇒ Boolean
Delegates to resolved type
3263
3264
3265
|
# File 'lib/puppet/pops/types/types.rb', line 3263
def respond_to_missing?(name, include_private)
resolved_type.respond_to?(name, include_private)
end
|
#self_recursion? ⇒ Boolean
3250
3251
3252
|
# File 'lib/puppet/pops/types/types.rb', line 3250
def self_recursion?
@self_recursion
end
|
#set_self_recursion_status ⇒ Object
3183
3184
3185
3186
3187
3188
3189
3190
|
# File 'lib/puppet/pops/types/types.rb', line 3183
def set_self_recursion_status
return if @self_recursion || @resolved_type.is_a?(PTypeReferenceType)
@self_recursion = true
guard = RecursionGuard.new
accept(NoopTypeAcceptor::INSTANCE, guard)
@self_recursion = guard.recursive_this?(self)
when_self_recursion_detected if @self_recursion end
|
#to_s ⇒ String
Returns the expanded string the form of the alias, e.g. =
3258
3259
3260
|
# File 'lib/puppet/pops/types/types.rb', line 3258
def to_s
TypeFormatter.singleton.alias_expanded_string(self)
end
|
#type_expr ⇒ Object
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.
Returns nil to prevent serialization of the type_expr used when first initializing this instance.
3287
3288
3289
|
# File 'lib/puppet/pops/types/types.rb', line 3287
def type_expr
nil
end
|