cosmicgraph 0.49.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/FUNDING.yml +1 -0
- data/.github/workflows/rspec.yml +41 -0
- data/.gitignore +9 -0
- data/.rspec +2 -0
- data/.yardopts +2 -0
- data/CHANGELOG.md +1150 -0
- data/Gemfile +7 -0
- data/LICENSE +21 -0
- data/README.md +136 -0
- data/Rakefile +25 -0
- data/SPONSORS.md +15 -0
- data/bin/solargraph +5 -0
- data/cosmicgraph.gemspec +44 -0
- data/lib/.rubocop.yml +22 -0
- data/lib/solargraph/api_map/bundler_methods.rb +22 -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 +268 -0
- data/lib/solargraph/api_map.rb +704 -0
- data/lib/solargraph/bench.rb +27 -0
- data/lib/solargraph/cache.rb +51 -0
- data/lib/solargraph/complex_type/type_methods.rb +134 -0
- data/lib/solargraph/complex_type/unique_type.rb +132 -0
- data/lib/solargraph/complex_type.rb +254 -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/rakefile.rb +17 -0
- data/lib/solargraph/convention/rspec.rb +30 -0
- data/lib/solargraph/convention.rb +49 -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/base.rb +29 -0
- data/lib/solargraph/diagnostics/require_not_found.rb +53 -0
- data/lib/solargraph/diagnostics/rubocop.rb +112 -0
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +65 -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/diagnostics.rb +55 -0
- data/lib/solargraph/documentor.rb +76 -0
- data/lib/solargraph/environ.rb +45 -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/cataloger.rb +56 -0
- data/lib/solargraph/language_server/host/diagnoser.rb +89 -0
- data/lib/solargraph/language_server/host/dispatch.rb +111 -0
- data/lib/solargraph/language_server/host/message_worker.rb +59 -0
- data/lib/solargraph/language_server/host/sources.rb +156 -0
- data/lib/solargraph/language_server/host.rb +869 -0
- data/lib/solargraph/language_server/message/base.rb +89 -0
- data/lib/solargraph/language_server/message/cancel_request.rb +13 -0
- data/lib/solargraph/language_server/message/client/register_capability.rb +15 -0
- data/lib/solargraph/language_server/message/client.rb +11 -0
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -0
- data/lib/solargraph/language_server/message/completion_item.rb +11 -0
- data/lib/solargraph/language_server/message/exit_notification.rb +13 -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 +19 -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/extended.rb +21 -0
- data/lib/solargraph/language_server/message/initialize.rb +164 -0
- data/lib/solargraph/language_server/message/initialized.rb +27 -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/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 +59 -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_highlight.rb +16 -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 +126 -0
- data/lib/solargraph/language_server/message/text_document/hover.rb +56 -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 +24 -0
- data/lib/solargraph/language_server/message/text_document.rb +28 -0
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +30 -0
- data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +40 -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/workspace.rb +14 -0
- data/lib/solargraph/language_server/message.rb +93 -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/adapter.rb +53 -0
- data/lib/solargraph/language_server/transport/data_reader.rb +72 -0
- data/lib/solargraph/language_server/transport.rb +13 -0
- data/lib/solargraph/language_server/uri_helpers.rb +49 -0
- data/lib/solargraph/language_server.rb +19 -0
- data/lib/solargraph/library.rb +547 -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/comment_ripper.rb +52 -0
- data/lib/solargraph/parser/legacy/class_methods.rb +135 -0
- data/lib/solargraph/parser/legacy/flawed_builder.rb +16 -0
- data/lib/solargraph/parser/legacy/node_chainer.rb +148 -0
- data/lib/solargraph/parser/legacy/node_methods.rb +325 -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 +42 -0
- data/lib/solargraph/parser/legacy/node_processors/casgn_node.rb +35 -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 +42 -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/legacy/node_processors.rb +54 -0
- data/lib/solargraph/parser/legacy.rb +12 -0
- data/lib/solargraph/parser/node_methods.rb +43 -0
- data/lib/solargraph/parser/node_processor/base.rb +77 -0
- data/lib/solargraph/parser/node_processor.rb +43 -0
- data/lib/solargraph/parser/region.rb +66 -0
- data/lib/solargraph/parser/rubyvm/class_methods.rb +149 -0
- data/lib/solargraph/parser/rubyvm/node_chainer.rb +160 -0
- data/lib/solargraph/parser/rubyvm/node_methods.rb +315 -0
- data/lib/solargraph/parser/rubyvm/node_processors/alias_node.rb +23 -0
- data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +85 -0
- data/lib/solargraph/parser/rubyvm/node_processors/begin_node.rb +15 -0
- data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +42 -0
- data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +33 -0
- data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +23 -0
- data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +75 -0
- data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +68 -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 +32 -0
- data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +15 -0
- data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +279 -0
- data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +18 -0
- data/lib/solargraph/parser/rubyvm/node_processors.rb +63 -0
- data/lib/solargraph/parser/rubyvm/node_wrapper.rb +47 -0
- data/lib/solargraph/parser/rubyvm.rb +40 -0
- data/lib/solargraph/parser/snippet.rb +13 -0
- data/lib/solargraph/parser.rb +26 -0
- data/lib/solargraph/pin/base.rb +299 -0
- data/lib/solargraph/pin/base_variable.rb +84 -0
- data/lib/solargraph/pin/block.rb +73 -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 +92 -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 +55 -0
- data/lib/solargraph/pin/method.rb +335 -0
- data/lib/solargraph/pin/method_alias.rb +31 -0
- data/lib/solargraph/pin/namespace.rb +94 -0
- data/lib/solargraph/pin/parameter.rb +206 -0
- data/lib/solargraph/pin/proxy_type.rb +29 -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/reference.rb +14 -0
- data/lib/solargraph/pin/search.rb +56 -0
- data/lib/solargraph/pin/signature.rb +23 -0
- data/lib/solargraph/pin/singleton.rb +11 -0
- data/lib/solargraph/pin/symbol.rb +47 -0
- data/lib/solargraph/pin.rb +38 -0
- data/lib/solargraph/position.rb +100 -0
- data/lib/solargraph/range.rb +95 -0
- data/lib/solargraph/rbs_map/conversions.rb +394 -0
- data/lib/solargraph/rbs_map/core_fills.rb +61 -0
- data/lib/solargraph/rbs_map/core_map.rb +38 -0
- data/lib/solargraph/rbs_map/core_signs.rb +33 -0
- data/lib/solargraph/rbs_map/stdlib_map.rb +36 -0
- data/lib/solargraph/rbs_map.rb +73 -0
- data/lib/solargraph/server_methods.rb +16 -0
- data/lib/solargraph/shell.rb +234 -0
- data/lib/solargraph/source/chain/block_variable.rb +13 -0
- data/lib/solargraph/source/chain/call.rb +215 -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/hash.rb +28 -0
- data/lib/solargraph/source/chain/head.rb +19 -0
- data/lib/solargraph/source/chain/instance_variable.rb +13 -0
- data/lib/solargraph/source/chain/link.rb +71 -0
- data/lib/solargraph/source/chain/literal.rb +23 -0
- data/lib/solargraph/source/chain/or.rb +23 -0
- data/lib/solargraph/source/chain/q_call.rb +11 -0
- data/lib/solargraph/source/chain/variable.rb +13 -0
- data/lib/solargraph/source/chain/z_super.rb +30 -0
- data/lib/solargraph/source/chain.rb +179 -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 +191 -0
- data/lib/solargraph/source/updater.rb +54 -0
- data/lib/solargraph/source.rb +522 -0
- data/lib/solargraph/source_map/clip.rb +229 -0
- data/lib/solargraph/source_map/completion.rb +23 -0
- data/lib/solargraph/source_map/mapper.rb +241 -0
- data/lib/solargraph/source_map.rb +180 -0
- data/lib/solargraph/type_checker/checks.rb +112 -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/type_checker.rb +549 -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/config.rb +231 -0
- data/lib/solargraph/workspace.rb +212 -0
- data/lib/solargraph/yard_map/cache.rb +19 -0
- data/lib/solargraph/yard_map/helpers.rb +16 -0
- data/lib/solargraph/yard_map/mapper/to_constant.rb +25 -0
- data/lib/solargraph/yard_map/mapper/to_method.rb +81 -0
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +27 -0
- data/lib/solargraph/yard_map/mapper.rb +77 -0
- data/lib/solargraph/yard_map/to_method.rb +79 -0
- data/lib/solargraph/yard_map.rb +301 -0
- data/lib/solargraph.rb +69 -0
- data/lib/yard-solargraph.rb +33 -0
- metadata +587 -0
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Solargraph
|
4
|
+
class YardMap
|
5
|
+
class Mapper
|
6
|
+
module ToNamespace
|
7
|
+
extend YardMap::Helpers
|
8
|
+
|
9
|
+
def self.make code_object, spec, closure = nil
|
10
|
+
closure ||= Solargraph::Pin::Namespace.new(
|
11
|
+
name: code_object.namespace.to_s,
|
12
|
+
closure: Pin::ROOT_PIN,
|
13
|
+
gates: [code_object.namespace.to_s]
|
14
|
+
)
|
15
|
+
Pin::Namespace.new(
|
16
|
+
location: object_location(code_object, spec),
|
17
|
+
name: code_object.name.to_s,
|
18
|
+
comments: code_object.docstring ? code_object.docstring.all.to_s : '',
|
19
|
+
type: code_object.is_a?(YARD::CodeObjects::ClassObject) ? :class : :module,
|
20
|
+
visibility: code_object.visibility,
|
21
|
+
closure: closure
|
22
|
+
)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Solargraph
|
4
|
+
class YardMap
|
5
|
+
class Mapper
|
6
|
+
autoload :ToMethod, 'solargraph/yard_map/mapper/to_method'
|
7
|
+
autoload :ToNamespace, 'solargraph/yard_map/mapper/to_namespace'
|
8
|
+
autoload :ToConstant, 'solargraph/yard_map/mapper/to_constant'
|
9
|
+
|
10
|
+
# @param code_objects [Array<YARD::CodeObjects::Base>]
|
11
|
+
# @param spec [Gem::Specification]
|
12
|
+
def initialize code_objects, spec = nil
|
13
|
+
@code_objects = code_objects
|
14
|
+
@spec = spec
|
15
|
+
@pins = []
|
16
|
+
@namespace_pins = {}
|
17
|
+
end
|
18
|
+
|
19
|
+
# @return [Array<Pin::Base>]
|
20
|
+
def map
|
21
|
+
@code_objects.each do |co|
|
22
|
+
@pins.concat generate_pins co
|
23
|
+
end
|
24
|
+
# Some yardocs contain documentation for dependencies that can be
|
25
|
+
# ignored here. The YardMap will load dependencies separately.
|
26
|
+
@pins.keep_if { |pin| pin.location.nil? || File.file?(pin.location.filename) } if @spec
|
27
|
+
@pins
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
# @param code_object [YARD::CodeObjects::Base]
|
33
|
+
# @return [Array<Pin::Base>]
|
34
|
+
def generate_pins code_object
|
35
|
+
result = []
|
36
|
+
if code_object.is_a?(YARD::CodeObjects::NamespaceObject)
|
37
|
+
nspin = ToNamespace.make(code_object, @spec, @namespace_pins[code_object.namespace.to_s])
|
38
|
+
@namespace_pins[code_object.path] = nspin
|
39
|
+
result.push nspin
|
40
|
+
if code_object.is_a?(YARD::CodeObjects::ClassObject) and !code_object.superclass.nil?
|
41
|
+
# This method of superclass detection is a bit of a hack. If
|
42
|
+
# the superclass is a Proxy, it is assumed to be undefined in its
|
43
|
+
# yardoc and converted to a fully qualified namespace.
|
44
|
+
superclass = if code_object.superclass.is_a?(YARD::CodeObjects::Proxy)
|
45
|
+
"::#{code_object.superclass}"
|
46
|
+
else
|
47
|
+
code_object.superclass.to_s
|
48
|
+
end
|
49
|
+
result.push Solargraph::Pin::Reference::Superclass.new(name: superclass, closure: nspin)
|
50
|
+
end
|
51
|
+
code_object.class_mixins.each do |m|
|
52
|
+
result.push Solargraph::Pin::Reference::Extend.new(closure: nspin, name: m.path)
|
53
|
+
end
|
54
|
+
code_object.instance_mixins.each do |m|
|
55
|
+
result.push Solargraph::Pin::Reference::Include.new(
|
56
|
+
closure: nspin, # @todo Fix this
|
57
|
+
name: m.path
|
58
|
+
)
|
59
|
+
end
|
60
|
+
elsif code_object.is_a?(YARD::CodeObjects::MethodObject)
|
61
|
+
closure = @namespace_pins[code_object.namespace.to_s]
|
62
|
+
if code_object.name == :initialize && code_object.scope == :instance
|
63
|
+
# @todo Check the visibility of <Class>.new
|
64
|
+
result.push ToMethod.make(code_object, 'new', :class, :public, closure, @spec)
|
65
|
+
result.push ToMethod.make(code_object, 'initialize', :instance, :private, closure, @spec)
|
66
|
+
else
|
67
|
+
result.push ToMethod.make(code_object, nil, nil, nil, closure, @spec)
|
68
|
+
end
|
69
|
+
elsif code_object.is_a?(YARD::CodeObjects::ConstantObject)
|
70
|
+
closure = @namespace_pins[code_object.namespace]
|
71
|
+
result.push ToConstant.make(code_object, closure, @spec)
|
72
|
+
end
|
73
|
+
result
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Solargraph
|
4
|
+
class YardMap
|
5
|
+
class ToMethod
|
6
|
+
module InnerMethods
|
7
|
+
module_function
|
8
|
+
|
9
|
+
# @param code_object [YARD::CodeObjects::Base]
|
10
|
+
# @return [Array<Solargraph::Pin::Parameter>]
|
11
|
+
def get_parameters code_object, location, comments
|
12
|
+
return [] unless code_object.is_a?(YARD::CodeObjects::MethodObject)
|
13
|
+
# HACK: Skip `nil` and `self` parameters that are sometimes emitted
|
14
|
+
# for methods defined in C
|
15
|
+
# See https://github.com/castwide/solargraph/issues/345
|
16
|
+
code_object.parameters.select { |a| a[0] && a[0] != 'self' }.map do |a|
|
17
|
+
Solargraph::Pin::Parameter.new(
|
18
|
+
location: location,
|
19
|
+
closure: self,
|
20
|
+
comments: comments,
|
21
|
+
name: arg_name(a),
|
22
|
+
presence: nil,
|
23
|
+
decl: arg_type(a),
|
24
|
+
asgn_code: a[1]
|
25
|
+
)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# @param a [Array]
|
30
|
+
# @return [String]
|
31
|
+
def arg_name a
|
32
|
+
a[0].gsub(/[^a-z0-9_]/i, '')
|
33
|
+
end
|
34
|
+
|
35
|
+
# @param a [Array]
|
36
|
+
# @return [::Symbol]
|
37
|
+
def arg_type a
|
38
|
+
if a[0].start_with?('**')
|
39
|
+
:kwrestarg
|
40
|
+
elsif a[0].start_with?('*')
|
41
|
+
:restarg
|
42
|
+
elsif a[0].start_with?('&')
|
43
|
+
:blockarg
|
44
|
+
elsif a[0].end_with?(':')
|
45
|
+
a[1] ? :kwoptarg : :kwarg
|
46
|
+
elsif a[1]
|
47
|
+
:optarg
|
48
|
+
else
|
49
|
+
:arg
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
private_constant :InnerMethods
|
54
|
+
|
55
|
+
# include YardMixin
|
56
|
+
# extend YardMixin
|
57
|
+
extend Helpers
|
58
|
+
|
59
|
+
def make code_object, name = nil, scope = nil, visibility = nil, closure = nil, spec = nil
|
60
|
+
closure ||= Solargraph::Pin::Namespace.new(
|
61
|
+
name: code_object.namespace.to_s,
|
62
|
+
gates: [code_object.namespace.to_s]
|
63
|
+
)
|
64
|
+
location = object_location(code_object, spec)
|
65
|
+
comments = code_object.docstring ? code_object.docstring.all.to_s : ''
|
66
|
+
Pin::Method.new(
|
67
|
+
location: location,
|
68
|
+
closure: closure,
|
69
|
+
name: name || code_object.name.to_s,
|
70
|
+
comments: comments,
|
71
|
+
scope: scope || code_object.scope,
|
72
|
+
visibility: visibility || code_object.visibility,
|
73
|
+
parameters: InnerMethods.get_parameters(code_object, location, comments),
|
74
|
+
explicit: code_object.is_explicit?
|
75
|
+
)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,301 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'yard'
|
4
|
+
require 'yard-solargraph'
|
5
|
+
require 'rubygems/package'
|
6
|
+
require 'set'
|
7
|
+
|
8
|
+
module Solargraph
|
9
|
+
# The YardMap provides access to YARD documentation for the Ruby core, the
|
10
|
+
# stdlib, and gems.
|
11
|
+
#
|
12
|
+
class YardMap
|
13
|
+
class NoYardocError < StandardError; end
|
14
|
+
|
15
|
+
autoload :Cache, 'solargraph/yard_map/cache'
|
16
|
+
autoload :Mapper, 'solargraph/yard_map/mapper'
|
17
|
+
autoload :RdocToYard, 'solargraph/yard_map/rdoc_to_yard'
|
18
|
+
autoload :Helpers, 'solargraph/yard_map/helpers'
|
19
|
+
autoload :ToMethod, 'solargraph/yard_map/to_method'
|
20
|
+
|
21
|
+
include ApiMap::BundlerMethods
|
22
|
+
|
23
|
+
# @return [Boolean]
|
24
|
+
attr_writer :with_dependencies
|
25
|
+
|
26
|
+
# @param required [Array<String>, Set<String>]
|
27
|
+
# @param directory [String]
|
28
|
+
# @param source_gems [Array<String>, Set<String>]
|
29
|
+
# @param with_dependencies [Boolean]
|
30
|
+
def initialize(required: [], directory: '', source_gems: [], with_dependencies: true)
|
31
|
+
@with_dependencies = with_dependencies
|
32
|
+
change required.to_set, directory, source_gems.to_set
|
33
|
+
end
|
34
|
+
|
35
|
+
# @return [Array<Solargraph::Pin::Base>]
|
36
|
+
def pins
|
37
|
+
@pins ||= []
|
38
|
+
end
|
39
|
+
|
40
|
+
def with_dependencies?
|
41
|
+
@with_dependencies ||= true unless @with_dependencies == false
|
42
|
+
@with_dependencies
|
43
|
+
end
|
44
|
+
|
45
|
+
# @param new_requires [Set<String>] Required paths to use for loading gems
|
46
|
+
# @param new_directory [String] The workspace directory
|
47
|
+
# @param new_source_gems [Set<String>] Gems under local development (i.e., part of the workspace)
|
48
|
+
# @return [Boolean]
|
49
|
+
def change new_requires, new_directory, new_source_gems
|
50
|
+
return false if new_requires == base_required && new_directory == @directory && new_source_gems == @source_gems
|
51
|
+
@gem_paths = {}
|
52
|
+
base_required.replace new_requires
|
53
|
+
required.replace new_requires
|
54
|
+
# HACK: Hardcoded YAML handling
|
55
|
+
required.add 'psych' if new_requires.include?('yaml')
|
56
|
+
@source_gems = new_source_gems
|
57
|
+
@directory = new_directory
|
58
|
+
process_requires
|
59
|
+
@rebindable_method_names = nil
|
60
|
+
@pin_class_hash = nil
|
61
|
+
@pin_select_cache = {}
|
62
|
+
pins.each { |p| p.source = :yard }
|
63
|
+
true
|
64
|
+
end
|
65
|
+
|
66
|
+
# @return [Set<String>]
|
67
|
+
def rebindable_method_names
|
68
|
+
@rebindable_method_names ||= pins_by_class(Pin::Method)
|
69
|
+
.select { |pin| pin.comments && pin.comments.include?('@yieldself') }
|
70
|
+
.map(&:name)
|
71
|
+
.concat(['instance_eval', 'instance_exec', 'class_eval', 'class_exec', 'module_eval', 'module_exec', 'define_method'])
|
72
|
+
.to_set
|
73
|
+
end
|
74
|
+
|
75
|
+
# @return [Array<String>]
|
76
|
+
def yardocs
|
77
|
+
@yardocs ||= []
|
78
|
+
end
|
79
|
+
|
80
|
+
# @return [Set<String>]
|
81
|
+
def required
|
82
|
+
@required ||= Set.new
|
83
|
+
end
|
84
|
+
|
85
|
+
# @return [Array<String>]
|
86
|
+
def unresolved_requires
|
87
|
+
@unresolved_requires ||= []
|
88
|
+
end
|
89
|
+
|
90
|
+
# @return [Array<String>]
|
91
|
+
def missing_docs
|
92
|
+
@missing_docs ||= []
|
93
|
+
end
|
94
|
+
|
95
|
+
# @param y [String]
|
96
|
+
# @return [YARD::Registry]
|
97
|
+
def load_yardoc y
|
98
|
+
if y.is_a?(Array)
|
99
|
+
YARD::Registry.load y, true
|
100
|
+
else
|
101
|
+
YARD::Registry.load! y
|
102
|
+
end
|
103
|
+
rescue StandardError => e
|
104
|
+
Solargraph::Logging.logger.warn "Error loading yardoc '#{y}' #{e.class} #{e.message}"
|
105
|
+
yardocs.delete y
|
106
|
+
nil
|
107
|
+
end
|
108
|
+
|
109
|
+
# @param path [String]
|
110
|
+
# @return [Pin::Base]
|
111
|
+
def path_pin path
|
112
|
+
pins.select { |p| p.path == path }.first
|
113
|
+
end
|
114
|
+
|
115
|
+
# Get the location of a file referenced by a require path.
|
116
|
+
#
|
117
|
+
# @param path [String]
|
118
|
+
# @return [Location]
|
119
|
+
def require_reference path
|
120
|
+
# @type [Gem::Specification]
|
121
|
+
spec = spec_for_require(path)
|
122
|
+
spec.full_require_paths.each do |rp|
|
123
|
+
file = File.join(rp, "#{path}.rb")
|
124
|
+
next unless File.file?(file)
|
125
|
+
return Solargraph::Location.new(file, Solargraph::Range.from_to(0, 0, 0, 0))
|
126
|
+
end
|
127
|
+
nil
|
128
|
+
rescue Gem::LoadError
|
129
|
+
nil
|
130
|
+
end
|
131
|
+
|
132
|
+
def base_required
|
133
|
+
@base_required ||= Set.new
|
134
|
+
end
|
135
|
+
|
136
|
+
def directory
|
137
|
+
@directory ||= ''
|
138
|
+
end
|
139
|
+
|
140
|
+
private
|
141
|
+
|
142
|
+
# @return [YardMap::Cache]
|
143
|
+
def cache
|
144
|
+
@cache ||= YardMap::Cache.new
|
145
|
+
end
|
146
|
+
|
147
|
+
# @return [Hash]
|
148
|
+
def pin_class_hash
|
149
|
+
@pin_class_hash ||= pins.to_set.classify(&:class).transform_values(&:to_a)
|
150
|
+
end
|
151
|
+
|
152
|
+
# @return [Array<Pin::Base>]
|
153
|
+
def pins_by_class klass
|
154
|
+
@pin_select_cache[klass] ||= pin_class_hash.select { |key, _| key <= klass }.values.flatten
|
155
|
+
end
|
156
|
+
|
157
|
+
# @param ns [YARD::CodeObjects::NamespaceObject]
|
158
|
+
# @return [Array<YARD::CodeObjects::Base>]
|
159
|
+
def recurse_namespace_object ns
|
160
|
+
result = []
|
161
|
+
ns.children.each do |c|
|
162
|
+
result.push c
|
163
|
+
result.concat recurse_namespace_object(c) if c.respond_to?(:children)
|
164
|
+
end
|
165
|
+
result
|
166
|
+
end
|
167
|
+
|
168
|
+
# @return [void]
|
169
|
+
def process_requires
|
170
|
+
@gemset = process_gemsets
|
171
|
+
required.merge @gemset.keys if required.include?('bundler/require')
|
172
|
+
pins.clear
|
173
|
+
unresolved_requires.clear
|
174
|
+
missing_docs.clear
|
175
|
+
environ = Convention.for_global(self)
|
176
|
+
done = []
|
177
|
+
already_errored = []
|
178
|
+
(required + environ.requires).each do |r|
|
179
|
+
next if r.nil? || r.empty? || done.include?(r)
|
180
|
+
done.push r
|
181
|
+
cached = cache.get_path_pins(r)
|
182
|
+
unless cached.nil?
|
183
|
+
pins.concat cached
|
184
|
+
next
|
185
|
+
end
|
186
|
+
result = pins_for_require r, already_errored
|
187
|
+
result.delete_if(&:nil?)
|
188
|
+
unless result.empty?
|
189
|
+
cache.set_path_pins r, result
|
190
|
+
pins.concat result
|
191
|
+
end
|
192
|
+
end
|
193
|
+
if required.include?('yaml') && required.include?('psych')
|
194
|
+
# HACK: Hardcoded YAML handling
|
195
|
+
# @todo Why can't this be handled with an override or a virtual pin?
|
196
|
+
pin = path_pin('YAML')
|
197
|
+
pin.instance_variable_set(:@return_type, ComplexType.parse('Module<Psych>')) unless pin.nil?
|
198
|
+
end
|
199
|
+
pins.concat environ.pins
|
200
|
+
end
|
201
|
+
|
202
|
+
def process_error(req, result, already_errored, yd = 1)
|
203
|
+
base = req.split('/').first
|
204
|
+
return if already_errored.include?(base)
|
205
|
+
already_errored.push base
|
206
|
+
if yd.nil?
|
207
|
+
missing_docs.push req
|
208
|
+
else
|
209
|
+
unresolved_requires.push req
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
def process_gemsets
|
214
|
+
return {} if directory.empty? || !File.file?(File.join(directory, 'Gemfile'))
|
215
|
+
require_from_bundle(directory)
|
216
|
+
end
|
217
|
+
|
218
|
+
# @param r [String]
|
219
|
+
def pins_for_require r, already_errored
|
220
|
+
result = []
|
221
|
+
begin
|
222
|
+
name = r.split('/').first
|
223
|
+
return [] if name.empty? || @source_gems.include?(name) || @gem_paths.key?(name)
|
224
|
+
spec = spec_for_require(name)
|
225
|
+
@gem_paths[name] = spec.full_gem_path
|
226
|
+
|
227
|
+
yd = yardoc_file_for_spec(spec)
|
228
|
+
# YARD detects gems for certain libraries that do not have a yardoc
|
229
|
+
# but exist in the stdlib. `fileutils` is an example. Treat those
|
230
|
+
# cases as errors and check the stdlib yardoc.
|
231
|
+
if yd.nil?
|
232
|
+
process_error(r, result, already_errored, nil)
|
233
|
+
return []
|
234
|
+
end
|
235
|
+
unless yardocs.include?(yd)
|
236
|
+
yardocs.unshift yd
|
237
|
+
result.concat process_yardoc yd, spec
|
238
|
+
if with_dependencies?
|
239
|
+
(spec.dependencies - spec.development_dependencies).each do |dep|
|
240
|
+
result.concat pins_for_require dep.name, already_errored
|
241
|
+
end
|
242
|
+
end
|
243
|
+
end
|
244
|
+
rescue Gem::LoadError, NoYardocError
|
245
|
+
process_error(r, result, already_errored)
|
246
|
+
end
|
247
|
+
return result
|
248
|
+
end
|
249
|
+
|
250
|
+
# @param y [String, nil]
|
251
|
+
# @param spec [Gem::Specification, nil]
|
252
|
+
# @return [Array<Pin::Base>]
|
253
|
+
def process_yardoc y, spec = nil
|
254
|
+
return [] if y.nil?
|
255
|
+
if spec
|
256
|
+
cache = Solargraph::Cache.load('gems', "#{spec.name}-#{spec.version}.ser")
|
257
|
+
return cache if cache
|
258
|
+
end
|
259
|
+
size = Dir.glob(File.join(y, '**', '*'))
|
260
|
+
.map{ |f| File.size(f) }
|
261
|
+
.inject(:+)
|
262
|
+
if !size.nil? && size > 20_000_000
|
263
|
+
Solargraph::Logging.logger.warn "Yardoc at #{y} is too large to process (#{size} bytes)"
|
264
|
+
return []
|
265
|
+
end
|
266
|
+
Solargraph.logger.info "Loading #{spec.name} #{spec.version} from #{y}"
|
267
|
+
load_yardoc y
|
268
|
+
result = Mapper.new(YARD::Registry.all, spec).map
|
269
|
+
raise NoYardocError, "Yardoc at #{y} is empty" if result.empty?
|
270
|
+
if spec
|
271
|
+
Solargraph::Cache.save 'gems', "#{spec.name}-#{spec.version}.ser", result
|
272
|
+
end
|
273
|
+
result
|
274
|
+
end
|
275
|
+
|
276
|
+
# @param spec [Gem::Specification]
|
277
|
+
# @return [String]
|
278
|
+
def yardoc_file_for_spec spec
|
279
|
+
YARD::Registry.yardoc_file_for_gem(spec.name, "= #{spec.version}")
|
280
|
+
end
|
281
|
+
|
282
|
+
# @param path [String]
|
283
|
+
# @return [Gem::Specification]
|
284
|
+
def spec_for_require path
|
285
|
+
name = path.split('/').first
|
286
|
+
spec = Gem::Specification.find_by_name(name, @gemset[name])
|
287
|
+
|
288
|
+
# Avoid loading the spec again if it's going to be skipped anyway
|
289
|
+
return spec if @source_gems.include?(spec.name)
|
290
|
+
# Avoid loading the spec again if it's already the correct version
|
291
|
+
if @gemset[spec.name] && @gemset[spec.name] != spec.version
|
292
|
+
begin
|
293
|
+
return Gem::Specification.find_by_name(spec.name, "= #{@gemset[spec.name]}")
|
294
|
+
rescue Gem::LoadError
|
295
|
+
Solargraph.logger.warn "Unable to load #{spec.name} #{@gemset[spec.name]} specified by workspace, using #{spec.version} instead"
|
296
|
+
end
|
297
|
+
end
|
298
|
+
spec
|
299
|
+
end
|
300
|
+
end
|
301
|
+
end
|
data/lib/solargraph.rb
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
Encoding.default_external = 'UTF-8'
|
4
|
+
|
5
|
+
require 'solargraph/version'
|
6
|
+
|
7
|
+
# The top-level namespace for the Solargraph code mapping, documentation,
|
8
|
+
# static analysis, and language server libraries.
|
9
|
+
#
|
10
|
+
module Solargraph
|
11
|
+
class InvalidOffsetError < RangeError; end
|
12
|
+
class DiagnosticsError < RuntimeError; end
|
13
|
+
class FileNotFoundError < RuntimeError; end
|
14
|
+
class SourceNotAvailableError < StandardError; end
|
15
|
+
class ComplexTypeError < StandardError; end
|
16
|
+
class WorkspaceTooLargeError < RuntimeError; end
|
17
|
+
class BundleNotFoundError < StandardError; end
|
18
|
+
class InvalidRubocopVersionError < RuntimeError; end
|
19
|
+
|
20
|
+
autoload :Position, 'solargraph/position'
|
21
|
+
autoload :Range, 'solargraph/range'
|
22
|
+
autoload :Location, 'solargraph/location'
|
23
|
+
autoload :Shell, 'solargraph/shell'
|
24
|
+
autoload :Source, 'solargraph/source'
|
25
|
+
autoload :SourceMap, 'solargraph/source_map'
|
26
|
+
autoload :ApiMap, 'solargraph/api_map'
|
27
|
+
autoload :YardMap, 'solargraph/yard_map'
|
28
|
+
autoload :Pin, 'solargraph/pin'
|
29
|
+
autoload :ServerMethods, 'solargraph/server_methods'
|
30
|
+
autoload :LanguageServer, 'solargraph/language_server'
|
31
|
+
autoload :Workspace, 'solargraph/workspace'
|
32
|
+
autoload :Page, 'solargraph/page'
|
33
|
+
autoload :Library, 'solargraph/library'
|
34
|
+
autoload :Diagnostics, 'solargraph/diagnostics'
|
35
|
+
autoload :ComplexType, 'solargraph/complex_type'
|
36
|
+
autoload :Bench, 'solargraph/bench'
|
37
|
+
autoload :Logging, 'solargraph/logging'
|
38
|
+
autoload :TypeChecker, 'solargraph/type_checker'
|
39
|
+
autoload :Environ, 'solargraph/environ'
|
40
|
+
autoload :Convention, 'solargraph/convention'
|
41
|
+
autoload :Documentor, 'solargraph/documentor'
|
42
|
+
autoload :Parser, 'solargraph/parser'
|
43
|
+
autoload :RbsMap, 'solargraph/rbs_map'
|
44
|
+
autoload :Cache, 'solargraph/cache'
|
45
|
+
|
46
|
+
dir = File.dirname(__FILE__)
|
47
|
+
YARD_EXTENSION_FILE = File.join(dir, 'yard-solargraph.rb')
|
48
|
+
VIEWS_PATH = File.join(dir, 'solargraph', 'views')
|
49
|
+
|
50
|
+
# A convenience method for Solargraph::Logging.logger.
|
51
|
+
#
|
52
|
+
# @return [Logger]
|
53
|
+
def self.logger
|
54
|
+
Solargraph::Logging.logger
|
55
|
+
end
|
56
|
+
|
57
|
+
# A helper method that runs Bundler.with_unbundled_env or falls back to
|
58
|
+
# Bundler.with_clean_env for earlier versions of Bundler.
|
59
|
+
#
|
60
|
+
# @return [void]
|
61
|
+
def self.with_clean_env &block
|
62
|
+
meth = if Bundler.respond_to?(:with_original_env)
|
63
|
+
:with_original_env
|
64
|
+
else
|
65
|
+
:with_clean_env
|
66
|
+
end
|
67
|
+
Bundler.send meth, &block
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'yard'
|
4
|
+
|
5
|
+
# Change YARD log IO to avoid sending unexpected messages to STDOUT
|
6
|
+
YARD::Logger.instance.io = File.new(File::NULL, 'w')
|
7
|
+
|
8
|
+
module Solargraph
|
9
|
+
# A placeholder for the @!domain directive. It doesn't need to do anything
|
10
|
+
# for yardocs. It's only used for Solargraph API maps.
|
11
|
+
class DomainDirective < YARD::Tags::Directive
|
12
|
+
def call; end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# Define a @type tag for documenting variables
|
17
|
+
YARD::Tags::Library.define_tag("Type", :type, :with_types_and_name)
|
18
|
+
# Define a @yieldself tag for documenting block contexts
|
19
|
+
YARD::Tags::Library.define_tag("Yieldself", :yieldself, :with_types)
|
20
|
+
# Define a @yieldpublic tag for documenting block domains
|
21
|
+
YARD::Tags::Library.define_tag("Yieldpublic", :yieldpublic, :with_types)
|
22
|
+
# Define a @return_single_parameter tag for returning e.g. Array parameters
|
23
|
+
YARD::Tags::Library.define_tag('ReturnSingleParameter', :return_single_parameter)
|
24
|
+
# Define a @yieldparam_single_parameter tag for yielding e.g. Array parameters
|
25
|
+
YARD::Tags::Library.define_tag('YieldparamSingleParameter', :yieldparam_single_parameter)
|
26
|
+
# Define a @return_value_parameter tag for returning e.g. Hash values
|
27
|
+
YARD::Tags::Library.define_tag('ReturnValueParameter', :return_value_parameter)
|
28
|
+
# Define a @param_tuple tag for e.g. Hash#[]= parameters
|
29
|
+
YARD::Tags::Library.define_tag('ParamTuple', :param_tuple)
|
30
|
+
# Define a @!domain directive for documenting DSLs
|
31
|
+
YARD::Tags::Library.define_directive("domain", :with_types, Solargraph::DomainDirective)
|
32
|
+
# Define an @!override directive for overriding method tags
|
33
|
+
YARD::Tags::Library.define_directive("override", :with_name, Solargraph::DomainDirective)
|