Class: Literal::Property
- Inherits:
-
Object
- Object
- Literal::Property
- Includes:
- Comparable
- Defined in:
- lib/literal/property.rb
Constant Summary collapse
- ORDER =
{ :positional => 0, :* => 1, :keyword => 2, :** => 3, :& => 4 }.freeze
- RUBY_KEYWORDS =
i[alias and begin break case class def do else elsif end ensure false for if in module next nil not or redo rescue retry return self super then true undef unless until when while yield].to_h { |k| [k, "__#{k}__"] }.freeze
- VISIBILITY_OPTIONS =
Set[false, :private, :protected, :public].freeze
- KIND_OPTIONS =
Set[:positional, :*, :keyword, :**, :&].freeze
Instance Attribute Summary collapse
-
#coercion ⇒ Object
readonly
Returns the value of attribute coercion.
-
#default ⇒ Object
readonly
Returns the value of attribute default.
-
#kind ⇒ Object
readonly
Returns the value of attribute kind.
-
#name ⇒ Object
readonly
Returns the value of attribute name.
-
#predicate ⇒ Object
readonly
Returns the value of attribute predicate.
-
#reader ⇒ Object
readonly
Returns the value of attribute reader.
-
#type ⇒ Object
readonly
Returns the value of attribute type.
-
#writer ⇒ Object
readonly
Returns the value of attribute writer.
Instance Method Summary collapse
- #<=>(other) ⇒ Object
- #block? ⇒ Boolean
- #check(value) ⇒ Object
- #check_initializer(receiver, value) ⇒ Object
- #check_writer(receiver, value) ⇒ Object
- #coerce(value, context:) ⇒ Object
- #default? ⇒ Boolean
- #default_value(receiver) ⇒ Object
- #double_splat? ⇒ Boolean
- #escaped_name ⇒ Object
- #generate_initializer_handle_property(buffer = +"")) ⇒ Object
- #generate_predicate_method(buffer = +"")) ⇒ Object
- #generate_reader_method(buffer = +"")) ⇒ Object
- #generate_writer_method(buffer = +"")) ⇒ Object
-
#initialize(name:, type:, kind:, reader:, writer:, predicate:, default:, coercion:) ⇒ Property
constructor
A new instance of Property.
- #keyword? ⇒ Boolean
- #optional? ⇒ Boolean
- #param ⇒ Object
- #positional? ⇒ Boolean
- #required? ⇒ Boolean
- #ruby_keyword? ⇒ Boolean
- #splat? ⇒ Boolean
Constructor Details
#initialize(name:, type:, kind:, reader:, writer:, predicate:, default:, coercion:) ⇒ Property
Returns a new instance of Property.
12 13 14 15 16 17 18 19 20 21 |
# File 'lib/literal/property.rb', line 12 def initialize(name:, type:, kind:, reader:, writer:, predicate:, default:, coercion:) @name = name @type = type @kind = kind @reader = reader @writer = writer @predicate = predicate @default = default @coercion = coercion end |
Instance Attribute Details
#coercion ⇒ Object (readonly)
Returns the value of attribute coercion.
23 24 25 |
# File 'lib/literal/property.rb', line 23 def coercion @coercion end |
#default ⇒ Object (readonly)
Returns the value of attribute default.
23 24 25 |
# File 'lib/literal/property.rb', line 23 def default @default end |
#kind ⇒ Object (readonly)
Returns the value of attribute kind.
23 24 25 |
# File 'lib/literal/property.rb', line 23 def kind @kind end |
#name ⇒ Object (readonly)
Returns the value of attribute name.
23 24 25 |
# File 'lib/literal/property.rb', line 23 def name @name end |
#predicate ⇒ Object (readonly)
Returns the value of attribute predicate.
23 24 25 |
# File 'lib/literal/property.rb', line 23 def predicate @predicate end |
#reader ⇒ Object (readonly)
Returns the value of attribute reader.
23 24 25 |
# File 'lib/literal/property.rb', line 23 def reader @reader end |
#type ⇒ Object (readonly)
Returns the value of attribute type.
23 24 25 |
# File 'lib/literal/property.rb', line 23 def type @type end |
#writer ⇒ Object (readonly)
Returns the value of attribute writer.
23 24 25 |
# File 'lib/literal/property.rb', line 23 def writer @writer end |
Instance Method Details
#<=>(other) ⇒ Object
74 75 76 |
# File 'lib/literal/property.rb', line 74 def <=>(other) ORDER[@kind] <=> ORDER[other.kind] end |
#block? ⇒ Boolean
49 50 51 |
# File 'lib/literal/property.rb', line 49 def block? @kind == :& end |
#check(value) ⇒ Object
97 98 99 100 101 |
# File 'lib/literal/property.rb', line 97 def check(value, &) raise ArgumentError.new("Cannot check type without a block") unless block_given? Literal.check(value, @type, &) end |
#check_initializer(receiver, value) ⇒ Object
107 108 109 |
# File 'lib/literal/property.rb', line 107 def check_initializer(receiver, value) Literal.check(value, @type) { |c| c.fill_receiver(receiver:, method: "#initialize", label: param) } end |
#check_writer(receiver, value) ⇒ Object
103 104 105 |
# File 'lib/literal/property.rb', line 103 def check_writer(receiver, value) Literal.check(value, @type) { |c| c.fill_receiver(receiver:, method: "##{@name.name}=(value)") } end |
#coerce(value, context:) ⇒ Object
78 79 80 |
# File 'lib/literal/property.rb', line 78 def coerce(value, context:) context.instance_exec(value, &@coercion) end |
#default? ⇒ Boolean
53 54 55 |
# File 'lib/literal/property.rb', line 53 def default? nil != @default end |
#default_value(receiver) ⇒ Object
90 91 92 93 94 95 |
# File 'lib/literal/property.rb', line 90 def default_value(receiver) case @default when Proc then receiver.instance_exec(&@default) else @default end end |
#double_splat? ⇒ Boolean
45 46 47 |
# File 'lib/literal/property.rb', line 45 def double_splat? @kind == :** end |
#escaped_name ⇒ Object
86 87 88 |
# File 'lib/literal/property.rb', line 86 def escaped_name RUBY_KEYWORDS[@name] || @name.name end |
#generate_initializer_handle_property(buffer = +"")) ⇒ Object
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 |
# File 'lib/literal/property.rb', line 147 def generate_initializer_handle_property(buffer = +"") buffer << " # " << @name.name << "\n" << " __property__ = __properties__[:" << @name.name << "]\n" if @kind == :keyword && ruby_keyword? generate_initializer_escape_keyword(buffer) end if default? generate_initializer_assign_default(buffer) end if @coercion generate_initializer_coerce_property(buffer) end generate_initializer_check_type(buffer) generate_initializer_assign_value(buffer) end |
#generate_predicate_method(buffer = +"")) ⇒ Object
135 136 137 138 139 140 141 142 143 144 145 |
# File 'lib/literal/property.rb', line 135 def generate_predicate_method(buffer = +"") buffer << (@predicate ? @predicate.name : "public") << " def " << @name.name << "?\n" << " !!@" << @name.name << "\n" << "end\n" end |
#generate_reader_method(buffer = +"")) ⇒ Object
111 112 113 114 115 116 117 118 119 |
# File 'lib/literal/property.rb', line 111 def generate_reader_method(buffer = +"") buffer << (@reader ? @reader.name : "public") << "\ndef " << @name.name << "\n value = @" << @name.name << "\n value\nend\n" end |
#generate_writer_method(buffer = +"")) ⇒ Object
121 122 123 124 125 126 127 128 129 130 131 132 133 |
# File 'lib/literal/property.rb', line 121 def generate_writer_method(buffer = +"") buffer << (@writer ? @writer.name : "public") << " def " << @name.name << "=(value)\n" << " self.class.literal_properties[:" << @name.name << "].check_writer(self, value)\n" << " @" << @name.name << " = value\n" << "rescue Literal::TypeError => error\n error.set_backtrace(caller(1))\n raise\n" << "end\n" end |
#keyword? ⇒ Boolean
33 34 35 |
# File 'lib/literal/property.rb', line 33 def keyword? @kind == :keyword end |
#optional? ⇒ Boolean
25 26 27 |
# File 'lib/literal/property.rb', line 25 def optional? default? || @type === nil end |
#param ⇒ Object
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
# File 'lib/literal/property.rb', line 57 def param case @kind when :* "*#{escaped_name}" when :** "**#{escaped_name}" when :& "&#{escaped_name}" when :positional escaped_name when :keyword "#{@name.name}:" else raise "You should never see this error." end end |
#positional? ⇒ Boolean
37 38 39 |
# File 'lib/literal/property.rb', line 37 def positional? @kind == :positional end |
#required? ⇒ Boolean
29 30 31 |
# File 'lib/literal/property.rb', line 29 def required? !optional? end |
#ruby_keyword? ⇒ Boolean
82 83 84 |
# File 'lib/literal/property.rb', line 82 def ruby_keyword? !!RUBY_KEYWORDS[@name] end |
#splat? ⇒ Boolean
41 42 43 |
# File 'lib/literal/property.rb', line 41 def splat? @kind == :* end |