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

Sign up to get free protection for your applications and to get access to all the features.
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