solargraph 0.44.2 → 0.46.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/.github/workflows/rspec.yml +41 -0
- data/.gitignore +9 -9
- data/.rspec +2 -2
- data/.travis.yml +19 -19
- data/CHANGELOG.md +1115 -1088
- data/Gemfile +0 -0
- data/LICENSE +0 -0
- data/README.md +128 -120
- data/Rakefile +0 -0
- data/SPONSORS.md +18 -15
- data/bin/solargraph +0 -0
- data/lib/solargraph/api_map/bundler_methods.rb +22 -22
- data/lib/solargraph/api_map/cache.rb +70 -70
- data/lib/solargraph/api_map/source_to_yard.rb +81 -81
- data/lib/solargraph/api_map/store.rb +256 -256
- data/lib/solargraph/api_map.rb +686 -681
- data/lib/solargraph/bench.rb +27 -27
- data/lib/solargraph/compat.rb +37 -37
- data/lib/solargraph/complex_type/type_methods.rb +130 -130
- data/lib/solargraph/complex_type/unique_type.rb +75 -75
- data/lib/solargraph/complex_type.rb +221 -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/rspec.rb +30 -21
- data/lib/solargraph/convention.rb +47 -47
- data/lib/solargraph/converters/dd.rb +12 -12
- data/lib/solargraph/converters/dl.rb +12 -12
- data/lib/solargraph/converters/dt.rb +12 -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 -37
- data/lib/solargraph/diagnostics/rubocop.rb +98 -98
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +63 -63
- data/lib/solargraph/diagnostics/severities.rb +15 -15
- data/lib/solargraph/diagnostics/type_check.rb +54 -54
- data/lib/solargraph/diagnostics/update_errors.rb +41 -41
- data/lib/solargraph/diagnostics.rb +55 -55
- data/lib/solargraph/documentor.rb +76 -76
- data/lib/solargraph/environ.rb +45 -45
- 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/cataloger.rb +56 -56
- data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
- data/lib/solargraph/language_server/host/dispatch.rb +111 -111
- data/lib/solargraph/language_server/host/message_worker.rb +59 -59
- data/lib/solargraph/language_server/host/sources.rb +156 -156
- data/lib/solargraph/language_server/host.rb +865 -865
- data/lib/solargraph/language_server/message/base.rb +89 -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 +58 -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 +100 -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 +23 -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 +162 -162
- data/lib/solargraph/language_server/message/initialized.rb +27 -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 +59 -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 +23 -23
- data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -26
- data/lib/solargraph/language_server/message/text_document/formatting.rb +126 -126
- data/lib/solargraph/language_server/message/text_document/hover.rb +54 -44
- 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 +29 -29
- data/lib/solargraph/language_server/message/text_document.rb +28 -28
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +30 -30
- data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +33 -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 +93 -93
- data/lib/solargraph/language_server/message_types.rb +14 -14
- 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 +53 -53
- data/lib/solargraph/language_server/transport/data_reader.rb +72 -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 +19 -19
- data/lib/solargraph/library.rb +546 -546
- data/lib/solargraph/location.rb +37 -37
- data/lib/solargraph/logging.rb +27 -27
- data/lib/solargraph/page.rb +83 -83
- data/lib/solargraph/parser/comment_ripper.rb +52 -52
- data/lib/solargraph/parser/legacy/class_methods.rb +135 -140
- data/lib/solargraph/parser/legacy/flawed_builder.rb +16 -16
- data/lib/solargraph/parser/legacy/node_chainer.rb +148 -148
- data/lib/solargraph/parser/legacy/node_methods.rb +325 -325
- data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +23 -23
- data/lib/solargraph/parser/legacy/node_processors/args_node.rb +35 -35
- data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +15 -15
- data/lib/solargraph/parser/legacy/node_processors/block_node.rb +42 -42
- data/lib/solargraph/parser/legacy/node_processors/casgn_node.rb +25 -25
- data/lib/solargraph/parser/legacy/node_processors/cvasgn_node.rb +23 -23
- data/lib/solargraph/parser/legacy/node_processors/def_node.rb +63 -63
- data/lib/solargraph/parser/legacy/node_processors/defs_node.rb +36 -36
- data/lib/solargraph/parser/legacy/node_processors/gvasgn_node.rb +23 -23
- data/lib/solargraph/parser/legacy/node_processors/ivasgn_node.rb +38 -38
- data/lib/solargraph/parser/legacy/node_processors/lvasgn_node.rb +28 -28
- data/lib/solargraph/parser/legacy/node_processors/namespace_node.rb +39 -39
- data/lib/solargraph/parser/legacy/node_processors/orasgn_node.rb +16 -16
- data/lib/solargraph/parser/legacy/node_processors/resbody_node.rb +36 -36
- data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +21 -21
- data/lib/solargraph/parser/legacy/node_processors/send_node.rb +257 -257
- data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +18 -18
- data/lib/solargraph/parser/legacy/node_processors.rb +54 -54
- data/lib/solargraph/parser/legacy.rb +12 -12
- data/lib/solargraph/parser/node_methods.rb +43 -43
- data/lib/solargraph/parser/node_processor/base.rb +77 -77
- data/lib/solargraph/parser/node_processor.rb +43 -43
- data/lib/solargraph/parser/region.rb +66 -66
- data/lib/solargraph/parser/rubyvm/class_methods.rb +144 -155
- data/lib/solargraph/parser/rubyvm/node_chainer.rb +160 -160
- data/lib/solargraph/parser/rubyvm/node_methods.rb +315 -315
- data/lib/solargraph/parser/rubyvm/node_processors/alias_node.rb +23 -23
- data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +85 -85
- data/lib/solargraph/parser/rubyvm/node_processors/begin_node.rb +15 -15
- data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +42 -42
- data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +22 -22
- data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +23 -23
- data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +63 -64
- data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +57 -57
- data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +23 -23
- data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +38 -38
- data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +39 -39
- data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +20 -20
- data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +27 -27
- data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +39 -39
- data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +26 -26
- data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +15 -15
- data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +45 -45
- data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +21 -21
- data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +15 -15
- data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +277 -277
- data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +18 -18
- data/lib/solargraph/parser/rubyvm/node_processors.rb +63 -62
- data/lib/solargraph/parser/rubyvm.rb +40 -40
- data/lib/solargraph/parser/snippet.rb +13 -13
- data/lib/solargraph/parser.rb +26 -26
- data/lib/solargraph/pin/base.rb +296 -296
- data/lib/solargraph/pin/base_variable.rb +84 -84
- data/lib/solargraph/pin/block.rb +72 -72
- data/lib/solargraph/pin/class_variable.rb +8 -8
- data/lib/solargraph/pin/closure.rb +37 -37
- data/lib/solargraph/pin/common.rb +70 -70
- data/lib/solargraph/pin/constant.rb +43 -43
- data/lib/solargraph/pin/conversions.rb +96 -96
- data/lib/solargraph/pin/documenting.rb +105 -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 +30 -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 +55 -55
- data/lib/solargraph/pin/method.rb +245 -245
- data/lib/solargraph/pin/method_alias.rb +31 -31
- data/lib/solargraph/pin/namespace.rb +91 -91
- data/lib/solargraph/pin/parameter.rb +201 -206
- 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 +14 -14
- data/lib/solargraph/pin/search.rb +56 -0
- data/lib/solargraph/pin/singleton.rb +11 -11
- data/lib/solargraph/pin/symbol.rb +47 -47
- data/lib/solargraph/pin.rb +37 -36
- data/lib/solargraph/position.rb +100 -100
- data/lib/solargraph/range.rb +95 -95
- data/lib/solargraph/server_methods.rb +16 -16
- data/lib/solargraph/shell.rb +226 -226
- data/lib/solargraph/source/chain/block_variable.rb +13 -13
- data/lib/solargraph/source/chain/call.rb +204 -204
- data/lib/solargraph/source/chain/class_variable.rb +13 -13
- data/lib/solargraph/source/chain/constant.rb +75 -75
- data/lib/solargraph/source/chain/global_variable.rb +13 -13
- data/lib/solargraph/source/chain/hash.rb +28 -28
- data/lib/solargraph/source/chain/head.rb +19 -19
- data/lib/solargraph/source/chain/instance_variable.rb +13 -13
- data/lib/solargraph/source/chain/link.rb +71 -71
- data/lib/solargraph/source/chain/literal.rb +23 -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 +164 -164
- data/lib/solargraph/source/change.rb +79 -79
- data/lib/solargraph/source/cursor.rb +164 -164
- data/lib/solargraph/source/source_chainer.rb +191 -191
- data/lib/solargraph/source/updater.rb +54 -54
- data/lib/solargraph/source.rb +522 -522
- data/lib/solargraph/source_map/clip.rb +224 -224
- data/lib/solargraph/source_map/completion.rb +23 -23
- data/lib/solargraph/source_map/mapper.rb +212 -212
- data/lib/solargraph/source_map.rb +180 -189
- data/lib/solargraph/type_checker/checks.rb +99 -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 +57 -57
- data/lib/solargraph/type_checker.rb +543 -510
- data/lib/solargraph/version.rb +5 -5
- data/lib/solargraph/views/environment.erb +58 -58
- data/lib/solargraph/workspace/config.rb +231 -231
- data/lib/solargraph/workspace.rb +215 -214
- data/lib/solargraph/yard_map/cache.rb +19 -19
- data/lib/solargraph/yard_map/core_docs.rb +170 -170
- data/lib/solargraph/yard_map/core_fills.rb +208 -203
- data/lib/solargraph/yard_map/core_gen.rb +76 -76
- data/lib/solargraph/yard_map/helpers.rb +16 -16
- data/lib/solargraph/yard_map/mapper/to_constant.rb +25 -25
- data/lib/solargraph/yard_map/mapper/to_method.rb +78 -78
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +27 -27
- data/lib/solargraph/yard_map/mapper.rb +77 -77
- data/lib/solargraph/yard_map/rdoc_to_yard.rb +140 -140
- data/lib/solargraph/yard_map/stdlib_fills.rb +43 -43
- data/lib/solargraph/yard_map/to_method.rb +79 -79
- data/lib/solargraph/yard_map.rb +460 -443
- data/lib/solargraph.rb +69 -69
- data/lib/yard-solargraph.rb +33 -33
- data/solargraph.gemspec +0 -0
- metadata +14 -12
|
@@ -1,189 +1,180 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require '
|
|
4
|
-
require 'yard'
|
|
5
|
-
require '
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
#
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
autoload :
|
|
13
|
-
autoload :
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
# @param
|
|
26
|
-
# @param
|
|
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
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
|
|
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
|
-
# @param
|
|
165
|
-
# @
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
# @param str1 [String]
|
|
183
|
-
# @param str2 [String]
|
|
184
|
-
# @return [Boolean]
|
|
185
|
-
def fuzzy_string_match str1, str2
|
|
186
|
-
JaroWinkler.distance(str1, str2) > 0.6
|
|
187
|
-
end
|
|
188
|
-
end
|
|
189
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'yard'
|
|
4
|
+
require 'yard-solargraph'
|
|
5
|
+
require 'set'
|
|
6
|
+
|
|
7
|
+
module Solargraph
|
|
8
|
+
# An index of pins and other ApiMap-related data for a Source.
|
|
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
|
+
# @return [Source]
|
|
16
|
+
attr_reader :source
|
|
17
|
+
|
|
18
|
+
# @return [Array<Pin::Base>]
|
|
19
|
+
attr_reader :pins
|
|
20
|
+
|
|
21
|
+
# @return [Array<Pin::Base>]
|
|
22
|
+
attr_reader :locals
|
|
23
|
+
|
|
24
|
+
# @param source [Source]
|
|
25
|
+
# @param pins [Array<Pin::Base>]
|
|
26
|
+
# @param locals [Array<Pin::Base>]
|
|
27
|
+
def initialize source, pins, locals
|
|
28
|
+
# HACK: Keep the library from changing this
|
|
29
|
+
@source = source.dup
|
|
30
|
+
@pins = pins
|
|
31
|
+
@locals = locals
|
|
32
|
+
environ.merge Convention.for_local(self) unless filename.nil?
|
|
33
|
+
@pin_class_hash = pins.to_set.classify(&:class).transform_values(&:to_a)
|
|
34
|
+
@pin_select_cache = {}
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def pins_by_class klass
|
|
38
|
+
@pin_select_cache[klass] ||= @pin_class_hash.select { |key, _| key <= klass }.values.flatten
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def rebindable_method_names
|
|
42
|
+
@rebindable_method_names ||= pins_by_class(Pin::Method)
|
|
43
|
+
.select { |pin| pin.comments && pin.comments.include?('@yieldself') }
|
|
44
|
+
.map(&:name)
|
|
45
|
+
.to_set
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# @return [String]
|
|
49
|
+
def filename
|
|
50
|
+
source.filename
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# @return [String]
|
|
54
|
+
def code
|
|
55
|
+
source.code
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# @return [Array<Pin::Reference::Require>]
|
|
59
|
+
def requires
|
|
60
|
+
pins_by_class(Pin::Reference::Require)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# @return [Environ]
|
|
64
|
+
def environ
|
|
65
|
+
@environ ||= Environ.new
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# @return [Array<Pin::Base>]
|
|
69
|
+
def document_symbols
|
|
70
|
+
@document_symbols ||= pins.select { |pin|
|
|
71
|
+
pin.path && !pin.path.empty?
|
|
72
|
+
}
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# @param query [String]
|
|
76
|
+
# @return [Array<Pin::Base>]
|
|
77
|
+
def query_symbols query
|
|
78
|
+
Pin::Search.new(document_symbols, query).results
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# @param position [Position]
|
|
82
|
+
# @return [Source::Cursor]
|
|
83
|
+
def cursor_at position
|
|
84
|
+
Source::Cursor.new(source, position)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# @param path [String]
|
|
88
|
+
# @return [Pin::Base]
|
|
89
|
+
def first_pin path
|
|
90
|
+
pins.select { |p| p.path == path }.first
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# @param location [Solargraph::Location]
|
|
94
|
+
# @return [Array<Solargraph::Pin::Base>]
|
|
95
|
+
def locate_pins location
|
|
96
|
+
# return nil unless location.start_with?("#{filename}:")
|
|
97
|
+
(pins + locals).select { |pin| pin.location == location }
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def locate_named_path_pin line, character
|
|
101
|
+
_locate_pin line, character, Pin::Namespace, Pin::Method
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def locate_block_pin line, character
|
|
105
|
+
_locate_pin line, character, Pin::Namespace, Pin::Method, Pin::Block
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# @param other_map [SourceMap]
|
|
109
|
+
# @return [Boolean]
|
|
110
|
+
def try_merge! other_map
|
|
111
|
+
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
|
|
112
|
+
pins.each_index do |i|
|
|
113
|
+
return false unless pins[i].try_merge!(other_map.pins[i])
|
|
114
|
+
end
|
|
115
|
+
locals.each_index do |i|
|
|
116
|
+
return false unless locals[i].try_merge!(other_map.locals[i])
|
|
117
|
+
end
|
|
118
|
+
@source = other_map.source
|
|
119
|
+
true
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# @param name [String]
|
|
123
|
+
# @return [Array<Location>]
|
|
124
|
+
def references name
|
|
125
|
+
source.references name
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# @param location [Location]
|
|
129
|
+
# @return [Array<Pin::LocalVariable>]
|
|
130
|
+
def locals_at(location)
|
|
131
|
+
return [] if location.filename != filename
|
|
132
|
+
closure = locate_named_path_pin(location.range.start.line, location.range.start.character)
|
|
133
|
+
locals.select { |pin| pin.visible_at?(closure, location) }
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
class << self
|
|
137
|
+
# @param filename [String]
|
|
138
|
+
# @return [SourceMap]
|
|
139
|
+
def load filename
|
|
140
|
+
source = Solargraph::Source.load(filename)
|
|
141
|
+
SourceMap.map(source)
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# @param code [String]
|
|
145
|
+
# @param filename [String, nil]
|
|
146
|
+
# @return [SourceMap]
|
|
147
|
+
def load_string code, filename = nil
|
|
148
|
+
source = Solargraph::Source.load_string(code, filename)
|
|
149
|
+
SourceMap.map(source)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# @param source [Source]
|
|
153
|
+
# @return [SourceMap]
|
|
154
|
+
def map source
|
|
155
|
+
result = SourceMap::Mapper.map(source)
|
|
156
|
+
new(source, *result)
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
private
|
|
161
|
+
|
|
162
|
+
# @param line [Integer]
|
|
163
|
+
# @param character [Integer]
|
|
164
|
+
# @param klasses [Array<Class>]
|
|
165
|
+
# @return [Pin::Base]
|
|
166
|
+
def _locate_pin line, character, *klasses
|
|
167
|
+
position = Position.new(line, character)
|
|
168
|
+
found = nil
|
|
169
|
+
pins.each do |pin|
|
|
170
|
+
# @todo Attribute pins should not be treated like closures, but
|
|
171
|
+
# there's probably a better way to handle it
|
|
172
|
+
next if pin.is_a?(Pin::Method) && pin.attribute?
|
|
173
|
+
found = pin if (klasses.empty? || klasses.any? { |kls| pin.is_a?(kls) } ) && pin.location.range.contain?(position)
|
|
174
|
+
break if pin.location.range.start.line > line
|
|
175
|
+
end
|
|
176
|
+
# Assuming the root pin is always valid
|
|
177
|
+
found || pins.first
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
end
|
|
@@ -1,99 +1,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
|
-
expected.each do |exp|
|
|
55
|
-
next if exp.duck_type?
|
|
56
|
-
inferred.each do |inf|
|
|
57
|
-
# return true if exp == inf || api_map.super_and_sub?(fuzz(inf), fuzz(exp))
|
|
58
|
-
return true if exp == inf || either_way?(api_map, inf, exp)
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
false
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
# @param api_map [ApiMap]
|
|
65
|
-
# @param expected [ComplexType]
|
|
66
|
-
# @param inferred [ComplexType]
|
|
67
|
-
# @return [Boolean]
|
|
68
|
-
def duck_types_match? api_map, expected, inferred
|
|
69
|
-
raise ArgumentError, 'Expected type must be duck type' unless expected.duck_type?
|
|
70
|
-
expected.each do |exp|
|
|
71
|
-
next unless exp.duck_type?
|
|
72
|
-
quack = exp.to_s[1..-1]
|
|
73
|
-
return false if api_map.get_method_stack(inferred.namespace, quack, scope: inferred.scope).empty?
|
|
74
|
-
end
|
|
75
|
-
true
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
# @param type [ComplexType::UniqueType]
|
|
79
|
-
# @return [String]
|
|
80
|
-
def fuzz type
|
|
81
|
-
if type.parameters?
|
|
82
|
-
type.name
|
|
83
|
-
else
|
|
84
|
-
type.tag
|
|
85
|
-
end
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
# @param api_map [ApiMap]
|
|
89
|
-
# @param cls1 [ComplexType::UniqueType]
|
|
90
|
-
# @param cls2 [ComplexType::UniqueType]
|
|
91
|
-
# @return [Boolean]
|
|
92
|
-
def either_way?(api_map, cls1, cls2)
|
|
93
|
-
f1 = fuzz(cls1)
|
|
94
|
-
f2 = fuzz(cls2)
|
|
95
|
-
api_map.type_include?(f1, f2) || api_map.super_and_sub?(f1, f2) || api_map.super_and_sub?(f2, f1)
|
|
96
|
-
end
|
|
97
|
-
end
|
|
98
|
-
end
|
|
99
|
-
end
|
|
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.each do |exp|
|
|
55
|
+
next if exp.duck_type?
|
|
56
|
+
inferred.each do |inf|
|
|
57
|
+
# return true if exp == inf || api_map.super_and_sub?(fuzz(inf), fuzz(exp))
|
|
58
|
+
return true if exp == inf || either_way?(api_map, inf, exp)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
false
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# @param api_map [ApiMap]
|
|
65
|
+
# @param expected [ComplexType]
|
|
66
|
+
# @param inferred [ComplexType]
|
|
67
|
+
# @return [Boolean]
|
|
68
|
+
def duck_types_match? api_map, expected, inferred
|
|
69
|
+
raise ArgumentError, 'Expected type must be duck type' unless expected.duck_type?
|
|
70
|
+
expected.each do |exp|
|
|
71
|
+
next unless exp.duck_type?
|
|
72
|
+
quack = exp.to_s[1..-1]
|
|
73
|
+
return false if api_map.get_method_stack(inferred.namespace, quack, scope: inferred.scope).empty?
|
|
74
|
+
end
|
|
75
|
+
true
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# @param type [ComplexType::UniqueType]
|
|
79
|
+
# @return [String]
|
|
80
|
+
def fuzz type
|
|
81
|
+
if type.parameters?
|
|
82
|
+
type.name
|
|
83
|
+
else
|
|
84
|
+
type.tag
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# @param api_map [ApiMap]
|
|
89
|
+
# @param cls1 [ComplexType::UniqueType]
|
|
90
|
+
# @param cls2 [ComplexType::UniqueType]
|
|
91
|
+
# @return [Boolean]
|
|
92
|
+
def either_way?(api_map, cls1, cls2)
|
|
93
|
+
f1 = fuzz(cls1)
|
|
94
|
+
f2 = fuzz(cls2)
|
|
95
|
+
api_map.type_include?(f1, f2) || api_map.super_and_sub?(f1, f2) || api_map.super_and_sub?(f2, f1)
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
class TypeChecker
|
|
5
|
-
# Data about a method parameter definition. This is the information from
|
|
6
|
-
# the args list in the def call, not the `@param` tags.
|
|
7
|
-
#
|
|
8
|
-
class ParamDef
|
|
9
|
-
# @return [String]
|
|
10
|
-
attr_reader :name
|
|
11
|
-
|
|
12
|
-
# @return [Symbol]
|
|
13
|
-
attr_reader :type
|
|
14
|
-
|
|
15
|
-
def initialize name, type
|
|
16
|
-
@name = name
|
|
17
|
-
@type = type
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
class << self
|
|
21
|
-
# Get an array of ParamDefs from a method pin.
|
|
22
|
-
#
|
|
23
|
-
# @param pin [Solargraph::Pin::Method]
|
|
24
|
-
# @return [Array<ParamDef>]
|
|
25
|
-
def from pin
|
|
26
|
-
result = []
|
|
27
|
-
pin.parameters.each do |par|
|
|
28
|
-
result.push ParamDef.new(par.name, par.decl)
|
|
29
|
-
end
|
|
30
|
-
result
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
class TypeChecker
|
|
5
|
+
# Data about a method parameter definition. This is the information from
|
|
6
|
+
# the args list in the def call, not the `@param` tags.
|
|
7
|
+
#
|
|
8
|
+
class ParamDef
|
|
9
|
+
# @return [String]
|
|
10
|
+
attr_reader :name
|
|
11
|
+
|
|
12
|
+
# @return [Symbol]
|
|
13
|
+
attr_reader :type
|
|
14
|
+
|
|
15
|
+
def initialize name, type
|
|
16
|
+
@name = name
|
|
17
|
+
@type = type
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
class << self
|
|
21
|
+
# Get an array of ParamDefs from a method pin.
|
|
22
|
+
#
|
|
23
|
+
# @param pin [Solargraph::Pin::Method]
|
|
24
|
+
# @return [Array<ParamDef>]
|
|
25
|
+
def from pin
|
|
26
|
+
result = []
|
|
27
|
+
pin.parameters.each do |par|
|
|
28
|
+
result.push ParamDef.new(par.name, par.decl)
|
|
29
|
+
end
|
|
30
|
+
result
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|