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,76 +1,76 @@
|
|
|
1
|
-
module Solargraph
|
|
2
|
-
module Pin
|
|
3
|
-
# The base class for method and attribute pins.
|
|
4
|
-
#
|
|
5
|
-
class BaseMethod < Base
|
|
6
|
-
# @return [Symbol] :instance or :class
|
|
7
|
-
attr_reader :scope
|
|
8
|
-
|
|
9
|
-
# @return [Symbol] :public, :private, or :protected
|
|
10
|
-
attr_reader :visibility
|
|
11
|
-
|
|
12
|
-
def return_complex_type
|
|
13
|
-
@return_complex_type ||= generate_complex_type
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def typify api_map
|
|
17
|
-
decl = super
|
|
18
|
-
return decl unless decl.undefined?
|
|
19
|
-
type = see_reference(api_map)
|
|
20
|
-
return type unless type.nil?
|
|
21
|
-
ComplexType::UNDEFINED
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
private
|
|
25
|
-
|
|
26
|
-
# @return [ComplexType]
|
|
27
|
-
def generate_complex_type
|
|
28
|
-
tag = docstring.tag(:return)
|
|
29
|
-
if tag.nil?
|
|
30
|
-
ol = docstring.tag(:overload)
|
|
31
|
-
tag = ol.tag(:return) unless ol.nil?
|
|
32
|
-
end
|
|
33
|
-
return ComplexType::UNDEFINED if tag.nil? or tag.types.nil? or tag.types.empty?
|
|
34
|
-
ComplexType.try_parse *tag.types
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
# @param api_map [ApiMap]
|
|
38
|
-
# @return [ComplexType]
|
|
39
|
-
def see_reference api_map
|
|
40
|
-
docstring.ref_tags.each do |ref|
|
|
41
|
-
next unless ref.tag_name == 'return' && ref.owner
|
|
42
|
-
result = resolve_reference(ref.owner.to_s, api_map)
|
|
43
|
-
return result unless result.nil?
|
|
44
|
-
end
|
|
45
|
-
match = comments.match(/\(see (.*)\)/)
|
|
46
|
-
return nil if match.nil?
|
|
47
|
-
resolve_reference match[1], api_map
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
# @param ref [String]
|
|
51
|
-
# @param api_map [ApiMap]
|
|
52
|
-
# @return [ComplexType]
|
|
53
|
-
def resolve_reference ref, api_map
|
|
54
|
-
parts = ref.split(/[\.#]/)
|
|
55
|
-
if parts.first.empty?
|
|
56
|
-
path = "#{namespace}#{ref}"
|
|
57
|
-
else
|
|
58
|
-
fqns = api_map.qualify(parts.first, namespace)
|
|
59
|
-
return ComplexType::UNDEFINED if fqns.nil?
|
|
60
|
-
path = fqns + ref[parts.first.length] + parts.last
|
|
61
|
-
end
|
|
62
|
-
pins = api_map.get_path_pins(path)
|
|
63
|
-
pins.each do |pin|
|
|
64
|
-
type = pin.typify(api_map)
|
|
65
|
-
return type unless type.undefined?
|
|
66
|
-
end
|
|
67
|
-
pins = api_map.get_path_pins(path)
|
|
68
|
-
pins.each do |pin|
|
|
69
|
-
type = pin.typify(api_map)
|
|
70
|
-
return type unless type.undefined?
|
|
71
|
-
end
|
|
72
|
-
nil
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
end
|
|
1
|
+
module Solargraph
|
|
2
|
+
module Pin
|
|
3
|
+
# The base class for method and attribute pins.
|
|
4
|
+
#
|
|
5
|
+
class BaseMethod < Base
|
|
6
|
+
# @return [Symbol] :instance or :class
|
|
7
|
+
attr_reader :scope
|
|
8
|
+
|
|
9
|
+
# @return [Symbol] :public, :private, or :protected
|
|
10
|
+
attr_reader :visibility
|
|
11
|
+
|
|
12
|
+
def return_complex_type
|
|
13
|
+
@return_complex_type ||= generate_complex_type
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def typify api_map
|
|
17
|
+
decl = super
|
|
18
|
+
return decl unless decl.undefined?
|
|
19
|
+
type = see_reference(api_map)
|
|
20
|
+
return type unless type.nil?
|
|
21
|
+
ComplexType::UNDEFINED
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
private
|
|
25
|
+
|
|
26
|
+
# @return [ComplexType]
|
|
27
|
+
def generate_complex_type
|
|
28
|
+
tag = docstring.tag(:return)
|
|
29
|
+
if tag.nil?
|
|
30
|
+
ol = docstring.tag(:overload)
|
|
31
|
+
tag = ol.tag(:return) unless ol.nil?
|
|
32
|
+
end
|
|
33
|
+
return ComplexType::UNDEFINED if tag.nil? or tag.types.nil? or tag.types.empty?
|
|
34
|
+
ComplexType.try_parse *tag.types
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# @param api_map [ApiMap]
|
|
38
|
+
# @return [ComplexType]
|
|
39
|
+
def see_reference api_map
|
|
40
|
+
docstring.ref_tags.each do |ref|
|
|
41
|
+
next unless ref.tag_name == 'return' && ref.owner
|
|
42
|
+
result = resolve_reference(ref.owner.to_s, api_map)
|
|
43
|
+
return result unless result.nil?
|
|
44
|
+
end
|
|
45
|
+
match = comments.match(/\(see (.*)\)/)
|
|
46
|
+
return nil if match.nil?
|
|
47
|
+
resolve_reference match[1], api_map
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# @param ref [String]
|
|
51
|
+
# @param api_map [ApiMap]
|
|
52
|
+
# @return [ComplexType]
|
|
53
|
+
def resolve_reference ref, api_map
|
|
54
|
+
parts = ref.split(/[\.#]/)
|
|
55
|
+
if parts.first.empty?
|
|
56
|
+
path = "#{namespace}#{ref}"
|
|
57
|
+
else
|
|
58
|
+
fqns = api_map.qualify(parts.first, namespace)
|
|
59
|
+
return ComplexType::UNDEFINED if fqns.nil?
|
|
60
|
+
path = fqns + ref[parts.first.length] + parts.last
|
|
61
|
+
end
|
|
62
|
+
pins = api_map.get_path_pins(path)
|
|
63
|
+
pins.each do |pin|
|
|
64
|
+
type = pin.typify(api_map)
|
|
65
|
+
return type unless type.undefined?
|
|
66
|
+
end
|
|
67
|
+
pins = api_map.get_path_pins(path)
|
|
68
|
+
pins.each do |pin|
|
|
69
|
+
type = pin.typify(api_map)
|
|
70
|
+
return type unless type.undefined?
|
|
71
|
+
end
|
|
72
|
+
nil
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
@@ -1,72 +1,72 @@
|
|
|
1
|
-
module Solargraph
|
|
2
|
-
module Pin
|
|
3
|
-
class BaseVariable < Base
|
|
4
|
-
include Solargraph::Source::NodeMethods
|
|
5
|
-
|
|
6
|
-
attr_reader :context
|
|
7
|
-
|
|
8
|
-
attr_reader :assignment
|
|
9
|
-
|
|
10
|
-
def initialize location, namespace, name, comments, assignment, literal, context
|
|
11
|
-
super(location, namespace, name, comments)
|
|
12
|
-
@assignment = assignment
|
|
13
|
-
@literal = literal
|
|
14
|
-
@context = context
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def signature
|
|
18
|
-
@signature ||= resolve_node_signature(@assignment)
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def completion_item_kind
|
|
22
|
-
Solargraph::LanguageServer::CompletionItemKinds::VARIABLE
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
# @return [Integer]
|
|
26
|
-
def symbol_kind
|
|
27
|
-
Solargraph::LanguageServer::SymbolKinds::VARIABLE
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def return_complex_type
|
|
31
|
-
@return_complex_type ||= generate_complex_type
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def nil_assignment?
|
|
35
|
-
return_complex_type.nil?
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def variable?
|
|
39
|
-
true
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
def probe api_map
|
|
43
|
-
return ComplexType::UNDEFINED if @assignment.nil?
|
|
44
|
-
chain = Source::NodeChainer.chain(@assignment, filename)
|
|
45
|
-
clip = api_map.clip_at(location.filename, location.range.start)
|
|
46
|
-
locals = clip.locals - [self]
|
|
47
|
-
chain.infer(api_map, ProxyType.anonymous(context), locals)
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
def == other
|
|
51
|
-
return false unless super
|
|
52
|
-
assignment == other.assignment
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def try_merge! pin
|
|
56
|
-
return false unless super
|
|
57
|
-
@assignment = pin.assignment
|
|
58
|
-
@return_complex_type = pin.return_complex_type
|
|
59
|
-
true
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
private
|
|
63
|
-
|
|
64
|
-
def generate_complex_type
|
|
65
|
-
tag = docstring.tag(:type)
|
|
66
|
-
return ComplexType.try_parse(*tag.types) unless tag.nil? || tag.types.nil? || tag.types.empty?
|
|
67
|
-
return ComplexType.try_parse(@literal) unless @literal.nil?
|
|
68
|
-
ComplexType.new
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
end
|
|
1
|
+
module Solargraph
|
|
2
|
+
module Pin
|
|
3
|
+
class BaseVariable < Base
|
|
4
|
+
include Solargraph::Source::NodeMethods
|
|
5
|
+
|
|
6
|
+
attr_reader :context
|
|
7
|
+
|
|
8
|
+
attr_reader :assignment
|
|
9
|
+
|
|
10
|
+
def initialize location, namespace, name, comments, assignment, literal, context
|
|
11
|
+
super(location, namespace, name, comments)
|
|
12
|
+
@assignment = assignment
|
|
13
|
+
@literal = literal
|
|
14
|
+
@context = context
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def signature
|
|
18
|
+
@signature ||= resolve_node_signature(@assignment)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def completion_item_kind
|
|
22
|
+
Solargraph::LanguageServer::CompletionItemKinds::VARIABLE
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# @return [Integer]
|
|
26
|
+
def symbol_kind
|
|
27
|
+
Solargraph::LanguageServer::SymbolKinds::VARIABLE
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def return_complex_type
|
|
31
|
+
@return_complex_type ||= generate_complex_type
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def nil_assignment?
|
|
35
|
+
return_complex_type.nil?
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def variable?
|
|
39
|
+
true
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def probe api_map
|
|
43
|
+
return ComplexType::UNDEFINED if @assignment.nil?
|
|
44
|
+
chain = Source::NodeChainer.chain(@assignment, filename)
|
|
45
|
+
clip = api_map.clip_at(location.filename, location.range.start)
|
|
46
|
+
locals = clip.locals - [self]
|
|
47
|
+
chain.infer(api_map, ProxyType.anonymous(context), locals)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def == other
|
|
51
|
+
return false unless super
|
|
52
|
+
assignment == other.assignment
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def try_merge! pin
|
|
56
|
+
return false unless super
|
|
57
|
+
@assignment = pin.assignment
|
|
58
|
+
@return_complex_type = pin.return_complex_type
|
|
59
|
+
true
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
private
|
|
63
|
+
|
|
64
|
+
def generate_complex_type
|
|
65
|
+
tag = docstring.tag(:type)
|
|
66
|
+
return ComplexType.try_parse(*tag.types) unless tag.nil? || tag.types.nil? || tag.types.empty?
|
|
67
|
+
return ComplexType.try_parse(@literal) unless @literal.nil?
|
|
68
|
+
ComplexType.new
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
data/lib/solargraph/pin/block.rb
CHANGED
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
module Solargraph
|
|
2
|
-
module Pin
|
|
3
|
-
class Block < Base
|
|
4
|
-
# The signature of the method that receives this block.
|
|
5
|
-
#
|
|
6
|
-
# @return [Parser::AST::Node]
|
|
7
|
-
attr_reader :receiver
|
|
8
|
-
|
|
9
|
-
def initialize location, namespace, name, comments, receiver, context
|
|
10
|
-
super(location, namespace, name, comments)
|
|
11
|
-
@receiver = receiver
|
|
12
|
-
@context = context
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def kind
|
|
16
|
-
Pin::BLOCK
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
# @return [Array<String>]
|
|
20
|
-
def parameters
|
|
21
|
-
@parameters ||= []
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
def nearly? other
|
|
25
|
-
return false unless super
|
|
26
|
-
# @todo Trying to not to block merges too much
|
|
27
|
-
# receiver == other.receiver and parameters == other.parameters
|
|
28
|
-
true
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
end
|
|
1
|
+
module Solargraph
|
|
2
|
+
module Pin
|
|
3
|
+
class Block < Base
|
|
4
|
+
# The signature of the method that receives this block.
|
|
5
|
+
#
|
|
6
|
+
# @return [Parser::AST::Node]
|
|
7
|
+
attr_reader :receiver
|
|
8
|
+
|
|
9
|
+
def initialize location, namespace, name, comments, receiver, context
|
|
10
|
+
super(location, namespace, name, comments)
|
|
11
|
+
@receiver = receiver
|
|
12
|
+
@context = context
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def kind
|
|
16
|
+
Pin::BLOCK
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# @return [Array<String>]
|
|
20
|
+
def parameters
|
|
21
|
+
@parameters ||= []
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def nearly? other
|
|
25
|
+
return false unless super
|
|
26
|
+
# @todo Trying to not to block merges too much
|
|
27
|
+
# receiver == other.receiver and parameters == other.parameters
|
|
28
|
+
true
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -1,103 +1,103 @@
|
|
|
1
|
-
module Solargraph
|
|
2
|
-
module Pin
|
|
3
|
-
class BlockParameter < Base
|
|
4
|
-
include Localized
|
|
5
|
-
|
|
6
|
-
# @return [Pin::Block]
|
|
7
|
-
attr_reader :block
|
|
8
|
-
|
|
9
|
-
def initialize location, namespace, name, comments, block
|
|
10
|
-
super(location, namespace, name, comments)
|
|
11
|
-
@block = block
|
|
12
|
-
@presence = block.location.range
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
# @return [Integer]
|
|
16
|
-
def kind
|
|
17
|
-
Pin::BLOCK_PARAMETER
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
# @return [Integer]
|
|
21
|
-
def completion_item_kind
|
|
22
|
-
Solargraph::LanguageServer::CompletionItemKinds::VARIABLE
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
# @return [Integer]
|
|
26
|
-
def symbol_kind
|
|
27
|
-
Solargraph::LanguageServer::SymbolKinds::VARIABLE
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
# The parameter's zero-based location in the block's signature.
|
|
31
|
-
#
|
|
32
|
-
# @return [Integer]
|
|
33
|
-
def index
|
|
34
|
-
block.parameters.index(self)
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def nearly? other
|
|
38
|
-
return false unless super
|
|
39
|
-
block.nearly?(other.block)
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
def try_merge! other
|
|
43
|
-
return false unless super
|
|
44
|
-
@block = other.block
|
|
45
|
-
@presence = other.block.location.range
|
|
46
|
-
@return_complex_type = nil
|
|
47
|
-
true
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
# @return [Array<Solargraph::ComplexType>]
|
|
51
|
-
def return_complex_type
|
|
52
|
-
if @return_complex_type.nil?
|
|
53
|
-
@return_complex_type = ComplexType.new
|
|
54
|
-
found = nil
|
|
55
|
-
params = block.docstring.tags(:param)
|
|
56
|
-
params.each do |p|
|
|
57
|
-
next unless p.name == name
|
|
58
|
-
found = p
|
|
59
|
-
break
|
|
60
|
-
end
|
|
61
|
-
if found.nil? and !index.nil?
|
|
62
|
-
found = params[index] if params[index] && (params[index].name.nil? || params[index].name.empty?)
|
|
63
|
-
end
|
|
64
|
-
@return_complex_type = ComplexType.try_parse(*found.types) unless found.nil? or found.types.nil?
|
|
65
|
-
end
|
|
66
|
-
super
|
|
67
|
-
@return_complex_type
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
def context
|
|
71
|
-
block
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
# @param api_map [ApiMap]
|
|
75
|
-
def typify api_map
|
|
76
|
-
# @todo Does anything need to be eliminated because it's more accurately a probe?
|
|
77
|
-
type = super
|
|
78
|
-
return type unless type.undefined?
|
|
79
|
-
chain = Source::NodeChainer.chain(block.receiver, filename)
|
|
80
|
-
clip = api_map.clip_at(location.filename, location.range.start)
|
|
81
|
-
locals = clip.locals - [self]
|
|
82
|
-
meths = chain.define(api_map, block, locals)
|
|
83
|
-
meths.each do |meth|
|
|
84
|
-
if (Solargraph::CoreFills::METHODS_WITH_YIELDPARAM_SUBTYPES.include?(meth.path))
|
|
85
|
-
bmeth = chain.base.define(api_map, context, locals).first
|
|
86
|
-
return ComplexType::UNDEFINED if bmeth.nil? or bmeth.return_complex_type.undefined? or bmeth.return_complex_type.subtypes.empty?
|
|
87
|
-
return bmeth.return_complex_type.subtypes.first.qualify(api_map, bmeth.context.namespace)
|
|
88
|
-
elsif (Solargraph::CoreFills::METHODS_WITH_YIELDPARAM_SELF.include?(meth.path))
|
|
89
|
-
bmeth = chain.base.define(api_map, context, locals).first
|
|
90
|
-
return ComplexType::UNDEFINED if bmeth.nil?
|
|
91
|
-
return bmeth.typify(api_map)
|
|
92
|
-
else
|
|
93
|
-
yps = meth.docstring.tags(:yieldparam)
|
|
94
|
-
unless yps[index].nil? or yps[index].types.nil? or yps[index].types.empty?
|
|
95
|
-
return ComplexType.try_parse(yps[index].types.first).qualify(api_map, meth.context.namespace)
|
|
96
|
-
end
|
|
97
|
-
end
|
|
98
|
-
end
|
|
99
|
-
ComplexType::UNDEFINED
|
|
100
|
-
end
|
|
101
|
-
end
|
|
102
|
-
end
|
|
103
|
-
end
|
|
1
|
+
module Solargraph
|
|
2
|
+
module Pin
|
|
3
|
+
class BlockParameter < Base
|
|
4
|
+
include Localized
|
|
5
|
+
|
|
6
|
+
# @return [Pin::Block]
|
|
7
|
+
attr_reader :block
|
|
8
|
+
|
|
9
|
+
def initialize location, namespace, name, comments, block
|
|
10
|
+
super(location, namespace, name, comments)
|
|
11
|
+
@block = block
|
|
12
|
+
@presence = block.location.range
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# @return [Integer]
|
|
16
|
+
def kind
|
|
17
|
+
Pin::BLOCK_PARAMETER
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# @return [Integer]
|
|
21
|
+
def completion_item_kind
|
|
22
|
+
Solargraph::LanguageServer::CompletionItemKinds::VARIABLE
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# @return [Integer]
|
|
26
|
+
def symbol_kind
|
|
27
|
+
Solargraph::LanguageServer::SymbolKinds::VARIABLE
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# The parameter's zero-based location in the block's signature.
|
|
31
|
+
#
|
|
32
|
+
# @return [Integer]
|
|
33
|
+
def index
|
|
34
|
+
block.parameters.index(self)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def nearly? other
|
|
38
|
+
return false unless super
|
|
39
|
+
block.nearly?(other.block)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def try_merge! other
|
|
43
|
+
return false unless super
|
|
44
|
+
@block = other.block
|
|
45
|
+
@presence = other.block.location.range
|
|
46
|
+
@return_complex_type = nil
|
|
47
|
+
true
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# @return [Array<Solargraph::ComplexType>]
|
|
51
|
+
def return_complex_type
|
|
52
|
+
if @return_complex_type.nil?
|
|
53
|
+
@return_complex_type = ComplexType.new
|
|
54
|
+
found = nil
|
|
55
|
+
params = block.docstring.tags(:param)
|
|
56
|
+
params.each do |p|
|
|
57
|
+
next unless p.name == name
|
|
58
|
+
found = p
|
|
59
|
+
break
|
|
60
|
+
end
|
|
61
|
+
if found.nil? and !index.nil?
|
|
62
|
+
found = params[index] if params[index] && (params[index].name.nil? || params[index].name.empty?)
|
|
63
|
+
end
|
|
64
|
+
@return_complex_type = ComplexType.try_parse(*found.types) unless found.nil? or found.types.nil?
|
|
65
|
+
end
|
|
66
|
+
super
|
|
67
|
+
@return_complex_type
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def context
|
|
71
|
+
block
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# @param api_map [ApiMap]
|
|
75
|
+
def typify api_map
|
|
76
|
+
# @todo Does anything need to be eliminated because it's more accurately a probe?
|
|
77
|
+
type = super
|
|
78
|
+
return type unless type.undefined?
|
|
79
|
+
chain = Source::NodeChainer.chain(block.receiver, filename)
|
|
80
|
+
clip = api_map.clip_at(location.filename, location.range.start)
|
|
81
|
+
locals = clip.locals - [self]
|
|
82
|
+
meths = chain.define(api_map, block, locals)
|
|
83
|
+
meths.each do |meth|
|
|
84
|
+
if (Solargraph::CoreFills::METHODS_WITH_YIELDPARAM_SUBTYPES.include?(meth.path))
|
|
85
|
+
bmeth = chain.base.define(api_map, context, locals).first
|
|
86
|
+
return ComplexType::UNDEFINED if bmeth.nil? or bmeth.return_complex_type.undefined? or bmeth.return_complex_type.subtypes.empty?
|
|
87
|
+
return bmeth.return_complex_type.subtypes.first.qualify(api_map, bmeth.context.namespace)
|
|
88
|
+
elsif (Solargraph::CoreFills::METHODS_WITH_YIELDPARAM_SELF.include?(meth.path))
|
|
89
|
+
bmeth = chain.base.define(api_map, context, locals).first
|
|
90
|
+
return ComplexType::UNDEFINED if bmeth.nil?
|
|
91
|
+
return bmeth.typify(api_map)
|
|
92
|
+
else
|
|
93
|
+
yps = meth.docstring.tags(:yieldparam)
|
|
94
|
+
unless yps[index].nil? or yps[index].types.nil? or yps[index].types.empty?
|
|
95
|
+
return ComplexType.try_parse(yps[index].types.first).qualify(api_map, meth.context.namespace)
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
ComplexType::UNDEFINED
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|