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,180 +1,217 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'yard'
|
4
|
-
require '
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
#
|
9
|
-
#
|
10
|
-
class SourceMap
|
11
|
-
autoload :Mapper, 'solargraph/source_map/mapper'
|
12
|
-
autoload :Clip, 'solargraph/source_map/clip'
|
13
|
-
autoload :Completion, 'solargraph/source_map/completion'
|
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
|
-
|
96
|
-
|
97
|
-
|
98
|
-
end
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
# @param
|
109
|
-
# @return [
|
110
|
-
def
|
111
|
-
|
112
|
-
|
113
|
-
|
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
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'yard'
|
4
|
+
require 'solargraph/yard_tags'
|
5
|
+
|
6
|
+
module Solargraph
|
7
|
+
# An index of Pins and other ApiMap-related data for a single Source
|
8
|
+
# that can be queried.
|
9
|
+
#
|
10
|
+
class SourceMap
|
11
|
+
autoload :Mapper, 'solargraph/source_map/mapper'
|
12
|
+
autoload :Clip, 'solargraph/source_map/clip'
|
13
|
+
autoload :Completion, 'solargraph/source_map/completion'
|
14
|
+
autoload :Data, 'solargraph/source_map/data'
|
15
|
+
|
16
|
+
# @return [Source]
|
17
|
+
attr_reader :source
|
18
|
+
|
19
|
+
# @return [Array<Pin::Base>]
|
20
|
+
def pins
|
21
|
+
data.pins
|
22
|
+
end
|
23
|
+
|
24
|
+
# @return [Array<Pin::LocalVariable>]
|
25
|
+
def locals
|
26
|
+
data.locals
|
27
|
+
end
|
28
|
+
|
29
|
+
# @param source [Source]
|
30
|
+
def initialize source
|
31
|
+
@source = source
|
32
|
+
|
33
|
+
environ.merge Convention.for_local(self) unless filename.nil?
|
34
|
+
self.convention_pins = environ.pins
|
35
|
+
@pin_select_cache = {}
|
36
|
+
end
|
37
|
+
|
38
|
+
# @param klass [Class]
|
39
|
+
# @return [Array<Pin::Base>]
|
40
|
+
def pins_by_class klass
|
41
|
+
@pin_select_cache[klass] ||= pin_class_hash.select { |key, _| key <= klass }.values.flatten
|
42
|
+
end
|
43
|
+
|
44
|
+
# A hash representing the state of the source map's API.
|
45
|
+
#
|
46
|
+
# ApiMap#catalog uses this value to determine whether it needs to clear its
|
47
|
+
# cache.
|
48
|
+
#
|
49
|
+
# @return [Integer]
|
50
|
+
def api_hash
|
51
|
+
@api_hash ||= (pins_by_class(Pin::Constant) + pins_by_class(Pin::Namespace).select { |pin| pin.namespace.to_s > '' } + pins_by_class(Pin::Reference) + pins_by_class(Pin::Method).map(&:node) + locals).hash
|
52
|
+
end
|
53
|
+
|
54
|
+
# @return [String]
|
55
|
+
def filename
|
56
|
+
source.filename
|
57
|
+
end
|
58
|
+
|
59
|
+
# @return [String]
|
60
|
+
def code
|
61
|
+
source.code
|
62
|
+
end
|
63
|
+
|
64
|
+
# @return [Array<Pin::Reference::Require>]
|
65
|
+
def requires
|
66
|
+
pins_by_class(Pin::Reference::Require)
|
67
|
+
end
|
68
|
+
|
69
|
+
# @return [Environ]
|
70
|
+
def environ
|
71
|
+
@environ ||= Environ.new
|
72
|
+
end
|
73
|
+
|
74
|
+
# all pins except Solargraph::Pin::Reference::Reference
|
75
|
+
# @return [Array<Pin::Base>]
|
76
|
+
def document_symbols
|
77
|
+
@document_symbols ||= (pins + convention_pins).select do |pin|
|
78
|
+
pin.path && !pin.path.empty?
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# @param query [String]
|
83
|
+
# @return [Array<Pin::Base>]
|
84
|
+
def query_symbols query
|
85
|
+
Pin::Search.new(document_symbols, query).results
|
86
|
+
end
|
87
|
+
|
88
|
+
# @param position [Position]
|
89
|
+
# @return [Source::Cursor]
|
90
|
+
def cursor_at position
|
91
|
+
Source::Cursor.new(source, position)
|
92
|
+
end
|
93
|
+
|
94
|
+
# @param path [String]
|
95
|
+
# @return [Pin::Base]
|
96
|
+
def first_pin path
|
97
|
+
pins.select { |p| p.path == path }.first
|
98
|
+
end
|
99
|
+
|
100
|
+
# @param location [Solargraph::Location]
|
101
|
+
# @return [Array<Solargraph::Pin::Base>]
|
102
|
+
def locate_pins location
|
103
|
+
# return nil unless location.start_with?("#{filename}:")
|
104
|
+
(pins + locals).select { |pin| pin.location == location }
|
105
|
+
end
|
106
|
+
|
107
|
+
# @param line [Integer]
|
108
|
+
# @param character [Integer]
|
109
|
+
# @return [Pin::Method,Pin::Namespace]
|
110
|
+
def locate_named_path_pin line, character
|
111
|
+
_locate_pin line, character, Pin::Namespace, Pin::Method
|
112
|
+
end
|
113
|
+
|
114
|
+
# @param line [Integer]
|
115
|
+
# @param character [Integer]
|
116
|
+
# @return [Pin::Namespace,Pin::Method,Pin::Block]
|
117
|
+
def locate_block_pin line, character
|
118
|
+
_locate_pin line, character, Pin::Namespace, Pin::Method, Pin::Block
|
119
|
+
end
|
120
|
+
|
121
|
+
# @todo Candidate for deprecation
|
122
|
+
#
|
123
|
+
# @param other_map [SourceMap]
|
124
|
+
# @return [Boolean]
|
125
|
+
def try_merge! other_map
|
126
|
+
return false if pins.length != other_map.pins.length || locals.length != other_map.locals.length || requires.map(&:name).uniq.sort != other_map.requires.map(&:name).uniq.sort
|
127
|
+
|
128
|
+
pins.each_index do |i|
|
129
|
+
return false unless pins[i].try_merge!(other_map.pins[i])
|
130
|
+
end
|
131
|
+
locals.each_index do |i|
|
132
|
+
return false unless locals[i].try_merge!(other_map.locals[i])
|
133
|
+
end
|
134
|
+
@source = other_map.source
|
135
|
+
true
|
136
|
+
end
|
137
|
+
|
138
|
+
# @param name [String]
|
139
|
+
# @return [Array<Location>]
|
140
|
+
def references name
|
141
|
+
source.references name
|
142
|
+
end
|
143
|
+
|
144
|
+
# @param location [Location]
|
145
|
+
# @return [Array<Pin::LocalVariable>]
|
146
|
+
def locals_at(location)
|
147
|
+
return [] if location.filename != filename
|
148
|
+
closure = locate_named_path_pin(location.range.start.line, location.range.start.character)
|
149
|
+
locals.select { |pin| pin.visible_at?(closure, location) }
|
150
|
+
end
|
151
|
+
|
152
|
+
class << self
|
153
|
+
# @param filename [String]
|
154
|
+
# @return [SourceMap]
|
155
|
+
def load filename
|
156
|
+
source = Solargraph::Source.load(filename)
|
157
|
+
SourceMap.map(source)
|
158
|
+
end
|
159
|
+
|
160
|
+
# @param code [String]
|
161
|
+
# @param filename [String, nil]
|
162
|
+
# @return [SourceMap]
|
163
|
+
def load_string code, filename = nil
|
164
|
+
source = Solargraph::Source.load_string(code, filename)
|
165
|
+
SourceMap.map(source)
|
166
|
+
end
|
167
|
+
|
168
|
+
# @deprecated
|
169
|
+
# @param source [Source]
|
170
|
+
# @return [SourceMap]
|
171
|
+
def map source
|
172
|
+
new(source)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
private
|
177
|
+
|
178
|
+
def pin_class_hash
|
179
|
+
@pin_class_hash ||= pins.to_set.classify(&:class).transform_values(&:to_a)
|
180
|
+
end
|
181
|
+
|
182
|
+
def data
|
183
|
+
@data ||= Data.new(source)
|
184
|
+
end
|
185
|
+
|
186
|
+
# @return [Array<Pin::Base>]
|
187
|
+
def convention_pins
|
188
|
+
@convention_pins || []
|
189
|
+
end
|
190
|
+
|
191
|
+
# @param pins [Array<Pin::Base>]
|
192
|
+
# @return [Array<Pin::Base>]
|
193
|
+
def convention_pins=(pins)
|
194
|
+
# unmemoizing the document_symbols in case it was called from any of conventions
|
195
|
+
@document_symbols = nil
|
196
|
+
@convention_pins = pins
|
197
|
+
end
|
198
|
+
|
199
|
+
# @param line [Integer]
|
200
|
+
# @param character [Integer]
|
201
|
+
# @param klasses [Array<Class>]
|
202
|
+
# @return [Pin::Base, nil]
|
203
|
+
def _locate_pin line, character, *klasses
|
204
|
+
position = Position.new(line, character)
|
205
|
+
found = nil
|
206
|
+
pins.each do |pin|
|
207
|
+
# @todo Attribute pins should not be treated like closures, but
|
208
|
+
# there's probably a better way to handle it
|
209
|
+
next if pin.is_a?(Pin::Method) && pin.attribute?
|
210
|
+
found = pin if (klasses.empty? || klasses.any? { |kls| pin.is_a?(kls) } ) && pin.location.range.contain?(position)
|
211
|
+
break if pin.location.range.start.line > line
|
212
|
+
end
|
213
|
+
# Assuming the root pin is always valid
|
214
|
+
found || pins.first
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
@@ -1,99 +1,120 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Solargraph
|
4
|
-
class TypeChecker
|
5
|
-
# Helper methods for performing type checks
|
6
|
-
#
|
7
|
-
module Checks
|
8
|
-
module_function
|
9
|
-
|
10
|
-
# Compare an expected type with an inferred type. Common usage is to
|
11
|
-
# check if the type declared in a method's @return tag matches the type
|
12
|
-
# inferred from static analysis of the code.
|
13
|
-
#
|
14
|
-
# @param api_map [ApiMap]
|
15
|
-
# @param expected [ComplexType]
|
16
|
-
# @param inferred [ComplexType]
|
17
|
-
# @return [Boolean]
|
18
|
-
def types_match? api_map, expected, inferred
|
19
|
-
return true if expected.to_s == inferred.to_s
|
20
|
-
matches = []
|
21
|
-
expected.each do |exp|
|
22
|
-
found = false
|
23
|
-
inferred.each do |inf|
|
24
|
-
# if api_map.super_and_sub?(fuzz(inf), fuzz(exp))
|
25
|
-
if either_way?(api_map, inf, exp)
|
26
|
-
found = true
|
27
|
-
matches.push inf
|
28
|
-
break
|
29
|
-
end
|
30
|
-
end
|
31
|
-
return false unless found
|
32
|
-
end
|
33
|
-
inferred.each do |inf|
|
34
|
-
next if matches.include?(inf)
|
35
|
-
found = false
|
36
|
-
expected.each do |exp|
|
37
|
-
# if api_map.super_and_sub?(fuzz(inf), fuzz(exp))
|
38
|
-
if either_way?(api_map, inf, exp)
|
39
|
-
found = true
|
40
|
-
break
|
41
|
-
end
|
42
|
-
end
|
43
|
-
return false unless found
|
44
|
-
end
|
45
|
-
true
|
46
|
-
end
|
47
|
-
|
48
|
-
# @param api_map [ApiMap]
|
49
|
-
# @param expected [ComplexType]
|
50
|
-
# @param inferred [ComplexType]
|
51
|
-
# @return [Boolean]
|
52
|
-
def any_types_match? api_map, expected, inferred
|
53
|
-
return duck_types_match?(api_map, expected, inferred) if expected.duck_type?
|
54
|
-
expected
|
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
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Solargraph
|
4
|
+
class TypeChecker
|
5
|
+
# Helper methods for performing type checks
|
6
|
+
#
|
7
|
+
module Checks
|
8
|
+
module_function
|
9
|
+
|
10
|
+
# Compare an expected type with an inferred type. Common usage is to
|
11
|
+
# check if the type declared in a method's @return tag matches the type
|
12
|
+
# inferred from static analysis of the code.
|
13
|
+
#
|
14
|
+
# @param api_map [ApiMap]
|
15
|
+
# @param expected [ComplexType]
|
16
|
+
# @param inferred [ComplexType]
|
17
|
+
# @return [Boolean]
|
18
|
+
def types_match? api_map, expected, inferred
|
19
|
+
return true if expected.to_s == inferred.to_s
|
20
|
+
matches = []
|
21
|
+
expected.each do |exp|
|
22
|
+
found = false
|
23
|
+
inferred.each do |inf|
|
24
|
+
# if api_map.super_and_sub?(fuzz(inf), fuzz(exp))
|
25
|
+
if either_way?(api_map, inf, exp)
|
26
|
+
found = true
|
27
|
+
matches.push inf
|
28
|
+
break
|
29
|
+
end
|
30
|
+
end
|
31
|
+
return false unless found
|
32
|
+
end
|
33
|
+
inferred.each do |inf|
|
34
|
+
next if matches.include?(inf)
|
35
|
+
found = false
|
36
|
+
expected.each do |exp|
|
37
|
+
# if api_map.super_and_sub?(fuzz(inf), fuzz(exp))
|
38
|
+
if either_way?(api_map, inf, exp)
|
39
|
+
found = true
|
40
|
+
break
|
41
|
+
end
|
42
|
+
end
|
43
|
+
return false unless found
|
44
|
+
end
|
45
|
+
true
|
46
|
+
end
|
47
|
+
|
48
|
+
# @param api_map [ApiMap]
|
49
|
+
# @param expected [ComplexType]
|
50
|
+
# @param inferred [ComplexType]
|
51
|
+
# @return [Boolean]
|
52
|
+
def any_types_match? api_map, expected, inferred
|
53
|
+
return duck_types_match?(api_map, expected, inferred) if expected.duck_type?
|
54
|
+
# walk through the union expected type and see if any members
|
55
|
+
# of the union match the inferred type
|
56
|
+
expected.each do |exp|
|
57
|
+
next if exp.duck_type?
|
58
|
+
# @todo: there should be a level of typechecking where all
|
59
|
+
# unique types in the inferred must match one of the
|
60
|
+
# expected unique types
|
61
|
+
inferred.each do |inf|
|
62
|
+
# return true if exp == inf || api_map.super_and_sub?(fuzz(inf), fuzz(exp))
|
63
|
+
return true if exp == inf || either_way?(api_map, inf, exp)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
false
|
67
|
+
end
|
68
|
+
|
69
|
+
# @param api_map [ApiMap]
|
70
|
+
# @param inferred [ComplexType]
|
71
|
+
# @param expected [ComplexType]
|
72
|
+
# @return [Boolean]
|
73
|
+
def all_types_match? api_map, inferred, expected
|
74
|
+
return duck_types_match?(api_map, expected, inferred) if expected.duck_type?
|
75
|
+
inferred.each do |inf|
|
76
|
+
next if inf.duck_type?
|
77
|
+
return false unless expected.any? { |exp| exp == inf || either_way?(api_map, inf, exp) }
|
78
|
+
end
|
79
|
+
true
|
80
|
+
end
|
81
|
+
|
82
|
+
# @param api_map [ApiMap]
|
83
|
+
# @param expected [ComplexType]
|
84
|
+
# @param inferred [ComplexType]
|
85
|
+
# @return [Boolean]
|
86
|
+
def duck_types_match? api_map, expected, inferred
|
87
|
+
raise ArgumentError, 'Expected type must be duck type' unless expected.duck_type?
|
88
|
+
expected.each do |exp|
|
89
|
+
next unless exp.duck_type?
|
90
|
+
quack = exp.to_s[1..-1]
|
91
|
+
return false if api_map.get_method_stack(inferred.namespace, quack, scope: inferred.scope).empty?
|
92
|
+
end
|
93
|
+
true
|
94
|
+
end
|
95
|
+
|
96
|
+
# @param type [ComplexType::UniqueType]
|
97
|
+
# @return [String]
|
98
|
+
def fuzz type
|
99
|
+
if type.parameters?
|
100
|
+
type.name
|
101
|
+
else
|
102
|
+
type.tag
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
# @param api_map [ApiMap]
|
107
|
+
# @param cls1 [ComplexType::UniqueType]
|
108
|
+
# @param cls2 [ComplexType::UniqueType]
|
109
|
+
# @return [Boolean]
|
110
|
+
def either_way?(api_map, cls1, cls2)
|
111
|
+
# @todo there should be a level of typechecking which uses the
|
112
|
+
# full tag with parameters to determine compatibility
|
113
|
+
f1 = cls1.name
|
114
|
+
f2 = cls2.name
|
115
|
+
api_map.type_include?(f1, f2) || api_map.super_and_sub?(f1, f2) || api_map.super_and_sub?(f2, f1)
|
116
|
+
# api_map.type_include?(f1, f2) || api_map.super_and_sub?(f1, f2) || api_map.super_and_sub?(f2, f1)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|