steep 1.10.0.pre.3 → 2.0.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.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +87 -0
  3. data/CLAUDE.md +114 -0
  4. data/README.md +1 -1
  5. data/Rakefile +15 -3
  6. data/Steepfile +13 -13
  7. data/lib/steep/annotation_parser.rb +5 -1
  8. data/lib/steep/annotations_helper.rb +12 -2
  9. data/lib/steep/ast/node/type_application.rb +22 -16
  10. data/lib/steep/ast/node/type_assertion.rb +7 -4
  11. data/lib/steep/ast/types/factory.rb +3 -2
  12. data/lib/steep/cli.rb +246 -2
  13. data/lib/steep/daemon/configuration.rb +19 -0
  14. data/lib/steep/daemon/server.rb +476 -0
  15. data/lib/steep/daemon.rb +201 -0
  16. data/lib/steep/diagnostic/ruby.rb +50 -8
  17. data/lib/steep/diagnostic/signature.rb +31 -8
  18. data/lib/steep/drivers/check.rb +301 -140
  19. data/lib/steep/drivers/print_project.rb +9 -10
  20. data/lib/steep/drivers/query.rb +102 -0
  21. data/lib/steep/drivers/start_server.rb +19 -0
  22. data/lib/steep/drivers/stop_server.rb +20 -0
  23. data/lib/steep/drivers/watch.rb +2 -2
  24. data/lib/steep/index/rbs_index.rb +38 -13
  25. data/lib/steep/index/signature_symbol_provider.rb +24 -3
  26. data/lib/steep/interface/builder.rb +48 -15
  27. data/lib/steep/interface/shape.rb +13 -5
  28. data/lib/steep/locator.rb +377 -0
  29. data/lib/steep/project/dsl.rb +26 -5
  30. data/lib/steep/project/group.rb +8 -2
  31. data/lib/steep/project/target.rb +16 -2
  32. data/lib/steep/project.rb +21 -2
  33. data/lib/steep/server/base_worker.rb +2 -2
  34. data/lib/steep/server/change_buffer.rb +2 -1
  35. data/lib/steep/server/custom_methods.rb +12 -0
  36. data/lib/steep/server/inline_source_change_detector.rb +94 -0
  37. data/lib/steep/server/interaction_worker.rb +51 -74
  38. data/lib/steep/server/lsp_formatter.rb +48 -12
  39. data/lib/steep/server/master.rb +100 -18
  40. data/lib/steep/server/target_group_files.rb +124 -151
  41. data/lib/steep/server/type_check_controller.rb +276 -123
  42. data/lib/steep/server/type_check_worker.rb +104 -3
  43. data/lib/steep/services/completion_provider/rbs.rb +74 -0
  44. data/lib/steep/services/completion_provider/ruby.rb +652 -0
  45. data/lib/steep/services/completion_provider/type_name.rb +243 -0
  46. data/lib/steep/services/completion_provider.rb +39 -662
  47. data/lib/steep/services/content_change.rb +14 -1
  48. data/lib/steep/services/file_loader.rb +4 -2
  49. data/lib/steep/services/goto_service.rb +271 -68
  50. data/lib/steep/services/hover_provider/content.rb +67 -0
  51. data/lib/steep/services/hover_provider/rbs.rb +8 -9
  52. data/lib/steep/services/hover_provider/ruby.rb +123 -64
  53. data/lib/steep/services/hover_provider/singleton_methods.rb +4 -0
  54. data/lib/steep/services/signature_service.rb +129 -54
  55. data/lib/steep/services/type_check_service.rb +72 -27
  56. data/lib/steep/signature/validator.rb +30 -18
  57. data/lib/steep/source/ignore_ranges.rb +14 -4
  58. data/lib/steep/source.rb +16 -2
  59. data/lib/steep/tagged_logging.rb +39 -0
  60. data/lib/steep/type_construction.rb +94 -21
  61. data/lib/steep/type_inference/block_params.rb +7 -7
  62. data/lib/steep/type_inference/context.rb +4 -2
  63. data/lib/steep/type_inference/logic_type_interpreter.rb +21 -3
  64. data/lib/steep/type_inference/method_call.rb +4 -0
  65. data/lib/steep/type_inference/type_env.rb +1 -1
  66. data/lib/steep/typing.rb +0 -2
  67. data/lib/steep/version.rb +1 -1
  68. data/lib/steep.rb +42 -32
  69. data/manual/ruby-diagnostics.md +67 -0
  70. data/sample/Steepfile +1 -0
  71. data/sample/lib/conference.rb +1 -0
  72. data/sample/lib/deprecated.rb +6 -0
  73. data/sample/lib/inline.rb +43 -0
  74. data/sample/sig/generics.rbs +3 -0
  75. data/steep.gemspec +4 -5
  76. metadata +26 -26
  77. data/lib/steep/services/type_name_completion.rb +0 -236
@@ -0,0 +1,243 @@
1
+ module Steep
2
+ module Services
3
+ module CompletionProvider
4
+ class TypeName
5
+ module Prefix
6
+ RawIdentPrefix = _ = Struct.new(:ident) do
7
+ # @implements RawIdentPrefix
8
+
9
+ def const_name?
10
+ ident.start_with?(/[A-Z]/)
11
+ end
12
+
13
+ def size
14
+ ident.length
15
+ end
16
+ end
17
+
18
+ NamespacedIdentPrefix = _ = Struct.new(:namespace, :ident, :size) do
19
+ # @implements NamespacedIdentPrefix
20
+
21
+ def const_name?
22
+ ident.start_with?(/[A-Z]/)
23
+ end
24
+ end
25
+
26
+ NamespacePrefix = _ = Struct.new(:namespace, :size)
27
+
28
+ def self.parse(buffer, line:, column:)
29
+ pos = buffer.loc_to_pos([line, column])
30
+ prefix = buffer.content[0...pos] or raise
31
+ prefix.reverse!
32
+
33
+ case prefix
34
+ when /\A((::\w+[A-Z])+(::)?)/
35
+ namespace = $1 or raise
36
+ NamespacePrefix.new(::RBS::Namespace.parse(namespace.reverse), namespace.size)
37
+ when /\A::/
38
+ NamespacePrefix.new(::RBS::Namespace.root, 2)
39
+ when /\A(\w*[A-Za-z_])((::\w+[A-Z])+(::)?)/
40
+ namespace = $1 or raise
41
+ identifier = $2 or raise
42
+ NamespacedIdentPrefix.new(::RBS::Namespace.parse(identifier.reverse), namespace.reverse, namespace.size + identifier.size)
43
+ when /\A(\w*[A-Za-z_])::/
44
+ namespace = $1 or raise
45
+ NamespacedIdentPrefix.new(::RBS::Namespace.root, namespace.reverse, namespace.size + 2)
46
+ when /\A(\w*[A-Za-z_])/
47
+ identifier = $1 or raise
48
+ RawIdentPrefix.new(identifier.reverse)
49
+ end
50
+ end
51
+ end
52
+
53
+ attr_reader :env, :context, :type_name_resolver, :map
54
+
55
+ def initialize(env:, context:, dirs:)
56
+ @env = env
57
+ @context = context
58
+
59
+ table = ::RBS::Environment::UseMap::Table.new()
60
+ table.known_types.merge(env.class_decls.keys)
61
+ table.known_types.merge(env.class_alias_decls.keys)
62
+ table.known_types.merge(env.type_alias_decls.keys)
63
+ table.known_types.merge(env.interface_decls.keys)
64
+ table.compute_children
65
+
66
+ @map = ::RBS::Environment::UseMap.new(table: table)
67
+ dirs.each do |dir|
68
+ case dir
69
+ when ::RBS::AST::Directives::Use
70
+ dir.clauses.each do |clause|
71
+ @map.build_map(clause)
72
+ end
73
+ end
74
+ end
75
+
76
+ @type_name_resolver = ::RBS::Resolver::TypeNameResolver.build(env)
77
+ end
78
+
79
+ def each_outer_module(context = self.context, &block)
80
+ if block
81
+ if (parent, con = context)
82
+ namespace = each_outer_module(parent, &block)
83
+ case con
84
+ when false
85
+ namespace
86
+ when ::RBS::TypeName
87
+ ns = con.with_prefix(namespace).to_namespace
88
+ yield(ns)
89
+ ns
90
+ end
91
+ else
92
+ yield(::RBS::Namespace.root)
93
+ ::RBS::Namespace.root
94
+ end
95
+ else
96
+ enum_for :each_outer_module
97
+ end
98
+ end
99
+
100
+ def each_type_name(&block)
101
+ if block
102
+ env = self.env
103
+
104
+ table = {} #: Hash[::RBS::Namespace, Array[::RBS::TypeName]]
105
+ env.class_decls.each_key do |type_name|
106
+ yield(type_name)
107
+ (table[type_name.namespace] ||= []) << type_name
108
+ end
109
+ env.type_alias_decls.each_key do |type_name|
110
+ yield(type_name)
111
+ (table[type_name.namespace] ||= []) << type_name
112
+ end
113
+ env.interface_decls.each_key do |type_name|
114
+ yield(type_name)
115
+ (table[type_name.namespace] ||= []) << type_name
116
+ end
117
+ env.class_alias_decls.each_key do |type_name|
118
+ yield(type_name)
119
+ (table[type_name.namespace] ||= []) << type_name
120
+ end
121
+
122
+ env.class_alias_decls.each_key do |alias_name|
123
+ normalized_name = env.normalize_module_name?(alias_name) or next
124
+ each_type_name_under(alias_name, normalized_name, table: table, &block)
125
+ end
126
+
127
+ resolve_pairs = [] #: Array[[::RBS::TypeName, ::RBS::TypeName]]
128
+
129
+ map.instance_eval do
130
+ @map.each_key do |name|
131
+ relative_name = ::RBS::TypeName.new(name: name, namespace: ::RBS::Namespace.empty)
132
+ if absolute_name = resolve?(relative_name)
133
+ if env.type_name?(absolute_name)
134
+ # Yields only if the relative type name resolves to existing absolute type name
135
+ resolve_pairs << [relative_name, absolute_name]
136
+ end
137
+ end
138
+ end
139
+ end
140
+
141
+ resolve_pairs.each do |use_name, absolute_name|
142
+ yield use_name
143
+ each_type_name_under(use_name, absolute_name, table: table, &block)
144
+ end
145
+ else
146
+ enum_for :each_type_name
147
+ end
148
+ end
149
+
150
+ def each_type_name_under(module_name, normalized_name, table:, &block)
151
+ if children = table.fetch(normalized_name.to_namespace, nil)
152
+ module_namespace = module_name.to_namespace
153
+
154
+ children.each do |normalized_child_name|
155
+ child_name = ::RBS::TypeName.new(namespace: module_namespace, name: normalized_child_name.name)
156
+
157
+ yield child_name
158
+
159
+ if normalized_child_name.class?
160
+ each_type_name_under(child_name, env.normalize_module_name(normalized_child_name), table: table, &block)
161
+ end
162
+ end
163
+ end
164
+ end
165
+
166
+ def resolve_used_name(name)
167
+ return nil if name.absolute?
168
+
169
+ case
170
+ when resolved = map.resolve?(name)
171
+ resolved
172
+ when name.namespace.empty?
173
+ nil
174
+ else
175
+ if resolved_parent = resolve_used_name(name.namespace.to_type_name)
176
+ resolved_name = ::RBS::TypeName.new(namespace: resolved_parent.to_namespace, name: name.name)
177
+ if env.normalize_type_name?(resolved_name)
178
+ resolved_name
179
+ end
180
+ end
181
+ end
182
+ end
183
+
184
+ def resolve_name_in_context(name)
185
+ if resolved_name = resolve_used_name(name)
186
+ return [resolved_name, name]
187
+ end
188
+
189
+ name.absolute? or raise
190
+
191
+ if normalized_name = env.normalize_type_name?(name)
192
+ name.namespace.path.reverse_each.inject(::RBS::TypeName.new(namespace: ::RBS::Namespace.empty, name: name.name)) do |relative_name, component|
193
+ if type_name_resolver.resolve(relative_name, context: context) == name
194
+ return [normalized_name, relative_name]
195
+ end
196
+
197
+ ::RBS::TypeName.new(
198
+ namespace: ::RBS::Namespace.new(path: [component, *relative_name.namespace.path], absolute: false),
199
+ name: name.name
200
+ )
201
+ end
202
+
203
+ if type_name_resolver.resolve(name.relative!, context: context) == name && !resolve_used_name(name.relative!)
204
+ [normalized_name, name.relative!]
205
+ else
206
+ [normalized_name, name]
207
+ end
208
+ end
209
+ end
210
+
211
+ def find_type_names(prefix)
212
+ case prefix
213
+ when Prefix::RawIdentPrefix
214
+ each_type_name.filter do |type_name|
215
+ type_name.split.any? {|sym| sym.to_s.downcase.include?(prefix.ident.downcase) }
216
+ end
217
+ when Prefix::NamespacedIdentPrefix
218
+ absolute_namespace =
219
+ if prefix.namespace.empty?
220
+ ::RBS::Namespace.root
221
+ else
222
+ type_name_resolver.resolve(prefix.namespace.to_type_name, context: context)&.to_namespace || prefix.namespace
223
+ end
224
+
225
+ each_type_name.filter do|name|
226
+ name.namespace == absolute_namespace &&
227
+ name.name.to_s.downcase.include?(prefix.ident.downcase)
228
+ end
229
+ when Prefix::NamespacePrefix
230
+ absolute_namespace = type_name_resolver.resolve(prefix.namespace.to_type_name, context: context)&.to_namespace || prefix.namespace
231
+ each_type_name.filter {|name| name.namespace == absolute_namespace }
232
+ else
233
+ # Returns all of the accessible type names from the context
234
+ namespaces = each_outer_module.to_set
235
+ # Relative type name means a *use*d type name
236
+ each_type_name.filter {|name| namespaces.include?(name.namespace) || !name.absolute? }
237
+ end
238
+ end
239
+ end
240
+
241
+ end
242
+ end
243
+ end