steep 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +1 -0
- data/CHANGELOG.md +6 -0
- data/lib/steep.rb +11 -5
- data/lib/steep/cli.rb +66 -11
- data/lib/steep/drivers/check.rb +0 -4
- data/lib/steep/drivers/langserver.rb +166 -0
- data/lib/steep/drivers/validate.rb +0 -5
- data/lib/steep/project.rb +23 -0
- data/lib/steep/project/file.rb +3 -0
- data/lib/steep/source.rb +24 -0
- data/lib/steep/type_construction.rb +2 -2
- data/lib/steep/version.rb +1 -1
- data/sig/project.rbi +3 -0
- data/steep.gemspec +1 -0
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5e0677b34af6d2b65ac33be3c60d126d689e10d3b9fb7eff598b33dabda2dc98
|
4
|
+
data.tar.gz: f126e4ed9b28c55bad922282b280b51a350e0cbc77d25192553437fe0f392917
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '0940b5f73af0ae31a8b310825e402caf784e9327982122b5e2b19f29ce69ddd4dd4dadf7f07bf93d150cecae2c4ffcb3faa6b237ece6d3653482a1dce12930fe'
|
7
|
+
data.tar.gz: b3fa66639c3ae93d475e6d12b965b526f633c31e244043f22e1c32c5d140e51568602c5087cc85247068010547d0dc4353f78f61c9d7093aefd8933b4b5b2186
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/lib/steep.rb
CHANGED
@@ -9,6 +9,7 @@ require "active_support/tagged_logging"
|
|
9
9
|
require "rainbow"
|
10
10
|
require "listen"
|
11
11
|
require 'pry'
|
12
|
+
require 'language_server-protocol'
|
12
13
|
|
13
14
|
require "steep/ast/namespace"
|
14
15
|
require "steep/names"
|
@@ -85,6 +86,7 @@ require "steep/drivers/annotations"
|
|
85
86
|
require "steep/drivers/scaffold"
|
86
87
|
require "steep/drivers/print_interface"
|
87
88
|
require "steep/drivers/watch"
|
89
|
+
require "steep/drivers/langserver"
|
88
90
|
|
89
91
|
if ENV["NO_COLOR"]
|
90
92
|
Rainbow.enabled = false
|
@@ -92,12 +94,16 @@ end
|
|
92
94
|
|
93
95
|
module Steep
|
94
96
|
def self.logger
|
95
|
-
unless @logger
|
96
|
-
@logger = ActiveSupport::TaggedLogging.new(Logger.new(STDERR))
|
97
|
-
@logger.push_tags "Steep #{VERSION}"
|
98
|
-
@logger.level = Logger::WARN
|
99
|
-
end
|
97
|
+
self.log_output = STDERR unless @logger
|
100
98
|
|
101
99
|
@logger
|
102
100
|
end
|
101
|
+
|
102
|
+
def self.log_output=(output)
|
103
|
+
prev_level = @logger&.level
|
104
|
+
|
105
|
+
@logger = ActiveSupport::TaggedLogging.new(Logger.new(output))
|
106
|
+
@logger.push_tags "Steep #{VERSION}"
|
107
|
+
@logger.level = prev_level || Logger::WARN
|
108
|
+
end
|
103
109
|
end
|
data/lib/steep/cli.rb
CHANGED
@@ -132,7 +132,7 @@ module Steep
|
|
132
132
|
end
|
133
133
|
|
134
134
|
def self.available_commands
|
135
|
-
[:check, :validate, :annotations, :scaffold, :interface, :version, :paths, :watch]
|
135
|
+
[:check, :validate, :annotations, :scaffold, :interface, :version, :paths, :watch, :langserver]
|
136
136
|
end
|
137
137
|
|
138
138
|
def process_global_options
|
@@ -141,7 +141,9 @@ module Steep
|
|
141
141
|
process_version
|
142
142
|
exit 0
|
143
143
|
end
|
144
|
-
|
144
|
+
|
145
|
+
handle_logging_options(opts)
|
146
|
+
end.order!(argv)
|
145
147
|
|
146
148
|
true
|
147
149
|
end
|
@@ -164,6 +166,28 @@ module Steep
|
|
164
166
|
__send__(:"process_#{command}")
|
165
167
|
end
|
166
168
|
|
169
|
+
def handle_logging_options(opts)
|
170
|
+
opts.on("--verbose") do
|
171
|
+
Steep.logger.level = Logger::DEBUG
|
172
|
+
end
|
173
|
+
|
174
|
+
opts.on("--log-level=[debug,info,warn,error,fatal]") do |level|
|
175
|
+
lv = {
|
176
|
+
"debug" => Logger::DEBUG,
|
177
|
+
"info" => Logger::INFO,
|
178
|
+
"warn" => Logger::WARN,
|
179
|
+
"error" => Logger::ERROR,
|
180
|
+
"fatal" => Logger::FATAL
|
181
|
+
}[level.downcase] or raise "Unknown error level: #{level}"
|
182
|
+
|
183
|
+
Steep.logger.level = lv
|
184
|
+
end
|
185
|
+
|
186
|
+
opts.on("--log-output=[PATH]") do |file|
|
187
|
+
Steep.log_output = file
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
167
191
|
def handle_dir_options(opts, options)
|
168
192
|
opts.on("-I [PATH]") {|path| options << Pathname(path) }
|
169
193
|
opts.on("-G [GEM]") {|gem| options << gem }
|
@@ -183,14 +207,13 @@ module Steep
|
|
183
207
|
|
184
208
|
def process_check
|
185
209
|
with_signature_options do |signature_options|
|
186
|
-
verbose = false
|
187
210
|
dump_all_types = false
|
188
211
|
fallback_any_is_error = false
|
189
212
|
strict = false
|
190
213
|
|
191
214
|
OptionParser.new do |opts|
|
215
|
+
handle_logging_options opts
|
192
216
|
handle_dir_options opts, signature_options
|
193
|
-
opts.on("--verbose") { verbose = true }
|
194
217
|
opts.on("--dump-all-types") { dump_all_types = true }
|
195
218
|
opts.on("--strict") { strict = true }
|
196
219
|
opts.on("--fallback-any-is-error") { fallback_any_is_error = true }
|
@@ -202,7 +225,6 @@ module Steep
|
|
202
225
|
end
|
203
226
|
|
204
227
|
Drivers::Check.new(source_paths: source_paths, signature_dirs: signature_options.paths, stdout: stdout, stderr: stderr).tap do |check|
|
205
|
-
check.verbose = verbose
|
206
228
|
check.dump_all_types = dump_all_types
|
207
229
|
check.fallback_any_is_error = fallback_any_is_error || strict
|
208
230
|
check.allow_missing_definitions = false if strict
|
@@ -212,25 +234,29 @@ module Steep
|
|
212
234
|
|
213
235
|
def process_validate
|
214
236
|
with_signature_options do |signature_options|
|
215
|
-
verbose = false
|
216
|
-
|
217
237
|
OptionParser.new do |opts|
|
238
|
+
handle_logging_options opts
|
218
239
|
handle_dir_options opts, signature_options
|
219
|
-
opts.on("--verbose") { verbose = true }
|
220
240
|
end.parse!(argv)
|
221
241
|
|
222
|
-
Drivers::Validate.new(signature_dirs: signature_options.paths, stdout: stdout, stderr: stderr).
|
223
|
-
validate.verbose = verbose
|
224
|
-
end.run
|
242
|
+
Drivers::Validate.new(signature_dirs: signature_options.paths, stdout: stdout, stderr: stderr).run
|
225
243
|
end
|
226
244
|
end
|
227
245
|
|
228
246
|
def process_annotations
|
247
|
+
OptionParser.new do |opts|
|
248
|
+
handle_logging_options opts
|
249
|
+
end.parse!(argv)
|
250
|
+
|
229
251
|
source_paths = argv.map {|file| Pathname(file) }
|
230
252
|
Drivers::Annotations.new(source_paths: source_paths, stdout: stdout, stderr: stderr).run
|
231
253
|
end
|
232
254
|
|
233
255
|
def process_scaffold
|
256
|
+
OptionParser.new do |opts|
|
257
|
+
handle_logging_options opts
|
258
|
+
end.parse!(argv)
|
259
|
+
|
234
260
|
source_paths = argv.map {|file| Pathname(file) }
|
235
261
|
Drivers::Scaffold.new(source_paths: source_paths, stdout: stdout, stderr: stderr).run
|
236
262
|
end
|
@@ -238,6 +264,7 @@ module Steep
|
|
238
264
|
def process_interface
|
239
265
|
with_signature_options do |signature_options|
|
240
266
|
OptionParser.new do |opts|
|
267
|
+
handle_logging_options opts
|
241
268
|
handle_dir_options opts, signature_options
|
242
269
|
end.parse!(argv)
|
243
270
|
|
@@ -251,6 +278,7 @@ module Steep
|
|
251
278
|
fallback_any_is_error = false
|
252
279
|
|
253
280
|
OptionParser.new do |opts|
|
281
|
+
handle_logging_options opts
|
254
282
|
handle_dir_options opts, signature_options
|
255
283
|
opts.on("--strict") { strict = true }
|
256
284
|
opts.on("--fallback-any-is-error") { fallback_any_is_error = true }
|
@@ -270,6 +298,32 @@ module Steep
|
|
270
298
|
end
|
271
299
|
end
|
272
300
|
|
301
|
+
def process_langserver
|
302
|
+
with_signature_options do |signature_options|
|
303
|
+
strict = false
|
304
|
+
fallback_any_is_error = false
|
305
|
+
|
306
|
+
OptionParser.new do |opts|
|
307
|
+
handle_logging_options opts
|
308
|
+
handle_dir_options opts, signature_options
|
309
|
+
opts.on("--strict") { strict = true }
|
310
|
+
opts.on("--fallback-any-is-error") { fallback_any_is_error = true }
|
311
|
+
end.parse!(argv)
|
312
|
+
|
313
|
+
source_dirs = argv.map { |path| Pathname(path) }
|
314
|
+
if source_dirs.empty?
|
315
|
+
source_dirs << Pathname(".")
|
316
|
+
end
|
317
|
+
|
318
|
+
Drivers::Langserver.new(source_dirs: source_dirs, signature_dirs: signature_options.paths).tap do |driver|
|
319
|
+
driver.options.fallback_any_is_error = fallback_any_is_error || strict
|
320
|
+
driver.options.allow_missing_definitions = false if strict
|
321
|
+
end.run
|
322
|
+
|
323
|
+
0
|
324
|
+
end
|
325
|
+
end
|
326
|
+
|
273
327
|
def process_version
|
274
328
|
stdout.puts Steep::VERSION
|
275
329
|
0
|
@@ -278,6 +332,7 @@ module Steep
|
|
278
332
|
def process_paths
|
279
333
|
with_signature_options do |signature_options|
|
280
334
|
OptionParser.new do |opts|
|
335
|
+
handle_logging_options opts
|
281
336
|
handle_dir_options opts, signature_options
|
282
337
|
end.parse!(argv)
|
283
338
|
|
data/lib/steep/drivers/check.rb
CHANGED
@@ -6,7 +6,6 @@ module Steep
|
|
6
6
|
attr_reader :stdout
|
7
7
|
attr_reader :stderr
|
8
8
|
|
9
|
-
attr_accessor :verbose
|
10
9
|
attr_accessor :accept_implicit_any
|
11
10
|
attr_accessor :dump_all_types
|
12
11
|
attr_accessor :fallback_any_is_error
|
@@ -22,7 +21,6 @@ module Steep
|
|
22
21
|
@stdout = stdout
|
23
22
|
@stderr = stderr
|
24
23
|
|
25
|
-
self.verbose = false
|
26
24
|
self.accept_implicit_any = false
|
27
25
|
self.dump_all_types = false
|
28
26
|
self.fallback_any_is_error = false
|
@@ -37,8 +35,6 @@ module Steep
|
|
37
35
|
end
|
38
36
|
|
39
37
|
def run
|
40
|
-
Steep.logger.level = Logger::DEBUG if verbose
|
41
|
-
|
42
38
|
project = Project.new(Project::SyntaxErrorRaisingListener.new)
|
43
39
|
|
44
40
|
source_paths.each do |path|
|
@@ -0,0 +1,166 @@
|
|
1
|
+
module Steep
|
2
|
+
module Drivers
|
3
|
+
class Langserver
|
4
|
+
attr_reader :source_dirs
|
5
|
+
attr_reader :signature_dirs
|
6
|
+
attr_reader :options
|
7
|
+
attr_reader :subscribers
|
8
|
+
|
9
|
+
include Utils::EachSignature
|
10
|
+
|
11
|
+
def initialize(source_dirs:, signature_dirs:)
|
12
|
+
@source_dirs = source_dirs
|
13
|
+
@signature_dirs = signature_dirs
|
14
|
+
@options = Project::Options.new
|
15
|
+
@subscribers = {}
|
16
|
+
|
17
|
+
subscribe :initialize do |request:, notifier:|
|
18
|
+
LanguageServer::Protocol::Interface::InitializeResult.new(
|
19
|
+
capabilities: LanguageServer::Protocol::Interface::ServerCapabilities.new(
|
20
|
+
text_document_sync: LanguageServer::Protocol::Interface::TextDocumentSyncOptions.new(
|
21
|
+
open_close: true,
|
22
|
+
change: LanguageServer::Protocol::Constant::TextDocumentSyncKind::FULL,
|
23
|
+
),
|
24
|
+
hover_provider: true
|
25
|
+
),
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
29
|
+
subscribe :shutdown do |request:, notifier:|
|
30
|
+
Steep.logger.warn "Shutting down the server..."
|
31
|
+
exit
|
32
|
+
end
|
33
|
+
|
34
|
+
subscribe :"textDocument/didOpen" do |request:, notifier:|
|
35
|
+
uri = URI.parse(request[:params][:textDocument][:uri])
|
36
|
+
text = request[:params][:textDocument][:text]
|
37
|
+
synchronize_project(uri: uri, text: text, notifier: notifier)
|
38
|
+
end
|
39
|
+
|
40
|
+
subscribe :"textDocument/didChange" do |request:, notifier:|
|
41
|
+
uri = URI.parse(request[:params][:textDocument][:uri])
|
42
|
+
text = request[:params][:contentChanges][0][:text]
|
43
|
+
synchronize_project(uri: uri, text: text, notifier: notifier)
|
44
|
+
end
|
45
|
+
|
46
|
+
subscribe :"textDocument/hover" do |request:, notifier:|
|
47
|
+
Steep.logger.warn request.inspect
|
48
|
+
uri = URI.parse(request[:params][:textDocument][:uri])
|
49
|
+
line = request[:params][:position][:line]
|
50
|
+
column = request[:params][:position][:character]
|
51
|
+
respond_to_hover(uri: uri, line: line, column: column, notifier: notifier, id: request[:id])
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def respond_to_hover(uri:, line:, column:, notifier:, id:)
|
56
|
+
path = Pathname(uri.path).relative_path_from(Pathname.pwd)
|
57
|
+
|
58
|
+
if path.extname == ".rb"
|
59
|
+
# line in LSP is zero-origin
|
60
|
+
project.type_of(path: path, line: line + 1, column: column) do |type, node|
|
61
|
+
Steep.logger.warn "type = #{type.to_s}"
|
62
|
+
|
63
|
+
start_position = { line: node.location.line - 1, character: node.location.column }
|
64
|
+
end_position = { line: node.location.last_line - 1, character: node.location.last_column }
|
65
|
+
range = { start: start_position, end: end_position }
|
66
|
+
|
67
|
+
Steep.logger.warn "node = #{node.type}"
|
68
|
+
Steep.logger.warn "range = #{range.inspect}"
|
69
|
+
|
70
|
+
LanguageServer::Protocol::Interface::Hover.new(
|
71
|
+
contents: { kind: "markdown", value: "`#{type}`" },
|
72
|
+
range: range
|
73
|
+
)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def subscribe(method, &callback)
|
79
|
+
@subscribers[method] = callback
|
80
|
+
end
|
81
|
+
|
82
|
+
def project
|
83
|
+
@project ||= Project.new.tap do |project|
|
84
|
+
source_dirs.each do |path|
|
85
|
+
each_file_in_path(".rb", path) do |file_path|
|
86
|
+
file = Project::SourceFile.new(path: file_path, options: options)
|
87
|
+
file.content = file_path.read
|
88
|
+
project.source_files[file_path] = file
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
signature_dirs.each do |path|
|
93
|
+
each_file_in_path(".rbi", path) do |file_path|
|
94
|
+
file = Project::SignatureFile.new(path: file_path)
|
95
|
+
file.content = file_path.read
|
96
|
+
project.signature_files[file_path] = file
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def run
|
103
|
+
writer = LanguageServer::Protocol::Transport::Stdio::Writer.new
|
104
|
+
reader = LanguageServer::Protocol::Transport::Stdio::Reader.new
|
105
|
+
notifier = Proc.new { |method:, params: {}| writer.write(method: method, params: params) }
|
106
|
+
|
107
|
+
reader.read do |request|
|
108
|
+
id = request[:id]
|
109
|
+
method = request[:method].to_sym
|
110
|
+
Steep.logger.warn "Received event: #{method}"
|
111
|
+
subscriber = subscribers[method]
|
112
|
+
if subscriber
|
113
|
+
result = subscriber.call(request: request, notifier: notifier)
|
114
|
+
if id && result
|
115
|
+
writer.write(id: id, result: result)
|
116
|
+
end
|
117
|
+
else
|
118
|
+
Steep.logger.warn "Ignored event: #{method}"
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def synchronize_project(uri:, text:, notifier:)
|
124
|
+
path = Pathname(uri.path).relative_path_from(Pathname.pwd)
|
125
|
+
|
126
|
+
case path.extname
|
127
|
+
when ".rb"
|
128
|
+
file = project.source_files[path] || Project::SourceFile.new(path: path, options: options)
|
129
|
+
file.content = text
|
130
|
+
project.source_files[path] = file
|
131
|
+
project.type_check
|
132
|
+
|
133
|
+
diags = (file.errors || []).map do |error|
|
134
|
+
LanguageServer::Protocol::Interface::Diagnostic.new(
|
135
|
+
message: error.to_s,
|
136
|
+
severity: LanguageServer::Protocol::Constant::DiagnosticSeverity::ERROR,
|
137
|
+
range: LanguageServer::Protocol::Interface::Range.new(
|
138
|
+
start: LanguageServer::Protocol::Interface::Position.new(
|
139
|
+
line: error.node.loc.line - 1,
|
140
|
+
character: error.node.loc.column,
|
141
|
+
),
|
142
|
+
end: LanguageServer::Protocol::Interface::Position.new(
|
143
|
+
line: error.node.loc.last_line - 1,
|
144
|
+
character: error.node.loc.last_column,
|
145
|
+
),
|
146
|
+
)
|
147
|
+
)
|
148
|
+
end
|
149
|
+
|
150
|
+
notifier.call(
|
151
|
+
method: :"textDocument/publishDiagnostics",
|
152
|
+
params: LanguageServer::Protocol::Interface::PublishDiagnosticsParams.new(
|
153
|
+
uri: uri,
|
154
|
+
diagnostics: diags,
|
155
|
+
),
|
156
|
+
)
|
157
|
+
when ".rbi"
|
158
|
+
file = project.signature_files[path] || Project::SignatureFile.new(path: path)
|
159
|
+
file.content = text
|
160
|
+
project.signature_files[path] = file
|
161
|
+
project.type_check
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
@@ -4,21 +4,16 @@ module Steep
|
|
4
4
|
attr_reader :signature_dirs
|
5
5
|
attr_reader :stdout
|
6
6
|
attr_reader :stderr
|
7
|
-
attr_accessor :verbose
|
8
7
|
|
9
8
|
def initialize(signature_dirs:, stdout:, stderr:)
|
10
9
|
@signature_dirs = signature_dirs
|
11
10
|
@stdout = stdout
|
12
11
|
@stderr = stderr
|
13
|
-
|
14
|
-
self.verbose = false
|
15
12
|
end
|
16
13
|
|
17
14
|
include Utils::EachSignature
|
18
15
|
|
19
16
|
def run
|
20
|
-
Steep.logger.level = Logger::DEBUG if verbose
|
21
|
-
|
22
17
|
project = Project.new
|
23
18
|
|
24
19
|
signature_dirs.each do |path|
|
data/lib/steep/project.rb
CHANGED
@@ -227,5 +227,28 @@ module Steep
|
|
227
227
|
|
228
228
|
errors
|
229
229
|
end
|
230
|
+
|
231
|
+
def type_of(path:, line:, column:)
|
232
|
+
if source_file = source_files[path]
|
233
|
+
case source = source_file.source
|
234
|
+
when Source
|
235
|
+
if typing = source_file.typing
|
236
|
+
node = source.find_node(line: line, column: column)
|
237
|
+
|
238
|
+
type = begin
|
239
|
+
typing.type_of(node: node)
|
240
|
+
rescue RuntimeError
|
241
|
+
AST::Builtin.any_type
|
242
|
+
end
|
243
|
+
|
244
|
+
if block_given?
|
245
|
+
yield type, node
|
246
|
+
else
|
247
|
+
type
|
248
|
+
end
|
249
|
+
end
|
250
|
+
end
|
251
|
+
end
|
252
|
+
end
|
230
253
|
end
|
231
254
|
end
|
data/lib/steep/project/file.rb
CHANGED
data/lib/steep/source.rb
CHANGED
@@ -288,5 +288,29 @@ module Steep
|
|
288
288
|
enum_for :each_annotation
|
289
289
|
end
|
290
290
|
end
|
291
|
+
|
292
|
+
# @type method find_node: (line: Integer, column: Integer, ?node: any, ?position: Integer?) -> any
|
293
|
+
def find_node(line:, column:, node: self.node, position: nil)
|
294
|
+
position ||= (line-1).times.sum do |i|
|
295
|
+
node.location.expression.source_buffer.source_line(i+1).size + 1
|
296
|
+
end + column
|
297
|
+
|
298
|
+
range = node.location.expression&.yield_self do |r|
|
299
|
+
r.begin_pos..r.end_pos
|
300
|
+
end
|
301
|
+
|
302
|
+
if range
|
303
|
+
if range === position
|
304
|
+
Source.each_child_node(node) do |child|
|
305
|
+
n = find_node(line: line, column: column, node: child, position: position)
|
306
|
+
if n
|
307
|
+
return n
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
node
|
312
|
+
end
|
313
|
+
end
|
314
|
+
end
|
291
315
|
end
|
292
316
|
end
|
@@ -1559,9 +1559,9 @@ module Steep
|
|
1559
1559
|
typing.add_typing node, AST::Builtin.any_type
|
1560
1560
|
end
|
1561
1561
|
|
1562
|
-
when :splat, :sclass
|
1562
|
+
when :splat, :sclass, :alias
|
1563
1563
|
yield_self do
|
1564
|
-
Steep.logger.error "Unsupported node #{node.type}"
|
1564
|
+
Steep.logger.error "Unsupported node #{node.type} (#{node.location.expression.source_buffer.name}:#{node.location.expression.line})"
|
1565
1565
|
|
1566
1566
|
each_child_node node do |child|
|
1567
1567
|
synthesize(child)
|
data/lib/steep/version.rb
CHANGED
data/sig/project.rbi
CHANGED
@@ -13,6 +13,7 @@ class Steep::Source
|
|
13
13
|
def self.parse: (String, path: String, labeling: any) -> instance
|
14
14
|
def annotations: (block: any, builder: any, current_module: any) -> Array<annotation>
|
15
15
|
def node: -> any
|
16
|
+
def find_node: (line: Integer, column: Integer) -> any
|
16
17
|
end
|
17
18
|
|
18
19
|
class Steep::Typing
|
@@ -103,4 +104,6 @@ class Steep::Project
|
|
103
104
|
def signature_updated?: -> bool
|
104
105
|
def reload_signature: -> void
|
105
106
|
def validate_signature: (any) -> Array<any>
|
107
|
+
|
108
|
+
def type_of: (path: Pathname, line: Integer, column: Integer) -> any
|
106
109
|
end
|
data/steep.gemspec
CHANGED
@@ -35,4 +35,5 @@ Gem::Specification.new do |spec|
|
|
35
35
|
spec.add_runtime_dependency "rainbow", "~> 2.2.2", "< 4.0"
|
36
36
|
spec.add_runtime_dependency "listen", "~> 3.1"
|
37
37
|
spec.add_runtime_dependency "pry", "~> 0.12.2"
|
38
|
+
spec.add_runtime_dependency "language_server-protocol", "~> 3.14.0"
|
38
39
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: steep
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Soutaro Matsumoto
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-05-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -156,6 +156,20 @@ dependencies:
|
|
156
156
|
- - "~>"
|
157
157
|
- !ruby/object:Gem::Version
|
158
158
|
version: 0.12.2
|
159
|
+
- !ruby/object:Gem::Dependency
|
160
|
+
name: language_server-protocol
|
161
|
+
requirement: !ruby/object:Gem::Requirement
|
162
|
+
requirements:
|
163
|
+
- - "~>"
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: 3.14.0
|
166
|
+
type: :runtime
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
requirements:
|
170
|
+
- - "~>"
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
version: 3.14.0
|
159
173
|
description: Gradual Typing for Ruby
|
160
174
|
email:
|
161
175
|
- matsumoto@soutaro.com
|
@@ -214,6 +228,7 @@ files:
|
|
214
228
|
- lib/steep/cli.rb
|
215
229
|
- lib/steep/drivers/annotations.rb
|
216
230
|
- lib/steep/drivers/check.rb
|
231
|
+
- lib/steep/drivers/langserver.rb
|
217
232
|
- lib/steep/drivers/print_interface.rb
|
218
233
|
- lib/steep/drivers/scaffold.rb
|
219
234
|
- lib/steep/drivers/utils/each_signature.rb
|