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,221 +1,394 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Solargraph
|
4
|
-
# A container for type data based on YARD type tags.
|
5
|
-
#
|
6
|
-
class ComplexType
|
7
|
-
|
8
|
-
#
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
def
|
52
|
-
@items.
|
53
|
-
end
|
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
|
-
@items.
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
# @
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
# @return [
|
102
|
-
def
|
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
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Solargraph
|
4
|
+
# A container for type data based on YARD type tags.
|
5
|
+
#
|
6
|
+
class ComplexType
|
7
|
+
GENERIC_TAG_NAME = 'generic'.freeze
|
8
|
+
# @!parse
|
9
|
+
# include TypeMethods
|
10
|
+
include Equality
|
11
|
+
|
12
|
+
autoload :TypeMethods, 'solargraph/complex_type/type_methods'
|
13
|
+
autoload :UniqueType, 'solargraph/complex_type/unique_type'
|
14
|
+
|
15
|
+
# @param types [Array<UniqueType, ComplexType>]
|
16
|
+
def initialize types = [UniqueType::UNDEFINED]
|
17
|
+
# @todo @items here should not need an annotation
|
18
|
+
# @type [Array<UniqueType>]
|
19
|
+
@items = types.flat_map(&:items).uniq(&:to_s)
|
20
|
+
end
|
21
|
+
|
22
|
+
# @sg-ignore Fix "Not enough arguments to Module#protected"
|
23
|
+
protected def equality_fields
|
24
|
+
[self.class, items]
|
25
|
+
end
|
26
|
+
|
27
|
+
# @param api_map [ApiMap]
|
28
|
+
# @param context [String]
|
29
|
+
# @return [ComplexType]
|
30
|
+
def qualify api_map, context = ''
|
31
|
+
red = reduce_object
|
32
|
+
types = red.items.map do |t|
|
33
|
+
next t if ['nil', 'void', 'undefined'].include?(t.name)
|
34
|
+
next t if ['::Boolean'].include?(t.rooted_name)
|
35
|
+
t.qualify api_map, context
|
36
|
+
end
|
37
|
+
ComplexType.new(types).reduce_object
|
38
|
+
end
|
39
|
+
|
40
|
+
# @param generics_to_resolve [Enumerable<String>]]
|
41
|
+
# @param context_type [UniqueType, nil]
|
42
|
+
# @param resolved_generic_values [Hash{String => ComplexType}] Added to as types are encountered or resolved
|
43
|
+
# @return [self]
|
44
|
+
def resolve_generics_from_context generics_to_resolve, context_type, resolved_generic_values: {}
|
45
|
+
return self unless generic?
|
46
|
+
|
47
|
+
ComplexType.new(@items.map { |i| i.resolve_generics_from_context(generics_to_resolve, context_type, resolved_generic_values: resolved_generic_values) })
|
48
|
+
end
|
49
|
+
|
50
|
+
# @return [UniqueType]
|
51
|
+
def first
|
52
|
+
@items.first
|
53
|
+
end
|
54
|
+
|
55
|
+
# @return [String]
|
56
|
+
def to_rbs
|
57
|
+
((@items.length > 1 ? '(' : '') +
|
58
|
+
@items.map(&:to_rbs).join(' | ') +
|
59
|
+
(@items.length > 1 ? ')' : ''))
|
60
|
+
end
|
61
|
+
|
62
|
+
# @param dst [ComplexType]
|
63
|
+
# @return [ComplexType]
|
64
|
+
def self_to_type dst
|
65
|
+
object_type_dst = dst.reduce_class_type
|
66
|
+
transform do |t|
|
67
|
+
next t if t.name != 'self'
|
68
|
+
object_type_dst
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# @yieldparam [UniqueType]
|
73
|
+
# @return [Array]
|
74
|
+
def map &block
|
75
|
+
@items.map &block
|
76
|
+
end
|
77
|
+
|
78
|
+
# @yieldparam [UniqueType]
|
79
|
+
# @return [Enumerable<UniqueType>]
|
80
|
+
def each &block
|
81
|
+
@items.each &block
|
82
|
+
end
|
83
|
+
|
84
|
+
# @yieldparam [UniqueType]
|
85
|
+
# @return [void]
|
86
|
+
# @overload each_unique_type()
|
87
|
+
# @return [Enumerator<UniqueType>]
|
88
|
+
def each_unique_type &block
|
89
|
+
return enum_for(__method__) unless block_given?
|
90
|
+
|
91
|
+
@items.each do |item|
|
92
|
+
item.each_unique_type &block
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
# @return [Integer]
|
97
|
+
def length
|
98
|
+
@items.length
|
99
|
+
end
|
100
|
+
|
101
|
+
# @return [Array<UniqueType>]
|
102
|
+
def to_a
|
103
|
+
@items
|
104
|
+
end
|
105
|
+
|
106
|
+
def tags
|
107
|
+
@items.map(&:tag).join(', ')
|
108
|
+
end
|
109
|
+
|
110
|
+
# @param index [Integer]
|
111
|
+
# @return [UniqueType]
|
112
|
+
def [](index)
|
113
|
+
@items[index]
|
114
|
+
end
|
115
|
+
|
116
|
+
# @return [Array<UniqueType>]
|
117
|
+
def select &block
|
118
|
+
@items.select &block
|
119
|
+
end
|
120
|
+
|
121
|
+
# @return [String]
|
122
|
+
def namespace
|
123
|
+
# cache this attr for high frequency call
|
124
|
+
@namespace ||= method_missing(:namespace).to_s
|
125
|
+
end
|
126
|
+
|
127
|
+
# @return [Array<String>]
|
128
|
+
def namespaces
|
129
|
+
@items.map(&:namespace)
|
130
|
+
end
|
131
|
+
|
132
|
+
# @param name [Symbol]
|
133
|
+
# @return [Object, nil]
|
134
|
+
def method_missing name, *args, &block
|
135
|
+
return if @items.first.nil?
|
136
|
+
return @items.first.send(name, *args, &block) if respond_to_missing?(name)
|
137
|
+
super
|
138
|
+
end
|
139
|
+
|
140
|
+
# @param name [Symbol]
|
141
|
+
# @param include_private [Boolean]
|
142
|
+
def respond_to_missing?(name, include_private = false)
|
143
|
+
TypeMethods.public_instance_methods.include?(name) || super
|
144
|
+
end
|
145
|
+
|
146
|
+
def to_s
|
147
|
+
map(&:tag).join(', ')
|
148
|
+
end
|
149
|
+
|
150
|
+
def desc
|
151
|
+
rooted_tags
|
152
|
+
end
|
153
|
+
|
154
|
+
def rooted_tags
|
155
|
+
map(&:rooted_tag).join(', ')
|
156
|
+
end
|
157
|
+
|
158
|
+
# @yieldparam [UniqueType]
|
159
|
+
def all? &block
|
160
|
+
@items.all? &block
|
161
|
+
end
|
162
|
+
|
163
|
+
# @yieldparam [UniqueType]
|
164
|
+
# @yieldreturn [Boolean]
|
165
|
+
# @return [Boolean]
|
166
|
+
def any? &block
|
167
|
+
@items.compact.any? &block
|
168
|
+
end
|
169
|
+
|
170
|
+
def selfy?
|
171
|
+
@items.any?(&:selfy?)
|
172
|
+
end
|
173
|
+
|
174
|
+
def generic?
|
175
|
+
any?(&:generic?)
|
176
|
+
end
|
177
|
+
|
178
|
+
# @param new_name [String, nil]
|
179
|
+
# @yieldparam t [UniqueType]
|
180
|
+
# @yieldreturn [UniqueType]
|
181
|
+
# @return [ComplexType]
|
182
|
+
def transform(new_name = nil, &transform_type)
|
183
|
+
raise "Please remove leading :: and set rooted with recreate() instead - #{new_name}" if new_name&.start_with?('::')
|
184
|
+
ComplexType.new(map { |ut| ut.transform(new_name, &transform_type) })
|
185
|
+
end
|
186
|
+
|
187
|
+
# @return [self]
|
188
|
+
def force_rooted
|
189
|
+
transform do |t|
|
190
|
+
t.recreate(make_rooted: true)
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
# @param definitions [Pin::Namespace, Pin::Method]
|
195
|
+
# @param context_type [ComplexType]
|
196
|
+
# @return [ComplexType]
|
197
|
+
def resolve_generics definitions, context_type
|
198
|
+
result = @items.map { |i| i.resolve_generics(definitions, context_type) }
|
199
|
+
ComplexType.new(result)
|
200
|
+
end
|
201
|
+
|
202
|
+
def nullable?
|
203
|
+
@items.any?(&:nil_type?)
|
204
|
+
end
|
205
|
+
|
206
|
+
# @return [Array<ComplexType>]
|
207
|
+
def all_params
|
208
|
+
@items.first.all_params || []
|
209
|
+
end
|
210
|
+
|
211
|
+
# @return [ComplexType]
|
212
|
+
def reduce_class_type
|
213
|
+
new_items = items.flat_map do |type|
|
214
|
+
next type unless ['Module', 'Class'].include?(type.name)
|
215
|
+
|
216
|
+
type.all_params
|
217
|
+
end
|
218
|
+
ComplexType.new(new_items)
|
219
|
+
end
|
220
|
+
|
221
|
+
# every type and subtype in this union have been resolved to be
|
222
|
+
# fully qualified
|
223
|
+
def all_rooted?
|
224
|
+
all?(&:all_rooted?)
|
225
|
+
end
|
226
|
+
|
227
|
+
# every top-level type has resolved to be fully qualified; see
|
228
|
+
# #all_rooted? to check their subtypes as well
|
229
|
+
def rooted?
|
230
|
+
all?(&:rooted?)
|
231
|
+
end
|
232
|
+
|
233
|
+
attr_reader :items
|
234
|
+
|
235
|
+
def rooted?
|
236
|
+
@items.all?(&:rooted?)
|
237
|
+
end
|
238
|
+
|
239
|
+
protected
|
240
|
+
|
241
|
+
# @return [ComplexType]
|
242
|
+
def reduce_object
|
243
|
+
new_items = items.flat_map do |ut|
|
244
|
+
next [ut] if ut.name != 'Object' || ut.subtypes.empty?
|
245
|
+
ut.subtypes
|
246
|
+
end
|
247
|
+
ComplexType.new(new_items)
|
248
|
+
end
|
249
|
+
|
250
|
+
def bottom?
|
251
|
+
@items.all?(&:bot?)
|
252
|
+
end
|
253
|
+
|
254
|
+
class << self
|
255
|
+
# Parse type strings into a ComplexType.
|
256
|
+
#
|
257
|
+
# @example
|
258
|
+
# ComplexType.parse 'String', 'Foo', 'nil' #=> [String, Foo, nil]
|
259
|
+
#
|
260
|
+
# @note
|
261
|
+
# The `partial` parameter is used to indicate that the method is
|
262
|
+
# receiving a string that will be used inside another ComplexType.
|
263
|
+
# It returns arrays of ComplexTypes instead of a single cohesive one.
|
264
|
+
# Consumers should not need to use this parameter; it should only be
|
265
|
+
# used internally.
|
266
|
+
#
|
267
|
+
# @param strings [Array<String>] The type definitions to parse
|
268
|
+
# @return [ComplexType]
|
269
|
+
# # @overload parse(*strings, partial: false)
|
270
|
+
# # @todo Need ability to use a literal true as a type below
|
271
|
+
# # @param partial [Boolean] True if the string is part of a another type
|
272
|
+
# # @return [Array<UniqueType>]
|
273
|
+
# @sg-ignore
|
274
|
+
# @todo To be able to select the right signature above,
|
275
|
+
# Chain::Call needs to know the decl type (:arg, :optarg,
|
276
|
+
# :kwarg, etc) of the arguments given, instead of just having
|
277
|
+
# an array of Chains as the arguments.
|
278
|
+
def parse *strings, partial: false
|
279
|
+
# @type [Hash{Array<String> => ComplexType}]
|
280
|
+
@cache ||= {}
|
281
|
+
unless partial
|
282
|
+
cached = @cache[strings]
|
283
|
+
return cached unless cached.nil?
|
284
|
+
end
|
285
|
+
types = []
|
286
|
+
key_types = nil
|
287
|
+
strings.each do |type_string|
|
288
|
+
point_stack = 0
|
289
|
+
curly_stack = 0
|
290
|
+
paren_stack = 0
|
291
|
+
base = String.new
|
292
|
+
subtype_string = String.new
|
293
|
+
type_string&.each_char do |char|
|
294
|
+
if char == '='
|
295
|
+
#raise ComplexTypeError, "Invalid = in type #{type_string}" unless curly_stack > 0
|
296
|
+
elsif char == '<'
|
297
|
+
point_stack += 1
|
298
|
+
elsif char == '>'
|
299
|
+
if subtype_string.end_with?('=') && curly_stack > 0
|
300
|
+
subtype_string += char
|
301
|
+
elsif base.end_with?('=')
|
302
|
+
raise ComplexTypeError, "Invalid hash thing" unless key_types.nil?
|
303
|
+
# types.push ComplexType.new([UniqueType.new(base[0..-2].strip)])
|
304
|
+
types.push UniqueType.parse(base[0..-2].strip, subtype_string)
|
305
|
+
# @todo this should either expand key_type's type
|
306
|
+
# automatically or complain about not being
|
307
|
+
# compatible with key_type's type in type checking
|
308
|
+
key_types = types
|
309
|
+
types = []
|
310
|
+
base.clear
|
311
|
+
subtype_string.clear
|
312
|
+
next
|
313
|
+
else
|
314
|
+
raise ComplexTypeError, "Invalid close in type #{type_string}" if point_stack == 0
|
315
|
+
point_stack -= 1
|
316
|
+
subtype_string += char
|
317
|
+
end
|
318
|
+
next
|
319
|
+
elsif char == '{'
|
320
|
+
curly_stack += 1
|
321
|
+
elsif char == '}'
|
322
|
+
curly_stack -= 1
|
323
|
+
subtype_string += char
|
324
|
+
raise ComplexTypeError, "Invalid close in type #{type_string}" if curly_stack < 0
|
325
|
+
next
|
326
|
+
elsif char == '('
|
327
|
+
paren_stack += 1
|
328
|
+
elsif char == ')'
|
329
|
+
paren_stack -= 1
|
330
|
+
subtype_string += char
|
331
|
+
raise ComplexTypeError, "Invalid close in type #{type_string}" if paren_stack < 0
|
332
|
+
next
|
333
|
+
elsif char == ',' && point_stack == 0 && curly_stack == 0 && paren_stack == 0
|
334
|
+
# types.push ComplexType.new([UniqueType.new(base.strip, subtype_string.strip)])
|
335
|
+
types.push UniqueType.parse(base.strip, subtype_string.strip)
|
336
|
+
base.clear
|
337
|
+
subtype_string.clear
|
338
|
+
next
|
339
|
+
end
|
340
|
+
if point_stack == 0 && curly_stack == 0 && paren_stack == 0
|
341
|
+
base.concat char
|
342
|
+
else
|
343
|
+
subtype_string.concat char
|
344
|
+
end
|
345
|
+
end
|
346
|
+
raise ComplexTypeError, "Unclosed subtype in #{type_string}" if point_stack != 0 || curly_stack != 0 || paren_stack != 0
|
347
|
+
# types.push ComplexType.new([UniqueType.new(base, subtype_string)])
|
348
|
+
types.push UniqueType.parse(base.strip, subtype_string.strip)
|
349
|
+
end
|
350
|
+
unless key_types.nil?
|
351
|
+
raise ComplexTypeError, "Invalid use of key/value parameters" unless partial
|
352
|
+
return key_types if types.empty?
|
353
|
+
return [key_types, types]
|
354
|
+
end
|
355
|
+
result = partial ? types : ComplexType.new(types)
|
356
|
+
@cache[strings] = result unless partial
|
357
|
+
result
|
358
|
+
end
|
359
|
+
|
360
|
+
# @param strings [Array<String>]
|
361
|
+
# @return [ComplexType]
|
362
|
+
def try_parse *strings
|
363
|
+
parse *strings
|
364
|
+
rescue ComplexTypeError => e
|
365
|
+
Solargraph.logger.info "Error parsing complex type `#{strings.join(', ')}`: #{e.message}"
|
366
|
+
ComplexType::UNDEFINED
|
367
|
+
end
|
368
|
+
end
|
369
|
+
|
370
|
+
VOID = ComplexType.parse('void')
|
371
|
+
UNDEFINED = ComplexType.parse('undefined')
|
372
|
+
SYMBOL = ComplexType.parse('::Symbol')
|
373
|
+
ROOT = ComplexType.parse('::Class<>')
|
374
|
+
NIL = ComplexType.parse('nil')
|
375
|
+
SELF = ComplexType.parse('self')
|
376
|
+
BOOLEAN = ComplexType.parse('::Boolean')
|
377
|
+
BOT = ComplexType.parse('bot')
|
378
|
+
|
379
|
+
private
|
380
|
+
|
381
|
+
# @todo This is a quick and dirty hack that forces `self` keywords
|
382
|
+
# to reference an instance of their class and never the class itself.
|
383
|
+
# This behavior may change depending on which result is expected
|
384
|
+
# from YARD conventions. See https://github.com/lsegal/yard/issues/1257
|
385
|
+
# @param dst [String]
|
386
|
+
# @return [String]
|
387
|
+
def reduce_class dst
|
388
|
+
while dst =~ /^(Class|Module)\<(.*?)\>$/
|
389
|
+
dst = dst.sub(/^(Class|Module)\</, '').sub(/\>$/, '')
|
390
|
+
end
|
391
|
+
dst
|
392
|
+
end
|
393
|
+
end
|
394
|
+
end
|