steep 1.4.0.dev.2 → 1.4.0.dev.3

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 (67) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +1 -2
  3. data/Gemfile +1 -1
  4. data/Gemfile.lock +7 -9
  5. data/Gemfile.steep +1 -2
  6. data/Gemfile.steep.lock +9 -10
  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 +79 -4
  15. data/lib/steep/drivers/check.rb +4 -4
  16. data/lib/steep/interface/block.rb +10 -0
  17. data/lib/steep/module_helper.rb +13 -11
  18. data/lib/steep/path_helper.rb +4 -0
  19. data/lib/steep/server/interaction_worker.rb +105 -92
  20. data/lib/steep/services/type_name_completion.rb +157 -0
  21. data/lib/steep/source.rb +1 -0
  22. data/lib/steep/type_construction.rb +402 -229
  23. data/lib/steep/type_inference/block_params.rb +13 -0
  24. data/lib/steep/type_inference/context.rb +3 -3
  25. data/lib/steep/type_inference/method_params.rb +42 -16
  26. data/lib/steep/type_inference/send_args.rb +79 -50
  27. data/lib/steep/type_inference/type_env.rb +7 -1
  28. data/lib/steep/version.rb +1 -1
  29. data/lib/steep.rb +1 -0
  30. data/rbs_collection.steep.lock.yaml +0 -28
  31. data/rbs_collection.steep.yaml +10 -9
  32. data/sample/lib/conference.rb +12 -0
  33. data/sample/sig/conference.rbs +5 -0
  34. data/sig/shims/language-server_protocol.rbs +12 -0
  35. data/sig/shims/parser/nodes.rbs +37 -0
  36. data/sig/shims/parser.rbs +1 -0
  37. data/sig/shims/string.rbs +4 -0
  38. data/sig/steep/ast/types/factory.rbs +10 -8
  39. data/sig/steep/diagnostic/lsp_formatter.rbs +1 -1
  40. data/sig/steep/diagnostic/ruby.rbs +38 -2
  41. data/sig/steep/drivers/check.rbs +1 -1
  42. data/sig/steep/drivers/checkfile.rbs +1 -1
  43. data/sig/steep/drivers/diagnostic_printer.rbs +1 -1
  44. data/sig/steep/drivers/watch.rbs +1 -1
  45. data/sig/steep/index/signature_symbol_provider.rbs +1 -1
  46. data/sig/steep/interface/block.rbs +2 -0
  47. data/sig/steep/interface/builder.rbs +5 -3
  48. data/sig/steep/interface/method_type.rbs +5 -3
  49. data/sig/steep/module_helper.rbs +9 -0
  50. data/sig/steep/path_helper.rbs +3 -1
  51. data/sig/steep/server/base_worker.rbs +1 -1
  52. data/sig/steep/server/interaction_worker.rbs +46 -17
  53. data/sig/steep/server/master.rbs +1 -1
  54. data/sig/steep/server/type_check_worker.rbs +7 -5
  55. data/sig/steep/server/worker_process.rbs +6 -4
  56. data/sig/steep/services/completion_provider.rbs +2 -0
  57. data/sig/steep/services/type_name_completion.rbs +122 -0
  58. data/sig/steep/type_construction.rbs +99 -30
  59. data/sig/steep/type_inference/block_params.rbs +4 -0
  60. data/sig/steep/type_inference/context.rbs +70 -22
  61. data/sig/steep/type_inference/method_params.rbs +43 -24
  62. data/sig/steep/type_inference/multiple_assignment.rbs +1 -1
  63. data/sig/steep/type_inference/send_args.rbs +13 -3
  64. data/sig/steep/typing.rbs +7 -2
  65. data/smoke/diagnostics/test_expectations.yml +1 -0
  66. data/steep.gemspec +0 -1
  67. metadata +10 -16
@@ -0,0 +1,157 @@
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
+ map.instance_eval do
94
+ @map.each_key do |name|
95
+ yield RBS::TypeName.new(name: name, namespace: RBS::Namespace.empty)
96
+ end
97
+ end
98
+ env.class_decls.each_key(&block)
99
+ env.class_alias_decls.each_key(&block)
100
+ env.type_alias_decls.each_key(&block)
101
+ env.interface_decls.each_key(&block)
102
+ else
103
+ enum_for :each_type_name
104
+ end
105
+ end
106
+
107
+ def resolve_name_in_context(name)
108
+ if resolved_name = map.resolve?(name)
109
+ return [resolved_name, name]
110
+ end
111
+
112
+ name.absolute? or raise
113
+
114
+ name.namespace.path.reverse_each.inject(RBS::TypeName.new(namespace: RBS::Namespace.empty, name: name.name)) do |relative_name, component|
115
+ if type_name_resolver.resolve(relative_name, context: context) == name
116
+ return [name, relative_name]
117
+ end
118
+
119
+ RBS::TypeName.new(
120
+ namespace: RBS::Namespace.new(path: [component, *relative_name.namespace.path], absolute: false),
121
+ name: name.name
122
+ )
123
+ end
124
+
125
+ if type_name_resolver.resolve(name.relative!, context: context) == name && !map.resolve?(name.relative!)
126
+ [name, name.relative!]
127
+ else
128
+ [name, name]
129
+ end
130
+ end
131
+
132
+ def find_type_names(prefix)
133
+ case prefix
134
+ when Prefix::RawIdentPrefix
135
+ each_type_name.filter do |type_name|
136
+ type_name.split.any? {|sym| sym.to_s.downcase.include?(prefix.ident.downcase) }
137
+ end
138
+ when Prefix::NamespacedIdentPrefix
139
+ absolute_namespace = type_name_resolver.resolve(prefix.namespace.to_type_name, context: context)&.to_namespace || prefix.namespace
140
+
141
+ each_type_name.filter do|name|
142
+ name.namespace == absolute_namespace &&
143
+ name.name.to_s.downcase.include?(prefix.ident.downcase)
144
+ end
145
+ when Prefix::NamespacePrefix
146
+ absolute_namespace = type_name_resolver.resolve(prefix.namespace.to_type_name, context: context)&.to_namespace || prefix.namespace
147
+ each_type_name.filter {|name| name.namespace == absolute_namespace }
148
+ else
149
+ # Returns all of the accessible type names from the context
150
+ namespaces = each_outer_module.to_set
151
+ # Relative type name means a *use*d type name
152
+ each_type_name.filter {|name| namespaces.include?(name.namespace) || !name.absolute? }
153
+ end
154
+ end
155
+ end
156
+ end
157
+ 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