steep 1.10.0 → 2.1.0.dev.1

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