solargraph 0.58.0 → 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 (150) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +2 -0
  3. data/.gitignore +1 -0
  4. data/CHANGELOG.md +9 -0
  5. data/bin/solargraph +8 -8
  6. data/lib/solargraph/api_map/cache.rb +110 -110
  7. data/lib/solargraph/api_map/constants.rb +279 -279
  8. data/lib/solargraph/api_map/index.rb +193 -193
  9. data/lib/solargraph/api_map/source_to_yard.rb +97 -97
  10. data/lib/solargraph/api_map/store.rb +384 -384
  11. data/lib/solargraph/api_map.rb +945 -945
  12. data/lib/solargraph/complex_type/type_methods.rb +228 -228
  13. data/lib/solargraph/complex_type/unique_type.rb +482 -482
  14. data/lib/solargraph/complex_type.rb +444 -444
  15. data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -91
  16. data/lib/solargraph/convention/data_definition.rb +105 -105
  17. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -61
  18. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -102
  19. data/lib/solargraph/convention/struct_definition.rb +164 -164
  20. data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
  21. data/lib/solargraph/diagnostics/rubocop.rb +118 -118
  22. data/lib/solargraph/diagnostics/rubocop_helpers.rb +68 -68
  23. data/lib/solargraph/diagnostics/type_check.rb +55 -55
  24. data/lib/solargraph/doc_map.rb +439 -439
  25. data/lib/solargraph/equality.rb +34 -34
  26. data/lib/solargraph/gem_pins.rb +98 -98
  27. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  28. data/lib/solargraph/language_server/host/dispatch.rb +130 -130
  29. data/lib/solargraph/language_server/host/message_worker.rb +112 -112
  30. data/lib/solargraph/language_server/host/sources.rb +99 -99
  31. data/lib/solargraph/language_server/host.rb +878 -878
  32. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +114 -114
  33. data/lib/solargraph/language_server/message/extended/document.rb +23 -23
  34. data/lib/solargraph/language_server/message/text_document/completion.rb +56 -56
  35. data/lib/solargraph/language_server/message/text_document/definition.rb +40 -40
  36. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -26
  37. data/lib/solargraph/language_server/message/text_document/formatting.rb +148 -148
  38. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
  39. data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -24
  40. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -25
  41. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  42. data/lib/solargraph/library.rb +683 -683
  43. data/lib/solargraph/location.rb +82 -82
  44. data/lib/solargraph/logging.rb +37 -37
  45. data/lib/solargraph/parser/comment_ripper.rb +69 -69
  46. data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -255
  47. data/lib/solargraph/parser/node_processor/base.rb +92 -92
  48. data/lib/solargraph/parser/node_processor.rb +62 -62
  49. data/lib/solargraph/parser/parser_gem/class_methods.rb +149 -149
  50. data/lib/solargraph/parser/parser_gem/node_chainer.rb +166 -166
  51. data/lib/solargraph/parser/parser_gem/node_methods.rb +486 -486
  52. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
  53. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +59 -59
  54. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +15 -15
  55. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -46
  56. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +53 -53
  57. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -23
  58. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +40 -40
  59. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +29 -29
  60. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +59 -59
  61. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
  62. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
  63. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +38 -38
  64. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +52 -52
  65. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +291 -291
  66. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -29
  67. data/lib/solargraph/parser/parser_gem/node_processors.rb +70 -70
  68. data/lib/solargraph/parser/region.rb +69 -69
  69. data/lib/solargraph/parser/snippet.rb +17 -17
  70. data/lib/solargraph/pin/base.rb +729 -729
  71. data/lib/solargraph/pin/base_variable.rb +126 -126
  72. data/lib/solargraph/pin/block.rb +104 -104
  73. data/lib/solargraph/pin/breakable.rb +9 -9
  74. data/lib/solargraph/pin/callable.rb +231 -231
  75. data/lib/solargraph/pin/closure.rb +72 -72
  76. data/lib/solargraph/pin/common.rb +79 -79
  77. data/lib/solargraph/pin/conversions.rb +123 -123
  78. data/lib/solargraph/pin/delegated_method.rb +120 -120
  79. data/lib/solargraph/pin/documenting.rb +114 -114
  80. data/lib/solargraph/pin/instance_variable.rb +34 -34
  81. data/lib/solargraph/pin/keyword.rb +20 -20
  82. data/lib/solargraph/pin/local_variable.rb +75 -75
  83. data/lib/solargraph/pin/method.rb +672 -672
  84. data/lib/solargraph/pin/method_alias.rb +34 -34
  85. data/lib/solargraph/pin/namespace.rb +115 -115
  86. data/lib/solargraph/pin/parameter.rb +275 -275
  87. data/lib/solargraph/pin/proxy_type.rb +39 -39
  88. data/lib/solargraph/pin/reference/override.rb +47 -47
  89. data/lib/solargraph/pin/reference/superclass.rb +15 -15
  90. data/lib/solargraph/pin/reference.rb +39 -39
  91. data/lib/solargraph/pin/search.rb +61 -61
  92. data/lib/solargraph/pin/signature.rb +61 -61
  93. data/lib/solargraph/pin/symbol.rb +53 -53
  94. data/lib/solargraph/pin/until.rb +18 -18
  95. data/lib/solargraph/pin/while.rb +18 -18
  96. data/lib/solargraph/pin.rb +44 -44
  97. data/lib/solargraph/pin_cache.rb +245 -245
  98. data/lib/solargraph/position.rb +132 -119
  99. data/lib/solargraph/range.rb +112 -112
  100. data/lib/solargraph/rbs_map/conversions.rb +823 -823
  101. data/lib/solargraph/rbs_map/core_map.rb +58 -58
  102. data/lib/solargraph/rbs_map/stdlib_map.rb +43 -43
  103. data/lib/solargraph/rbs_map.rb +163 -163
  104. data/lib/solargraph/shell.rb +352 -352
  105. data/lib/solargraph/source/chain/call.rb +337 -337
  106. data/lib/solargraph/source/chain/constant.rb +26 -26
  107. data/lib/solargraph/source/chain/hash.rb +34 -34
  108. data/lib/solargraph/source/chain/if.rb +28 -28
  109. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  110. data/lib/solargraph/source/chain/literal.rb +48 -48
  111. data/lib/solargraph/source/chain/or.rb +23 -23
  112. data/lib/solargraph/source/chain.rb +291 -291
  113. data/lib/solargraph/source/change.rb +82 -82
  114. data/lib/solargraph/source/cursor.rb +166 -166
  115. data/lib/solargraph/source/encoding_fixes.rb +23 -23
  116. data/lib/solargraph/source/source_chainer.rb +194 -194
  117. data/lib/solargraph/source/updater.rb +55 -55
  118. data/lib/solargraph/source.rb +498 -498
  119. data/lib/solargraph/source_map/clip.rb +226 -226
  120. data/lib/solargraph/source_map/data.rb +34 -34
  121. data/lib/solargraph/source_map/mapper.rb +259 -259
  122. data/lib/solargraph/source_map.rb +212 -212
  123. data/lib/solargraph/type_checker/checks.rb +124 -124
  124. data/lib/solargraph/type_checker/param_def.rb +37 -37
  125. data/lib/solargraph/type_checker/problem.rb +32 -32
  126. data/lib/solargraph/type_checker/rules.rb +84 -84
  127. data/lib/solargraph/type_checker.rb +814 -814
  128. data/lib/solargraph/version.rb +5 -5
  129. data/lib/solargraph/workspace/config.rb +255 -255
  130. data/lib/solargraph/workspace/require_paths.rb +97 -97
  131. data/lib/solargraph/workspace.rb +220 -220
  132. data/lib/solargraph/yard_map/helpers.rb +44 -44
  133. data/lib/solargraph/yard_map/mapper/to_method.rb +130 -130
  134. data/lib/solargraph/yard_map/mapper/to_namespace.rb +31 -31
  135. data/lib/solargraph/yard_map/mapper.rb +79 -79
  136. data/lib/solargraph/yard_map/to_method.rb +89 -89
  137. data/lib/solargraph/yardoc.rb +87 -87
  138. data/lib/solargraph.rb +105 -105
  139. data/rbs_collection.yaml +1 -1
  140. metadata +13 -12
  141. /data/{sig → rbs}/shims/ast/0/node.rbs +0 -0
  142. /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
  143. /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
  144. /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
  145. /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
  146. /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
  147. /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
  148. /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
  149. /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
  150. /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