steep-relaxed 1.9.3.3
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 +7 -0
- data/.gitignore +13 -0
- data/.gitmodules +0 -0
- data/CHANGELOG.md +1032 -0
- data/LICENSE +21 -0
- data/README.md +260 -0
- data/Rakefile +227 -0
- data/STDGEM_DEPENDENCIES.txt +59 -0
- data/Steepfile +68 -0
- data/bin/console +14 -0
- data/bin/generate-diagnostics-docs.rb +112 -0
- data/bin/mem_graph.rb +67 -0
- data/bin/mem_prof.rb +102 -0
- data/bin/output_rebaseline.rb +34 -0
- data/bin/output_test.rb +60 -0
- data/bin/rbs +20 -0
- data/bin/rbs-inline +19 -0
- data/bin/setup +9 -0
- data/bin/stackprof_test.rb +19 -0
- data/bin/steep +19 -0
- data/bin/steep-check.rb +251 -0
- data/bin/steep-prof +16 -0
- data/doc/narrowing.md +195 -0
- data/doc/shape.md +194 -0
- data/exe/steep +18 -0
- data/guides/README.md +5 -0
- data/guides/src/gem-rbs-collection/gem-rbs-collection.md +126 -0
- data/guides/src/getting-started/getting-started.md +163 -0
- data/guides/src/nil-optional/nil-optional.md +195 -0
- data/lib/steep/annotation_parser.rb +199 -0
- data/lib/steep/ast/annotation/collection.rb +172 -0
- data/lib/steep/ast/annotation.rb +137 -0
- data/lib/steep/ast/builtin.rb +104 -0
- data/lib/steep/ast/ignore.rb +148 -0
- data/lib/steep/ast/node/type_application.rb +88 -0
- data/lib/steep/ast/node/type_assertion.rb +81 -0
- data/lib/steep/ast/types/any.rb +35 -0
- data/lib/steep/ast/types/boolean.rb +45 -0
- data/lib/steep/ast/types/bot.rb +35 -0
- data/lib/steep/ast/types/class.rb +43 -0
- data/lib/steep/ast/types/factory.rb +557 -0
- data/lib/steep/ast/types/helper.rb +40 -0
- data/lib/steep/ast/types/instance.rb +42 -0
- data/lib/steep/ast/types/intersection.rb +93 -0
- data/lib/steep/ast/types/literal.rb +59 -0
- data/lib/steep/ast/types/logic.rb +84 -0
- data/lib/steep/ast/types/name.rb +128 -0
- data/lib/steep/ast/types/nil.rb +41 -0
- data/lib/steep/ast/types/proc.rb +117 -0
- data/lib/steep/ast/types/record.rb +79 -0
- data/lib/steep/ast/types/self.rb +43 -0
- data/lib/steep/ast/types/shared_instance.rb +11 -0
- data/lib/steep/ast/types/top.rb +35 -0
- data/lib/steep/ast/types/tuple.rb +60 -0
- data/lib/steep/ast/types/union.rb +97 -0
- data/lib/steep/ast/types/var.rb +65 -0
- data/lib/steep/ast/types/void.rb +35 -0
- data/lib/steep/cli.rb +401 -0
- data/lib/steep/diagnostic/deprecated/else_on_exhaustive_case.rb +20 -0
- data/lib/steep/diagnostic/deprecated/unknown_constant_assigned.rb +28 -0
- data/lib/steep/diagnostic/helper.rb +18 -0
- data/lib/steep/diagnostic/lsp_formatter.rb +78 -0
- data/lib/steep/diagnostic/result_printer2.rb +48 -0
- data/lib/steep/diagnostic/ruby.rb +1221 -0
- data/lib/steep/diagnostic/signature.rb +570 -0
- data/lib/steep/drivers/annotations.rb +52 -0
- data/lib/steep/drivers/check.rb +339 -0
- data/lib/steep/drivers/checkfile.rb +210 -0
- data/lib/steep/drivers/diagnostic_printer.rb +105 -0
- data/lib/steep/drivers/init.rb +66 -0
- data/lib/steep/drivers/langserver.rb +56 -0
- data/lib/steep/drivers/print_project.rb +113 -0
- data/lib/steep/drivers/stats.rb +203 -0
- data/lib/steep/drivers/utils/driver_helper.rb +143 -0
- data/lib/steep/drivers/utils/jobs_option.rb +26 -0
- data/lib/steep/drivers/vendor.rb +27 -0
- data/lib/steep/drivers/watch.rb +194 -0
- data/lib/steep/drivers/worker.rb +58 -0
- data/lib/steep/equatable.rb +23 -0
- data/lib/steep/expectations.rb +228 -0
- data/lib/steep/index/rbs_index.rb +350 -0
- data/lib/steep/index/signature_symbol_provider.rb +185 -0
- data/lib/steep/index/source_index.rb +167 -0
- data/lib/steep/interface/block.rb +103 -0
- data/lib/steep/interface/builder.rb +843 -0
- data/lib/steep/interface/function.rb +1090 -0
- data/lib/steep/interface/method_type.rb +330 -0
- data/lib/steep/interface/shape.rb +239 -0
- data/lib/steep/interface/substitution.rb +159 -0
- data/lib/steep/interface/type_param.rb +115 -0
- data/lib/steep/located_value.rb +20 -0
- data/lib/steep/method_name.rb +42 -0
- data/lib/steep/module_helper.rb +24 -0
- data/lib/steep/node_helper.rb +273 -0
- data/lib/steep/path_helper.rb +30 -0
- data/lib/steep/project/dsl.rb +268 -0
- data/lib/steep/project/group.rb +31 -0
- data/lib/steep/project/options.rb +63 -0
- data/lib/steep/project/pattern.rb +59 -0
- data/lib/steep/project/target.rb +92 -0
- data/lib/steep/project.rb +78 -0
- data/lib/steep/rake_task.rb +132 -0
- data/lib/steep/range_extension.rb +29 -0
- data/lib/steep/server/base_worker.rb +97 -0
- data/lib/steep/server/change_buffer.rb +73 -0
- data/lib/steep/server/custom_methods.rb +77 -0
- data/lib/steep/server/delay_queue.rb +45 -0
- data/lib/steep/server/interaction_worker.rb +492 -0
- data/lib/steep/server/lsp_formatter.rb +455 -0
- data/lib/steep/server/master.rb +922 -0
- data/lib/steep/server/target_group_files.rb +205 -0
- data/lib/steep/server/type_check_controller.rb +366 -0
- data/lib/steep/server/type_check_worker.rb +303 -0
- data/lib/steep/server/work_done_progress.rb +64 -0
- data/lib/steep/server/worker_process.rb +176 -0
- data/lib/steep/services/completion_provider.rb +802 -0
- data/lib/steep/services/content_change.rb +61 -0
- data/lib/steep/services/file_loader.rb +74 -0
- data/lib/steep/services/goto_service.rb +441 -0
- data/lib/steep/services/hover_provider/rbs.rb +88 -0
- data/lib/steep/services/hover_provider/ruby.rb +221 -0
- data/lib/steep/services/hover_provider/singleton_methods.rb +20 -0
- data/lib/steep/services/path_assignment.rb +46 -0
- data/lib/steep/services/signature_help_provider.rb +202 -0
- data/lib/steep/services/signature_service.rb +428 -0
- data/lib/steep/services/stats_calculator.rb +68 -0
- data/lib/steep/services/type_check_service.rb +394 -0
- data/lib/steep/services/type_name_completion.rb +236 -0
- data/lib/steep/signature/validator.rb +651 -0
- data/lib/steep/source/ignore_ranges.rb +69 -0
- data/lib/steep/source.rb +691 -0
- data/lib/steep/subtyping/cache.rb +30 -0
- data/lib/steep/subtyping/check.rb +1113 -0
- data/lib/steep/subtyping/constraints.rb +341 -0
- data/lib/steep/subtyping/relation.rb +101 -0
- data/lib/steep/subtyping/result.rb +324 -0
- data/lib/steep/subtyping/variable_variance.rb +89 -0
- data/lib/steep/test.rb +9 -0
- data/lib/steep/thread_waiter.rb +43 -0
- data/lib/steep/type_construction.rb +5183 -0
- data/lib/steep/type_inference/block_params.rb +416 -0
- data/lib/steep/type_inference/case_when.rb +303 -0
- data/lib/steep/type_inference/constant_env.rb +56 -0
- data/lib/steep/type_inference/context.rb +195 -0
- data/lib/steep/type_inference/logic_type_interpreter.rb +613 -0
- data/lib/steep/type_inference/method_call.rb +193 -0
- data/lib/steep/type_inference/method_params.rb +531 -0
- data/lib/steep/type_inference/multiple_assignment.rb +194 -0
- data/lib/steep/type_inference/send_args.rb +712 -0
- data/lib/steep/type_inference/type_env.rb +341 -0
- data/lib/steep/type_inference/type_env_builder.rb +138 -0
- data/lib/steep/typing.rb +321 -0
- data/lib/steep/version.rb +3 -0
- data/lib/steep.rb +369 -0
- data/manual/annotations.md +181 -0
- data/manual/ignore.md +20 -0
- data/manual/ruby-diagnostics.md +1879 -0
- data/sample/Steepfile +22 -0
- data/sample/lib/conference.rb +49 -0
- data/sample/lib/length.rb +35 -0
- data/sample/sig/conference.rbs +42 -0
- data/sample/sig/generics.rbs +15 -0
- data/sample/sig/length.rbs +34 -0
- data/steep-relaxed.gemspec +56 -0
- metadata +340 -0
@@ -0,0 +1,268 @@
|
|
1
|
+
module Steep
|
2
|
+
class Project
|
3
|
+
class DSL
|
4
|
+
module LibraryOptions
|
5
|
+
attr_reader :stdlib_root
|
6
|
+
attr_reader :core_root
|
7
|
+
attr_reader :collection_config_path
|
8
|
+
|
9
|
+
def stdlib_path(core_root:, stdlib_root:)
|
10
|
+
@core_root = Pathname(core_root)
|
11
|
+
@stdlib_root = Pathname(stdlib_root)
|
12
|
+
end
|
13
|
+
|
14
|
+
def repo_path(*paths)
|
15
|
+
@library_configured = true
|
16
|
+
repo_paths.push(*paths.map {|s| Pathname(s) })
|
17
|
+
end
|
18
|
+
|
19
|
+
def collection_config(path)
|
20
|
+
@library_configured = true
|
21
|
+
@collection_config_path = project.absolute_path(path)
|
22
|
+
end
|
23
|
+
|
24
|
+
def disable_collection
|
25
|
+
@library_configured = true
|
26
|
+
@collection_config_path = false
|
27
|
+
end
|
28
|
+
|
29
|
+
def library(*args)
|
30
|
+
@library_configured = true
|
31
|
+
libraries.push(*args)
|
32
|
+
end
|
33
|
+
|
34
|
+
def repo_paths
|
35
|
+
@repo_paths ||= []
|
36
|
+
end
|
37
|
+
|
38
|
+
def libraries
|
39
|
+
@libraries ||= []
|
40
|
+
end
|
41
|
+
|
42
|
+
def library_configured?
|
43
|
+
@library_configured
|
44
|
+
end
|
45
|
+
|
46
|
+
def to_library_options
|
47
|
+
config_path =
|
48
|
+
case collection_config_path
|
49
|
+
when Pathname
|
50
|
+
collection_config_path
|
51
|
+
when nil
|
52
|
+
default = project.absolute_path(RBS::Collection::Config::PATH)
|
53
|
+
if default.file?
|
54
|
+
default
|
55
|
+
end
|
56
|
+
when false
|
57
|
+
nil
|
58
|
+
end
|
59
|
+
|
60
|
+
Options.new.tap do |options|
|
61
|
+
options.libraries.push(*libraries)
|
62
|
+
options.paths = Options::PathOptions.new(
|
63
|
+
core_root: core_root,
|
64
|
+
stdlib_root: stdlib_root,
|
65
|
+
repo_paths: repo_paths
|
66
|
+
)
|
67
|
+
options.collection_config_path = config_path
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
module WithPattern
|
73
|
+
def check(*args)
|
74
|
+
sources.concat(args)
|
75
|
+
end
|
76
|
+
|
77
|
+
def ignore(*args)
|
78
|
+
ignored_sources.concat(args)
|
79
|
+
end
|
80
|
+
|
81
|
+
def signature(*args)
|
82
|
+
signatures.concat(args)
|
83
|
+
end
|
84
|
+
|
85
|
+
def ignore_signature(*args)
|
86
|
+
ignored_signatures.concat(args)
|
87
|
+
end
|
88
|
+
|
89
|
+
def sources
|
90
|
+
@sources ||= []
|
91
|
+
end
|
92
|
+
|
93
|
+
def ignored_sources
|
94
|
+
@ignored_sources ||= []
|
95
|
+
end
|
96
|
+
|
97
|
+
def signatures
|
98
|
+
@signatures ||= []
|
99
|
+
end
|
100
|
+
|
101
|
+
def ignored_signatures
|
102
|
+
@ignored_signatures ||= []
|
103
|
+
end
|
104
|
+
|
105
|
+
def source_pattern
|
106
|
+
Pattern.new(patterns: sources, ignores: ignored_sources, ext: ".rb")
|
107
|
+
end
|
108
|
+
|
109
|
+
def signature_pattern
|
110
|
+
Pattern.new(patterns: signatures, ignores: ignored_signatures, ext: ".rbs")
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
class TargetDSL
|
115
|
+
include LibraryOptions
|
116
|
+
include WithPattern
|
117
|
+
|
118
|
+
attr_reader :name
|
119
|
+
attr_reader :project
|
120
|
+
attr_reader :unreferenced
|
121
|
+
attr_reader :groups
|
122
|
+
attr_reader :implicitly_returns_nil
|
123
|
+
|
124
|
+
def initialize(name, project:)
|
125
|
+
@name = name
|
126
|
+
@core_root = nil
|
127
|
+
@stdlib_root = nil
|
128
|
+
@project = project
|
129
|
+
@collection_config_path = collection_config_path
|
130
|
+
@unreferenced = false
|
131
|
+
@implicitly_returns_nil = false
|
132
|
+
@groups = []
|
133
|
+
end
|
134
|
+
|
135
|
+
def initialize_copy(other)
|
136
|
+
@name = other.name
|
137
|
+
@libraries = other.libraries.dup
|
138
|
+
@sources = other.sources.dup
|
139
|
+
@signatures = other.signatures.dup
|
140
|
+
@ignored_sources = other.ignored_sources.dup
|
141
|
+
@ignored_signatures = other.ignored_signatures.dup
|
142
|
+
@repo_paths = other.repo_paths.dup
|
143
|
+
@core_root = other.core_root
|
144
|
+
@stdlib_root = other.stdlib_root
|
145
|
+
@code_diagnostics_config = other.code_diagnostics_config.dup
|
146
|
+
@project = other.project
|
147
|
+
@collection_config_path = other.collection_config_path
|
148
|
+
@unreferenced = other.unreferenced
|
149
|
+
@implicitly_returns_nil = other.implicitly_returns_nil
|
150
|
+
@groups = other.groups.dup
|
151
|
+
end
|
152
|
+
|
153
|
+
def unreferenced!(value = true)
|
154
|
+
@unreferenced = value
|
155
|
+
end
|
156
|
+
|
157
|
+
def implicitly_returns_nil!(value = true)
|
158
|
+
@implicitly_returns_nil = value
|
159
|
+
end
|
160
|
+
|
161
|
+
def configure_code_diagnostics(hash = nil)
|
162
|
+
if hash
|
163
|
+
code_diagnostics_config.merge!(hash)
|
164
|
+
end
|
165
|
+
|
166
|
+
yield code_diagnostics_config if block_given?
|
167
|
+
end
|
168
|
+
|
169
|
+
def code_diagnostics_config
|
170
|
+
@code_diagnostics_config ||= Diagnostic::Ruby.default.dup
|
171
|
+
end
|
172
|
+
|
173
|
+
def group(name, &block)
|
174
|
+
name = name.to_str.to_sym unless Symbol === name
|
175
|
+
group = GroupDSL.new(name, self)
|
176
|
+
|
177
|
+
Steep.logger.tagged "group=#{name}" do
|
178
|
+
group.instance_exec(&block) if block
|
179
|
+
end
|
180
|
+
|
181
|
+
groups << group
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
class GroupDSL
|
186
|
+
include WithPattern
|
187
|
+
|
188
|
+
attr_reader :name
|
189
|
+
|
190
|
+
attr_reader :target
|
191
|
+
|
192
|
+
attr_reader :code_diagnostics_config
|
193
|
+
|
194
|
+
def initialize(name, target)
|
195
|
+
@name = name
|
196
|
+
@target = target
|
197
|
+
end
|
198
|
+
|
199
|
+
def configure_code_diagnostics(config = nil)
|
200
|
+
if block_given?
|
201
|
+
if code_diagnostics_config
|
202
|
+
if config
|
203
|
+
code_diagnostics_config.merge!(config)
|
204
|
+
end
|
205
|
+
else
|
206
|
+
@code_diagnostics_config = (config || target.code_diagnostics_config).dup
|
207
|
+
end
|
208
|
+
|
209
|
+
yield (code_diagnostics_config || raise)
|
210
|
+
else
|
211
|
+
@code_diagnostics_config = config&.dup
|
212
|
+
end
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
include LibraryOptions
|
217
|
+
|
218
|
+
attr_reader :project
|
219
|
+
|
220
|
+
def initialize(project:)
|
221
|
+
@project = project
|
222
|
+
end
|
223
|
+
|
224
|
+
def self.parse(project, code, filename: "Steepfile")
|
225
|
+
Steep.logger.tagged filename do
|
226
|
+
dsl = self.new(project: project)
|
227
|
+
dsl.instance_eval(code, filename)
|
228
|
+
project.global_options = dsl.to_library_options
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
def self.eval(project, &block)
|
233
|
+
Steep.logger.tagged "DSL.eval" do
|
234
|
+
dsl = self.new(project: project)
|
235
|
+
dsl.instance_exec(&block)
|
236
|
+
project.global_options = dsl.to_library_options
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
def target(name, &block)
|
241
|
+
name = name.to_str.to_sym unless Symbol === name
|
242
|
+
dsl = TargetDSL.new(name, project: project)
|
243
|
+
|
244
|
+
Steep.logger.tagged "target=#{name}" do
|
245
|
+
dsl.instance_eval(&block) if block
|
246
|
+
end
|
247
|
+
|
248
|
+
target = Project::Target.new(
|
249
|
+
name: dsl.name,
|
250
|
+
source_pattern: dsl.source_pattern,
|
251
|
+
signature_pattern: dsl.signature_pattern,
|
252
|
+
options: dsl.library_configured? ? dsl.to_library_options : nil,
|
253
|
+
code_diagnostics_config: dsl.code_diagnostics_config,
|
254
|
+
project: project,
|
255
|
+
unreferenced: dsl.unreferenced,
|
256
|
+
implicitly_returns_nil: dsl.implicitly_returns_nil
|
257
|
+
)
|
258
|
+
|
259
|
+
dsl.groups.each do
|
260
|
+
group = Group.new(target, _1.name, _1.source_pattern, _1.signature_pattern, _1.code_diagnostics_config || target.code_diagnostics_config)
|
261
|
+
target.groups << group
|
262
|
+
end
|
263
|
+
|
264
|
+
project.targets << target
|
265
|
+
end
|
266
|
+
end
|
267
|
+
end
|
268
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Steep
|
2
|
+
class Project
|
3
|
+
class Group
|
4
|
+
attr_reader :name
|
5
|
+
attr_reader :source_pattern
|
6
|
+
attr_reader :signature_pattern
|
7
|
+
attr_reader :target
|
8
|
+
attr_reader :code_diagnostics_config
|
9
|
+
|
10
|
+
def initialize(target, name, source_pattern, signature_pattern, code_diagnostics_config)
|
11
|
+
@target = target
|
12
|
+
@name = name
|
13
|
+
@source_pattern = source_pattern
|
14
|
+
@signature_pattern = signature_pattern
|
15
|
+
@code_diagnostics_config = code_diagnostics_config
|
16
|
+
end
|
17
|
+
|
18
|
+
def project
|
19
|
+
target.project
|
20
|
+
end
|
21
|
+
|
22
|
+
def possible_source_file?(path)
|
23
|
+
source_pattern =~ path
|
24
|
+
end
|
25
|
+
|
26
|
+
def possible_signature_file?(path)
|
27
|
+
signature_pattern =~ path
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module Steep
|
2
|
+
class Project
|
3
|
+
class Options
|
4
|
+
PathOptions = _ = Struct.new(:core_root, :stdlib_root, :repo_paths, keyword_init: true) do
|
5
|
+
# @implements PathOptions
|
6
|
+
|
7
|
+
def customized_stdlib?
|
8
|
+
stdlib_root != nil
|
9
|
+
end
|
10
|
+
|
11
|
+
def customized_core?
|
12
|
+
core_root != nil
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
attr_reader :libraries
|
17
|
+
attr_accessor :paths
|
18
|
+
attr_accessor :collection_config_path
|
19
|
+
|
20
|
+
def initialize
|
21
|
+
@paths = PathOptions.new(repo_paths: [])
|
22
|
+
@libraries = []
|
23
|
+
end
|
24
|
+
|
25
|
+
def collection_lock_path
|
26
|
+
if collection_config_path
|
27
|
+
RBS::Collection::Config.to_lockfile_path(collection_config_path)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def load_collection_lock(force: false)
|
32
|
+
@collection_lock = nil if force
|
33
|
+
@collection_lock ||=
|
34
|
+
if collection_config_path && collection_lock_path
|
35
|
+
case
|
36
|
+
when !collection_config_path.file?
|
37
|
+
collection_config_path
|
38
|
+
when !collection_lock_path.file?
|
39
|
+
collection_lock_path
|
40
|
+
else
|
41
|
+
begin
|
42
|
+
content = YAML.load_file(collection_lock_path)
|
43
|
+
lock_file = RBS::Collection::Config::Lockfile.from_lockfile(lockfile_path: collection_lock_path, data: content)
|
44
|
+
lock_file.check_rbs_availability!
|
45
|
+
lock_file
|
46
|
+
rescue YAML::SyntaxError, RBS::Collection::Config::CollectionNotAvailable => exn
|
47
|
+
exn
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def collection_lock
|
54
|
+
case config = load_collection_lock()
|
55
|
+
when RBS::Collection::Config::Lockfile
|
56
|
+
config
|
57
|
+
else
|
58
|
+
nil
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Steep
|
2
|
+
class Project
|
3
|
+
class Pattern
|
4
|
+
attr_reader :patterns
|
5
|
+
attr_reader :ignores
|
6
|
+
attr_reader :prefixes
|
7
|
+
attr_reader :ignore_prefixes
|
8
|
+
attr_reader :ext
|
9
|
+
|
10
|
+
def initialize(patterns:, ignores: [], ext:)
|
11
|
+
@patterns = patterns
|
12
|
+
@ignores = ignores
|
13
|
+
@ext = ext
|
14
|
+
|
15
|
+
@prefixes = patterns.map do |pat|
|
16
|
+
if pat == "." || pat == "./"
|
17
|
+
""
|
18
|
+
else
|
19
|
+
pat.delete_prefix("./").delete_suffix(File::Separator) << File::Separator
|
20
|
+
end
|
21
|
+
end
|
22
|
+
@ignore_prefixes = ignores.map do |pat|
|
23
|
+
if pat == "." || pat == "./"
|
24
|
+
""
|
25
|
+
else
|
26
|
+
pat.delete_prefix("./").delete_suffix(File::Separator) << File::Separator
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def =~(path)
|
32
|
+
unless path.is_a?(Pathname)
|
33
|
+
path = Pathname(path.to_s)
|
34
|
+
end
|
35
|
+
|
36
|
+
match?(path) && !ignore?(path)
|
37
|
+
end
|
38
|
+
|
39
|
+
def match?(path)
|
40
|
+
test_string(path, patterns, prefixes)
|
41
|
+
end
|
42
|
+
|
43
|
+
def ignore?(path)
|
44
|
+
test_string(path, ignores, ignore_prefixes)
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_string(path, patterns, prefixes)
|
48
|
+
string = path.to_s
|
49
|
+
|
50
|
+
patterns.any? {|pat| File.fnmatch(pat, string, File::FNM_PATHNAME) } ||
|
51
|
+
prefixes.any? {|prefix| File.fnmatch("#{prefix}**/*#{ext}", string, File::FNM_PATHNAME) }
|
52
|
+
end
|
53
|
+
|
54
|
+
def empty?
|
55
|
+
patterns.empty?
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
module Steep
|
2
|
+
class Project
|
3
|
+
class Target
|
4
|
+
attr_reader :name
|
5
|
+
attr_reader :target_options
|
6
|
+
|
7
|
+
attr_reader :source_pattern
|
8
|
+
attr_reader :signature_pattern
|
9
|
+
attr_reader :code_diagnostics_config
|
10
|
+
attr_reader :project
|
11
|
+
attr_reader :unreferenced
|
12
|
+
attr_reader :groups
|
13
|
+
attr_reader :implicitly_returns_nil
|
14
|
+
|
15
|
+
def initialize(name:, options:, source_pattern:, signature_pattern:, code_diagnostics_config:, project:, unreferenced:, implicitly_returns_nil:)
|
16
|
+
@name = name
|
17
|
+
@target_options = options
|
18
|
+
@source_pattern = source_pattern
|
19
|
+
@signature_pattern = signature_pattern
|
20
|
+
@code_diagnostics_config = code_diagnostics_config
|
21
|
+
@project = project
|
22
|
+
@unreferenced = unreferenced
|
23
|
+
@groups = []
|
24
|
+
@implicitly_returns_nil = implicitly_returns_nil
|
25
|
+
end
|
26
|
+
|
27
|
+
def options
|
28
|
+
target_options || project.global_options
|
29
|
+
end
|
30
|
+
|
31
|
+
def possible_source_file?(path)
|
32
|
+
if target = groups.find { _1.possible_source_file?(path) }
|
33
|
+
return target
|
34
|
+
end
|
35
|
+
|
36
|
+
if source_pattern =~ path
|
37
|
+
return self
|
38
|
+
end
|
39
|
+
|
40
|
+
nil
|
41
|
+
end
|
42
|
+
|
43
|
+
def possible_signature_file?(path)
|
44
|
+
if target = groups.find { _1.possible_signature_file?(path) }
|
45
|
+
return target
|
46
|
+
end
|
47
|
+
|
48
|
+
if signature_pattern =~ path
|
49
|
+
return self
|
50
|
+
end
|
51
|
+
|
52
|
+
nil
|
53
|
+
end
|
54
|
+
|
55
|
+
def new_env_loader()
|
56
|
+
Target.construct_env_loader(options: options, project: project)
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.construct_env_loader(options:, project:)
|
60
|
+
repo = RBS::Repository.new(no_stdlib: options.paths.customized_stdlib?)
|
61
|
+
|
62
|
+
if options.paths.stdlib_root
|
63
|
+
repo.add(project.absolute_path(options.paths.stdlib_root))
|
64
|
+
end
|
65
|
+
|
66
|
+
options.paths.repo_paths.each do |path|
|
67
|
+
repo.add(project.absolute_path(path))
|
68
|
+
end
|
69
|
+
|
70
|
+
core_root_path =
|
71
|
+
if options.paths.customized_core?
|
72
|
+
if options.paths.core_root
|
73
|
+
project.absolute_path(options.paths.core_root)
|
74
|
+
end
|
75
|
+
else
|
76
|
+
RBS::EnvironmentLoader::DEFAULT_CORE_ROOT
|
77
|
+
end
|
78
|
+
|
79
|
+
loader = RBS::EnvironmentLoader.new(core_root: core_root_path, repository: repo)
|
80
|
+
|
81
|
+
options.libraries.each do |lib|
|
82
|
+
name, version = lib.split(/:/, 2)
|
83
|
+
name or raise
|
84
|
+
loader.add(library: name, version: version)
|
85
|
+
end
|
86
|
+
loader.add_collection(options.collection_lock) if options.collection_lock
|
87
|
+
|
88
|
+
loader
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
module Steep
|
2
|
+
class Project
|
3
|
+
attr_reader :targets
|
4
|
+
attr_reader :steepfile_path
|
5
|
+
attr_reader :base_dir
|
6
|
+
attr_accessor :global_options
|
7
|
+
|
8
|
+
def initialize(steepfile_path:, base_dir: nil)
|
9
|
+
@targets = []
|
10
|
+
@steepfile_path = steepfile_path
|
11
|
+
@base_dir = if base_dir
|
12
|
+
base_dir
|
13
|
+
elsif steepfile_path
|
14
|
+
steepfile_path.parent
|
15
|
+
else
|
16
|
+
raise ArgumentError, "Project#initialize(base_dir:): neither base_dir nor steepfile_path given"
|
17
|
+
end
|
18
|
+
|
19
|
+
if steepfile_path and !steepfile_path.absolute?
|
20
|
+
raise ArgumentError, "Project#initialize(steepfile_path:): steepfile_path should be absolute path"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def relative_path(path)
|
25
|
+
path.relative_path_from(base_dir)
|
26
|
+
rescue ArgumentError
|
27
|
+
path
|
28
|
+
end
|
29
|
+
|
30
|
+
def absolute_path(path)
|
31
|
+
(base_dir + path).cleanpath
|
32
|
+
end
|
33
|
+
|
34
|
+
def group_for_source_path(path)
|
35
|
+
path = relative_path(path)
|
36
|
+
targets.each do |target|
|
37
|
+
ret = target.possible_source_file?(path)
|
38
|
+
return ret if ret
|
39
|
+
end
|
40
|
+
nil
|
41
|
+
end
|
42
|
+
|
43
|
+
def group_for_path(path)
|
44
|
+
group_for_source_path(path) || group_for_signature_path(path)
|
45
|
+
end
|
46
|
+
|
47
|
+
def group_for_signature_path(path)
|
48
|
+
relative = relative_path(path)
|
49
|
+
targets.each do
|
50
|
+
ret = _1.possible_signature_file?(relative)
|
51
|
+
return ret if ret
|
52
|
+
end
|
53
|
+
nil
|
54
|
+
end
|
55
|
+
|
56
|
+
def target_for_source_path(path)
|
57
|
+
case group = group_for_source_path(path)
|
58
|
+
when Target
|
59
|
+
group
|
60
|
+
when Group
|
61
|
+
group.target
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def target_for_signature_path(path)
|
66
|
+
case group = group_for_signature_path(path)
|
67
|
+
when Target
|
68
|
+
group
|
69
|
+
when Group
|
70
|
+
group.target
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def target_for_path(path)
|
75
|
+
target_for_source_path(path) || target_for_signature_path(path)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|