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