rdl 2.1.0 → 2.2.0
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 +5 -5
- data/.gitignore +1 -0
- data/.travis.yml +7 -6
- data/CHANGES.md +29 -0
- data/README.md +94 -26
- data/lib/rdl/boot.rb +82 -41
- data/lib/rdl/boot_rails.rb +5 -0
- data/lib/rdl/config.rb +9 -1
- data/lib/rdl/query.rb +2 -2
- data/lib/rdl/typecheck.rb +972 -225
- data/lib/rdl/types/annotated_arg.rb +8 -0
- data/lib/rdl/types/ast_node.rb +73 -0
- data/lib/rdl/types/bot.rb +8 -0
- data/lib/rdl/types/bound_arg.rb +63 -0
- data/lib/rdl/types/computed.rb +48 -0
- data/lib/rdl/types/dependent_arg.rb +9 -0
- data/lib/rdl/types/dynamic.rb +61 -0
- data/lib/rdl/types/finite_hash.rb +54 -9
- data/lib/rdl/types/generic.rb +33 -0
- data/lib/rdl/types/intersection.rb +8 -0
- data/lib/rdl/types/lexer.rex +6 -1
- data/lib/rdl/types/lexer.rex.rb +13 -1
- data/lib/rdl/types/method.rb +14 -0
- data/lib/rdl/types/nominal.rb +8 -0
- data/lib/rdl/types/non_null.rb +8 -0
- data/lib/rdl/types/optional.rb +8 -0
- data/lib/rdl/types/parser.racc +31 -5
- data/lib/rdl/types/parser.tab.rb +540 -302
- data/lib/rdl/types/rdl_types.rb +45 -0
- data/lib/rdl/types/singleton.rb +14 -1
- data/lib/rdl/types/string.rb +104 -0
- data/lib/rdl/types/structural.rb +8 -0
- data/lib/rdl/types/top.rb +8 -0
- data/lib/rdl/types/tuple.rb +32 -8
- data/lib/rdl/types/type.rb +54 -11
- data/lib/rdl/types/union.rb +41 -2
- data/lib/rdl/types/var.rb +10 -0
- data/lib/rdl/types/vararg.rb +8 -0
- data/lib/rdl/util.rb +13 -10
- data/lib/rdl/wrap.rb +271 -27
- data/lib/rdl_disable.rb +16 -2
- data/lib/types/active_record.rb +1 -0
- data/lib/types/core/array.rb +442 -23
- data/lib/types/core/basic_object.rb +3 -3
- data/lib/types/core/bigdecimal.rb +5 -0
- data/lib/types/core/class.rb +2 -0
- data/lib/types/core/dir.rb +3 -3
- data/lib/types/core/enumerable.rb +4 -4
- data/lib/types/core/enumerator.rb +1 -1
- data/lib/types/core/file.rb +4 -4
- data/lib/types/core/float.rb +203 -0
- data/lib/types/core/hash.rb +390 -15
- data/lib/types/core/integer.rb +223 -10
- data/lib/types/core/io.rb +2 -2
- data/lib/types/core/kernel.rb +8 -5
- data/lib/types/core/marshal.rb +3 -0
- data/lib/types/core/module.rb +3 -3
- data/lib/types/core/numeric.rb +0 -2
- data/lib/types/core/object.rb +5 -5
- data/lib/types/core/pathname.rb +2 -2
- data/lib/types/core/process.rb +1 -3
- data/lib/types/core/range.rb +1 -1
- data/lib/types/core/regexp.rb +2 -2
- data/lib/types/core/set.rb +1 -1
- data/lib/types/core/string.rb +408 -16
- data/lib/types/core/symbol.rb +3 -3
- data/lib/types/core/time.rb +1 -1
- data/lib/types/core/uri.rb +13 -13
- data/lib/types/rails/_helpers.rb +7 -1
- data/lib/types/rails/action_controller/mime_responds.rb +2 -0
- data/lib/types/rails/active_record/associations.rb +42 -30
- data/lib/types/rails/active_record/comp_types.rb +637 -0
- data/lib/types/rails/active_record/finder_methods.rb +1 -1
- data/lib/types/rails/active_record/model_schema.rb +28 -16
- data/lib/types/rails/active_record/relation.rb +5 -3
- data/lib/types/rails/active_record/sql-strings.rb +166 -0
- data/lib/types/rails/string.rb +1 -1
- data/lib/types/sequel.rb +1 -0
- data/lib/types/sequel/comp_types.rb +581 -0
- data/rdl.gemspec +5 -4
- data/test/test_alias.rb +4 -0
- data/test/test_array_types.rb +244 -0
- data/test/test_bound_types.rb +80 -0
- data/test/test_contract.rb +4 -0
- data/test/test_dsl.rb +5 -0
- data/test/test_dyn_comptype_checks.rb +206 -0
- data/test/test_generic.rb +21 -20
- data/test/test_hash_types.rb +322 -0
- data/test/test_intersection.rb +1 -0
- data/test/test_le.rb +29 -4
- data/test/test_member.rb +3 -1
- data/test/test_parser.rb +5 -0
- data/test/test_query.rb +1 -0
- data/test/test_rdl.rb +63 -28
- data/test/test_rdl_type.rb +4 -0
- data/test/test_string_types.rb +102 -0
- data/test/test_type_contract.rb +59 -37
- data/test/test_typecheck.rb +480 -75
- data/test/test_types.rb +17 -0
- data/test/test_wrap.rb +5 -0
- metadata +35 -5
- data/lib/types/rails/active_record/schema_types.rb +0 -51
data/lib/types/core/regexp.rb
CHANGED
@@ -5,8 +5,8 @@ RDL.type :Regexp, 'self.last_match', '() -> MatchData', wrap: false # Can't wrap
|
|
5
5
|
RDL.type :Regexp, 'self.last_match', '(Integer) -> String', wrap: false
|
6
6
|
RDL.type :Regexp, :initialize, '(String, ?%any options, ?String kcode) -> self'
|
7
7
|
RDL.type :Regexp, :initialize, '(Regexp) -> self'
|
8
|
-
RDL.rdl_alias :Regexp, 'self.compile',
|
9
|
-
RDL.rdl_alias :Regexp, 'self.quote', 'self.escape'
|
8
|
+
RDL.rdl_alias :Regexp, :'self.compile', :initialize
|
9
|
+
RDL.rdl_alias :Regexp, :'self.quote', :'self.escape'
|
10
10
|
RDL.type :Regexp, 'self.try_convert', '(%any obj) -> Regexp or nil'
|
11
11
|
RDL.type :Regexp, 'self.union', '(*(Regexp or String) pats) -> Regexp'
|
12
12
|
RDL.type :Regexp, 'self.union', '(Array<Regexp or String> pats) -> Regexp'
|
data/lib/types/core/set.rb
CHANGED
@@ -18,7 +18,7 @@ RDL.type :Set, :add, '(t o) -> self'
|
|
18
18
|
RDL.type :Set, :add?, '(t o) -> self or nil'
|
19
19
|
RDL.type :Set, :classify, '() { (u) -> t } -> Hash<u, Set<t>>'
|
20
20
|
RDL.type :Set, :clear, '() -> self'
|
21
|
-
RDL.rdl_alias :Set, :collect!, :map
|
21
|
+
RDL.rdl_alias :Set, :collect!, :map!
|
22
22
|
RDL.type :Set, :delete, '(t o) -> self'
|
23
23
|
RDL.type :Set, :delete?, '(t o) -> self or nil'
|
24
24
|
RDL.type :Set, :delete_if, '() { (t) -> %bool } -> self'
|
data/lib/types/core/string.rb
CHANGED
@@ -1,19 +1,411 @@
|
|
1
1
|
RDL.nowrap :String
|
2
|
+
|
3
|
+
def String.output_type(trec, targs, meth, type)
|
4
|
+
case trec
|
5
|
+
when RDL::Type::PreciseStringType
|
6
|
+
return RDL::Globals.parser.scan_str "#T #{type}" unless trec.vals.size == 1 ## Can maybe get more precise than this for some methods, but in most cases we have to sacrifice precision. Might return to this.
|
7
|
+
if targs.empty?
|
8
|
+
res = trec.vals[0].send(meth)
|
9
|
+
elsif targs.size == 1
|
10
|
+
case targs[0]
|
11
|
+
when RDL::Type::SingletonType
|
12
|
+
res = trec.vals[0].send(meth, targs[0].val)
|
13
|
+
when RDL::Type::PreciseStringType
|
14
|
+
res = trec.vals[0].send(meth, targs.vals[0])
|
15
|
+
else
|
16
|
+
RDL::Globals.parser.scan_str "#T #{type}"
|
17
|
+
end
|
18
|
+
elsif targs.size > 1 && targs.all? { |a| a.is_a?(RDL::Type::SingletonType) }
|
19
|
+
vals = targs.map { |t| t.val }
|
20
|
+
to_type(trec.vals[0].send(meth, *vals))
|
21
|
+
else
|
22
|
+
raise "not yet implemented"
|
23
|
+
end
|
24
|
+
to_type(res)
|
25
|
+
else
|
26
|
+
RDL::Globals.parser.scan_str "#T #{type}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
RDL.type String, 'self.output_type', "(RDL::Type::Type, Array<RDL::Type::Type>, Symbol, String) -> RDL::Type::Type", effect: [:+, :+]
|
31
|
+
|
32
|
+
def String.to_type(v)
|
33
|
+
case v
|
34
|
+
when RDL::Type::Type
|
35
|
+
v
|
36
|
+
when Array
|
37
|
+
RDL::Type::TupleType.new(*(v.map { |i| to_type(i) }))
|
38
|
+
when String
|
39
|
+
RDL::Type::PreciseStringType.new(v)
|
40
|
+
when Symbol, Integer, Float, Class, TrueClass, FalseClass
|
41
|
+
RDL::Type::SingletonType.new(v)
|
42
|
+
else
|
43
|
+
RDL::Type::NominalType.new(v.class)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
RDL.type String, 'self.to_type', "(%any) -> RDL::Type::Type", effect: [:+, :+]
|
48
|
+
|
49
|
+
def String.any_string(a)
|
50
|
+
case a
|
51
|
+
when RDL::Type::PreciseStringType
|
52
|
+
a
|
53
|
+
else
|
54
|
+
RDL::Globals.types[:string]
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
RDL.type String, 'self.any_string', "(%any) -> RDL::Type::Type", effect: [:+, :+]
|
59
|
+
|
60
|
+
def String.string_promote!(trec)
|
61
|
+
case trec
|
62
|
+
when RDL::Type::PreciseStringType
|
63
|
+
raise "Unable to promote string #{trec}." unless trec.promote!
|
64
|
+
trec
|
65
|
+
else
|
66
|
+
RDL::Globals.types[:string]
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
RDL.type String, 'self.string_promote!', "(%any) -> RDL::Type::Type", effect: [:~, :+]
|
71
|
+
|
72
|
+
|
2
73
|
RDL.type :String, :initialize, '(?String str) -> self new_str'
|
3
|
-
RDL.type :String,
|
74
|
+
RDL.type :String, 'self.try_convert', '(Object obj) -> String or nil new_string'
|
75
|
+
RDL.type :String, :%, '(Object) -> ``output_type(trec, targs, :%, "String")``'
|
76
|
+
RDL.type :String, :*, '(Integer) -> ``output_type(trec, targs, :*, "String")``'
|
77
|
+
|
78
|
+
def String.plus_output(trec, targs)
|
79
|
+
if trec.is_a?(RDL::Type::PreciseStringType) && targs[0].is_a?(RDL::Type::PreciseStringType)
|
80
|
+
then RDL::Type::PreciseStringType.new(*(trec.vals+targs[0].vals))
|
81
|
+
else RDL::Globals.types[:string]
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
RDL.type String, 'self.plus_output', "(RDL::Type::Type, Array<RDL::Type::Type>) -> RDL::Type::Type", effect: [:+, :+]
|
86
|
+
|
87
|
+
|
88
|
+
RDL.type :String, :+, '(``any_string(targs[0])``) -> ``plus_output(trec, targs)``'
|
89
|
+
RDL.type :String, :<<, '(Object) -> ``append_output(trec, targs)``'
|
90
|
+
|
91
|
+
def String.append_output(trec, targs)
|
92
|
+
if trec.is_a?(RDL::Type::PreciseStringType) && targs[0].is_a?(RDL::Type::PreciseStringType)
|
93
|
+
targs[0].vals.each { |v|
|
94
|
+
if trec.vals.last.is_a?(String) && v.is_a?(String)
|
95
|
+
trec.vals.last << v
|
96
|
+
else
|
97
|
+
trec.vals << v
|
98
|
+
end
|
99
|
+
}
|
100
|
+
raise RDL::Typecheck::StaticTypeError, "Failed to mutate string: new string #{trec} does not match prior constraints." unless trec.check_bounds
|
101
|
+
trec
|
102
|
+
elsif trec.is_a?(RDL::Type::PreciseStringType)
|
103
|
+
trec.promote!
|
104
|
+
trec
|
105
|
+
else
|
106
|
+
RDL::Globals.types[:string]
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
RDL.type String, 'self.append_output', "(RDL::Type::Type, Array<RDL::Type::Type>) -> RDL::Type::Type", effect: [:+, :+]
|
111
|
+
|
112
|
+
RDL.type :String, :<=>, '(String other) -> ``output_type(trec, targs, :<=>, "Integer")``'
|
113
|
+
RDL.type :String, :==, '(%any) -> ``output_type(trec, targs, :==, "%bool")``', effect: [:+, :+]
|
114
|
+
RDL.type :String, :===, '(%any) -> ``output_type(trec, targs, :===, "%bool")``'
|
115
|
+
RDL.type :String, :=~, '(Object) -> ``output_type(trec, targs, :=~, "Integer")``', wrap: false # Wrapping this messes up $1 etc
|
116
|
+
RDL.type :String, :[], '(Integer, ?Integer) -> ``output_type(trec, targs, :[], "String")``', effect: [:+, :+]
|
117
|
+
RDL.type :String, :[], '(Range<Integer> or Regexp) -> ``output_type(trec, targs, :[], "String")``', effect: [:+, :+]
|
118
|
+
RDL.type :String, :[], '(Regexp, Integer) -> ``output_type(trec, targs, :[], "String")``', effect: [:+, :+]
|
119
|
+
RDL.type :String, :[], '(Regexp, String) -> ``output_type(trec, targs, :[], "String")``', effect: [:+, :+]
|
120
|
+
RDL.type :String, :[], '(String) -> ``output_type(trec, targs, :[], "String")``', effect: [:+, :+]
|
121
|
+
RDL.type :String, :ascii_only?, '() -> ``output_type(trec, targs, :ascii_only?, "%bool")``'
|
122
|
+
RDL.type :String, :b, '() -> ``output_type(trec, targs, :b, "String")``'
|
123
|
+
RDL.type :String, :bytes, '() -> ``output_type(trec, targs, :bytes, "Array")``'
|
124
|
+
RDL.type :String, :bytesize, '() -> ``output_type(trec, targs, :bytesize, "Integer")``'
|
125
|
+
RDL.type :String, :byteslice, '(Integer, ?Integer) -> ``output_type(trec, targs, :byteslice, "String")``'
|
126
|
+
RDL.type :String, :byteslice, '(Range<Integer>) -> ``output_type(trec, targs, :byteslice, "String")``'
|
127
|
+
RDL.type :String, :capitalize, '() -> ``output_type(trec, targs, :capitalize, "String")``'
|
128
|
+
RDL.type :String, :capitalize!, '() -> ``cap_down_output(trec, :capitalize!)``'
|
129
|
+
def String.cap_down_output(trec, meth)
|
130
|
+
case trec
|
131
|
+
when RDL::Type::PreciseStringType
|
132
|
+
trec.vals.each { |v| v.send(meth) if v.is_a?(String) }
|
133
|
+
raise RDL::Typecheck::StaticTypeError, "Failed to mutate string: new string #{trec} does not match prior constraints." unless trec.check_bounds
|
134
|
+
trec
|
135
|
+
else
|
136
|
+
RDL::Globals.types[:string]
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
RDL.type String, 'self.cap_down_output', "(RDL::Type::Type, Symbol) -> RDL::Type::Type", effect: [:+, :+]
|
141
|
+
|
142
|
+
RDL.type :String, :casecmp, '(String) -> ``output_type(trec, targs, :casecmp, "Integer")``'
|
143
|
+
RDL.type :String, :center, '(Integer, ?String) -> ``output_type(trec, targs, :center, "String")``'
|
144
|
+
RDL.type :String, :chars, '() -> ``output_type(trec, targs, :chars, "Array")``' #deprecated
|
145
|
+
RDL.type :String, :chomp, '(?String) -> ``output_type(trec, targs, :chomp, "String")``'
|
146
|
+
RDL.type :String, :chomp!, '(?String) -> ``string_promote!(trec)``' ## chomp! depends on the value of $/, which is hard to reason about during type checking. So, keeping this imprecise.
|
147
|
+
RDL.type :String, :chop, '() -> ``output_type(trec, targs, :chop, "String")``'
|
148
|
+
RDL.type :String, :chop!, '() -> ``chop_output(trec)``'
|
149
|
+
|
150
|
+
def String.chop_output(trec)
|
151
|
+
case trec
|
152
|
+
when RDL::Type::PreciseStringType
|
153
|
+
if trec.vals.last.is_a?(String)
|
154
|
+
trec.vals.last.chop!
|
155
|
+
raise RDL::Typecheck::StaticTypeError, "Failed to mutate string: new string #{trec} does not match prior constraints." unless trec.check_bounds
|
156
|
+
trec
|
157
|
+
else
|
158
|
+
trec.promote!
|
159
|
+
trec
|
160
|
+
end
|
161
|
+
else
|
162
|
+
RDL::Globals.types[:string]
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
RDL.type String, 'self.chop_output', "(RDL::Type::Type) -> RDL::Type::Type", effect: [:+, :+]
|
167
|
+
|
168
|
+
RDL.type :String, :chr, '() -> ``output_type(trec, targs, :chr, "String")``'
|
169
|
+
RDL.type :String, :clear, '() -> ``clear_output(trec)``'
|
170
|
+
|
171
|
+
def String.clear_output(trec)
|
172
|
+
case trec
|
173
|
+
when RDL::Type::PreciseStringType
|
174
|
+
trec.vals = [""]
|
175
|
+
raise RDL::Typecheck::StaticTypeError, "Failed to mutate string: new string #{trec} does not match prior constraints." unless trec.check_bounds
|
176
|
+
trec
|
177
|
+
else
|
178
|
+
RDL::Type::PreciseStringType.new("")
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
RDL.type String, 'self.clear_output', "(RDL::Type::Type) -> RDL::Type::Type", effect: [:+, :+]
|
183
|
+
|
184
|
+
RDL.type :String, :codepoints, '() -> ``output_type(trec, targs, :codepoints, "Array<Integer>")``'
|
185
|
+
RDL.type :String, :concat, '(Integer or Object) -> ``append_output(trec, targs)``'
|
186
|
+
RDL.type :String, :count, '(String, *String) -> ``output_type(trec, targs, :count, "Integer")``'
|
187
|
+
RDL.type :String, :crypt, '(String) -> ``output_type(trec, targs, :crypt, "String")``'
|
188
|
+
RDL.type :String, :delete, '(String, *String) -> ``output_type(trec, targs, :delete, "String")``'
|
189
|
+
RDL.type :String, :delete!, '(String, *String) -> ``string_promote!(trec)``'
|
190
|
+
RDL.type :String, :downcase, '() -> ``output_type(trec, targs, :downcase, "String")``'
|
191
|
+
RDL.type :String, :downcase!, '() -> ``cap_down_output(trec, :downcase!)``'
|
192
|
+
RDL.type :String, :dump, '() -> ``output_type(trec, targs, :dump, "String")``'
|
193
|
+
RDL.type :String, :each_byte, '() {(Integer) -> %any} -> String'
|
194
|
+
RDL.type :String, :each_byte, '() -> Enumerator'
|
195
|
+
RDL.type :String, :each_char, '() {(String) -> %any} -> String'
|
196
|
+
RDL.type :String, :each_char, '() -> Enumerator'
|
197
|
+
RDL.type :String, :each_codepoint, '() {(Integer) -> %any} -> String'
|
198
|
+
RDL.type :String, :each_codepoint, '() -> Enumerator'
|
199
|
+
RDL.type :String, :each_line, '(?String) {(Integer) -> %any} -> String'
|
200
|
+
RDL.type :String, :each_line, '(?String) -> Enumerator'
|
201
|
+
RDL.type :String, :empty?, '() ->``output_type(trec, targs, :empty?, "%bool")``'
|
202
|
+
# RDL.type :String, :encode, '(?Encoding, ?Encoding, *Symbol) -> String' # TODO: fix Hash arg:String,
|
203
|
+
# RDL.type :String, :encode!, '(Encoding, ?Encoding, *Symbol) -> String'
|
204
|
+
RDL.type :String, :encoding, '() -> Encoding'
|
205
|
+
RDL.type :String, :end_with?, '(*String) -> ``output_type(trec, targs, :end_with?, "%bool")``'
|
206
|
+
RDL.type :String, :eql?, '(String) -> ``output_type(trec, targs, :eql?, "%bool")``'
|
207
|
+
RDL.type :String, :force_encoding, '(String or Encoding) -> String'
|
208
|
+
RDL.type :String, :getbyte, '(Integer) -> ``output_type(trec, targs, :getbyte, "Integer")``'
|
209
|
+
RDL.type :String, :gsub, '(Regexp or String, String) -> ``output_type(trec, targs, :gsub, "String")``', wrap: false # Can't wrap these:String, , since they mess with $1 etc
|
210
|
+
RDL.type :String, :gsub, '(Regexp or String, Hash) -> ``output_type(trec, targs, :gsub, "String")``'
|
211
|
+
RDL.type :String, :gsub, '(Regexp or String, String) -> ``output_type(trec, targs, :gsub, "String")``', wrap: false
|
212
|
+
RDL.type :String, :gsub, '(Regexp or String) {(String) -> %any } -> ``output_type(trec, targs, :gsub, "String")``'
|
213
|
+
RDL.type :String, :gsub, '(Regexp or String, String) -> ``output_type(trec, targs, :gsub, "String")``', wrap: false
|
214
|
+
RDL.type :String, :gsub, '(Regexp or String) -> ``output_type(trec, targs, :gsub, "String")``'
|
215
|
+
RDL.type :String, :gsub!, '(Regexp or String, String) -> ``string_promote!(trec)``', wrap: false
|
216
|
+
RDL.type :String, :gsub!, '(Regexp or String) {(String) -> %any } -> ``string_promote!(trec)``', wrap: false
|
217
|
+
RDL.type :String, :gsub!, '(Regexp or String) -> ``string_promote!(trec); RDL::Type::NominalType.new(Enumerator)``', wrap: false
|
218
|
+
RDL.type :String, :hash, '() -> Integer'
|
219
|
+
RDL.type :String, :hex, '() -> ``output_type(trec, targs, :getbyte, "Integer")``'
|
220
|
+
RDL.type :String, :include?, '(String) -> ``output_type(trec, targs, :include?, "%bool")``', effect: [:+, :+]
|
221
|
+
RDL.type :String, :index, '(Regexp or String, ?Integer) -> ``output_type(trec, targs, :index, "Integer")``'
|
222
|
+
RDL.type :String, :replace, '(String) -> ``replace_output(trec, targs)``'
|
223
|
+
|
224
|
+
def String.replace_output(trec, targs)
|
225
|
+
case trec
|
226
|
+
when RDL::Type::PreciseStringType
|
227
|
+
case targs[0]
|
228
|
+
when RDL::Type::PreciseStringType
|
229
|
+
trec.vals = targs[0].vals
|
230
|
+
raise RDL::Typecheck::StaticTypeError, "Failed to mutate string: new string #{trec} does not match prior constraints." unless trec.check_bounds
|
231
|
+
trec
|
232
|
+
else
|
233
|
+
raise RDL::Typecheck::StaticTypeError, "Failed to promote string #{trec}." unless trec.promote!
|
234
|
+
trec
|
235
|
+
end
|
236
|
+
else
|
237
|
+
trec
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
RDL.type String, 'self.replace_output', "(RDL::Type::Type, Array<RDL::Type::Type>) -> RDL::Type::Type", effect: [:+, :+]
|
242
|
+
|
243
|
+
RDL.type :String, :insert, '(Integer, String) -> String' ## TODO
|
244
|
+
|
245
|
+
def String.insert_output(trec, targs)
|
246
|
+
case trec
|
247
|
+
when RDL::Type::PreciseStringType
|
248
|
+
if targs[0].is_a?(RDL::Type::SingletonType) && targs[1].is_a?(RDL::Type::PreciseStringType) && targs[1].all? { |v| v.is_a?(String) } && trec.vals.all? { |v| v.is_a?(String) }
|
249
|
+
rec_str = trec.vals.join
|
250
|
+
arg_int = targs[0].val
|
251
|
+
arg_str = targs[1].vals.join
|
252
|
+
trec.vals = [rec_str.insert(arg_int, arg_str)]
|
253
|
+
raise RDL::Typecheck::StaticTypeError, "Failed to mutate string: new string #{trec} does not match prior constraints." unless trec.check_bounds
|
254
|
+
trec
|
255
|
+
else
|
256
|
+
raise RDL::Typecheck::StaticTypeError, "Failed to promote string #{trec}." unless trec.promote!
|
257
|
+
trec
|
258
|
+
end
|
259
|
+
else
|
260
|
+
trec
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
RDL.type String, 'self.insert_output', "(RDL::Type::Type, Array<RDL::Type::Type>) -> RDL::Type::Type", effect: [:+, :+]
|
265
|
+
|
266
|
+
RDL.type :String, :inspect, '() -> ``output_type(trec, targs, :inspect, "String")``'
|
267
|
+
RDL.type :String, :intern, '() -> ``output_type(trec, targs, :intern, "Symbol")``'
|
268
|
+
RDL.type :String, :length, '() -> ``output_type(trec, targs, :length, "Integer")``'
|
269
|
+
RDL.type :String, :lines, '(?String) -> ``output_type(trec, targs, :lines, "Array<String>")``'
|
270
|
+
RDL.type :String, :ljust, '(Integer, ?String) -> ``output_type(trec, targs, :ljust, "String")``'
|
271
|
+
RDL.type :String, :lstrip, '() -> ``output_type(trec, targs, :getbyte, "String")``'
|
272
|
+
RDL.type :String, :lstrip!, '() -> ``lrstrip_output(trec, :lstrip!)``' ## TODO
|
273
|
+
|
274
|
+
def String.lrstrip_output(trec, meth)
|
275
|
+
check = (if meth == :lstrip! then :start_with? elsif meth == :rstrip! then :end_with? else raise "unexpected val #{meth}" end)
|
276
|
+
case trec
|
277
|
+
when RDL::Type::PreciseStringType
|
278
|
+
if trec.vals[0].is_a?(String)
|
279
|
+
if trec.vals[0].send(check, " ")
|
280
|
+
trec.vals[0].send(meth)
|
281
|
+
raise RDL::Typecheck::StaticTypeError, "Failed to mutate string: new string #{trec} does not match prior constraints." unless trec.check_bounds
|
282
|
+
trec
|
283
|
+
else
|
284
|
+
trec
|
285
|
+
end
|
286
|
+
else
|
287
|
+
raise RDL::Typecheck::StaticTypeError, "Failed to promote string #{trec}." unless trec.promote!
|
288
|
+
trec
|
289
|
+
end
|
290
|
+
else
|
291
|
+
trec
|
292
|
+
end
|
293
|
+
end
|
294
|
+
|
295
|
+
RDL.type String, 'self.lrstrip_output', "(RDL::Type::Type, Symbol) -> RDL::Type::Type", effect: [:+, :+]
|
296
|
+
|
297
|
+
RDL.type :String, :match, '(Regexp or String) -> MatchData'
|
298
|
+
RDL.type :String, :match, '(Regexp or String, Integer) -> MatchData'
|
299
|
+
RDL.type :String, :next, '() -> ``output_type(trec, targs, :next, "String")``'
|
300
|
+
RDL.type :String, :next!, '() -> ``mutate_output(trec, :next!)``' ## TODO
|
301
|
+
|
302
|
+
def String.mutate_output(trec, meth)
|
303
|
+
case trec
|
304
|
+
when RDL::Type::PreciseStringType
|
305
|
+
if trec.vals.all? { |v| v.is_a?(String) }
|
306
|
+
trec.vals = [trec.vals.join.send(meth)]
|
307
|
+
raise RDL::Typecheck::StaticTypeError, "Failed to mutate string: new string #{trec} does not match prior constraints." unless trec.check_bounds
|
308
|
+
trec
|
309
|
+
else
|
310
|
+
raise RDL::Typecheck::StaticTypeError, "Failed to promote string #{trec}." unless trec.promote!
|
311
|
+
trec
|
312
|
+
end
|
313
|
+
else
|
314
|
+
trec
|
315
|
+
end
|
316
|
+
end
|
317
|
+
|
318
|
+
RDL.type String, 'self.mutate_output', "(RDL::Type::Type, Symbol) -> RDL::Type::Type", effect: [:+, :+]
|
319
|
+
|
320
|
+
|
321
|
+
RDL.type :String, :oct, '() -> ``output_type(trec, targs, :oct, "Integer")``'
|
322
|
+
RDL.type :String, :ord, '() -> ``output_type(trec, targs, :ord, "Integer")``'
|
323
|
+
RDL.type :String, :partition, '(Regexp or String) -> ``output_type(trec, targs, :partition, "Array<String>")``'
|
324
|
+
RDL.type :String, :prepend, '(String) -> ``output_type(trec, targs, :prepend, "String")``'
|
325
|
+
RDL.type :String, :reverse, '() -> ``output_type(trec, targs, :reverse, "String")``'
|
326
|
+
RDL.type :String, :rindex, '(String or Regexp, ?Integer) -> ``output_type(trec, targs, :rindex, "Integer")``'
|
327
|
+
RDL.type :String, :rjust, '(Integer, ?String) -> ``output_type(trec, targs, :rjust, "String")``'
|
328
|
+
RDL.type :String, :rpartition, '(String or Regexp) -> ``output_type(trec, targs, :rpartition, "Array<String>")``'
|
329
|
+
RDL.type :String, :rstrip, '() -> ``output_type(trec, targs, :rstrip, "String")``'
|
330
|
+
RDL.type :String, :rstrip!, '() -> ``lrstrip_output(trec, :rstrip!)``'
|
331
|
+
RDL.type :String, :scan, '(Regexp or String) -> ``output_type(trec, targs, :scan, "Array<String or Array<String>>")``', wrap: false # :String, Can't wrap or screws up last_match
|
332
|
+
RDL.type :String, :scan, '(Regexp or String) {(*%any) -> %any} -> ``output_type(trec, targs, :scan, "Array<String or Array<String>>")``', wrap: false
|
333
|
+
RDL.type :String, :scrub, '(?String) -> ``output_type(trec, targs, :scrub, "String")``'
|
334
|
+
RDL.type :String, :scrub, '(?String) {(%any) -> %any} -> String'
|
335
|
+
RDL.type :String, :scrub!, '(?String) -> ``string_promote!(trec)``'
|
336
|
+
RDL.type :String, :scrub!, '(?String) {(%any) -> %any} -> ``string_promote!(trec)``'
|
337
|
+
RDL.type :String, :size, '() -> ``output_type(trec, targs, :size, "Integer")``'
|
338
|
+
RDL.rdl_alias :String, :slice, :[]
|
339
|
+
RDL.type :String, :slice!, '(Integer, ?Integer) -> ``string_promote!(trec)``'
|
340
|
+
RDL.type :String, :slice!, '(Range<Integer> or Regexp) -> ``string_promote!(trec)``'
|
341
|
+
RDL.type :String, :slice!, '(Regexp, Integer) -> ``string_promote!(trec)``'
|
342
|
+
RDL.type :String, :slice!, '(Regexp, String) -> ``string_promote!(trec)``'
|
343
|
+
RDL.type :String, :slice!, '(String) -> ``string_promote!(trec)``'
|
344
|
+
RDL.type :String, :split, '(?(Regexp or String), ?Integer) -> ``output_type(trec, targs, :split, "Array<String>")``', effect: [:+, :+]
|
345
|
+
RDL.type :String, :split, '(?Integer) -> ``output_type(trec, targs, :split, "Array<String>")``', effect: [:+, :+]
|
346
|
+
RDL.type :String, :squeeze, '() -> ``output_type(trec, targs, :squeeze, "String")``'
|
347
|
+
RDL.type :String, :squeeze!, '() -> ``mutate_output(trec, :squeeze!)``'
|
348
|
+
RDL.type :String, :start_with?, '(* String) -> ``output_type(trec, targs, :start_with?, "%bool")``', effect: [:+, :+]
|
349
|
+
RDL.type :String, :strip, '() -> ``output_type(trec, targs, :strip, "String")``'
|
350
|
+
RDL.type :String, :strip!, '() -> ``mutate_output(trec, :strip!)``'
|
351
|
+
RDL.type :String, :sub, '(Regexp or String, String or Hash) -> ``output_type(trec, targs, :sub, "String")``', wrap: false # Can't wrap these, since they mess with $1 etc
|
352
|
+
RDL.type :String, :sub, '(Regexp or String) {(String) -> %any} -> ``output_type(trec, targs, :sub, "String")``', wrap: false
|
353
|
+
RDL.type :String, :sub!, '(Regexp or String, String) -> ``string_promote!(trec)``', wrap: false
|
354
|
+
RDL.type :String, :sub!, '(Regexp or String) {(String) -> %any} -> ``string_promote!(trec)``', wrap: false
|
355
|
+
RDL.type :String, :succ, '() -> ``output_type(trec, targs, :succ, "String")``'
|
356
|
+
RDL.type :String, :sum, '(?Integer) -> ``output_type(trec, targs, :sum, "Integer")``'
|
357
|
+
RDL.type :String, :swapcase, '() -> ``output_type(trec, targs, :swapcase, "String")``'
|
358
|
+
RDL.type :String, :swapcase!, '() -> ``mutate_output(trec, :swapcase!)``'
|
359
|
+
RDL.type :String, :to_c, '() -> Complex'
|
360
|
+
RDL.type :String, :to_f, '() -> ``output_type(trec, targs, :to_f, "Float")``'
|
361
|
+
RDL.type :String, :to_i, '(?Integer) -> ``output_type(trec, targs, :to_i, "Integer")``'
|
362
|
+
RDL.type :String, :to_r, '() -> Rational'
|
363
|
+
RDL.type :String, :to_s, '() -> self', effect: [:+, :+]
|
364
|
+
RDL.type :String, :to_str, '() -> self'
|
365
|
+
RDL.type :String, :to_sym, '() -> ``output_type(trec, targs, :to_sym, "Symbol")``', effect: [:+, :+]
|
366
|
+
RDL.type :String, :tr, '(String, String) -> ``output_type(trec, targs, :tr, "String")``'
|
367
|
+
RDL.type :String, :tr!, '(String, String) -> ``string_promote!(trec)``'
|
368
|
+
RDL.type :String, :tr_s, '(String, String) -> ``output_type(trec, targs, :tr_s, "String")``'
|
369
|
+
RDL.type :String, :tr_s!, '(String, String) -> ``string_promote!(trec)``'
|
370
|
+
RDL.type :String, :unpack, '(String) -> ``output_type(trec, targs, :unpack, "Array<String>")``'
|
371
|
+
RDL.type :String, :upcase, '() -> ``output_type(trec, targs, :upcase, "String")``'
|
372
|
+
RDL.type :String, :upcase!, '() -> ``mutate_output(trec, :upcase!)``'
|
373
|
+
RDL.type :String, :upto, '(String, ?bool) -> Enumerator'
|
374
|
+
RDL.type :String, :upto, '(String, ?bool) {(String) -> %any } -> String'
|
375
|
+
RDL.type :String, :valid_encoding?, '() -> ``output_type(trec, targs, :valid_encoding?, "%bool")``'
|
376
|
+
|
377
|
+
|
378
|
+
|
379
|
+
|
380
|
+
|
381
|
+
|
382
|
+
|
383
|
+
|
384
|
+
|
385
|
+
|
386
|
+
|
387
|
+
### non-dependent types
|
388
|
+
|
389
|
+
|
390
|
+
|
391
|
+
|
392
|
+
|
393
|
+
|
394
|
+
RDL.type :String, :initialize, '(?String str) -> self new_str'
|
395
|
+
RDL.type :String, :'self.try_convert', '(Object obj) -> String or nil new_string'
|
4
396
|
RDL.type :String, :%, '(Object) -> String'
|
5
397
|
RDL.type :String, :*, '(Integer) -> String'
|
6
398
|
RDL.type :String, :+, '(String) -> String'
|
7
399
|
RDL.type :String, :<<, '(Object) -> String'
|
8
400
|
RDL.type :String, :<=>, '(String other) -> Integer or nil ret'
|
9
|
-
RDL.type :String, :==, '(%any) -> %bool'
|
401
|
+
RDL.type :String, :==, '(%any) -> %bool', effect: [:+, :+]
|
10
402
|
RDL.type :String, :===, '(%any) -> %bool'
|
11
403
|
RDL.type :String, :=~, '(Object) -> Integer or nil', wrap: false # Wrapping this messes up $1 etc
|
12
|
-
RDL.type :String, :[], '(Integer, ?Integer) -> String or nil'
|
13
|
-
RDL.type :String, :[], '(Range<Integer> or Regexp) -> String or nil'
|
14
|
-
RDL.type :String, :[], '(Regexp, Integer) -> String or nil'
|
15
|
-
RDL.type :String, :[], '(Regexp, String) -> String or nil'
|
16
|
-
RDL.type :String, :[], '(String) -> String or nil'
|
404
|
+
RDL.type :String, :[], '(Integer, ?Integer) -> String or nil', effect: [:+, :+]
|
405
|
+
RDL.type :String, :[], '(Range<Integer> or Regexp) -> String or nil', effect: [:+, :+]
|
406
|
+
RDL.type :String, :[], '(Regexp, Integer) -> String or nil', effect: [:+, :+]
|
407
|
+
RDL.type :String, :[], '(Regexp, String) -> String or nil', effect: [:+, :+]
|
408
|
+
RDL.type :String, :[], '(String) -> String or nil', effect: [:+, :+]
|
17
409
|
RDL.type :String, :ascii_only?, '() -> %bool'
|
18
410
|
RDL.type :String, :b, '() -> String'
|
19
411
|
RDL.type :String, :bytes, '() -> Array' # TODO: bindings to parameterized (vars)
|
@@ -67,7 +459,7 @@ RDL.type :String, :gsub!, '(Regexp or String) {(String) -> %any } -> String or n
|
|
67
459
|
RDL.type :String, :gsub!, '(Regexp or String) -> Enumerator', wrap: false
|
68
460
|
RDL.type :String, :hash, '() -> Integer'
|
69
461
|
RDL.type :String, :hex, '() -> Integer'
|
70
|
-
RDL.type :String, :include?, '(String) -> %bool'
|
462
|
+
RDL.type :String, :include?, '(String) -> %bool', effect: [:+, :+]
|
71
463
|
RDL.type :String, :index, '(Regexp or String, ?Integer) -> Integer or nil'
|
72
464
|
RDL.type :String, :replace, '(String) -> String'
|
73
465
|
RDL.type :String, :insert, '(Integer, String) -> String'
|
@@ -98,19 +490,18 @@ RDL.type :String, :scrub, '(?String) -> String'
|
|
98
490
|
RDL.type :String, :scrub, '(?String) {(%any) -> %any} -> String'
|
99
491
|
RDL.type :String, :scrub!, '(?String) -> String'
|
100
492
|
RDL.type :String, :scrub!, '(?String) {(%any) -> %any} -> String'
|
101
|
-
RDL.type :String, :
|
493
|
+
RDL.type :String, :setbyte, '(Integer, Integer) -> Integer'
|
102
494
|
RDL.type :String, :size, '() -> Integer'
|
103
|
-
RDL.rdl_alias :String, :slice, :[]
|
104
495
|
RDL.type :String, :slice!, '(Integer, ?Integer) -> String or nil'
|
105
496
|
RDL.type :String, :slice!, '(Range<Integer> or Regexp) -> String or nil'
|
106
497
|
RDL.type :String, :slice!, '(Regexp, Integer) -> String or nil'
|
107
498
|
RDL.type :String, :slice!, '(Regexp, String) -> String or nil'
|
108
499
|
RDL.type :String, :slice!, '(String) -> String or nil'
|
109
|
-
RDL.type :String, :split, '(?(Regexp or String), ?Integer) -> Array<String>'
|
110
|
-
RDL.type :String, :split, '(?Integer) -> Array<String>'
|
500
|
+
RDL.type :String, :split, '(?(Regexp or String), ?Integer) -> Array<String>', effect: [:+, :+]
|
501
|
+
RDL.type :String, :split, '(?Integer) -> Array<String>', effect: [:+, :+]
|
111
502
|
RDL.type :String, :squeeze, '(?String) -> String'
|
112
503
|
RDL.type :String, :squeeze!, '(?String) -> String'
|
113
|
-
RDL.type :String, :start_with?, '(* String) -> %bool'
|
504
|
+
RDL.type :String, :start_with?, '(* String) -> %bool', effect: [:+, :+]
|
114
505
|
RDL.type :String, :strip, '() -> String'
|
115
506
|
RDL.type :String, :strip!, '() -> String'
|
116
507
|
RDL.type :String, :sub, '(Regexp or String, String or Hash) -> String', wrap: false # Can't wrap these, since they mess with $1 etc
|
@@ -125,9 +516,9 @@ RDL.type :String, :to_c, '() -> Complex'
|
|
125
516
|
RDL.type :String, :to_f, '() -> Float'
|
126
517
|
RDL.type :String, :to_i, '(?Integer) -> Integer'
|
127
518
|
RDL.type :String, :to_r, '() -> Rational'
|
128
|
-
RDL.type :String, :to_s, '() -> String'
|
129
|
-
RDL.type :String, :to_str, '() ->
|
130
|
-
RDL.type :String, :to_sym, '() -> Symbol'
|
519
|
+
RDL.type :String, :to_s, '() -> String', effect: [:+, :+]
|
520
|
+
RDL.type :String, :to_str, '() -> self'
|
521
|
+
RDL.type :String, :to_sym, '() -> Symbol', effect: [:+, :+]
|
131
522
|
RDL.type :String, :tr, '(String, String) -> String'
|
132
523
|
RDL.type :String, :tr!, '(String, String) -> String or nil'
|
133
524
|
RDL.type :String, :tr_s, '(String, String) -> String'
|
@@ -138,3 +529,4 @@ RDL.type :String, :upcase!, '() -> String or nil'
|
|
138
529
|
RDL.type :String, :upto, '(String, ?bool) -> Enumerator'
|
139
530
|
RDL.type :String, :upto, '(String, ?bool) {(String) -> %any } -> String'
|
140
531
|
RDL.type :String, :valid_encoding?, '() -> %bool'
|
532
|
+
|