solargraph 0.39.7
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/.gitignore +9 -0
- data/.rspec +2 -0
- data/.travis.yml +28 -0
- data/.yardopts +2 -0
- data/Gemfile +7 -0
- data/LICENSE +21 -0
- data/README.md +104 -0
- data/Rakefile +14 -0
- data/SPONSORS.md +9 -0
- data/bin/solargraph +5 -0
- data/lib/.rubocop.yml +21 -0
- data/lib/solargraph.rb +66 -0
- data/lib/solargraph/api_map.rb +745 -0
- data/lib/solargraph/api_map/bundler_methods.rb +27 -0
- data/lib/solargraph/api_map/cache.rb +66 -0
- data/lib/solargraph/api_map/source_to_yard.rb +81 -0
- data/lib/solargraph/api_map/store.rb +267 -0
- data/lib/solargraph/bundle.rb +26 -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 +38 -0
- data/lib/solargraph/convention/base.rb +25 -0
- data/lib/solargraph/convention/gemfile.rb +18 -0
- data/lib/solargraph/convention/gemspec.rb +25 -0
- data/lib/solargraph/convention/rspec.rb +24 -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/core_fills.rb +159 -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 +64 -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 +76 -0
- data/lib/solargraph/environ.rb +40 -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 +741 -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 +95 -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 +78 -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 +414 -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 +300 -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 +234 -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 +77 -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 +284 -0
- data/lib/solargraph/parser/rubyvm/node_processors.rb +61 -0
- data/lib/solargraph/parser/rubyvm/node_processors/alias_node.rb +23 -0
- data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +62 -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 +31 -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 +255 -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 +39 -0
- data/lib/solargraph/pin/attribute.rb +49 -0
- data/lib/solargraph/pin/base.rb +296 -0
- data/lib/solargraph/pin/base_method.rb +141 -0
- data/lib/solargraph/pin/base_variable.rb +84 -0
- data/lib/solargraph/pin/block.rb +48 -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 +97 -0
- data/lib/solargraph/pin/documenting.rb +110 -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 +111 -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/pin/yard_pin.rb +12 -0
- data/lib/solargraph/pin/yard_pin/constant.rb +25 -0
- data/lib/solargraph/pin/yard_pin/method.rb +65 -0
- data/lib/solargraph/pin/yard_pin/namespace.rb +27 -0
- data/lib/solargraph/pin/yard_pin/yard_mixin.rb +26 -0
- data/lib/solargraph/position.rb +112 -0
- data/lib/solargraph/range.rb +95 -0
- data/lib/solargraph/server_methods.rb +16 -0
- data/lib/solargraph/shell.rb +221 -0
- data/lib/solargraph/source.rb +533 -0
- data/lib/solargraph/source/chain.rb +172 -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 +184 -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 +189 -0
- data/lib/solargraph/source/updater.rb +54 -0
- data/lib/solargraph/source_map.rb +170 -0
- data/lib/solargraph/source_map/clip.rb +190 -0
- data/lib/solargraph/source_map/completion.rb +23 -0
- data/lib/solargraph/source_map/mapper.rb +199 -0
- data/lib/solargraph/stdlib_fills.rb +32 -0
- data/lib/solargraph/type_checker.rb +498 -0
- data/lib/solargraph/type_checker/checks.rb +95 -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 +53 -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 +215 -0
- data/lib/solargraph/yard_map.rb +420 -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_gen.rb +76 -0
- data/lib/solargraph/yard_map/mapper.rb +71 -0
- data/lib/solargraph/yard_map/rdoc_to_yard.rb +136 -0
- data/lib/yard-solargraph.rb +30 -0
- data/solargraph.gemspec +41 -0
- data/travis-bundler.rb +11 -0
- data/yardoc/2.2.2.tar.gz +0 -0
- metadata +575 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
class Source
|
|
5
|
+
class Chain
|
|
6
|
+
# Chain::Head is a link for ambiguous words, e.g.; `String` can refer to
|
|
7
|
+
# either a class (`String`) or a function (`Kernel#String`).
|
|
8
|
+
#
|
|
9
|
+
# @note Chain::Head is only intended to handle `self` and `super`.
|
|
10
|
+
class Head < Link
|
|
11
|
+
def resolve api_map, name_pin, locals
|
|
12
|
+
return [Pin::ProxyType.anonymous(name_pin.binder)] if word == 'self'
|
|
13
|
+
# return super_pins(api_map, name_pin) if word == 'super'
|
|
14
|
+
[]
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# @todo This is temporary. Chain heads need to handle arguments to
|
|
18
|
+
# `super`.
|
|
19
|
+
# def arguments
|
|
20
|
+
# []
|
|
21
|
+
# end
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
# # @param api_map [ApiMap]
|
|
26
|
+
# # @param name_pin [Pin::Base]
|
|
27
|
+
# # @return [Array<Pin::Base>]
|
|
28
|
+
# def super_pins api_map, name_pin
|
|
29
|
+
# pins = api_map.get_method_stack(name_pin.namespace, name_pin.name, scope: name_pin.scope)
|
|
30
|
+
# pins.reject{|p| p.path == name_pin.path}
|
|
31
|
+
# end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
class Source
|
|
5
|
+
class Chain
|
|
6
|
+
class InstanceVariable < Link
|
|
7
|
+
def resolve api_map, name_pin, locals
|
|
8
|
+
api_map.get_instance_variable_pins(name_pin.binder.namespace, name_pin.binder.scope).select{|p| p.name == word}
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
class Source
|
|
5
|
+
class Chain
|
|
6
|
+
class Link
|
|
7
|
+
# @return [String]
|
|
8
|
+
attr_reader :word
|
|
9
|
+
|
|
10
|
+
attr_accessor :last_context
|
|
11
|
+
|
|
12
|
+
def initialize word = '<undefined>'
|
|
13
|
+
@word = word
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def undefined?
|
|
17
|
+
word == '<undefined>'
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def constant?
|
|
21
|
+
is_a?(Chain::Constant)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# @param api_map [ApiMap]
|
|
25
|
+
# @param name_pin [Pin::Base]
|
|
26
|
+
# @param locals [Array<Pin::Base>]
|
|
27
|
+
# @return [Array<Pin::Base>]
|
|
28
|
+
def resolve api_map, name_pin, locals
|
|
29
|
+
[]
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def head?
|
|
33
|
+
@head ||= false
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def == other
|
|
37
|
+
self.class == other.class and word == other.word
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Make a copy of this link marked as the head of a chain
|
|
41
|
+
#
|
|
42
|
+
# @return [self]
|
|
43
|
+
def clone_head
|
|
44
|
+
clone.mark_head(true)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Make a copy of this link unmarked as the head of a chain
|
|
48
|
+
#
|
|
49
|
+
# @return [self]
|
|
50
|
+
def clone_body
|
|
51
|
+
clone.mark_head(false)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
protected
|
|
55
|
+
|
|
56
|
+
# Mark whether this link is the head of a chain
|
|
57
|
+
#
|
|
58
|
+
# @param bool [Boolean]
|
|
59
|
+
# @return [self]
|
|
60
|
+
def mark_head bool
|
|
61
|
+
@head = bool
|
|
62
|
+
self
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
class Source
|
|
5
|
+
class Chain
|
|
6
|
+
class Literal < Link
|
|
7
|
+
def word
|
|
8
|
+
@word ||= "<#{@type}>"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# @param type [String]
|
|
12
|
+
def initialize type
|
|
13
|
+
@type = type
|
|
14
|
+
@complex_type = ComplexType.try_parse(type)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def resolve api_map, name_pin, locals
|
|
18
|
+
[Pin::ProxyType.anonymous(@complex_type)]
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
class Source
|
|
5
|
+
class Chain
|
|
6
|
+
class Or < Link
|
|
7
|
+
def word
|
|
8
|
+
'<or>'
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# @param type [String]
|
|
12
|
+
def initialize links
|
|
13
|
+
@links = links
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def resolve api_map, name_pin, locals
|
|
17
|
+
types = @links.map { |link| link.infer(api_map, name_pin, locals) }
|
|
18
|
+
[Solargraph::Pin::ProxyType.anonymous(Solargraph::ComplexType.try_parse(types.map(&:tag).uniq.join(', ')))]
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
class Source
|
|
5
|
+
class Chain
|
|
6
|
+
class Variable < Link
|
|
7
|
+
def resolve api_map, name_pin, locals
|
|
8
|
+
api_map.get_instance_variable_pins(name_pin.context.namespace, name_pin.context.scope).select{|p| p.name == word}
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
class Source
|
|
5
|
+
class Chain
|
|
6
|
+
class ZSuper < Call
|
|
7
|
+
# @return [String]
|
|
8
|
+
attr_reader :word
|
|
9
|
+
|
|
10
|
+
# @return [Array<Chain>]
|
|
11
|
+
attr_reader :arguments
|
|
12
|
+
|
|
13
|
+
# @param word [String]
|
|
14
|
+
# @param arguments [Array<Chain>]
|
|
15
|
+
# @param with_block [Boolean] True if the chain is inside a block
|
|
16
|
+
# @param head [Boolean] True if the call is the start of its chain
|
|
17
|
+
def initialize word, with_block = false
|
|
18
|
+
super(word, [], with_block)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def with_block?
|
|
22
|
+
@with_block
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# @param api_map [ApiMap]
|
|
26
|
+
# @param name_pin [Pin::Base]
|
|
27
|
+
# @param locals [Array<Pin::Base>]
|
|
28
|
+
def resolve api_map, name_pin, locals
|
|
29
|
+
return super_pins(api_map, name_pin)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
private
|
|
33
|
+
|
|
34
|
+
# @param pins [Array<Pin::Base>]
|
|
35
|
+
# @param api_map [ApiMap]
|
|
36
|
+
# @param context [ComplexType]
|
|
37
|
+
# @param locals [Pin::LocalVariable]
|
|
38
|
+
# @return [Array<Pin::Base>]
|
|
39
|
+
def inferred_pins pins, api_map, context, locals
|
|
40
|
+
result = pins.map do |p|
|
|
41
|
+
overloads = p.docstring.tags(:overload)
|
|
42
|
+
# next p if overloads.empty?
|
|
43
|
+
type = ComplexType::UNDEFINED
|
|
44
|
+
# @param [YARD::Tags::OverloadTag]
|
|
45
|
+
overloads.each do |ol|
|
|
46
|
+
next unless arguments_match(arguments, ol.parameters)
|
|
47
|
+
next if ol.parameters.last && ol.parameters.last.first.start_with?('&') && ol.parameters.last.last.nil? && !with_block?
|
|
48
|
+
match = true
|
|
49
|
+
arguments.each_with_index do |arg, idx|
|
|
50
|
+
achain = arguments[idx]
|
|
51
|
+
next if achain.nil?
|
|
52
|
+
param = ol.parameters[idx]
|
|
53
|
+
if param.nil?
|
|
54
|
+
match = false unless ol.parameters.last && ol.parameters.last.first.start_with?('*')
|
|
55
|
+
break
|
|
56
|
+
end
|
|
57
|
+
par = ol.tags(:param).select { |pp| pp.name == param.first }.first
|
|
58
|
+
next if par.nil? || par.types.nil? || par.types.empty?
|
|
59
|
+
atype = achain.infer(api_map, Pin::ProxyType.anonymous(context), locals)
|
|
60
|
+
other = ComplexType.try_parse(*par.types)
|
|
61
|
+
# @todo Weak type comparison
|
|
62
|
+
unless atype.tag == other.tag || api_map.super_and_sub?(other.tag, atype.tag)
|
|
63
|
+
match = false
|
|
64
|
+
break
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
if match
|
|
68
|
+
type = extra_return_type(ol, context)
|
|
69
|
+
type = ComplexType.try_parse(*ol.tag(:return).types).self_to(context.to_s).qualify(api_map, context.namespace) if ol.has_tag?(:return) && ol.tag(:return).types && !ol.tag(:return).types.empty? && (type.nil? || type.undefined?)
|
|
70
|
+
type ||= ComplexType::UNDEFINED
|
|
71
|
+
end
|
|
72
|
+
break if type.defined?
|
|
73
|
+
end
|
|
74
|
+
next p.proxy(type) if type.defined?
|
|
75
|
+
type = extra_return_type(p.docstring, context)
|
|
76
|
+
if type
|
|
77
|
+
next Solargraph::Pin::Method.new(
|
|
78
|
+
location: p.location,
|
|
79
|
+
closure: p.closure,
|
|
80
|
+
name: p.name,
|
|
81
|
+
comments: "@return [#{context.subtypes.first.to_s}]",
|
|
82
|
+
scope: p.scope,
|
|
83
|
+
visibility: p.visibility,
|
|
84
|
+
parameters: p.parameters,
|
|
85
|
+
node: p.node
|
|
86
|
+
)
|
|
87
|
+
end
|
|
88
|
+
if p.is_a?(Pin::Method) && !p.macros.empty?
|
|
89
|
+
result = process_macro(p, api_map, context, locals)
|
|
90
|
+
next result unless result.return_type.undefined?
|
|
91
|
+
elsif !p.directives.empty?
|
|
92
|
+
result = process_directive(p, api_map, context, locals)
|
|
93
|
+
next result unless result.return_type.undefined?
|
|
94
|
+
end
|
|
95
|
+
p
|
|
96
|
+
end
|
|
97
|
+
result.map do |pin|
|
|
98
|
+
next pin if pin.return_type.undefined?
|
|
99
|
+
selfy = pin.return_type.self_to(context.tag)
|
|
100
|
+
selfy == pin.return_type ? pin : pin.proxy(selfy)
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# @param pin [Pin::Method]
|
|
105
|
+
# @param api_map [ApiMap]
|
|
106
|
+
# @param context [ComplexType]
|
|
107
|
+
# @param locals [Pin::Base]
|
|
108
|
+
# @return [Pin::Base]
|
|
109
|
+
def process_macro pin, api_map, context, locals
|
|
110
|
+
pin.macros.each do |macro|
|
|
111
|
+
result = inner_process_macro(pin, macro, api_map, context, locals)
|
|
112
|
+
return result unless result.return_type.undefined?
|
|
113
|
+
end
|
|
114
|
+
Pin::ProxyType.anonymous(ComplexType::UNDEFINED)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# @param pin [Pin::Method]
|
|
118
|
+
# @param api_map [ApiMap]
|
|
119
|
+
# @param context [ComplexType]
|
|
120
|
+
# @param locals [Pin::Base]
|
|
121
|
+
# @return [Pin::ProxyType]
|
|
122
|
+
def process_directive pin, api_map, context, locals
|
|
123
|
+
pin.directives.each do |dir|
|
|
124
|
+
macro = api_map.named_macro(dir.tag.name)
|
|
125
|
+
next if macro.nil?
|
|
126
|
+
result = inner_process_macro(pin, macro, api_map, context, locals)
|
|
127
|
+
return result unless result.return_type.undefined?
|
|
128
|
+
end
|
|
129
|
+
Pin::ProxyType.anonymous ComplexType::UNDEFINED
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# @param pin [Pin]
|
|
133
|
+
# @param macro [YARD::Tags::MacroDirective]
|
|
134
|
+
# @param api_map [ApiMap]
|
|
135
|
+
# @param context [ComplexType]
|
|
136
|
+
# @param locals [Array<Pin::Base>]
|
|
137
|
+
# @return [Pin::ProxyType]
|
|
138
|
+
def inner_process_macro pin, macro, api_map, context, locals
|
|
139
|
+
vals = arguments.map{ |c| Pin::ProxyType.anonymous(c.infer(api_map, pin, locals)) }
|
|
140
|
+
txt = macro.tag.text.clone
|
|
141
|
+
if txt.empty? && macro.tag.name
|
|
142
|
+
named = api_map.named_macro(macro.tag.name)
|
|
143
|
+
txt = named.tag.text.clone if named
|
|
144
|
+
end
|
|
145
|
+
i = 1
|
|
146
|
+
vals.each do |v|
|
|
147
|
+
txt.gsub!(/\$#{i}/, v.context.namespace)
|
|
148
|
+
i += 1
|
|
149
|
+
end
|
|
150
|
+
docstring = Solargraph::Source.parse_docstring(txt).to_docstring
|
|
151
|
+
tag = docstring.tag(:return)
|
|
152
|
+
unless tag.nil? || tag.types.nil?
|
|
153
|
+
return Pin::ProxyType.anonymous(ComplexType.try_parse(*tag.types))
|
|
154
|
+
end
|
|
155
|
+
Pin::ProxyType.anonymous(ComplexType::UNDEFINED)
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
# @param docstring [YARD::Docstring]
|
|
159
|
+
# @param context [ComplexType]
|
|
160
|
+
# @return [ComplexType]
|
|
161
|
+
def extra_return_type docstring, context
|
|
162
|
+
if docstring.has_tag?(:return_single_parameter) && context.subtypes.one?
|
|
163
|
+
return context.subtypes.first
|
|
164
|
+
elsif docstring.has_tag?(:return_value_parameter) && context.value_types.one?
|
|
165
|
+
return context.value_types.first
|
|
166
|
+
end
|
|
167
|
+
nil
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
# @param arguments [Array<Chain>]
|
|
171
|
+
# @param parameters [Array<String>]
|
|
172
|
+
# @return [Boolean]
|
|
173
|
+
def arguments_match arguments, parameters
|
|
174
|
+
argcount = arguments.length
|
|
175
|
+
# argcount -= 1 if !arguments.empty? && arguments.last.links.first.word.start_with?('&')
|
|
176
|
+
parcount = parameters.length
|
|
177
|
+
parcount -= 1 if !parameters.empty? && parameters.last.first.start_with?('&')
|
|
178
|
+
return false if argcount < parcount && !(argcount == parcount - 1 && parameters.last.first.start_with?('*'))
|
|
179
|
+
true
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
class Source
|
|
5
|
+
# A change to be applied to text.
|
|
6
|
+
#
|
|
7
|
+
class Change
|
|
8
|
+
include EncodingFixes
|
|
9
|
+
|
|
10
|
+
# @return [Range]
|
|
11
|
+
attr_reader :range
|
|
12
|
+
|
|
13
|
+
# @return [String]
|
|
14
|
+
attr_reader :new_text
|
|
15
|
+
|
|
16
|
+
# @param range [Range] The starting and ending positions of the change.
|
|
17
|
+
# If nil, the original text will be overwritten.
|
|
18
|
+
# @param new_text [String] The text to be changed.
|
|
19
|
+
def initialize range, new_text
|
|
20
|
+
@range = range
|
|
21
|
+
@new_text = new_text
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Write the change to the specified text.
|
|
25
|
+
#
|
|
26
|
+
# @param text [String] The text to be changed.
|
|
27
|
+
# @param nullable [Boolean] If true, minor changes that could generate
|
|
28
|
+
# syntax errors will be repaired.
|
|
29
|
+
# @return [String] The updated text.
|
|
30
|
+
def write text, nullable = false
|
|
31
|
+
if nullable and !range.nil? and new_text.match(/[\.\[\{\(@\$:]$/)
|
|
32
|
+
[':', '@'].each do |dupable|
|
|
33
|
+
next unless new_text == dupable
|
|
34
|
+
offset = Position.to_offset(text, range.start)
|
|
35
|
+
if text[offset - 1] == dupable
|
|
36
|
+
p = Position.from_offset(text, offset - 1)
|
|
37
|
+
r = Change.new(Range.new(p, range.start), ' ')
|
|
38
|
+
text = r.write(text)
|
|
39
|
+
end
|
|
40
|
+
break
|
|
41
|
+
end
|
|
42
|
+
commit text, "#{new_text[0..-2]} "
|
|
43
|
+
elsif range.nil?
|
|
44
|
+
new_text
|
|
45
|
+
else
|
|
46
|
+
commit text, new_text
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Repair an update by replacing the new text with similarly formatted
|
|
51
|
+
# whitespace.
|
|
52
|
+
#
|
|
53
|
+
# @param text [String] The text to be changed.
|
|
54
|
+
# @return [String] The updated text.
|
|
55
|
+
def repair text
|
|
56
|
+
fixed = new_text.gsub(/[^\s]/, ' ')
|
|
57
|
+
if range.nil?
|
|
58
|
+
fixed
|
|
59
|
+
else
|
|
60
|
+
result = commit text, fixed
|
|
61
|
+
off = Position.to_offset(text, range.start)
|
|
62
|
+
match = result[0, off].match(/[\.:]+\z/)
|
|
63
|
+
if match
|
|
64
|
+
result = result[0, off].sub(/#{match[0]}\z/, ' ' * match[0].length) + result[off..-1]
|
|
65
|
+
end
|
|
66
|
+
result
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
private
|
|
71
|
+
|
|
72
|
+
def commit text, insert
|
|
73
|
+
start_offset = Position.to_offset(text, range.start)
|
|
74
|
+
end_offset = Position.to_offset(text, range.ending)
|
|
75
|
+
(start_offset == 0 ? '' : text[0..start_offset-1].to_s) + normalize(insert) + text[end_offset..-1].to_s
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|