solargraph 0.58.0 → 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 (166) hide show
  1. checksums.yaml +4 -4
  2. data/.envrc +3 -0
  3. data/.gitattributes +2 -0
  4. data/.github/workflows/linting.yml +4 -5
  5. data/.github/workflows/plugins.yml +40 -36
  6. data/.github/workflows/rspec.yml +45 -13
  7. data/.github/workflows/typecheck.yml +2 -2
  8. data/.rubocop_todo.yml +27 -49
  9. data/CHANGELOG.md +3 -0
  10. data/README.md +3 -3
  11. data/Rakefile +1 -0
  12. data/bin/solargraph +8 -8
  13. data/lib/solargraph/api_map/cache.rb +110 -110
  14. data/lib/solargraph/api_map/constants.rb +289 -279
  15. data/lib/solargraph/api_map/index.rb +204 -193
  16. data/lib/solargraph/api_map/source_to_yard.rb +109 -97
  17. data/lib/solargraph/api_map/store.rb +387 -384
  18. data/lib/solargraph/api_map.rb +1000 -945
  19. data/lib/solargraph/complex_type/conformance.rb +176 -0
  20. data/lib/solargraph/complex_type/type_methods.rb +242 -228
  21. data/lib/solargraph/complex_type/unique_type.rb +632 -482
  22. data/lib/solargraph/complex_type.rb +549 -444
  23. data/lib/solargraph/convention/data_definition/data_definition_node.rb +93 -91
  24. data/lib/solargraph/convention/data_definition.rb +108 -105
  25. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +62 -61
  26. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +103 -102
  27. data/lib/solargraph/convention/struct_definition.rb +168 -164
  28. data/lib/solargraph/diagnostics/require_not_found.rb +54 -53
  29. data/lib/solargraph/diagnostics/rubocop.rb +119 -118
  30. data/lib/solargraph/diagnostics/rubocop_helpers.rb +70 -68
  31. data/lib/solargraph/diagnostics/type_check.rb +56 -55
  32. data/lib/solargraph/doc_map.rb +200 -439
  33. data/lib/solargraph/equality.rb +34 -34
  34. data/lib/solargraph/gem_pins.rb +97 -98
  35. data/lib/solargraph/language_server/host/dispatch.rb +131 -130
  36. data/lib/solargraph/language_server/host/message_worker.rb +113 -112
  37. data/lib/solargraph/language_server/host/sources.rb +100 -99
  38. data/lib/solargraph/language_server/host.rb +883 -878
  39. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +109 -114
  40. data/lib/solargraph/language_server/message/extended/document.rb +24 -23
  41. data/lib/solargraph/language_server/message/text_document/completion.rb +58 -56
  42. data/lib/solargraph/language_server/message/text_document/definition.rb +42 -40
  43. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +28 -26
  44. data/lib/solargraph/language_server/message/text_document/formatting.rb +150 -148
  45. data/lib/solargraph/language_server/message/text_document/hover.rb +60 -58
  46. data/lib/solargraph/language_server/message/text_document/signature_help.rb +25 -24
  47. data/lib/solargraph/language_server/message/text_document/type_definition.rb +27 -25
  48. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +25 -23
  49. data/lib/solargraph/library.rb +729 -683
  50. data/lib/solargraph/location.rb +87 -82
  51. data/lib/solargraph/logging.rb +57 -37
  52. data/lib/solargraph/parser/comment_ripper.rb +76 -69
  53. data/lib/solargraph/parser/flow_sensitive_typing.rb +483 -255
  54. data/lib/solargraph/parser/node_processor/base.rb +122 -92
  55. data/lib/solargraph/parser/node_processor.rb +63 -62
  56. data/lib/solargraph/parser/parser_gem/class_methods.rb +167 -149
  57. data/lib/solargraph/parser/parser_gem/node_chainer.rb +191 -166
  58. data/lib/solargraph/parser/parser_gem/node_methods.rb +506 -486
  59. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
  60. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +61 -59
  61. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +24 -15
  62. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -46
  63. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +60 -53
  64. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +53 -23
  65. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +41 -40
  66. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +30 -29
  67. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +61 -59
  68. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
  69. data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
  70. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
  71. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +39 -38
  72. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +53 -52
  73. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +296 -291
  74. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
  75. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +33 -29
  76. data/lib/solargraph/parser/parser_gem/node_processors.rb +74 -70
  77. data/lib/solargraph/parser/region.rb +75 -69
  78. data/lib/solargraph/parser/snippet.rb +17 -17
  79. data/lib/solargraph/pin/base.rb +761 -729
  80. data/lib/solargraph/pin/base_variable.rb +418 -126
  81. data/lib/solargraph/pin/block.rb +126 -104
  82. data/lib/solargraph/pin/breakable.rb +13 -9
  83. data/lib/solargraph/pin/callable.rb +278 -231
  84. data/lib/solargraph/pin/closure.rb +68 -72
  85. data/lib/solargraph/pin/common.rb +94 -79
  86. data/lib/solargraph/pin/compound_statement.rb +55 -0
  87. data/lib/solargraph/pin/conversions.rb +124 -123
  88. data/lib/solargraph/pin/delegated_method.rb +131 -120
  89. data/lib/solargraph/pin/documenting.rb +115 -114
  90. data/lib/solargraph/pin/instance_variable.rb +38 -34
  91. data/lib/solargraph/pin/keyword.rb +16 -20
  92. data/lib/solargraph/pin/local_variable.rb +31 -75
  93. data/lib/solargraph/pin/method.rb +720 -672
  94. data/lib/solargraph/pin/method_alias.rb +42 -34
  95. data/lib/solargraph/pin/namespace.rb +121 -115
  96. data/lib/solargraph/pin/parameter.rb +338 -275
  97. data/lib/solargraph/pin/proxy_type.rb +40 -39
  98. data/lib/solargraph/pin/reference/override.rb +47 -47
  99. data/lib/solargraph/pin/reference/superclass.rb +17 -15
  100. data/lib/solargraph/pin/reference.rb +41 -39
  101. data/lib/solargraph/pin/search.rb +62 -61
  102. data/lib/solargraph/pin/signature.rb +69 -61
  103. data/lib/solargraph/pin/symbol.rb +53 -53
  104. data/lib/solargraph/pin/until.rb +18 -18
  105. data/lib/solargraph/pin/while.rb +18 -18
  106. data/lib/solargraph/pin.rb +46 -44
  107. data/lib/solargraph/pin_cache.rb +665 -245
  108. data/lib/solargraph/position.rb +118 -119
  109. data/lib/solargraph/range.rb +112 -112
  110. data/lib/solargraph/rbs_map/conversions.rb +846 -823
  111. data/lib/solargraph/rbs_map/core_map.rb +65 -58
  112. data/lib/solargraph/rbs_map/stdlib_map.rb +72 -43
  113. data/lib/solargraph/rbs_map.rb +217 -163
  114. data/lib/solargraph/shell.rb +397 -352
  115. data/lib/solargraph/source/chain/call.rb +372 -337
  116. data/lib/solargraph/source/chain/constant.rb +28 -26
  117. data/lib/solargraph/source/chain/hash.rb +35 -34
  118. data/lib/solargraph/source/chain/if.rb +29 -28
  119. data/lib/solargraph/source/chain/instance_variable.rb +34 -13
  120. data/lib/solargraph/source/chain/literal.rb +53 -48
  121. data/lib/solargraph/source/chain/or.rb +31 -23
  122. data/lib/solargraph/source/chain.rb +294 -291
  123. data/lib/solargraph/source/change.rb +89 -82
  124. data/lib/solargraph/source/cursor.rb +172 -166
  125. data/lib/solargraph/source/encoding_fixes.rb +23 -23
  126. data/lib/solargraph/source/source_chainer.rb +204 -194
  127. data/lib/solargraph/source/updater.rb +59 -55
  128. data/lib/solargraph/source.rb +524 -498
  129. data/lib/solargraph/source_map/clip.rb +237 -226
  130. data/lib/solargraph/source_map/data.rb +37 -34
  131. data/lib/solargraph/source_map/mapper.rb +282 -259
  132. data/lib/solargraph/source_map.rb +220 -212
  133. data/lib/solargraph/type_checker/problem.rb +34 -32
  134. data/lib/solargraph/type_checker/rules.rb +157 -84
  135. data/lib/solargraph/type_checker.rb +895 -814
  136. data/lib/solargraph/version.rb +5 -5
  137. data/lib/solargraph/workspace/config.rb +257 -255
  138. data/lib/solargraph/workspace/gemspecs.rb +367 -0
  139. data/lib/solargraph/workspace/require_paths.rb +98 -97
  140. data/lib/solargraph/workspace.rb +362 -220
  141. data/lib/solargraph/yard_map/helpers.rb +45 -44
  142. data/lib/solargraph/yard_map/mapper/to_method.rb +134 -130
  143. data/lib/solargraph/yard_map/mapper/to_namespace.rb +32 -31
  144. data/lib/solargraph/yard_map/mapper.rb +84 -79
  145. data/lib/solargraph/yardoc.rb +97 -87
  146. data/lib/solargraph.rb +126 -105
  147. data/rbs/fills/rubygems/0/dependency.rbs +193 -0
  148. data/rbs/fills/tuple/tuple.rbs +28 -0
  149. data/rbs/shims/ast/0/node.rbs +5 -0
  150. data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
  151. data/rbs_collection.yaml +1 -1
  152. data/solargraph.gemspec +2 -1
  153. metadata +23 -17
  154. data/lib/solargraph/type_checker/checks.rb +0 -124
  155. data/lib/solargraph/type_checker/param_def.rb +0 -37
  156. data/lib/solargraph/yard_map/to_method.rb +0 -89
  157. data/sig/shims/ast/0/node.rbs +0 -5
  158. /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
  159. /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
  160. /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
  161. /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
  162. /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
  163. /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
  164. /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
  165. /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
  166. /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