parlour 5.0.0.beta.6 → 5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +4 -0
- data/CHANGELOG.md +64 -32
- data/README.md +2 -0
- data/ci/check_rbi.sh +9 -0
- data/lib/parlour/rbi_generator/class_namespace.rb +4 -2
- data/lib/parlour/rbi_generator/enum_class_namespace.rb +4 -2
- data/lib/parlour/rbi_generator/module_namespace.rb +19 -7
- data/lib/parlour/rbi_generator/namespace.rb +29 -9
- data/lib/parlour/rbi_generator/parameter.rb +3 -3
- data/lib/parlour/rbi_generator/struct_class_namespace.rb +4 -2
- data/lib/parlour/rbi_generator/struct_prop.rb +2 -2
- data/lib/parlour/rbs_generator/method.rb +1 -1
- data/lib/parlour/type_parser.rb +12 -2
- data/lib/parlour/version.rb +1 -1
- data/rbi/parlour.rbi +31 -14
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cb1e682fc74b2ccd30ac9055caf652889e898e2632347bf6cf0898f218bd5562
|
4
|
+
data.tar.gz: fcca5ca04676cbeed657add051e344fd9b5fa0a7efc757339847310300aa4d42
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cef41723b922734b49f8377dc3b5c60cf0071d2a9723326299872fea4789f8e6ea1cb280fcd21161d48bd5dbb074b416e60668138116e56caf1c8334cce8e535
|
7
|
+
data.tar.gz: b9ea0db060c8789e1324460cde4a69b1c20b829920e660024f53834e48cef536b5423736e6fce4859c2e2fea5339e3f26bdd7513947bafcc82bd239db57cc68a
|
data/.travis.yml
CHANGED
@@ -3,6 +3,7 @@ dist: trusty
|
|
3
3
|
before_install:
|
4
4
|
- gem install bundler
|
5
5
|
- gem install yard
|
6
|
+
- chmod +x ci/check_rbi.sh
|
6
7
|
rvm:
|
7
8
|
- 2.3
|
8
9
|
- 2.4
|
@@ -13,6 +14,9 @@ rvm:
|
|
13
14
|
|
14
15
|
jobs:
|
15
16
|
include:
|
17
|
+
- stage: check RBI
|
18
|
+
script: ./ci/check_rbi.sh
|
19
|
+
rvm: 2.7
|
16
20
|
- stage: deploy documentation
|
17
21
|
script: yard
|
18
22
|
deploy:
|
data/CHANGELOG.md
CHANGED
@@ -3,42 +3,13 @@ All notable changes to this project will be documented in this file.
|
|
3
3
|
|
4
4
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
5
5
|
|
6
|
-
## [5.0.0
|
7
|
-
### Fixed
|
8
|
-
- Fixed collection types sometimes generating as `T::::Array`
|
9
|
-
|
10
|
-
## [5.0.0.beta.5] - 2020-10-03
|
11
|
-
### Added
|
12
|
-
- Added `Types::Generic` for user-defined generic types
|
13
|
-
|
14
|
-
## [5.0.0.beta.4] - 2020-09-22
|
15
|
-
### Added
|
16
|
-
- Added support for parsing type aliases from RBI
|
17
|
-
- Added conversion from RBI to RBS type aliases
|
18
|
-
|
19
|
-
## [5.0.0.beta.3] - 2020-09-15
|
20
|
-
### Changed
|
21
|
-
- Changed the RBS keyword warning to come from "RBS generation" rather than
|
22
|
-
"Type generalization"
|
23
|
-
- Added many more of RBS' keywords which are detected and prefixed with an
|
24
|
-
underscore to avoid syntax errors
|
25
|
-
|
26
|
-
## [5.0.0.beta.2] - 2020-09-14
|
27
|
-
### Added
|
28
|
-
- Added `Types::Type#describe` for simple text descriptions of types
|
29
|
-
- Added `Types::Self` for RBI's `T.self_type` or RBS' `self`
|
30
|
-
|
31
|
-
### Fixed
|
32
|
-
- Fixed `RbiGenerator::Namespace#create_method`'s `returns:` kwarg only
|
33
|
-
accepting String types
|
34
|
-
- Fixed lack of spacing between argument lists and blocks in RBS
|
35
|
-
- Fixed RBS attributes not having comments
|
36
|
-
|
37
|
-
## [5.0.0.beta.1] - 2020-09-13
|
6
|
+
## [5.0.0] - 2020-12-26
|
38
7
|
### Added
|
39
8
|
- Added RBS generation support! This includes:
|
40
9
|
- The new `RbsGenerator` class
|
41
10
|
- `RbsObject` and a set of subclasses representing different RBS components
|
11
|
+
- **Note:** RBS does not yet support Parlour plugins and some other features.
|
12
|
+
Refer to the README for a full breakdown!
|
42
13
|
- Added the `Types` module, which is used to describe types agnostic of the
|
43
14
|
underlying type system
|
44
15
|
- Added `RbiGenerator::Namespace#generalize_from_rbi!` to convert RBI string
|
@@ -50,6 +21,66 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|
50
21
|
- `TypedObject`, which `RbiObject` and `RbsObject` both inherit from
|
51
22
|
- `Generator`, which `RbiGenerator` and `RbsGenerator` both inherit from
|
52
23
|
- Added RBI type aliases
|
24
|
+
- Added `sealed!` for RBI namespaces
|
25
|
+
- Added `abstract!` for RBI modules
|
26
|
+
|
27
|
+
### Changed
|
28
|
+
- `Parlour::RbiGenerator::Options` is now `Parlour::Options`. An alias exists
|
29
|
+
for now, but **`Parlour::RbiGenerator::Options` is deprecated** and could be
|
30
|
+
removed in future versions.
|
31
|
+
- Updated README and gem metadata to refer to Parlour as a type information
|
32
|
+
generator, rather than just an RBI generator
|
33
|
+
|
34
|
+
<details>
|
35
|
+
<summary>5.0.0 pre-releases</summary>
|
36
|
+
|
37
|
+
## [5.0.0.beta.6] - 2020-10-04
|
38
|
+
### Fixed
|
39
|
+
- Fixed collection types sometimes generating as `T::::Array`
|
40
|
+
|
41
|
+
## [5.0.0.beta.5] - 2020-10-03
|
42
|
+
### Added
|
43
|
+
- Added `Types::Generic` for user-defined generic types
|
44
|
+
|
45
|
+
## [5.0.0.beta.4] - 2020-09-22
|
46
|
+
### Added
|
47
|
+
- Added support for parsing type aliases from RBI
|
48
|
+
- Added conversion from RBI to RBS type aliases
|
49
|
+
|
50
|
+
## [5.0.0.beta.3] - 2020-09-15
|
51
|
+
### Changed
|
52
|
+
- Changed the RBS keyword warning to come from "RBS generation" rather than
|
53
|
+
"Type generalization"
|
54
|
+
- Added many more of RBS' keywords which are detected and prefixed with an
|
55
|
+
underscore to avoid syntax errors
|
56
|
+
|
57
|
+
## [5.0.0.beta.2] - 2020-09-14
|
58
|
+
### Added
|
59
|
+
- Added `Types::Type#describe` for simple text descriptions of types
|
60
|
+
- Added `Types::Self` for RBI's `T.self_type` or RBS' `self`
|
61
|
+
|
62
|
+
### Fixed
|
63
|
+
- Fixed `RbiGenerator::Namespace#create_method`'s `returns:` kwarg only
|
64
|
+
accepting String types
|
65
|
+
- Fixed lack of spacing between argument lists and blocks in RBS
|
66
|
+
- Fixed RBS attributes not having comments
|
67
|
+
|
68
|
+
## [5.0.0.beta.1] - 2020-09-13
|
69
|
+
### Added
|
70
|
+
- Added RBS generation support! This includes:
|
71
|
+
- The new `RbsGenerator` class
|
72
|
+
- `RbsObject` and a set of subclasses representing different RBS components
|
73
|
+
- Added the `Types` module, which is used to describe types agnostic of the
|
74
|
+
underlying type system
|
75
|
+
- Added `RbiGenerator::Namespace#generalize_from_rbi!` to convert RBI string
|
76
|
+
types into `Types` types
|
77
|
+
- **Specifying types as strings is still currently supported, but may be
|
78
|
+
phased out in future, and should be avoided in new projects**.
|
79
|
+
- Added conversion from RBI to RBS type trees
|
80
|
+
- Added a couple of classes to deduplicate functionality between type systems:
|
81
|
+
- `TypedObject`, which `RbiObject` and `RbsObject` both inherit from
|
82
|
+
- `Generator`, which `RbiGenerator` and `RbsGenerator` both inherit from
|
83
|
+
- Added RBI type aliases
|
53
84
|
|
54
85
|
### Changed
|
55
86
|
- `Parlour::RbiGenerator::Options` is now `Parlour::Options`. An alias exists
|
@@ -57,6 +88,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|
57
88
|
removed in future versions.
|
58
89
|
- Updated README and gem metadata to refer to Parlour as a type information
|
59
90
|
generator, rather than just an RBI generator
|
91
|
+
</details>
|
60
92
|
|
61
93
|
## [4.0.1] - 2020-08-05
|
62
94
|
### Fixed
|
data/README.md
CHANGED
@@ -407,6 +407,8 @@ srb rbi gems
|
|
407
407
|
srb rbi sorbet-typed
|
408
408
|
```
|
409
409
|
|
410
|
+
You should also regenerate the parlour.rbi file by running `bundle exec parlour`. Don't edit this file manually, as your changes will be overwritten!
|
411
|
+
|
410
412
|
## License
|
411
413
|
|
412
414
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/ci/check_rbi.sh
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
# Checks that the RBI in rbi/parlour.rbi is up-to-date with committed changes.
|
3
|
+
# This is done by generating a new RBI and comparing it with the committed RBI.
|
4
|
+
set -ev
|
5
|
+
|
6
|
+
bundle install
|
7
|
+
mv rbi/parlour.rbi rbi/parlour-committed.rbi
|
8
|
+
bundle exec parlour
|
9
|
+
cmp -s rbi/parlour.rbi rbi/parlour-committed.rbi
|
@@ -10,6 +10,7 @@ module Parlour
|
|
10
10
|
generator: Generator,
|
11
11
|
name: String,
|
12
12
|
final: T::Boolean,
|
13
|
+
sealed: T::Boolean,
|
13
14
|
superclass: T.nilable(String),
|
14
15
|
abstract: T::Boolean,
|
15
16
|
block: T.nilable(T.proc.params(x: ClassNamespace).void)
|
@@ -21,13 +22,14 @@ module Parlour
|
|
21
22
|
# @param generator [RbiGenerator] The current RbiGenerator.
|
22
23
|
# @param name [String] The name of this class.
|
23
24
|
# @param final [Boolean] Whether this namespace is final.
|
25
|
+
# @param sealed [Boolean] Whether this namespace is sealed.
|
24
26
|
# @param superclass [String, nil] The superclass of this class, or nil if it doesn't
|
25
27
|
# have one.
|
26
28
|
# @param abstract [Boolean] A boolean indicating whether this class is abstract.
|
27
29
|
# @param block A block which the new instance yields itself to.
|
28
30
|
# @return [void]
|
29
|
-
def initialize(generator, name, final, superclass, abstract, &block)
|
30
|
-
super(generator, name, final, &block)
|
31
|
+
def initialize(generator, name, final, sealed, superclass, abstract, &block)
|
32
|
+
super(generator, name, final, sealed, &block)
|
31
33
|
@superclass = superclass
|
32
34
|
@abstract = abstract
|
33
35
|
end
|
@@ -10,6 +10,7 @@ module Parlour
|
|
10
10
|
generator: Generator,
|
11
11
|
name: String,
|
12
12
|
final: T::Boolean,
|
13
|
+
sealed: T::Boolean,
|
13
14
|
enums: T::Array[T.any([String, String], String)],
|
14
15
|
abstract: T::Boolean,
|
15
16
|
block: T.nilable(T.proc.params(x: EnumClassNamespace).void)
|
@@ -21,12 +22,13 @@ module Parlour
|
|
21
22
|
# @param generator [RbiGenerator] The current RbiGenerator.
|
22
23
|
# @param name [String] The name of this class.
|
23
24
|
# @param final [Boolean] Whether this namespace is final.
|
25
|
+
# @param sealed [Boolean] Whether this namespace is sealed.
|
24
26
|
# @param enums [Array<(String, String), String>] The values of the enumeration.
|
25
27
|
# @param abstract [Boolean] A boolean indicating whether this class is abstract.
|
26
28
|
# @param block A block which the new instance yields itself to.
|
27
29
|
# @return [void]
|
28
|
-
def initialize(generator, name, final, enums, abstract, &block)
|
29
|
-
super(generator, name, final, 'T::Enum', abstract, &block)
|
30
|
+
def initialize(generator, name, final, sealed, enums, abstract, &block)
|
31
|
+
super(generator, name, final, sealed, 'T::Enum', abstract, &block)
|
30
32
|
@enums = enums
|
31
33
|
end
|
32
34
|
|
@@ -10,24 +10,29 @@ module Parlour
|
|
10
10
|
generator: Generator,
|
11
11
|
name: String,
|
12
12
|
final: T::Boolean,
|
13
|
+
sealed: T::Boolean,
|
13
14
|
interface: T::Boolean,
|
15
|
+
abstract: T::Boolean,
|
14
16
|
block: T.nilable(T.proc.params(x: ClassNamespace).void)
|
15
17
|
).void
|
16
18
|
end
|
17
19
|
# Creates a new module definition.
|
18
20
|
# @note You should use {Namespace#create_module} rather than this directly.
|
19
|
-
#
|
21
|
+
#
|
20
22
|
# @param generator [RbiGenerator] The current RbiGenerator.
|
21
23
|
# @param name [String] The name of this module.
|
22
24
|
# @param final [Boolean] Whether this namespace is final.
|
25
|
+
# @param sealed [Boolean] Whether this namespace is sealed.
|
23
26
|
# @param interface [Boolean] A boolean indicating whether this module is an
|
24
27
|
# interface.
|
28
|
+
# @param abstract [Boolean] A boolean indicating whether this module is abstract.
|
25
29
|
# @param block A block which the new instance yields itself to.
|
26
30
|
# @return [void]
|
27
|
-
def initialize(generator, name, final, interface, &block)
|
28
|
-
super(generator, name, final, &block)
|
31
|
+
def initialize(generator, name, final, sealed, interface, abstract, &block)
|
32
|
+
super(generator, name, final, sealed, &block)
|
29
33
|
@name = name
|
30
34
|
@interface = interface
|
35
|
+
@abstract = abstract
|
31
36
|
end
|
32
37
|
|
33
38
|
sig do
|
@@ -41,10 +46,11 @@ module Parlour
|
|
41
46
|
# @param indent_level [Integer] The indentation level to generate the lines at.
|
42
47
|
# @param options [Options] The formatting options to use.
|
43
48
|
# @return [Array<String>] The RBI lines, formatted as specified.
|
44
|
-
def generate_rbi(indent_level, options)
|
49
|
+
def generate_rbi(indent_level, options)
|
45
50
|
lines = generate_comments(indent_level, options)
|
46
51
|
lines << options.indented(indent_level, "module #{name}")
|
47
52
|
lines += [options.indented(indent_level + 1, "interface!"), ""] if interface
|
53
|
+
lines += [options.indented(indent_level + 1, "abstract!"), ""] if abstract
|
48
54
|
lines += generate_body(indent_level + 1, options)
|
49
55
|
lines << options.indented(indent_level, "end")
|
50
56
|
end
|
@@ -54,6 +60,11 @@ module Parlour
|
|
54
60
|
# @return [Boolean]
|
55
61
|
attr_reader :interface
|
56
62
|
|
63
|
+
sig { returns(T::Boolean) }
|
64
|
+
# A boolean indicating whether this module is abstract or not.
|
65
|
+
# @return [Boolean]
|
66
|
+
attr_reader :abstract
|
67
|
+
|
57
68
|
sig do
|
58
69
|
override.params(
|
59
70
|
others: T::Array[RbiGenerator::RbiObject]
|
@@ -61,7 +72,7 @@ module Parlour
|
|
61
72
|
end
|
62
73
|
# Given an array of {Namespace} instances, returns true if they may
|
63
74
|
# be merged into this instance using {merge_into_self}. For instances to
|
64
|
-
# be mergeable, they must either all be interfaces or all not be
|
75
|
+
# be mergeable, they must either all be interfaces or all not be
|
65
76
|
# interfaces.
|
66
77
|
#
|
67
78
|
# @param others [Array<RbiGenerator::RbiObject>] An array of other {Namespace} instances.
|
@@ -75,7 +86,7 @@ module Parlour
|
|
75
86
|
all_modules.map(&:interface).uniq.length == 1
|
76
87
|
end
|
77
88
|
|
78
|
-
sig do
|
89
|
+
sig do
|
79
90
|
override.params(
|
80
91
|
others: T::Array[RbiGenerator::RbiObject]
|
81
92
|
).void
|
@@ -93,7 +104,8 @@ module Parlour
|
|
93
104
|
# Returns a human-readable brief string description of this module.
|
94
105
|
# @return [String]
|
95
106
|
def describe
|
96
|
-
"Module #{name} - #{"interface, " if interface}
|
107
|
+
"Module #{name} - #{"interface, " if interface}" +
|
108
|
+
"#{"abstract, " if abstract}#{children.length} " +
|
97
109
|
"children, #{includes.length} includes, #{extends.length} extends"
|
98
110
|
end
|
99
111
|
|
@@ -27,6 +27,7 @@ module Parlour
|
|
27
27
|
generator: Generator,
|
28
28
|
name: T.nilable(String),
|
29
29
|
final: T::Boolean,
|
30
|
+
sealed: T::Boolean,
|
30
31
|
block: T.nilable(T.proc.params(x: Namespace).void)
|
31
32
|
).void
|
32
33
|
end
|
@@ -37,13 +38,15 @@ module Parlour
|
|
37
38
|
# @param generator [RbiGenerator] The current RbiGenerator.
|
38
39
|
# @param name [String, nil] The name of this module.
|
39
40
|
# @param final [Boolean] Whether this namespace is final.
|
41
|
+
# @param final [Boolean] Whether this namespace is sealed.
|
40
42
|
# @param block A block which the new instance yields itself to.
|
41
43
|
# @return [void]
|
42
|
-
def initialize(generator, name = nil, final = false, &block)
|
44
|
+
def initialize(generator, name = nil, final = false, sealed = false, &block)
|
43
45
|
super(generator, name || '<anonymous namespace>')
|
44
46
|
@children = []
|
45
47
|
@next_comments = []
|
46
48
|
@final = final
|
49
|
+
@sealed = sealed
|
47
50
|
yield_self(&block) if block
|
48
51
|
end
|
49
52
|
|
@@ -52,6 +55,11 @@ module Parlour
|
|
52
55
|
# @return [Boolean]
|
53
56
|
attr_reader :final
|
54
57
|
|
58
|
+
sig { returns(T::Boolean) }
|
59
|
+
# Whether this namespace is sealed.
|
60
|
+
# @return [Boolean]
|
61
|
+
attr_reader :sealed
|
62
|
+
|
55
63
|
sig { returns(T::Array[RbiObject]) }
|
56
64
|
# The child {RbiObject} instances inside this namespace.
|
57
65
|
# @return [Array<RbiObject>]
|
@@ -151,6 +159,7 @@ module Parlour
|
|
151
159
|
params(
|
152
160
|
name: String,
|
153
161
|
final: T::Boolean,
|
162
|
+
sealed: T::Boolean,
|
154
163
|
superclass: T.nilable(String),
|
155
164
|
abstract: T::Boolean,
|
156
165
|
block: T.nilable(T.proc.params(x: ClassNamespace).void)
|
@@ -168,13 +177,14 @@ module Parlour
|
|
168
177
|
#
|
169
178
|
# @param name [String] The name of this class.
|
170
179
|
# @param final [Boolean] Whether this namespace is final.
|
180
|
+
# @param sealed [Boolean] Whether this namespace is sealed.
|
171
181
|
# @param superclass [String, nil] The superclass of this class, or nil if it doesn't
|
172
182
|
# have one.
|
173
183
|
# @param abstract [Boolean] A boolean indicating whether this class is abstract.
|
174
184
|
# @param block A block which the new instance yields itself to.
|
175
185
|
# @return [ClassNamespace]
|
176
|
-
def create_class(name, final: false, superclass: nil, abstract: false, &block)
|
177
|
-
new_class = ClassNamespace.new(generator, name, final, superclass, abstract, &block)
|
186
|
+
def create_class(name, final: false, sealed: false, superclass: nil, abstract: false, &block)
|
187
|
+
new_class = ClassNamespace.new(generator, name, final, sealed, superclass, abstract, &block)
|
178
188
|
move_next_comments(new_class)
|
179
189
|
children << new_class
|
180
190
|
new_class
|
@@ -184,6 +194,7 @@ module Parlour
|
|
184
194
|
params(
|
185
195
|
name: String,
|
186
196
|
final: T::Boolean,
|
197
|
+
sealed: T::Boolean,
|
187
198
|
enums: T.nilable(T::Array[T.any([String, String], String)]),
|
188
199
|
abstract: T::Boolean,
|
189
200
|
block: T.nilable(T.proc.params(x: EnumClassNamespace).void)
|
@@ -196,12 +207,13 @@ module Parlour
|
|
196
207
|
#
|
197
208
|
# @param name [String] The name of this class.
|
198
209
|
# @param final [Boolean] Whether this namespace is final.
|
210
|
+
# @param sealed [Boolean] Whether this namespace is sealed.
|
199
211
|
# @param enums [Array<(String, String), String>] The values of the enumeration.
|
200
212
|
# @param abstract [Boolean] A boolean indicating whether this class is abstract.
|
201
213
|
# @param block A block which the new instance yields itself to.
|
202
214
|
# @return [EnumClassNamespace]
|
203
|
-
def create_enum_class(name, final: false, enums: nil, abstract: false, &block)
|
204
|
-
new_enum_class = EnumClassNamespace.new(generator, name, final, enums || [], abstract, &block)
|
215
|
+
def create_enum_class(name, final: false, sealed: false, enums: nil, abstract: false, &block)
|
216
|
+
new_enum_class = EnumClassNamespace.new(generator, name, final, sealed, enums || [], abstract, &block)
|
205
217
|
move_next_comments(new_enum_class)
|
206
218
|
children << new_enum_class
|
207
219
|
new_enum_class
|
@@ -211,6 +223,7 @@ module Parlour
|
|
211
223
|
params(
|
212
224
|
name: String,
|
213
225
|
final: T::Boolean,
|
226
|
+
sealed: T::Boolean,
|
214
227
|
props: T.nilable(T::Array[StructProp]),
|
215
228
|
abstract: T::Boolean,
|
216
229
|
block: T.nilable(T.proc.params(x: StructClassNamespace).void)
|
@@ -225,12 +238,13 @@ module Parlour
|
|
225
238
|
#
|
226
239
|
# @param name [String] The name of this class.
|
227
240
|
# @param final [Boolean] Whether this namespace is final.
|
241
|
+
# @param sealed [Boolean] Whether this namespace is sealed.
|
228
242
|
# @param props [Array<StructProp>] The props of the struct.
|
229
243
|
# @param abstract [Boolean] A boolean indicating whether this class is abstract.
|
230
244
|
# @param block A block which the new instance yields itself to.
|
231
245
|
# @return [EnumClassNamespace]
|
232
|
-
def create_struct_class(name, final: false, props: nil, abstract: false, &block)
|
233
|
-
new_struct_class = StructClassNamespace.new(generator, name, final, props || [], abstract, &block)
|
246
|
+
def create_struct_class(name, final: false, sealed: false, props: nil, abstract: false, &block)
|
247
|
+
new_struct_class = StructClassNamespace.new(generator, name, final, sealed, props || [], abstract, &block)
|
234
248
|
move_next_comments(new_struct_class)
|
235
249
|
children << new_struct_class
|
236
250
|
new_struct_class
|
@@ -240,7 +254,9 @@ module Parlour
|
|
240
254
|
params(
|
241
255
|
name: String,
|
242
256
|
final: T::Boolean,
|
257
|
+
sealed: T::Boolean,
|
243
258
|
interface: T::Boolean,
|
259
|
+
abstract: T::Boolean,
|
244
260
|
block: T.nilable(T.proc.params(x: ClassNamespace).void)
|
245
261
|
).returns(ModuleNamespace)
|
246
262
|
end
|
@@ -256,12 +272,15 @@ module Parlour
|
|
256
272
|
#
|
257
273
|
# @param name [String] The name of this module.
|
258
274
|
# @param final [Boolean] Whether this namespace is final.
|
275
|
+
# @param sealed [Boolean] Whether this namespace is sealed.
|
259
276
|
# @param interface [Boolean] A boolean indicating whether this module is an
|
260
277
|
# interface.
|
278
|
+
# @param abstract [Boolean] A boolean indicating whether this module is
|
279
|
+
# abstract.
|
261
280
|
# @param block A block which the new instance yields itself to.
|
262
281
|
# @return [ModuleNamespace]
|
263
|
-
def create_module(name, final: false, interface: false, &block)
|
264
|
-
new_module = ModuleNamespace.new(generator, name, final, interface, &block)
|
282
|
+
def create_module(name, final: false, sealed: false, interface: false, abstract: false, &block)
|
283
|
+
new_module = ModuleNamespace.new(generator, name, final, sealed, interface, abstract, &block)
|
265
284
|
move_next_comments(new_module)
|
266
285
|
children << new_module
|
267
286
|
new_module
|
@@ -657,6 +676,7 @@ module Parlour
|
|
657
676
|
result = []
|
658
677
|
|
659
678
|
result += [options.indented(indent_level, 'final!'), ''] if final
|
679
|
+
result += [options.indented(indent_level, 'sealed!'), ''] if sealed
|
660
680
|
|
661
681
|
# Split away the eigen constants; these need to be put in a
|
662
682
|
# "class << self" block later
|
@@ -39,7 +39,7 @@ module Parlour
|
|
39
39
|
@name = name
|
40
40
|
|
41
41
|
prefix = /^(\*\*|\*|\&)?/.match(name)&.captures&.first || ''
|
42
|
-
@kind = PREFIXES.rassoc(prefix).first
|
42
|
+
@kind = T.must(PREFIXES.rassoc(prefix)).first
|
43
43
|
|
44
44
|
@kind = :keyword if kind == :normal && name.end_with?(':')
|
45
45
|
|
@@ -123,12 +123,12 @@ module Parlour
|
|
123
123
|
end
|
124
124
|
|
125
125
|
# A mapping of {kind} values to the characteristic prefixes each kind has.
|
126
|
-
PREFIXES = {
|
126
|
+
PREFIXES = T.let({
|
127
127
|
normal: '',
|
128
128
|
splat: '*',
|
129
129
|
double_splat: '**',
|
130
130
|
block: '&'
|
131
|
-
}.freeze
|
131
|
+
}.freeze, T::Hash[Symbol, String])
|
132
132
|
|
133
133
|
sig { void }
|
134
134
|
def generalize_from_rbi!
|
@@ -11,6 +11,7 @@ module Parlour
|
|
11
11
|
generator: Generator,
|
12
12
|
name: String,
|
13
13
|
final: T::Boolean,
|
14
|
+
sealed: T::Boolean,
|
14
15
|
props: T::Array[StructProp],
|
15
16
|
abstract: T::Boolean,
|
16
17
|
block: T.nilable(T.proc.params(x: StructClassNamespace).void)
|
@@ -22,12 +23,13 @@ module Parlour
|
|
22
23
|
# @param generator [RbiGenerator] The current RbiGenerator.
|
23
24
|
# @param name [String] The name of this class.
|
24
25
|
# @param final [Boolean] Whether this namespace is final.
|
26
|
+
# @param sealed [Boolean] Whether this namespace is sealed.
|
25
27
|
# @param props [Array<StructProp>] The props of the struct.
|
26
28
|
# @param abstract [Boolean] A boolean indicating whether this class is abstract.
|
27
29
|
# @param block A block which the new instance yields itself to.
|
28
30
|
# @return [void]
|
29
|
-
def initialize(generator, name, final, props, abstract, &block)
|
30
|
-
super(generator, name, final, 'T::Struct', abstract, &block)
|
31
|
+
def initialize(generator, name, final, sealed, props, abstract, &block)
|
32
|
+
super(generator, name, final, sealed, 'T::Struct', abstract, &block)
|
31
33
|
@props = props
|
32
34
|
end
|
33
35
|
|
@@ -112,9 +112,9 @@ module Parlour
|
|
112
112
|
attr_reader :redaction
|
113
113
|
|
114
114
|
# The optional properties available on instances of this class.
|
115
|
-
EXTRA_PROPERTIES = %i{
|
115
|
+
EXTRA_PROPERTIES = T.let(%i{
|
116
116
|
optional enum dont_store foreign default factory immutable array override redaction
|
117
|
-
}
|
117
|
+
}, T::Array[Symbol])
|
118
118
|
|
119
119
|
sig { returns(String) }
|
120
120
|
# Returns the +prop+ call required to create this property.
|
@@ -89,7 +89,7 @@ module Parlour
|
|
89
89
|
|
90
90
|
# Merge the first signature line, and indent & concat the rest
|
91
91
|
first_line, *rest_lines = *partial_sig_lines
|
92
|
-
this_sig_lines[0]
|
92
|
+
this_sig_lines[0] = T.unsafe(this_sig_lines[0]) + first_line
|
93
93
|
rest_lines&.each do |line|
|
94
94
|
this_sig_lines << ' ' * definition.length + options.indented(indent_level, line)
|
95
95
|
end
|
data/lib/parlour/type_parser.rb
CHANGED
@@ -158,6 +158,7 @@ module Parlour
|
|
158
158
|
|
159
159
|
name, superclass, body = *node
|
160
160
|
final = body_has_modifier?(body, :final!)
|
161
|
+
sealed = body_has_modifier?(body, :sealed!)
|
161
162
|
abstract = body_has_modifier?(body, :abstract!)
|
162
163
|
includes, extends = body ? body_includes_and_extends(body) : [[], []]
|
163
164
|
|
@@ -170,6 +171,7 @@ module Parlour
|
|
170
171
|
generator,
|
171
172
|
n.to_s,
|
172
173
|
false,
|
174
|
+
false,
|
173
175
|
)
|
174
176
|
target.children << new_obj if target
|
175
177
|
target = new_obj
|
@@ -233,6 +235,7 @@ module Parlour
|
|
233
235
|
generator,
|
234
236
|
this_name.to_s,
|
235
237
|
final,
|
238
|
+
sealed,
|
236
239
|
props,
|
237
240
|
abstract,
|
238
241
|
)
|
@@ -256,6 +259,7 @@ module Parlour
|
|
256
259
|
generator,
|
257
260
|
this_name.to_s,
|
258
261
|
final,
|
262
|
+
sealed,
|
259
263
|
enums,
|
260
264
|
abstract,
|
261
265
|
)
|
@@ -264,6 +268,7 @@ module Parlour
|
|
264
268
|
generator,
|
265
269
|
this_name.to_s,
|
266
270
|
final,
|
271
|
+
sealed,
|
267
272
|
node_to_s(superclass),
|
268
273
|
abstract,
|
269
274
|
)
|
@@ -275,7 +280,7 @@ module Parlour
|
|
275
280
|
|
276
281
|
if target
|
277
282
|
target.children << final_obj
|
278
|
-
[top_level]
|
283
|
+
[T.must(top_level)]
|
279
284
|
else
|
280
285
|
[final_obj]
|
281
286
|
end
|
@@ -283,7 +288,9 @@ module Parlour
|
|
283
288
|
parse_err 'cannot declare modules in an eigenclass', node if is_within_eigenclass
|
284
289
|
|
285
290
|
name, body = *node
|
291
|
+
abstract = body_has_modifier?(body, :abstract!)
|
286
292
|
final = body_has_modifier?(body, :final!)
|
293
|
+
sealed = body_has_modifier?(body, :sealed!)
|
287
294
|
interface = body_has_modifier?(body, :interface!)
|
288
295
|
includes, extends = body ? body_includes_and_extends(body) : [[], []]
|
289
296
|
|
@@ -296,6 +303,7 @@ module Parlour
|
|
296
303
|
generator,
|
297
304
|
n.to_s,
|
298
305
|
false,
|
306
|
+
false,
|
299
307
|
)
|
300
308
|
target.children << new_obj if target
|
301
309
|
target = new_obj
|
@@ -306,7 +314,9 @@ module Parlour
|
|
306
314
|
generator,
|
307
315
|
this_name.to_s,
|
308
316
|
final,
|
317
|
+
sealed,
|
309
318
|
interface,
|
319
|
+
abstract,
|
310
320
|
) do |m|
|
311
321
|
m.children.concat(parse_path_to_object(path.child(1))) if body
|
312
322
|
m.create_includes(includes)
|
@@ -315,7 +325,7 @@ module Parlour
|
|
315
325
|
|
316
326
|
if target
|
317
327
|
target.children << final_obj
|
318
|
-
[top_level]
|
328
|
+
[T.must(top_level)]
|
319
329
|
else
|
320
330
|
[final_obj]
|
321
331
|
end
|
data/lib/parlour/version.rb
CHANGED
data/rbi/parlour.rbi
CHANGED
@@ -3,7 +3,7 @@ module Kernel
|
|
3
3
|
end
|
4
4
|
|
5
5
|
module Parlour
|
6
|
-
VERSION = '5.0.0
|
6
|
+
VERSION = '5.0.0'
|
7
7
|
|
8
8
|
class ConflictResolver
|
9
9
|
extend T::Sig
|
@@ -772,12 +772,13 @@ module Parlour
|
|
772
772
|
generator: Generator,
|
773
773
|
name: String,
|
774
774
|
final: T::Boolean,
|
775
|
+
sealed: T::Boolean,
|
775
776
|
superclass: T.nilable(String),
|
776
777
|
abstract: T::Boolean,
|
777
778
|
block: T.nilable(T.proc.params(x: ClassNamespace).void)
|
778
779
|
).void
|
779
780
|
end
|
780
|
-
def initialize(generator, name, final, superclass, abstract, &block); end
|
781
|
+
def initialize(generator, name, final, sealed, superclass, abstract, &block); end
|
781
782
|
|
782
783
|
sig { override.params(indent_level: Integer, options: Options).returns(T::Array[String]) }
|
783
784
|
def generate_rbi(indent_level, options); end
|
@@ -846,12 +847,13 @@ module Parlour
|
|
846
847
|
generator: Generator,
|
847
848
|
name: String,
|
848
849
|
final: T::Boolean,
|
850
|
+
sealed: T::Boolean,
|
849
851
|
enums: T::Array[T.any([String, String], String)],
|
850
852
|
abstract: T::Boolean,
|
851
853
|
block: T.nilable(T.proc.params(x: EnumClassNamespace).void)
|
852
854
|
).void
|
853
855
|
end
|
854
|
-
def initialize(generator, name, final, enums, abstract, &block); end
|
856
|
+
def initialize(generator, name, final, sealed, enums, abstract, &block); end
|
855
857
|
|
856
858
|
sig { returns(T::Array[T.any([String, String], String)]) }
|
857
859
|
attr_reader :enums
|
@@ -996,11 +998,13 @@ module Parlour
|
|
996
998
|
generator: Generator,
|
997
999
|
name: String,
|
998
1000
|
final: T::Boolean,
|
1001
|
+
sealed: T::Boolean,
|
999
1002
|
interface: T::Boolean,
|
1003
|
+
abstract: T::Boolean,
|
1000
1004
|
block: T.nilable(T.proc.params(x: ClassNamespace).void)
|
1001
1005
|
).void
|
1002
1006
|
end
|
1003
|
-
def initialize(generator, name, final, interface, &block); end
|
1007
|
+
def initialize(generator, name, final, sealed, interface, abstract, &block); end
|
1004
1008
|
|
1005
1009
|
sig { override.params(indent_level: Integer, options: Options).returns(T::Array[String]) }
|
1006
1010
|
def generate_rbi(indent_level, options); end
|
@@ -1008,6 +1012,9 @@ module Parlour
|
|
1008
1012
|
sig { returns(T::Boolean) }
|
1009
1013
|
attr_reader :interface
|
1010
1014
|
|
1015
|
+
sig { returns(T::Boolean) }
|
1016
|
+
attr_reader :abstract
|
1017
|
+
|
1011
1018
|
sig { override.params(others: T::Array[RbiGenerator::RbiObject]).returns(T::Boolean) }
|
1012
1019
|
def mergeable?(others); end
|
1013
1020
|
|
@@ -1032,14 +1039,18 @@ module Parlour
|
|
1032
1039
|
generator: Generator,
|
1033
1040
|
name: T.nilable(String),
|
1034
1041
|
final: T::Boolean,
|
1042
|
+
sealed: T::Boolean,
|
1035
1043
|
block: T.nilable(T.proc.params(x: Namespace).void)
|
1036
1044
|
).void
|
1037
1045
|
end
|
1038
|
-
def initialize(generator, name = nil, final = false, &block); end
|
1046
|
+
def initialize(generator, name = nil, final = false, sealed = false, &block); end
|
1039
1047
|
|
1040
1048
|
sig { returns(T::Boolean) }
|
1041
1049
|
attr_reader :final
|
1042
1050
|
|
1051
|
+
sig { returns(T::Boolean) }
|
1052
|
+
attr_reader :sealed
|
1053
|
+
|
1043
1054
|
sig { returns(T::Array[RbiObject]) }
|
1044
1055
|
attr_reader :children
|
1045
1056
|
|
@@ -1065,44 +1076,49 @@ module Parlour
|
|
1065
1076
|
params(
|
1066
1077
|
name: String,
|
1067
1078
|
final: T::Boolean,
|
1079
|
+
sealed: T::Boolean,
|
1068
1080
|
superclass: T.nilable(String),
|
1069
1081
|
abstract: T::Boolean,
|
1070
1082
|
block: T.nilable(T.proc.params(x: ClassNamespace).void)
|
1071
1083
|
).returns(ClassNamespace)
|
1072
1084
|
end
|
1073
|
-
def create_class(name, final: false, superclass: nil, abstract: false, &block); end
|
1085
|
+
def create_class(name, final: false, sealed: false, superclass: nil, abstract: false, &block); end
|
1074
1086
|
|
1075
1087
|
sig do
|
1076
1088
|
params(
|
1077
1089
|
name: String,
|
1078
1090
|
final: T::Boolean,
|
1091
|
+
sealed: T::Boolean,
|
1079
1092
|
enums: T.nilable(T::Array[T.any([String, String], String)]),
|
1080
1093
|
abstract: T::Boolean,
|
1081
1094
|
block: T.nilable(T.proc.params(x: EnumClassNamespace).void)
|
1082
1095
|
).returns(EnumClassNamespace)
|
1083
1096
|
end
|
1084
|
-
def create_enum_class(name, final: false, enums: nil, abstract: false, &block); end
|
1097
|
+
def create_enum_class(name, final: false, sealed: false, enums: nil, abstract: false, &block); end
|
1085
1098
|
|
1086
1099
|
sig do
|
1087
1100
|
params(
|
1088
1101
|
name: String,
|
1089
1102
|
final: T::Boolean,
|
1103
|
+
sealed: T::Boolean,
|
1090
1104
|
props: T.nilable(T::Array[StructProp]),
|
1091
1105
|
abstract: T::Boolean,
|
1092
1106
|
block: T.nilable(T.proc.params(x: StructClassNamespace).void)
|
1093
1107
|
).returns(StructClassNamespace)
|
1094
1108
|
end
|
1095
|
-
def create_struct_class(name, final: false, props: nil, abstract: false, &block); end
|
1109
|
+
def create_struct_class(name, final: false, sealed: false, props: nil, abstract: false, &block); end
|
1096
1110
|
|
1097
1111
|
sig do
|
1098
1112
|
params(
|
1099
1113
|
name: String,
|
1100
1114
|
final: T::Boolean,
|
1115
|
+
sealed: T::Boolean,
|
1101
1116
|
interface: T::Boolean,
|
1117
|
+
abstract: T::Boolean,
|
1102
1118
|
block: T.nilable(T.proc.params(x: ClassNamespace).void)
|
1103
1119
|
).returns(ModuleNamespace)
|
1104
1120
|
end
|
1105
|
-
def create_module(name, final: false, interface: false, &block); end
|
1121
|
+
def create_module(name, final: false, sealed: false, interface: false, abstract: false, &block); end
|
1106
1122
|
|
1107
1123
|
sig do
|
1108
1124
|
params(
|
@@ -1212,12 +1228,12 @@ module Parlour
|
|
1212
1228
|
|
1213
1229
|
class Parameter
|
1214
1230
|
extend T::Sig
|
1215
|
-
PREFIXES = {
|
1231
|
+
PREFIXES = T.let({
|
1216
1232
|
normal: '',
|
1217
1233
|
splat: '*',
|
1218
1234
|
double_splat: '**',
|
1219
1235
|
block: '&'
|
1220
|
-
}.freeze
|
1236
|
+
}.freeze, T::Hash[Symbol, String])
|
1221
1237
|
|
1222
1238
|
sig { params(name: String, type: T.nilable(Types::TypeLike), default: T.nilable(String)).void }
|
1223
1239
|
def initialize(name, type: nil, default: nil); end
|
@@ -1283,12 +1299,13 @@ module Parlour
|
|
1283
1299
|
generator: Generator,
|
1284
1300
|
name: String,
|
1285
1301
|
final: T::Boolean,
|
1302
|
+
sealed: T::Boolean,
|
1286
1303
|
props: T::Array[StructProp],
|
1287
1304
|
abstract: T::Boolean,
|
1288
1305
|
block: T.nilable(T.proc.params(x: StructClassNamespace).void)
|
1289
1306
|
).void
|
1290
1307
|
end
|
1291
|
-
def initialize(generator, name, final, props, abstract, &block); end
|
1308
|
+
def initialize(generator, name, final, sealed, props, abstract, &block); end
|
1292
1309
|
|
1293
1310
|
sig { returns(T::Array[StructProp]) }
|
1294
1311
|
attr_reader :props
|
@@ -1308,9 +1325,9 @@ module Parlour
|
|
1308
1325
|
|
1309
1326
|
class StructProp
|
1310
1327
|
extend T::Sig
|
1311
|
-
EXTRA_PROPERTIES = %i{
|
1328
|
+
EXTRA_PROPERTIES = T.let(%i{
|
1312
1329
|
optional enum dont_store foreign default factory immutable array override redaction
|
1313
|
-
}
|
1330
|
+
}, T::Array[Symbol])
|
1314
1331
|
|
1315
1332
|
sig do
|
1316
1333
|
params(
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: parlour
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.0.0
|
4
|
+
version: 5.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aaron Christiansen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-12-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sorbet-runtime
|
@@ -156,6 +156,7 @@ files:
|
|
156
156
|
- LICENSE.txt
|
157
157
|
- README.md
|
158
158
|
- Rakefile
|
159
|
+
- ci/check_rbi.sh
|
159
160
|
- exe/parlour
|
160
161
|
- lib/parlour.rb
|
161
162
|
- lib/parlour/conflict_resolver.rb
|
@@ -224,9 +225,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
224
225
|
version: '0'
|
225
226
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
226
227
|
requirements:
|
227
|
-
- - "
|
228
|
+
- - ">="
|
228
229
|
- !ruby/object:Gem::Version
|
229
|
-
version:
|
230
|
+
version: '0'
|
230
231
|
requirements: []
|
231
232
|
rubygems_version: 3.0.3
|
232
233
|
signing_key:
|