parlour 5.0.0 → 7.0.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/.github/workflows/ruby.yml +46 -0
- data/.parlour +4 -2
- data/CHANGELOG.md +33 -0
- data/exe/parlour +2 -3
- data/lib/parlour/conflict_resolver.rb +18 -14
- data/lib/parlour/debugging.rb +29 -16
- data/lib/parlour/mixin/searchable.rb +54 -0
- data/lib/parlour/rbi_generator/arbitrary.rb +3 -6
- data/lib/parlour/rbi_generator/attribute.rb +9 -0
- data/lib/parlour/rbi_generator/class_namespace.rb +6 -7
- data/lib/parlour/rbi_generator/constant.rb +3 -6
- data/lib/parlour/rbi_generator/enum_class_namespace.rb +7 -0
- data/lib/parlour/rbi_generator/extend.rb +5 -8
- data/lib/parlour/rbi_generator/include.rb +5 -8
- data/lib/parlour/rbi_generator/method.rb +15 -10
- data/lib/parlour/rbi_generator/module_namespace.rb +7 -9
- data/lib/parlour/rbi_generator/namespace.rb +27 -24
- data/lib/parlour/rbi_generator/parameter.rb +12 -0
- data/lib/parlour/rbi_generator/rbi_object.rb +0 -5
- data/lib/parlour/rbi_generator/struct_class_namespace.rb +7 -0
- data/lib/parlour/rbi_generator/type_alias.rb +5 -8
- data/lib/parlour/rbi_generator.rb +1 -16
- data/lib/parlour/rbs_generator/arbitrary.rb +3 -6
- data/lib/parlour/rbs_generator/attribute.rb +8 -0
- data/lib/parlour/rbs_generator/class_namespace.rb +5 -9
- data/lib/parlour/rbs_generator/constant.rb +3 -6
- data/lib/parlour/rbs_generator/extend.rb +3 -6
- data/lib/parlour/rbs_generator/include.rb +3 -6
- data/lib/parlour/rbs_generator/interface_namespace.rb +5 -5
- data/lib/parlour/rbs_generator/method.rb +6 -7
- data/lib/parlour/rbs_generator/method_signature.rb +13 -0
- data/lib/parlour/rbs_generator/module_namespace.rb +5 -6
- data/lib/parlour/rbs_generator/namespace.rb +8 -8
- data/lib/parlour/rbs_generator/rbs_object.rb +0 -5
- data/lib/parlour/rbs_generator/type_alias.rb +3 -6
- data/lib/parlour/type_loader.rb +6 -1
- data/lib/parlour/type_parser.rb +2 -2
- data/lib/parlour/typed_object.rb +90 -5
- data/lib/parlour/version.rb +1 -1
- data/lib/parlour.rb +2 -0
- data/parlour.gemspec +2 -1
- metadata +19 -5
- data/.travis.yml +0 -32
- data/rbi/parlour.rbi +0 -1896
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cc5c6c8baabe95bbc999a4143264b1dad8b84260bdc156d2a35526244322db2f
|
4
|
+
data.tar.gz: 580430b0cfe37f80b60f9dd47f8673f4d1d973e6ef6abca44efa299355d19fed
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ae2fd0263a3d955ff7904a28e69bf16eb21b413bda3e71be42636e0829e730a33ee0eb477712fc45dffbce948de3a4c3d6ae6e19147e21b114cd58fe93679676
|
7
|
+
data.tar.gz: 549cd5f91736b8aa5c1f5e1ebaa69fd2d8e4e9f905f1d4aa9ed799677e2d2367a573548d6a9ea220f3c6c6dbf268cc2679c8d0e26516c52224574563974070b6
|
@@ -0,0 +1,46 @@
|
|
1
|
+
name: Run tests
|
2
|
+
|
3
|
+
on: [push, pull_request]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
test:
|
7
|
+
strategy:
|
8
|
+
matrix:
|
9
|
+
ruby: [2.4, 2.5, 2.6, 2.7, 3.0]
|
10
|
+
continue-on-error: false
|
11
|
+
|
12
|
+
runs-on: ubuntu-latest
|
13
|
+
steps:
|
14
|
+
- uses: actions/checkout@v2
|
15
|
+
- name: Set up Ruby
|
16
|
+
uses: ruby/setup-ruby@v1
|
17
|
+
with:
|
18
|
+
ruby-version: ${{ matrix.ruby }}
|
19
|
+
- name: Install dependencies
|
20
|
+
run: bundle install
|
21
|
+
- name: Run tests
|
22
|
+
run: bundle exec rake
|
23
|
+
- name: Check RBI is up-to-date
|
24
|
+
run: ./ci/check_rbi.sh
|
25
|
+
|
26
|
+
# Deploy documentation to GitHub Pages, if this is a push to master and the tests passed
|
27
|
+
deploy-docs:
|
28
|
+
if: ${{ github.ref == 'refs/heads/master' }}
|
29
|
+
|
30
|
+
runs-on: ubuntu-latest
|
31
|
+
steps:
|
32
|
+
- uses: actions/checkout@v2
|
33
|
+
- name: Set up Ruby
|
34
|
+
uses: ruby/setup-ruby@v1
|
35
|
+
with:
|
36
|
+
ruby-version: 2.7
|
37
|
+
- name: Install dependencies
|
38
|
+
run: bundle install
|
39
|
+
- name: Build documentation
|
40
|
+
run: bundle exec yard
|
41
|
+
- name: Deploy to GitHub Actions
|
42
|
+
uses: JamesIves/github-pages-deploy-action@3.7.1
|
43
|
+
with:
|
44
|
+
github_token: ${{ secrets.GITHUB_TOKEN }}
|
45
|
+
branch: gh-pages
|
46
|
+
folder: doc
|
data/.parlour
CHANGED
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,39 @@ 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
|
+
## [7.0.0] - 2022-04-18
|
7
|
+
### Added
|
8
|
+
- `#describe` now uses a new, clearer format.
|
9
|
+
- Added `#describe_tree`, which produces `#describe` output for a node and all
|
10
|
+
of its children.
|
11
|
+
- Added `#find` and `#find_all` for retrieving a node's children based on
|
12
|
+
criteria.
|
13
|
+
|
14
|
+
### Changed
|
15
|
+
- Parlour now uses the new block-based `type_member` syntax internally.
|
16
|
+
**Potentially breaking** if you pin an older version of Sorbet which doesn't
|
17
|
+
support this syntax!
|
18
|
+
- Improved error message when unable to retrieve the file table from Sorbet.
|
19
|
+
- `#inspect` and `#to_s` now call `#describe`.
|
20
|
+
|
21
|
+
## Fixed
|
22
|
+
- Fixed some incorrect YARD documentation tags.
|
23
|
+
|
24
|
+
## [6.0.1] - 2021-02-28
|
25
|
+
### Changed
|
26
|
+
- Disabled runtime type checking for `TypedObject#name`, resulting in a
|
27
|
+
significant decrease in the time taken to run the conflict resolver.
|
28
|
+
|
29
|
+
## [6.0.0] - 2021-02-28
|
30
|
+
### Changed
|
31
|
+
- The RBI previously included with the Parlour gem has been removed,
|
32
|
+
as it was causing issues with Sorbet. **If you were relying on Parlour's
|
33
|
+
bundled RBI while type-checking your project, you will now need to use the
|
34
|
+
RBI from sorbet-typed or the Parlour repo.**
|
35
|
+
- `Namespace#path` will now work much more reliably for classes and
|
36
|
+
modules which replace methods from `Module` and `Class`, such as
|
37
|
+
`#name`.
|
38
|
+
|
6
39
|
## [5.0.0] - 2020-12-26
|
7
40
|
### Added
|
8
41
|
- Added RBS generation support! This includes:
|
data/exe/parlour
CHANGED
@@ -11,9 +11,8 @@ program :description, 'An RBI generator and plugin system'
|
|
11
11
|
|
12
12
|
default_command :run
|
13
13
|
command :run do |c|
|
14
|
-
|
15
|
-
c.
|
16
|
-
c.description = 'Generates an RBI file from your .parlour file'
|
14
|
+
c.syntax = 'parlour run'
|
15
|
+
c.description = 'Generates a signature file from your .parlour file'
|
17
16
|
|
18
17
|
c.action do |args, options|
|
19
18
|
working_dir = Dir.pwd
|
@@ -7,6 +7,10 @@ module Parlour
|
|
7
7
|
class ConflictResolver
|
8
8
|
extend T::Sig
|
9
9
|
|
10
|
+
def initialize
|
11
|
+
@debugging_tree = Debugging::Tree.new(colour: true)
|
12
|
+
end
|
13
|
+
|
10
14
|
sig do
|
11
15
|
params(
|
12
16
|
namespace: RbiGenerator::Namespace,
|
@@ -41,7 +45,7 @@ module Parlour
|
|
41
45
|
# will be kept, or nil to keep none of them.
|
42
46
|
# @return [void]
|
43
47
|
def resolve_conflicts(namespace, &resolver)
|
44
|
-
Debugging.debug_puts(self,
|
48
|
+
Debugging.debug_puts(self, @debugging_tree.begin("Resolving conflicts for #{namespace.name}..."))
|
45
49
|
|
46
50
|
# Check for multiple definitions with the same name
|
47
51
|
# (Special case here: writer attributes get an "=" appended to their name)
|
@@ -54,10 +58,10 @@ module Parlour
|
|
54
58
|
end
|
55
59
|
|
56
60
|
grouped_by_name_children.each do |name, children|
|
57
|
-
Debugging.debug_puts(self,
|
61
|
+
Debugging.debug_puts(self, @debugging_tree.begin("Checking children named #{name}..."))
|
58
62
|
|
59
63
|
if children.length > 1
|
60
|
-
Debugging.debug_puts(self,
|
64
|
+
Debugging.debug_puts(self, @debugging_tree.here("Possible conflict between #{children.length} objects"))
|
61
65
|
|
62
66
|
# Special case: do we have two methods, one of which is a class method
|
63
67
|
# and the other isn't? If so, do nothing - this is fine
|
@@ -65,7 +69,7 @@ module Parlour
|
|
65
69
|
children.all? { |c| c.is_a?(RbiGenerator::Method) } &&
|
66
70
|
children.count { |c| T.cast(c, RbiGenerator::Method).class_method } == 1
|
67
71
|
|
68
|
-
Debugging.debug_puts(self,
|
72
|
+
Debugging.debug_puts(self, @debugging_tree.end("One is an instance method and one is a class method; no resolution required"))
|
69
73
|
next
|
70
74
|
end
|
71
75
|
|
@@ -80,7 +84,7 @@ module Parlour
|
|
80
84
|
end
|
81
85
|
deduplicate_mixins_of_name(namespace, name)
|
82
86
|
|
83
|
-
Debugging.debug_puts(self,
|
87
|
+
Debugging.debug_puts(self, @debugging_tree.end("Includes/extends do not conflict with namespaces; no resolution required"))
|
84
88
|
next
|
85
89
|
end
|
86
90
|
|
@@ -90,13 +94,13 @@ module Parlour
|
|
90
94
|
children.all? { |c| c.is_a?(RbiGenerator::Attribute) } &&
|
91
95
|
children.count { |c| T.cast(c, RbiGenerator::Attribute).class_attribute } == 1
|
92
96
|
|
93
|
-
Debugging.debug_puts(self,
|
97
|
+
Debugging.debug_puts(self, @debugging_tree.end("One is an instance attribute and one is a class attribute; no resolution required"))
|
94
98
|
next
|
95
99
|
end
|
96
100
|
|
97
101
|
# Optimization for Special case: are they all clearly equal? If so, remove all but one
|
98
102
|
if all_eql?(children)
|
99
|
-
Debugging.debug_puts(self,
|
103
|
+
Debugging.debug_puts(self, @debugging_tree.end("All children are identical"))
|
100
104
|
|
101
105
|
# All of the children are the same, so this deletes all of them
|
102
106
|
namespace.children.delete(T.must(children.first))
|
@@ -116,7 +120,7 @@ module Parlour
|
|
116
120
|
# and get the strategy to use
|
117
121
|
strategy = merge_strategy(children)
|
118
122
|
unless strategy
|
119
|
-
Debugging.debug_puts(self,
|
123
|
+
Debugging.debug_puts(self, @debugging_tree.end("Children are unmergeable types; requesting manual resolution"))
|
120
124
|
# The types aren't the same, so ask the resolver what to do, and
|
121
125
|
# insert that (if not nil)
|
122
126
|
choice = resolver.call("Different kinds of definition for the same name", children)
|
@@ -135,7 +139,7 @@ module Parlour
|
|
135
139
|
# a single method
|
136
140
|
if non_namespaces.length != 0
|
137
141
|
unless non_namespaces.length == 1 && RbiGenerator::Method === non_namespaces.first
|
138
|
-
Debugging.debug_puts(self,
|
142
|
+
Debugging.debug_puts(self, @debugging_tree.end("Non-namespace item in a differing namespace conflict is not a single method; requesting manual resolution"))
|
139
143
|
# The types aren't the same, so ask the resolver what to do, and
|
140
144
|
# insert that (if not nil)
|
141
145
|
choice = resolver.call("Non-namespace item in a differing namespace conflict is not a single method", non_namespaces)
|
@@ -167,29 +171,29 @@ module Parlour
|
|
167
171
|
# Can the children merge themselves automatically? If so, let them
|
168
172
|
first, rest = T.must(first), T.must(rest)
|
169
173
|
if T.must(first).mergeable?(T.must(rest))
|
170
|
-
Debugging.debug_puts(self,
|
174
|
+
Debugging.debug_puts(self, @debugging_tree.end("Children are all mergeable; resolving automatically"))
|
171
175
|
first.merge_into_self(rest)
|
172
176
|
namespace.children << first
|
173
177
|
next
|
174
178
|
end
|
175
179
|
|
176
180
|
# I give up! Let it be resolved manually somehow
|
177
|
-
Debugging.debug_puts(self,
|
181
|
+
Debugging.debug_puts(self, @debugging_tree.end("Unable to resolve automatically; requesting manual resolution"))
|
178
182
|
choice = resolver.call("Can't automatically resolve", children)
|
179
183
|
namespace.children << choice if choice
|
180
184
|
else
|
181
|
-
Debugging.debug_puts(self,
|
185
|
+
Debugging.debug_puts(self, @debugging_tree.end("No conflicts"))
|
182
186
|
end
|
183
187
|
end
|
184
188
|
|
185
|
-
Debugging.debug_puts(self,
|
189
|
+
Debugging.debug_puts(self, @debugging_tree.here("Resolving children..."))
|
186
190
|
|
187
191
|
# Recurse to child namespaces
|
188
192
|
namespace.children.each do |child|
|
189
193
|
resolve_conflicts(child, &resolver) if RbiGenerator::Namespace === child
|
190
194
|
end
|
191
195
|
|
192
|
-
Debugging.debug_puts(self,
|
196
|
+
Debugging.debug_puts(self, @debugging_tree.end("All children done"))
|
193
197
|
end
|
194
198
|
|
195
199
|
private
|
data/lib/parlour/debugging.rb
CHANGED
@@ -17,7 +17,7 @@ module Parlour
|
|
17
17
|
@debug_mode = value
|
18
18
|
end
|
19
19
|
|
20
|
-
# Whether debug messages sent by {
|
20
|
+
# Whether debug messages sent by {.debug_puts} should be printed.
|
21
21
|
# Defaults to true if the PARLOUR_DEBUG environment variable is set.
|
22
22
|
# @return [Boolean] True if debug messages will be printed, false otherwise.
|
23
23
|
sig { returns(T::Boolean) }
|
@@ -25,11 +25,11 @@ module Parlour
|
|
25
25
|
@debug_mode
|
26
26
|
end
|
27
27
|
|
28
|
-
# Prints a message with a debugging prefix to STDOUT if {
|
28
|
+
# Prints a message with a debugging prefix to STDOUT if {.debug_mode?} is
|
29
29
|
# true.
|
30
|
-
# @
|
30
|
+
# @param [Object] object The object which is printing this debug message.
|
31
31
|
# Callers should pass +self+.
|
32
|
-
# @
|
32
|
+
# @param [String] message The message to print. It should not contain
|
33
33
|
# newlines.
|
34
34
|
# @return [void]
|
35
35
|
sig { params(object: T.untyped, message: String).void }
|
@@ -45,7 +45,7 @@ module Parlour
|
|
45
45
|
# "conflict resolver". If the object type is unknown, this returns its class
|
46
46
|
# name.
|
47
47
|
# @param [Object] object The object to convert.
|
48
|
-
# @return [String] A string describing the object for {
|
48
|
+
# @return [String] A string describing the object for {.debug_puts}.
|
49
49
|
sig { params(object: T.untyped).returns(String) }
|
50
50
|
def self.name_for_debug_caller(object)
|
51
51
|
case object
|
@@ -63,24 +63,32 @@ module Parlour
|
|
63
63
|
|
64
64
|
# A module for generating a globally-consistent, nicely-formatted tree of
|
65
65
|
# output using Unicode block characters.
|
66
|
-
|
66
|
+
class Tree
|
67
67
|
extend T::Sig
|
68
68
|
|
69
69
|
# The number of spaces to indent each layer of the tree by. Should be at
|
70
70
|
# least 1.
|
71
71
|
INDENT_SPACES = 2
|
72
72
|
|
73
|
-
#
|
74
|
-
|
73
|
+
# Whether to colour output or not.
|
74
|
+
sig { returns(T::Boolean) }
|
75
|
+
attr_reader :colour
|
76
|
+
|
77
|
+
sig { params(colour: T::Boolean).void }
|
78
|
+
def initialize(colour: false)
|
79
|
+
@colour = colour
|
80
|
+
@indent_level = 0
|
81
|
+
end
|
75
82
|
|
76
83
|
# Returns a new heading, and then decents the tree one level into it.
|
77
84
|
# (That is, future output will go under the new heading.)
|
78
85
|
# @param [String] message The heading.
|
79
86
|
# @return [String] The line of this tree which should be printed.
|
80
87
|
sig { params(message: String).returns(String) }
|
81
|
-
def
|
82
|
-
result = line_prefix + '├' + text_prefix +
|
83
|
-
|
88
|
+
def begin(message)
|
89
|
+
result = line_prefix + '├' + text_prefix +
|
90
|
+
(colour ? Rainbow(message).green.bright.bold : message)
|
91
|
+
indent!(1)
|
84
92
|
result
|
85
93
|
end
|
86
94
|
|
@@ -88,7 +96,7 @@ module Parlour
|
|
88
96
|
# @param [String] message The element.
|
89
97
|
# @return [String] The line of this tree which should be printed.
|
90
98
|
sig { params(message: String).returns(String) }
|
91
|
-
def
|
99
|
+
def here(message)
|
92
100
|
line_prefix + '├' + text_prefix + message
|
93
101
|
end
|
94
102
|
|
@@ -97,16 +105,16 @@ module Parlour
|
|
97
105
|
# @param [String] message The element.
|
98
106
|
# @return [String] The line of this tree which should be printed.
|
99
107
|
sig { params(message: String).returns(String) }
|
100
|
-
def
|
108
|
+
def end(message)
|
101
109
|
result = line_prefix + '└' + text_prefix + message
|
102
|
-
|
110
|
+
indent!(-1)
|
103
111
|
result
|
104
112
|
end
|
105
113
|
|
106
114
|
# The prefix which should be printed before anything else on this line of
|
107
115
|
# the tree, based on the current indent level.
|
108
116
|
# @return [String]
|
109
|
-
def
|
117
|
+
def line_prefix
|
110
118
|
@indent_level.times.map { '│' + ' ' * INDENT_SPACES }.join
|
111
119
|
end
|
112
120
|
|
@@ -114,9 +122,14 @@ module Parlour
|
|
114
122
|
# the current element and its text, based on the specified number of
|
115
123
|
# spaces to use for indents.
|
116
124
|
# @return [String]
|
117
|
-
def
|
125
|
+
def text_prefix
|
118
126
|
'─' * (INDENT_SPACES - 1) + " "
|
119
127
|
end
|
128
|
+
|
129
|
+
# Modifies the current indent level by the given offset.
|
130
|
+
def indent!(offset)
|
131
|
+
@indent_level = [0, @indent_level + offset].max
|
132
|
+
end
|
120
133
|
end
|
121
134
|
end
|
122
135
|
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# typed: true
|
2
|
+
|
3
|
+
module Parlour
|
4
|
+
module Mixin
|
5
|
+
# Extends a particular type system's Namespace class to provide searchable
|
6
|
+
# children.
|
7
|
+
module Searchable
|
8
|
+
extend T::Sig
|
9
|
+
extend T::Generic
|
10
|
+
|
11
|
+
Child = type_member
|
12
|
+
|
13
|
+
abstract!
|
14
|
+
|
15
|
+
sig { abstract.returns(T::Array[Child]) }
|
16
|
+
def children; end
|
17
|
+
|
18
|
+
sig { params(name: T.nilable(String), type: T.nilable(Class)).returns(Child) }
|
19
|
+
# Finds the first child matching the given predicates.
|
20
|
+
#
|
21
|
+
# @param [String, nil] name The name of the child to filter on, or nil.
|
22
|
+
# @param [Class, nil] type The type of the child to filter on, or nil. The
|
23
|
+
# type is compared using #is_a?.
|
24
|
+
def find(name: nil, type: nil)
|
25
|
+
T.unsafe(children).find { |c| searchable_child_matches(c, name, type) }
|
26
|
+
end
|
27
|
+
|
28
|
+
sig { params(name: T.nilable(String), type: T.nilable(Class)).returns(T::Array[Child]) }
|
29
|
+
# Finds the first child matching the given predicates.
|
30
|
+
#
|
31
|
+
# @param [String, nil] name The name of the child to filter on, or nil.
|
32
|
+
# @param [Class, nil] type The type of the child to filter on, or nil. The
|
33
|
+
# type is compared using #is_a?.
|
34
|
+
def find_all(name: nil, type: nil)
|
35
|
+
T.unsafe(children).select { |c| searchable_child_matches(c, name, type) }
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
sig do
|
41
|
+
params(
|
42
|
+
child: Child,
|
43
|
+
name: T.nilable(String),
|
44
|
+
type: T.nilable(Class)
|
45
|
+
)
|
46
|
+
.returns(T::Boolean)
|
47
|
+
end
|
48
|
+
def searchable_child_matches(child, name, type)
|
49
|
+
(name.nil? ? true : child.name == name) \
|
50
|
+
&& (type.nil? ? true : child.is_a?(type))
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -80,12 +80,9 @@ module Parlour
|
|
80
80
|
raise 'arbitrary code is never mergeable'
|
81
81
|
end
|
82
82
|
|
83
|
-
sig { override.returns(String) }
|
84
|
-
|
85
|
-
|
86
|
-
# @return [String]
|
87
|
-
def describe
|
88
|
-
"Arbitrary code (#{code})"
|
83
|
+
sig { override.returns(T::Array[T.any(Symbol, T::Hash[Symbol, String])]) }
|
84
|
+
def describe_attrs
|
85
|
+
[:code]
|
89
86
|
end
|
90
87
|
|
91
88
|
sig { override.void }
|
@@ -78,6 +78,15 @@ module Parlour
|
|
78
78
|
@type = TypeParser.parse_single_type(@type) if String === @type
|
79
79
|
end
|
80
80
|
|
81
|
+
sig { override.returns(T::Array[T.any(Symbol, T::Hash[Symbol, String])]) }
|
82
|
+
def describe_attrs
|
83
|
+
[
|
84
|
+
:kind,
|
85
|
+
{type: type}, # avoid quotes
|
86
|
+
:class_attribute
|
87
|
+
]
|
88
|
+
end
|
89
|
+
|
81
90
|
private
|
82
91
|
|
83
92
|
sig do
|
@@ -5,6 +5,8 @@ module Parlour
|
|
5
5
|
class ClassNamespace < Namespace
|
6
6
|
extend T::Sig
|
7
7
|
|
8
|
+
Child = type_member {{ fixed: RbiObject }}
|
9
|
+
|
8
10
|
sig do
|
9
11
|
params(
|
10
12
|
generator: Generator,
|
@@ -110,13 +112,10 @@ module Parlour
|
|
110
112
|
end
|
111
113
|
end
|
112
114
|
|
113
|
-
sig { override.returns(String) }
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
"Class #{name} - #{"superclass #{superclass}, " if superclass}" +
|
118
|
-
"#{"abstract, " if abstract}#{children.length} children, " +
|
119
|
-
"#{includes.length} includes, #{extends.length} extends"
|
115
|
+
sig { override.returns(T::Array[T.any(Symbol, T::Hash[Symbol, String])]) }
|
116
|
+
def describe_attrs
|
117
|
+
(superclass ? [:superclass] : []) \
|
118
|
+
+ [:children, :abstract, :final, :sealed]
|
120
119
|
end
|
121
120
|
|
122
121
|
sig { override.void }
|
@@ -95,12 +95,9 @@ module Parlour
|
|
95
95
|
# We don't need to change anything! We only merge identical constants
|
96
96
|
end
|
97
97
|
|
98
|
-
sig { override.returns(String) }
|
99
|
-
|
100
|
-
|
101
|
-
# @return [String]
|
102
|
-
def describe
|
103
|
-
"Constant (#{name} = #{value})"
|
98
|
+
sig { override.returns(T::Array[T.any(Symbol, T::Hash[Symbol, String])]) }
|
99
|
+
def describe_attrs
|
100
|
+
[:value, :eigen_constant]
|
104
101
|
end
|
105
102
|
|
106
103
|
sig { override.void }
|
@@ -5,6 +5,8 @@ module Parlour
|
|
5
5
|
class EnumClassNamespace < ClassNamespace
|
6
6
|
extend T::Sig
|
7
7
|
|
8
|
+
Child = type_member {{ fixed: RbiObject }}
|
9
|
+
|
8
10
|
sig do
|
9
11
|
params(
|
10
12
|
generator: Generator,
|
@@ -114,6 +116,11 @@ module Parlour
|
|
114
116
|
def generalize_from_rbi!
|
115
117
|
super
|
116
118
|
end
|
119
|
+
|
120
|
+
sig { override.returns(T::Array[T.any(Symbol, T::Hash[Symbol, String])]) }
|
121
|
+
def describe_attrs
|
122
|
+
super + [{enums: enums.inspect}]
|
123
|
+
end
|
117
124
|
end
|
118
125
|
end
|
119
126
|
end
|
@@ -75,16 +75,13 @@ module Parlour
|
|
75
75
|
# We don't need to change anything! We only merge identical extends
|
76
76
|
end
|
77
77
|
|
78
|
-
sig { override.returns(String) }
|
79
|
-
# Returns a human-readable brief string description of this code.
|
80
|
-
#
|
81
|
-
# @return [String]
|
82
|
-
def describe
|
83
|
-
"Extend (#{name})"
|
84
|
-
end
|
85
|
-
|
86
78
|
sig { override.void }
|
87
79
|
def generalize_from_rbi!; end # Nothing to do
|
80
|
+
|
81
|
+
sig { override.returns(T::Array[T.any(Symbol, T::Hash[Symbol, String])]) }
|
82
|
+
def describe_attrs
|
83
|
+
[]
|
84
|
+
end
|
88
85
|
end
|
89
86
|
end
|
90
87
|
end
|
@@ -75,16 +75,13 @@ module Parlour
|
|
75
75
|
# We don't need to change anything! We only merge identical includes
|
76
76
|
end
|
77
77
|
|
78
|
-
sig { override.returns(String) }
|
79
|
-
# Returns a human-readable brief string description of this code.
|
80
|
-
#
|
81
|
-
# @return [String]
|
82
|
-
def describe
|
83
|
-
"Include (#{name})"
|
84
|
-
end
|
85
|
-
|
86
78
|
sig { override.void }
|
87
79
|
def generalize_from_rbi!; end # Nothing to do
|
80
|
+
|
81
|
+
sig { override.returns(T::Array[T.any(Symbol, T::Hash[Symbol, String])]) }
|
82
|
+
def describe_attrs
|
83
|
+
[]
|
84
|
+
end
|
88
85
|
end
|
89
86
|
end
|
90
87
|
end
|
@@ -206,16 +206,6 @@ module Parlour
|
|
206
206
|
# We don't need to change anything! We only merge identical methods
|
207
207
|
end
|
208
208
|
|
209
|
-
sig { override.returns(String) }
|
210
|
-
# Returns a human-readable brief string description of this method.
|
211
|
-
#
|
212
|
-
# @return [String]
|
213
|
-
def describe
|
214
|
-
# TODO: more info
|
215
|
-
"Method #{name} - #{parameters.length} parameters, " +
|
216
|
-
" returns #{return_type}"
|
217
|
-
end
|
218
|
-
|
219
209
|
sig { override.void }
|
220
210
|
def generalize_from_rbi!
|
221
211
|
@return_type = TypeParser.parse_single_type(@return_type) if String === @return_type
|
@@ -223,6 +213,21 @@ module Parlour
|
|
223
213
|
parameters.each(&:generalize_from_rbi!)
|
224
214
|
end
|
225
215
|
|
216
|
+
sig { override.returns(T::Array[T.any(Symbol, T::Hash[Symbol, String])]) }
|
217
|
+
def describe_attrs
|
218
|
+
(type_parameters.any? ? [{ type_parameters: type_parameters.join(", ")}] : []) \
|
219
|
+
+ [
|
220
|
+
{parameters: "(#{parameters.map(&:describe_in_method).join(", ")})"},
|
221
|
+
{return_type: return_type || '(void)'}, # avoid quotes
|
222
|
+
:class_method,
|
223
|
+
:abstract,
|
224
|
+
:implementation,
|
225
|
+
:override,
|
226
|
+
:overridable,
|
227
|
+
:final,
|
228
|
+
]
|
229
|
+
end
|
230
|
+
|
226
231
|
private
|
227
232
|
|
228
233
|
sig do
|
@@ -5,6 +5,8 @@ module Parlour
|
|
5
5
|
class ModuleNamespace < Namespace
|
6
6
|
extend T::Sig
|
7
7
|
|
8
|
+
Child = type_member {{ fixed: RbiObject }}
|
9
|
+
|
8
10
|
sig do
|
9
11
|
params(
|
10
12
|
generator: Generator,
|
@@ -100,19 +102,15 @@ module Parlour
|
|
100
102
|
super
|
101
103
|
end
|
102
104
|
|
103
|
-
sig { override.returns(String) }
|
104
|
-
# Returns a human-readable brief string description of this module.
|
105
|
-
# @return [String]
|
106
|
-
def describe
|
107
|
-
"Module #{name} - #{"interface, " if interface}" +
|
108
|
-
"#{"abstract, " if abstract}#{children.length} " +
|
109
|
-
"children, #{includes.length} includes, #{extends.length} extends"
|
110
|
-
end
|
111
|
-
|
112
105
|
sig { override.void }
|
113
106
|
def generalize_from_rbi!
|
114
107
|
super
|
115
108
|
end
|
109
|
+
|
110
|
+
sig { override.returns(T::Array[T.any(Symbol, T::Hash[Symbol, String])]) }
|
111
|
+
def describe_attrs
|
112
|
+
[:children, :abstract, :interface, :final, :sealed]
|
113
|
+
end
|
116
114
|
end
|
117
115
|
end
|
118
116
|
end
|