steep 1.4.0.dev.2 → 1.4.0.dev.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 +4 -4
- data/.github/workflows/ruby.yml +1 -2
- data/Gemfile +1 -1
- data/Gemfile.lock +7 -9
- data/Gemfile.steep +1 -2
- data/Gemfile.steep.lock +9 -10
- data/README.md +7 -1
- data/Steepfile +0 -3
- data/bin/rbs +0 -1
- data/guides/README.md +5 -0
- data/guides/src/gem-rbs-collection/gem-rbs-collection.md +143 -0
- data/guides/src/getting-started/getting-started.md +164 -0
- data/guides/src/nil-optional/nil-optional.md +195 -0
- data/lib/steep/diagnostic/ruby.rb +79 -4
- data/lib/steep/drivers/check.rb +4 -4
- data/lib/steep/interface/block.rb +10 -0
- data/lib/steep/module_helper.rb +13 -11
- data/lib/steep/path_helper.rb +4 -0
- data/lib/steep/server/interaction_worker.rb +105 -92
- data/lib/steep/services/type_name_completion.rb +157 -0
- data/lib/steep/source.rb +1 -0
- data/lib/steep/type_construction.rb +402 -229
- data/lib/steep/type_inference/block_params.rb +13 -0
- data/lib/steep/type_inference/context.rb +3 -3
- data/lib/steep/type_inference/method_params.rb +42 -16
- data/lib/steep/type_inference/send_args.rb +79 -50
- data/lib/steep/type_inference/type_env.rb +7 -1
- data/lib/steep/version.rb +1 -1
- data/lib/steep.rb +1 -0
- data/rbs_collection.steep.lock.yaml +0 -28
- data/rbs_collection.steep.yaml +10 -9
- data/sample/lib/conference.rb +12 -0
- data/sample/sig/conference.rbs +5 -0
- data/sig/shims/language-server_protocol.rbs +12 -0
- data/sig/shims/parser/nodes.rbs +37 -0
- data/sig/shims/parser.rbs +1 -0
- data/sig/shims/string.rbs +4 -0
- data/sig/steep/ast/types/factory.rbs +10 -8
- data/sig/steep/diagnostic/lsp_formatter.rbs +1 -1
- data/sig/steep/diagnostic/ruby.rbs +38 -2
- data/sig/steep/drivers/check.rbs +1 -1
- data/sig/steep/drivers/checkfile.rbs +1 -1
- data/sig/steep/drivers/diagnostic_printer.rbs +1 -1
- data/sig/steep/drivers/watch.rbs +1 -1
- data/sig/steep/index/signature_symbol_provider.rbs +1 -1
- data/sig/steep/interface/block.rbs +2 -0
- data/sig/steep/interface/builder.rbs +5 -3
- data/sig/steep/interface/method_type.rbs +5 -3
- data/sig/steep/module_helper.rbs +9 -0
- data/sig/steep/path_helper.rbs +3 -1
- data/sig/steep/server/base_worker.rbs +1 -1
- data/sig/steep/server/interaction_worker.rbs +46 -17
- data/sig/steep/server/master.rbs +1 -1
- data/sig/steep/server/type_check_worker.rbs +7 -5
- data/sig/steep/server/worker_process.rbs +6 -4
- data/sig/steep/services/completion_provider.rbs +2 -0
- data/sig/steep/services/type_name_completion.rbs +122 -0
- data/sig/steep/type_construction.rbs +99 -30
- data/sig/steep/type_inference/block_params.rbs +4 -0
- data/sig/steep/type_inference/context.rbs +70 -22
- data/sig/steep/type_inference/method_params.rbs +43 -24
- data/sig/steep/type_inference/multiple_assignment.rbs +1 -1
- data/sig/steep/type_inference/send_args.rbs +13 -3
- data/sig/steep/typing.rbs +7 -2
- data/smoke/diagnostics/test_expectations.yml +1 -0
- data/steep.gemspec +0 -1
- metadata +10 -16
@@ -24,9 +24,15 @@ module Steep
|
|
24
24
|
end
|
25
25
|
|
26
26
|
module ResultPrinter : _DiagnosticWithResult
|
27
|
-
def relation_message: (untyped relation) ->
|
27
|
+
def relation_message: (Subtyping::Relation[untyped] relation) -> String?
|
28
28
|
|
29
|
-
def detail_lines: () ->
|
29
|
+
def detail_lines: () -> String?
|
30
|
+
end
|
31
|
+
|
32
|
+
module ResultPrinter2 : _DiagnosticWithResult
|
33
|
+
def result_line: (Subtyping::Result::t result) -> String?
|
34
|
+
|
35
|
+
def detail_lines: () -> String?
|
30
36
|
end
|
31
37
|
|
32
38
|
class IncompatibleAssignment < Base
|
@@ -524,6 +530,36 @@ module Steep
|
|
524
530
|
def header_line: () -> String
|
525
531
|
end
|
526
532
|
|
533
|
+
# Argument forwarding `...` cannot be done safely, because of
|
534
|
+
#
|
535
|
+
# 1. The arguments are incompatible, or
|
536
|
+
# 2. The blocks are incompatible
|
537
|
+
#
|
538
|
+
class IncompatibleArgumentForwarding < Base
|
539
|
+
attr_reader method_name: Symbol
|
540
|
+
|
541
|
+
attr_reader params_pair: [Interface::Function::Params, Interface::Function::Params]?
|
542
|
+
|
543
|
+
attr_reader block_pair: [Interface::Block?, Interface::Block?]?
|
544
|
+
|
545
|
+
attr_reader result: Subtyping::Result::Base
|
546
|
+
|
547
|
+
include ResultPrinter2
|
548
|
+
|
549
|
+
# One of `params_pair:` or `block_pair:` is specified where the first object is of the source method (`#foo`) and the second value is of the target method (`#bar`)
|
550
|
+
#
|
551
|
+
# ```ruby
|
552
|
+
# def foo(...)
|
553
|
+
# bar(...)
|
554
|
+
# end
|
555
|
+
# ```
|
556
|
+
#
|
557
|
+
def initialize: (node: Parser::AST::Node, method_name: Symbol, params_pair: [Interface::Function::Params, Interface::Function::Params], result: Subtyping::Result::Base) -> void
|
558
|
+
| (node: Parser::AST::Node, method_name: Symbol, block_pair: [Interface::Block?, Interface::Block?], result: Subtyping::Result::Base) -> void
|
559
|
+
|
560
|
+
def header_line: () -> String
|
561
|
+
end
|
562
|
+
|
527
563
|
ALL: Array[singleton(Base)]
|
528
564
|
|
529
565
|
type template = Hash[singleton(Base), LSPFormatter::severity]
|
data/sig/steep/drivers/check.rbs
CHANGED
data/sig/steep/drivers/watch.rbs
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
use RBS::TypeName
|
2
|
+
|
1
3
|
module Steep
|
2
4
|
module Interface
|
3
5
|
class Builder
|
@@ -85,11 +87,11 @@ module Steep
|
|
85
87
|
attr_reader cache: Hash[cache_key, Shape?]
|
86
88
|
|
87
89
|
# No type application (if generic), no self-instance-module resolution
|
88
|
-
attr_reader raw_instance_object_shape_cache: Hash[[
|
90
|
+
attr_reader raw_instance_object_shape_cache: Hash[[TypeName, bool], Shape]
|
89
91
|
|
90
|
-
attr_reader raw_singleton_object_shape_cache: Hash[[
|
92
|
+
attr_reader raw_singleton_object_shape_cache: Hash[[TypeName, bool], Shape]
|
91
93
|
|
92
|
-
attr_reader raw_interface_object_shape_cache: Hash[[
|
94
|
+
attr_reader raw_interface_object_shape_cache: Hash[[TypeName, bool], Shape]
|
93
95
|
|
94
96
|
def initialize: (AST::Types::Factory) -> void
|
95
97
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
use Steep::TypeInference::MethodCall::MethodDecl
|
2
|
+
|
1
3
|
module Steep
|
2
4
|
module Interface
|
3
5
|
class MethodType
|
@@ -7,11 +9,11 @@ module Steep
|
|
7
9
|
|
8
10
|
attr_reader block: Block?
|
9
11
|
|
10
|
-
attr_reader method_decls: Set[
|
12
|
+
attr_reader method_decls: Set[MethodDecl]
|
11
13
|
|
12
14
|
@fvs: Set[Symbol]
|
13
15
|
|
14
|
-
def initialize: (type_params: Array[TypeParam], type: Function, block: Block?, method_decls: Set[
|
16
|
+
def initialize: (type_params: Array[TypeParam], type: Function, block: Block?, method_decls: Set[MethodDecl]) -> void
|
15
17
|
|
16
18
|
def ==: (untyped other) -> bool
|
17
19
|
|
@@ -28,7 +30,7 @@ module Steep
|
|
28
30
|
|
29
31
|
def instantiate: (Substitution s) -> MethodType
|
30
32
|
|
31
|
-
def with: (?type_params: Array[TypeParam], ?type: Function, ?block: Block?, ?method_decls: Set[
|
33
|
+
def with: (?type_params: Array[TypeParam], ?type: Function, ?block: Block?, ?method_decls: Set[MethodDecl]) -> MethodType
|
32
34
|
|
33
35
|
def to_s: () -> ::String
|
34
36
|
|
data/sig/steep/module_helper.rbs
CHANGED
@@ -1,7 +1,16 @@
|
|
1
1
|
module Steep
|
2
2
|
module ModuleHelper
|
3
|
+
# Translate a *const* node to a type name if possible
|
4
|
+
#
|
5
|
+
# ```ruby
|
6
|
+
# Foo::Bar # => `Foo::Bar`
|
7
|
+
# foo::Bar # => nil
|
8
|
+
# ```
|
9
|
+
#
|
3
10
|
def module_name_from_node: (Parser::AST::Node? parent_node, Symbol constant_name) -> RBS::TypeName?
|
4
11
|
|
12
|
+
# Translate a *const* node to a namespace if possible
|
13
|
+
#
|
5
14
|
def namespace_from_node: (Parser::AST::Node? node) -> RBS::Namespace?
|
6
15
|
end
|
7
16
|
end
|
data/sig/steep/path_helper.rbs
CHANGED
@@ -6,8 +6,10 @@ module Steep
|
|
6
6
|
#
|
7
7
|
def self?.to_pathname: (String uri, ?dosish: bool) -> Pathname?
|
8
8
|
|
9
|
+
def self?.to_pathname!: (String uri, ?dosish: bool) -> Pathname
|
10
|
+
|
9
11
|
# Receives a Pathname and returns a *file* URI
|
10
|
-
#
|
12
|
+
#
|
11
13
|
def self?.to_uri: (Pathname path, ?dosish: bool) -> URI::File
|
12
14
|
end
|
13
15
|
end
|
@@ -1,41 +1,70 @@
|
|
1
|
+
use LanguageServer::Protocol::Transport::Io::*, Thread::Queue, RBS::AST::Comment
|
2
|
+
use Steep::Services::CompletionProvider, Steep::Services::TypeNameCompletion
|
3
|
+
use RBS::TypeName, RBS::Namespace
|
4
|
+
|
1
5
|
module Steep
|
2
6
|
module Server
|
3
7
|
class InteractionWorker < BaseWorker
|
4
8
|
include ChangeBuffer
|
5
9
|
|
6
|
-
ApplyChangeJob
|
10
|
+
class ApplyChangeJob
|
11
|
+
end
|
7
12
|
|
8
|
-
HoverJob
|
13
|
+
class HoverJob
|
14
|
+
attr_reader id: String
|
9
15
|
|
10
|
-
|
16
|
+
attr_reader path: Pathname
|
11
17
|
|
12
|
-
|
18
|
+
attr_reader line: Integer
|
13
19
|
|
14
|
-
|
20
|
+
attr_reader column: Integer
|
15
21
|
|
16
|
-
|
22
|
+
def initialize: (id: String, path: Pathname, line: Integer, column: Integer) -> void
|
23
|
+
end
|
17
24
|
|
18
|
-
|
25
|
+
class CompletionJob
|
26
|
+
attr_reader id: String
|
19
27
|
|
20
|
-
|
28
|
+
attr_reader path: Pathname
|
21
29
|
|
22
|
-
|
30
|
+
attr_reader line: Integer
|
23
31
|
|
24
|
-
|
32
|
+
attr_reader column: Integer
|
25
33
|
|
26
|
-
|
34
|
+
attr_reader trigger: String
|
27
35
|
|
28
|
-
|
36
|
+
def initialize: (id: String, path: Pathname, line: Integer, column: Integer, trigger: String) -> void
|
37
|
+
end
|
29
38
|
|
30
|
-
|
39
|
+
type job = ApplyChangeJob | HoverJob | CompletionJob
|
40
|
+
|
41
|
+
module LSP = LanguageServer::Protocol
|
42
|
+
|
43
|
+
attr_reader service: Services::TypeCheckService
|
44
|
+
|
45
|
+
def initialize: (project: Project, reader: Reader, writer: Writer, ?queue: Queue) -> void
|
46
|
+
|
47
|
+
def handle_job: (job) -> void
|
48
|
+
|
49
|
+
type lsp_request = { id: String, method: String, params: untyped }
|
31
50
|
|
32
|
-
def
|
51
|
+
def handle_request: (lsp_request) -> void
|
52
|
+
|
53
|
+
def process_hover: (HoverJob job) -> untyped
|
54
|
+
|
55
|
+
def process_completion: (CompletionJob job) -> untyped
|
56
|
+
|
57
|
+
def format_completion_item_for_rbs: (Services::SignatureService, RBS::TypeName, CompletionJob job, String complete_text, Integer prefix_size) -> untyped
|
58
|
+
|
59
|
+
def format_comment: (Comment? comment) -> untyped?
|
60
|
+
|
61
|
+
def format_comments: (Array[RBS::AST::Comment] comments) -> untyped?
|
33
62
|
|
34
|
-
def
|
63
|
+
def format_completion_item: (CompletionProvider::item item) -> untyped
|
35
64
|
|
36
|
-
def
|
65
|
+
def method_type_to_snippet: (RBS::MethodType method_type) -> ::String
|
37
66
|
|
38
|
-
def
|
67
|
+
def params_to_snippet: (RBS::Types::Function fun) -> String
|
39
68
|
end
|
40
69
|
end
|
41
70
|
end
|
data/sig/steep/server/master.rbs
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
use Steep::Services::*, LanguageServer::Protocol as LSP
|
2
|
+
|
1
3
|
module Steep
|
2
4
|
module Server
|
3
5
|
# TypeCheckWorker provides two features:
|
@@ -15,9 +17,9 @@ module Steep
|
|
15
17
|
class TypeCheckWorker < BaseWorker
|
16
18
|
attr_reader project: Project
|
17
19
|
|
18
|
-
attr_reader assignment:
|
20
|
+
attr_reader assignment: PathAssignment
|
19
21
|
|
20
|
-
attr_reader service:
|
22
|
+
attr_reader service: TypeCheckService
|
21
23
|
|
22
24
|
attr_reader commandline_args: Array[String]
|
23
25
|
|
@@ -95,9 +97,9 @@ module Steep
|
|
95
97
|
|
96
98
|
def initialize: (
|
97
99
|
project: Project,
|
98
|
-
reader:
|
99
|
-
writer:
|
100
|
-
assignment:
|
100
|
+
reader: LSP::Transport::Io::Reader,
|
101
|
+
writer: LSP::Transport::Io::Writer,
|
102
|
+
assignment: PathAssignment,
|
101
103
|
commandline_args: Array[String]
|
102
104
|
) -> void
|
103
105
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
use LanguageServer::Protocol as LSP
|
2
|
+
|
1
3
|
module Steep
|
2
4
|
module Server
|
3
5
|
# WorkerProcess class represents a worker process
|
@@ -21,9 +23,9 @@ module Steep
|
|
21
23
|
def pid: () -> Integer
|
22
24
|
end
|
23
25
|
|
24
|
-
attr_reader reader:
|
26
|
+
attr_reader reader: LSP::Transport::Io::Reader
|
25
27
|
|
26
|
-
attr_reader writer:
|
28
|
+
attr_reader writer: LSP::Transport::Io::Writer
|
27
29
|
|
28
30
|
attr_reader stderr: IO?
|
29
31
|
|
@@ -34,8 +36,8 @@ module Steep
|
|
34
36
|
attr_reader index: Integer?
|
35
37
|
|
36
38
|
def initialize: (
|
37
|
-
reader:
|
38
|
-
writer:
|
39
|
+
reader: LSP::Transport::Io::Reader,
|
40
|
+
writer: LSP::Transport::Io::Writer,
|
39
41
|
stderr: IO?,
|
40
42
|
wait_thread: Thread & _ProcessWaitThread,
|
41
43
|
name: String,
|
@@ -0,0 +1,122 @@
|
|
1
|
+
use RBS::TypeName, RBS::Namespace, RBS::Environment, RBS::Resolver, RBS::AST::Directives
|
2
|
+
|
3
|
+
module Steep
|
4
|
+
module Services
|
5
|
+
class TypeNameCompletion
|
6
|
+
module Prefix
|
7
|
+
type t = nil # no prefix
|
8
|
+
| RawIdentPrefix
|
9
|
+
| NamespacedIdentPrefix
|
10
|
+
| NamespacePrefix
|
11
|
+
|
12
|
+
# Uident or Lident is given, but no `::` (==namespace)
|
13
|
+
#
|
14
|
+
# ```
|
15
|
+
# Str← Uident
|
16
|
+
# c← Lident
|
17
|
+
# ```
|
18
|
+
#
|
19
|
+
class RawIdentPrefix
|
20
|
+
attr_reader ident: String
|
21
|
+
|
22
|
+
# Returns true if the `ident` is a Ruby class name
|
23
|
+
#
|
24
|
+
def const_name?: () -> bool
|
25
|
+
|
26
|
+
def initialize: (String ident) -> void
|
27
|
+
|
28
|
+
def size: () -> Integer
|
29
|
+
end
|
30
|
+
|
31
|
+
# Uident or Lident following a namespace
|
32
|
+
#
|
33
|
+
# ```
|
34
|
+
# ::L← Uident
|
35
|
+
# RBS::Enviro← Uident
|
36
|
+
# ```
|
37
|
+
#
|
38
|
+
class NamespacedIdentPrefix
|
39
|
+
attr_reader namespace: Namespace
|
40
|
+
|
41
|
+
attr_reader ident: String
|
42
|
+
|
43
|
+
def const_name?: () -> bool
|
44
|
+
|
45
|
+
def initialize: (Namespace, String ident, Integer size) -> void
|
46
|
+
|
47
|
+
def size: () -> Integer
|
48
|
+
end
|
49
|
+
|
50
|
+
# Namespace is given
|
51
|
+
#
|
52
|
+
# ```
|
53
|
+
# RBS::←
|
54
|
+
# ::←
|
55
|
+
# ```
|
56
|
+
class NamespacePrefix
|
57
|
+
attr_reader namespace: Namespace
|
58
|
+
|
59
|
+
def initialize: (Namespace, Integer size) -> void
|
60
|
+
|
61
|
+
def size: () -> Integer
|
62
|
+
end
|
63
|
+
|
64
|
+
# line number is 1 origin (Rubyish)
|
65
|
+
#
|
66
|
+
def self.parse: (RBS::Buffer input, line: Integer, column: Integer) -> t
|
67
|
+
end
|
68
|
+
|
69
|
+
class Item
|
70
|
+
# The text to be completed
|
71
|
+
#
|
72
|
+
attr_reader complete_text: String
|
73
|
+
|
74
|
+
# The prefix
|
75
|
+
attr_reader prefix: Prefix::t?
|
76
|
+
|
77
|
+
# Name of the type or constant
|
78
|
+
#
|
79
|
+
attr_reader full_name: TypeName
|
80
|
+
|
81
|
+
# The text to be inserted after the prefix
|
82
|
+
#
|
83
|
+
def insert_text: () -> String
|
84
|
+
|
85
|
+
def initialize: (prefix: Prefix::t?, full_name: TypeName, complete_text: String) -> void
|
86
|
+
end
|
87
|
+
|
88
|
+
attr_reader env: Environment
|
89
|
+
|
90
|
+
attr_reader context: Resolver::context
|
91
|
+
|
92
|
+
attr_reader type_name_resolver: Resolver::TypeNameResolver
|
93
|
+
|
94
|
+
attr_reader map: Environment::UseMap
|
95
|
+
|
96
|
+
def initialize: (env: Environment, context: Resolver::context, dirs: Array[Directives::t]) -> void
|
97
|
+
|
98
|
+
def complete_class_name: (RBS::Buffer input, line: Integer, column: Integer) -> Array[Item]
|
99
|
+
|
100
|
+
# Find type names from the context for RBS
|
101
|
+
#
|
102
|
+
# Doesn't take account of ancestors of the context.
|
103
|
+
#
|
104
|
+
def find_type_names: (Prefix::t) -> Array[TypeName]
|
105
|
+
|
106
|
+
# Returns a pair of
|
107
|
+
#
|
108
|
+
# * Absolute type name
|
109
|
+
# * Relative type name in given context if possible (or absolute name)
|
110
|
+
#
|
111
|
+
def resolve_name_in_context: (TypeName) -> [TypeName, TypeName]
|
112
|
+
|
113
|
+
def format_constant_name: (TypeName) -> String
|
114
|
+
|
115
|
+
def each_type_name: () { (TypeName) -> void } -> void
|
116
|
+
| () -> Enumerator[TypeName, void]
|
117
|
+
|
118
|
+
def each_outer_module: (?Resolver::context) { (Namespace) -> void } -> Namespace
|
119
|
+
| () -> Enumerator[Namespace, void]
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|