solargraph 0.58.1 → 0.58.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.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG.md +7 -1
  4. data/lib/solargraph/api_map/cache.rb +110 -110
  5. data/lib/solargraph/api_map/constants.rb +279 -279
  6. data/lib/solargraph/api_map/index.rb +193 -193
  7. data/lib/solargraph/api_map/source_to_yard.rb +97 -97
  8. data/lib/solargraph/api_map/store.rb +384 -384
  9. data/lib/solargraph/api_map.rb +945 -945
  10. data/lib/solargraph/complex_type/type_methods.rb +228 -228
  11. data/lib/solargraph/complex_type/unique_type.rb +482 -482
  12. data/lib/solargraph/complex_type.rb +444 -444
  13. data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -91
  14. data/lib/solargraph/convention/data_definition.rb +105 -105
  15. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -61
  16. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -102
  17. data/lib/solargraph/convention/struct_definition.rb +164 -164
  18. data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
  19. data/lib/solargraph/diagnostics/rubocop.rb +118 -118
  20. data/lib/solargraph/diagnostics/rubocop_helpers.rb +68 -68
  21. data/lib/solargraph/diagnostics/type_check.rb +55 -55
  22. data/lib/solargraph/doc_map.rb +439 -439
  23. data/lib/solargraph/equality.rb +34 -34
  24. data/lib/solargraph/gem_pins.rb +98 -98
  25. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  26. data/lib/solargraph/language_server/host/dispatch.rb +130 -130
  27. data/lib/solargraph/language_server/host/message_worker.rb +112 -112
  28. data/lib/solargraph/language_server/host/sources.rb +99 -99
  29. data/lib/solargraph/language_server/host.rb +878 -878
  30. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +114 -114
  31. data/lib/solargraph/language_server/message/extended/document.rb +23 -23
  32. data/lib/solargraph/language_server/message/text_document/completion.rb +56 -56
  33. data/lib/solargraph/language_server/message/text_document/definition.rb +40 -40
  34. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -26
  35. data/lib/solargraph/language_server/message/text_document/formatting.rb +148 -148
  36. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
  37. data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -24
  38. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -25
  39. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  40. data/lib/solargraph/library.rb +683 -683
  41. data/lib/solargraph/location.rb +82 -82
  42. data/lib/solargraph/logging.rb +37 -37
  43. data/lib/solargraph/parser/comment_ripper.rb +69 -69
  44. data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -255
  45. data/lib/solargraph/parser/node_processor/base.rb +92 -92
  46. data/lib/solargraph/parser/node_processor.rb +62 -62
  47. data/lib/solargraph/parser/parser_gem/class_methods.rb +149 -149
  48. data/lib/solargraph/parser/parser_gem/node_chainer.rb +166 -166
  49. data/lib/solargraph/parser/parser_gem/node_methods.rb +486 -486
  50. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
  51. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +59 -59
  52. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +15 -15
  53. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -46
  54. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +53 -53
  55. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -23
  56. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +40 -40
  57. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +29 -29
  58. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +59 -59
  59. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
  60. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
  61. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +38 -38
  62. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +52 -52
  63. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +291 -291
  64. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -29
  65. data/lib/solargraph/parser/parser_gem/node_processors.rb +70 -70
  66. data/lib/solargraph/parser/region.rb +69 -69
  67. data/lib/solargraph/parser/snippet.rb +17 -17
  68. data/lib/solargraph/pin/base.rb +729 -729
  69. data/lib/solargraph/pin/base_variable.rb +126 -126
  70. data/lib/solargraph/pin/block.rb +104 -104
  71. data/lib/solargraph/pin/breakable.rb +9 -9
  72. data/lib/solargraph/pin/callable.rb +231 -231
  73. data/lib/solargraph/pin/closure.rb +72 -72
  74. data/lib/solargraph/pin/common.rb +79 -79
  75. data/lib/solargraph/pin/conversions.rb +123 -123
  76. data/lib/solargraph/pin/delegated_method.rb +120 -120
  77. data/lib/solargraph/pin/documenting.rb +114 -114
  78. data/lib/solargraph/pin/instance_variable.rb +34 -34
  79. data/lib/solargraph/pin/keyword.rb +20 -20
  80. data/lib/solargraph/pin/local_variable.rb +75 -75
  81. data/lib/solargraph/pin/method.rb +672 -672
  82. data/lib/solargraph/pin/method_alias.rb +34 -34
  83. data/lib/solargraph/pin/namespace.rb +115 -115
  84. data/lib/solargraph/pin/parameter.rb +275 -275
  85. data/lib/solargraph/pin/proxy_type.rb +39 -39
  86. data/lib/solargraph/pin/reference/override.rb +47 -47
  87. data/lib/solargraph/pin/reference/superclass.rb +15 -15
  88. data/lib/solargraph/pin/reference.rb +39 -39
  89. data/lib/solargraph/pin/search.rb +61 -61
  90. data/lib/solargraph/pin/signature.rb +61 -61
  91. data/lib/solargraph/pin/symbol.rb +53 -53
  92. data/lib/solargraph/pin/until.rb +18 -18
  93. data/lib/solargraph/pin/while.rb +18 -18
  94. data/lib/solargraph/pin.rb +44 -44
  95. data/lib/solargraph/pin_cache.rb +245 -245
  96. data/lib/solargraph/position.rb +132 -119
  97. data/lib/solargraph/range.rb +112 -112
  98. data/lib/solargraph/rbs_map/conversions.rb +823 -823
  99. data/lib/solargraph/rbs_map/core_map.rb +58 -58
  100. data/lib/solargraph/rbs_map/stdlib_map.rb +43 -43
  101. data/lib/solargraph/rbs_map.rb +163 -163
  102. data/lib/solargraph/shell.rb +352 -352
  103. data/lib/solargraph/source/chain/call.rb +337 -337
  104. data/lib/solargraph/source/chain/constant.rb +26 -26
  105. data/lib/solargraph/source/chain/hash.rb +34 -34
  106. data/lib/solargraph/source/chain/if.rb +28 -28
  107. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  108. data/lib/solargraph/source/chain/literal.rb +48 -48
  109. data/lib/solargraph/source/chain/or.rb +23 -23
  110. data/lib/solargraph/source/chain.rb +291 -291
  111. data/lib/solargraph/source/change.rb +82 -82
  112. data/lib/solargraph/source/cursor.rb +166 -166
  113. data/lib/solargraph/source/source_chainer.rb +194 -194
  114. data/lib/solargraph/source/updater.rb +55 -55
  115. data/lib/solargraph/source.rb +498 -498
  116. data/lib/solargraph/source_map/clip.rb +226 -226
  117. data/lib/solargraph/source_map/data.rb +34 -34
  118. data/lib/solargraph/source_map/mapper.rb +259 -259
  119. data/lib/solargraph/source_map.rb +212 -212
  120. data/lib/solargraph/type_checker/checks.rb +124 -124
  121. data/lib/solargraph/type_checker/param_def.rb +37 -37
  122. data/lib/solargraph/type_checker/problem.rb +32 -32
  123. data/lib/solargraph/type_checker/rules.rb +84 -84
  124. data/lib/solargraph/type_checker.rb +814 -814
  125. data/lib/solargraph/version.rb +1 -1
  126. data/lib/solargraph/workspace/config.rb +255 -255
  127. data/lib/solargraph/workspace/require_paths.rb +97 -97
  128. data/lib/solargraph/workspace.rb +220 -220
  129. data/lib/solargraph/yard_map/helpers.rb +44 -44
  130. data/lib/solargraph/yard_map/mapper/to_method.rb +130 -130
  131. data/lib/solargraph/yard_map/mapper/to_namespace.rb +31 -31
  132. data/lib/solargraph/yard_map/mapper.rb +79 -79
  133. data/lib/solargraph/yard_map/to_method.rb +89 -89
  134. data/lib/solargraph/yardoc.rb +87 -87
  135. data/lib/solargraph.rb +105 -105
  136. data/rbs_collection.yaml +1 -1
  137. metadata +12 -12
  138. /data/{sig → rbs}/shims/ast/0/node.rbs +0 -0
  139. /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
  140. /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
  141. /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
  142. /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
  143. /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
  144. /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
  145. /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
  146. /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
  147. /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
@@ -1,114 +1,114 @@
1
- # frozen_string_literal: true
2
-
3
- require 'kramdown'
4
- require 'kramdown-parser-gfm'
5
- require 'yard'
6
- require 'reverse_markdown'
7
- require 'solargraph/converters/dl'
8
- require 'solargraph/converters/dt'
9
- require 'solargraph/converters/dd'
10
- require 'solargraph/converters/misc'
11
-
12
- # @todo upstream this definition
13
-
14
- # @!parse
15
- # module ::Kramdown
16
- # class Document
17
- # # @return [String]
18
- # def to_html; end
19
- # end
20
- # end
21
- # module ReverseMarkdown
22
- # # @param input [String]
23
- # # @param options [Hash]
24
- # # @return [String]
25
- # def self.convert(input, options = {}); end
26
- # end
27
-
28
- module Solargraph
29
- module Pin
30
- # A module to add the Pin::Base#documentation method.
31
- #
32
- module Documenting
33
- # A documentation formatter that either performs Markdown conversion for
34
- # text, or applies backticks for code blocks.
35
- #
36
- class DocSection
37
- # @return [String]
38
- attr_reader :plaintext
39
-
40
- # @param code [Boolean] True if this section is a code block
41
- def initialize code
42
- @plaintext = String.new('')
43
- @code = code
44
- end
45
-
46
- def code?
47
- @code
48
- end
49
-
50
- # @param text [String]
51
- # @return [String]
52
- def concat text
53
- @plaintext.concat text
54
- end
55
-
56
- def to_s
57
- return to_code if code?
58
- to_markdown
59
- end
60
-
61
- private
62
-
63
- # @return [String]
64
- def to_code
65
- "\n```ruby\n#{Documenting.normalize_indentation(@plaintext)}#{@plaintext.end_with?("\n") ? '' : "\n"}```\n\n"
66
- end
67
-
68
- # @return [String]
69
- def to_markdown
70
- ReverseMarkdown.convert Kramdown::Document.new(@plaintext, input: 'GFM').to_html
71
- end
72
- end
73
-
74
- # @return [String]
75
- def documentation
76
- @documentation ||= begin
77
- # Using DocSections allows for code blocks that start with an empty
78
- # line and at least two spaces of indentation. This is a common
79
- # convention in Ruby core documentation, e.g., String#split.
80
- sections = [DocSection.new(false)]
81
- Documenting.normalize_indentation(Documenting.strip_html_comments(docstring.to_s.gsub("\t", ' '))).lines.each do |l|
82
- if l.start_with?(' ')
83
- # Code block
84
- sections.push DocSection.new(true) unless sections.last.code?
85
- elsif sections.last.code?
86
- # Regular documentation
87
- sections.push DocSection.new(false)
88
- end
89
- sections.last.concat l
90
- end
91
- sections.map(&:to_s).join.strip
92
- end
93
- end
94
-
95
- # @param text [String]
96
- # @return [String]
97
- def self.strip_html_comments text
98
- text.gsub(/<!--([\s\S]*?)-->/, '').strip
99
- end
100
-
101
- # @param text [String]
102
- # @return [String]
103
- def self.normalize_indentation text
104
- left = text.lines.map do |line|
105
- match = line.match(/^ +/)
106
- next 0 unless match
107
- match[0].length
108
- end.min
109
- return text if left.nil? || left.zero?
110
- text.lines.map { |line| line[left..] }.join
111
- end
112
- end
113
- end
114
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'kramdown'
4
+ require 'kramdown-parser-gfm'
5
+ require 'yard'
6
+ require 'reverse_markdown'
7
+ require 'solargraph/converters/dl'
8
+ require 'solargraph/converters/dt'
9
+ require 'solargraph/converters/dd'
10
+ require 'solargraph/converters/misc'
11
+
12
+ # @todo upstream this definition
13
+
14
+ # @!parse
15
+ # module ::Kramdown
16
+ # class Document
17
+ # # @return [String]
18
+ # def to_html; end
19
+ # end
20
+ # end
21
+ # module ReverseMarkdown
22
+ # # @param input [String]
23
+ # # @param options [Hash]
24
+ # # @return [String]
25
+ # def self.convert(input, options = {}); end
26
+ # end
27
+
28
+ module Solargraph
29
+ module Pin
30
+ # A module to add the Pin::Base#documentation method.
31
+ #
32
+ module Documenting
33
+ # A documentation formatter that either performs Markdown conversion for
34
+ # text, or applies backticks for code blocks.
35
+ #
36
+ class DocSection
37
+ # @return [String]
38
+ attr_reader :plaintext
39
+
40
+ # @param code [Boolean] True if this section is a code block
41
+ def initialize code
42
+ @plaintext = String.new('')
43
+ @code = code
44
+ end
45
+
46
+ def code?
47
+ @code
48
+ end
49
+
50
+ # @param text [String]
51
+ # @return [String]
52
+ def concat text
53
+ @plaintext.concat text
54
+ end
55
+
56
+ def to_s
57
+ return to_code if code?
58
+ to_markdown
59
+ end
60
+
61
+ private
62
+
63
+ # @return [String]
64
+ def to_code
65
+ "\n```ruby\n#{Documenting.normalize_indentation(@plaintext)}#{@plaintext.end_with?("\n") ? '' : "\n"}```\n\n"
66
+ end
67
+
68
+ # @return [String]
69
+ def to_markdown
70
+ ReverseMarkdown.convert Kramdown::Document.new(@plaintext, input: 'GFM').to_html
71
+ end
72
+ end
73
+
74
+ # @return [String]
75
+ def documentation
76
+ @documentation ||= begin
77
+ # Using DocSections allows for code blocks that start with an empty
78
+ # line and at least two spaces of indentation. This is a common
79
+ # convention in Ruby core documentation, e.g., String#split.
80
+ sections = [DocSection.new(false)]
81
+ Documenting.normalize_indentation(Documenting.strip_html_comments(docstring.to_s.gsub("\t", ' '))).lines.each do |l|
82
+ if l.start_with?(' ')
83
+ # Code block
84
+ sections.push DocSection.new(true) unless sections.last.code?
85
+ elsif sections.last.code?
86
+ # Regular documentation
87
+ sections.push DocSection.new(false)
88
+ end
89
+ sections.last.concat l
90
+ end
91
+ sections.map(&:to_s).join.strip
92
+ end
93
+ end
94
+
95
+ # @param text [String]
96
+ # @return [String]
97
+ def self.strip_html_comments text
98
+ text.gsub(/<!--([\s\S]*?)-->/, '').strip
99
+ end
100
+
101
+ # @param text [String]
102
+ # @return [String]
103
+ def self.normalize_indentation text
104
+ left = text.lines.map do |line|
105
+ match = line.match(/^ +/)
106
+ next 0 unless match
107
+ match[0].length
108
+ end.min
109
+ return text if left.nil? || left.zero?
110
+ text.lines.map { |line| line[left..] }.join
111
+ end
112
+ end
113
+ end
114
+ end
@@ -1,34 +1,34 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- class InstanceVariable < BaseVariable
6
- # @return [ComplexType]
7
- def binder
8
- closure.binder
9
- end
10
-
11
- # @return [::Symbol]
12
- def scope
13
- closure.binder.scope
14
- end
15
-
16
- # @return [ComplexType]
17
- def context
18
- @context ||= begin
19
- result = super
20
- if scope == :class
21
- ComplexType.parse("::Class<#{result.rooted_namespace}>")
22
- else
23
- result.reduce_class_type
24
- end
25
- end
26
- end
27
-
28
- # @param other [InstanceVariable]
29
- def nearly? other
30
- super && binder == other.binder
31
- end
32
- end
33
- end
34
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class InstanceVariable < BaseVariable
6
+ # @return [ComplexType]
7
+ def binder
8
+ closure.binder
9
+ end
10
+
11
+ # @return [::Symbol]
12
+ def scope
13
+ closure.binder.scope
14
+ end
15
+
16
+ # @return [ComplexType]
17
+ def context
18
+ @context ||= begin
19
+ result = super
20
+ if scope == :class
21
+ ComplexType.parse("::Class<#{result.rooted_namespace}>")
22
+ else
23
+ result.reduce_class_type
24
+ end
25
+ end
26
+ end
27
+
28
+ # @param other [InstanceVariable]
29
+ def nearly? other
30
+ super && binder == other.binder
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,20 +1,20 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- class Keyword < Base
6
- def initialize(name, **kwargs)
7
- # @sg-ignore "Unrecognized keyword argument kwargs to Solargraph::Pin::Base#initialize"
8
- super(name: name, **kwargs)
9
- end
10
-
11
- def closure
12
- @closure ||= Pin::ROOT_PIN
13
- end
14
-
15
- def name
16
- @name
17
- end
18
- end
19
- end
20
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class Keyword < Base
6
+ def initialize(name, **kwargs)
7
+ # @sg-ignore "Unrecognized keyword argument kwargs to Solargraph::Pin::Base#initialize"
8
+ super(name: name, **kwargs)
9
+ end
10
+
11
+ def closure
12
+ @closure ||= Pin::ROOT_PIN
13
+ end
14
+
15
+ def name
16
+ @name
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,75 +1,75 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- class LocalVariable < BaseVariable
6
- # @return [Range]
7
- attr_reader :presence
8
-
9
- def presence_certain?
10
- @presence_certain
11
- end
12
-
13
- # @param assignment [AST::Node, nil]
14
- # @param presence [Range, nil]
15
- # @param presence_certain [Boolean]
16
- # @param splat [Hash]
17
- def initialize assignment: nil, presence: nil, presence_certain: false, **splat
18
- super(**splat)
19
- @assignment = assignment
20
- @presence = presence
21
- @presence_certain = presence_certain
22
- end
23
-
24
- def combine_with(other, attrs={})
25
- new_attrs = {
26
- assignment: assert_same(other, :assignment),
27
- presence_certain: assert_same(other, :presence_certain?),
28
- }.merge(attrs)
29
- new_attrs[:presence] = assert_same(other, :presence) unless attrs.key?(:presence)
30
-
31
- super(other, new_attrs)
32
- end
33
-
34
- # @param other_closure [Pin::Closure]
35
- # @param other_loc [Location]
36
- def visible_at?(other_closure, other_loc)
37
- location.filename == other_loc.filename &&
38
- presence.include?(other_loc.range.start) &&
39
- match_named_closure(other_closure, closure)
40
- end
41
-
42
- def to_rbs
43
- (name || '(anon)') + ' ' + (return_type&.to_rbs || 'untyped')
44
- end
45
-
46
- private
47
-
48
- # @param tag1 [String]
49
- # @param tag2 [String]
50
- # @return [Boolean]
51
- def match_tags tag1, tag2
52
- # @todo This is an unfortunate hack made necessary by a discrepancy in
53
- # how tags indicate the root namespace. The long-term solution is to
54
- # standardize it, whether it's `Class<>`, an empty string, or
55
- # something else.
56
- tag1 == tag2 ||
57
- (['', 'Class<>'].include?(tag1) && ['', 'Class<>'].include?(tag2))
58
- end
59
-
60
- # @param needle [Pin::Base]
61
- # @param haystack [Pin::Base]
62
- # @return [Boolean]
63
- def match_named_closure needle, haystack
64
- return true if needle == haystack || haystack.is_a?(Pin::Block)
65
- cursor = haystack
66
- until cursor.nil?
67
- return true if needle.path == cursor.path
68
- return false if cursor.path && !cursor.path.empty?
69
- cursor = cursor.closure
70
- end
71
- false
72
- end
73
- end
74
- end
75
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class LocalVariable < BaseVariable
6
+ # @return [Range]
7
+ attr_reader :presence
8
+
9
+ def presence_certain?
10
+ @presence_certain
11
+ end
12
+
13
+ # @param assignment [AST::Node, nil]
14
+ # @param presence [Range, nil]
15
+ # @param presence_certain [Boolean]
16
+ # @param splat [Hash]
17
+ def initialize assignment: nil, presence: nil, presence_certain: false, **splat
18
+ super(**splat)
19
+ @assignment = assignment
20
+ @presence = presence
21
+ @presence_certain = presence_certain
22
+ end
23
+
24
+ def combine_with(other, attrs={})
25
+ new_attrs = {
26
+ assignment: assert_same(other, :assignment),
27
+ presence_certain: assert_same(other, :presence_certain?),
28
+ }.merge(attrs)
29
+ new_attrs[:presence] = assert_same(other, :presence) unless attrs.key?(:presence)
30
+
31
+ super(other, new_attrs)
32
+ end
33
+
34
+ # @param other_closure [Pin::Closure]
35
+ # @param other_loc [Location]
36
+ def visible_at?(other_closure, other_loc)
37
+ location.filename == other_loc.filename &&
38
+ presence.include?(other_loc.range.start) &&
39
+ match_named_closure(other_closure, closure)
40
+ end
41
+
42
+ def to_rbs
43
+ (name || '(anon)') + ' ' + (return_type&.to_rbs || 'untyped')
44
+ end
45
+
46
+ private
47
+
48
+ # @param tag1 [String]
49
+ # @param tag2 [String]
50
+ # @return [Boolean]
51
+ def match_tags tag1, tag2
52
+ # @todo This is an unfortunate hack made necessary by a discrepancy in
53
+ # how tags indicate the root namespace. The long-term solution is to
54
+ # standardize it, whether it's `Class<>`, an empty string, or
55
+ # something else.
56
+ tag1 == tag2 ||
57
+ (['', 'Class<>'].include?(tag1) && ['', 'Class<>'].include?(tag2))
58
+ end
59
+
60
+ # @param needle [Pin::Base]
61
+ # @param haystack [Pin::Base]
62
+ # @return [Boolean]
63
+ def match_named_closure needle, haystack
64
+ return true if needle == haystack || haystack.is_a?(Pin::Block)
65
+ cursor = haystack
66
+ until cursor.nil?
67
+ return true if needle.path == cursor.path
68
+ return false if cursor.path && !cursor.path.empty?
69
+ cursor = cursor.closure
70
+ end
71
+ false
72
+ end
73
+ end
74
+ end
75
+ end