Class: Rigor::Type::Constant

Inherits:
Object
  • Object
show all
Defined in:
lib/rigor/type/constant.rb

Overview

A literal carrier under ADR-3 OQ1 Option C (Hybrid). Wraps a Ruby literal value of one of the supported immutable-ish classes. Compound literal shapes (Tuple, HashShape, Record) get dedicated classes in later slices; Range is carried only when both static endpoints are known enough for tuple slicing.

See docs/adr/4-type-inference-engine.md for the tentative answer to the open question and docs/type-specification/rigor-extensions.md for the refinement neighbourhood this carrier lives in.

Constant Summary collapse

SCALAR_CLASSES =
[
  Integer,
  Float,
  String,
  Symbol,
  Range,
  Rational,
  Complex,
  Regexp,
  Pathname,
  TrueClass,
  FalseClass,
  NilClass
].freeze
RBS_LITERAL_CLASSES =
{
  TrueClass => "true",
  FalseClass => "false",
  NilClass => "nil"
}.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(value) ⇒ Constant

Returns a new instance of Constant.



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

def initialize(value)
  unless SCALAR_CLASSES.any? { |klass| value.is_a?(klass) }
    raise ArgumentError, "Rigor::Type::Constant only carries scalar literals; got #{value.class}"
  end

  @value = value.is_a?(String) ? value.dup.freeze : value
  freeze
end

Instance Attribute Details

#valueObject (readonly)

Returns the value of attribute value.



38
39
40
# File 'lib/rigor/type/constant.rb', line 38

def value
  @value
end

Instance Method Details

#==(other) ⇒ Object Also known as: eql?



78
79
80
# File 'lib/rigor/type/constant.rb', line 78

def ==(other)
  other.is_a?(Constant) && value.class == other.value.class && value == other.value
end

#accepts(other, mode: :gradual) ⇒ Object



74
75
76
# File 'lib/rigor/type/constant.rb', line 74

def accepts(other, mode: :gradual)
  Inference::Acceptance.accepts(self, other, mode: mode)
end

#botObject



66
67
68
# File 'lib/rigor/type/constant.rb', line 66

def bot
  Trinary.no
end

#describe(_verbosity = :short) ⇒ Object



49
50
51
# File 'lib/rigor/type/constant.rb', line 49

def describe(_verbosity = :short)
  value.inspect
end

#dynamicObject



70
71
72
# File 'lib/rigor/type/constant.rb', line 70

def dynamic
  Trinary.no
end

#erase_to_rbsObject



53
54
55
56
57
58
59
60
# File 'lib/rigor/type/constant.rb', line 53

def erase_to_rbs
  case value
  when true then "true"
  when false then "false"
  when nil then "nil"
  else value.class.name
  end
end

#hashObject



83
84
85
# File 'lib/rigor/type/constant.rb', line 83

def hash
  [Constant, value.class, value].hash
end

#inspectObject



87
88
89
# File 'lib/rigor/type/constant.rb', line 87

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

#topObject



62
63
64
# File 'lib/rigor/type/constant.rb', line 62

def top
  Trinary.no
end