rtype-legacy 0.0.4-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 +475 -0
- data/Rakefile +12 -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 +266 -0
- data/lib/rtype/legacy/version.rb +9 -0
- data/lib/rtype/legacy.rb +436 -0
- data/lib/rtype/method_annotator.rb +55 -0
- data/lib/rtype/return_type_error.rb +4 -0
- data/lib/rtype/rtype_component.rb +49 -0
- data/lib/rtype/type_signature.rb +10 -0
- data/lib/rtype/type_signature_error.rb +4 -0
- data/spec/rtype_legacy_spec.rb +971 -0
- data/spec/spec_helper.rb +14 -0
- metadata +130 -0
@@ -0,0 +1,174 @@
|
|
1
|
+
class Object
|
2
|
+
# @return [Rtype::Behavior::And]
|
3
|
+
def and(*others)
|
4
|
+
::Rtype::and(self, *others)
|
5
|
+
end
|
6
|
+
|
7
|
+
# @return [Rtype::Behavior::Nilable]
|
8
|
+
def nilable
|
9
|
+
::Rtype::nilable(self)
|
10
|
+
end
|
11
|
+
alias_method :or_nil, :nilable
|
12
|
+
|
13
|
+
# @return [Rtype::Behavior::Not]
|
14
|
+
def not
|
15
|
+
::Rtype::not(self)
|
16
|
+
end
|
17
|
+
|
18
|
+
# @return [Rtype::Behavior::Xor]
|
19
|
+
def xor(*others)
|
20
|
+
::Rtype::xor(self, *others)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class Array
|
25
|
+
# @return [Rtype::Behavior::TypedArray]
|
26
|
+
def self.of(type_sig)
|
27
|
+
::Rtype::Behavior::TypedArray.new(type_sig)
|
28
|
+
end
|
29
|
+
|
30
|
+
# @return [Rtype::Behavior::And]
|
31
|
+
def comb
|
32
|
+
::Rtype::Behavior::And[*self]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class Set
|
37
|
+
# @return [Rtype::Behavior::TypedSet]
|
38
|
+
def self.of(type_sig)
|
39
|
+
::Rtype::Behavior::TypedSet.new(type_sig)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
class Hash
|
44
|
+
# @return [Rtype::Behavior::TypedHash]
|
45
|
+
def self.of(key_type, value_type)
|
46
|
+
::Rtype::Behavior::TypedHash.new(key_type, value_type)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
class Num
|
51
|
+
# @param [Numeric] x
|
52
|
+
# @return [Rtype::Behavior::NumericCheck]
|
53
|
+
# @example Value must be a Numeric and > 2
|
54
|
+
# rtype [Num > 2] => Any
|
55
|
+
def self.>(x)
|
56
|
+
::Rtype::Behavior::NumericCheck.new(:>, x)
|
57
|
+
end
|
58
|
+
|
59
|
+
# @param [Numeric] x
|
60
|
+
# @return [Rtype::Behavior::NumericCheck]
|
61
|
+
# @example Value must be a Numeric and > 2
|
62
|
+
# rtype [Num > 2] => Any
|
63
|
+
def self.>=(x)
|
64
|
+
::Rtype::Behavior::NumericCheck.new(:>=, x)
|
65
|
+
end
|
66
|
+
|
67
|
+
# @param [Numeric] x
|
68
|
+
# @return [Rtype::Behavior::NumericCheck]
|
69
|
+
# @example Value must be a Numeric and > 2
|
70
|
+
# rtype [Num > 2] => Any
|
71
|
+
def self.<(x)
|
72
|
+
::Rtype::Behavior::NumericCheck.new(:<, x)
|
73
|
+
end
|
74
|
+
|
75
|
+
# @param [Numeric] x
|
76
|
+
# @return [Rtype::Behavior::NumericCheck]
|
77
|
+
# @example Value must be a Numeric and > 2
|
78
|
+
# rtype [Num > 2] => Any
|
79
|
+
def self.<=(x)
|
80
|
+
::Rtype::Behavior::NumericCheck.new(:<=, x)
|
81
|
+
end
|
82
|
+
|
83
|
+
# @param [Numeric] x
|
84
|
+
# @return [Rtype::Behavior::NumericCheck]
|
85
|
+
# @example Value must be a Numeric and > 2
|
86
|
+
# rtype [Num > 2] => Any
|
87
|
+
def self.==(x)
|
88
|
+
::Rtype::Behavior::NumericCheck.new(:==, x)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
class Int
|
93
|
+
# @param [Numeric] x
|
94
|
+
# @return [Rtype::Behavior::IntegerCheck]
|
95
|
+
# @example Value must be a Integer and > 2
|
96
|
+
# rtype [Int > 2] => Any
|
97
|
+
def self.>(x)
|
98
|
+
::Rtype::Behavior::IntegerCheck.new(:>, x)
|
99
|
+
end
|
100
|
+
|
101
|
+
# @param [Numeric] x
|
102
|
+
# @return [Rtype::Behavior::IntegerCheck]
|
103
|
+
# @example Value must be a Integer and > 2
|
104
|
+
# rtype [Int > 2] => Any
|
105
|
+
def self.>=(x)
|
106
|
+
::Rtype::Behavior::IntegerCheck.new(:>=, x)
|
107
|
+
end
|
108
|
+
|
109
|
+
# @param [Numeric] x
|
110
|
+
# @return [Rtype::Behavior::IntegerCheck]
|
111
|
+
# @example Value must be a Integer and > 2
|
112
|
+
# rtype [Int > 2] => Any
|
113
|
+
def self.<(x)
|
114
|
+
::Rtype::Behavior::IntegerCheck.new(:<, x)
|
115
|
+
end
|
116
|
+
|
117
|
+
# @param [Numeric] x
|
118
|
+
# @return [Rtype::Behavior::IntegerCheck]
|
119
|
+
# @example Value must be a Integer and > 2
|
120
|
+
# rtype [Int > 2] => Any
|
121
|
+
def self.<=(x)
|
122
|
+
::Rtype::Behavior::IntegerCheck.new(:<=, x)
|
123
|
+
end
|
124
|
+
|
125
|
+
# @param [Numeric] x
|
126
|
+
# @return [Rtype::Behavior::IntegerCheck]
|
127
|
+
# @example Value must be a Integer and > 2
|
128
|
+
# rtype [Int > 2] => Any
|
129
|
+
def self.==(x)
|
130
|
+
::Rtype::Behavior::IntegerCheck.new(:==, x)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
class Flo
|
135
|
+
# @param [Numeric] x
|
136
|
+
# @return [Rtype::Behavior::FloatCheck]
|
137
|
+
# @example Value must be a Float and > 2
|
138
|
+
# rtype [Flo > 2] => Any
|
139
|
+
def self.>(x)
|
140
|
+
::Rtype::Behavior::FloatCheck.new(:>, x)
|
141
|
+
end
|
142
|
+
|
143
|
+
# @param [Numeric] x
|
144
|
+
# @return [Rtype::Behavior::FloatCheck]
|
145
|
+
# @example Value must be a Float and > 2
|
146
|
+
# rtype [Flo > 2] => Any
|
147
|
+
def self.>=(x)
|
148
|
+
::Rtype::Behavior::FloatCheck.new(:>=, x)
|
149
|
+
end
|
150
|
+
|
151
|
+
# @param [Numeric] x
|
152
|
+
# @return [Rtype::Behavior::FloatCheck]
|
153
|
+
# @example Value must be a Float and > 2
|
154
|
+
# rtype [Flo > 2] => Any
|
155
|
+
def self.<(x)
|
156
|
+
::Rtype::Behavior::FloatCheck.new(:<, x)
|
157
|
+
end
|
158
|
+
|
159
|
+
# @param [Numeric] x
|
160
|
+
# @return [Rtype::Behavior::FloatCheck]
|
161
|
+
# @example Value must be a Float and > 2
|
162
|
+
# rtype [Flo > 2] => Any
|
163
|
+
def self.<=(x)
|
164
|
+
::Rtype::Behavior::FloatCheck.new(:<=, x)
|
165
|
+
end
|
166
|
+
|
167
|
+
# @param [Numeric] x
|
168
|
+
# @return [Rtype::Behavior::FloatCheck]
|
169
|
+
# @example Value must be a Float and > 2
|
170
|
+
# rtype [Flo > 2] => Any
|
171
|
+
def self.==(x)
|
172
|
+
::Rtype::Behavior::FloatCheck.new(:==, x)
|
173
|
+
end
|
174
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Rtype
|
2
|
+
module Behavior
|
3
|
+
class FloatCheck < NumericCheck
|
4
|
+
def valid?(value)
|
5
|
+
if value.is_a?(Float)
|
6
|
+
@lambda.call(value)
|
7
|
+
else
|
8
|
+
false
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def error_message(value)
|
13
|
+
"Expected #{value.inspect} to be a float #{@condition} #{@x}"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Rtype
|
2
|
+
module Behavior
|
3
|
+
class IntegerCheck < NumericCheck
|
4
|
+
def valid?(value)
|
5
|
+
if value.is_a?(Integer)
|
6
|
+
@lambda.call(value)
|
7
|
+
else
|
8
|
+
false
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def error_message(value)
|
13
|
+
"Expected #{value.inspect} to be an integer #{@condition} #{@x}"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Rtype
|
2
|
+
module Behavior
|
3
|
+
class Nilable < Base
|
4
|
+
def initialize(type)
|
5
|
+
@type = type
|
6
|
+
end
|
7
|
+
|
8
|
+
def valid?(value)
|
9
|
+
value.nil? || Rtype::valid?(@type, value)
|
10
|
+
end
|
11
|
+
|
12
|
+
def error_message(value)
|
13
|
+
Rtype::type_error_message(@type, value) + "\nOR " + Rtype::type_error_message(nil, value)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def nilable(*args)
|
19
|
+
Behavior::Nilable[*args]
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Rtype
|
2
|
+
module Behavior
|
3
|
+
class Not < Base
|
4
|
+
def initialize(*types)
|
5
|
+
@types = types
|
6
|
+
end
|
7
|
+
|
8
|
+
def valid?(value)
|
9
|
+
@types.all? do |e|
|
10
|
+
!Rtype::valid?(e, value)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def error_message(value)
|
15
|
+
arr = @types.map { |e| "NOT " + Rtype::type_error_message(e, value) }
|
16
|
+
arr.join "\nAND "
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def not(*args)
|
22
|
+
Behavior::Not[*args]
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Rtype
|
2
|
+
module Behavior
|
3
|
+
class NumericCheck < Base
|
4
|
+
@@conditions = [
|
5
|
+
:>, :<, :>=, :<=, :==
|
6
|
+
]
|
7
|
+
|
8
|
+
# @param [Symbol] condition
|
9
|
+
# @param [Numeric] x
|
10
|
+
def initialize(condition, x)
|
11
|
+
raise ArgumentError, "Invalid condition '#{condition}'" unless @@conditions.include?(condition)
|
12
|
+
raise ArgumentError, "x is not a Numeric" unless x.is_a?(Numeric)
|
13
|
+
@condition = condition
|
14
|
+
@x = x
|
15
|
+
@lambda = case condition
|
16
|
+
when :>
|
17
|
+
lambda { |obj| obj > @x }
|
18
|
+
when :<
|
19
|
+
lambda { |obj| obj < @x }
|
20
|
+
when :>=
|
21
|
+
lambda { |obj| obj >= @x }
|
22
|
+
when :<=
|
23
|
+
lambda { |obj| obj <= @x }
|
24
|
+
when :==
|
25
|
+
lambda { |obj| obj == @x }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def valid?(value)
|
30
|
+
if value.is_a?(Numeric)
|
31
|
+
@lambda.call(value)
|
32
|
+
else
|
33
|
+
false
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def error_message(value)
|
38
|
+
"Expected #{value.inspect} to be a numeric #{@condition} #{@x}"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Rtype
|
2
|
+
module Behavior
|
3
|
+
# Typed array behavior. empty array allowed
|
4
|
+
class TypedArray < Base
|
5
|
+
def initialize(type)
|
6
|
+
@type = type
|
7
|
+
Rtype.assert_valid_argument_type_sig_element(@type)
|
8
|
+
end
|
9
|
+
|
10
|
+
def valid?(value)
|
11
|
+
if value.is_a?(Array)
|
12
|
+
any = value.any? do |e|
|
13
|
+
!Rtype::valid?(@type, e)
|
14
|
+
end
|
15
|
+
!any
|
16
|
+
else
|
17
|
+
false
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def error_message(value)
|
22
|
+
"Expected #{value.inspect} to be an array with type #{@type.inspect}"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Rtype
|
2
|
+
module Behavior
|
3
|
+
# Typed hash behavior. empty hash allowed
|
4
|
+
class TypedHash < Base
|
5
|
+
def initialize(key_type, value_type)
|
6
|
+
@ktype = key_type
|
7
|
+
@vtype = value_type
|
8
|
+
Rtype.assert_valid_argument_type_sig_element(@ktype)
|
9
|
+
Rtype.assert_valid_argument_type_sig_element(@vtype)
|
10
|
+
end
|
11
|
+
|
12
|
+
def valid?(value)
|
13
|
+
if value.is_a?(Hash)
|
14
|
+
any = value.any? do |k, v|
|
15
|
+
!Rtype::valid?(@ktype, k) ||
|
16
|
+
!Rtype::valid?(@vtype, v)
|
17
|
+
end
|
18
|
+
!any
|
19
|
+
else
|
20
|
+
false
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def error_message(value)
|
25
|
+
"Expected #{value.inspect} to be a hash with key type #{@ktype.inspect} and value type #{@vtype.inspect}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Rtype
|
2
|
+
module Behavior
|
3
|
+
# Typed set behavior. empty set allowed
|
4
|
+
class TypedSet < Base
|
5
|
+
def initialize(type)
|
6
|
+
@type = type
|
7
|
+
Rtype.assert_valid_argument_type_sig_element(@type)
|
8
|
+
end
|
9
|
+
|
10
|
+
def valid?(value)
|
11
|
+
if value.is_a?(Set)
|
12
|
+
any = value.any? do |e|
|
13
|
+
!Rtype::valid?(@type, e)
|
14
|
+
end
|
15
|
+
!any
|
16
|
+
else
|
17
|
+
false
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def error_message(value)
|
22
|
+
"Expected #{value.inspect} to be a set with type #{@type.inspect}"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Rtype
|
2
|
+
module Behavior
|
3
|
+
class Xor < Base
|
4
|
+
def initialize(*types)
|
5
|
+
@types = types
|
6
|
+
end
|
7
|
+
|
8
|
+
def valid?(value)
|
9
|
+
result = @types.map do |e|
|
10
|
+
Rtype::valid? e, value
|
11
|
+
end
|
12
|
+
result.count(true) == 1
|
13
|
+
end
|
14
|
+
|
15
|
+
def error_message(value)
|
16
|
+
arr = @types.map { |e| Rtype::type_error_message(e, value) }
|
17
|
+
arr.join "\nXOR "
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def xor(*args)
|
23
|
+
Behavior::Xor[*args]
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Rtype
|
2
|
+
module Behavior
|
3
|
+
end
|
4
|
+
end
|
5
|
+
|
6
|
+
require_relative 'behavior/base'
|
7
|
+
require_relative 'behavior/and'
|
8
|
+
require_relative 'behavior/xor'
|
9
|
+
require_relative 'behavior/not'
|
10
|
+
require_relative 'behavior/nilable'
|
11
|
+
require_relative 'behavior/typed_array'
|
12
|
+
require_relative 'behavior/typed_set'
|
13
|
+
require_relative 'behavior/typed_hash'
|
14
|
+
require_relative 'behavior/numeric_check'
|
15
|
+
require_relative 'behavior/integer_check'
|
16
|
+
require_relative 'behavior/float_check'
|
17
|
+
require_relative 'behavior/core_ext'
|
@@ -0,0 +1,266 @@
|
|
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_component
|
15
|
+
unless @_rtype_component
|
16
|
+
@_rtype_component = ::Rtype::RtypeComponent.new
|
17
|
+
end
|
18
|
+
@_rtype_component
|
19
|
+
end
|
20
|
+
|
21
|
+
# Makes the method typed
|
22
|
+
#
|
23
|
+
# With 'annotation mode', this method works for both instance method and singleton method (class method).
|
24
|
+
# Without it (specifying method name), this method only works for instance method.
|
25
|
+
#
|
26
|
+
# @param [#to_sym, nil] method_name The name of method. If nil, annotation mode works
|
27
|
+
# @param [Hash] type_sig_info A type signature. e.g. [Integer] => Any
|
28
|
+
# @return [void]
|
29
|
+
#
|
30
|
+
# @note Annotation mode doesn't work in the outside of module
|
31
|
+
# @raise [RuntimeError] If called outside of module
|
32
|
+
# @raise [TypeSignatureError] If type_sig_info is invalid
|
33
|
+
def rtype(method_name=nil, type_sig_info)
|
34
|
+
if is_a?(Module)
|
35
|
+
if method_name.nil?
|
36
|
+
::Rtype::assert_valid_type_sig(type_sig_info)
|
37
|
+
_rtype_component.annotation_mode = true
|
38
|
+
_rtype_component.annotation_type_sig = type_sig_info
|
39
|
+
nil
|
40
|
+
else
|
41
|
+
::Rtype::define_typed_method(self, method_name, type_sig_info, false)
|
42
|
+
end
|
43
|
+
else
|
44
|
+
raise "rtype doesn't work in the outside of module"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Makes the singleton method (class method) typed
|
49
|
+
#
|
50
|
+
# @param [#to_sym] method_name
|
51
|
+
# @param [Hash] type_sig_info A type signature. e.g. [Integer] => Any
|
52
|
+
# @return [void]
|
53
|
+
#
|
54
|
+
# @raise [ArgumentError] If method_name is nil
|
55
|
+
# @raise [TypeSignatureError] If type_sig_info is invalid
|
56
|
+
def rtype_self(method_name, type_sig_info)
|
57
|
+
::Rtype.define_typed_method(self, method_name, type_sig_info, true)
|
58
|
+
end
|
59
|
+
|
60
|
+
# Makes the accessor methods (getter and setter) typed
|
61
|
+
#
|
62
|
+
# @param [Array<#to_sym>] names
|
63
|
+
# @param type_behavior A type behavior
|
64
|
+
# @return [void]
|
65
|
+
#
|
66
|
+
# @raise [ArgumentError] If names contains nil
|
67
|
+
# @raise [TypeSignatureError] If type_behavior is invalid
|
68
|
+
# @raise [RuntimeError] If called outside of module
|
69
|
+
# @see #rtype
|
70
|
+
def rtype_accessor(*names, type_behavior)
|
71
|
+
rtype_reader(*names, type_behavior)
|
72
|
+
rtype_writer(*names, type_behavior)
|
73
|
+
end
|
74
|
+
|
75
|
+
# Makes the accessor methods (getter and setter) typed
|
76
|
+
#
|
77
|
+
# @param [Array<#to_sym>] names
|
78
|
+
# @param type_behavior A type behavior
|
79
|
+
# @return [void]
|
80
|
+
#
|
81
|
+
# @raise [ArgumentError] If names contains nil
|
82
|
+
# @raise [TypeSignatureError] If type_behavior is invalid
|
83
|
+
# @see #rtype_self
|
84
|
+
def rtype_accessor_self(*names, type_behavior)
|
85
|
+
rtype_reader_self(*names, type_behavior)
|
86
|
+
rtype_writer_self(*names, type_behavior)
|
87
|
+
end
|
88
|
+
|
89
|
+
# Makes the getter methods typed
|
90
|
+
#
|
91
|
+
# @param [Array<#to_sym>] names
|
92
|
+
# @param type_behavior A type behavior
|
93
|
+
# @return [void]
|
94
|
+
#
|
95
|
+
# @raise [ArgumentError] If names contains nil
|
96
|
+
# @raise [TypeSignatureError] If type_behavior is invalid
|
97
|
+
# @raise [RuntimeError] If called outside of module
|
98
|
+
# @see #rtype
|
99
|
+
def rtype_reader(*names, type_behavior)
|
100
|
+
names.each do |name|
|
101
|
+
raise ArgumentError, "names contains nil" if name.nil?
|
102
|
+
|
103
|
+
name = name.to_sym
|
104
|
+
if !respond_to?(name)
|
105
|
+
attr_reader name
|
106
|
+
end
|
107
|
+
|
108
|
+
if is_a?(Module)
|
109
|
+
::Rtype::define_typed_reader(self, name, type_behavior, false)
|
110
|
+
else
|
111
|
+
raise "rtype_reader doesn't work in the outside of module"
|
112
|
+
end
|
113
|
+
end
|
114
|
+
nil
|
115
|
+
end
|
116
|
+
|
117
|
+
# Makes the getter methods typed
|
118
|
+
#
|
119
|
+
# @param [Array<#to_sym>] names
|
120
|
+
# @param type_behavior A type behavior
|
121
|
+
# @return [void]
|
122
|
+
#
|
123
|
+
# @raise [ArgumentError] If names contains nil
|
124
|
+
# @raise [TypeSignatureError] If type_behavior is invalid
|
125
|
+
# @see #rtype_self
|
126
|
+
def rtype_reader_self(*names, type_behavior)
|
127
|
+
names.each do |name|
|
128
|
+
raise ArgumentError, "names contains nil" if name.nil?
|
129
|
+
|
130
|
+
name = name.to_sym
|
131
|
+
if !respond_to?(name)
|
132
|
+
singleton_class.send(:attr_reader, name)
|
133
|
+
end
|
134
|
+
::Rtype::define_typed_reader(self, name, type_behavior, true)
|
135
|
+
end
|
136
|
+
nil
|
137
|
+
end
|
138
|
+
|
139
|
+
# Makes the setter methods typed
|
140
|
+
#
|
141
|
+
# @param [Array<#to_sym>] names
|
142
|
+
# @param type_behavior A type behavior
|
143
|
+
# @return [void]
|
144
|
+
#
|
145
|
+
# @raise [ArgumentError] If names contains nil
|
146
|
+
# @raise [TypeSignatureError] If type_behavior is invalid
|
147
|
+
# @raise [RuntimeError] If called outside of module
|
148
|
+
# @see #rtype
|
149
|
+
def rtype_writer(*names, type_behavior)
|
150
|
+
names.each do |name|
|
151
|
+
raise ArgumentError, "names contains nil" if name.nil?
|
152
|
+
|
153
|
+
name = name.to_sym
|
154
|
+
if !respond_to?(:"#{name}=")
|
155
|
+
attr_writer name
|
156
|
+
end
|
157
|
+
|
158
|
+
if is_a?(Module)
|
159
|
+
::Rtype::define_typed_writer(self, name, type_behavior, false)
|
160
|
+
else
|
161
|
+
raise "rtype_writer doesn't work in the outside of module"
|
162
|
+
end
|
163
|
+
end
|
164
|
+
nil
|
165
|
+
end
|
166
|
+
|
167
|
+
# Makes the setter methods typed
|
168
|
+
#
|
169
|
+
# @param [Array<#to_sym>] names
|
170
|
+
# @param type_behavior A type behavior
|
171
|
+
# @return [void]
|
172
|
+
#
|
173
|
+
# @raise [ArgumentError] If names contains nil
|
174
|
+
# @raise [TypeSignatureError] If type_behavior is invalid
|
175
|
+
# @see #rtype_self
|
176
|
+
def rtype_writer_self(*names, type_behavior)
|
177
|
+
names.each do |name|
|
178
|
+
raise ArgumentError, "names contains nil" if name.nil?
|
179
|
+
|
180
|
+
name = name.to_sym
|
181
|
+
if !respond_to?(:"#{name}=")
|
182
|
+
singleton_class.send(:attr_writer, name)
|
183
|
+
end
|
184
|
+
::Rtype::define_typed_writer(self, name, type_behavior, true)
|
185
|
+
end
|
186
|
+
nil
|
187
|
+
end
|
188
|
+
|
189
|
+
# Creates getter, setter methods.
|
190
|
+
# The getter method is typed with Float
|
191
|
+
# and the setter method is typed with Numeric.
|
192
|
+
#
|
193
|
+
# If the setter is called with a numeric given,
|
194
|
+
# the setter convert the numeric to a float, and store it.
|
195
|
+
#
|
196
|
+
# As a result, setter can accept a Numeric(Integer/Float), and getter always returns a Float
|
197
|
+
#
|
198
|
+
# @param [Array<#to_sym>] names
|
199
|
+
# @return [void]
|
200
|
+
#
|
201
|
+
# @raise [ArgumentError] If names contains nil
|
202
|
+
def float_accessor(*names)
|
203
|
+
names.each do |name|
|
204
|
+
raise ArgumentError, "names contains nil" if name.nil?
|
205
|
+
|
206
|
+
name = name.to_sym
|
207
|
+
rtype_reader name, Float
|
208
|
+
define_method(:"#{name}=") do |val|
|
209
|
+
instance_variable_set(:"@#{name}", val.to_f)
|
210
|
+
end
|
211
|
+
::Rtype::define_typed_writer(self, name, Numeric, false)
|
212
|
+
end
|
213
|
+
nil
|
214
|
+
end
|
215
|
+
|
216
|
+
# Creates getter, setter methods. And makes it typed with Boolean.
|
217
|
+
# The name of the getter ends with `?`.
|
218
|
+
#
|
219
|
+
# e.g. `bool_accessor :closed` will create `closed=` and `closed?` methods
|
220
|
+
#
|
221
|
+
# @param [Array<#to_sym>] names
|
222
|
+
# @return [void]
|
223
|
+
#
|
224
|
+
# @raise [ArgumentError] If names contains nil
|
225
|
+
def bool_accessor(*names)
|
226
|
+
names.each do |name|
|
227
|
+
raise ArgumentError, "names contains nil" if name.nil?
|
228
|
+
|
229
|
+
name = name.to_sym
|
230
|
+
rtype_writer name, Boolean
|
231
|
+
define_method(:"#{name}?") do
|
232
|
+
instance_variable_get(:"@#{name}")
|
233
|
+
end
|
234
|
+
::Rtype::define_typed_reader(self, :"#{name}?", Boolean, false)
|
235
|
+
end
|
236
|
+
nil
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
class Method
|
241
|
+
# @return [Boolean] Whether the method is typed with rtype
|
242
|
+
def typed?
|
243
|
+
!!::Rtype.type_signatures[owner][name]
|
244
|
+
end
|
245
|
+
|
246
|
+
# @return [TypeSignature]
|
247
|
+
def type_signature
|
248
|
+
::Rtype.type_signatures[owner][name]
|
249
|
+
end
|
250
|
+
|
251
|
+
# @return [Hash]
|
252
|
+
# @see TypeSignature#info
|
253
|
+
def type_info
|
254
|
+
::Rtype.type_signatures[owner][name].info
|
255
|
+
end
|
256
|
+
|
257
|
+
# @return [Array, Hash]
|
258
|
+
def argument_type
|
259
|
+
::Rtype.type_signatures[owner][name].argument_type
|
260
|
+
end
|
261
|
+
|
262
|
+
# @return A type behavior
|
263
|
+
def return_type
|
264
|
+
::Rtype.type_signatures[owner][name].return_type
|
265
|
+
end
|
266
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
module Rtype
|
2
|
+
module Legacy
|
3
|
+
VERSION = "0.0.4".freeze
|
4
|
+
# rtype java extension version. nil If the extension is not used
|
5
|
+
JAVA_EXT_VERSION = nil unless const_defined?(:JAVA_EXT_VERSION, false)
|
6
|
+
# rtype c extension version. nil If the extension is not used
|
7
|
+
NATIVE_EXT_VERSION = nil unless const_defined?(:NATIVE_EXT_VERSION, false)
|
8
|
+
end
|
9
|
+
end
|