steep 1.4.0.dev.2 → 1.4.0.dev.4

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.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +1 -2
  3. data/Gemfile +1 -1
  4. data/Gemfile.lock +9 -11
  5. data/Gemfile.steep +1 -2
  6. data/Gemfile.steep.lock +11 -14
  7. data/README.md +7 -1
  8. data/Steepfile +0 -3
  9. data/bin/rbs +0 -1
  10. data/guides/README.md +5 -0
  11. data/guides/src/gem-rbs-collection/gem-rbs-collection.md +143 -0
  12. data/guides/src/getting-started/getting-started.md +164 -0
  13. data/guides/src/nil-optional/nil-optional.md +195 -0
  14. data/lib/steep/diagnostic/ruby.rb +80 -6
  15. data/lib/steep/drivers/check.rb +4 -4
  16. data/lib/steep/interface/block.rb +10 -0
  17. data/lib/steep/interface/builder.rb +3 -3
  18. data/lib/steep/method_name.rb +8 -0
  19. data/lib/steep/module_helper.rb +13 -11
  20. data/lib/steep/path_helper.rb +4 -0
  21. data/lib/steep/server/interaction_worker.rb +197 -230
  22. data/lib/steep/server/lsp_formatter.rb +308 -154
  23. data/lib/steep/server/master.rb +4 -1
  24. data/lib/steep/services/completion_provider.rb +140 -103
  25. data/lib/steep/services/hover_provider/rbs.rb +37 -32
  26. data/lib/steep/services/signature_help_provider.rb +108 -0
  27. data/lib/steep/services/type_name_completion.rb +165 -0
  28. data/lib/steep/source.rb +1 -0
  29. data/lib/steep/type_construction.rb +460 -266
  30. data/lib/steep/type_inference/block_params.rb +13 -0
  31. data/lib/steep/type_inference/context.rb +3 -3
  32. data/lib/steep/type_inference/method_call.rb +1 -1
  33. data/lib/steep/type_inference/method_params.rb +42 -16
  34. data/lib/steep/type_inference/send_args.rb +80 -51
  35. data/lib/steep/type_inference/type_env.rb +12 -4
  36. data/lib/steep/version.rb +1 -1
  37. data/lib/steep.rb +2 -0
  38. data/rbs_collection.steep.lock.yaml +0 -28
  39. data/rbs_collection.steep.yaml +10 -9
  40. data/sample/Steepfile +2 -0
  41. data/sample/lib/conference.rb +12 -0
  42. data/sample/sig/conference.rbs +5 -0
  43. data/sig/shims/language-server_protocol.rbs +277 -0
  44. data/sig/shims/parser/nodes.rbs +37 -0
  45. data/sig/shims/parser.rbs +4 -0
  46. data/sig/shims/string.rbs +4 -0
  47. data/sig/steep/ast/types/factory.rbs +10 -8
  48. data/sig/steep/diagnostic/lsp_formatter.rbs +1 -1
  49. data/sig/steep/diagnostic/ruby.rbs +38 -2
  50. data/sig/steep/drivers/check.rbs +1 -1
  51. data/sig/steep/drivers/checkfile.rbs +1 -1
  52. data/sig/steep/drivers/diagnostic_printer.rbs +1 -1
  53. data/sig/steep/drivers/watch.rbs +1 -1
  54. data/sig/steep/index/signature_symbol_provider.rbs +1 -1
  55. data/sig/steep/interface/block.rbs +2 -0
  56. data/sig/steep/interface/builder.rbs +5 -3
  57. data/sig/steep/interface/method_type.rbs +5 -3
  58. data/sig/steep/method_name.rbs +5 -1
  59. data/sig/steep/module_helper.rbs +9 -0
  60. data/sig/steep/path_helper.rbs +3 -1
  61. data/sig/steep/server/base_worker.rbs +1 -1
  62. data/sig/steep/server/interaction_worker.rbs +52 -17
  63. data/sig/steep/server/lsp_formatter.rbs +43 -18
  64. data/sig/steep/server/master.rbs +1 -1
  65. data/sig/steep/server/type_check_worker.rbs +7 -5
  66. data/sig/steep/server/worker_process.rbs +6 -4
  67. data/sig/steep/services/completion_provider.rbs +106 -28
  68. data/sig/steep/services/hover_provider/rbs.rbs +13 -9
  69. data/sig/steep/services/signature_help_provider.rbs +39 -0
  70. data/sig/steep/services/type_name_completion.rbs +122 -0
  71. data/sig/steep/type_construction.rbs +99 -30
  72. data/sig/steep/type_inference/block_params.rbs +4 -0
  73. data/sig/steep/type_inference/context.rbs +70 -22
  74. data/sig/steep/type_inference/method_call.rbs +1 -1
  75. data/sig/steep/type_inference/method_params.rbs +43 -24
  76. data/sig/steep/type_inference/multiple_assignment.rbs +1 -1
  77. data/sig/steep/type_inference/send_args.rbs +19 -5
  78. data/sig/steep/typing.rbs +8 -3
  79. data/smoke/diagnostics/test_expectations.yml +1 -0
  80. data/steep.gemspec +0 -1
  81. metadata +12 -16
@@ -1,41 +1,76 @@
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: untyped
10
+ class ApplyChangeJob
11
+ end
12
+
13
+ class HoverJob
14
+ attr_reader id: String
15
+
16
+ attr_reader path: Pathname
17
+
18
+ attr_reader line: Integer
19
+
20
+ attr_reader column: Integer
21
+
22
+ def initialize: (id: String, path: Pathname, line: Integer, column: Integer) -> void
23
+ end
24
+
25
+ class CompletionJob
26
+ attr_reader id: String
27
+
28
+ attr_reader path: Pathname
29
+
30
+ attr_reader line: Integer
31
+
32
+ attr_reader column: Integer
33
+
34
+ attr_reader trigger: String
35
+
36
+ def initialize: (id: String, path: Pathname, line: Integer, column: Integer, trigger: String) -> void
37
+ end
38
+
39
+ class SignatureHelpJob
40
+ attr_reader id: String
7
41
 
8
- HoverJob: untyped
42
+ attr_reader path: Pathname
9
43
 
10
- CompletionJob: untyped
44
+ attr_reader line: Integer
11
45
 
12
- LSP: untyped
46
+ attr_reader column: Integer
13
47
 
14
- attr_reader service: untyped
48
+ def initialize: (id: String, path: Pathname, line: Integer, column: Integer) -> void
49
+ end
15
50
 
16
- def initialize: (project: untyped, reader: untyped, writer: untyped, ?queue: untyped) -> void
51
+ type job = ApplyChangeJob | HoverJob | CompletionJob | SignatureHelpJob
17
52
 
18
- def handle_job: (untyped job) -> untyped
53
+ module LSP = LanguageServer::Protocol
19
54
 
20
- def handle_request: (untyped request) -> untyped
55
+ attr_reader service: Services::TypeCheckService
21
56
 
22
- def process_hover: (untyped job) -> untyped
57
+ def initialize: (project: Project, reader: Reader, writer: Writer, ?queue: Queue) -> void
23
58
 
24
- def process_completion: (untyped job) -> untyped
59
+ def handle_job: (job) -> void
25
60
 
26
- def format_completion_item_for_rbs: (Services::SignatureService sig_service, untyped type_name, untyped context, untyped job, untyped prefix) -> (nil | untyped)
61
+ type lsp_request = { id: String, method: String, params: untyped }
27
62
 
28
- def format_comment: (untyped comment) -> (untyped | nil)
63
+ def handle_request: (lsp_request) -> void
29
64
 
30
- def format_comments: (Array[RBS::AST::Comment] comments) -> untyped?
65
+ def process_hover: (HoverJob job) -> LanguageServer::Protocol::Interface::Hover?
31
66
 
32
- def format_completion_item: (untyped item) -> untyped
67
+ def process_completion: (CompletionJob job) -> LanguageServer::Protocol::Interface::CompletionList?
33
68
 
34
- def method_type_to_snippet: (untyped method_type) -> ::String
69
+ def process_signature_help: (SignatureHelpJob) -> LanguageServer::Protocol::Interface::SignatureHelp?
35
70
 
36
- def params_to_snippet: (untyped fun) -> untyped
71
+ def format_completion_item_for_rbs: (Services::SignatureService, RBS::TypeName, CompletionJob job, String complete_text, Integer prefix_size) -> LanguageServer::Protocol::Interface::CompletionItem
37
72
 
38
- def relative_name_in_context: (untyped type_name, untyped context) -> untyped
73
+ def format_completion_item: (CompletionProvider::item item) -> LanguageServer::Protocol::Interface::CompletionItem
39
74
  end
40
75
  end
41
76
  end
@@ -1,38 +1,63 @@
1
+ use RBS::TypeName
2
+
1
3
  module Steep
2
4
  module Server
5
+ # LSPFormatter translates hover content and completion item to markdown string
6
+ #
7
+ # The class has four main methods:
8
+ #
9
+ # * `markup_content` translates a string to `MarkupContent` object
10
+ # * `format_hover_content` translates a hover content to Markdown string
11
+ # * `format_completion_docs` translates a completion item to a documentation
12
+ # * `format_rbs_competion_docs` generates docs for completion item of RBS
13
+ #
3
14
  module LSPFormatter
4
15
  include Services
5
16
 
6
- class CommentBuilder
7
- @array: Array[String]
17
+ module LSP = LanguageServer::Protocol
18
+
19
+ # Translate given String to MarkupContent
20
+ #
21
+ def self?.markup_content: (String?) -> LanguageServer::Protocol::Interface::MarkupContent?
22
+ | () { () -> String? } -> LanguageServer::Protocol::Interface::MarkupContent?
8
23
 
9
- def initialize: () -> void
24
+ # Translates a hover content to String
25
+ #
26
+ def self?.format_hover_content: (Services::HoverProvider::Ruby::content | Services::HoverProvider::RBS::content) -> String
10
27
 
11
- def self.build: () { (CommentBuilder) -> void } -> String
28
+ # Translates a completion item to String
29
+ def self?.format_completion_docs: (Services::CompletionProvider::item) -> String
12
30
 
13
- def to_s: () -> String
31
+ # Translates a completion item for RBS to String
32
+ def self?.format_rbs_completion_docs: (TypeName, summarizable_decl, Array[RBS::AST::Comment]) -> String
14
33
 
15
- def <<: (String? string) -> void
34
+ def self?.format_comment: (RBS::AST::Comment?, ?header: String?) -> String?
35
+ | (RBS::AST::Comment?, ?header: String?) { (String) -> void } -> void
16
36
 
17
- def push: () { (String) -> void } -> void
18
- end
37
+ def self?.format_comments: (Array[[String, RBS::AST::Comment?]]) -> String
19
38
 
20
- def self?.format_hover_content: (Services::HoverProvider::Ruby::content | Services::HoverProvider::RBS::content) -> untyped
39
+ def self?.local_variable: (Symbol, AST::Types::t) -> String
21
40
 
22
- def self?.to_list: [A < Object] (Enumerable[A] collection) ?{ (A) -> String } -> String
41
+ def self?.instance_variable: (Symbol, AST::Types::t) -> String
23
42
 
24
- def self?.name_and_args: (untyped name, untyped args) -> ::String
43
+ # Renders type application
44
+ def self?.name_and_args: (TypeName name, Array[RBS::Types::t] args) -> String
25
45
 
26
- def self?.name_and_params: (untyped name, untyped params) -> ::String
46
+ # Renders generic type definition
47
+ def self?.name_and_params: (TypeName name, Array[RBS::AST::TypeParam] params) -> String
27
48
 
28
- type summarizable_decl = ::RBS::AST::Declarations::Class
29
- | ::RBS::AST::Declarations::Module
30
- | ::RBS::AST::Declarations::Interface
31
- | ::RBS::AST::Declarations::TypeAlias
32
- | ::RBS::AST::Declarations::ClassAlias
33
- | ::RBS::AST::Declarations::ModuleAlias
49
+ type summarizable_decl = RBS::AST::Declarations::Class
50
+ | RBS::AST::Declarations::Module
51
+ | RBS::AST::Declarations::Interface
52
+ | RBS::AST::Declarations::TypeAlias
53
+ | RBS::AST::Declarations::ClassAlias
54
+ | RBS::AST::Declarations::ModuleAlias
55
+ | RBS::AST::Declarations::Global
56
+ | RBS::AST::Declarations::Constant
34
57
 
35
58
  def self?.declaration_summary: (summarizable_decl) -> String
59
+
60
+ def self?.format_method_item_doc: (Array[_ToS], Array[method_name], Hash[method_name, RBS::AST::Comment?], ?String footer) -> String
36
61
  end
37
62
  end
38
63
  end
@@ -1,7 +1,7 @@
1
1
  module Steep
2
2
  module Server
3
3
  class Master
4
- LSP: singleton(LanguageServer::Protocol)
4
+ module LSP = LanguageServer::Protocol
5
5
 
6
6
  class TypeCheckRequest
7
7
  attr_reader guid: String
@@ -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: Services::PathAssignment
20
+ attr_reader assignment: PathAssignment
19
21
 
20
- attr_reader service: Services::TypeCheckService
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: LanguageServer::Protocol::Transport::Io::Reader,
99
- writer: LanguageServer::Protocol::Transport::Io::Writer,
100
- assignment: Services::PathAssignment,
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: LanguageServer::Protocol::Transport::Io::Reader
26
+ attr_reader reader: LSP::Transport::Io::Reader
25
27
 
26
- attr_reader writer: LanguageServer::Protocol::Transport::Io::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: LanguageServer::Protocol::Transport::Io::Reader,
38
- writer: LanguageServer::Protocol::Transport::Io::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,
@@ -1,6 +1,10 @@
1
+ use RBS::Environment, RBS::TypeName
2
+ use Steep::TypeInference::MethodCall
3
+
1
4
  module Steep
2
5
  module Services
3
6
  class CompletionProvider
7
+ # Cursor position
4
8
  class Position
5
9
  attr_reader line: Integer
6
10
 
@@ -40,7 +44,7 @@ module Steep
40
44
  end
41
45
 
42
46
  class ConstantItem
43
- attr_reader env: RBS::Environment
47
+ attr_reader env: Environment
44
48
 
45
49
  attr_reader identifier: Symbol
46
50
 
@@ -48,35 +52,108 @@ module Steep
48
52
 
49
53
  attr_reader type: AST::Types::t
50
54
 
51
- attr_reader full_name: RBS::TypeName
55
+ attr_reader full_name: TypeName
52
56
 
53
- def initialize: (env: RBS::Environment, identifier: Symbol, range: Range, type: AST::Types::t, full_name: RBS::TypeName) -> void
57
+ def initialize: (env: Environment, identifier: Symbol, range: Range, type: AST::Types::t, full_name: TypeName) -> void
54
58
 
55
59
  def class?: () -> bool
56
60
 
57
61
  def module?: () -> bool
58
62
 
59
- def comments: () -> Array[RBS::AST::Comment]
63
+ def comments: () -> Array[RBS::AST::Comment?]
64
+
65
+ type const_decl = RBS::AST::Declarations::Constant
66
+ | RBS::AST::Declarations::Class
67
+ | RBS::AST::Declarations::Module
68
+ | RBS::AST::Declarations::ClassAlias
69
+ | RBS::AST::Declarations::ModuleAlias
70
+
71
+ def decl: () -> const_decl
60
72
  end
61
73
 
62
- class MethodNameItem
74
+ # Method name completion item with *simple* receiver type
75
+ #
76
+ # Instance type, Singleton type, Interface type is simple.
77
+ # The item may have multiple overloads, but must have single method definition source.
78
+ #
79
+ class SimpleMethodNameItem
63
80
  attr_reader identifier: Symbol
64
81
 
65
82
  attr_reader range: Range
66
83
 
67
- attr_reader receiver_type: AST::Types::t
84
+ attr_reader receiver_type: AST::Types::Name::Instance | AST::Types::Name::Interface | AST::Types::Name::Singleton
68
85
 
69
- attr_reader method_type: untyped
86
+ attr_reader method_types: Array[RBS::MethodType]
70
87
 
71
- attr_reader method_decls: Array[TypeInference::MethodCall::MethodDecl]
88
+ attr_reader method_name: method_name
72
89
 
73
- def initialize: (identifier: Symbol, range: Range, method_type: untyped, method_decls: Array[TypeInference::MethodCall::MethodDecl]) -> void
90
+ attr_reader method_member: RBS::Definition::Method::method_member
74
91
 
75
- def comment: () -> RBS::AST::Comment?
92
+ def initialize: (
93
+ identifier: Symbol,
94
+ range: Range,
95
+ receiver_type: AST::Types::Name::Instance | AST::Types::Name::Interface | AST::Types::Name::Singleton,
96
+ method_name: method_name,
97
+ method_types: Array[RBS::MethodType],
98
+ method_member: RBS::Definition::Method::method_member
99
+ ) -> void
76
100
 
77
- def inherited?: () -> bool
101
+ %a{pure} def comment: () -> RBS::AST::Comment?
78
102
  end
79
103
 
104
+ # Method name completion item with *complex* receiver type
105
+ #
106
+ # The item may have multiple overloads and multiple method declarations.
107
+ #
108
+ class ComplexMethodNameItem
109
+ attr_reader identifier: Symbol
110
+
111
+ attr_reader range: Range
112
+
113
+ attr_reader reeiver_type: AST::Types::t
114
+
115
+ attr_reader method_types: Array[RBS::MethodType]
116
+
117
+ attr_reader method_decls: Array[MethodCall::MethodDecl]
118
+
119
+ def initialize: (
120
+ identifier: Symbol,
121
+ range: Range,
122
+ method_types: Array[RBS::MethodType],
123
+ method_decls: Array[MethodCall::MethodDecl],
124
+ receiver_type: AST::Types::t
125
+ ) -> void
126
+
127
+ def method_names: () -> Array[method_name]
128
+
129
+ def method_definitions: () -> Hash[method_name, RBS::Definition::Method::method_member]
130
+
131
+ def defining_method_name: (TypeName, Symbol name, RBS::Definition::Method::method_member) -> method_name
132
+ end
133
+
134
+ # Method name completion item for generated methods, like `#first` in tuple types
135
+ #
136
+ # The generated methods doesn't have associated `MethodDecl`.
137
+ #
138
+ class GeneratedMethodNameItem
139
+ attr_reader identifier: Symbol
140
+
141
+ attr_reader range: Range
142
+
143
+ attr_reader reeiver_type: AST::Types::t
144
+
145
+ attr_reader method_types: Array[RBS::MethodType]
146
+
147
+ def initialize: (
148
+ identifier: Symbol,
149
+ range: Range,
150
+ receiver_type: AST::Types::t,
151
+ method_types: Array[RBS::MethodType]
152
+ ) -> void
153
+ end
154
+
155
+ type item = InstanceVariableItem | LocalVariableItem | ConstantItem | SimpleMethodNameItem | ComplexMethodNameItem | GeneratedMethodNameItem
156
+
80
157
  attr_reader source_text: String
81
158
 
82
159
  attr_reader path: Pathname
@@ -89,41 +166,42 @@ module Steep
89
166
 
90
167
  attr_reader typing: Typing
91
168
 
92
- def initialize: (source_text: untyped, path: untyped, subtyping: untyped) -> void
169
+ def initialize: (source_text: String, path: Pathname, subtyping: Subtyping::Check) -> void
93
170
 
94
- def type_check!: (untyped text, line: untyped, column: untyped) -> untyped
171
+ def type_check!: (String text, line: Integer, column: Integer) -> void
95
172
 
96
- def env: () -> untyped
173
+ def env: () -> Environment
97
174
 
98
- def run: (line: untyped, column: untyped) -> untyped
175
+ def run: (line: Integer, column: Integer) -> Array[item]
99
176
 
100
- def range_from_loc: (untyped loc) -> untyped
177
+ def range_from_loc: (Parser::Source::Range loc) -> Range
101
178
 
102
- def at_end?: (untyped pos, of: untyped) -> (untyped | nil)
179
+ def at_end?: (Position pos, of: Parser::Source::Map | Parser::Source::Range | nil) -> boolish
103
180
 
104
- def range_for: (untyped position, ?prefix: ::String) -> untyped
181
+ def range_for: (Position position, ?prefix: ::String) -> Range
105
182
 
106
- def items_for_trigger: (position: untyped) -> (::Array[untyped] | untyped)
183
+ def items_for_trigger: (position: Position) -> Array[item]
107
184
 
108
- def items_for_dot: (position: Position) -> ::Array[MethodNameItem]
185
+ def items_for_dot: (position: Position) -> Array[item]
109
186
 
110
- def items_for_colon2: (position: untyped) -> untyped
187
+ def items_for_colon2: (position: Position) -> Array[item]
111
188
 
112
- def items_for_atmark: (position: untyped) -> (::Array[untyped] | untyped)
189
+ def items_for_atmark: (position: Position) -> Array[item]
113
190
 
114
- def method_items_for_receiver_type: (untyped `type`, include_private: untyped, prefix: untyped, position: untyped, items: untyped) -> untyped
191
+ def method_items_for_receiver_type: (AST::Types::t, include_private: bool, prefix: String, position: Position, items: Array[item]) -> void
115
192
 
116
- def word_name?: (String name) -> void
193
+ def word_name?: (String name) -> bool
117
194
 
118
- def local_variable_items_for_context: (TypeInference::Context context, position: Position, prefix: String, items: Array[LocalVariableItem]) -> void
195
+ def local_variable_items_for_context: (TypeInference::Context context, position: Position, prefix: String, items: Array[item]) -> void
119
196
 
120
- def constant_items_for_context: (TypeInference::Context context, position: Position, prefix: String, items: Array[ConstantItem], ?parent: Parser::AST::Node?) -> void
197
+ def constant_items_for_context: (TypeInference::Context context, position: Position, prefix: String, items: Array[item], ?parent: Parser::AST::Node?) -> void
121
198
 
122
- def instance_variable_items_for_context: (TypeInference::Context context, position: Position, prefix: String, items: Array[InstanceVariableItem]) -> void
199
+ def instance_variable_items_for_context: (TypeInference::Context context, position: Position, prefix: String, items: Array[item]) -> void
123
200
 
124
- def index_for: (untyped string, line: untyped, column: untyped) -> untyped
201
+ def index_for: (String, line: Integer, column: Integer) -> Integer
125
202
 
126
203
  def disallowed_method?: (Symbol name) -> bool
204
+
127
205
  end
128
206
  end
129
207
  end
@@ -1,31 +1,33 @@
1
+ use RBS::Location, RBS::AST::Declarations, RBS::AST::Directives, RBS::TypeName, RBS::Environment
2
+
1
3
  module Steep
2
4
  module Services
3
5
  module HoverProvider
4
6
  class RBS
5
7
  class TypeAliasContent
6
- attr_reader location: ::RBS::Location[untyped, untyped]
8
+ attr_reader location: Location[untyped, untyped]
7
9
 
8
- attr_reader decl: ::RBS::AST::Declarations::TypeAlias
10
+ attr_reader decl: Declarations::TypeAlias
9
11
 
10
- def initialize: (location: ::RBS::Location[untyped, untyped], decl: ::RBS::AST::Declarations::TypeAlias) -> void
12
+ def initialize: (location: Location[untyped, untyped], decl: Declarations::TypeAlias) -> void
11
13
  end
12
14
 
13
15
  class ClassContent
14
- attr_reader location: ::RBS::Location[untyped, untyped]
16
+ attr_reader location: Location[untyped, untyped]
15
17
 
16
- type decl = ::RBS::AST::Declarations::Class | ::RBS::AST::Declarations::Module | ::RBS::AST::Declarations::ClassAlias | ::RBS::AST::Declarations::ModuleAlias
18
+ type decl = Declarations::Class | Declarations::Module | Declarations::ClassAlias | Declarations::ModuleAlias
17
19
 
18
20
  attr_reader decl: decl
19
21
 
20
- def initialize: (location: ::RBS::Location[untyped, untyped], decl: decl) -> void
22
+ def initialize: (location: Location[untyped, untyped], decl: decl) -> void
21
23
  end
22
24
 
23
25
  class InterfaceContent
24
- attr_reader location: ::RBS::Location[untyped, untyped]
26
+ attr_reader location: Location[untyped, untyped]
25
27
 
26
- attr_reader decl: ::RBS::AST::Declarations::Interface
28
+ attr_reader decl: Declarations::Interface
27
29
 
28
- def initialize: (location: ::RBS::Location[untyped, untyped], decl: ::RBS::AST::Declarations::Interface) -> void
30
+ def initialize: (location: Location[untyped, untyped], decl: Declarations::Interface) -> void
29
31
  end
30
32
 
31
33
  type content = TypeAliasContent | ClassContent | InterfaceContent
@@ -37,6 +39,8 @@ module Steep
37
39
  def project: () -> Project
38
40
 
39
41
  def content_for: (target: Project::Target, path: Pathname, line: Integer, column: Integer) -> content?
42
+
43
+ def content_for_type_name: (TypeName, env: Environment, location: Location[untyped, untyped]) -> content?
40
44
  end
41
45
  end
42
46
  end
@@ -0,0 +1,39 @@
1
+ use RBS::Environment
2
+
3
+ module Steep
4
+ module Services
5
+ class SignatureHelpProvider
6
+ module MethodCall = TypeInference::MethodCall
7
+
8
+ class Item
9
+ attr_reader method_type: RBS::MethodType
10
+
11
+ attr_reader comment: RBS::AST::Comment?
12
+
13
+ def initialize: (RBS::MethodType, RBS::AST::Comment?) -> void
14
+ end
15
+
16
+ attr_reader source: Source
17
+
18
+ attr_reader path: Pathname
19
+
20
+ attr_reader subtyping: Subtyping::Check
21
+
22
+ attr_reader buffer: RBS::Buffer
23
+
24
+ def env: () -> Environment
25
+
26
+ def initialize: (source: Source, subtyping: Subtyping::Check) -> void
27
+
28
+ # 1-origin line, 0-origin column
29
+ #
30
+ def run: (line: Integer, column: Integer) -> [Array[Item], Integer?]?
31
+
32
+ private
33
+
34
+ def signature_help_for: (Parser::AST::Node, Typing) -> [Array[Item], Integer?]?
35
+
36
+ def type_check!: (line: Integer, column: Integer) -> Typing
37
+ end
38
+ end
39
+ end
@@ -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