rbs 1.7.0.beta.4 → 1.8.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 +4 -4
- data/.gitignore +0 -1
- data/CHANGELOG.md +58 -2
- data/Steepfile +0 -1
- data/core/array.rbs +3 -3
- data/core/binding.rbs +2 -0
- data/core/builtin.rbs +4 -0
- data/core/complex.rbs +0 -2
- data/core/enumerable.rbs +3 -3
- data/core/env.rbs +881 -0
- data/core/false_class.rbs +2 -0
- data/core/float.rbs +0 -2
- data/core/integer.rbs +0 -2
- data/core/nil_class.rbs +2 -0
- data/core/numeric.rbs +7 -0
- data/core/object.rbs +1 -1
- data/core/proc.rbs +2 -0
- data/core/rational.rbs +0 -2
- data/core/symbol.rbs +2 -0
- data/core/thread.rbs +1 -1
- data/core/true_class.rbs +2 -0
- data/core/unbound_method.rbs +13 -0
- data/docs/rbs_by_example.md +2 -2
- data/docs/syntax.md +25 -23
- data/ext/rbs_extension/parser.c +99 -95
- data/ext/rbs_extension/parserstate.c +0 -1
- data/ext/rbs_extension/rbs_extension.h +1 -1
- data/ext/rbs_extension/ruby_objs.c +8 -6
- data/ext/rbs_extension/ruby_objs.h +2 -4
- data/lib/rbs/ast/declarations.rb +6 -2
- data/lib/rbs/cli.rb +1 -1
- data/lib/rbs/collection/sources/git.rb +6 -1
- data/lib/rbs/definition_builder.rb +29 -2
- data/lib/rbs/environment.rb +1 -0
- data/lib/rbs/environment_walker.rb +4 -1
- data/lib/rbs/errors.rb +12 -0
- data/lib/rbs/prototype/helpers.rb +113 -0
- data/lib/rbs/prototype/rb.rb +2 -105
- data/lib/rbs/prototype/runtime.rb +16 -0
- data/lib/rbs/test/setup.rb +1 -0
- data/lib/rbs/type_alias_regularity.rb +115 -0
- data/lib/rbs/types.rb +11 -23
- data/lib/rbs/validator.rb +40 -7
- data/lib/rbs/variance_calculator.rb +52 -24
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs/writer.rb +1 -1
- data/lib/rbs.rb +2 -0
- data/schema/decls.json +13 -1
- data/schema/types.json +8 -2
- data/sig/collection/collections.rbs +2 -0
- data/sig/declarations.rbs +9 -6
- data/sig/definition_builder.rbs +29 -0
- data/sig/environment_walker.rbs +26 -0
- data/sig/errors.rbs +10 -0
- data/sig/type_alias_regularity.rbs +92 -0
- data/sig/types.rbs +11 -8
- data/sig/validator.rbs +7 -0
- data/sig/variance_calculator.rbs +50 -0
- data/stdlib/bigdecimal/0/big_decimal.rbs +44 -0
- data/stdlib/csv/0/csv.rbs +49 -3
- data/stdlib/date/0/date.rbs +2 -2
- data/stdlib/set/0/set.rbs +3 -3
- data/steep/Gemfile.lock +10 -10
- metadata +8 -6
- data/lib/rbs/parser.y +0 -1805
- data/lib/ruby/signature.rb +0 -7
@@ -54,6 +54,21 @@ module RBS
|
|
54
54
|
false
|
55
55
|
end
|
56
56
|
end
|
57
|
+
|
58
|
+
def incompatible?(params)
|
59
|
+
# @type set: Hash[Symbol]
|
60
|
+
set = Set[]
|
61
|
+
|
62
|
+
params.each do |param|
|
63
|
+
unless compatible?(param.name, with_annotation: param.variance)
|
64
|
+
set << param.name
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
unless set.empty?
|
69
|
+
set
|
70
|
+
end
|
71
|
+
end
|
57
72
|
end
|
58
73
|
|
59
74
|
attr_reader :builder
|
@@ -69,19 +84,12 @@ module RBS
|
|
69
84
|
def in_method_type(method_type:, variables:)
|
70
85
|
result = Result.new(variables: variables)
|
71
86
|
|
72
|
-
method_type.type
|
73
|
-
type(param.type, result: result, context: :contravariant)
|
74
|
-
end
|
87
|
+
function(method_type.type, result: result, context: :covariant)
|
75
88
|
|
76
89
|
if block = method_type.block
|
77
|
-
block.type
|
78
|
-
type(param.type, result: result, context: :covariant)
|
79
|
-
end
|
80
|
-
type(block.type.return_type, result: result, context: :contravariant)
|
90
|
+
function(block.type, result: result, context: :contravariant)
|
81
91
|
end
|
82
92
|
|
83
|
-
type(method_type.type.return_type, result: result, context: :covariant)
|
84
|
-
|
85
93
|
result
|
86
94
|
end
|
87
95
|
|
@@ -97,6 +105,14 @@ module RBS
|
|
97
105
|
end
|
98
106
|
end
|
99
107
|
|
108
|
+
def in_type_alias(name:)
|
109
|
+
decl = env.alias_decls[name].decl or raise
|
110
|
+
variables = decl.type_params.each.map(&:name)
|
111
|
+
Result.new(variables: variables).tap do |result|
|
112
|
+
type(decl.type, result: result, context: :covariant)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
100
116
|
def type(type, result:, context:)
|
101
117
|
case type
|
102
118
|
when Types::Variable
|
@@ -110,7 +126,7 @@ module RBS
|
|
110
126
|
result.invariant(type.name)
|
111
127
|
end
|
112
128
|
end
|
113
|
-
when Types::ClassInstance, Types::Interface
|
129
|
+
when Types::ClassInstance, Types::Interface, Types::Alias
|
114
130
|
NoTypeFoundError.check!(type.name,
|
115
131
|
env: env,
|
116
132
|
location: type.location)
|
@@ -120,6 +136,8 @@ module RBS
|
|
120
136
|
env.class_decls[type.name].type_params
|
121
137
|
when Types::Interface
|
122
138
|
env.interface_decls[type.name].decl.type_params
|
139
|
+
when Types::Alias
|
140
|
+
env.alias_decls[type.name].decl.type_params
|
123
141
|
end
|
124
142
|
|
125
143
|
type.args.each.with_index do |ty, i|
|
@@ -130,26 +148,36 @@ module RBS
|
|
130
148
|
when :covariant
|
131
149
|
type(ty, result: result, context: context)
|
132
150
|
when :contravariant
|
133
|
-
|
134
|
-
con = case context
|
135
|
-
when :invariant
|
136
|
-
:invariant
|
137
|
-
when :covariant
|
138
|
-
:contravariant
|
139
|
-
when :contravariant
|
140
|
-
:covariant
|
141
|
-
else
|
142
|
-
raise
|
143
|
-
end
|
144
|
-
type(ty, result: result, context: con)
|
151
|
+
type(ty, result: result, context: negate(context))
|
145
152
|
end
|
146
153
|
end
|
147
|
-
when Types::
|
148
|
-
|
154
|
+
when Types::Proc
|
155
|
+
function(type.type, result: result, context: context)
|
156
|
+
else
|
149
157
|
type.each_type do |ty|
|
150
158
|
type(ty, result: result, context: context)
|
151
159
|
end
|
152
160
|
end
|
153
161
|
end
|
162
|
+
|
163
|
+
def function(type, result:, context:)
|
164
|
+
type.each_param do |param|
|
165
|
+
type(param.type, result: result, context: negate(context))
|
166
|
+
end
|
167
|
+
type(type.return_type, result: result, context: context)
|
168
|
+
end
|
169
|
+
|
170
|
+
def negate(variance)
|
171
|
+
case variance
|
172
|
+
when :invariant
|
173
|
+
:invariant
|
174
|
+
when :covariant
|
175
|
+
:contravariant
|
176
|
+
when :contravariant
|
177
|
+
:covariant
|
178
|
+
else
|
179
|
+
raise
|
180
|
+
end
|
181
|
+
end
|
154
182
|
end
|
155
183
|
end
|
data/lib/rbs/version.rb
CHANGED
data/lib/rbs/writer.rb
CHANGED
@@ -119,7 +119,7 @@ module RBS
|
|
119
119
|
when AST::Declarations::Alias
|
120
120
|
write_comment decl.comment
|
121
121
|
write_annotation decl.annotations
|
122
|
-
puts "type #{decl.name} = #{decl.type}"
|
122
|
+
puts "type #{name_and_params(decl.name, decl.type_params)} = #{decl.type}"
|
123
123
|
|
124
124
|
when AST::Declarations::Interface
|
125
125
|
write_comment decl.comment
|
data/lib/rbs.rb
CHANGED
@@ -32,6 +32,7 @@ require "rbs/constant"
|
|
32
32
|
require "rbs/constant_table"
|
33
33
|
require "rbs/ast/comment"
|
34
34
|
require "rbs/writer"
|
35
|
+
require "rbs/prototype/helpers"
|
35
36
|
require "rbs/prototype/rbi"
|
36
37
|
require "rbs/prototype/rb"
|
37
38
|
require "rbs/prototype/runtime"
|
@@ -44,6 +45,7 @@ require "rbs/repository"
|
|
44
45
|
require "rbs/ancestor_graph"
|
45
46
|
require "rbs/locator"
|
46
47
|
require "rbs/type_alias_dependency"
|
48
|
+
require "rbs/type_alias_regularity"
|
47
49
|
require "rbs/collection"
|
48
50
|
|
49
51
|
require "rbs_extension"
|
data/schema/decls.json
CHANGED
@@ -12,6 +12,18 @@
|
|
12
12
|
"name": {
|
13
13
|
"type": "string"
|
14
14
|
},
|
15
|
+
"type_params": {
|
16
|
+
"type": "object",
|
17
|
+
"properties": {
|
18
|
+
"params": {
|
19
|
+
"type": "array",
|
20
|
+
"items": {
|
21
|
+
"$ref": "#/definitions/moduleTypeParam"
|
22
|
+
}
|
23
|
+
}
|
24
|
+
},
|
25
|
+
"required": ["params"]
|
26
|
+
},
|
15
27
|
"type": {
|
16
28
|
"$ref": "types.json"
|
17
29
|
},
|
@@ -28,7 +40,7 @@
|
|
28
40
|
"$ref": "comment.json"
|
29
41
|
}
|
30
42
|
},
|
31
|
-
"required": ["declaration", "name", "type", "annotations", "location", "comment"]
|
43
|
+
"required": ["declaration", "name", "type_params", "type", "annotations", "location", "comment"]
|
32
44
|
},
|
33
45
|
"constant": {
|
34
46
|
"title": "Constant declaration: `VERSION: String`, ...",
|
data/schema/types.json
CHANGED
@@ -106,7 +106,7 @@
|
|
106
106
|
"required": ["class", "name", "args", "location"]
|
107
107
|
},
|
108
108
|
"alias": {
|
109
|
-
"title": "Type alias: `u`, `ty`, `json`, ...",
|
109
|
+
"title": "Type alias: `u`, `ty`, `json`, `list[Integer]`, ...",
|
110
110
|
"type": "object",
|
111
111
|
"properties": {
|
112
112
|
"class": {
|
@@ -116,11 +116,17 @@
|
|
116
116
|
"name": {
|
117
117
|
"type": "string"
|
118
118
|
},
|
119
|
+
"args": {
|
120
|
+
"type": "array",
|
121
|
+
"items": {
|
122
|
+
"$ref": "#"
|
123
|
+
}
|
124
|
+
},
|
119
125
|
"location": {
|
120
126
|
"$ref": "location.json"
|
121
127
|
}
|
122
128
|
},
|
123
|
-
"required": ["class", "name", "location"]
|
129
|
+
"required": ["class", "name", "args", "location"]
|
124
130
|
},
|
125
131
|
"tuple": {
|
126
132
|
"title": "Tuple type: `[Foo, bar]`, ...",
|
data/sig/declarations.rbs
CHANGED
@@ -217,19 +217,22 @@ module RBS
|
|
217
217
|
end
|
218
218
|
|
219
219
|
class Alias < Base
|
220
|
-
# type loc = Location
|
221
|
-
# ^^^^
|
222
|
-
# ^^^
|
223
|
-
#
|
224
|
-
|
220
|
+
# type loc[T] = Location[T, bot]
|
221
|
+
# ^^^^ keyword
|
222
|
+
# ^^^ name
|
223
|
+
# ^^^ type_params
|
224
|
+
# ^ eq
|
225
|
+
#
|
226
|
+
type loc = Location[:keyword | :name | :eq, :type_params]
|
225
227
|
|
226
228
|
attr_reader name: TypeName
|
229
|
+
attr_reader type_params: ModuleTypeParams
|
227
230
|
attr_reader type: Types::t
|
228
231
|
attr_reader annotations: Array[Annotation]
|
229
232
|
attr_reader location: loc?
|
230
233
|
attr_reader comment: Comment?
|
231
234
|
|
232
|
-
def initialize: (name: TypeName, type: Types::t, annotations: Array[Annotation], location: loc?, comment: Comment?) -> void
|
235
|
+
def initialize: (name: TypeName, type_params: ModuleTypeParams, type: Types::t, annotations: Array[Annotation], location: loc?, comment: Comment?) -> void
|
233
236
|
|
234
237
|
include _HashEqual
|
235
238
|
include _ToJson
|
data/sig/definition_builder.rbs
CHANGED
@@ -43,8 +43,37 @@ module RBS
|
|
43
43
|
|
44
44
|
def define_methods: (Definition, interface_methods: Hash[Symbol, Definition::Method], methods: MethodBuilder::Methods, super_interface_method: bool) -> void
|
45
45
|
|
46
|
+
# Expand a type alias of given name without type arguments.
|
47
|
+
# Raises an error if the type alias requires arguments.
|
48
|
+
#
|
49
|
+
# Assume `type foo[T] = [T, T]`:
|
50
|
+
#
|
51
|
+
# ```
|
52
|
+
# expand_alias("::foo") # => error
|
53
|
+
# ```
|
54
|
+
#
|
46
55
|
def expand_alias: (TypeName) -> Types::t
|
47
56
|
|
57
|
+
# Expand a type alias of given name with arguments of `untyped`.
|
58
|
+
#
|
59
|
+
# Assume `type foo[T] = [T, T]`:
|
60
|
+
#
|
61
|
+
# ```
|
62
|
+
# expand_alias1("::foo") # => [untyped, untyped]
|
63
|
+
# ```
|
64
|
+
#
|
65
|
+
def expand_alias1: (TypeName) -> Types::t
|
66
|
+
|
67
|
+
# Expand a type alias of given name with `args`.
|
68
|
+
#
|
69
|
+
# Assume `type foo[T] = [T, T]`:
|
70
|
+
#
|
71
|
+
# ```
|
72
|
+
# expand_alias2("::foo", ["::Integer"]) # => [::Integer, ::Integer]
|
73
|
+
# ```
|
74
|
+
#
|
75
|
+
def expand_alias2: (TypeName, Array[Types::t] args) -> Types::t
|
76
|
+
|
48
77
|
def update: (env: Environment, ancestor_builder: AncestorBuilder, except: _Each[TypeName]) -> DefinitionBuilder
|
49
78
|
end
|
50
79
|
end
|
data/sig/environment_walker.rbs
CHANGED
@@ -1,4 +1,28 @@
|
|
1
1
|
module RBS
|
2
|
+
# EnvironmentWalker provides topological sort of class/module definitions.
|
3
|
+
#
|
4
|
+
# If a method, attribute, or ancestor in a class definition have a reference to another class, it is dependency.
|
5
|
+
#
|
6
|
+
# ```rb
|
7
|
+
# walker = EnvironmentWalker.new(env: env)
|
8
|
+
#
|
9
|
+
# walker.each_strongly_connected_component do |scc|
|
10
|
+
# # Yields an array of strongly connected components.
|
11
|
+
# end
|
12
|
+
# ```
|
13
|
+
#
|
14
|
+
# The `#only_ancestors!` method limits the dependency only to ancestors.
|
15
|
+
# Only super classes and included modules are dependencies with the option.
|
16
|
+
# This is useful to calculate the dependencies of class hierarchy.
|
17
|
+
#
|
18
|
+
# ```rb
|
19
|
+
# walker = EnvironmentWalker.new(env: env).only_ancestors!
|
20
|
+
#
|
21
|
+
# walker.each_strongly_connected_component do |scc|
|
22
|
+
# # Yields an array of strongly connected components.
|
23
|
+
# end
|
24
|
+
# ```
|
25
|
+
#
|
2
26
|
class EnvironmentWalker
|
3
27
|
class InstanceNode
|
4
28
|
attr_reader type_name: TypeName
|
@@ -32,6 +56,8 @@ module RBS
|
|
32
56
|
|
33
57
|
def tsort_each_child: (node) { (node) -> void } -> void
|
34
58
|
|
59
|
+
private
|
60
|
+
|
35
61
|
def each_type_name: (Types::t) { (TypeName) -> void } -> void
|
36
62
|
|
37
63
|
def each_type_node: (Types::t) { (node) -> void } -> void
|
data/sig/errors.rbs
CHANGED
@@ -220,4 +220,14 @@ module RBS
|
|
220
220
|
|
221
221
|
def name: () -> String
|
222
222
|
end
|
223
|
+
|
224
|
+
class NonregularTypeAliasError < LoadingError
|
225
|
+
# Diagnostic reported from `TypeAliasRegularity`.
|
226
|
+
attr_reader diagnostic: TypeAliasRegularity::Diagnostic
|
227
|
+
|
228
|
+
# Location of the definition.
|
229
|
+
attr_reader location: Location[untyped, untyped]?
|
230
|
+
|
231
|
+
def initialize: (diagnostic: TypeAliasRegularity::Diagnostic, location: Location[untyped, untyped]?) -> void
|
232
|
+
end
|
223
233
|
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
module RBS
|
2
|
+
# `TypeAliasRegularity` validates if a type alias is regular or not.
|
3
|
+
#
|
4
|
+
# Generic and recursive type alias cannot be polymorphic in their definitions.
|
5
|
+
#
|
6
|
+
# ```rbs
|
7
|
+
# type foo[T] = Integer
|
8
|
+
# | foo[T]? # Allowed. The type argument of `foo` doesn't change.
|
9
|
+
#
|
10
|
+
# type bar[T] = Integer
|
11
|
+
# | foo[T]
|
12
|
+
# | foo[Array[T]] # Allowed. There are two type arguments `T` and `Array[T]` of `foo`, but it's not definition of `foo`.
|
13
|
+
#
|
14
|
+
# type baz[T] = Integer
|
15
|
+
# | baz[Array[T]] # Error. Recursive definition of `baz` has different type argument from the definition.
|
16
|
+
# ```
|
17
|
+
#
|
18
|
+
# The `#nonregular?` method can be used to test if given type name is regular or not.
|
19
|
+
#
|
20
|
+
# ```rb
|
21
|
+
# validator = RBS::TypeAliasRegularity.validate(env: env)
|
22
|
+
#
|
23
|
+
# validator.nonregular?(TypeName("::foo")) # => nil
|
24
|
+
# validator.nonregular?(TypeName("::bar")) # => nil
|
25
|
+
# validator.nonregular?(TypeName("::baz")) # => TypeAliasRegularity::Diagnostic
|
26
|
+
# ```
|
27
|
+
#
|
28
|
+
# A special case is when the type argument is `untyped`.
|
29
|
+
#
|
30
|
+
# ```rbs
|
31
|
+
# type foo[T] = Integer | foo[untyped] # This is allowed.
|
32
|
+
# ```
|
33
|
+
#
|
34
|
+
class TypeAliasRegularity
|
35
|
+
attr_reader env: Environment
|
36
|
+
|
37
|
+
attr_reader builder: DefinitionBuilder
|
38
|
+
|
39
|
+
attr_reader diagnostics: Hash[TypeName, Diagnostic]
|
40
|
+
|
41
|
+
# `Diagnostic` represents an non-regular type alias declaration error.
|
42
|
+
# It consists of the name of the alias type and a type on which the nonregularity is detected.
|
43
|
+
#
|
44
|
+
# ```rbs
|
45
|
+
# type t[T] = Integer | t[T?]
|
46
|
+
# ```
|
47
|
+
#
|
48
|
+
# The type `t` is nonregular because it contains `t[T?]` on it's right hand side.
|
49
|
+
#
|
50
|
+
# ```
|
51
|
+
# diagnostic = validator.nonregular?(TypeName("::t"))
|
52
|
+
# diagnostic.type_name # => TypeName("::t")
|
53
|
+
# diagnostic.nonregular_type # => t[T?]
|
54
|
+
# ```
|
55
|
+
#
|
56
|
+
class Diagnostic
|
57
|
+
attr_reader type_name: TypeName
|
58
|
+
|
59
|
+
attr_reader nonregular_type: Types::Alias
|
60
|
+
|
61
|
+
def initialize: (type_name: TypeName, nonregular_type: Types::Alias) -> void
|
62
|
+
end
|
63
|
+
|
64
|
+
# Returns new instance which already run `#validate`.
|
65
|
+
#
|
66
|
+
def self.validate: (env: Environment) -> TypeAliasRegularity
|
67
|
+
|
68
|
+
def initialize: (env: Environment) -> void
|
69
|
+
|
70
|
+
# Returns `Diagnostic` instance if the alias type is nonregular.
|
71
|
+
# Regurns `nil` if the alias type is regular.
|
72
|
+
#
|
73
|
+
def nonregular?: (TypeName) -> Diagnostic?
|
74
|
+
|
75
|
+
def validate: () -> void
|
76
|
+
|
77
|
+
private
|
78
|
+
|
79
|
+
def validate_alias_type: (Types::Alias, Set[TypeName], Hash[TypeName, Types::Alias]) -> void
|
80
|
+
|
81
|
+
# Returns alias type for given type name, if the alias is generic.
|
82
|
+
# Returns nil if the type alias is not generic.
|
83
|
+
#
|
84
|
+
def build_alias_type: (TypeName) -> Types::Alias?
|
85
|
+
|
86
|
+
def compatible_args?: (Array[Types::t], Array[Types::t]) -> boolish
|
87
|
+
|
88
|
+
def each_alias_type: (Types::t) { (Types::Alias) -> void } -> void
|
89
|
+
|
90
|
+
def each_mutual_alias_defs: () { (Set[TypeName]) -> void } -> void
|
91
|
+
end
|
92
|
+
end
|
data/sig/types.rbs
CHANGED
@@ -227,18 +227,21 @@ module RBS
|
|
227
227
|
end
|
228
228
|
|
229
229
|
class Alias
|
230
|
-
|
230
|
+
# foo
|
231
|
+
# ^^^ => name
|
232
|
+
#
|
233
|
+
# foo[bar, baz]
|
234
|
+
# ^^^ => name
|
235
|
+
# ^^^^^^^^^^ => args
|
236
|
+
#
|
237
|
+
type loc = Location[:name, :args]
|
231
238
|
|
232
|
-
|
239
|
+
attr_reader location: loc?
|
233
240
|
|
234
|
-
def initialize: (name: TypeName, location: loc?) -> void
|
241
|
+
def initialize: (name: TypeName, args: Array[t], location: loc?) -> void
|
235
242
|
|
236
243
|
include _TypeBase
|
237
|
-
include
|
238
|
-
include NoSubst
|
239
|
-
include EmptyEachType
|
240
|
-
|
241
|
-
attr_reader location: loc?
|
244
|
+
include Application
|
242
245
|
end
|
243
246
|
|
244
247
|
class Tuple
|
data/sig/validator.rbs
CHANGED
@@ -1,8 +1,15 @@
|
|
1
1
|
module RBS
|
2
2
|
class Validator
|
3
3
|
attr_reader env: Environment
|
4
|
+
|
4
5
|
attr_reader resolver: TypeNameResolver
|
5
6
|
|
7
|
+
attr_reader definition_builder: DefinitionBuilder
|
8
|
+
|
9
|
+
attr_reader type_alias_dependency: TypeAliasDependency
|
10
|
+
|
11
|
+
attr_reader type_alias_regularity: TypeAliasRegularity
|
12
|
+
|
6
13
|
def initialize: (env: Environment, resolver: TypeNameResolver) -> void
|
7
14
|
|
8
15
|
def absolute_type: (Types::t, context: TypeNameResolver::context) { (Types::t) -> TypeName } -> Types::t
|
data/sig/variance_calculator.rbs
CHANGED
@@ -1,7 +1,47 @@
|
|
1
1
|
module RBS
|
2
|
+
# Calculate the use variances of type variables in declaration.
|
3
|
+
#
|
4
|
+
# ```rb
|
5
|
+
# calculator = VarianceCalculator.new(builder: builder)
|
6
|
+
#
|
7
|
+
# # Calculates variances in a method type
|
8
|
+
# result = calculator.in_method_type(method_type: method_type, variables: variables)
|
9
|
+
#
|
10
|
+
# # Calculates variances in a inheritance/mixin/...
|
11
|
+
# result = calculator.in_inherit(name: name, args: args, variables: variables)
|
12
|
+
#
|
13
|
+
# # Calculates variances in a type alias
|
14
|
+
# result = calculator.in_type_alias(name: name, args: args, variables: variables)
|
15
|
+
# ```
|
16
|
+
#
|
17
|
+
# See `RBS::VarianceCaluculator::Result` for information recorded in the `Result` object.
|
18
|
+
#
|
2
19
|
class VarianceCalculator
|
3
20
|
type variance = :unused | :covariant | :contravariant | :invariant
|
4
21
|
|
22
|
+
# Result contains the set of type variables and it's variance in a occurrence.
|
23
|
+
#
|
24
|
+
# ```rb
|
25
|
+
# # Enumerates recorded type variables
|
26
|
+
# result.each do |name, variance|
|
27
|
+
# # name is the name of a type variable
|
28
|
+
# # variance is one of :unused | :covariant | :contravariant | :invariant
|
29
|
+
# end
|
30
|
+
# ```
|
31
|
+
#
|
32
|
+
# You can test with `compatible?` method if the type variable occurrences are compatible with specified (annotated) variance.
|
33
|
+
#
|
34
|
+
# ```rb
|
35
|
+
# # When T is declared as `out T`
|
36
|
+
# result.compatible?(:T, with_annotation: :covariant)
|
37
|
+
#
|
38
|
+
# # When T is declared as `in T`
|
39
|
+
# result.compatible?(:T, with_annotation: :contravariant)
|
40
|
+
#
|
41
|
+
# # When T is declared as `T`
|
42
|
+
# result.compatible?(:T, with_annotation: :invariant)
|
43
|
+
# ```
|
44
|
+
#
|
5
45
|
class Result
|
6
46
|
attr_reader result: Hash[Symbol, variance]
|
7
47
|
|
@@ -18,6 +58,8 @@ module RBS
|
|
18
58
|
def include?: (Symbol) -> bool
|
19
59
|
|
20
60
|
def compatible?: (Symbol, with_annotation: variance) -> bool
|
61
|
+
|
62
|
+
def incompatible?: (AST::Declarations::ModuleTypeParams) -> Set[Symbol]?
|
21
63
|
end
|
22
64
|
|
23
65
|
attr_reader builder: DefinitionBuilder
|
@@ -30,6 +72,14 @@ module RBS
|
|
30
72
|
|
31
73
|
def in_inherit: (name: TypeName, args: Array[Types::t], variables: Array[Symbol]) -> Result
|
32
74
|
|
75
|
+
def in_type_alias: (name: TypeName) -> Result
|
76
|
+
|
77
|
+
private
|
78
|
+
|
33
79
|
def type: (Types::t, result: Result, context: variance) -> void
|
80
|
+
|
81
|
+
def function: (Types::Function, result: Result, context: variance) -> void
|
82
|
+
|
83
|
+
def negate: (variance) -> variance
|
34
84
|
end
|
35
85
|
end
|
@@ -885,3 +885,47 @@ BigDecimal::SIGN_POSITIVE_ZERO: Integer
|
|
885
885
|
# The version of bigdecimal library
|
886
886
|
#
|
887
887
|
BigDecimal::VERSION: String
|
888
|
+
|
889
|
+
module Kernel
|
890
|
+
private
|
891
|
+
|
892
|
+
# Create a new BigDecimal object.
|
893
|
+
#
|
894
|
+
# initial
|
895
|
+
# : The initial value, as an Integer, a Float, a Rational, a BigDecimal, or a
|
896
|
+
# String.
|
897
|
+
#
|
898
|
+
# If it is a String, spaces are ignored and unrecognized characters
|
899
|
+
# terminate the value.
|
900
|
+
#
|
901
|
+
# digits
|
902
|
+
# : The number of significant digits, as an Integer. If omitted or 0, the
|
903
|
+
# number of significant digits is determined from the initial value.
|
904
|
+
#
|
905
|
+
# The actual number of significant digits used in computation is usually
|
906
|
+
# larger than the specified number.
|
907
|
+
#
|
908
|
+
# exception
|
909
|
+
# : Whether an exception should be raised on invalid arguments. `true` by
|
910
|
+
# default, if passed `false`, just returns `nil` for invalid.
|
911
|
+
#
|
912
|
+
#
|
913
|
+
# #### Exceptions
|
914
|
+
#
|
915
|
+
# TypeError
|
916
|
+
# : If the `initial` type is neither Integer, Float, Rational, nor BigDecimal,
|
917
|
+
# this exception is raised.
|
918
|
+
#
|
919
|
+
# TypeError
|
920
|
+
# : If the `digits` is not an Integer, this exception is raised.
|
921
|
+
#
|
922
|
+
# ArgumentError
|
923
|
+
# : If `initial` is a Float, and the `digits` is larger than Float::DIG + 1,
|
924
|
+
# this exception is raised.
|
925
|
+
#
|
926
|
+
# ArgumentError
|
927
|
+
# : If the `initial` is a Float or Rational, and the `digits` value is
|
928
|
+
# omitted, this exception is raised.
|
929
|
+
#
|
930
|
+
def self?.BigDecimal: ((real | string | BigDecimal) initial, ?int digits, ?exception: bool) -> BigDecimal
|
931
|
+
end
|
data/stdlib/csv/0/csv.rbs
CHANGED
@@ -360,6 +360,49 @@ class CSV < Object
|
|
360
360
|
# output non-ASCII compatible data.
|
361
361
|
#
|
362
362
|
def self.generate: (?String str, **untyped options) { (CSV csv) -> void } -> String
|
363
|
+
|
364
|
+
# :call-seq:
|
365
|
+
# csv.each -> enumerator
|
366
|
+
# csv.each {|row| ...}
|
367
|
+
#
|
368
|
+
# Calls the block with each successive row.
|
369
|
+
# The data source must be opened for reading.
|
370
|
+
#
|
371
|
+
# Without headers:
|
372
|
+
# string = "foo,0\nbar,1\nbaz,2\n"
|
373
|
+
# csv = CSV.new(string)
|
374
|
+
# csv.each do |row|
|
375
|
+
# p row
|
376
|
+
# end
|
377
|
+
# Output:
|
378
|
+
# ["foo", "0"]
|
379
|
+
# ["bar", "1"]
|
380
|
+
# ["baz", "2"]
|
381
|
+
#
|
382
|
+
# With headers:
|
383
|
+
# string = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
|
384
|
+
# csv = CSV.new(string, headers: true)
|
385
|
+
# csv.each do |row|
|
386
|
+
# p row
|
387
|
+
# end
|
388
|
+
# Output:
|
389
|
+
# <CSV::Row "Name":"foo" "Value":"0">
|
390
|
+
# <CSV::Row "Name":"bar" "Value":"1">
|
391
|
+
# <CSV::Row "Name":"baz" "Value":"2">
|
392
|
+
#
|
393
|
+
# ---
|
394
|
+
#
|
395
|
+
# Raises an exception if the source is not opened for reading:
|
396
|
+
# string = "foo,0\nbar,1\nbaz,2\n"
|
397
|
+
# csv = CSV.new(string)
|
398
|
+
# csv.close
|
399
|
+
# # Raises IOError (not opened for reading)
|
400
|
+
# csv.each do |row|
|
401
|
+
# p row
|
402
|
+
# end
|
403
|
+
def each: () -> Enumerator[untyped, Integer]
|
404
|
+
| () { (untyped) -> void } -> Integer
|
405
|
+
|
363
406
|
end
|
364
407
|
|
365
408
|
# The options used when no overrides are given by calling code. They are:
|
@@ -408,7 +451,7 @@ CSV::VERSION: String
|
|
408
451
|
# processing is activated.
|
409
452
|
#
|
410
453
|
class CSV::Row < Object
|
411
|
-
include Enumerable[
|
454
|
+
include Enumerable[Array[String]]
|
412
455
|
extend Forwardable
|
413
456
|
|
414
457
|
# If a two-element Array is provided, it is assumed to be a header and field and
|
@@ -464,7 +507,8 @@ class CSV::Row < Object
|
|
464
507
|
#
|
465
508
|
# Support for Enumerable.
|
466
509
|
#
|
467
|
-
def each: ()
|
510
|
+
def each: () -> Enumerator[Array[String], self]
|
511
|
+
| () { (Array[String]) -> void } -> self
|
468
512
|
|
469
513
|
alias each_pair each
|
470
514
|
|
@@ -717,7 +761,9 @@ class CSV::Table[out Elem] < Object
|
|
717
761
|
#
|
718
762
|
# If no block is given, an Enumerator is returned.
|
719
763
|
#
|
720
|
-
def each: ()
|
764
|
+
def each: () -> Enumerator[untyped, self]
|
765
|
+
| () { (untyped) -> void } -> self
|
766
|
+
| () { (*untyped) -> void } -> self
|
721
767
|
|
722
768
|
def empty?: (*untyped args) { (*untyped) -> untyped } -> untyped
|
723
769
|
|