solargraph 0.58.0 → 0.59.0
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/.gitattributes +2 -0
- data/.github/workflows/linting.yml +6 -5
- data/.github/workflows/plugins.yml +48 -35
- data/.github/workflows/rspec.yml +15 -28
- data/.github/workflows/typecheck.yml +3 -2
- data/.gitignore +1 -0
- data/.rubocop.yml +38 -6
- data/.rubocop_todo.yml +53 -966
- data/CHANGELOG.md +24 -0
- data/Gemfile +3 -1
- data/README.md +3 -3
- data/Rakefile +26 -23
- data/bin/solargraph +9 -8
- data/lib/solargraph/api_map/cache.rb +110 -110
- data/lib/solargraph/api_map/constants.rb +288 -279
- data/lib/solargraph/api_map/index.rb +204 -193
- data/lib/solargraph/api_map/source_to_yard.rb +110 -97
- data/lib/solargraph/api_map/store.rb +395 -384
- data/lib/solargraph/api_map.rb +1029 -945
- data/lib/solargraph/bench.rb +44 -45
- data/lib/solargraph/complex_type/conformance.rb +176 -0
- data/lib/solargraph/complex_type/type_methods.rb +240 -228
- data/lib/solargraph/complex_type/unique_type.rb +641 -482
- data/lib/solargraph/complex_type.rb +557 -444
- data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
- 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/gemfile.rb +15 -15
- data/lib/solargraph/convention/gemspec.rb +23 -23
- data/lib/solargraph/convention/rakefile.rb +17 -17
- 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/convention.rb +78 -78
- data/lib/solargraph/converters/dd.rb +19 -17
- data/lib/solargraph/converters/dl.rb +17 -15
- data/lib/solargraph/converters/dt.rb +17 -15
- data/lib/solargraph/converters/misc.rb +3 -1
- 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/diagnostics/update_errors.rb +37 -41
- data/lib/solargraph/doc_map.rb +438 -439
- data/lib/solargraph/equality.rb +34 -34
- data/lib/solargraph/gem_pins.rb +98 -98
- data/lib/solargraph/language_server/error_codes.rb +20 -20
- data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
- data/lib/solargraph/language_server/host/dispatch.rb +130 -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 +886 -878
- data/lib/solargraph/language_server/message/base.rb +97 -97
- data/lib/solargraph/language_server/message/client/register_capability.rb +13 -15
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -60
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +108 -114
- data/lib/solargraph/language_server/message/extended/document.rb +24 -23
- data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
- data/lib/solargraph/language_server/message/extended/download_core.rb +20 -19
- data/lib/solargraph/language_server/message/extended/search.rb +20 -20
- data/lib/solargraph/language_server/message/initialize.rb +197 -191
- data/lib/solargraph/language_server/message/text_document/completion.rb +58 -56
- data/lib/solargraph/language_server/message/text_document/definition.rb +49 -40
- data/lib/solargraph/language_server/message/text_document/document_highlight.rb +23 -16
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +36 -26
- data/lib/solargraph/language_server/message/text_document/formatting.rb +150 -148
- data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
- data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +18 -11
- data/lib/solargraph/language_server/message/text_document/references.rb +23 -16
- data/lib/solargraph/language_server/message/text_document/rename.rb +26 -19
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +25 -24
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +33 -25
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +41 -35
- data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +48 -40
- data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +32 -26
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +33 -23
- data/lib/solargraph/language_server/message.rb +94 -94
- data/lib/solargraph/language_server/request.rb +29 -27
- data/lib/solargraph/language_server/transport/data_reader.rb +72 -74
- data/lib/solargraph/language_server/uri_helpers.rb +49 -49
- data/lib/solargraph/library.rb +702 -683
- data/lib/solargraph/location.rb +85 -82
- data/lib/solargraph/logging.rb +55 -37
- data/lib/solargraph/page.rb +92 -92
- data/lib/solargraph/parser/comment_ripper.rb +84 -69
- data/lib/solargraph/parser/flow_sensitive_typing.rb +471 -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 +165 -149
- data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +191 -166
- data/lib/solargraph/parser/parser_gem/node_methods.rb +507 -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 +45 -46
- data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +60 -53
- data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +38 -37
- data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +53 -23
- data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +42 -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 +51 -52
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +302 -291
- data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
- 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/parser_gem.rb +14 -12
- data/lib/solargraph/parser/region.rb +75 -69
- data/lib/solargraph/parser/snippet.rb +19 -17
- data/lib/solargraph/parser.rb +25 -23
- data/lib/solargraph/pin/base.rb +773 -729
- data/lib/solargraph/pin/base_variable.rb +375 -126
- data/lib/solargraph/pin/block.rb +127 -104
- data/lib/solargraph/pin/breakable.rb +15 -9
- data/lib/solargraph/pin/callable.rb +275 -231
- data/lib/solargraph/pin/closure.rb +69 -72
- data/lib/solargraph/pin/common.rb +97 -79
- data/lib/solargraph/pin/compound_statement.rb +55 -0
- data/lib/solargraph/pin/constant.rb +43 -45
- data/lib/solargraph/pin/conversions.rb +129 -123
- data/lib/solargraph/pin/delegated_method.rb +131 -120
- data/lib/solargraph/pin/documenting.rb +116 -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 +724 -672
- data/lib/solargraph/pin/method_alias.rb +42 -34
- data/lib/solargraph/pin/namespace.rb +122 -115
- data/lib/solargraph/pin/parameter.rb +339 -275
- data/lib/solargraph/pin/proxy_type.rb +42 -39
- data/lib/solargraph/pin/reference/override.rb +47 -47
- data/lib/solargraph/pin/reference/superclass.rb +17 -15
- data/lib/solargraph/pin/reference/type_alias.rb +16 -0
- data/lib/solargraph/pin/reference.rb +59 -39
- data/lib/solargraph/pin/search.rb +62 -61
- data/lib/solargraph/pin/signature.rb +64 -61
- data/lib/solargraph/pin/symbol.rb +54 -53
- data/lib/solargraph/pin/until.rb +16 -18
- data/lib/solargraph/pin/while.rb +16 -18
- data/lib/solargraph/pin.rb +46 -44
- data/lib/solargraph/pin_cache.rb +248 -245
- data/lib/solargraph/position.rb +139 -119
- data/lib/solargraph/range.rb +113 -112
- data/lib/solargraph/rbs_map/conversions.rb +952 -823
- data/lib/solargraph/rbs_map/core_fills.rb +91 -84
- data/lib/solargraph/rbs_map/core_map.rb +65 -58
- data/lib/solargraph/rbs_map/stdlib_map.rb +71 -43
- data/lib/solargraph/rbs_map.rb +207 -163
- data/lib/solargraph/server_methods.rb +16 -16
- data/lib/solargraph/shell.rb +555 -352
- data/lib/solargraph/source/chain/array.rb +39 -37
- data/lib/solargraph/source/chain/call.rb +377 -337
- data/lib/solargraph/source/chain/class_variable.rb +13 -13
- data/lib/solargraph/source/chain/constant.rb +30 -26
- data/lib/solargraph/source/chain/global_variable.rb +13 -13
- data/lib/solargraph/source/chain/hash.rb +37 -34
- data/lib/solargraph/source/chain/if.rb +30 -28
- data/lib/solargraph/source/chain/instance_variable.rb +36 -13
- data/lib/solargraph/source/chain/link.rb +99 -109
- data/lib/solargraph/source/chain/literal.rb +51 -48
- data/lib/solargraph/source/chain/or.rb +29 -23
- data/lib/solargraph/source/chain/q_call.rb +13 -11
- data/lib/solargraph/source/chain/variable.rb +15 -13
- data/lib/solargraph/source/chain/z_super.rb +28 -30
- data/lib/solargraph/source/chain.rb +304 -291
- data/lib/solargraph/source/change.rb +89 -82
- data/lib/solargraph/source/cursor.rb +172 -166
- data/lib/solargraph/source/encoding_fixes.rb +22 -23
- data/lib/solargraph/source/source_chainer.rb +218 -194
- data/lib/solargraph/source/updater.rb +59 -55
- data/lib/solargraph/source.rb +522 -498
- data/lib/solargraph/source_map/clip.rb +245 -226
- data/lib/solargraph/source_map/data.rb +37 -34
- data/lib/solargraph/source_map/mapper.rb +286 -259
- data/lib/solargraph/source_map.rb +224 -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 +888 -814
- data/lib/solargraph/version.rb +5 -5
- data/lib/solargraph/workspace/config.rb +258 -255
- data/lib/solargraph/workspace/gemspecs.rb +367 -0
- data/lib/solargraph/workspace/require_paths.rb +98 -97
- data/lib/solargraph/workspace.rb +242 -220
- data/lib/solargraph/yard_map/helpers.rb +49 -44
- data/lib/solargraph/yard_map/mapper/to_method.rb +136 -130
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +32 -31
- data/lib/solargraph/yard_map/mapper.rb +84 -79
- data/lib/solargraph/yard_map.rb +17 -18
- data/lib/solargraph/yard_tags.rb +20 -20
- data/lib/solargraph/yardoc.rb +90 -87
- data/lib/solargraph.rb +128 -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 +37 -35
- metadata +52 -51
- 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,92 +1,122 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Parser
|
|
5
|
-
module NodeProcessor
|
|
6
|
-
class Base
|
|
7
|
-
# @return [Parser::AST::Node]
|
|
8
|
-
attr_reader :node
|
|
9
|
-
|
|
10
|
-
# @return [Region]
|
|
11
|
-
attr_reader :region
|
|
12
|
-
|
|
13
|
-
# @return [Array<Pin::Base>]
|
|
14
|
-
attr_reader :pins
|
|
15
|
-
|
|
16
|
-
# @return [Array<Pin::LocalVariable>]
|
|
17
|
-
attr_reader :locals
|
|
18
|
-
|
|
19
|
-
# @
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
# @param
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
@
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Parser
|
|
5
|
+
module NodeProcessor
|
|
6
|
+
class Base
|
|
7
|
+
# @return [Parser::AST::Node]
|
|
8
|
+
attr_reader :node
|
|
9
|
+
|
|
10
|
+
# @return [Region]
|
|
11
|
+
attr_reader :region
|
|
12
|
+
|
|
13
|
+
# @return [Array<Pin::Base>]
|
|
14
|
+
attr_reader :pins
|
|
15
|
+
|
|
16
|
+
# @return [Array<Pin::LocalVariable>]
|
|
17
|
+
attr_reader :locals
|
|
18
|
+
|
|
19
|
+
# @return [Array<Pin::InstanceVariable>]
|
|
20
|
+
attr_reader :ivars
|
|
21
|
+
|
|
22
|
+
# @param node [Parser::AST::Node]
|
|
23
|
+
# @param region [Region]
|
|
24
|
+
# @param pins [Array<Pin::Base>]
|
|
25
|
+
# @param locals [Array<Pin::LocalVariable>]
|
|
26
|
+
# @param ivars [Array<Pin::InstanceVariable>]
|
|
27
|
+
def initialize node, region, pins, locals, ivars
|
|
28
|
+
@node = node
|
|
29
|
+
@region = region
|
|
30
|
+
@pins = pins
|
|
31
|
+
@locals = locals
|
|
32
|
+
@ivars = ivars
|
|
33
|
+
@processed_children = false
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Subclasses should override this method to generate new pins.
|
|
37
|
+
#
|
|
38
|
+
# @return [Boolean] continue processing the next processor of the same node type.
|
|
39
|
+
# @return [void] In case there is only one processor registered for the node type, it can be void.
|
|
40
|
+
def process
|
|
41
|
+
process_children
|
|
42
|
+
|
|
43
|
+
true
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
private
|
|
47
|
+
|
|
48
|
+
# @return [Solargraph::Location]
|
|
49
|
+
def location
|
|
50
|
+
get_node_location(node)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# @return [Solargraph::Position]
|
|
54
|
+
def position
|
|
55
|
+
Position.new(node.loc.line, node.loc.column)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# @sg-ignore downcast output of Enumerable#select
|
|
59
|
+
# @return [Solargraph::Pin::Breakable, nil]
|
|
60
|
+
def enclosing_breakable_pin
|
|
61
|
+
pins.select { |pin| pin.is_a?(Pin::Breakable) && pin.location&.range&.contain?(position) }.last
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# @todo downcast output of Enumerable#select
|
|
65
|
+
# @return [Solargraph::Pin::CompoundStatement, nil]
|
|
66
|
+
def enclosing_compound_statement_pin
|
|
67
|
+
pins.select { |pin| pin.is_a?(Pin::CompoundStatement) && pin.location&.range&.contain?(position) }.last
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# @param subregion [Region]
|
|
71
|
+
# @return [void]
|
|
72
|
+
def process_children subregion = region
|
|
73
|
+
return if @processed_children
|
|
74
|
+
@processed_children = true
|
|
75
|
+
node.children.each do |child|
|
|
76
|
+
next unless Parser.is_ast_node?(child)
|
|
77
|
+
NodeProcessor.process(child, subregion, pins, locals, ivars)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# @param node [Parser::AST::Node]
|
|
82
|
+
# @return [Solargraph::Location]
|
|
83
|
+
def get_node_location node
|
|
84
|
+
range = Parser.node_range(node)
|
|
85
|
+
Location.new(region.filename, range)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# @param node [Parser::AST::Node]
|
|
89
|
+
# @return [String, nil]
|
|
90
|
+
def comments_for node
|
|
91
|
+
region.source.comments_for(node)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# @param position [Solargraph::Position]
|
|
95
|
+
# @return [Pin::Closure, nil]
|
|
96
|
+
def named_path_pin position
|
|
97
|
+
pins.select do |pin|
|
|
98
|
+
# @sg-ignore Need to add nil check here
|
|
99
|
+
pin.is_a?(Pin::Closure) && pin.path && !pin.path.empty? && pin.location.range.contain?(position)
|
|
100
|
+
end.last
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# @todo Candidate for deprecation
|
|
104
|
+
# @param position [Solargraph::Position]
|
|
105
|
+
# @return [Pin::Closure, nil]
|
|
106
|
+
def block_pin position
|
|
107
|
+
# @todo determine if this can return a Pin::Block
|
|
108
|
+
# @sg-ignore Need to add nil check here
|
|
109
|
+
pins.select { |pin| pin.is_a?(Pin::Closure) && pin.location.range.contain?(position) }.last
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# @todo Candidate for deprecation
|
|
113
|
+
# @param position [Solargraph::Position]
|
|
114
|
+
# @return [Pin::Closure, nil]
|
|
115
|
+
def closure_pin position
|
|
116
|
+
# @sg-ignore Need to add nil check here
|
|
117
|
+
pins.select { |pin| pin.is_a?(Pin::Closure) && pin.location.range.contain?(position) }.last
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
@@ -1,62 +1,63 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Parser
|
|
5
|
-
# The processor classes used by SourceMap::Mapper to generate pins from
|
|
6
|
-
# parser nodes.
|
|
7
|
-
#
|
|
8
|
-
module NodeProcessor
|
|
9
|
-
autoload :Base, 'solargraph/parser/node_processor/base'
|
|
10
|
-
|
|
11
|
-
class << self
|
|
12
|
-
# @type [Hash{Symbol => Array<Class<NodeProcessor::Base>>}]
|
|
13
|
-
@@processors ||= {}
|
|
14
|
-
|
|
15
|
-
# Register a processor for a node type. You can register multiple processors for the same type.
|
|
16
|
-
# If a node processor returns true, it will skip the next processor of the same node type.
|
|
17
|
-
#
|
|
18
|
-
# @param type [Symbol]
|
|
19
|
-
# @param cls [Class<NodeProcessor::Base>]
|
|
20
|
-
# @return [Array<Class<NodeProcessor::Base>>]
|
|
21
|
-
def register type, cls
|
|
22
|
-
@@processors[type] ||= []
|
|
23
|
-
@@processors[type] << cls
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
# @param type [Symbol]
|
|
27
|
-
# @param cls [Class<NodeProcessor::Base>]
|
|
28
|
-
#
|
|
29
|
-
# @return [void]
|
|
30
|
-
def deregister type, cls
|
|
31
|
-
@@processors[type].delete(cls)
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
# @param node [Parser::AST::Node]
|
|
36
|
-
# @param region [Region]
|
|
37
|
-
# @param pins [Array<Pin::Base>]
|
|
38
|
-
# @param locals [Array<Pin::
|
|
39
|
-
# @
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Parser
|
|
5
|
+
# The processor classes used by SourceMap::Mapper to generate pins from
|
|
6
|
+
# parser nodes.
|
|
7
|
+
#
|
|
8
|
+
module NodeProcessor
|
|
9
|
+
autoload :Base, 'solargraph/parser/node_processor/base'
|
|
10
|
+
|
|
11
|
+
class << self
|
|
12
|
+
# @type [Hash{Symbol => Array<Class<NodeProcessor::Base>>}]
|
|
13
|
+
@@processors ||= {}
|
|
14
|
+
|
|
15
|
+
# Register a processor for a node type. You can register multiple processors for the same type.
|
|
16
|
+
# If a node processor returns true, it will skip the next processor of the same node type.
|
|
17
|
+
#
|
|
18
|
+
# @param type [Symbol]
|
|
19
|
+
# @param cls [Class<NodeProcessor::Base>]
|
|
20
|
+
# @return [Array<Class<NodeProcessor::Base>>]
|
|
21
|
+
def register type, cls
|
|
22
|
+
@@processors[type] ||= []
|
|
23
|
+
@@processors[type] << cls
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# @param type [Symbol]
|
|
27
|
+
# @param cls [Class<NodeProcessor::Base>]
|
|
28
|
+
#
|
|
29
|
+
# @return [void]
|
|
30
|
+
def deregister type, cls
|
|
31
|
+
@@processors[type].delete(cls)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# @param node [Parser::AST::Node]
|
|
36
|
+
# @param region [Region]
|
|
37
|
+
# @param pins [Array<Pin::Base>]
|
|
38
|
+
# @param locals [Array<Pin::LocalVariable>]
|
|
39
|
+
# @param ivars [Array<Pin::InstanceVariable>]
|
|
40
|
+
# @return [Array(Array<Pin::Base>, Array<Pin::LocalVariable>, Array<Pin::InstanceVariable>)]
|
|
41
|
+
def self.process node, region = Region.new, pins = [], locals = [], ivars = []
|
|
42
|
+
if pins.empty?
|
|
43
|
+
pins.push Pin::Namespace.new(
|
|
44
|
+
location: region.source.location,
|
|
45
|
+
name: '',
|
|
46
|
+
source: :parser
|
|
47
|
+
)
|
|
48
|
+
end
|
|
49
|
+
return [pins, locals, ivars] unless Parser.is_ast_node?(node)
|
|
50
|
+
node_processor_classes = @@processors[node.type] || [NodeProcessor::Base]
|
|
51
|
+
|
|
52
|
+
node_processor_classes.each do |klass|
|
|
53
|
+
processor = klass.new(node, region, pins, locals, ivars)
|
|
54
|
+
process_next = processor.process
|
|
55
|
+
|
|
56
|
+
break unless process_next
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
[pins, locals, ivars]
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -1,149 +1,165 @@
|
|
|
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
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
# @return [
|
|
98
|
-
def
|
|
99
|
-
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
# @
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
# @
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
node.
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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
|
+
parser.diagnostics.all_errors_are_fatal = true
|
|
38
|
+
parser.diagnostics.ignore_warnings = true
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# @param source [Source]
|
|
43
|
+
# @return [Array(Array<Pin::Base>, Array<Pin::LocalVariable>)]
|
|
44
|
+
def map source
|
|
45
|
+
# @sg-ignore Need to add nil check here
|
|
46
|
+
pins, locals, ivars = NodeProcessor.process(source.node, Region.new(source: source))
|
|
47
|
+
pins.concat(ivars)
|
|
48
|
+
[pins, locals]
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# @param source [Source]
|
|
52
|
+
# @param name [String]
|
|
53
|
+
# @return [Array<Location>]
|
|
54
|
+
def references source, name
|
|
55
|
+
if name.end_with?('=')
|
|
56
|
+
reg = /#{Regexp.escape name[0..-2]}\s*=/
|
|
57
|
+
# @param code [String]
|
|
58
|
+
# @param offset [Integer]
|
|
59
|
+
# @return [Array(Integer, Integer), Array(nil, nil)]
|
|
60
|
+
# @sg-ignore Need to add nil check here
|
|
61
|
+
extract_offset = ->(code, offset) { reg.match(code, offset).offset(0) }
|
|
62
|
+
else
|
|
63
|
+
# @param code [String]
|
|
64
|
+
# @param offset [Integer]
|
|
65
|
+
# @return [Array(Integer, Integer), Array(nil, nil)]
|
|
66
|
+
# @sg-ignore Need to add nil check here
|
|
67
|
+
extract_offset = ->(code, offset) { [soff = code.index(name, offset), soff + name.length] }
|
|
68
|
+
end
|
|
69
|
+
inner_node_references(name, source.node).map do |n|
|
|
70
|
+
rng = Range.from_node(n)
|
|
71
|
+
# @sg-ignore Need to add nil check here
|
|
72
|
+
offset = Position.to_offset(source.code, rng.start)
|
|
73
|
+
soff, eoff = extract_offset[source.code, offset]
|
|
74
|
+
Location.new(
|
|
75
|
+
source.filename,
|
|
76
|
+
Range.new(
|
|
77
|
+
Position.from_offset(source.code, soff),
|
|
78
|
+
Position.from_offset(source.code, eoff)
|
|
79
|
+
)
|
|
80
|
+
)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# @param name [String]
|
|
85
|
+
# @param top [AST::Node]
|
|
86
|
+
# @return [Array<AST::Node>]
|
|
87
|
+
def inner_node_references name, top
|
|
88
|
+
# @type [Array<AST::Node>]
|
|
89
|
+
result = []
|
|
90
|
+
if top.is_a?(AST::Node) && top.to_s.include?(":#{name}")
|
|
91
|
+
result.push top if top.children.any? { |c| c.to_s == name }
|
|
92
|
+
top.children.each { |c| result.concat inner_node_references(name, c) }
|
|
93
|
+
end
|
|
94
|
+
result
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# @return [Source::Chain]
|
|
98
|
+
def chain *args
|
|
99
|
+
NodeChainer.chain(*args)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# @return [Source::Chain]
|
|
103
|
+
def chain_string *args
|
|
104
|
+
NodeChainer.load_string(*args)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# @return [Array(Array<Pin::Base>, Array<Pin::Base>)]
|
|
108
|
+
def process_node *args
|
|
109
|
+
Solargraph::Parser::NodeProcessor.process(*args)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# @param node [Parser::AST::Node, nil]
|
|
113
|
+
# @return [String, nil]
|
|
114
|
+
def infer_literal_node_type node
|
|
115
|
+
NodeMethods.infer_literal_node_type node
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# @return [Integer]
|
|
119
|
+
def version
|
|
120
|
+
parser.version
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# @param node [BasicObject, nil]
|
|
124
|
+
# @return [Boolean]
|
|
125
|
+
def is_ast_node? node
|
|
126
|
+
node.is_a?(::Parser::AST::Node)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# @param node [Parser::AST::Node]
|
|
130
|
+
# @return [Range]
|
|
131
|
+
def node_range node
|
|
132
|
+
st = Position.new(node.loc.line, node.loc.column)
|
|
133
|
+
en = Position.new(node.loc.last_line, node.loc.last_column)
|
|
134
|
+
Range.new(st, en)
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# @param node [Parser::AST::Node, nil]
|
|
138
|
+
# @return [Array<Range>]
|
|
139
|
+
def string_ranges node
|
|
140
|
+
return [] unless is_ast_node?(node)
|
|
141
|
+
result = []
|
|
142
|
+
# @sg-ignore Translate to something flow sensitive typing understands
|
|
143
|
+
result.push Range.from_node(node) if node.type == :str
|
|
144
|
+
# @sg-ignore Translate to something flow sensitive typing understands
|
|
145
|
+
node.children.each do |child|
|
|
146
|
+
result.concat string_ranges(child)
|
|
147
|
+
end
|
|
148
|
+
# @sg-ignore Translate to something flow sensitive typing understands
|
|
149
|
+
if node.type == :dstr && node.children.last.nil?
|
|
150
|
+
# @sg-ignore Translate to something flow sensitive typing understands
|
|
151
|
+
last = node.children[-2]
|
|
152
|
+
# @sg-ignore Need to add nil check here
|
|
153
|
+
unless last.nil?
|
|
154
|
+
rng = Range.from_node(last)
|
|
155
|
+
# @sg-ignore Need to add nil check here
|
|
156
|
+
pos = Position.new(rng.ending.line, rng.ending.column - 1)
|
|
157
|
+
result.push Range.new(pos, pos)
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
result
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
end
|