solargraph 0.32.1 → 0.32.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +9 -0
- data/.rspec +2 -0
- data/.rubocop.yml +6 -0
- data/.travis.yml +25 -0
- data/EXAMPLES.md +76 -0
- data/Gemfile +3 -0
- data/LANGUAGE_SERVER.md +51 -0
- data/LICENSE +21 -0
- data/OVERVIEW.md +37 -0
- data/README.md +106 -0
- data/Rakefile +14 -0
- data/SERVER.md +95 -0
- data/bin/solargraph +0 -0
- data/bin/solargraph-runtime +5 -5
- data/lib/solargraph.rb +54 -54
- data/lib/solargraph/api_map.rb +659 -659
- data/lib/solargraph/api_map/cache.rb +49 -49
- data/lib/solargraph/api_map/source_to_yard.rb +67 -67
- data/lib/solargraph/api_map/store.rb +201 -201
- data/lib/solargraph/bundle.rb +24 -24
- data/lib/solargraph/complex_type.rb +150 -150
- data/lib/solargraph/complex_type/type_methods.rb +124 -124
- data/lib/solargraph/complex_type/unique_type.rb +44 -44
- data/lib/solargraph/core_fills.rb +37 -37
- data/lib/solargraph/diagnostics.rb +52 -52
- data/lib/solargraph/diagnostics/base.rb +20 -20
- data/lib/solargraph/diagnostics/require_not_found.rb +28 -28
- data/lib/solargraph/diagnostics/rubocop.rb +98 -98
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +46 -46
- data/lib/solargraph/diagnostics/type_not_defined.rb +108 -108
- data/lib/solargraph/diagnostics/update_errors.rb +38 -38
- data/lib/solargraph/language_server/completion_item_kinds.rb +33 -33
- data/lib/solargraph/language_server/error_codes.rb +18 -18
- data/lib/solargraph/language_server/host.rb +684 -681
- data/lib/solargraph/language_server/host/cataloger.rb +54 -79
- data/lib/solargraph/language_server/host/diagnoser.rb +80 -80
- data/lib/solargraph/language_server/host/dispatch.rb +112 -113
- data/lib/solargraph/language_server/host/sources.rb +138 -138
- data/lib/solargraph/language_server/message.rb +90 -90
- data/lib/solargraph/language_server/message/base.rb +83 -83
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +40 -40
- data/lib/solargraph/language_server/message/exit_notification.rb +11 -11
- data/lib/solargraph/language_server/message/extended.rb +19 -19
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +86 -86
- data/lib/solargraph/language_server/message/extended/document.rb +18 -18
- data/lib/solargraph/language_server/message/extended/document_gems.rb +30 -30
- data/lib/solargraph/language_server/message/extended/environment.rb +20 -20
- data/lib/solargraph/language_server/message/extended/search.rb +18 -18
- data/lib/solargraph/language_server/message/initialize.rb +141 -141
- data/lib/solargraph/language_server/message/initialized.rb +23 -23
- data/lib/solargraph/language_server/message/shutdown.rb +11 -11
- data/lib/solargraph/language_server/message/text_document.rb +25 -25
- data/lib/solargraph/language_server/message/text_document/completion.rb +51 -51
- data/lib/solargraph/language_server/message/text_document/definition.rb +18 -18
- data/lib/solargraph/language_server/message/text_document/did_change.rb +13 -13
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +21 -21
- data/lib/solargraph/language_server/message/text_document/folding_range.rb +24 -24
- data/lib/solargraph/language_server/message/text_document/formatting.rb +50 -50
- data/lib/solargraph/language_server/message/text_document/hover.rb +31 -31
- data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +32 -32
- data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +9 -9
- data/lib/solargraph/language_server/message/text_document/references.rb +14 -14
- data/lib/solargraph/language_server/message/text_document/rename.rb +17 -17
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +19 -19
- data/lib/solargraph/language_server/message/workspace.rb +12 -12
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +29 -29
- data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +29 -27
- data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -24
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +21 -21
- data/lib/solargraph/language_server/request.rb +22 -22
- data/lib/solargraph/language_server/symbol_kinds.rb +34 -34
- data/lib/solargraph/language_server/transport.rb +11 -11
- data/lib/solargraph/language_server/transport/adapter.rb +60 -60
- data/lib/solargraph/language_server/transport/data_reader.rb +66 -66
- data/lib/solargraph/language_server/uri_helpers.rb +25 -25
- data/lib/solargraph/library.rb +421 -419
- data/lib/solargraph/live_map.rb +126 -126
- data/lib/solargraph/live_map/cache.rb +38 -38
- data/lib/solargraph/location.rb +31 -31
- data/lib/solargraph/logging.rb +25 -25
- data/lib/solargraph/page.rb +68 -68
- data/lib/solargraph/pin.rb +50 -50
- data/lib/solargraph/pin/attribute.rb +41 -41
- data/lib/solargraph/pin/base.rb +280 -280
- data/lib/solargraph/pin/base_method.rb +76 -76
- data/lib/solargraph/pin/base_variable.rb +72 -72
- data/lib/solargraph/pin/block.rb +32 -32
- data/lib/solargraph/pin/block_parameter.rb +103 -103
- data/lib/solargraph/pin/class_variable.rb +9 -9
- data/lib/solargraph/pin/constant.rb +30 -30
- data/lib/solargraph/pin/conversions.rb +79 -79
- data/lib/solargraph/pin/documenting.rb +41 -41
- data/lib/solargraph/pin/duck_method.rb +14 -14
- data/lib/solargraph/pin/global_variable.rb +9 -9
- data/lib/solargraph/pin/instance_variable.rb +9 -9
- data/lib/solargraph/pin/keyword.rb +17 -17
- data/lib/solargraph/pin/local_variable.rb +23 -23
- data/lib/solargraph/pin/localized.rb +22 -22
- data/lib/solargraph/pin/method.rb +126 -126
- data/lib/solargraph/pin/method_alias.rb +30 -30
- data/lib/solargraph/pin/method_parameter.rb +40 -40
- data/lib/solargraph/pin/namespace.rb +54 -54
- data/lib/solargraph/pin/plugin/method.rb +25 -25
- data/lib/solargraph/pin/proxy_type.rb +35 -35
- data/lib/solargraph/pin/reference.rb +22 -22
- data/lib/solargraph/pin/reference/extend.rb +11 -11
- data/lib/solargraph/pin/reference/include.rb +11 -11
- data/lib/solargraph/pin/reference/require.rb +15 -15
- data/lib/solargraph/pin/reference/superclass.rb +11 -11
- data/lib/solargraph/pin/symbol.rb +44 -44
- data/lib/solargraph/pin/yard_pin.rb +10 -10
- data/lib/solargraph/pin/yard_pin/constant.rb +14 -14
- data/lib/solargraph/pin/yard_pin/method.rb +35 -35
- data/lib/solargraph/pin/yard_pin/namespace.rb +19 -19
- data/lib/solargraph/pin/yard_pin/yard_mixin.rb +14 -14
- data/lib/solargraph/plugin.rb +8 -8
- data/lib/solargraph/plugin/base.rb +41 -41
- data/lib/solargraph/plugin/canceler.rb +11 -11
- data/lib/solargraph/plugin/process.rb +172 -172
- data/lib/solargraph/plugin/runtime.rb +134 -134
- data/lib/solargraph/position.rb +110 -110
- data/lib/solargraph/range.rb +83 -83
- data/lib/solargraph/server_methods.rb +14 -14
- data/lib/solargraph/shell.rb +102 -102
- data/lib/solargraph/source.rb +521 -521
- data/lib/solargraph/source/chain.rb +120 -120
- data/lib/solargraph/source/chain/call.rb +107 -107
- data/lib/solargraph/source/chain/class_variable.rb +11 -11
- data/lib/solargraph/source/chain/constant.rb +30 -30
- data/lib/solargraph/source/chain/global_variable.rb +11 -11
- data/lib/solargraph/source/chain/head.rb +33 -33
- data/lib/solargraph/source/chain/instance_variable.rb +11 -11
- data/lib/solargraph/source/chain/link.rb +33 -33
- data/lib/solargraph/source/chain/literal.rb +21 -21
- data/lib/solargraph/source/chain/variable.rb +11 -11
- data/lib/solargraph/source/change.rb +77 -77
- data/lib/solargraph/source/cursor.rb +157 -157
- data/lib/solargraph/source/node_chainer.rb +96 -96
- data/lib/solargraph/source/node_methods.rb +225 -225
- data/lib/solargraph/source/source_chainer.rb +183 -183
- data/lib/solargraph/source_map.rb +169 -169
- data/lib/solargraph/source_map/clip.rb +145 -145
- data/lib/solargraph/source_map/completion.rb +21 -21
- data/lib/solargraph/source_map/mapper.rb +149 -149
- data/lib/solargraph/source_map/node_processor.rb +78 -78
- data/lib/solargraph/source_map/node_processor/alias_node.rb +19 -19
- data/lib/solargraph/source_map/node_processor/args_node.rb +28 -28
- data/lib/solargraph/source_map/node_processor/base.rb +68 -68
- data/lib/solargraph/source_map/node_processor/begin_node.rb +11 -11
- data/lib/solargraph/source_map/node_processor/block_node.rb +14 -14
- data/lib/solargraph/source_map/node_processor/casgn_node.rb +14 -14
- data/lib/solargraph/source_map/node_processor/cvasgn_node.rb +14 -14
- data/lib/solargraph/source_map/node_processor/def_node.rb +54 -54
- data/lib/solargraph/source_map/node_processor/defs_node.rb +21 -21
- data/lib/solargraph/source_map/node_processor/gvasgn_node.rb +12 -12
- data/lib/solargraph/source_map/node_processor/ivasgn_node.rb +18 -18
- data/lib/solargraph/source_map/node_processor/lvasgn_node.rb +16 -16
- data/lib/solargraph/source_map/node_processor/namespace_node.rb +26 -26
- data/lib/solargraph/source_map/node_processor/orasgn_node.rb +12 -12
- data/lib/solargraph/source_map/node_processor/sclass_node.rb +11 -11
- data/lib/solargraph/source_map/node_processor/send_node.rb +162 -162
- data/lib/solargraph/source_map/node_processor/sym_node.rb +11 -11
- data/lib/solargraph/source_map/region.rb +58 -58
- data/lib/solargraph/version.rb +3 -3
- data/lib/solargraph/views/environment.erb +53 -53
- data/lib/solargraph/workspace.rb +183 -183
- data/lib/solargraph/workspace/config.rb +170 -170
- data/lib/solargraph/yard_map.rb +298 -298
- data/lib/solargraph/yard_map/cache.rb +17 -17
- data/lib/solargraph/yard_map/core_docs.rb +163 -163
- data/lib/solargraph/yard_map/core_gen.rb +76 -76
- data/lib/yard-coregen.rb +16 -16
- data/lib/yard-solargraph.rb +18 -18
- data/solargraph.gemspec +37 -0
- data/travis-bundler.rb +10 -0
- metadata +19 -6
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
module Solargraph
|
|
2
|
-
class SourceMap
|
|
3
|
-
module NodeProcessor
|
|
4
|
-
class DefsNode < DefNode
|
|
5
|
-
def process
|
|
6
|
-
s_visi = region.visibility
|
|
7
|
-
s_visi = :public if s_visi == :module_function || region.scope != :class
|
|
8
|
-
if node.children[0].is_a?(AST::Node) && node.children[0].type == :self
|
|
9
|
-
dfqn = region.namespace
|
|
10
|
-
else
|
|
11
|
-
dfqn = unpack_name(node.children[0])
|
|
12
|
-
end
|
|
13
|
-
unless dfqn.nil?
|
|
14
|
-
pins.push Solargraph::Pin::Method.new(get_node_location(node), dfqn, "#{node.children[1]}", comments_for(node), :class, s_visi, method_args, node)
|
|
15
|
-
process_children region.update(namespace: dfqn)
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
end
|
|
1
|
+
module Solargraph
|
|
2
|
+
class SourceMap
|
|
3
|
+
module NodeProcessor
|
|
4
|
+
class DefsNode < DefNode
|
|
5
|
+
def process
|
|
6
|
+
s_visi = region.visibility
|
|
7
|
+
s_visi = :public if s_visi == :module_function || region.scope != :class
|
|
8
|
+
if node.children[0].is_a?(AST::Node) && node.children[0].type == :self
|
|
9
|
+
dfqn = region.namespace
|
|
10
|
+
else
|
|
11
|
+
dfqn = unpack_name(node.children[0])
|
|
12
|
+
end
|
|
13
|
+
unless dfqn.nil?
|
|
14
|
+
pins.push Solargraph::Pin::Method.new(get_node_location(node), dfqn, "#{node.children[1]}", comments_for(node), :class, s_visi, method_args, node)
|
|
15
|
+
process_children region.update(namespace: dfqn)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
module Solargraph
|
|
2
|
-
class SourceMap
|
|
3
|
-
module NodeProcessor
|
|
4
|
-
class GvasgnNode < Base
|
|
5
|
-
def process
|
|
6
|
-
pins.push Solargraph::Pin::GlobalVariable.new(get_node_location(node), region.namespace, node.children[0].to_s, comments_for(node), node.children[1], infer_literal_node_type(node.children[1]), pins.first.context)
|
|
7
|
-
process_children
|
|
8
|
-
end
|
|
9
|
-
end
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
end
|
|
1
|
+
module Solargraph
|
|
2
|
+
class SourceMap
|
|
3
|
+
module NodeProcessor
|
|
4
|
+
class GvasgnNode < Base
|
|
5
|
+
def process
|
|
6
|
+
pins.push Solargraph::Pin::GlobalVariable.new(get_node_location(node), region.namespace, node.children[0].to_s, comments_for(node), node.children[1], infer_literal_node_type(node.children[1]), pins.first.context)
|
|
7
|
+
process_children
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
module Solargraph
|
|
2
|
-
class SourceMap
|
|
3
|
-
module NodeProcessor
|
|
4
|
-
class IvasgnNode < Base
|
|
5
|
-
def process
|
|
6
|
-
here = get_node_start_position(node)
|
|
7
|
-
named_path = named_path_pin(here)
|
|
8
|
-
pins.push Solargraph::Pin::InstanceVariable.new(get_node_location(node), region.namespace,node.children[0].to_s, comments_for(node), node.children[1], infer_literal_node_type(node.children[1]), named_path.context)
|
|
9
|
-
if region.visibility == :module_function and named_path.kind == Pin::METHOD
|
|
10
|
-
other = ComplexType.try_parse("Module<#{named_path.context.namespace}>")
|
|
11
|
-
pins.push Solargraph::Pin::InstanceVariable.new(get_node_location(node), region.namespace,node.children[0].to_s, comments_for(node), node.children[1], infer_literal_node_type(node.children[1]), other)
|
|
12
|
-
end
|
|
13
|
-
process_children
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
end
|
|
1
|
+
module Solargraph
|
|
2
|
+
class SourceMap
|
|
3
|
+
module NodeProcessor
|
|
4
|
+
class IvasgnNode < Base
|
|
5
|
+
def process
|
|
6
|
+
here = get_node_start_position(node)
|
|
7
|
+
named_path = named_path_pin(here)
|
|
8
|
+
pins.push Solargraph::Pin::InstanceVariable.new(get_node_location(node), region.namespace,node.children[0].to_s, comments_for(node), node.children[1], infer_literal_node_type(node.children[1]), named_path.context)
|
|
9
|
+
if region.visibility == :module_function and named_path.kind == Pin::METHOD
|
|
10
|
+
other = ComplexType.try_parse("Module<#{named_path.context.namespace}>")
|
|
11
|
+
pins.push Solargraph::Pin::InstanceVariable.new(get_node_location(node), region.namespace,node.children[0].to_s, comments_for(node), node.children[1], infer_literal_node_type(node.children[1]), other)
|
|
12
|
+
end
|
|
13
|
+
process_children
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
module Solargraph
|
|
2
|
-
class SourceMap
|
|
3
|
-
module NodeProcessor
|
|
4
|
-
class LvasgnNode < Base
|
|
5
|
-
def process
|
|
6
|
-
here = get_node_start_position(node)
|
|
7
|
-
context = named_path_pin(here)
|
|
8
|
-
block = block_pin(here)
|
|
9
|
-
presence = Range.new(here, block.location.range.ending)
|
|
10
|
-
pins.push Solargraph::Pin::LocalVariable.new(get_node_location(node), region.namespace, node.children[0].to_s, comments_for(node), node.children[1], infer_literal_node_type(node.children[1]), context.context, block, presence)
|
|
11
|
-
process_children
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
end
|
|
1
|
+
module Solargraph
|
|
2
|
+
class SourceMap
|
|
3
|
+
module NodeProcessor
|
|
4
|
+
class LvasgnNode < Base
|
|
5
|
+
def process
|
|
6
|
+
here = get_node_start_position(node)
|
|
7
|
+
context = named_path_pin(here)
|
|
8
|
+
block = block_pin(here)
|
|
9
|
+
presence = Range.new(here, block.location.range.ending)
|
|
10
|
+
pins.push Solargraph::Pin::LocalVariable.new(get_node_location(node), region.namespace, node.children[0].to_s, comments_for(node), node.children[1], infer_literal_node_type(node.children[1]), context.context, block, presence)
|
|
11
|
+
process_children
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
module Solargraph
|
|
2
|
-
class SourceMap
|
|
3
|
-
module NodeProcessor
|
|
4
|
-
class NamespaceNode < Base
|
|
5
|
-
def process
|
|
6
|
-
visibility = :public
|
|
7
|
-
if node.children[0].kind_of?(AST::Node) and node.children[0].children[0].kind_of?(AST::Node) and node.children[0].children[0].type == :cbase
|
|
8
|
-
tree = pack_name(node.children[0])
|
|
9
|
-
tree.shift if tree.first.empty?
|
|
10
|
-
else
|
|
11
|
-
tree = region.namespace.empty? ? [] : [region.namespace]
|
|
12
|
-
tree.concat pack_name(node.children[0])
|
|
13
|
-
end
|
|
14
|
-
fqn = tree.join('::')
|
|
15
|
-
sc = nil
|
|
16
|
-
if node.type == :class and !node.children[1].nil?
|
|
17
|
-
sc = unpack_name(node.children[1])
|
|
18
|
-
end
|
|
19
|
-
pins.push Solargraph::Pin::Namespace.new(get_node_location(node), tree[0..-2].join('::') || '', pack_name(node.children[0]).last.to_s, comments_for(node), node.type, visibility)
|
|
20
|
-
pins.push Pin::Reference::Superclass.new(pins.last.location, pins.last.path, sc) unless sc.nil?
|
|
21
|
-
process_children region.update(namespace: fqn, scope: :instance, visibility: :public)
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
end
|
|
1
|
+
module Solargraph
|
|
2
|
+
class SourceMap
|
|
3
|
+
module NodeProcessor
|
|
4
|
+
class NamespaceNode < Base
|
|
5
|
+
def process
|
|
6
|
+
visibility = :public
|
|
7
|
+
if node.children[0].kind_of?(AST::Node) and node.children[0].children[0].kind_of?(AST::Node) and node.children[0].children[0].type == :cbase
|
|
8
|
+
tree = pack_name(node.children[0])
|
|
9
|
+
tree.shift if tree.first.empty?
|
|
10
|
+
else
|
|
11
|
+
tree = region.namespace.empty? ? [] : [region.namespace]
|
|
12
|
+
tree.concat pack_name(node.children[0])
|
|
13
|
+
end
|
|
14
|
+
fqn = tree.join('::')
|
|
15
|
+
sc = nil
|
|
16
|
+
if node.type == :class and !node.children[1].nil?
|
|
17
|
+
sc = unpack_name(node.children[1])
|
|
18
|
+
end
|
|
19
|
+
pins.push Solargraph::Pin::Namespace.new(get_node_location(node), tree[0..-2].join('::') || '', pack_name(node.children[0]).last.to_s, comments_for(node), node.type, visibility)
|
|
20
|
+
pins.push Pin::Reference::Superclass.new(pins.last.location, pins.last.path, sc) unless sc.nil?
|
|
21
|
+
process_children region.update(namespace: fqn, scope: :instance, visibility: :public)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
module Solargraph
|
|
2
|
-
class SourceMap
|
|
3
|
-
module NodeProcessor
|
|
4
|
-
class OrasgnNode < Base
|
|
5
|
-
def process
|
|
6
|
-
new_node = node.updated(node.children[0].type, node.children[0].children + [node.children[1]])
|
|
7
|
-
NodeProcessor.process(new_node, region, pins)
|
|
8
|
-
end
|
|
9
|
-
end
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
end
|
|
1
|
+
module Solargraph
|
|
2
|
+
class SourceMap
|
|
3
|
+
module NodeProcessor
|
|
4
|
+
class OrasgnNode < Base
|
|
5
|
+
def process
|
|
6
|
+
new_node = node.updated(node.children[0].type, node.children[0].children + [node.children[1]])
|
|
7
|
+
NodeProcessor.process(new_node, region, pins)
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
module Solargraph
|
|
2
|
-
class SourceMap
|
|
3
|
-
module NodeProcessor
|
|
4
|
-
class SclassNode < Base
|
|
5
|
-
def process
|
|
6
|
-
process_children region.update(visibility: :public, scope: :class)
|
|
7
|
-
end
|
|
8
|
-
end
|
|
9
|
-
end
|
|
10
|
-
end
|
|
11
|
-
end
|
|
1
|
+
module Solargraph
|
|
2
|
+
class SourceMap
|
|
3
|
+
module NodeProcessor
|
|
4
|
+
class SclassNode < Base
|
|
5
|
+
def process
|
|
6
|
+
process_children region.update(visibility: :public, scope: :class)
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
@@ -1,162 +1,162 @@
|
|
|
1
|
-
module Solargraph
|
|
2
|
-
class SourceMap
|
|
3
|
-
module NodeProcessor
|
|
4
|
-
class SendNode < Base
|
|
5
|
-
def process
|
|
6
|
-
if node.children[0].nil?
|
|
7
|
-
if [:private, :public, :protected].include?(node.children[1])
|
|
8
|
-
if (node.children.length > 2)
|
|
9
|
-
node.children[2..-1].each do |child|
|
|
10
|
-
next unless child.is_a?(AST::Node) && (child.type == :sym || child.type == :str)
|
|
11
|
-
name = child.children[0].to_s
|
|
12
|
-
matches = pins.select{ |pin| [Pin::METHOD, Pin::ATTRIBUTE].include?(pin.kind) && pin.name == name && pin.namespace == region.namespace && pin.context.scope == region.scope }
|
|
13
|
-
matches.each do |pin|
|
|
14
|
-
# @todo Smelly instance variable access
|
|
15
|
-
pin.instance_variable_set(:@visibility, node.children[1])
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
else
|
|
19
|
-
# @todo Smelly instance variable access
|
|
20
|
-
region.instance_variable_set(:@visibility, node.children[1])
|
|
21
|
-
end
|
|
22
|
-
elsif node.children[1] == :module_function
|
|
23
|
-
process_module_function
|
|
24
|
-
elsif [:attr_reader, :attr_writer, :attr_accessor].include?(node.children[1])
|
|
25
|
-
process_attribute
|
|
26
|
-
elsif node.children[1] == :include
|
|
27
|
-
process_include
|
|
28
|
-
elsif node.children[1] == :extend
|
|
29
|
-
process_extend
|
|
30
|
-
elsif node.children[1] == :require
|
|
31
|
-
process_require
|
|
32
|
-
elsif node.children[1] == :private_constant
|
|
33
|
-
process_private_constant
|
|
34
|
-
elsif node.children[1] == :alias_method && node.children[2] && node.children[2] && node.children[2].type == :sym && node.children[3] && node.children[3].type == :sym
|
|
35
|
-
process_alias_method
|
|
36
|
-
elsif node.children[1] == :private_class_method && node.children[2].kind_of?(AST::Node)
|
|
37
|
-
# Processing a private class can potentially handle children on its own
|
|
38
|
-
return if process_private_class_method
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
process_children
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
private
|
|
45
|
-
|
|
46
|
-
def process_attribute
|
|
47
|
-
node.children[2..-1].each do |a|
|
|
48
|
-
if node.children[1] == :attr_reader || node.children[1] == :attr_accessor
|
|
49
|
-
pins.push Solargraph::Pin::Attribute.new(get_node_location(node), region.namespace, "#{a.children[0]}", comments_for(node), :reader, region.scope, region.visibility)
|
|
50
|
-
end
|
|
51
|
-
if node.children[1] == :attr_writer || node.children[1] == :attr_accessor
|
|
52
|
-
pins.push Solargraph::Pin::Attribute.new(get_node_location(node), region.namespace, "#{a.children[0]}=", comments_for(node), :writer, region.scope, region.visibility)
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
def process_include
|
|
58
|
-
if node.children[2].kind_of?(AST::Node) && node.children[2].type == :const
|
|
59
|
-
node.children[2..-1].each do |i|
|
|
60
|
-
nspin = pins.select{|pin| pin.kind == Pin::NAMESPACE and pin.path == region.namespace}.last
|
|
61
|
-
unless nspin.nil?
|
|
62
|
-
pins.push Pin::Reference::Include.new(get_node_location(node), nspin.path, unpack_name(i))
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
def process_extend
|
|
69
|
-
node.children[2..-1].each do |i|
|
|
70
|
-
nspin = pins.select{|pin| pin.kind == Pin::NAMESPACE and pin.path == region.namespace}.last
|
|
71
|
-
unless nspin.nil?
|
|
72
|
-
ref = nil
|
|
73
|
-
if i.type == :self
|
|
74
|
-
ref = Pin::Reference::Extend.new(get_node_location(node), nspin.path, nspin.path)
|
|
75
|
-
elsif i.type == :const
|
|
76
|
-
ref = Pin::Reference::Extend.new(get_node_location(node), nspin.path, unpack_name(i))
|
|
77
|
-
end
|
|
78
|
-
pins.push ref unless ref.nil?
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
def process_require
|
|
84
|
-
if node.children[2].kind_of?(AST::Node) && node.children[2].type == :str
|
|
85
|
-
pins.push Pin::Reference::Require.new(get_node_location(node), node.children[2].children[0].to_s)
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
def process_module_function
|
|
90
|
-
if node.children[2].nil?
|
|
91
|
-
# @todo Smelly instance variable access
|
|
92
|
-
region.instance_variable_set(:@visibility, :module_function)
|
|
93
|
-
elsif node.children[2].type == :sym || node.children[2].type == :str
|
|
94
|
-
# @todo What to do about references?
|
|
95
|
-
node.children[2..-1].each do |x|
|
|
96
|
-
cn = x.children[0].to_s
|
|
97
|
-
ref = pins.select{|p| [Solargraph::Pin::Method, Solargraph::Pin::Attribute].include?(p.class) && p.namespace == region.namespace && p.name == cn}.first
|
|
98
|
-
unless ref.nil?
|
|
99
|
-
pins.delete ref
|
|
100
|
-
mm = Solargraph::Pin::Method.new(ref.location, ref.namespace, ref.name, ref.comments, :class, :public, ref.parameters, ref.node)
|
|
101
|
-
cm = Solargraph::Pin::Method.new(ref.location, ref.namespace, ref.name, ref.comments, :instance, :private, ref.parameters, ref.node)
|
|
102
|
-
pins.push mm, cm
|
|
103
|
-
pins.select{|pin| pin.kind == Pin::INSTANCE_VARIABLE and pin.context == ref.context}.each do |ivar|
|
|
104
|
-
pins.delete ivar
|
|
105
|
-
pins.push Solargraph::Pin::InstanceVariable.new(ivar.location, ivar.namespace, ivar.name, ivar.comments, ivar.signature, ivar.instance_variable_get(:@literal), mm)
|
|
106
|
-
pins.push Solargraph::Pin::InstanceVariable.new(ivar.location, ivar.namespace, ivar.name, ivar.comments, ivar.signature, ivar.instance_variable_get(:@literal), cm)
|
|
107
|
-
end
|
|
108
|
-
end
|
|
109
|
-
end
|
|
110
|
-
elsif node.children[2].type == :def
|
|
111
|
-
NodeProcessor.process node.children[2], region.update(visibility: :module_function), pins
|
|
112
|
-
end
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
def process_private_constant
|
|
116
|
-
if node.children[2] && (node.children[2].type == :sym || node.children[2].type == :str)
|
|
117
|
-
# @todo What to do about references?
|
|
118
|
-
cn = node.children[2].children[0].to_s
|
|
119
|
-
ref = pins.select{|p| [Solargraph::Pin::Namespace, Solargraph::Pin::Constant].include?(p.class) && p.namespace == region.namespace && p.name == cn}.first
|
|
120
|
-
unless ref.nil?
|
|
121
|
-
pins.delete ref
|
|
122
|
-
# Might be either a namespace or constant
|
|
123
|
-
if ref.kind == Pin::CONSTANT
|
|
124
|
-
pins.push ref.class.new(ref.location, ref.namespace, ref.name, ref.comments, ref.signature, ref.return_type, ref.context, :private)
|
|
125
|
-
else
|
|
126
|
-
# pins.push ref.class.new(ref.location, ref.namespace, ref.name, ref.comments, ref.type, :private, (ref.superclass_reference.nil? ? nil : ref.superclass_reference.name))
|
|
127
|
-
pins.push ref.class.new(ref.location, ref.namespace, ref.name, ref.comments, ref.type, :private)
|
|
128
|
-
end
|
|
129
|
-
end
|
|
130
|
-
end
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
def process_alias_method
|
|
134
|
-
pin = pins.select{|p| [Solargraph::Pin::Method, Solargraph::Pin::Attribute].include?(p.class) && p.name == node.children[3].children[0].to_s && p.namespace == region.namespace && p.scope == region.scope}.first
|
|
135
|
-
if pin.nil?
|
|
136
|
-
pins.push Solargraph::Pin::MethodAlias.new(get_node_location(node), region.namespace, node.children[2].children[0].to_s, region.scope, node.children[3].children[0].to_s)
|
|
137
|
-
else
|
|
138
|
-
if pin.is_a?(Solargraph::Pin::Method)
|
|
139
|
-
pins.push Solargraph::Pin::Method.new(get_node_location(node), pin.namespace, node.children[2].children[0].to_s, comments_for(node) || pin.comments, pin.scope, pin.visibility, pin.parameters, pin.node)
|
|
140
|
-
elsif pin.is_a?(Solargraph::Pin::Attribute)
|
|
141
|
-
pins.push Solargraph::Pin::Attribute.new(get_node_location(node), pin.namespace, node.children[2].children[0].to_s, comments_for(node) || pin.comments, pin.access, pin.scope, pin.visibility)
|
|
142
|
-
end
|
|
143
|
-
end
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
def process_private_class_method
|
|
147
|
-
if node.children[2].type == :sym || node.children[2].type == :str
|
|
148
|
-
ref = pins.select{|p| [Solargraph::Pin::Method, Solargraph::Pin::Attribute].include?(p.class) && p.namespace == region.namespace && p.name == node.children[2].children[0].to_s}.first
|
|
149
|
-
unless ref.nil?
|
|
150
|
-
# HACK: Smelly instance variable access
|
|
151
|
-
ref.instance_variable_set(:@visibility, :private)
|
|
152
|
-
end
|
|
153
|
-
false
|
|
154
|
-
else
|
|
155
|
-
process_children region.update(scope: :class, visibility: :private)
|
|
156
|
-
true
|
|
157
|
-
end
|
|
158
|
-
end
|
|
159
|
-
end
|
|
160
|
-
end
|
|
161
|
-
end
|
|
162
|
-
end
|
|
1
|
+
module Solargraph
|
|
2
|
+
class SourceMap
|
|
3
|
+
module NodeProcessor
|
|
4
|
+
class SendNode < Base
|
|
5
|
+
def process
|
|
6
|
+
if node.children[0].nil?
|
|
7
|
+
if [:private, :public, :protected].include?(node.children[1])
|
|
8
|
+
if (node.children.length > 2)
|
|
9
|
+
node.children[2..-1].each do |child|
|
|
10
|
+
next unless child.is_a?(AST::Node) && (child.type == :sym || child.type == :str)
|
|
11
|
+
name = child.children[0].to_s
|
|
12
|
+
matches = pins.select{ |pin| [Pin::METHOD, Pin::ATTRIBUTE].include?(pin.kind) && pin.name == name && pin.namespace == region.namespace && pin.context.scope == region.scope }
|
|
13
|
+
matches.each do |pin|
|
|
14
|
+
# @todo Smelly instance variable access
|
|
15
|
+
pin.instance_variable_set(:@visibility, node.children[1])
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
else
|
|
19
|
+
# @todo Smelly instance variable access
|
|
20
|
+
region.instance_variable_set(:@visibility, node.children[1])
|
|
21
|
+
end
|
|
22
|
+
elsif node.children[1] == :module_function
|
|
23
|
+
process_module_function
|
|
24
|
+
elsif [:attr_reader, :attr_writer, :attr_accessor].include?(node.children[1])
|
|
25
|
+
process_attribute
|
|
26
|
+
elsif node.children[1] == :include
|
|
27
|
+
process_include
|
|
28
|
+
elsif node.children[1] == :extend
|
|
29
|
+
process_extend
|
|
30
|
+
elsif node.children[1] == :require
|
|
31
|
+
process_require
|
|
32
|
+
elsif node.children[1] == :private_constant
|
|
33
|
+
process_private_constant
|
|
34
|
+
elsif node.children[1] == :alias_method && node.children[2] && node.children[2] && node.children[2].type == :sym && node.children[3] && node.children[3].type == :sym
|
|
35
|
+
process_alias_method
|
|
36
|
+
elsif node.children[1] == :private_class_method && node.children[2].kind_of?(AST::Node)
|
|
37
|
+
# Processing a private class can potentially handle children on its own
|
|
38
|
+
return if process_private_class_method
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
process_children
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
private
|
|
45
|
+
|
|
46
|
+
def process_attribute
|
|
47
|
+
node.children[2..-1].each do |a|
|
|
48
|
+
if node.children[1] == :attr_reader || node.children[1] == :attr_accessor
|
|
49
|
+
pins.push Solargraph::Pin::Attribute.new(get_node_location(node), region.namespace, "#{a.children[0]}", comments_for(node), :reader, region.scope, region.visibility)
|
|
50
|
+
end
|
|
51
|
+
if node.children[1] == :attr_writer || node.children[1] == :attr_accessor
|
|
52
|
+
pins.push Solargraph::Pin::Attribute.new(get_node_location(node), region.namespace, "#{a.children[0]}=", comments_for(node), :writer, region.scope, region.visibility)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def process_include
|
|
58
|
+
if node.children[2].kind_of?(AST::Node) && node.children[2].type == :const
|
|
59
|
+
node.children[2..-1].each do |i|
|
|
60
|
+
nspin = pins.select{|pin| pin.kind == Pin::NAMESPACE and pin.path == region.namespace}.last
|
|
61
|
+
unless nspin.nil?
|
|
62
|
+
pins.push Pin::Reference::Include.new(get_node_location(node), nspin.path, unpack_name(i))
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def process_extend
|
|
69
|
+
node.children[2..-1].each do |i|
|
|
70
|
+
nspin = pins.select{|pin| pin.kind == Pin::NAMESPACE and pin.path == region.namespace}.last
|
|
71
|
+
unless nspin.nil?
|
|
72
|
+
ref = nil
|
|
73
|
+
if i.type == :self
|
|
74
|
+
ref = Pin::Reference::Extend.new(get_node_location(node), nspin.path, nspin.path)
|
|
75
|
+
elsif i.type == :const
|
|
76
|
+
ref = Pin::Reference::Extend.new(get_node_location(node), nspin.path, unpack_name(i))
|
|
77
|
+
end
|
|
78
|
+
pins.push ref unless ref.nil?
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def process_require
|
|
84
|
+
if node.children[2].kind_of?(AST::Node) && node.children[2].type == :str
|
|
85
|
+
pins.push Pin::Reference::Require.new(get_node_location(node), node.children[2].children[0].to_s)
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def process_module_function
|
|
90
|
+
if node.children[2].nil?
|
|
91
|
+
# @todo Smelly instance variable access
|
|
92
|
+
region.instance_variable_set(:@visibility, :module_function)
|
|
93
|
+
elsif node.children[2].type == :sym || node.children[2].type == :str
|
|
94
|
+
# @todo What to do about references?
|
|
95
|
+
node.children[2..-1].each do |x|
|
|
96
|
+
cn = x.children[0].to_s
|
|
97
|
+
ref = pins.select{|p| [Solargraph::Pin::Method, Solargraph::Pin::Attribute].include?(p.class) && p.namespace == region.namespace && p.name == cn}.first
|
|
98
|
+
unless ref.nil?
|
|
99
|
+
pins.delete ref
|
|
100
|
+
mm = Solargraph::Pin::Method.new(ref.location, ref.namespace, ref.name, ref.comments, :class, :public, ref.parameters, ref.node)
|
|
101
|
+
cm = Solargraph::Pin::Method.new(ref.location, ref.namespace, ref.name, ref.comments, :instance, :private, ref.parameters, ref.node)
|
|
102
|
+
pins.push mm, cm
|
|
103
|
+
pins.select{|pin| pin.kind == Pin::INSTANCE_VARIABLE and pin.context == ref.context}.each do |ivar|
|
|
104
|
+
pins.delete ivar
|
|
105
|
+
pins.push Solargraph::Pin::InstanceVariable.new(ivar.location, ivar.namespace, ivar.name, ivar.comments, ivar.signature, ivar.instance_variable_get(:@literal), mm)
|
|
106
|
+
pins.push Solargraph::Pin::InstanceVariable.new(ivar.location, ivar.namespace, ivar.name, ivar.comments, ivar.signature, ivar.instance_variable_get(:@literal), cm)
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
elsif node.children[2].type == :def
|
|
111
|
+
NodeProcessor.process node.children[2], region.update(visibility: :module_function), pins
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def process_private_constant
|
|
116
|
+
if node.children[2] && (node.children[2].type == :sym || node.children[2].type == :str)
|
|
117
|
+
# @todo What to do about references?
|
|
118
|
+
cn = node.children[2].children[0].to_s
|
|
119
|
+
ref = pins.select{|p| [Solargraph::Pin::Namespace, Solargraph::Pin::Constant].include?(p.class) && p.namespace == region.namespace && p.name == cn}.first
|
|
120
|
+
unless ref.nil?
|
|
121
|
+
pins.delete ref
|
|
122
|
+
# Might be either a namespace or constant
|
|
123
|
+
if ref.kind == Pin::CONSTANT
|
|
124
|
+
pins.push ref.class.new(ref.location, ref.namespace, ref.name, ref.comments, ref.signature, ref.return_type, ref.context, :private)
|
|
125
|
+
else
|
|
126
|
+
# pins.push ref.class.new(ref.location, ref.namespace, ref.name, ref.comments, ref.type, :private, (ref.superclass_reference.nil? ? nil : ref.superclass_reference.name))
|
|
127
|
+
pins.push ref.class.new(ref.location, ref.namespace, ref.name, ref.comments, ref.type, :private)
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def process_alias_method
|
|
134
|
+
pin = pins.select{|p| [Solargraph::Pin::Method, Solargraph::Pin::Attribute].include?(p.class) && p.name == node.children[3].children[0].to_s && p.namespace == region.namespace && p.scope == region.scope}.first
|
|
135
|
+
if pin.nil?
|
|
136
|
+
pins.push Solargraph::Pin::MethodAlias.new(get_node_location(node), region.namespace, node.children[2].children[0].to_s, region.scope, node.children[3].children[0].to_s)
|
|
137
|
+
else
|
|
138
|
+
if pin.is_a?(Solargraph::Pin::Method)
|
|
139
|
+
pins.push Solargraph::Pin::Method.new(get_node_location(node), pin.namespace, node.children[2].children[0].to_s, comments_for(node) || pin.comments, pin.scope, pin.visibility, pin.parameters, pin.node)
|
|
140
|
+
elsif pin.is_a?(Solargraph::Pin::Attribute)
|
|
141
|
+
pins.push Solargraph::Pin::Attribute.new(get_node_location(node), pin.namespace, node.children[2].children[0].to_s, comments_for(node) || pin.comments, pin.access, pin.scope, pin.visibility)
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def process_private_class_method
|
|
147
|
+
if node.children[2].type == :sym || node.children[2].type == :str
|
|
148
|
+
ref = pins.select{|p| [Solargraph::Pin::Method, Solargraph::Pin::Attribute].include?(p.class) && p.namespace == region.namespace && p.name == node.children[2].children[0].to_s}.first
|
|
149
|
+
unless ref.nil?
|
|
150
|
+
# HACK: Smelly instance variable access
|
|
151
|
+
ref.instance_variable_set(:@visibility, :private)
|
|
152
|
+
end
|
|
153
|
+
false
|
|
154
|
+
else
|
|
155
|
+
process_children region.update(scope: :class, visibility: :private)
|
|
156
|
+
true
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
end
|