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,96 +1,96 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require 'cgi'
|
|
4
|
-
|
|
5
|
-
module Solargraph
|
|
6
|
-
module Pin
|
|
7
|
-
# @todo Move this stuff. It should be the responsibility of the language server.
|
|
8
|
-
module Conversions
|
|
9
|
-
# @return [Hash]
|
|
10
|
-
def completion_item
|
|
11
|
-
@completion_item ||= {
|
|
12
|
-
label: name,
|
|
13
|
-
kind: completion_item_kind,
|
|
14
|
-
detail: detail,
|
|
15
|
-
data: {
|
|
16
|
-
path: path,
|
|
17
|
-
return_type: return_type.tag,
|
|
18
|
-
location: (location ? location.to_hash : nil),
|
|
19
|
-
deprecated: deprecated?
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
# @return [Hash]
|
|
25
|
-
def resolve_completion_item
|
|
26
|
-
@resolve_completion_item ||= begin
|
|
27
|
-
extra = {}
|
|
28
|
-
alldoc = ''
|
|
29
|
-
# alldoc += link_documentation unless link_documentation.nil?
|
|
30
|
-
# alldoc += "\n\n" unless alldoc.empty?
|
|
31
|
-
alldoc += documentation unless documentation.nil?
|
|
32
|
-
extra[:documentation] = alldoc unless alldoc.empty?
|
|
33
|
-
completion_item.merge(extra)
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
# @return [Hash]
|
|
38
|
-
def signature_help
|
|
39
|
-
@signature_help ||= {
|
|
40
|
-
label: name + '(' + parameters.map(&:full).join(', ') + ')',
|
|
41
|
-
documentation: documentation
|
|
42
|
-
}
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
# @return [String]
|
|
46
|
-
def detail
|
|
47
|
-
# This property is not cached in an instance variable because it can
|
|
48
|
-
# change when pins get proxied.
|
|
49
|
-
detail = String.new
|
|
50
|
-
detail += "(#{parameters.map(&:full).join(', ')}) " unless !is_a?(Pin::Method) || parameters.empty?
|
|
51
|
-
detail += "=#{probed? ? '~' : (proxied? ? '^' : '>')} #{return_type.to_s}" unless return_type.undefined?
|
|
52
|
-
detail.strip!
|
|
53
|
-
return nil if detail.empty?
|
|
54
|
-
detail
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
# Get a markdown-flavored link to a documentation page.
|
|
58
|
-
#
|
|
59
|
-
# @return [String]
|
|
60
|
-
def link_documentation
|
|
61
|
-
@link_documentation ||= generate_link
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
def text_documentation
|
|
65
|
-
this_path = path || return_type.tag
|
|
66
|
-
return nil if this_path == 'undefined'
|
|
67
|
-
escape_brackets this_path
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
def reset_conversions
|
|
71
|
-
@completion_item = nil
|
|
72
|
-
@resolve_completion_item = nil
|
|
73
|
-
@signature_help = nil
|
|
74
|
-
@detail = nil
|
|
75
|
-
@link_documentation = nil
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
private
|
|
79
|
-
|
|
80
|
-
# @return [String]
|
|
81
|
-
def generate_link
|
|
82
|
-
this_path = path || return_type.tag
|
|
83
|
-
return nil if this_path == 'undefined'
|
|
84
|
-
return nil if this_path.nil? || this_path == 'undefined'
|
|
85
|
-
"[#{escape_brackets(this_path).gsub('_', '\\\\_')}](solargraph:/document?query=#{CGI.escape(this_path)})"
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
# @param text [String]
|
|
89
|
-
# @return [String]
|
|
90
|
-
def escape_brackets text
|
|
91
|
-
# text.gsub(/(\<|\>)/, "\\#{$1}")
|
|
92
|
-
text.gsub("<", '\<').gsub(">", '\>')
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
end
|
|
96
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'cgi'
|
|
4
|
+
|
|
5
|
+
module Solargraph
|
|
6
|
+
module Pin
|
|
7
|
+
# @todo Move this stuff. It should be the responsibility of the language server.
|
|
8
|
+
module Conversions
|
|
9
|
+
# @return [Hash]
|
|
10
|
+
def completion_item
|
|
11
|
+
@completion_item ||= {
|
|
12
|
+
label: name,
|
|
13
|
+
kind: completion_item_kind,
|
|
14
|
+
detail: detail,
|
|
15
|
+
data: {
|
|
16
|
+
path: path,
|
|
17
|
+
return_type: return_type.tag,
|
|
18
|
+
location: (location ? location.to_hash : nil),
|
|
19
|
+
deprecated: deprecated?
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# @return [Hash]
|
|
25
|
+
def resolve_completion_item
|
|
26
|
+
@resolve_completion_item ||= begin
|
|
27
|
+
extra = {}
|
|
28
|
+
alldoc = ''
|
|
29
|
+
# alldoc += link_documentation unless link_documentation.nil?
|
|
30
|
+
# alldoc += "\n\n" unless alldoc.empty?
|
|
31
|
+
alldoc += documentation unless documentation.nil?
|
|
32
|
+
extra[:documentation] = alldoc unless alldoc.empty?
|
|
33
|
+
completion_item.merge(extra)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# @return [Hash]
|
|
38
|
+
def signature_help
|
|
39
|
+
@signature_help ||= {
|
|
40
|
+
label: name + '(' + parameters.map(&:full).join(', ') + ')',
|
|
41
|
+
documentation: documentation
|
|
42
|
+
}
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# @return [String]
|
|
46
|
+
def detail
|
|
47
|
+
# This property is not cached in an instance variable because it can
|
|
48
|
+
# change when pins get proxied.
|
|
49
|
+
detail = String.new
|
|
50
|
+
detail += "(#{parameters.map(&:full).join(', ')}) " unless !is_a?(Pin::Method) || parameters.empty?
|
|
51
|
+
detail += "=#{probed? ? '~' : (proxied? ? '^' : '>')} #{return_type.to_s}" unless return_type.undefined?
|
|
52
|
+
detail.strip!
|
|
53
|
+
return nil if detail.empty?
|
|
54
|
+
detail
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Get a markdown-flavored link to a documentation page.
|
|
58
|
+
#
|
|
59
|
+
# @return [String]
|
|
60
|
+
def link_documentation
|
|
61
|
+
@link_documentation ||= generate_link
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def text_documentation
|
|
65
|
+
this_path = path || return_type.tag
|
|
66
|
+
return nil if this_path == 'undefined'
|
|
67
|
+
escape_brackets this_path
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def reset_conversions
|
|
71
|
+
@completion_item = nil
|
|
72
|
+
@resolve_completion_item = nil
|
|
73
|
+
@signature_help = nil
|
|
74
|
+
@detail = nil
|
|
75
|
+
@link_documentation = nil
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
private
|
|
79
|
+
|
|
80
|
+
# @return [String]
|
|
81
|
+
def generate_link
|
|
82
|
+
this_path = path || return_type.tag
|
|
83
|
+
return nil if this_path == 'undefined'
|
|
84
|
+
return nil if this_path.nil? || this_path == 'undefined'
|
|
85
|
+
"[#{escape_brackets(this_path).gsub('_', '\\\\_')}](solargraph:/document?query=#{CGI.escape(this_path)})"
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# @param text [String]
|
|
89
|
+
# @return [String]
|
|
90
|
+
def escape_brackets text
|
|
91
|
+
# text.gsub(/(\<|\>)/, "\\#{$1}")
|
|
92
|
+
text.gsub("<", '\<').gsub(">", '\>')
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
@@ -1,105 +1,105 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require 'kramdown'
|
|
4
|
-
require 'kramdown-parser-gfm'
|
|
5
|
-
require 'yard'
|
|
6
|
-
require 'reverse_markdown'
|
|
7
|
-
require 'solargraph/converters/dl'
|
|
8
|
-
require 'solargraph/converters/dt'
|
|
9
|
-
require 'solargraph/converters/dd'
|
|
10
|
-
require 'solargraph/converters/misc'
|
|
11
|
-
|
|
12
|
-
module Solargraph
|
|
13
|
-
module Pin
|
|
14
|
-
# A module to add the Pin::Base#documentation method.
|
|
15
|
-
#
|
|
16
|
-
module Documenting
|
|
17
|
-
# A documentation formatter that either performs Markdown conversion for
|
|
18
|
-
# text, or applies backticks for code blocks.
|
|
19
|
-
#
|
|
20
|
-
class DocSection
|
|
21
|
-
# @return [String]
|
|
22
|
-
attr_reader :plaintext
|
|
23
|
-
|
|
24
|
-
# @param code [Boolean] True if this section is a code block
|
|
25
|
-
def initialize code
|
|
26
|
-
@plaintext = String.new('')
|
|
27
|
-
@code = code
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def code?
|
|
31
|
-
@code
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
# @param text [String]
|
|
35
|
-
# @return [String]
|
|
36
|
-
def concat text
|
|
37
|
-
@plaintext.concat text
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def to_s
|
|
41
|
-
return "\n```ruby\n#{@plaintext}#{@plaintext.end_with?("\n") ? '' : "\n"}```\n\n" if code?
|
|
42
|
-
ReverseMarkdown.convert unescape_brackets(Kramdown::Document.new(escape_brackets(@plaintext), input: 'GFM').to_html)
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
private
|
|
46
|
-
|
|
47
|
-
# @param text [String]
|
|
48
|
-
# @return [String]
|
|
49
|
-
def escape_brackets text
|
|
50
|
-
# text.gsub(/(\[[^\]]*\])([^\(]|\z)/, '!!!^\1^!!!\2')
|
|
51
|
-
text.gsub('[', '!!!!b').gsub(']', 'e!!!!')
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
# @param text [String]
|
|
55
|
-
# @return [String]
|
|
56
|
-
def unescape_brackets text
|
|
57
|
-
text.gsub('!!!!b', '[').gsub('e!!!!', ']')
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
# @return [String]
|
|
62
|
-
def documentation
|
|
63
|
-
@documentation ||= begin
|
|
64
|
-
# Using DocSections allows for code blocks that start with an empty
|
|
65
|
-
# line and at least two spaces of indentation. This is a common
|
|
66
|
-
# convention in Ruby core documentation, e.g., String#split.
|
|
67
|
-
sections = [DocSection.new(false)]
|
|
68
|
-
normalize_indentation(docstring.to_s).gsub(/\t/, ' ').lines.each do |l|
|
|
69
|
-
if l.strip.empty?
|
|
70
|
-
sections.last.concat l
|
|
71
|
-
else
|
|
72
|
-
if (l =~ /^ [^\s]/ && sections.last.plaintext =~ /(\r?\n[ \t]*?){2,}$/) || (l.start_with?(' ') && sections.last.code?)
|
|
73
|
-
# Code block
|
|
74
|
-
sections.push DocSection.new(true) unless sections.last.code?
|
|
75
|
-
sections.last.concat l[2..-1]
|
|
76
|
-
else
|
|
77
|
-
# Regular documentation
|
|
78
|
-
sections.push DocSection.new(false) if sections.last.code?
|
|
79
|
-
sections.last.concat l
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
sections.map(&:to_s).join.strip
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
private
|
|
88
|
-
|
|
89
|
-
# @param text [String]
|
|
90
|
-
# @return [String]
|
|
91
|
-
def normalize_indentation text
|
|
92
|
-
text.lines.map { |l| remove_odd_spaces(l) }.join
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
# @param line [String]
|
|
96
|
-
# @return [String]
|
|
97
|
-
def remove_odd_spaces line
|
|
98
|
-
return line unless line.start_with?(' ')
|
|
99
|
-
spaces = line.match(/^ +/)[0].length
|
|
100
|
-
return line unless spaces.odd?
|
|
101
|
-
line[1..-1]
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
end
|
|
105
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'kramdown'
|
|
4
|
+
require 'kramdown-parser-gfm'
|
|
5
|
+
require 'yard'
|
|
6
|
+
require 'reverse_markdown'
|
|
7
|
+
require 'solargraph/converters/dl'
|
|
8
|
+
require 'solargraph/converters/dt'
|
|
9
|
+
require 'solargraph/converters/dd'
|
|
10
|
+
require 'solargraph/converters/misc'
|
|
11
|
+
|
|
12
|
+
module Solargraph
|
|
13
|
+
module Pin
|
|
14
|
+
# A module to add the Pin::Base#documentation method.
|
|
15
|
+
#
|
|
16
|
+
module Documenting
|
|
17
|
+
# A documentation formatter that either performs Markdown conversion for
|
|
18
|
+
# text, or applies backticks for code blocks.
|
|
19
|
+
#
|
|
20
|
+
class DocSection
|
|
21
|
+
# @return [String]
|
|
22
|
+
attr_reader :plaintext
|
|
23
|
+
|
|
24
|
+
# @param code [Boolean] True if this section is a code block
|
|
25
|
+
def initialize code
|
|
26
|
+
@plaintext = String.new('')
|
|
27
|
+
@code = code
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def code?
|
|
31
|
+
@code
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# @param text [String]
|
|
35
|
+
# @return [String]
|
|
36
|
+
def concat text
|
|
37
|
+
@plaintext.concat text
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def to_s
|
|
41
|
+
return "\n```ruby\n#{@plaintext}#{@plaintext.end_with?("\n") ? '' : "\n"}```\n\n" if code?
|
|
42
|
+
ReverseMarkdown.convert unescape_brackets(Kramdown::Document.new(escape_brackets(@plaintext), input: 'GFM').to_html)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
private
|
|
46
|
+
|
|
47
|
+
# @param text [String]
|
|
48
|
+
# @return [String]
|
|
49
|
+
def escape_brackets text
|
|
50
|
+
# text.gsub(/(\[[^\]]*\])([^\(]|\z)/, '!!!^\1^!!!\2')
|
|
51
|
+
text.gsub('[', '!!!!b').gsub(']', 'e!!!!')
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# @param text [String]
|
|
55
|
+
# @return [String]
|
|
56
|
+
def unescape_brackets text
|
|
57
|
+
text.gsub('!!!!b', '[').gsub('e!!!!', ']')
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# @return [String]
|
|
62
|
+
def documentation
|
|
63
|
+
@documentation ||= begin
|
|
64
|
+
# Using DocSections allows for code blocks that start with an empty
|
|
65
|
+
# line and at least two spaces of indentation. This is a common
|
|
66
|
+
# convention in Ruby core documentation, e.g., String#split.
|
|
67
|
+
sections = [DocSection.new(false)]
|
|
68
|
+
normalize_indentation(docstring.to_s).gsub(/\t/, ' ').lines.each do |l|
|
|
69
|
+
if l.strip.empty?
|
|
70
|
+
sections.last.concat l
|
|
71
|
+
else
|
|
72
|
+
if (l =~ /^ [^\s]/ && sections.last.plaintext =~ /(\r?\n[ \t]*?){2,}$/) || (l.start_with?(' ') && sections.last.code?)
|
|
73
|
+
# Code block
|
|
74
|
+
sections.push DocSection.new(true) unless sections.last.code?
|
|
75
|
+
sections.last.concat l[2..-1]
|
|
76
|
+
else
|
|
77
|
+
# Regular documentation
|
|
78
|
+
sections.push DocSection.new(false) if sections.last.code?
|
|
79
|
+
sections.last.concat l
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
sections.map(&:to_s).join.strip
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
private
|
|
88
|
+
|
|
89
|
+
# @param text [String]
|
|
90
|
+
# @return [String]
|
|
91
|
+
def normalize_indentation text
|
|
92
|
+
text.lines.map { |l| remove_odd_spaces(l) }.join
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# @param line [String]
|
|
96
|
+
# @return [String]
|
|
97
|
+
def remove_odd_spaces line
|
|
98
|
+
return line unless line.start_with?(' ')
|
|
99
|
+
spaces = line.match(/^ +/)[0].length
|
|
100
|
+
return line unless spaces.odd?
|
|
101
|
+
line[1..-1]
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Pin
|
|
5
|
-
# DuckMethod pins are used to add completion items for type tags that
|
|
6
|
-
# use duck typing, e.g., `@param file [#read]`.
|
|
7
|
-
#
|
|
8
|
-
class DuckMethod < Pin::Method
|
|
9
|
-
# @param location [Solargraph::Location]
|
|
10
|
-
# @param name [String]
|
|
11
|
-
# def initialize location, name
|
|
12
|
-
# # super(location, '', name, nil, :instance, :public, [])
|
|
13
|
-
# end
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
# DuckMethod pins are used to add completion items for type tags that
|
|
6
|
+
# use duck typing, e.g., `@param file [#read]`.
|
|
7
|
+
#
|
|
8
|
+
class DuckMethod < Pin::Method
|
|
9
|
+
# @param location [Solargraph::Location]
|
|
10
|
+
# @param name [String]
|
|
11
|
+
# def initialize location, name
|
|
12
|
+
# # super(location, '', name, nil, :instance, :public, [])
|
|
13
|
+
# end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Pin
|
|
5
|
-
class GlobalVariable < BaseVariable
|
|
6
|
-
end
|
|
7
|
-
end
|
|
8
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
class GlobalVariable < BaseVariable
|
|
6
|
+
end
|
|
7
|
+
end
|
|
8
|
+
end
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Pin
|
|
5
|
-
class InstanceVariable < BaseVariable
|
|
6
|
-
def binder
|
|
7
|
-
closure.binder
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def scope
|
|
11
|
-
closure.binder.scope
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def context
|
|
15
|
-
@context ||= begin
|
|
16
|
-
result = super
|
|
17
|
-
if scope == :class
|
|
18
|
-
ComplexType.parse("Class<#{result.namespace}>")
|
|
19
|
-
else
|
|
20
|
-
ComplexType.parse("#{result.namespace}")
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def nearly? other
|
|
26
|
-
super && binder == other.binder
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
class InstanceVariable < BaseVariable
|
|
6
|
+
def binder
|
|
7
|
+
closure.binder
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def scope
|
|
11
|
+
closure.binder.scope
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def context
|
|
15
|
+
@context ||= begin
|
|
16
|
+
result = super
|
|
17
|
+
if scope == :class
|
|
18
|
+
ComplexType.parse("Class<#{result.namespace}>")
|
|
19
|
+
else
|
|
20
|
+
ComplexType.parse("#{result.namespace}")
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def nearly? other
|
|
26
|
+
super && binder == other.binder
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Pin
|
|
5
|
-
class Keyword < Base
|
|
6
|
-
def initialize name
|
|
7
|
-
super(name: name)
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def name
|
|
11
|
-
@name
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
class Keyword < Base
|
|
6
|
+
def initialize name
|
|
7
|
+
super(name: name)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def name
|
|
11
|
+
@name
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Pin
|
|
5
|
-
class KeywordParam < Symbol
|
|
6
|
-
end
|
|
7
|
-
end
|
|
8
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
class KeywordParam < Symbol
|
|
6
|
+
end
|
|
7
|
+
end
|
|
8
|
+
end
|
|
@@ -1,55 +1,55 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Pin
|
|
5
|
-
class LocalVariable < BaseVariable
|
|
6
|
-
# @return [Range]
|
|
7
|
-
attr_reader :presence
|
|
8
|
-
|
|
9
|
-
def initialize assignment: nil, presence: nil, **splat
|
|
10
|
-
super(**splat)
|
|
11
|
-
@assignment = assignment
|
|
12
|
-
@presence = presence
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def try_merge! pin
|
|
16
|
-
return false unless super
|
|
17
|
-
@presence = pin.presence
|
|
18
|
-
true
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
# @param other_closure [Pin::Closure]
|
|
22
|
-
# @param other_loc [Location]
|
|
23
|
-
def visible_at?(other_closure, other_loc)
|
|
24
|
-
return true if location.filename == other_loc.filename &&
|
|
25
|
-
presence.include?(other_loc.range.start) &&
|
|
26
|
-
match_named_closure(other_closure, closure)
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
private
|
|
30
|
-
|
|
31
|
-
# @param tag1 [String]
|
|
32
|
-
# @param tag2 [String]
|
|
33
|
-
# @return [Boolean]
|
|
34
|
-
def match_tags tag1, tag2
|
|
35
|
-
# @todo This is an unfortunate hack made necessary by a discrepancy in
|
|
36
|
-
# how tags indicate the root namespace. The long-term solution is to
|
|
37
|
-
# standardize it, whether it's `Class<>`, an empty string, or
|
|
38
|
-
# something else.
|
|
39
|
-
tag1 == tag2 ||
|
|
40
|
-
(['', 'Class<>'].include?(tag1) && ['', 'Class<>'].include?(tag2))
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def match_named_closure needle, haystack
|
|
44
|
-
return true if needle == haystack || haystack.is_a?(Pin::Block)
|
|
45
|
-
cursor = haystack
|
|
46
|
-
until cursor.nil?
|
|
47
|
-
return true if needle.path == cursor.path
|
|
48
|
-
return false if cursor.path && !cursor.path.empty?
|
|
49
|
-
cursor = cursor.closure
|
|
50
|
-
end
|
|
51
|
-
false
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
class LocalVariable < BaseVariable
|
|
6
|
+
# @return [Range]
|
|
7
|
+
attr_reader :presence
|
|
8
|
+
|
|
9
|
+
def initialize assignment: nil, presence: nil, **splat
|
|
10
|
+
super(**splat)
|
|
11
|
+
@assignment = assignment
|
|
12
|
+
@presence = presence
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def try_merge! pin
|
|
16
|
+
return false unless super
|
|
17
|
+
@presence = pin.presence
|
|
18
|
+
true
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# @param other_closure [Pin::Closure]
|
|
22
|
+
# @param other_loc [Location]
|
|
23
|
+
def visible_at?(other_closure, other_loc)
|
|
24
|
+
return true if location.filename == other_loc.filename &&
|
|
25
|
+
presence.include?(other_loc.range.start) &&
|
|
26
|
+
match_named_closure(other_closure, closure)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
private
|
|
30
|
+
|
|
31
|
+
# @param tag1 [String]
|
|
32
|
+
# @param tag2 [String]
|
|
33
|
+
# @return [Boolean]
|
|
34
|
+
def match_tags tag1, tag2
|
|
35
|
+
# @todo This is an unfortunate hack made necessary by a discrepancy in
|
|
36
|
+
# how tags indicate the root namespace. The long-term solution is to
|
|
37
|
+
# standardize it, whether it's `Class<>`, an empty string, or
|
|
38
|
+
# something else.
|
|
39
|
+
tag1 == tag2 ||
|
|
40
|
+
(['', 'Class<>'].include?(tag1) && ['', 'Class<>'].include?(tag2))
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def match_named_closure needle, haystack
|
|
44
|
+
return true if needle == haystack || haystack.is_a?(Pin::Block)
|
|
45
|
+
cursor = haystack
|
|
46
|
+
until cursor.nil?
|
|
47
|
+
return true if needle.path == cursor.path
|
|
48
|
+
return false if cursor.path && !cursor.path.empty?
|
|
49
|
+
cursor = cursor.closure
|
|
50
|
+
end
|
|
51
|
+
false
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|