solargraph 0.46.0 → 0.54.5
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/.github/FUNDING.yml +1 -0
- data/.github/workflows/plugins.yml +40 -0
- data/.github/workflows/rspec.yml +37 -41
- data/.github/workflows/typecheck.yml +34 -0
- data/.gitignore +9 -9
- data/.rspec +2 -2
- data/.yardopts +2 -2
- data/CHANGELOG.md +1338 -1115
- data/Gemfile +0 -0
- data/LICENSE +1 -1
- data/README.md +131 -128
- data/Rakefile +0 -0
- data/SPONSORS.md +10 -18
- data/bin/solargraph +0 -0
- data/lib/solargraph/api_map/cache.rb +109 -70
- data/lib/solargraph/api_map/index.rb +167 -0
- data/lib/solargraph/api_map/source_to_yard.rb +88 -81
- data/lib/solargraph/api_map/store.rb +260 -256
- data/lib/solargraph/api_map.rb +870 -686
- data/lib/solargraph/bench.rb +44 -27
- data/lib/solargraph/cache.rb +77 -0
- data/lib/solargraph/complex_type/type_methods.rb +217 -130
- data/lib/solargraph/complex_type/unique_type.rb +386 -75
- data/lib/solargraph/complex_type.rb +394 -221
- data/lib/solargraph/convention/base.rb +33 -33
- data/lib/solargraph/convention/gemfile.rb +15 -15
- data/lib/solargraph/convention/gemspec.rb +22 -22
- data/lib/solargraph/convention/rakefile.rb +17 -0
- data/lib/solargraph/convention.rb +47 -47
- data/lib/solargraph/converters/dd.rb +17 -12
- data/lib/solargraph/converters/dl.rb +15 -12
- data/lib/solargraph/converters/dt.rb +15 -12
- data/lib/solargraph/converters/misc.rb +1 -1
- data/lib/solargraph/diagnostics/base.rb +29 -29
- data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
- data/lib/solargraph/diagnostics/rubocop.rb +113 -98
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +66 -63
- data/lib/solargraph/diagnostics/severities.rb +15 -15
- data/lib/solargraph/diagnostics/type_check.rb +55 -54
- data/lib/solargraph/diagnostics/update_errors.rb +41 -41
- data/lib/solargraph/diagnostics.rb +55 -55
- data/lib/solargraph/doc_map.rb +188 -0
- data/lib/solargraph/environ.rb +45 -45
- data/lib/solargraph/equality.rb +33 -0
- data/lib/solargraph/gem_pins.rb +72 -0
- data/lib/solargraph/language_server/completion_item_kinds.rb +35 -35
- 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 +128 -111
- data/lib/solargraph/language_server/host/message_worker.rb +106 -59
- data/lib/solargraph/language_server/host/sources.rb +99 -156
- data/lib/solargraph/language_server/host.rb +861 -865
- data/lib/solargraph/language_server/message/base.rb +96 -89
- data/lib/solargraph/language_server/message/cancel_request.rb +13 -13
- data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
- data/lib/solargraph/language_server/message/client.rb +11 -11
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +60 -58
- data/lib/solargraph/language_server/message/completion_item.rb +11 -11
- data/lib/solargraph/language_server/message/exit_notification.rb +13 -13
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +112 -100
- data/lib/solargraph/language_server/message/extended/document.rb +20 -20
- data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
- data/lib/solargraph/language_server/message/extended/download_core.rb +19 -23
- data/lib/solargraph/language_server/message/extended/environment.rb +25 -25
- data/lib/solargraph/language_server/message/extended/search.rb +20 -20
- data/lib/solargraph/language_server/message/extended.rb +21 -21
- data/lib/solargraph/language_server/message/initialize.rb +191 -162
- data/lib/solargraph/language_server/message/initialized.rb +28 -27
- data/lib/solargraph/language_server/message/method_not_found.rb +16 -16
- data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -14
- data/lib/solargraph/language_server/message/shutdown.rb +13 -13
- data/lib/solargraph/language_server/message/text_document/base.rb +19 -19
- data/lib/solargraph/language_server/message/text_document/code_action.rb +17 -17
- data/lib/solargraph/language_server/message/text_document/completion.rb +56 -59
- data/lib/solargraph/language_server/message/text_document/definition.rb +38 -38
- data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -15
- data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -15
- data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -15
- data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -17
- data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -23
- data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -26
- data/lib/solargraph/language_server/message/text_document/formatting.rb +131 -126
- data/lib/solargraph/language_server/message/text_document/hover.rb +58 -54
- data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +34 -34
- data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
- data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
- data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -29
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +24 -0
- data/lib/solargraph/language_server/message/text_document.rb +28 -28
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +35 -30
- data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +40 -33
- data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -24
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
- data/lib/solargraph/language_server/message/workspace.rb +14 -14
- data/lib/solargraph/language_server/message.rb +94 -93
- data/lib/solargraph/language_server/message_types.rb +14 -14
- data/lib/solargraph/language_server/progress.rb +135 -0
- data/lib/solargraph/language_server/request.rb +24 -24
- data/lib/solargraph/language_server/symbol_kinds.rb +36 -36
- data/lib/solargraph/language_server/transport/adapter.rb +68 -53
- data/lib/solargraph/language_server/transport/data_reader.rb +74 -72
- data/lib/solargraph/language_server/transport.rb +13 -13
- data/lib/solargraph/language_server/uri_helpers.rb +49 -49
- data/lib/solargraph/language_server.rb +20 -19
- data/lib/solargraph/library.rb +663 -546
- data/lib/solargraph/location.rb +58 -37
- data/lib/solargraph/logging.rb +27 -27
- data/lib/solargraph/page.rb +89 -83
- data/lib/solargraph/parser/comment_ripper.rb +56 -52
- data/lib/solargraph/parser/node_methods.rb +83 -43
- data/lib/solargraph/parser/node_processor/base.rb +87 -77
- data/lib/solargraph/parser/node_processor.rb +45 -43
- data/lib/solargraph/parser/{legacy → parser_gem}/class_methods.rb +153 -135
- data/lib/solargraph/parser/{legacy → parser_gem}/flawed_builder.rb +18 -16
- data/lib/solargraph/parser/{legacy → parser_gem}/node_chainer.rb +164 -148
- data/lib/solargraph/parser/parser_gem/node_methods.rb +495 -0
- data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/alias_node.rb +23 -23
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +57 -0
- data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/begin_node.rb +15 -15
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/block_node.rb +43 -42
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/casgn_node.rb +35 -25
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/cvasgn_node.rb +23 -23
- data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/def_node.rb +50 -63
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/defs_node.rb +36 -36
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/gvasgn_node.rb +23 -23
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/ivasgn_node.rb +38 -38
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/lvasgn_node.rb +28 -28
- data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +53 -0
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/namespace_node.rb +39 -39
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/orasgn_node.rb +16 -16
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/resbody_node.rb +36 -36
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +42 -0
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/send_node.rb +259 -257
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/sym_node.rb +18 -18
- data/lib/solargraph/parser/parser_gem/node_processors.rb +56 -0
- data/lib/solargraph/parser/parser_gem.rb +12 -0
- data/lib/solargraph/parser/region.rb +66 -66
- data/lib/solargraph/parser/snippet.rb +15 -13
- data/lib/solargraph/parser.rb +22 -26
- data/lib/solargraph/pin/base.rb +378 -296
- data/lib/solargraph/pin/base_variable.rb +118 -84
- data/lib/solargraph/pin/block.rb +101 -72
- data/lib/solargraph/pin/callable.rb +147 -0
- data/lib/solargraph/pin/class_variable.rb +8 -8
- data/lib/solargraph/pin/closure.rb +57 -37
- data/lib/solargraph/pin/common.rb +70 -70
- data/lib/solargraph/pin/constant.rb +43 -43
- data/lib/solargraph/pin/conversions.rb +123 -96
- data/lib/solargraph/pin/delegated_method.rb +101 -0
- data/lib/solargraph/pin/documenting.rb +98 -105
- data/lib/solargraph/pin/duck_method.rb +16 -16
- data/lib/solargraph/pin/global_variable.rb +8 -8
- data/lib/solargraph/pin/instance_variable.rb +34 -30
- data/lib/solargraph/pin/keyword.rb +15 -15
- data/lib/solargraph/pin/keyword_param.rb +8 -8
- data/lib/solargraph/pin/local_variable.rb +67 -55
- data/lib/solargraph/pin/method.rb +527 -245
- data/lib/solargraph/pin/method_alias.rb +31 -31
- data/lib/solargraph/pin/namespace.rb +107 -91
- data/lib/solargraph/pin/parameter.rb +212 -201
- data/lib/solargraph/pin/proxy_type.rb +29 -29
- data/lib/solargraph/pin/reference/extend.rb +10 -10
- data/lib/solargraph/pin/reference/include.rb +10 -10
- data/lib/solargraph/pin/reference/override.rb +29 -29
- data/lib/solargraph/pin/reference/prepend.rb +10 -10
- data/lib/solargraph/pin/reference/require.rb +14 -14
- data/lib/solargraph/pin/reference/superclass.rb +10 -10
- data/lib/solargraph/pin/reference.rb +22 -14
- data/lib/solargraph/pin/search.rb +56 -56
- data/lib/solargraph/pin/signature.rb +17 -0
- data/lib/solargraph/pin/singleton.rb +11 -11
- data/lib/solargraph/pin/symbol.rb +47 -47
- data/lib/solargraph/pin.rb +41 -37
- data/lib/solargraph/position.rb +107 -100
- data/lib/solargraph/range.rb +98 -95
- data/lib/solargraph/rbs_map/conversions.rb +646 -0
- data/lib/solargraph/rbs_map/core_fills.rb +50 -0
- data/lib/solargraph/rbs_map/core_map.rb +28 -0
- data/lib/solargraph/rbs_map/stdlib_map.rb +33 -0
- data/lib/solargraph/rbs_map.rb +93 -0
- data/lib/solargraph/server_methods.rb +16 -16
- data/lib/solargraph/shell.rb +269 -226
- data/lib/solargraph/source/chain/array.rb +33 -0
- data/lib/solargraph/source/chain/block_symbol.rb +13 -0
- data/lib/solargraph/source/chain/block_variable.rb +13 -13
- data/lib/solargraph/source/chain/call.rb +303 -204
- data/lib/solargraph/source/chain/class_variable.rb +13 -13
- data/lib/solargraph/source/chain/constant.rb +89 -75
- data/lib/solargraph/source/chain/global_variable.rb +13 -13
- data/lib/solargraph/source/chain/hash.rb +33 -28
- data/lib/solargraph/source/chain/head.rb +19 -19
- data/lib/solargraph/source/chain/if.rb +28 -0
- data/lib/solargraph/source/chain/instance_variable.rb +13 -13
- data/lib/solargraph/source/chain/link.rb +98 -71
- data/lib/solargraph/source/chain/literal.rb +28 -23
- data/lib/solargraph/source/chain/or.rb +23 -23
- data/lib/solargraph/source/chain/q_call.rb +11 -11
- data/lib/solargraph/source/chain/variable.rb +13 -13
- data/lib/solargraph/source/chain/z_super.rb +30 -30
- data/lib/solargraph/source/chain.rb +252 -164
- data/lib/solargraph/source/change.rb +82 -79
- data/lib/solargraph/source/cursor.rb +167 -164
- data/lib/solargraph/source/source_chainer.rb +194 -191
- data/lib/solargraph/source/updater.rb +55 -54
- data/lib/solargraph/source.rb +495 -522
- data/lib/solargraph/source_map/clip.rb +232 -224
- data/lib/solargraph/source_map/completion.rb +23 -23
- data/lib/solargraph/source_map/data.rb +30 -0
- data/lib/solargraph/source_map/mapper.rb +255 -212
- data/lib/solargraph/source_map.rb +217 -180
- data/lib/solargraph/type_checker/checks.rb +120 -99
- data/lib/solargraph/type_checker/param_def.rb +35 -35
- data/lib/solargraph/type_checker/problem.rb +32 -32
- data/lib/solargraph/type_checker/rules.rb +62 -57
- data/lib/solargraph/type_checker.rb +672 -543
- data/lib/solargraph/version.rb +5 -5
- data/lib/solargraph/views/environment.erb +56 -58
- data/lib/solargraph/workspace/config.rb +239 -231
- data/lib/solargraph/workspace.rb +239 -215
- data/lib/solargraph/yard_map/cache.rb +25 -19
- data/lib/solargraph/yard_map/helpers.rb +16 -16
- data/lib/solargraph/yard_map/mapper/to_constant.rb +26 -25
- data/lib/solargraph/yard_map/mapper/to_method.rb +94 -78
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +28 -27
- data/lib/solargraph/yard_map/mapper.rb +78 -77
- data/lib/solargraph/yard_map/to_method.rb +86 -79
- data/lib/solargraph/yard_map.rb +18 -460
- data/lib/solargraph/yard_tags.rb +20 -0
- data/lib/solargraph/yardoc.rb +52 -0
- data/lib/solargraph.rb +72 -69
- data/solargraph.gemspec +21 -10
- metadata +184 -115
- data/.travis.yml +0 -19
- data/lib/solargraph/api_map/bundler_methods.rb +0 -22
- data/lib/solargraph/compat.rb +0 -37
- data/lib/solargraph/convention/rspec.rb +0 -30
- data/lib/solargraph/documentor.rb +0 -76
- data/lib/solargraph/language_server/host/cataloger.rb +0 -56
- data/lib/solargraph/parser/legacy/node_methods.rb +0 -325
- data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +0 -23
- data/lib/solargraph/parser/legacy/node_processors/args_node.rb +0 -35
- data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +0 -15
- data/lib/solargraph/parser/legacy/node_processors/def_node.rb +0 -63
- data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +0 -21
- data/lib/solargraph/parser/legacy/node_processors.rb +0 -54
- data/lib/solargraph/parser/legacy.rb +0 -12
- data/lib/solargraph/parser/rubyvm/class_methods.rb +0 -144
- data/lib/solargraph/parser/rubyvm/node_chainer.rb +0 -160
- data/lib/solargraph/parser/rubyvm/node_methods.rb +0 -315
- data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +0 -85
- data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +0 -42
- data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +0 -22
- data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +0 -23
- data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +0 -57
- data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +0 -23
- data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +0 -38
- data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +0 -39
- data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +0 -20
- data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +0 -27
- data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +0 -39
- data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +0 -26
- data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +0 -15
- data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +0 -45
- data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +0 -21
- data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +0 -15
- data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +0 -277
- data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +0 -18
- data/lib/solargraph/parser/rubyvm/node_processors.rb +0 -63
- data/lib/solargraph/parser/rubyvm.rb +0 -40
- data/lib/solargraph/yard_map/core_docs.rb +0 -170
- data/lib/solargraph/yard_map/core_fills.rb +0 -208
- data/lib/solargraph/yard_map/core_gen.rb +0 -76
- data/lib/solargraph/yard_map/rdoc_to_yard.rb +0 -140
- data/lib/solargraph/yard_map/stdlib_fills.rb +0 -43
- data/lib/yard-solargraph.rb +0 -33
- data/yardoc/2.2.2.tar.gz +0 -0
@@ -1,30 +1,30 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Solargraph
|
4
|
-
class Source
|
5
|
-
class Chain
|
6
|
-
class ZSuper < Call
|
7
|
-
# @return [String]
|
8
|
-
attr_reader :word
|
9
|
-
|
10
|
-
# @return [Array<Chain>]
|
11
|
-
attr_reader :arguments
|
12
|
-
|
13
|
-
# @param word [String]
|
14
|
-
# @param arguments [Array<Chain>]
|
15
|
-
# @param with_block [Boolean] True if the chain is inside a block
|
16
|
-
# @param head [Boolean] True if the call is the start of its chain
|
17
|
-
def initialize word, with_block = false
|
18
|
-
super(word, [], with_block)
|
19
|
-
end
|
20
|
-
|
21
|
-
# @param api_map [ApiMap]
|
22
|
-
# @param name_pin [Pin::Base]
|
23
|
-
# @param locals [Array<Pin::Base>]
|
24
|
-
def resolve api_map, name_pin, locals
|
25
|
-
return super_pins(api_map, name_pin)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Solargraph
|
4
|
+
class Source
|
5
|
+
class Chain
|
6
|
+
class ZSuper < Call
|
7
|
+
# @return [String]
|
8
|
+
attr_reader :word
|
9
|
+
|
10
|
+
# @return [::Array<Chain>]
|
11
|
+
attr_reader :arguments
|
12
|
+
|
13
|
+
# @param word [String]
|
14
|
+
# @param arguments [::Array<Chain>]
|
15
|
+
# @param with_block [Boolean] True if the chain is inside a block
|
16
|
+
# @param head [Boolean] True if the call is the start of its chain
|
17
|
+
def initialize word, with_block = false
|
18
|
+
super(word, [], with_block)
|
19
|
+
end
|
20
|
+
|
21
|
+
# @param api_map [ApiMap]
|
22
|
+
# @param name_pin [Pin::Base]
|
23
|
+
# @param locals [::Array<Pin::Base>]
|
24
|
+
def resolve api_map, name_pin, locals
|
25
|
+
return super_pins(api_map, name_pin)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -1,164 +1,252 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# HACK: Fix autoload issue
|
4
|
-
require 'solargraph/source/chain/link'
|
5
|
-
|
6
|
-
module Solargraph
|
7
|
-
class Source
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
autoload :
|
20
|
-
autoload :
|
21
|
-
autoload :
|
22
|
-
autoload :
|
23
|
-
autoload :
|
24
|
-
autoload :
|
25
|
-
autoload :
|
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
|
-
# @param
|
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
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
# @param
|
113
|
-
# @param
|
114
|
-
# @
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
@@
|
121
|
-
|
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
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
end
|
162
|
-
|
163
|
-
|
164
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# HACK: Fix autoload issue
|
4
|
+
require 'solargraph/source/chain/link'
|
5
|
+
|
6
|
+
module Solargraph
|
7
|
+
class Source
|
8
|
+
#
|
9
|
+
# Represents an expression as a single call chain at the parse
|
10
|
+
# tree level, made up of constants, variables, and method calls,
|
11
|
+
# each represented as a Link object.
|
12
|
+
#
|
13
|
+
# Computes Pins and/or ComplexTypes representing the interpreted
|
14
|
+
# expression.
|
15
|
+
#
|
16
|
+
class Chain
|
17
|
+
include Equality
|
18
|
+
|
19
|
+
autoload :Link, 'solargraph/source/chain/link'
|
20
|
+
autoload :Call, 'solargraph/source/chain/call'
|
21
|
+
autoload :QCall, 'solargraph/source/chain/q_call'
|
22
|
+
autoload :Variable, 'solargraph/source/chain/variable'
|
23
|
+
autoload :ClassVariable, 'solargraph/source/chain/class_variable'
|
24
|
+
autoload :Constant, 'solargraph/source/chain/constant'
|
25
|
+
autoload :InstanceVariable, 'solargraph/source/chain/instance_variable'
|
26
|
+
autoload :GlobalVariable, 'solargraph/source/chain/global_variable'
|
27
|
+
autoload :Literal, 'solargraph/source/chain/literal'
|
28
|
+
autoload :Head, 'solargraph/source/chain/head'
|
29
|
+
autoload :If, 'solargraph/source/chain/if'
|
30
|
+
autoload :Or, 'solargraph/source/chain/or'
|
31
|
+
autoload :BlockVariable, 'solargraph/source/chain/block_variable'
|
32
|
+
autoload :BlockSymbol, 'solargraph/source/chain/block_symbol'
|
33
|
+
autoload :ZSuper, 'solargraph/source/chain/z_super'
|
34
|
+
autoload :Hash, 'solargraph/source/chain/hash'
|
35
|
+
autoload :Array, 'solargraph/source/chain/array'
|
36
|
+
|
37
|
+
@@inference_stack = []
|
38
|
+
@@inference_depth = 0
|
39
|
+
@@inference_invalidation_key = nil
|
40
|
+
@@inference_cache = {}
|
41
|
+
|
42
|
+
UNDEFINED_CALL = Chain::Call.new('<undefined>')
|
43
|
+
UNDEFINED_CONSTANT = Chain::Constant.new('<undefined>')
|
44
|
+
|
45
|
+
# @return [::Array<Source::Chain::Link>]
|
46
|
+
attr_reader :links
|
47
|
+
|
48
|
+
attr_reader :node
|
49
|
+
|
50
|
+
# @sg-ignore Fix "Not enough arguments to Module#protected"
|
51
|
+
protected def equality_fields
|
52
|
+
[links, node]
|
53
|
+
end
|
54
|
+
|
55
|
+
# @param node [Parser::AST::Node, nil]
|
56
|
+
# @param links [::Array<Chain::Link>]
|
57
|
+
# @param splat [Boolean]
|
58
|
+
def initialize links, node = nil, splat = false
|
59
|
+
@links = links.clone
|
60
|
+
@links.push UNDEFINED_CALL if @links.empty?
|
61
|
+
head = true
|
62
|
+
@links.map! do |link|
|
63
|
+
result = (head ? link.clone_head : link.clone_body)
|
64
|
+
head = false
|
65
|
+
result
|
66
|
+
end
|
67
|
+
@node = node
|
68
|
+
@splat = splat
|
69
|
+
end
|
70
|
+
|
71
|
+
# @return [Chain]
|
72
|
+
def base
|
73
|
+
@base ||= Chain.new(links[0..-2])
|
74
|
+
end
|
75
|
+
|
76
|
+
# Determine potential Pins returned by this chain of words
|
77
|
+
#
|
78
|
+
# @param api_map [ApiMap]
|
79
|
+
# @param name_pin [Pin::Closure] the surrounding closure pin for
|
80
|
+
# the statement represented by this chain for type resolution
|
81
|
+
# and method pin lookup.
|
82
|
+
#
|
83
|
+
# For method calls (Chain::Call objects) as the first element
|
84
|
+
# in the chain, 'name_pin.binder' should return the
|
85
|
+
# ComplexType representing the LHS / "self type" of the call.
|
86
|
+
#
|
87
|
+
# @param locals [::Enumerable<Pin::LocalVariable>] Any local
|
88
|
+
# variables / method parameters etc visible by the statement
|
89
|
+
#
|
90
|
+
# @return [::Array<Pin::Base>] Pins representing possible return
|
91
|
+
# types of this method.
|
92
|
+
def define api_map, name_pin, locals
|
93
|
+
return [] if undefined?
|
94
|
+
|
95
|
+
# working_pin is the surrounding closure pin for the link
|
96
|
+
# being processed, whose #binder method will provide the LHS /
|
97
|
+
# 'self type' of the next link (same as the #return_type method
|
98
|
+
# --the type of the result so far).
|
99
|
+
#
|
100
|
+
# @todo ProxyType uses 'type' for the binder, but '
|
101
|
+
working_pin = name_pin
|
102
|
+
links[0..-2].each do |link|
|
103
|
+
pins = link.resolve(api_map, working_pin, locals)
|
104
|
+
type = infer_first_defined(pins, working_pin, api_map, locals)
|
105
|
+
return [] if type.undefined?
|
106
|
+
working_pin = Pin::ProxyType.anonymous(type)
|
107
|
+
end
|
108
|
+
links.last.last_context = working_pin
|
109
|
+
links.last.resolve(api_map, working_pin, locals)
|
110
|
+
end
|
111
|
+
|
112
|
+
# @param api_map [ApiMap]
|
113
|
+
# @param name_pin [Pin::Base]
|
114
|
+
# @param locals [::Array<Pin::LocalVariable>]
|
115
|
+
# @return [ComplexType]
|
116
|
+
# @sg-ignore
|
117
|
+
def infer api_map, name_pin, locals
|
118
|
+
cache_key = [node, node&.location, links, name_pin&.return_type, locals]
|
119
|
+
if @@inference_invalidation_key == api_map.hash
|
120
|
+
cached = @@inference_cache[cache_key]
|
121
|
+
return cached if cached
|
122
|
+
else
|
123
|
+
@@inference_invalidation_key = api_map.hash
|
124
|
+
@@inference_cache = {}
|
125
|
+
end
|
126
|
+
out = infer_uncached api_map, name_pin, locals
|
127
|
+
logger.debug { "Chain#infer() - caching result - cache_key_hash=#{cache_key.hash}, links.map(&:hash)=#{links.map(&:hash)}, links=#{links}, cache_key.map(&:hash) = #{cache_key.map(&:hash)}, cache_key=#{cache_key}" }
|
128
|
+
@@inference_cache[cache_key] = out
|
129
|
+
end
|
130
|
+
|
131
|
+
# @param api_map [ApiMap]
|
132
|
+
# @param name_pin [Pin::Base]
|
133
|
+
# @param locals [::Array<Pin::LocalVariable>]
|
134
|
+
# @return [ComplexType]
|
135
|
+
def infer_uncached api_map, name_pin, locals
|
136
|
+
pins = define(api_map, name_pin, locals)
|
137
|
+
type = infer_first_defined(pins, links.last.last_context, api_map, locals)
|
138
|
+
maybe_nil(type)
|
139
|
+
end
|
140
|
+
|
141
|
+
# @return [Boolean]
|
142
|
+
def literal?
|
143
|
+
links.last.is_a?(Chain::Literal)
|
144
|
+
end
|
145
|
+
|
146
|
+
def undefined?
|
147
|
+
links.any?(&:undefined?)
|
148
|
+
end
|
149
|
+
|
150
|
+
def defined?
|
151
|
+
!undefined?
|
152
|
+
end
|
153
|
+
|
154
|
+
# @return [Boolean]
|
155
|
+
def constant?
|
156
|
+
links.last.is_a?(Chain::Constant)
|
157
|
+
end
|
158
|
+
|
159
|
+
def splat?
|
160
|
+
@splat
|
161
|
+
end
|
162
|
+
|
163
|
+
def nullable?
|
164
|
+
links.any?(&:nullable?)
|
165
|
+
end
|
166
|
+
|
167
|
+
include Logging
|
168
|
+
|
169
|
+
def desc
|
170
|
+
links.map(&:desc).to_s
|
171
|
+
end
|
172
|
+
|
173
|
+
def to_s
|
174
|
+
desc
|
175
|
+
end
|
176
|
+
|
177
|
+
private
|
178
|
+
|
179
|
+
# @param pins [::Array<Pin::Base>]
|
180
|
+
# @param context [Pin::Base]
|
181
|
+
# @param api_map [ApiMap]
|
182
|
+
# @param locals [::Enumerable<Pin::LocalVariable>]
|
183
|
+
# @return [ComplexType]
|
184
|
+
def infer_first_defined pins, context, api_map, locals
|
185
|
+
possibles = []
|
186
|
+
# @todo this param tag shouldn't be needed to probe the type
|
187
|
+
# @todo ...but given it is needed, typecheck should complain that it is needed
|
188
|
+
# @param pin [Pin::Base]
|
189
|
+
pins.each do |pin|
|
190
|
+
# Avoid infinite recursion
|
191
|
+
next if @@inference_stack.include?(pin)
|
192
|
+
|
193
|
+
@@inference_stack.push pin
|
194
|
+
type = pin.typify(api_map)
|
195
|
+
@@inference_stack.pop
|
196
|
+
if type.defined?
|
197
|
+
if type.generic?
|
198
|
+
# @todo even at strong, no typechecking complaint
|
199
|
+
# happens when a [Pin::Base,nil] is passed into a method
|
200
|
+
# that accepts only [Pin::Namespace] as an argument
|
201
|
+
type = type.resolve_generics(pin.closure, context.binder)
|
202
|
+
end
|
203
|
+
if type.defined?
|
204
|
+
possibles.push type
|
205
|
+
break if pin.is_a?(Pin::Method)
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
if possibles.empty?
|
210
|
+
# Limit method inference recursion
|
211
|
+
return ComplexType::UNDEFINED if @@inference_depth >= 10 && pins.first.is_a?(Pin::Method)
|
212
|
+
|
213
|
+
@@inference_depth += 1
|
214
|
+
# @param pin [Pin::Base]
|
215
|
+
pins.each do |pin|
|
216
|
+
# Avoid infinite recursion
|
217
|
+
next if @@inference_stack.include?(pin)
|
218
|
+
|
219
|
+
@@inference_stack.push pin
|
220
|
+
type = pin.probe(api_map)
|
221
|
+
@@inference_stack.pop
|
222
|
+
if type.defined?
|
223
|
+
possibles.push type
|
224
|
+
break if pin.is_a?(Pin::Method)
|
225
|
+
end
|
226
|
+
end
|
227
|
+
@@inference_depth -= 1
|
228
|
+
end
|
229
|
+
return ComplexType::UNDEFINED if possibles.empty?
|
230
|
+
|
231
|
+
type = if possibles.length > 1
|
232
|
+
# Move nil to the end by convention
|
233
|
+
sorted = possibles.sort { |a, _| a.tag == 'nil' ? 1 : 0 }
|
234
|
+
ComplexType.new(sorted.uniq)
|
235
|
+
else
|
236
|
+
ComplexType.new(possibles)
|
237
|
+
end
|
238
|
+
return type if context.nil? || context.return_type.undefined?
|
239
|
+
|
240
|
+
type.self_to_type(context.return_type)
|
241
|
+
end
|
242
|
+
|
243
|
+
# @param type [ComplexType]
|
244
|
+
# @return [ComplexType]
|
245
|
+
def maybe_nil type
|
246
|
+
return type if type.undefined? || type.void? || type.nullable?
|
247
|
+
return type unless nullable?
|
248
|
+
ComplexType.new(type.items + [ComplexType::NIL])
|
249
|
+
end
|
250
|
+
end
|
251
|
+
end
|
252
|
+
end
|
@@ -1,79 +1,82 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Solargraph
|
4
|
-
class Source
|
5
|
-
# A change to be applied to text.
|
6
|
-
#
|
7
|
-
class Change
|
8
|
-
include EncodingFixes
|
9
|
-
|
10
|
-
# @return [Range]
|
11
|
-
attr_reader :range
|
12
|
-
|
13
|
-
# @return [String]
|
14
|
-
attr_reader :new_text
|
15
|
-
|
16
|
-
# @param range [Range] The starting and ending positions of the change.
|
17
|
-
# If nil, the original text will be overwritten.
|
18
|
-
# @param new_text [String] The text to be changed.
|
19
|
-
def initialize range, new_text
|
20
|
-
@range = range
|
21
|
-
@new_text = new_text
|
22
|
-
end
|
23
|
-
|
24
|
-
# Write the change to the specified text.
|
25
|
-
#
|
26
|
-
# @param text [String] The text to be changed.
|
27
|
-
# @param nullable [Boolean] If true, minor changes that could generate
|
28
|
-
# syntax errors will be repaired.
|
29
|
-
# @return [String] The updated text.
|
30
|
-
def write text, nullable = false
|
31
|
-
if nullable and !range.nil? and new_text.match(/[\.\[\{\(@\$:]$/)
|
32
|
-
[':', '@'].each do |dupable|
|
33
|
-
next unless new_text == dupable
|
34
|
-
offset = Position.to_offset(text, range.start)
|
35
|
-
if text[offset - 1] == dupable
|
36
|
-
p = Position.from_offset(text, offset - 1)
|
37
|
-
r = Change.new(Range.new(p, range.start), ' ')
|
38
|
-
text = r.write(text)
|
39
|
-
end
|
40
|
-
break
|
41
|
-
end
|
42
|
-
commit text, "#{new_text[0..-2]} "
|
43
|
-
elsif range.nil?
|
44
|
-
new_text
|
45
|
-
else
|
46
|
-
commit text, new_text
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
# Repair an update by replacing the new text with similarly formatted
|
51
|
-
# whitespace.
|
52
|
-
#
|
53
|
-
# @param text [String] The text to be changed.
|
54
|
-
# @return [String] The updated text.
|
55
|
-
def repair text
|
56
|
-
fixed = new_text.gsub(/[^\s]/, ' ')
|
57
|
-
if range.nil?
|
58
|
-
fixed
|
59
|
-
else
|
60
|
-
result = commit text, fixed
|
61
|
-
off = Position.to_offset(text, range.start)
|
62
|
-
match = result[0, off].match(/[\.:]+\z/)
|
63
|
-
if match
|
64
|
-
result = result[0, off].sub(/#{match[0]}\z/, ' ' * match[0].length) + result[off..-1]
|
65
|
-
end
|
66
|
-
result
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
private
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Solargraph
|
4
|
+
class Source
|
5
|
+
# A change to be applied to text.
|
6
|
+
#
|
7
|
+
class Change
|
8
|
+
include EncodingFixes
|
9
|
+
|
10
|
+
# @return [Range]
|
11
|
+
attr_reader :range
|
12
|
+
|
13
|
+
# @return [String]
|
14
|
+
attr_reader :new_text
|
15
|
+
|
16
|
+
# @param range [Range] The starting and ending positions of the change.
|
17
|
+
# If nil, the original text will be overwritten.
|
18
|
+
# @param new_text [String] The text to be changed.
|
19
|
+
def initialize range, new_text
|
20
|
+
@range = range
|
21
|
+
@new_text = new_text
|
22
|
+
end
|
23
|
+
|
24
|
+
# Write the change to the specified text.
|
25
|
+
#
|
26
|
+
# @param text [String] The text to be changed.
|
27
|
+
# @param nullable [Boolean] If true, minor changes that could generate
|
28
|
+
# syntax errors will be repaired.
|
29
|
+
# @return [String] The updated text.
|
30
|
+
def write text, nullable = false
|
31
|
+
if nullable and !range.nil? and new_text.match(/[\.\[\{\(@\$:]$/)
|
32
|
+
[':', '@'].each do |dupable|
|
33
|
+
next unless new_text == dupable
|
34
|
+
offset = Position.to_offset(text, range.start)
|
35
|
+
if text[offset - 1] == dupable
|
36
|
+
p = Position.from_offset(text, offset - 1)
|
37
|
+
r = Change.new(Range.new(p, range.start), ' ')
|
38
|
+
text = r.write(text)
|
39
|
+
end
|
40
|
+
break
|
41
|
+
end
|
42
|
+
commit text, "#{new_text[0..-2]} "
|
43
|
+
elsif range.nil?
|
44
|
+
new_text
|
45
|
+
else
|
46
|
+
commit text, new_text
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Repair an update by replacing the new text with similarly formatted
|
51
|
+
# whitespace.
|
52
|
+
#
|
53
|
+
# @param text [String] The text to be changed.
|
54
|
+
# @return [String] The updated text.
|
55
|
+
def repair text
|
56
|
+
fixed = new_text.gsub(/[^\s]/, ' ')
|
57
|
+
if range.nil?
|
58
|
+
fixed
|
59
|
+
else
|
60
|
+
result = commit text, fixed
|
61
|
+
off = Position.to_offset(text, range.start)
|
62
|
+
match = result[0, off].match(/[\.:]+\z/)
|
63
|
+
if match
|
64
|
+
result = result[0, off].sub(/#{match[0]}\z/, ' ' * match[0].length) + result[off..-1]
|
65
|
+
end
|
66
|
+
result
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
# @param text [String]
|
73
|
+
# @param insert [String]
|
74
|
+
# @return [String]
|
75
|
+
def commit text, insert
|
76
|
+
start_offset = Position.to_offset(text, range.start)
|
77
|
+
end_offset = Position.to_offset(text, range.ending)
|
78
|
+
(start_offset == 0 ? '' : text[0..start_offset-1].to_s) + normalize(insert) + text[end_offset..-1].to_s
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|