solargraph 0.58.1 → 0.59.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 (162) hide show
  1. checksums.yaml +4 -4
  2. data/.envrc +3 -0
  3. data/.github/workflows/linting.yml +4 -5
  4. data/.github/workflows/plugins.yml +40 -36
  5. data/.github/workflows/rspec.yml +45 -13
  6. data/.github/workflows/typecheck.yml +2 -2
  7. data/.rubocop_todo.yml +27 -49
  8. data/README.md +3 -3
  9. data/Rakefile +1 -0
  10. data/lib/solargraph/api_map/cache.rb +110 -110
  11. data/lib/solargraph/api_map/constants.rb +289 -279
  12. data/lib/solargraph/api_map/index.rb +204 -193
  13. data/lib/solargraph/api_map/source_to_yard.rb +109 -97
  14. data/lib/solargraph/api_map/store.rb +387 -384
  15. data/lib/solargraph/api_map.rb +1000 -945
  16. data/lib/solargraph/complex_type/conformance.rb +176 -0
  17. data/lib/solargraph/complex_type/type_methods.rb +242 -228
  18. data/lib/solargraph/complex_type/unique_type.rb +632 -482
  19. data/lib/solargraph/complex_type.rb +549 -444
  20. data/lib/solargraph/convention/data_definition/data_definition_node.rb +93 -91
  21. data/lib/solargraph/convention/data_definition.rb +108 -105
  22. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +62 -61
  23. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +103 -102
  24. data/lib/solargraph/convention/struct_definition.rb +168 -164
  25. data/lib/solargraph/diagnostics/require_not_found.rb +54 -53
  26. data/lib/solargraph/diagnostics/rubocop.rb +119 -118
  27. data/lib/solargraph/diagnostics/rubocop_helpers.rb +70 -68
  28. data/lib/solargraph/diagnostics/type_check.rb +56 -55
  29. data/lib/solargraph/doc_map.rb +200 -439
  30. data/lib/solargraph/equality.rb +34 -34
  31. data/lib/solargraph/gem_pins.rb +97 -98
  32. data/lib/solargraph/language_server/host/dispatch.rb +131 -130
  33. data/lib/solargraph/language_server/host/message_worker.rb +113 -112
  34. data/lib/solargraph/language_server/host/sources.rb +100 -99
  35. data/lib/solargraph/language_server/host.rb +883 -878
  36. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +109 -114
  37. data/lib/solargraph/language_server/message/extended/document.rb +24 -23
  38. data/lib/solargraph/language_server/message/text_document/completion.rb +58 -56
  39. data/lib/solargraph/language_server/message/text_document/definition.rb +42 -40
  40. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +28 -26
  41. data/lib/solargraph/language_server/message/text_document/formatting.rb +150 -148
  42. data/lib/solargraph/language_server/message/text_document/hover.rb +60 -58
  43. data/lib/solargraph/language_server/message/text_document/signature_help.rb +25 -24
  44. data/lib/solargraph/language_server/message/text_document/type_definition.rb +27 -25
  45. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +25 -23
  46. data/lib/solargraph/library.rb +729 -683
  47. data/lib/solargraph/location.rb +87 -82
  48. data/lib/solargraph/logging.rb +57 -37
  49. data/lib/solargraph/parser/comment_ripper.rb +76 -69
  50. data/lib/solargraph/parser/flow_sensitive_typing.rb +483 -255
  51. data/lib/solargraph/parser/node_processor/base.rb +122 -92
  52. data/lib/solargraph/parser/node_processor.rb +63 -62
  53. data/lib/solargraph/parser/parser_gem/class_methods.rb +167 -149
  54. data/lib/solargraph/parser/parser_gem/node_chainer.rb +191 -166
  55. data/lib/solargraph/parser/parser_gem/node_methods.rb +506 -486
  56. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
  57. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +61 -59
  58. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +24 -15
  59. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -46
  60. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +60 -53
  61. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +53 -23
  62. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +41 -40
  63. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +30 -29
  64. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +61 -59
  65. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
  66. data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
  67. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
  68. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +39 -38
  69. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +53 -52
  70. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +296 -291
  71. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
  72. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +33 -29
  73. data/lib/solargraph/parser/parser_gem/node_processors.rb +74 -70
  74. data/lib/solargraph/parser/region.rb +75 -69
  75. data/lib/solargraph/parser/snippet.rb +17 -17
  76. data/lib/solargraph/pin/base.rb +761 -729
  77. data/lib/solargraph/pin/base_variable.rb +418 -126
  78. data/lib/solargraph/pin/block.rb +126 -104
  79. data/lib/solargraph/pin/breakable.rb +13 -9
  80. data/lib/solargraph/pin/callable.rb +278 -231
  81. data/lib/solargraph/pin/closure.rb +68 -72
  82. data/lib/solargraph/pin/common.rb +94 -79
  83. data/lib/solargraph/pin/compound_statement.rb +55 -0
  84. data/lib/solargraph/pin/conversions.rb +124 -123
  85. data/lib/solargraph/pin/delegated_method.rb +131 -120
  86. data/lib/solargraph/pin/documenting.rb +115 -114
  87. data/lib/solargraph/pin/instance_variable.rb +38 -34
  88. data/lib/solargraph/pin/keyword.rb +16 -20
  89. data/lib/solargraph/pin/local_variable.rb +31 -75
  90. data/lib/solargraph/pin/method.rb +720 -672
  91. data/lib/solargraph/pin/method_alias.rb +42 -34
  92. data/lib/solargraph/pin/namespace.rb +121 -115
  93. data/lib/solargraph/pin/parameter.rb +338 -275
  94. data/lib/solargraph/pin/proxy_type.rb +40 -39
  95. data/lib/solargraph/pin/reference/override.rb +47 -47
  96. data/lib/solargraph/pin/reference/superclass.rb +17 -15
  97. data/lib/solargraph/pin/reference.rb +41 -39
  98. data/lib/solargraph/pin/search.rb +62 -61
  99. data/lib/solargraph/pin/signature.rb +69 -61
  100. data/lib/solargraph/pin/symbol.rb +53 -53
  101. data/lib/solargraph/pin/until.rb +18 -18
  102. data/lib/solargraph/pin/while.rb +18 -18
  103. data/lib/solargraph/pin.rb +46 -44
  104. data/lib/solargraph/pin_cache.rb +665 -245
  105. data/lib/solargraph/position.rb +118 -119
  106. data/lib/solargraph/range.rb +112 -112
  107. data/lib/solargraph/rbs_map/conversions.rb +846 -823
  108. data/lib/solargraph/rbs_map/core_map.rb +65 -58
  109. data/lib/solargraph/rbs_map/stdlib_map.rb +72 -43
  110. data/lib/solargraph/rbs_map.rb +217 -163
  111. data/lib/solargraph/shell.rb +397 -352
  112. data/lib/solargraph/source/chain/call.rb +372 -337
  113. data/lib/solargraph/source/chain/constant.rb +28 -26
  114. data/lib/solargraph/source/chain/hash.rb +35 -34
  115. data/lib/solargraph/source/chain/if.rb +29 -28
  116. data/lib/solargraph/source/chain/instance_variable.rb +34 -13
  117. data/lib/solargraph/source/chain/literal.rb +53 -48
  118. data/lib/solargraph/source/chain/or.rb +31 -23
  119. data/lib/solargraph/source/chain.rb +294 -291
  120. data/lib/solargraph/source/change.rb +89 -82
  121. data/lib/solargraph/source/cursor.rb +172 -166
  122. data/lib/solargraph/source/source_chainer.rb +204 -194
  123. data/lib/solargraph/source/updater.rb +59 -55
  124. data/lib/solargraph/source.rb +524 -498
  125. data/lib/solargraph/source_map/clip.rb +237 -226
  126. data/lib/solargraph/source_map/data.rb +37 -34
  127. data/lib/solargraph/source_map/mapper.rb +282 -259
  128. data/lib/solargraph/source_map.rb +220 -212
  129. data/lib/solargraph/type_checker/problem.rb +34 -32
  130. data/lib/solargraph/type_checker/rules.rb +157 -84
  131. data/lib/solargraph/type_checker.rb +895 -814
  132. data/lib/solargraph/version.rb +1 -1
  133. data/lib/solargraph/workspace/config.rb +257 -255
  134. data/lib/solargraph/workspace/gemspecs.rb +367 -0
  135. data/lib/solargraph/workspace/require_paths.rb +98 -97
  136. data/lib/solargraph/workspace.rb +362 -220
  137. data/lib/solargraph/yard_map/helpers.rb +45 -44
  138. data/lib/solargraph/yard_map/mapper/to_method.rb +134 -130
  139. data/lib/solargraph/yard_map/mapper/to_namespace.rb +32 -31
  140. data/lib/solargraph/yard_map/mapper.rb +84 -79
  141. data/lib/solargraph/yardoc.rb +97 -87
  142. data/lib/solargraph.rb +126 -105
  143. data/rbs/fills/rubygems/0/dependency.rbs +193 -0
  144. data/rbs/fills/tuple/tuple.rbs +28 -0
  145. data/rbs/shims/ast/0/node.rbs +5 -0
  146. data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
  147. data/rbs_collection.yaml +1 -1
  148. data/solargraph.gemspec +2 -1
  149. metadata +22 -17
  150. data/lib/solargraph/type_checker/checks.rb +0 -124
  151. data/lib/solargraph/type_checker/param_def.rb +0 -37
  152. data/lib/solargraph/yard_map/to_method.rb +0 -89
  153. data/sig/shims/ast/0/node.rbs +0 -5
  154. /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
  155. /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
  156. /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
  157. /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
  158. /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
  159. /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
  160. /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
  161. /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
  162. /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
@@ -1,149 +1,167 @@
1
- # frozen_string_literal: true
2
-
3
- require 'prism'
4
-
5
- module Solargraph
6
- module Parser
7
- module ParserGem
8
- module ClassMethods
9
- # @param code [String]
10
- # @param filename [String, nil]
11
- # @return [Array(Parser::AST::Node, Hash{Integer => Solargraph::Parser::Snippet})]
12
- def parse_with_comments code, filename = nil
13
- node = parse(code, filename)
14
- comments = CommentRipper.new(code, filename, 0).parse
15
- [node, comments]
16
- end
17
-
18
- # @param code [String]
19
- # @param filename [String, nil]
20
- # @param line [Integer]
21
- # @return [Parser::AST::Node]
22
- def parse code, filename = nil, line = 0
23
- buffer = ::Parser::Source::Buffer.new(filename, line)
24
- buffer.source = code
25
- parser.parse(buffer)
26
- rescue ::Parser::SyntaxError, ::Parser::UnknownEncodingInMagicComment => e
27
- raise Parser::SyntaxError, e.message
28
- end
29
-
30
- # @return [::Parser::Base]
31
- def parser
32
- @parser ||= Prism::Translation::Parser.new(FlawedBuilder.new).tap do |parser|
33
- parser.diagnostics.all_errors_are_fatal = true
34
- parser.diagnostics.ignore_warnings = true
35
- end
36
- end
37
-
38
- # @param source [Source]
39
- # @return [Array(Array<Pin::Base>, Array<Pin::Base>)]
40
- def map source
41
- NodeProcessor.process(source.node, Region.new(source: source))
42
- end
43
-
44
- # @param source [Source]
45
- # @param name [String]
46
- # @return [Array<Location>]
47
- def references source, name
48
- if name.end_with?("=")
49
- reg = /#{Regexp.escape name[0..-2]}\s*=/
50
- # @param code [String]
51
- # @param offset [Integer]
52
- # @return [Array(Integer, Integer), Array(nil, nil)]
53
- extract_offset = ->(code, offset) { reg.match(code, offset).offset(0) }
54
- else
55
- # @param code [String]
56
- # @param offset [Integer]
57
- # @return [Array(Integer, Integer), Array(nil, nil)]
58
- extract_offset = ->(code, offset) { [soff = code.index(name, offset), soff + name.length] }
59
- end
60
- inner_node_references(name, source.node).map do |n|
61
- rng = Range.from_node(n)
62
- offset = Position.to_offset(source.code, rng.start)
63
- soff, eoff = extract_offset[source.code, offset]
64
- Location.new(
65
- source.filename,
66
- Range.new(
67
- Position.from_offset(source.code, soff),
68
- Position.from_offset(source.code, eoff)
69
- )
70
- )
71
- end
72
- end
73
-
74
- # @param name [String]
75
- # @param top [AST::Node]
76
- # @return [Array<AST::Node>]
77
- def inner_node_references name, top
78
- # @type [Array<AST::Node>]
79
- result = []
80
- if top.is_a?(AST::Node) && top.to_s.include?(":#{name}")
81
- result.push top if top.children.any? { |c| c.to_s == name }
82
- top.children.each { |c| result.concat inner_node_references(name, c) }
83
- end
84
- result
85
- end
86
-
87
- # @return [Source::Chain]
88
- def chain *args
89
- NodeChainer.chain *args
90
- end
91
-
92
- # @return [Source::Chain]
93
- def chain_string *args
94
- NodeChainer.load_string *args
95
- end
96
-
97
- # @return [Array(Array<Pin::Base>, Array<Pin::Base>)]
98
- def process_node *args
99
- Solargraph::Parser::NodeProcessor.process *args
100
- end
101
-
102
- # @param node [Parser::AST::Node]
103
- # @return [String, nil]
104
- def infer_literal_node_type node
105
- NodeMethods.infer_literal_node_type node
106
- end
107
-
108
- # @return [Integer]
109
- def version
110
- parser.version
111
- end
112
-
113
- # @param node [BasicObject]
114
- # @return [Boolean]
115
- def is_ast_node? node
116
- node.is_a?(::Parser::AST::Node)
117
- end
118
-
119
- # @param node [Parser::AST::Node]
120
- # @return [Range]
121
- def node_range node
122
- st = Position.new(node.loc.line, node.loc.column)
123
- en = Position.new(node.loc.last_line, node.loc.last_column)
124
- Range.new(st, en)
125
- end
126
-
127
- # @param node [Parser::AST::Node]
128
- # @return [Array<Range>]
129
- def string_ranges node
130
- return [] unless is_ast_node?(node)
131
- result = []
132
- result.push Range.from_node(node) if node.type == :str
133
- node.children.each do |child|
134
- result.concat string_ranges(child)
135
- end
136
- if node.type == :dstr && node.children.last.nil?
137
- last = node.children[-2]
138
- unless last.nil?
139
- rng = Range.from_node(last)
140
- pos = Position.new(rng.ending.line, rng.ending.column - 1)
141
- result.push Range.new(pos, pos)
142
- end
143
- end
144
- result
145
- end
146
- end
147
- end
148
- end
149
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'prism'
4
+
5
+ module Solargraph
6
+ module Parser
7
+ module ParserGem
8
+ module ClassMethods
9
+ # @param code [String]
10
+ # @param filename [String, nil]
11
+ # @param starting_line [Integer] must be provided so that we
12
+ # can find relevant local variables later even if this is just
13
+ # a subset of the file in question
14
+ # @return [Array(Parser::AST::Node, Hash{Integer => Solargraph::Parser::Snippet})]
15
+ def parse_with_comments code, filename = nil, starting_line = 0
16
+ node = parse(code, filename, starting_line)
17
+ comments = CommentRipper.new(code, filename, 0).parse
18
+ [node, comments]
19
+ end
20
+
21
+ # @param code [String]
22
+ # @param filename [String, nil]
23
+ # @param starting_line [Integer]
24
+ # @sg-ignore need to understand that raise does not return
25
+ # @return [Parser::AST::Node]
26
+ def parse code, filename = nil, starting_line = 0
27
+ buffer = ::Parser::Source::Buffer.new(filename, starting_line)
28
+ buffer.source = code
29
+ parser.parse(buffer)
30
+ rescue ::Parser::SyntaxError, ::Parser::UnknownEncodingInMagicComment => e
31
+ raise Parser::SyntaxError, e.message
32
+ end
33
+
34
+ # @return [::Parser::Base]
35
+ def parser
36
+ @parser ||= Prism::Translation::Parser.new(FlawedBuilder.new).tap do |parser|
37
+ # @sg-ignore Unresolved call to diagnostics on Prism::Translation::Parser
38
+ parser.diagnostics.all_errors_are_fatal = true
39
+ # @sg-ignore Unresolved call to diagnostics on Prism::Translation::Parser
40
+ parser.diagnostics.ignore_warnings = true
41
+ end
42
+ end
43
+
44
+ # @param source [Source]
45
+ # @return [Array(Array<Pin::Base>, Array<Pin::LocalVariable>)]
46
+ def map source
47
+ # @sg-ignore Need to add nil check here
48
+ pins, locals, ivars = NodeProcessor.process(source.node, Region.new(source: source))
49
+ pins.concat(ivars)
50
+ [pins, locals]
51
+ end
52
+
53
+ # @param source [Source]
54
+ # @param name [String]
55
+ # @return [Array<Location>]
56
+ def references source, name
57
+ if name.end_with?("=")
58
+ reg = /#{Regexp.escape name[0..-2]}\s*=/
59
+ # @param code [String]
60
+ # @param offset [Integer]
61
+ # @return [Array(Integer, Integer), Array(nil, nil)]
62
+ # @sg-ignore Need to add nil check here
63
+ extract_offset = ->(code, offset) { reg.match(code, offset).offset(0) }
64
+ else
65
+ # @param code [String]
66
+ # @param offset [Integer]
67
+ # @return [Array(Integer, Integer), Array(nil, nil)]
68
+ # @sg-ignore Need to add nil check here
69
+ extract_offset = ->(code, offset) { [soff = code.index(name, offset), soff + name.length] }
70
+ end
71
+ inner_node_references(name, source.node).map do |n|
72
+ rng = Range.from_node(n)
73
+ # @sg-ignore Need to add nil check here
74
+ offset = Position.to_offset(source.code, rng.start)
75
+ soff, eoff = extract_offset[source.code, offset]
76
+ Location.new(
77
+ source.filename,
78
+ Range.new(
79
+ Position.from_offset(source.code, soff),
80
+ Position.from_offset(source.code, eoff)
81
+ )
82
+ )
83
+ end
84
+ end
85
+
86
+ # @param name [String]
87
+ # @param top [AST::Node]
88
+ # @return [Array<AST::Node>]
89
+ def inner_node_references name, top
90
+ # @type [Array<AST::Node>]
91
+ result = []
92
+ if top.is_a?(AST::Node) && top.to_s.include?(":#{name}")
93
+ result.push top if top.children.any? { |c| c.to_s == name }
94
+ top.children.each { |c| result.concat inner_node_references(name, c) }
95
+ end
96
+ result
97
+ end
98
+
99
+ # @return [Source::Chain]
100
+ def chain *args
101
+ NodeChainer.chain *args
102
+ end
103
+
104
+ # @return [Source::Chain]
105
+ def chain_string *args
106
+ NodeChainer.load_string *args
107
+ end
108
+
109
+ # @return [Array(Array<Pin::Base>, Array<Pin::Base>)]
110
+ def process_node *args
111
+ Solargraph::Parser::NodeProcessor.process *args
112
+ end
113
+
114
+ # @param node [Parser::AST::Node, nil]
115
+ # @return [String, nil]
116
+ def infer_literal_node_type node
117
+ NodeMethods.infer_literal_node_type node
118
+ end
119
+
120
+ # @return [Integer]
121
+ def version
122
+ parser.version
123
+ end
124
+
125
+ # @param node [BasicObject, nil]
126
+ # @return [Boolean]
127
+ def is_ast_node? node
128
+ node.is_a?(::Parser::AST::Node)
129
+ end
130
+
131
+ # @param node [Parser::AST::Node]
132
+ # @return [Range]
133
+ def node_range node
134
+ st = Position.new(node.loc.line, node.loc.column)
135
+ en = Position.new(node.loc.last_line, node.loc.last_column)
136
+ Range.new(st, en)
137
+ end
138
+
139
+ # @param node [Parser::AST::Node, nil]
140
+ # @return [Array<Range>]
141
+ def string_ranges node
142
+ return [] unless is_ast_node?(node)
143
+ result = []
144
+ # @sg-ignore Translate to something flow sensitive typing understands
145
+ result.push Range.from_node(node) if node.type == :str
146
+ # @sg-ignore Translate to something flow sensitive typing understands
147
+ node.children.each do |child|
148
+ result.concat string_ranges(child)
149
+ end
150
+ # @sg-ignore Translate to something flow sensitive typing understands
151
+ if node.type == :dstr && node.children.last.nil?
152
+ # @sg-ignore Translate to something flow sensitive typing understands
153
+ last = node.children[-2]
154
+ # @sg-ignore Need to add nil check here
155
+ unless last.nil?
156
+ rng = Range.from_node(last)
157
+ # @sg-ignore Need to add nil check here
158
+ pos = Position.new(rng.ending.line, rng.ending.column - 1)
159
+ result.push Range.new(pos, pos)
160
+ end
161
+ end
162
+ result
163
+ end
164
+ end
165
+ end
166
+ end
167
+ end