jimeh-solargraph 0.40.4.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 +7 -0
- data/.github/workflows/ci.yml +54 -0
- data/.gitignore +9 -0
- data/.rspec +2 -0
- data/.travis.yml +24 -0
- data/.yardopts +2 -0
- data/CHANGELOG.md +1003 -0
- data/Gemfile +7 -0
- data/LICENSE +21 -0
- data/README.md +123 -0
- data/Rakefile +25 -0
- data/SPONSORS.md +15 -0
- data/bin/solargraph +5 -0
- data/jimeh-solargraph.gemspec +44 -0
- data/lib/.rubocop.yml +21 -0
- data/lib/solargraph.rb +67 -0
- data/lib/solargraph/api_map.rb +752 -0
- data/lib/solargraph/api_map/bundler_methods.rb +27 -0
- data/lib/solargraph/api_map/cache.rb +70 -0
- data/lib/solargraph/api_map/source_to_yard.rb +81 -0
- data/lib/solargraph/api_map/store.rb +256 -0
- data/lib/solargraph/bench.rb +30 -0
- data/lib/solargraph/compat.rb +23 -0
- data/lib/solargraph/complex_type.rb +213 -0
- data/lib/solargraph/complex_type/type_methods.rb +127 -0
- data/lib/solargraph/complex_type/unique_type.rb +75 -0
- data/lib/solargraph/convention.rb +47 -0
- data/lib/solargraph/convention/base.rb +33 -0
- data/lib/solargraph/convention/gemfile.rb +15 -0
- data/lib/solargraph/convention/gemspec.rb +22 -0
- data/lib/solargraph/convention/rspec.rb +21 -0
- data/lib/solargraph/converters/dd.rb +12 -0
- data/lib/solargraph/converters/dl.rb +12 -0
- data/lib/solargraph/converters/dt.rb +12 -0
- data/lib/solargraph/converters/misc.rb +1 -0
- data/lib/solargraph/diagnostics.rb +55 -0
- data/lib/solargraph/diagnostics/base.rb +29 -0
- data/lib/solargraph/diagnostics/require_not_found.rb +37 -0
- data/lib/solargraph/diagnostics/rubocop.rb +90 -0
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +45 -0
- data/lib/solargraph/diagnostics/severities.rb +15 -0
- data/lib/solargraph/diagnostics/type_check.rb +54 -0
- data/lib/solargraph/diagnostics/update_errors.rb +41 -0
- data/lib/solargraph/documentor.rb +78 -0
- data/lib/solargraph/environ.rb +45 -0
- data/lib/solargraph/language_server.rb +19 -0
- data/lib/solargraph/language_server/completion_item_kinds.rb +35 -0
- data/lib/solargraph/language_server/error_codes.rb +20 -0
- data/lib/solargraph/language_server/host.rb +746 -0
- data/lib/solargraph/language_server/host/cataloger.rb +56 -0
- data/lib/solargraph/language_server/host/diagnoser.rb +81 -0
- data/lib/solargraph/language_server/host/dispatch.rb +112 -0
- data/lib/solargraph/language_server/host/sources.rb +156 -0
- data/lib/solargraph/language_server/message.rb +92 -0
- data/lib/solargraph/language_server/message/base.rb +85 -0
- data/lib/solargraph/language_server/message/cancel_request.rb +13 -0
- data/lib/solargraph/language_server/message/client.rb +11 -0
- data/lib/solargraph/language_server/message/client/register_capability.rb +15 -0
- data/lib/solargraph/language_server/message/completion_item.rb +11 -0
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +57 -0
- data/lib/solargraph/language_server/message/exit_notification.rb +13 -0
- data/lib/solargraph/language_server/message/extended.rb +21 -0
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +100 -0
- data/lib/solargraph/language_server/message/extended/document.rb +20 -0
- data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -0
- data/lib/solargraph/language_server/message/extended/download_core.rb +23 -0
- data/lib/solargraph/language_server/message/extended/environment.rb +25 -0
- data/lib/solargraph/language_server/message/extended/search.rb +20 -0
- data/lib/solargraph/language_server/message/initialize.rb +153 -0
- data/lib/solargraph/language_server/message/initialized.rb +26 -0
- data/lib/solargraph/language_server/message/method_not_found.rb +16 -0
- data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -0
- data/lib/solargraph/language_server/message/shutdown.rb +13 -0
- data/lib/solargraph/language_server/message/text_document.rb +28 -0
- data/lib/solargraph/language_server/message/text_document/base.rb +19 -0
- data/lib/solargraph/language_server/message/text_document/code_action.rb +17 -0
- data/lib/solargraph/language_server/message/text_document/completion.rb +57 -0
- data/lib/solargraph/language_server/message/text_document/definition.rb +38 -0
- data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -0
- data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -0
- data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -0
- data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -0
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +23 -0
- data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -0
- data/lib/solargraph/language_server/message/text_document/formatting.rb +105 -0
- data/lib/solargraph/language_server/message/text_document/hover.rb +44 -0
- data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +34 -0
- data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -0
- data/lib/solargraph/language_server/message/text_document/references.rb +16 -0
- data/lib/solargraph/language_server/message/text_document/rename.rb +19 -0
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +29 -0
- data/lib/solargraph/language_server/message/workspace.rb +14 -0
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +29 -0
- data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +33 -0
- data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -0
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -0
- data/lib/solargraph/language_server/message_types.rb +14 -0
- data/lib/solargraph/language_server/request.rb +24 -0
- data/lib/solargraph/language_server/symbol_kinds.rb +36 -0
- data/lib/solargraph/language_server/transport.rb +13 -0
- data/lib/solargraph/language_server/transport/adapter.rb +56 -0
- data/lib/solargraph/language_server/transport/data_reader.rb +72 -0
- data/lib/solargraph/language_server/uri_helpers.rb +49 -0
- data/lib/solargraph/library.rb +426 -0
- data/lib/solargraph/location.rb +37 -0
- data/lib/solargraph/logging.rb +27 -0
- data/lib/solargraph/page.rb +83 -0
- data/lib/solargraph/parser.rb +26 -0
- data/lib/solargraph/parser/comment_ripper.rb +52 -0
- data/lib/solargraph/parser/legacy.rb +12 -0
- data/lib/solargraph/parser/legacy/class_methods.rb +109 -0
- data/lib/solargraph/parser/legacy/flawed_builder.rb +16 -0
- data/lib/solargraph/parser/legacy/node_chainer.rb +118 -0
- data/lib/solargraph/parser/legacy/node_methods.rb +311 -0
- data/lib/solargraph/parser/legacy/node_processors.rb +54 -0
- data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +23 -0
- data/lib/solargraph/parser/legacy/node_processors/args_node.rb +35 -0
- data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +15 -0
- data/lib/solargraph/parser/legacy/node_processors/block_node.rb +22 -0
- data/lib/solargraph/parser/legacy/node_processors/casgn_node.rb +25 -0
- data/lib/solargraph/parser/legacy/node_processors/cvasgn_node.rb +23 -0
- data/lib/solargraph/parser/legacy/node_processors/def_node.rb +63 -0
- data/lib/solargraph/parser/legacy/node_processors/defs_node.rb +36 -0
- data/lib/solargraph/parser/legacy/node_processors/gvasgn_node.rb +23 -0
- data/lib/solargraph/parser/legacy/node_processors/ivasgn_node.rb +38 -0
- data/lib/solargraph/parser/legacy/node_processors/lvasgn_node.rb +28 -0
- data/lib/solargraph/parser/legacy/node_processors/namespace_node.rb +39 -0
- data/lib/solargraph/parser/legacy/node_processors/orasgn_node.rb +16 -0
- data/lib/solargraph/parser/legacy/node_processors/resbody_node.rb +36 -0
- data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +21 -0
- data/lib/solargraph/parser/legacy/node_processors/send_node.rb +257 -0
- data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +18 -0
- data/lib/solargraph/parser/node_methods.rb +43 -0
- data/lib/solargraph/parser/node_processor.rb +43 -0
- data/lib/solargraph/parser/node_processor/base.rb +80 -0
- data/lib/solargraph/parser/region.rb +66 -0
- data/lib/solargraph/parser/rubyvm.rb +40 -0
- data/lib/solargraph/parser/rubyvm/class_methods.rb +150 -0
- data/lib/solargraph/parser/rubyvm/node_chainer.rb +135 -0
- data/lib/solargraph/parser/rubyvm/node_methods.rb +301 -0
- data/lib/solargraph/parser/rubyvm/node_processors.rb +62 -0
- data/lib/solargraph/parser/rubyvm/node_processors/alias_node.rb +23 -0
- data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +86 -0
- data/lib/solargraph/parser/rubyvm/node_processors/begin_node.rb +15 -0
- data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +22 -0
- data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +22 -0
- data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +23 -0
- data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +64 -0
- data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +57 -0
- data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +23 -0
- data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +38 -0
- data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +39 -0
- data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +20 -0
- data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +27 -0
- data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +39 -0
- data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +26 -0
- data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +15 -0
- data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +45 -0
- data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +21 -0
- data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +15 -0
- data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +277 -0
- data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +18 -0
- data/lib/solargraph/parser/snippet.rb +13 -0
- data/lib/solargraph/pin.rb +36 -0
- data/lib/solargraph/pin/base.rb +296 -0
- data/lib/solargraph/pin/base_variable.rb +84 -0
- data/lib/solargraph/pin/block.rb +62 -0
- data/lib/solargraph/pin/class_variable.rb +8 -0
- data/lib/solargraph/pin/closure.rb +37 -0
- data/lib/solargraph/pin/common.rb +70 -0
- data/lib/solargraph/pin/constant.rb +43 -0
- data/lib/solargraph/pin/conversions.rb +96 -0
- data/lib/solargraph/pin/documenting.rb +105 -0
- data/lib/solargraph/pin/duck_method.rb +16 -0
- data/lib/solargraph/pin/global_variable.rb +8 -0
- data/lib/solargraph/pin/instance_variable.rb +30 -0
- data/lib/solargraph/pin/keyword.rb +15 -0
- data/lib/solargraph/pin/keyword_param.rb +8 -0
- data/lib/solargraph/pin/local_variable.rb +21 -0
- data/lib/solargraph/pin/localized.rb +43 -0
- data/lib/solargraph/pin/method.rb +245 -0
- data/lib/solargraph/pin/method_alias.rb +31 -0
- data/lib/solargraph/pin/namespace.rb +85 -0
- data/lib/solargraph/pin/parameter.rb +206 -0
- data/lib/solargraph/pin/proxy_type.rb +29 -0
- data/lib/solargraph/pin/reference.rb +14 -0
- data/lib/solargraph/pin/reference/extend.rb +10 -0
- data/lib/solargraph/pin/reference/include.rb +10 -0
- data/lib/solargraph/pin/reference/override.rb +29 -0
- data/lib/solargraph/pin/reference/prepend.rb +10 -0
- data/lib/solargraph/pin/reference/require.rb +14 -0
- data/lib/solargraph/pin/reference/superclass.rb +10 -0
- data/lib/solargraph/pin/singleton.rb +11 -0
- data/lib/solargraph/pin/symbol.rb +47 -0
- data/lib/solargraph/position.rb +100 -0
- data/lib/solargraph/range.rb +95 -0
- data/lib/solargraph/server_methods.rb +16 -0
- data/lib/solargraph/shell.rb +222 -0
- data/lib/solargraph/source.rb +537 -0
- data/lib/solargraph/source/chain.rb +154 -0
- data/lib/solargraph/source/chain/block_variable.rb +13 -0
- data/lib/solargraph/source/chain/call.rb +203 -0
- data/lib/solargraph/source/chain/class_variable.rb +13 -0
- data/lib/solargraph/source/chain/constant.rb +75 -0
- data/lib/solargraph/source/chain/global_variable.rb +13 -0
- data/lib/solargraph/source/chain/head.rb +35 -0
- data/lib/solargraph/source/chain/instance_variable.rb +13 -0
- data/lib/solargraph/source/chain/link.rb +67 -0
- data/lib/solargraph/source/chain/literal.rb +23 -0
- data/lib/solargraph/source/chain/or.rb +23 -0
- data/lib/solargraph/source/chain/variable.rb +13 -0
- data/lib/solargraph/source/chain/z_super.rb +30 -0
- data/lib/solargraph/source/change.rb +79 -0
- data/lib/solargraph/source/cursor.rb +164 -0
- data/lib/solargraph/source/encoding_fixes.rb +23 -0
- data/lib/solargraph/source/source_chainer.rb +190 -0
- data/lib/solargraph/source/updater.rb +54 -0
- data/lib/solargraph/source_map.rb +188 -0
- data/lib/solargraph/source_map/clip.rb +224 -0
- data/lib/solargraph/source_map/completion.rb +23 -0
- data/lib/solargraph/source_map/mapper.rb +215 -0
- data/lib/solargraph/type_checker.rb +503 -0
- data/lib/solargraph/type_checker/checks.rb +99 -0
- data/lib/solargraph/type_checker/param_def.rb +35 -0
- data/lib/solargraph/type_checker/problem.rb +32 -0
- data/lib/solargraph/type_checker/rules.rb +57 -0
- data/lib/solargraph/version.rb +5 -0
- data/lib/solargraph/views/_method.erb +62 -0
- data/lib/solargraph/views/_name_type_tag.erb +10 -0
- data/lib/solargraph/views/_namespace.erb +24 -0
- data/lib/solargraph/views/document.erb +23 -0
- data/lib/solargraph/views/environment.erb +58 -0
- data/lib/solargraph/views/layout.erb +44 -0
- data/lib/solargraph/views/search.erb +11 -0
- data/lib/solargraph/workspace.rb +209 -0
- data/lib/solargraph/workspace/config.rb +230 -0
- data/lib/solargraph/yard_map.rb +435 -0
- data/lib/solargraph/yard_map/cache.rb +19 -0
- data/lib/solargraph/yard_map/core_docs.rb +170 -0
- data/lib/solargraph/yard_map/core_fills.rb +185 -0
- data/lib/solargraph/yard_map/core_gen.rb +76 -0
- data/lib/solargraph/yard_map/helpers.rb +16 -0
- data/lib/solargraph/yard_map/mapper.rb +77 -0
- data/lib/solargraph/yard_map/mapper/to_constant.rb +25 -0
- data/lib/solargraph/yard_map/mapper/to_method.rb +78 -0
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +27 -0
- data/lib/solargraph/yard_map/rdoc_to_yard.rb +140 -0
- data/lib/solargraph/yard_map/stdlib_fills.rb +43 -0
- data/lib/solargraph/yard_map/to_method.rb +79 -0
- data/lib/yard-solargraph.rb +30 -0
- data/yardoc/2.2.2.tar.gz +0 -0
- metadata +564 -0
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Solargraph
|
4
|
+
module Pin
|
5
|
+
class Block < Closure
|
6
|
+
# The signature of the method that receives this block.
|
7
|
+
#
|
8
|
+
# @return [Parser::AST::Node]
|
9
|
+
attr_reader :receiver
|
10
|
+
|
11
|
+
def initialize receiver: nil, args: [], **splat
|
12
|
+
super(**splat)
|
13
|
+
@receiver = receiver
|
14
|
+
@parameters = args
|
15
|
+
end
|
16
|
+
|
17
|
+
# @param api_map [ApiMap]
|
18
|
+
# @return [void]
|
19
|
+
def rebind api_map
|
20
|
+
@binder ||= binder_or_nil(api_map)
|
21
|
+
end
|
22
|
+
|
23
|
+
def binder
|
24
|
+
@binder || closure.binder
|
25
|
+
end
|
26
|
+
|
27
|
+
# @return [Array<String>]
|
28
|
+
def parameters
|
29
|
+
@parameters ||= []
|
30
|
+
end
|
31
|
+
|
32
|
+
# @return [Array<String>]
|
33
|
+
def parameter_names
|
34
|
+
@parameter_names ||= parameters.map(&:name)
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
# @param api_map [ApiMap]
|
40
|
+
# @return [ComplexType, nil]
|
41
|
+
def binder_or_nil api_map
|
42
|
+
return nil unless receiver
|
43
|
+
word = receiver.children.find { |c| c.is_a?(::Symbol) }.to_s
|
44
|
+
return nil unless api_map.rebindable_method_names.include?(word)
|
45
|
+
chain = Parser.chain(receiver, location.filename)
|
46
|
+
locals = api_map.source_map(location.filename).locals_at(location)
|
47
|
+
if ['instance_eval', 'instance_exec', 'class_eval', 'class_exec', 'module_eval', 'module_exec'].include?(chain.links.last.word)
|
48
|
+
return chain.base.infer(api_map, self, locals)
|
49
|
+
else
|
50
|
+
receiver_pin = chain.define(api_map, self, locals).first
|
51
|
+
if receiver_pin && receiver_pin.docstring
|
52
|
+
ys = receiver_pin.docstring.tag(:yieldself)
|
53
|
+
if ys && ys.types && !ys.types.empty?
|
54
|
+
return ComplexType.try_parse(*ys.types).qualify(api_map, receiver_pin.context.namespace)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
nil
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Solargraph
|
4
|
+
module Pin
|
5
|
+
class Closure < Base
|
6
|
+
# @return [::Symbol] :class or :instance
|
7
|
+
attr_reader :scope
|
8
|
+
|
9
|
+
def initialize scope: :class, **splat
|
10
|
+
super(**splat)
|
11
|
+
@scope = scope
|
12
|
+
end
|
13
|
+
|
14
|
+
def context
|
15
|
+
@context ||= begin
|
16
|
+
result = super
|
17
|
+
if scope == :instance
|
18
|
+
Solargraph::ComplexType.parse(result.namespace)
|
19
|
+
else
|
20
|
+
result
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def binder
|
26
|
+
@binder || context
|
27
|
+
end
|
28
|
+
|
29
|
+
# @return [Array<String>]
|
30
|
+
def gates
|
31
|
+
# @todo This check might not be necessary. There should always be a
|
32
|
+
# root pin
|
33
|
+
closure ? closure.gates : ['']
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Solargraph
|
4
|
+
module Pin
|
5
|
+
module Common
|
6
|
+
# @return [Location]
|
7
|
+
attr_reader :location
|
8
|
+
|
9
|
+
# @return [Pin::Base, nil]
|
10
|
+
attr_reader :closure
|
11
|
+
|
12
|
+
# @return [String]
|
13
|
+
def name
|
14
|
+
@name ||= ''
|
15
|
+
end
|
16
|
+
|
17
|
+
# @return [ComplexType]
|
18
|
+
def return_type
|
19
|
+
@return_type ||= ComplexType::UNDEFINED
|
20
|
+
end
|
21
|
+
|
22
|
+
# @return [ComplexType]
|
23
|
+
def context
|
24
|
+
# Get the static context from the nearest namespace
|
25
|
+
@context ||= find_context
|
26
|
+
end
|
27
|
+
alias full_context context
|
28
|
+
|
29
|
+
# @return [String]
|
30
|
+
def namespace
|
31
|
+
context.namespace.to_s
|
32
|
+
end
|
33
|
+
|
34
|
+
# @return [ComplexType]
|
35
|
+
def binder
|
36
|
+
@binder || context
|
37
|
+
end
|
38
|
+
|
39
|
+
# @return [String]
|
40
|
+
def comments
|
41
|
+
@comments ||= ''
|
42
|
+
end
|
43
|
+
|
44
|
+
# @return [String]
|
45
|
+
def path
|
46
|
+
@path ||= name.empty? ? context.namespace : "#{context.namespace}::#{name}"
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
# @return [ComplexType]
|
52
|
+
def find_context
|
53
|
+
here = closure
|
54
|
+
until here.nil?
|
55
|
+
if here.is_a?(Pin::Namespace)
|
56
|
+
return here.return_type
|
57
|
+
elsif here.is_a?(Pin::Method)
|
58
|
+
if here.scope == :instance
|
59
|
+
return ComplexType.try_parse(here.context.namespace)
|
60
|
+
else
|
61
|
+
return here.context
|
62
|
+
end
|
63
|
+
end
|
64
|
+
here = here.closure
|
65
|
+
end
|
66
|
+
ComplexType::ROOT
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Solargraph
|
4
|
+
module Pin
|
5
|
+
class Constant < BaseVariable
|
6
|
+
attr_reader :visibility
|
7
|
+
|
8
|
+
def initialize visibility: :public, **splat
|
9
|
+
super(**splat)
|
10
|
+
@visibility = visibility
|
11
|
+
end
|
12
|
+
|
13
|
+
def return_type
|
14
|
+
@return_type ||= generate_complex_type
|
15
|
+
end
|
16
|
+
|
17
|
+
def completion_item_kind
|
18
|
+
Solargraph::LanguageServer::CompletionItemKinds::CONSTANT
|
19
|
+
end
|
20
|
+
|
21
|
+
# @return [Integer]
|
22
|
+
def symbol_kind
|
23
|
+
LanguageServer::SymbolKinds::CONSTANT
|
24
|
+
end
|
25
|
+
|
26
|
+
def path
|
27
|
+
@path ||= context.namespace.to_s.empty? ? name : "#{context.namespace}::#{name}"
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
# @return [ComplexType]
|
33
|
+
def generate_complex_type
|
34
|
+
tags = docstring.tags(:return).map(&:types).flatten.reject(&:nil?)
|
35
|
+
if tags.empty?
|
36
|
+
tags = docstring.tags(:type).map(&:types).flatten.reject(&:nil?)
|
37
|
+
end
|
38
|
+
return ComplexType::UNDEFINED if tags.empty?
|
39
|
+
ComplexType.try_parse *tags
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +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
|
@@ -0,0 +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
|
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
|
@@ -0,0 +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
|