Class: Rigor::Type::Nominal

Inherits:
Object
  • Object
show all
Includes:
AcceptanceRouter, ValueSemantics
Defined in:
lib/rigor/type/nominal.rb

Overview

An instance type for a Ruby class or module. The class is identified by its fully-qualified Ruby name; the registry attached to the environment owns the class lookup.

Slice 4 phase 2d adds ‘type_args`: an ordered, frozen array of `Rigor::Type` values that carry the receiver’s generic instantiation. The empty array is the canonical “raw” form (‘Nominal`); a non-empty array represents an applied generic (`Nominal[Array, [Integer]]`). Two Nominals are structurally equal only when their `class_name` AND `type_args` match, so the raw form and any applied form are intentionally distinct values. Acceptance routes treat the raw form leniently for backward compatibility with phase 2b call sites that have not yet learned to carry generics.

Type arguments MUST be ‘Rigor::Type` instances. The constructor freezes the array; callers MUST NOT mutate it after construction.

See docs/type-specification/rbs-compatible-types.md.

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from ValueSemantics

included

Methods included from AcceptanceRouter

#accepts

Constructor Details

#initialize(class_name, type_args = []) ⇒ Nominal

Returns a new instance of Nominal.

Raises:

  • (ArgumentError)


31
32
33
34
35
36
37
38
39
# File 'lib/rigor/type/nominal.rb', line 31

def initialize(class_name, type_args = [])
  raise ArgumentError, "class_name must be a String, got #{class_name.class}" unless class_name.is_a?(String)
  raise ArgumentError, "class_name must not be empty" if class_name.empty?
  raise ArgumentError, "type_args must be an Array, got #{type_args.class}" unless type_args.is_a?(Array)

  @class_name = class_name.freeze
  @type_args = type_args.dup.freeze
  freeze
end

Instance Attribute Details

#class_nameObject (readonly)

Returns the value of attribute class_name.



29
30
31
# File 'lib/rigor/type/nominal.rb', line 29

def class_name
  @class_name
end

#type_argsObject (readonly)

Returns the value of attribute type_args.



29
30
31
# File 'lib/rigor/type/nominal.rb', line 29

def type_args
  @type_args
end

Instance Method Details

#botObject



59
60
61
# File 'lib/rigor/type/nominal.rb', line 59

def bot
  Trinary.no
end

#describe(verbosity = :short) ⇒ Object



41
42
43
44
45
46
# File 'lib/rigor/type/nominal.rb', line 41

def describe(verbosity = :short)
  return class_name if type_args.empty?

  rendered = type_args.map { |t| t.describe(verbosity) }.join(", ")
  "#{class_name}[#{rendered}]"
end

#dynamicObject



63
64
65
# File 'lib/rigor/type/nominal.rb', line 63

def dynamic
  Trinary.no
end

#erase_to_rbsObject



48
49
50
51
52
53
# File 'lib/rigor/type/nominal.rb', line 48

def erase_to_rbs
  return class_name if type_args.empty?

  rendered = type_args.map(&:erase_to_rbs).join(", ")
  "#{class_name}[#{rendered}]"
end

#inspectObject



73
74
75
# File 'lib/rigor/type/nominal.rb', line 73

def inspect
  "#<Rigor::Type::Nominal #{describe(:short)}>"
end

#topObject



55
56
57
# File 'lib/rigor/type/nominal.rb', line 55

def top
  Trinary.no
end