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
@@ -0,0 +1,165 @@
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
+ NamespacePrefix.new(RBS::Namespace.parse($1.reverse), $1.size)
35
+ when /\A::/
36
+ NamespacePrefix.new(RBS::Namespace.root, 2)
37
+ when /\A(\w*[A-Za-z_])((::\w+[A-Z])+(::)?)/
38
+ NamespacedIdentPrefix.new(RBS::Namespace.parse($2.reverse), $1.reverse, $1.size + $2.size)
39
+ when /\A(\w*[A-Za-z_])::/
40
+ NamespacedIdentPrefix.new(RBS::Namespace.root, $1.reverse, $1.size + 2)
41
+ when /\A(\w*[A-Za-z_])/
42
+ RawIdentPrefix.new($1.reverse)
43
+ end
44
+ end
45
+ end
46
+
47
+ attr_reader :env, :context, :type_name_resolver, :map
48
+
49
+ def initialize(env:, context:, dirs:)
50
+ @env = env
51
+ @context = context
52
+
53
+ table = RBS::Environment::UseMap::Table.new()
54
+ table.known_types.merge(env.class_decls.keys)
55
+ table.known_types.merge(env.class_alias_decls.keys)
56
+ table.known_types.merge(env.type_alias_decls.keys)
57
+ table.known_types.merge(env.interface_decls.keys)
58
+ table.compute_children
59
+
60
+ @map = RBS::Environment::UseMap.new(table: table)
61
+ dirs.each do |dir|
62
+ dir.clauses.each do |clause|
63
+ @map.build_map(clause)
64
+ end
65
+ end
66
+
67
+ @type_name_resolver = RBS::Resolver::TypeNameResolver.new(env)
68
+ end
69
+
70
+ def each_outer_module(context = self.context, &block)
71
+ if block
72
+ if (parent, con = context)
73
+ namespace = each_outer_module(parent, &block)
74
+ case con
75
+ when false
76
+ namespace
77
+ when RBS::TypeName
78
+ ns = con.with_prefix(namespace).to_namespace
79
+ yield(ns)
80
+ ns
81
+ end
82
+ else
83
+ yield(RBS::Namespace.root)
84
+ RBS::Namespace.root
85
+ end
86
+ else
87
+ enum_for :each_outer_module
88
+ end
89
+ end
90
+
91
+ def each_type_name(&block)
92
+ if block
93
+ env = self.env
94
+
95
+ map.instance_eval do
96
+ @map.each_key do |name|
97
+ relative_name = RBS::TypeName.new(name: name, namespace: RBS::Namespace.empty)
98
+ if absolute_name = resolve?(relative_name)
99
+ if env.type_name?(absolute_name)
100
+ # Yields only if the relative type name resolves to existing absolute type name
101
+ yield relative_name
102
+ end
103
+ end
104
+ end
105
+ end
106
+ env.class_decls.each_key(&block)
107
+ env.class_alias_decls.each_key(&block)
108
+ env.type_alias_decls.each_key(&block)
109
+ env.interface_decls.each_key(&block)
110
+ else
111
+ enum_for :each_type_name
112
+ end
113
+ end
114
+
115
+ def resolve_name_in_context(name)
116
+ if resolved_name = map.resolve?(name)
117
+ return [resolved_name, name]
118
+ end
119
+
120
+ name.absolute? or raise
121
+
122
+ name.namespace.path.reverse_each.inject(RBS::TypeName.new(namespace: RBS::Namespace.empty, name: name.name)) do |relative_name, component|
123
+ if type_name_resolver.resolve(relative_name, context: context) == name
124
+ return [name, relative_name]
125
+ end
126
+
127
+ RBS::TypeName.new(
128
+ namespace: RBS::Namespace.new(path: [component, *relative_name.namespace.path], absolute: false),
129
+ name: name.name
130
+ )
131
+ end
132
+
133
+ if type_name_resolver.resolve(name.relative!, context: context) == name && !map.resolve?(name.relative!)
134
+ [name, name.relative!]
135
+ else
136
+ [name, name]
137
+ end
138
+ end
139
+
140
+ def find_type_names(prefix)
141
+ case prefix
142
+ when Prefix::RawIdentPrefix
143
+ each_type_name.filter do |type_name|
144
+ type_name.split.any? {|sym| sym.to_s.downcase.include?(prefix.ident.downcase) }
145
+ end
146
+ when Prefix::NamespacedIdentPrefix
147
+ absolute_namespace = type_name_resolver.resolve(prefix.namespace.to_type_name, context: context)&.to_namespace || prefix.namespace
148
+
149
+ each_type_name.filter do|name|
150
+ name.namespace == absolute_namespace &&
151
+ name.name.to_s.downcase.include?(prefix.ident.downcase)
152
+ end
153
+ when Prefix::NamespacePrefix
154
+ absolute_namespace = type_name_resolver.resolve(prefix.namespace.to_type_name, context: context)&.to_namespace || prefix.namespace
155
+ each_type_name.filter {|name| name.namespace == absolute_namespace }
156
+ else
157
+ # Returns all of the accessible type names from the context
158
+ namespaces = each_outer_module.to_set
159
+ # Relative type name means a *use*d type name
160
+ each_type_name.filter {|name| namespaces.include?(name.namespace) || !name.absolute? }
161
+ end
162
+ end
163
+ end
164
+ end
165
+ end
data/lib/steep/source.rb CHANGED
@@ -20,6 +20,7 @@ module Steep
20
20
  self.emit_lambda = true
21
21
  self.emit_procarg0 = true
22
22
  self.emit_kwargs = true
23
+ self.emit_forward_arg = true
23
24
  end
24
25
 
25
26
  def self.new_parser