orthoses 1.6.0 → 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/README.md +10 -3
- data/lib/orthoses/builder.rb +7 -3
- data/lib/orthoses/content/duplication_checker.rb +54 -17
- data/lib/orthoses/content/environment.rb +14 -1
- data/lib/orthoses/content.rb +46 -44
- data/lib/orthoses/create_file_by_name.rb +38 -7
- data/lib/orthoses/filter.rb +2 -2
- data/lib/orthoses/missing_name.rb +81 -0
- data/lib/orthoses/mixin.rb +9 -4
- data/lib/orthoses/rbs_prototype_rb.rb +16 -2
- data/lib/orthoses/rbs_prototype_runtime.rb +21 -2
- data/lib/orthoses/utils.rb +1 -1
- data/lib/orthoses/version.rb +1 -1
- data/lib/orthoses.rb +1 -0
- data/sig/orthoses/_call.rbs +1 -1
- data/sig/orthoses/_middle_ware.rbs +1 -1
- data/sig/orthoses/attribute/hook.rbs +1 -1
- data/sig/orthoses/attribute.rbs +1 -1
- data/sig/orthoses/autoload/hook.rbs +1 -1
- data/sig/orthoses/autoload.rbs +1 -1
- data/sig/orthoses/builder/call_logable.rbs +1 -1
- data/sig/orthoses/builder.rbs +14 -4
- data/sig/orthoses/call_tracer/capturable.rbs +1 -1
- data/sig/orthoses/call_tracer/capture.rbs +1 -1
- data/sig/orthoses/call_tracer/lazy.rbs +14 -2
- data/sig/orthoses/call_tracer.rbs +1 -1
- data/sig/orthoses/const_load_error.rbs +1 -1
- data/sig/orthoses/constant.rbs +1 -1
- data/sig/orthoses/content/array_io.rbs +1 -1
- data/sig/orthoses/content/duplication_checker.rbs +7 -2
- data/sig/orthoses/content/environment.rbs +8 -3
- data/sig/orthoses/content/header_builder.rbs +1 -1
- data/sig/orthoses/content.rbs +3 -2
- data/sig/orthoses/create_file_by_name.rbs +2 -2
- data/sig/orthoses/delegate_class/hook.rbs +1 -1
- data/sig/orthoses/delegate_class.rbs +1 -1
- data/sig/orthoses/filter.rbs +6 -1
- data/sig/orthoses/lazy_trace_point.rbs +9 -1
- data/sig/orthoses/load_rbs.rbs +1 -1
- data/sig/orthoses/missing_name/missing_class.rbs +7 -0
- data/sig/orthoses/missing_name/missing_module.rbs +7 -0
- data/sig/orthoses/missing_name.rbs +6 -0
- data/sig/orthoses/mixin/hook.rbs +2 -2
- data/sig/orthoses/mixin.rbs +2 -2
- data/sig/orthoses/name_space_error.rbs +1 -1
- data/sig/orthoses/object_space_all.rbs +1 -1
- data/sig/orthoses/outputable/avoid_recursive_ancestor_error.rbs +3 -1
- data/sig/orthoses/outputable/constantizable_filter.rbs +3 -1
- data/sig/orthoses/outputable/uniq_content_body.rbs +3 -1
- data/sig/orthoses/outputable.rbs +1 -1
- data/sig/orthoses/path_helper.rbs +1 -1
- data/sig/orthoses/pp.rbs +3 -1
- data/sig/orthoses/rbs_prototype_rb.rbs +10 -3
- data/sig/orthoses/rbs_prototype_runtime.rbs +13 -3
- data/sig/orthoses/sort.rbs +2 -1
- data/sig/orthoses/store.rbs +3 -1
- data/sig/orthoses/tap.rbs +4 -1
- data/sig/orthoses/trace/attribute.rbs +1 -1
- data/sig/orthoses/trace/method/info.rbs +1 -1
- data/sig/orthoses/trace/method.rbs +1 -1
- data/sig/orthoses/trace/targetable.rbs +1 -1
- data/sig/orthoses/trace.rbs +1 -1
- data/sig/orthoses/utils/type_list.rbs +2 -1
- data/sig/orthoses/utils/underscore.rbs +1 -1
- data/sig/orthoses/utils.rbs +2 -2
- data/sig/orthoses/walk.rbs +1 -1
- data/sig/orthoses/writer.rbs +1 -1
- data/sig/orthoses.rbs +2 -2
- metadata +7 -13
- data/Gemfile +0 -15
- data/Gemfile.lock +0 -76
- data/examples/minitest/Rakefile +0 -56
- data/examples/rack-test/Gemfile +0 -8
- data/examples/rack-test/Gemfile.lock +0 -30
- data/examples/rack-test/Rakefile +0 -7
- data/examples/rack-test/generate.rb +0 -31
- data/examples/simple_middleware.rb +0 -11
- data/examples/simple_middleware.rbs +0 -7
- data/orthoses.gemspec +0 -36
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0bbf41507135a45b3b2a45ffff90500a68a39f4497bf1fcbd72d94579fd27ae8
|
4
|
+
data.tar.gz: 8a6daa8a64d8bfbda565e24ec53622ca5530f5624e80f0c6fdfed5ca13b10786
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c9d4a29dfc22972be165a703c4e86272a6e045ab34a91f76b560eeb329dca0795dab6eef59f419b50b7da4c390fcfa71d74d217baad3aa65b43f0000a2f7a126
|
7
|
+
data.tar.gz: 5579c33080fb673b50445fc8193f2876f8065e9ccc7ad2042020539a688f1242bfbe9dab265a780057040051f555f20b04ff62734ef844d25fea099a835d1c2a
|
data/README.md
CHANGED
@@ -29,11 +29,13 @@ For example, You can write script in Rakefile.
|
|
29
29
|
require 'orthoses'
|
30
30
|
|
31
31
|
namespace :rbs do
|
32
|
-
desc "build RBS to sig/
|
32
|
+
desc "build RBS to sig/orthoses"
|
33
33
|
task :build do
|
34
34
|
Orthoses::Builder.new do
|
35
35
|
use Orthoses::CreateFileByName,
|
36
|
-
|
36
|
+
depth: 1,
|
37
|
+
to: "sig/orthoses",
|
38
|
+
rmtree: true,
|
37
39
|
header: "# !!! GENERATED CODE !!!"
|
38
40
|
use Orthoses::Filter do |name, _content|
|
39
41
|
path, _lineno = Object.const_source_location(name)
|
@@ -53,7 +55,7 @@ namespace :rbs do
|
|
53
55
|
end
|
54
56
|
```
|
55
57
|
|
56
|
-
Then, you can see the result files under `sig/
|
58
|
+
Then, you can see the result files under `sig/orthoses`.
|
57
59
|
|
58
60
|
## Utils
|
59
61
|
|
@@ -177,6 +179,11 @@ Sort signatures by class/module.
|
|
177
179
|
|
178
180
|
Trace the argument and return value objects when the method is actually called and determine the type.
|
179
181
|
|
182
|
+
## Orthoses::MissingName
|
183
|
+
|
184
|
+
Completes undefined class/module names.
|
185
|
+
If it is unknown whether it is a class or a module, it is defined as an empty module, and if it is a superclass, it is defined as an empty class.
|
186
|
+
|
180
187
|
## Development
|
181
188
|
|
182
189
|
After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/lib/orthoses/builder.rb
CHANGED
@@ -13,7 +13,7 @@ module Orthoses
|
|
13
13
|
class Builder
|
14
14
|
def initialize(&block)
|
15
15
|
@use = []
|
16
|
-
@
|
16
|
+
@runner = nil
|
17
17
|
instance_eval(&block) if block
|
18
18
|
end
|
19
19
|
|
@@ -37,7 +37,11 @@ module Orthoses
|
|
37
37
|
|
38
38
|
def run(loader)
|
39
39
|
use Store
|
40
|
-
|
40
|
+
reset_runner(loader)
|
41
|
+
end
|
42
|
+
|
43
|
+
def reset_runner(loader)
|
44
|
+
@runner = proc do
|
41
45
|
Orthoses.logger.info("[loader].call start")
|
42
46
|
loader.call.tap do
|
43
47
|
Orthoses.logger.info("[loader].call end")
|
@@ -46,7 +50,7 @@ module Orthoses
|
|
46
50
|
end
|
47
51
|
|
48
52
|
def to_loader
|
49
|
-
@use.reverse.inject(@
|
53
|
+
@use.reverse.inject(@runner) { |current, next_proc| next_proc[current] }
|
50
54
|
end
|
51
55
|
|
52
56
|
def call
|
@@ -4,48 +4,86 @@ module Orthoses
|
|
4
4
|
class DuplicationChecker
|
5
5
|
def initialize(decl, env: nil)
|
6
6
|
@decl = decl
|
7
|
-
@
|
7
|
+
@known_env = env || Utils.rbs_environment
|
8
|
+
@builder = RBS::DefinitionBuilder.new(env: @known_env)
|
9
|
+
@uniq_map = {}
|
8
10
|
end
|
9
11
|
|
10
12
|
def update_decl
|
11
13
|
return unless @decl.respond_to?(:members)
|
12
|
-
|
14
|
+
|
15
|
+
uniq_members
|
16
|
+
drop_set_method_definition
|
17
|
+
drop_known_method_definition
|
18
|
+
drop_known_const_definition
|
19
|
+
|
20
|
+
@decl.members.replace(@uniq_map.values)
|
21
|
+
|
22
|
+
@uniq_map.clear
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def uniq_members
|
13
28
|
@decl.members.each do |member|
|
14
29
|
if member.instance_of?(RBS::AST::Members::MethodDefinition) && member.overloading?
|
15
30
|
# avoid to duplicate and keep order
|
16
|
-
uniq_map[Object.new] = member
|
31
|
+
@uniq_map[Object.new] = member
|
17
32
|
else
|
18
33
|
key = member_key(member)
|
19
|
-
drop_member = uniq_map[key]
|
20
|
-
uniq_map[key] = member
|
34
|
+
drop_member = @uniq_map[key]
|
35
|
+
@uniq_map[key] = member
|
21
36
|
if drop_member
|
22
37
|
Orthoses.logger.info("#{@decl.name} \"#{member.location.source}\" was droped since duplication")
|
23
38
|
end
|
24
39
|
end
|
25
40
|
end
|
26
|
-
drop_known_method_definition(uniq_map)
|
27
|
-
@decl.members.replace(uniq_map.values)
|
28
41
|
end
|
29
42
|
|
30
|
-
|
43
|
+
def drop_set_method_definition
|
44
|
+
attr_accessors = @uniq_map.values.grep(RBS::AST::Members::AttrAccessor)
|
45
|
+
attr_accessors.each do |member|
|
46
|
+
@uniq_map.delete([RBS::AST::Members::MethodDefinition, :"#{member.name}=", member.kind])
|
47
|
+
end
|
48
|
+
end
|
31
49
|
|
32
|
-
def drop_known_method_definition
|
50
|
+
def drop_known_method_definition
|
33
51
|
decl_name = @decl.name.absolute!
|
34
|
-
if m_entry = @
|
52
|
+
if m_entry = @known_env.class_decls[decl_name]
|
35
53
|
m_entry.decls.each do |d|
|
36
|
-
d
|
37
|
-
|
54
|
+
drop_known_method_definition_recur(d)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def drop_known_method_definition_recur(d)
|
60
|
+
d.decl.members.each do |member|
|
61
|
+
case member
|
62
|
+
when RBS::AST::Members::LocationOnly
|
63
|
+
# ignore
|
64
|
+
when RBS::AST::Members::AttrAccessor
|
65
|
+
@uniq_map.delete([RBS::AST::Members::MethodDefinition, member.name, member.kind])
|
66
|
+
@uniq_map.delete([RBS::AST::Members::MethodDefinition, :"#{member.name}=", member.kind])
|
67
|
+
else
|
68
|
+
if member.kind_of?(RBS::AST::Members::Include) && member.name.interface?
|
69
|
+
# If interface is included, it is shared in the same namespace.
|
70
|
+
drop_known_method_definition_recur(@known_env.interface_decls[member.name])
|
71
|
+
else
|
72
|
+
@uniq_map.delete(member_key(member))
|
38
73
|
end
|
39
74
|
end
|
40
75
|
end
|
76
|
+
end
|
41
77
|
|
42
|
-
|
78
|
+
def drop_known_const_definition
|
79
|
+
decl_name = @decl.name.absolute!
|
80
|
+
constants_in_uniq_map = @uniq_map.select do |key, value|
|
43
81
|
value.kind_of?(RBS::AST::Declarations::Constant)
|
44
82
|
end
|
45
83
|
constants_in_uniq_map.each do |key, value|
|
46
84
|
type_name = decl_name + value.name
|
47
|
-
if @
|
48
|
-
uniq_map.delete(key)
|
85
|
+
if @known_env.constant_decls[type_name]
|
86
|
+
@uniq_map.delete(key)
|
49
87
|
end
|
50
88
|
end
|
51
89
|
end
|
@@ -60,12 +98,11 @@ module Orthoses
|
|
60
98
|
when RBS::AST::Members::Alias
|
61
99
|
[RBS::AST::Members::MethodDefinition, member.new_name, member.kind]
|
62
100
|
when RBS::AST::Members::AttrAccessor
|
63
|
-
# FIXME: how to check "#{member.name}=" ?
|
64
101
|
[RBS::AST::Members::MethodDefinition, member.name, member.kind]
|
65
102
|
when RBS::AST::Members::AttrReader
|
66
103
|
[RBS::AST::Members::MethodDefinition, member.name, member.kind]
|
67
104
|
when RBS::AST::Members::AttrWriter
|
68
|
-
[RBS::AST::Members::MethodDefinition, "#{member.name}=", member.kind]
|
105
|
+
[RBS::AST::Members::MethodDefinition, :"#{member.name}=", member.kind]
|
69
106
|
else
|
70
107
|
[member.class, member.name]
|
71
108
|
end
|
@@ -16,9 +16,17 @@ module Orthoses
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
def initialize(
|
19
|
+
def initialize(
|
20
|
+
method_definition_filter: nil,
|
21
|
+
alias_filter: nil,
|
22
|
+
constant_filter: nil,
|
23
|
+
mixin_filter: nil,
|
24
|
+
attribute_filter: nil
|
25
|
+
)
|
20
26
|
@load_env = RBS::Environment.new
|
21
27
|
@known_env = Utils.rbs_environment(cache: false)
|
28
|
+
@method_definition_filter = method_definition_filter
|
29
|
+
@alias_filter = alias_filter
|
22
30
|
@constant_filter = constant_filter
|
23
31
|
@mixin_filter = mixin_filter
|
24
32
|
@attribute_filter = attribute_filter
|
@@ -35,6 +43,7 @@ module Orthoses
|
|
35
43
|
each do |add_content|
|
36
44
|
content = store[add_content.name]
|
37
45
|
content.header = add_content.header
|
46
|
+
content.comment ||= add_content.comment
|
38
47
|
content.concat(add_content.body)
|
39
48
|
end
|
40
49
|
end
|
@@ -47,6 +56,7 @@ module Orthoses
|
|
47
56
|
@load_env.class_decls.each do |type_name, m_entry|
|
48
57
|
name = type_name.relative!.to_s
|
49
58
|
content = Content.new(name: name)
|
59
|
+
content.comment = m_entry.primary.decl.comment&.string&.gsub(/^/, "# ")
|
50
60
|
content.header = header_builder.build(entry: m_entry, name_hint: name)
|
51
61
|
decls_to_lines(m_entry.decls.map(&:decl)).each do |line|
|
52
62
|
content << line
|
@@ -94,9 +104,12 @@ module Orthoses
|
|
94
104
|
when RBS::AST::Declarations::Constant
|
95
105
|
next unless @constant_filter.nil? || @constant_filter.call(member)
|
96
106
|
when RBS::AST::Members::MethodDefinition
|
107
|
+
next unless @method_definition_filter.nil? || @method_definition_filter.call(member)
|
97
108
|
if last_visibility == :private && member.kind != :singleton_instance
|
98
109
|
member.instance_variable_set(:@visibility, :private)
|
99
110
|
end
|
111
|
+
when RBS::AST::Members::Alias
|
112
|
+
next unless @alias_filter.nil? || @alias_filter.call(member)
|
100
113
|
when RBS::AST::Members::Mixin
|
101
114
|
next unless @mixin_filter.nil? || @mixin_filter.call(member)
|
102
115
|
when RBS::AST::Members::Attribute
|
data/lib/orthoses/content.rb
CHANGED
@@ -74,12 +74,52 @@ module Orthoses
|
|
74
74
|
end
|
75
75
|
|
76
76
|
def original_rbs
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
77
|
+
io = StringIO.new
|
78
|
+
io.puts @comment if @comment
|
79
|
+
io.puts @header
|
80
|
+
@body.each do |line|
|
81
|
+
io.puts " #{line}"
|
82
|
+
end
|
83
|
+
io.puts "end"
|
84
|
+
io.string
|
85
|
+
end
|
86
|
+
|
87
|
+
def auto_header
|
88
|
+
env = Utils.rbs_environment
|
89
|
+
if entry = env.class_decls[TypeName(name).absolute!]
|
90
|
+
@header = Content::HeaderBuilder.new(env: env).build(entry: entry)
|
91
|
+
return
|
92
|
+
end
|
93
|
+
|
94
|
+
return unless @header.nil?
|
95
|
+
|
96
|
+
if interface?
|
97
|
+
self.header = "interface #{name}"
|
98
|
+
return
|
99
|
+
end
|
100
|
+
|
101
|
+
val = Object.const_get(name)
|
102
|
+
|
103
|
+
case val
|
104
|
+
when Class
|
105
|
+
superclass =
|
106
|
+
if val.superclass && val.superclass != Object
|
107
|
+
super_module_name = Utils.module_name(val.superclass)
|
108
|
+
|
109
|
+
if super_module_name && super_module_name != "Random::Base" # https://github.com/ruby/rbs/pull/977
|
110
|
+
" < ::#{super_module_name}#{temporary_type_params(super_module_name)}"
|
111
|
+
else
|
112
|
+
nil
|
113
|
+
end
|
114
|
+
else
|
115
|
+
nil
|
116
|
+
end
|
117
|
+
self.header = "class #{Utils.module_name(val)}#{type_params(name)}#{superclass}"
|
118
|
+
when Module
|
119
|
+
self.header = "module #{Utils.module_name(val)}#{type_params(name)}"
|
120
|
+
else
|
121
|
+
raise "#{val.inspect} is not class/module"
|
122
|
+
end
|
83
123
|
end
|
84
124
|
|
85
125
|
private
|
@@ -132,44 +172,6 @@ module Orthoses
|
|
132
172
|
raise
|
133
173
|
end
|
134
174
|
|
135
|
-
def auto_header
|
136
|
-
env = Utils.rbs_environment
|
137
|
-
if entry = env.class_decls[TypeName(name).absolute!]
|
138
|
-
@header = Content::HeaderBuilder.new(env: env).build(entry: entry)
|
139
|
-
return
|
140
|
-
end
|
141
|
-
|
142
|
-
return unless @header.nil?
|
143
|
-
|
144
|
-
if interface?
|
145
|
-
self.header = "interface #{name}"
|
146
|
-
return
|
147
|
-
end
|
148
|
-
|
149
|
-
val = Object.const_get(name)
|
150
|
-
|
151
|
-
case val
|
152
|
-
when Class
|
153
|
-
superclass =
|
154
|
-
if val.superclass && val.superclass != Object
|
155
|
-
super_module_name = Utils.module_name(val.superclass)
|
156
|
-
|
157
|
-
if super_module_name && super_module_name != "Random::Base" # https://github.com/ruby/rbs/pull/977
|
158
|
-
" < ::#{super_module_name}#{temporary_type_params(super_module_name)}"
|
159
|
-
else
|
160
|
-
nil
|
161
|
-
end
|
162
|
-
else
|
163
|
-
nil
|
164
|
-
end
|
165
|
-
self.header = "class #{Utils.module_name(val)}#{type_params(name)}#{superclass}"
|
166
|
-
when Module
|
167
|
-
self.header = "module #{Utils.module_name(val)}#{type_params(name)}"
|
168
|
-
else
|
169
|
-
raise "#{val.inspect} is not class/module"
|
170
|
-
end
|
171
|
-
end
|
172
|
-
|
173
175
|
def temporary_type_params(name)
|
174
176
|
Utils.known_type_params(name)&.then do |params|
|
175
177
|
if params.empty?
|
@@ -6,31 +6,62 @@ module Orthoses
|
|
6
6
|
class CreateFileByName
|
7
7
|
prepend Outputable
|
8
8
|
|
9
|
-
def initialize(loader, base_dir
|
9
|
+
def initialize(loader, base_dir: nil, to: nil, header: nil, if: nil, depth: nil, rmtree: false)
|
10
|
+
unless base_dir.nil?
|
11
|
+
warn "[Orthoses::CreateFileByName] base_dir: option is deprecated. Please use to: option instead."
|
12
|
+
end
|
13
|
+
|
14
|
+
to = to || base_dir
|
15
|
+
unless to
|
16
|
+
raise ArgumentError, "should set to: option"
|
17
|
+
end
|
18
|
+
|
19
|
+
relative_path_from_pwd = Pathname(to).expand_path.relative_path_from(Pathname.pwd).to_s
|
20
|
+
unless relative_path_from_pwd == "." || !relative_path_from_pwd.match?(%r{\A[/\.]})
|
21
|
+
raise ArgumentError, "to=\"#{to}\" should be under current dir=\"#{Pathname.pwd}\"."
|
22
|
+
end
|
23
|
+
|
10
24
|
@loader = loader
|
11
|
-
@
|
25
|
+
@to = to
|
12
26
|
@header = header
|
27
|
+
@depth = depth
|
28
|
+
@rmtree = rmtree
|
13
29
|
@if = binding.local_variable_get(:if)
|
14
30
|
end
|
15
31
|
|
16
32
|
using Utils::Underscore
|
17
33
|
|
18
34
|
def call
|
35
|
+
if @rmtree
|
36
|
+
Orthoses.logger.debug("Remove dir #{@to} since `rmtree: true`")
|
37
|
+
Pathname(@to).rmtree rescue nil
|
38
|
+
end
|
39
|
+
|
19
40
|
store = @loader.call
|
20
41
|
|
21
|
-
store.
|
22
|
-
|
42
|
+
store.select! do |name, content|
|
43
|
+
@if.nil? || @if.call(name, content)
|
44
|
+
end
|
45
|
+
grouped = store.group_by do |name, _|
|
46
|
+
splitted = name.to_s.split('::')
|
47
|
+
(@depth ? splitted[0, @depth] : splitted).join('::')
|
48
|
+
end
|
23
49
|
|
24
|
-
|
50
|
+
grouped.each do |group_name, group|
|
51
|
+
file_path = Pathname("#{@to}/#{group_name.split('::').map(&:underscore).join('/')}.rbs")
|
25
52
|
file_path.dirname.mkpath
|
26
53
|
file_path.open('w+') do |out|
|
27
54
|
if @header
|
28
55
|
out.puts @header
|
29
56
|
out.puts
|
30
57
|
end
|
31
|
-
|
58
|
+
group.sort!
|
59
|
+
contents = group.map do |(name, content)|
|
60
|
+
content.to_rbs
|
61
|
+
end.join("\n")
|
62
|
+
out.puts contents
|
63
|
+
Orthoses.logger.info("Generate file to #{file_path.to_s}")
|
32
64
|
end
|
33
|
-
Orthoses.logger.info("Generate file to #{file_path.to_s}")
|
34
65
|
end
|
35
66
|
end
|
36
67
|
end
|
data/lib/orthoses/filter.rb
CHANGED
@@ -16,8 +16,8 @@ module Orthoses
|
|
16
16
|
def call
|
17
17
|
@loader.call.tap do |store|
|
18
18
|
store.filter! do |name, content|
|
19
|
-
@block.call(name, content).tap do
|
20
|
-
Orthoses.logger.debug("Filter
|
19
|
+
@block.call(name, content).tap do |bool|
|
20
|
+
Orthoses.logger.debug("[Filter] #{bool ? "Pass" : "Reject"} [#{name}]")
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Orthoses
|
4
|
+
class MissingName
|
5
|
+
def initialize(loader)
|
6
|
+
@loader = loader
|
7
|
+
end
|
8
|
+
|
9
|
+
def call
|
10
|
+
@loader.call.tap do |store|
|
11
|
+
MissingClass.new(store).call
|
12
|
+
MissingModule.new(store).call
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
class MissingClass
|
19
|
+
def initialize(store)
|
20
|
+
@store = store
|
21
|
+
end
|
22
|
+
|
23
|
+
def call
|
24
|
+
@store.values.each do |content|
|
25
|
+
recur(content)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def recur(content)
|
32
|
+
content.auto_header
|
33
|
+
if content.header && content.header.include?("<")
|
34
|
+
_, superclass = content.header.split(/\s*<\s*/, 2)
|
35
|
+
superclass.sub!(/\[.*/, "")
|
36
|
+
new_name = TypeName(superclass).relative!.to_s
|
37
|
+
recur(@store[new_name])
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class MissingModule
|
43
|
+
def initialize(store)
|
44
|
+
@store = store
|
45
|
+
end
|
46
|
+
|
47
|
+
def call
|
48
|
+
missings = []
|
49
|
+
@store.keys.each do |key_name|
|
50
|
+
missings.concat split_name(key_name)
|
51
|
+
end
|
52
|
+
missings.uniq!
|
53
|
+
missings.each do |missing|
|
54
|
+
@store[missing].header = "module #{missing}"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def split_name(key_name)
|
61
|
+
ret = []
|
62
|
+
|
63
|
+
type_name = TypeName(key_name).relative!
|
64
|
+
if !Utils.rbs_defined_class?(type_name.to_s) && !@store.has_key?(type_name.to_s)
|
65
|
+
ret << type_name.to_s
|
66
|
+
end
|
67
|
+
|
68
|
+
path = type_name.namespace.path
|
69
|
+
path.each_with_index do |sym, index|
|
70
|
+
name = path[0, index + 1].join("::")
|
71
|
+
next if name.empty?
|
72
|
+
if !Utils.rbs_defined_class?(name) && !@store.has_key?(name)
|
73
|
+
ret << name
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
ret
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
data/lib/orthoses/mixin.rb
CHANGED
@@ -50,6 +50,7 @@ module Orthoses
|
|
50
50
|
|
51
51
|
base_mod_name = Utils.module_name(base_mod)
|
52
52
|
next unless base_mod_name
|
53
|
+
next if base_mod_name.include?("#")
|
53
54
|
|
54
55
|
content = store[base_mod_name]
|
55
56
|
capture.argument[:modules].each do |mod|
|
@@ -58,13 +59,17 @@ module Orthoses
|
|
58
59
|
|
59
60
|
next if mod_name.start_with?("Orthoses")
|
60
61
|
|
61
|
-
|
62
|
-
|
62
|
+
type_params_sig = ""
|
63
|
+
if type_params = Utils.known_type_params(mod)
|
64
|
+
if !type_params.empty?
|
65
|
+
type_params_sig = "[#{type_params.map{"untyped"}.join(", ")}]"
|
66
|
+
end
|
67
|
+
end
|
63
68
|
|
64
69
|
next unless @if.nil? || @if.call(base_mod, how, mod)
|
65
70
|
|
66
|
-
store[mod_name]
|
67
|
-
content << "#{how} #{mod_name}"
|
71
|
+
store[mod_name].header = "module #{mod_name}"
|
72
|
+
content << "#{how} #{mod_name}#{type_params_sig}"
|
68
73
|
end
|
69
74
|
end
|
70
75
|
end
|
@@ -1,11 +1,23 @@
|
|
1
1
|
module Orthoses
|
2
2
|
# Call `rbs prototype rb` and add to store
|
3
3
|
# use Orthoses::RBSPrototypeRB,
|
4
|
-
# paths: Dir.glob("lib/**/*.rb")
|
4
|
+
# paths: Dir.glob("lib/**/*.rb"),
|
5
|
+
# method_definition_filter: ->(member) { false },
|
6
|
+
# alias_filter: ->(member) { false }
|
5
7
|
class RBSPrototypeRB
|
6
|
-
def initialize(
|
8
|
+
def initialize(
|
9
|
+
loader,
|
10
|
+
paths:,
|
11
|
+
method_definition_filter: nil,
|
12
|
+
alias_filter: nil,
|
13
|
+
constant_filter: nil,
|
14
|
+
mixin_filter: nil,
|
15
|
+
attribute_filter: nil
|
16
|
+
)
|
7
17
|
@loader = loader
|
8
18
|
@paths = paths
|
19
|
+
@method_definition_filter = method_definition_filter
|
20
|
+
@alias_filter = alias_filter
|
9
21
|
@constant_filter = constant_filter
|
10
22
|
@mixin_filter = mixin_filter
|
11
23
|
@attribute_filter = attribute_filter
|
@@ -23,6 +35,8 @@ module Orthoses
|
|
23
35
|
end
|
24
36
|
end
|
25
37
|
env = Orthoses::Content::Environment.new(
|
38
|
+
method_definition_filter: @method_definition_filter,
|
39
|
+
alias_filter: @alias_filter,
|
26
40
|
constant_filter: @constant_filter,
|
27
41
|
mixin_filter: @mixin_filter,
|
28
42
|
attribute_filter: @attribute_filter,
|
@@ -3,14 +3,33 @@ module Orthoses
|
|
3
3
|
# use Orthoses::RBSPrototypeRuntime,
|
4
4
|
# patterns: ['Foo::*']
|
5
5
|
class RBSPrototypeRuntime
|
6
|
-
def initialize(
|
6
|
+
def initialize(
|
7
|
+
loader,
|
8
|
+
patterns:,
|
9
|
+
method_definition_filter: nil,
|
10
|
+
alias_filter: nil,
|
11
|
+
constant_filter: nil,
|
12
|
+
mixin_filter: nil,
|
13
|
+
attribute_filter: nil
|
14
|
+
)
|
7
15
|
@loader = loader
|
8
16
|
@patterns = patterns
|
17
|
+
@method_definition_filter = method_definition_filter
|
18
|
+
@alias_filter = alias_filter
|
19
|
+
@constant_filter = constant_filter
|
20
|
+
@mixin_filter = mixin_filter
|
21
|
+
@attribute_filter = attribute_filter
|
9
22
|
end
|
10
23
|
|
11
24
|
def call
|
12
25
|
@loader.call.tap do |store|
|
13
|
-
content_env = Orthoses::Content::Environment.new
|
26
|
+
content_env = Orthoses::Content::Environment.new(
|
27
|
+
method_definition_filter: @method_definition_filter,
|
28
|
+
alias_filter: @alias_filter,
|
29
|
+
constant_filter: @constant_filter,
|
30
|
+
mixin_filter: @mixin_filter,
|
31
|
+
attribute_filter: @attribute_filter,
|
32
|
+
)
|
14
33
|
|
15
34
|
patterns = @patterns
|
16
35
|
env = RBS::Environment.new
|
data/lib/orthoses/utils.rb
CHANGED
data/lib/orthoses/version.rb
CHANGED
data/lib/orthoses.rb
CHANGED
@@ -17,6 +17,7 @@ module Orthoses
|
|
17
17
|
autoload :Mixin, 'orthoses/mixin'
|
18
18
|
autoload :LazyTracePoint, 'orthoses/lazy_trace_point'
|
19
19
|
autoload :LoadRBS, 'orthoses/load_rbs'
|
20
|
+
autoload :MissingName, 'orthoses/missing_name'
|
20
21
|
autoload :ObjectSpaceAll, 'orthoses/object_space_all'
|
21
22
|
autoload :Outputable, 'orthoses/outputable'
|
22
23
|
autoload :PathHelper, 'orthoses/path_helper'
|
data/sig/orthoses/_call.rbs
CHANGED
data/sig/orthoses/attribute.rbs
CHANGED