rtype 0.6.8-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Gemfile +3 -0
- data/LICENSE +9 -0
- data/README.md +541 -0
- data/Rakefile +12 -0
- data/benchmark/benchmark.rb +200 -0
- data/lib/rtype/argument_type_error.rb +4 -0
- data/lib/rtype/behavior/and.rb +24 -0
- data/lib/rtype/behavior/base.rb +17 -0
- data/lib/rtype/behavior/core_ext.rb +174 -0
- data/lib/rtype/behavior/float_check.rb +17 -0
- data/lib/rtype/behavior/integer_check.rb +17 -0
- data/lib/rtype/behavior/nilable.rb +21 -0
- data/lib/rtype/behavior/not.rb +24 -0
- data/lib/rtype/behavior/numeric_check.rb +42 -0
- data/lib/rtype/behavior/typed_array.rb +26 -0
- data/lib/rtype/behavior/typed_hash.rb +29 -0
- data/lib/rtype/behavior/typed_set.rb +26 -0
- data/lib/rtype/behavior/xor.rb +25 -0
- data/lib/rtype/behavior.rb +17 -0
- data/lib/rtype/core_ext.rb +274 -0
- data/lib/rtype/method_annotator.rb +31 -0
- data/lib/rtype/return_type_error.rb +4 -0
- data/lib/rtype/rtype_proxy.rb +10 -0
- data/lib/rtype/type_signature.rb +10 -0
- data/lib/rtype/type_signature_error.rb +4 -0
- data/lib/rtype/version.rb +7 -0
- data/lib/rtype.rb +468 -0
- data/spec/rtype_spec.rb +1070 -0
- data/spec/spec_helper.rb +14 -0
- metadata +131 -0
@@ -0,0 +1,274 @@
|
|
1
|
+
# true or false
|
2
|
+
module Boolean; end
|
3
|
+
class TrueClass; include Boolean; end
|
4
|
+
class FalseClass; include Boolean; end
|
5
|
+
|
6
|
+
Any = BasicObject
|
7
|
+
|
8
|
+
class Object
|
9
|
+
include ::Rtype::MethodAnnotator
|
10
|
+
end
|
11
|
+
|
12
|
+
module Kernel
|
13
|
+
private
|
14
|
+
def _rtype_proxy
|
15
|
+
unless @_rtype_proxy
|
16
|
+
@_rtype_proxy = ::Rtype::RtypeProxy.new
|
17
|
+
prepend @_rtype_proxy
|
18
|
+
end
|
19
|
+
@_rtype_proxy
|
20
|
+
end
|
21
|
+
|
22
|
+
# Makes the method typed
|
23
|
+
#
|
24
|
+
# With 'annotation mode', this method works for both instance method and singleton method (class method).
|
25
|
+
# Without it, this method only works for instance method.
|
26
|
+
#
|
27
|
+
# @param [#to_sym, nil] method_name The name of method. If nil, annotation mode works
|
28
|
+
# @param [Hash] type_sig_info A type signature. e.g. [Integer] => Any
|
29
|
+
# @return [void]
|
30
|
+
#
|
31
|
+
# @note Annotation mode doesn't work in the outside of module
|
32
|
+
# @raise [ArgumentError] If method_name is nil in the outside of module
|
33
|
+
# @raise [TypeSignatureError] If type_sig_info is invalid
|
34
|
+
def rtype(method_name=nil, type_sig_info)
|
35
|
+
if is_a?(Module)
|
36
|
+
if method_name.nil?
|
37
|
+
::Rtype::assert_valid_type_sig(type_sig_info)
|
38
|
+
_rtype_proxy.annotation_mode = true
|
39
|
+
_rtype_proxy.annotation_type_sig = type_sig_info
|
40
|
+
nil
|
41
|
+
else
|
42
|
+
::Rtype::define_typed_method(self, method_name, type_sig_info)
|
43
|
+
end
|
44
|
+
else
|
45
|
+
if method_name.nil?
|
46
|
+
raise ArgumentError, "Annotation mode doesn't work in the outside of module"
|
47
|
+
else
|
48
|
+
rtype_self(method_name, type_sig_info)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
# Makes the singleton method (class method) typed
|
54
|
+
#
|
55
|
+
# @param [#to_sym] method_name
|
56
|
+
# @param [Hash] type_sig_info A type signature. e.g. [Integer] => Any
|
57
|
+
# @return [void]
|
58
|
+
#
|
59
|
+
# @raise [ArgumentError] If method_name is nil
|
60
|
+
# @raise [TypeSignatureError] If type_sig_info is invalid
|
61
|
+
def rtype_self(method_name, type_sig_info)
|
62
|
+
::Rtype.define_typed_method(singleton_class, method_name, type_sig_info)
|
63
|
+
end
|
64
|
+
|
65
|
+
# Calls `attr_accessor` if the accessor method(getter/setter) is not defined.
|
66
|
+
# and makes it typed.
|
67
|
+
#
|
68
|
+
# @param [Array<#to_sym>] names
|
69
|
+
# @param type_behavior A type behavior
|
70
|
+
# @return [void]
|
71
|
+
#
|
72
|
+
# @raise [ArgumentError] If names contains nil
|
73
|
+
# @raise [TypeSignatureError] If type_behavior is invalid
|
74
|
+
# @see #rtype
|
75
|
+
def rtype_accessor(*names, type_behavior)
|
76
|
+
rtype_reader(*names, type_behavior)
|
77
|
+
rtype_writer(*names, type_behavior)
|
78
|
+
end
|
79
|
+
|
80
|
+
# Calls `attr_accessor` if the accessor method(getter/setter) is not defined.
|
81
|
+
# and makes it typed.
|
82
|
+
#
|
83
|
+
# @param [Array<#to_sym>] names
|
84
|
+
# @param type_behavior A type behavior
|
85
|
+
# @return [void]
|
86
|
+
#
|
87
|
+
# @raise [ArgumentError] If names contains nil
|
88
|
+
# @raise [TypeSignatureError] If type_behavior is invalid
|
89
|
+
# @see #rtype_self
|
90
|
+
def rtype_accessor_self(*names, type_behavior)
|
91
|
+
rtype_reader_self(*names, type_behavior)
|
92
|
+
rtype_writer_self(*names, type_behavior)
|
93
|
+
end
|
94
|
+
|
95
|
+
# Calls `attr_reader` if the getter method is not defined.
|
96
|
+
# and makes it typed.
|
97
|
+
#
|
98
|
+
# @param [Array<#to_sym>] names
|
99
|
+
# @param type_behavior A type behavior
|
100
|
+
# @return [void]
|
101
|
+
#
|
102
|
+
# @raise [ArgumentError] If names contains nil
|
103
|
+
# @raise [TypeSignatureError] If type_behavior is invalid
|
104
|
+
# @see #rtype
|
105
|
+
def rtype_reader(*names, type_behavior)
|
106
|
+
names.each do |name|
|
107
|
+
raise ArgumentError, "names contains nil" if name.nil?
|
108
|
+
|
109
|
+
name = name.to_sym
|
110
|
+
if !respond_to?(name)
|
111
|
+
attr_reader name
|
112
|
+
end
|
113
|
+
|
114
|
+
if is_a?(Module)
|
115
|
+
::Rtype::define_typed_reader(self, name, type_behavior)
|
116
|
+
else
|
117
|
+
rtype_reader_self(name, type_behavior)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
nil
|
121
|
+
end
|
122
|
+
|
123
|
+
# Calls `attr_reader` if the getter method is not defined.
|
124
|
+
# and makes it typed.
|
125
|
+
#
|
126
|
+
# @param [Array<#to_sym>] names
|
127
|
+
# @param type_behavior A type behavior
|
128
|
+
# @return [void]
|
129
|
+
#
|
130
|
+
# @raise [ArgumentError] If names contains nil
|
131
|
+
# @raise [TypeSignatureError] If type_behavior is invalid
|
132
|
+
# @see #rtype_self
|
133
|
+
def rtype_reader_self(*names, type_behavior)
|
134
|
+
names.each do |name|
|
135
|
+
raise ArgumentError, "names contains nil" if name.nil?
|
136
|
+
|
137
|
+
name = name.to_sym
|
138
|
+
if !respond_to?(name)
|
139
|
+
singleton_class.send(:attr_reader, name)
|
140
|
+
end
|
141
|
+
::Rtype::define_typed_reader(singleton_class, name, type_behavior)
|
142
|
+
end
|
143
|
+
nil
|
144
|
+
end
|
145
|
+
|
146
|
+
# Calls `attr_writer` if the setter method is not defined.
|
147
|
+
# and makes it typed.
|
148
|
+
#
|
149
|
+
# @param [Array<#to_sym>] names
|
150
|
+
# @param type_behavior A type behavior
|
151
|
+
# @return [void]
|
152
|
+
#
|
153
|
+
# @raise [ArgumentError] If names contains nil
|
154
|
+
# @raise [TypeSignatureError] If type_behavior is invalid
|
155
|
+
# @see #rtype
|
156
|
+
def rtype_writer(*names, type_behavior)
|
157
|
+
names.each do |name|
|
158
|
+
raise ArgumentError, "names contains nil" if name.nil?
|
159
|
+
|
160
|
+
name = name.to_sym
|
161
|
+
if !respond_to?(:"#{name}=")
|
162
|
+
attr_writer name
|
163
|
+
end
|
164
|
+
|
165
|
+
if is_a?(Module)
|
166
|
+
::Rtype::define_typed_writer(self, name, type_behavior)
|
167
|
+
else
|
168
|
+
rtype_reader_self(name, type_behavior)
|
169
|
+
end
|
170
|
+
end
|
171
|
+
nil
|
172
|
+
end
|
173
|
+
|
174
|
+
# Calls `attr_writer` if the setter method is not defined.
|
175
|
+
# and makes it typed.
|
176
|
+
#
|
177
|
+
# @param [Array<#to_sym>] names
|
178
|
+
# @param type_behavior A type behavior
|
179
|
+
# @return [void]
|
180
|
+
#
|
181
|
+
# @raise [ArgumentError] If names contains nil
|
182
|
+
# @raise [TypeSignatureError] If type_behavior is invalid
|
183
|
+
# @see #rtype_self
|
184
|
+
def rtype_writer_self(*names, type_behavior)
|
185
|
+
names.each do |name|
|
186
|
+
raise ArgumentError, "names contains nil" if name.nil?
|
187
|
+
|
188
|
+
name = name.to_sym
|
189
|
+
if !respond_to?(:"#{name}=")
|
190
|
+
singleton_class.send(:attr_writer, name)
|
191
|
+
end
|
192
|
+
::Rtype::define_typed_writer(singleton_class, name, type_behavior)
|
193
|
+
end
|
194
|
+
nil
|
195
|
+
end
|
196
|
+
|
197
|
+
# Creates getter, setter methods.
|
198
|
+
# The getter method is typed with Float
|
199
|
+
# and the setter method is typed with Numeric.
|
200
|
+
#
|
201
|
+
# If the setter is called with a numeric given,
|
202
|
+
# the setter convert the numeric to a float, and store it.
|
203
|
+
#
|
204
|
+
# As a result, setter can accept a Numeric(Integer/Float), and getter always returns a Float
|
205
|
+
#
|
206
|
+
# @param [Array<#to_sym>] names
|
207
|
+
# @return [void]
|
208
|
+
#
|
209
|
+
# @raise [ArgumentError] If names contains nil
|
210
|
+
def float_accessor(*names)
|
211
|
+
names.each do |name|
|
212
|
+
raise ArgumentError, "names contains nil" if name.nil?
|
213
|
+
|
214
|
+
name = name.to_sym
|
215
|
+
rtype_reader name, Float
|
216
|
+
define_method(:"#{name}=") do |val|
|
217
|
+
instance_variable_set(:"@#{name}", val.to_f)
|
218
|
+
end
|
219
|
+
::Rtype::define_typed_writer(self, name, Numeric)
|
220
|
+
end
|
221
|
+
nil
|
222
|
+
end
|
223
|
+
|
224
|
+
# Creates getter, setter methods. And makes it typed with Boolean.
|
225
|
+
# The name of the getter ends with `?`.
|
226
|
+
#
|
227
|
+
# e.g. `bool_accessor :closed` will create `closed=` and `closed?` methods
|
228
|
+
#
|
229
|
+
# @param [Array<#to_sym>] names
|
230
|
+
# @return [void]
|
231
|
+
#
|
232
|
+
# @raise [ArgumentError] If names contains nil
|
233
|
+
def bool_accessor(*names)
|
234
|
+
names.each do |name|
|
235
|
+
raise ArgumentError, "names contains nil" if name.nil?
|
236
|
+
|
237
|
+
name = name.to_sym
|
238
|
+
rtype_writer name, Boolean
|
239
|
+
define_method(:"#{name}?") do
|
240
|
+
instance_variable_get(:"@#{name}")
|
241
|
+
end
|
242
|
+
::Rtype::define_typed_reader(self, :"#{name}?", Boolean)
|
243
|
+
end
|
244
|
+
nil
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
class Method
|
249
|
+
# @return [Boolean] Whether the method is typed with rtype
|
250
|
+
def typed?
|
251
|
+
!!::Rtype.type_signatures[owner][name]
|
252
|
+
end
|
253
|
+
|
254
|
+
# @return [TypeSignature]
|
255
|
+
def type_signature
|
256
|
+
::Rtype.type_signatures[owner][name]
|
257
|
+
end
|
258
|
+
|
259
|
+
# @return [Hash]
|
260
|
+
# @see TypeSignature#info
|
261
|
+
def type_info
|
262
|
+
::Rtype.type_signatures[owner][name].info
|
263
|
+
end
|
264
|
+
|
265
|
+
# @return [Array, Hash]
|
266
|
+
def argument_type
|
267
|
+
::Rtype.type_signatures[owner][name].argument_type
|
268
|
+
end
|
269
|
+
|
270
|
+
# @return A type behavior
|
271
|
+
def return_type
|
272
|
+
::Rtype.type_signatures[owner][name].return_type
|
273
|
+
end
|
274
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Rtype
|
2
|
+
module MethodAnnotator
|
3
|
+
def self.included(base)
|
4
|
+
base.extend ClassMethods
|
5
|
+
end
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
def method_added(name)
|
9
|
+
if @_rtype_proxy
|
10
|
+
proxy = _rtype_proxy
|
11
|
+
if proxy.annotation_mode
|
12
|
+
::Rtype::define_typed_method(self, name, proxy.annotation_type_sig)
|
13
|
+
proxy.annotation_mode = false
|
14
|
+
proxy.annotation_type_sig = nil
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def singleton_method_added(name)
|
20
|
+
if @_rtype_proxy
|
21
|
+
proxy = _rtype_proxy
|
22
|
+
if proxy.annotation_mode
|
23
|
+
::Rtype::define_typed_method(singleton_class, name, proxy.annotation_type_sig)
|
24
|
+
proxy.annotation_mode = false
|
25
|
+
proxy.annotation_type_sig = nil
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
module Rtype
|
2
|
+
VERSION = "0.6.8".freeze
|
3
|
+
# rtype java extension version. nil If the extension is not used
|
4
|
+
JAVA_EXT_VERSION = nil unless const_defined?(:JAVA_EXT_VERSION, false)
|
5
|
+
# rtype c extension version. nil If the extension is not used
|
6
|
+
NATIVE_EXT_VERSION = nil unless const_defined?(:NATIVE_EXT_VERSION, false)
|
7
|
+
end
|