solargraph 0.58.1 → 0.59.0.dev.1

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 (162) hide show
  1. checksums.yaml +4 -4
  2. data/.envrc +3 -0
  3. data/.github/workflows/linting.yml +4 -5
  4. data/.github/workflows/plugins.yml +40 -36
  5. data/.github/workflows/rspec.yml +45 -13
  6. data/.github/workflows/typecheck.yml +2 -2
  7. data/.rubocop_todo.yml +27 -49
  8. data/README.md +3 -3
  9. data/Rakefile +1 -0
  10. data/lib/solargraph/api_map/cache.rb +110 -110
  11. data/lib/solargraph/api_map/constants.rb +289 -279
  12. data/lib/solargraph/api_map/index.rb +204 -193
  13. data/lib/solargraph/api_map/source_to_yard.rb +109 -97
  14. data/lib/solargraph/api_map/store.rb +387 -384
  15. data/lib/solargraph/api_map.rb +1000 -945
  16. data/lib/solargraph/complex_type/conformance.rb +176 -0
  17. data/lib/solargraph/complex_type/type_methods.rb +242 -228
  18. data/lib/solargraph/complex_type/unique_type.rb +632 -482
  19. data/lib/solargraph/complex_type.rb +549 -444
  20. data/lib/solargraph/convention/data_definition/data_definition_node.rb +93 -91
  21. data/lib/solargraph/convention/data_definition.rb +108 -105
  22. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +62 -61
  23. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +103 -102
  24. data/lib/solargraph/convention/struct_definition.rb +168 -164
  25. data/lib/solargraph/diagnostics/require_not_found.rb +54 -53
  26. data/lib/solargraph/diagnostics/rubocop.rb +119 -118
  27. data/lib/solargraph/diagnostics/rubocop_helpers.rb +70 -68
  28. data/lib/solargraph/diagnostics/type_check.rb +56 -55
  29. data/lib/solargraph/doc_map.rb +200 -439
  30. data/lib/solargraph/equality.rb +34 -34
  31. data/lib/solargraph/gem_pins.rb +97 -98
  32. data/lib/solargraph/language_server/host/dispatch.rb +131 -130
  33. data/lib/solargraph/language_server/host/message_worker.rb +113 -112
  34. data/lib/solargraph/language_server/host/sources.rb +100 -99
  35. data/lib/solargraph/language_server/host.rb +883 -878
  36. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +109 -114
  37. data/lib/solargraph/language_server/message/extended/document.rb +24 -23
  38. data/lib/solargraph/language_server/message/text_document/completion.rb +58 -56
  39. data/lib/solargraph/language_server/message/text_document/definition.rb +42 -40
  40. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +28 -26
  41. data/lib/solargraph/language_server/message/text_document/formatting.rb +150 -148
  42. data/lib/solargraph/language_server/message/text_document/hover.rb +60 -58
  43. data/lib/solargraph/language_server/message/text_document/signature_help.rb +25 -24
  44. data/lib/solargraph/language_server/message/text_document/type_definition.rb +27 -25
  45. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +25 -23
  46. data/lib/solargraph/library.rb +729 -683
  47. data/lib/solargraph/location.rb +87 -82
  48. data/lib/solargraph/logging.rb +57 -37
  49. data/lib/solargraph/parser/comment_ripper.rb +76 -69
  50. data/lib/solargraph/parser/flow_sensitive_typing.rb +483 -255
  51. data/lib/solargraph/parser/node_processor/base.rb +122 -92
  52. data/lib/solargraph/parser/node_processor.rb +63 -62
  53. data/lib/solargraph/parser/parser_gem/class_methods.rb +167 -149
  54. data/lib/solargraph/parser/parser_gem/node_chainer.rb +191 -166
  55. data/lib/solargraph/parser/parser_gem/node_methods.rb +506 -486
  56. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
  57. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +61 -59
  58. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +24 -15
  59. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -46
  60. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +60 -53
  61. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +53 -23
  62. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +41 -40
  63. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +30 -29
  64. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +61 -59
  65. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
  66. data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
  67. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
  68. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +39 -38
  69. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +53 -52
  70. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +296 -291
  71. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
  72. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +33 -29
  73. data/lib/solargraph/parser/parser_gem/node_processors.rb +74 -70
  74. data/lib/solargraph/parser/region.rb +75 -69
  75. data/lib/solargraph/parser/snippet.rb +17 -17
  76. data/lib/solargraph/pin/base.rb +761 -729
  77. data/lib/solargraph/pin/base_variable.rb +418 -126
  78. data/lib/solargraph/pin/block.rb +126 -104
  79. data/lib/solargraph/pin/breakable.rb +13 -9
  80. data/lib/solargraph/pin/callable.rb +278 -231
  81. data/lib/solargraph/pin/closure.rb +68 -72
  82. data/lib/solargraph/pin/common.rb +94 -79
  83. data/lib/solargraph/pin/compound_statement.rb +55 -0
  84. data/lib/solargraph/pin/conversions.rb +124 -123
  85. data/lib/solargraph/pin/delegated_method.rb +131 -120
  86. data/lib/solargraph/pin/documenting.rb +115 -114
  87. data/lib/solargraph/pin/instance_variable.rb +38 -34
  88. data/lib/solargraph/pin/keyword.rb +16 -20
  89. data/lib/solargraph/pin/local_variable.rb +31 -75
  90. data/lib/solargraph/pin/method.rb +720 -672
  91. data/lib/solargraph/pin/method_alias.rb +42 -34
  92. data/lib/solargraph/pin/namespace.rb +121 -115
  93. data/lib/solargraph/pin/parameter.rb +338 -275
  94. data/lib/solargraph/pin/proxy_type.rb +40 -39
  95. data/lib/solargraph/pin/reference/override.rb +47 -47
  96. data/lib/solargraph/pin/reference/superclass.rb +17 -15
  97. data/lib/solargraph/pin/reference.rb +41 -39
  98. data/lib/solargraph/pin/search.rb +62 -61
  99. data/lib/solargraph/pin/signature.rb +69 -61
  100. data/lib/solargraph/pin/symbol.rb +53 -53
  101. data/lib/solargraph/pin/until.rb +18 -18
  102. data/lib/solargraph/pin/while.rb +18 -18
  103. data/lib/solargraph/pin.rb +46 -44
  104. data/lib/solargraph/pin_cache.rb +665 -245
  105. data/lib/solargraph/position.rb +118 -119
  106. data/lib/solargraph/range.rb +112 -112
  107. data/lib/solargraph/rbs_map/conversions.rb +846 -823
  108. data/lib/solargraph/rbs_map/core_map.rb +65 -58
  109. data/lib/solargraph/rbs_map/stdlib_map.rb +72 -43
  110. data/lib/solargraph/rbs_map.rb +217 -163
  111. data/lib/solargraph/shell.rb +397 -352
  112. data/lib/solargraph/source/chain/call.rb +372 -337
  113. data/lib/solargraph/source/chain/constant.rb +28 -26
  114. data/lib/solargraph/source/chain/hash.rb +35 -34
  115. data/lib/solargraph/source/chain/if.rb +29 -28
  116. data/lib/solargraph/source/chain/instance_variable.rb +34 -13
  117. data/lib/solargraph/source/chain/literal.rb +53 -48
  118. data/lib/solargraph/source/chain/or.rb +31 -23
  119. data/lib/solargraph/source/chain.rb +294 -291
  120. data/lib/solargraph/source/change.rb +89 -82
  121. data/lib/solargraph/source/cursor.rb +172 -166
  122. data/lib/solargraph/source/source_chainer.rb +204 -194
  123. data/lib/solargraph/source/updater.rb +59 -55
  124. data/lib/solargraph/source.rb +524 -498
  125. data/lib/solargraph/source_map/clip.rb +237 -226
  126. data/lib/solargraph/source_map/data.rb +37 -34
  127. data/lib/solargraph/source_map/mapper.rb +282 -259
  128. data/lib/solargraph/source_map.rb +220 -212
  129. data/lib/solargraph/type_checker/problem.rb +34 -32
  130. data/lib/solargraph/type_checker/rules.rb +157 -84
  131. data/lib/solargraph/type_checker.rb +895 -814
  132. data/lib/solargraph/version.rb +1 -1
  133. data/lib/solargraph/workspace/config.rb +257 -255
  134. data/lib/solargraph/workspace/gemspecs.rb +367 -0
  135. data/lib/solargraph/workspace/require_paths.rb +98 -97
  136. data/lib/solargraph/workspace.rb +362 -220
  137. data/lib/solargraph/yard_map/helpers.rb +45 -44
  138. data/lib/solargraph/yard_map/mapper/to_method.rb +134 -130
  139. data/lib/solargraph/yard_map/mapper/to_namespace.rb +32 -31
  140. data/lib/solargraph/yard_map/mapper.rb +84 -79
  141. data/lib/solargraph/yardoc.rb +97 -87
  142. data/lib/solargraph.rb +126 -105
  143. data/rbs/fills/rubygems/0/dependency.rbs +193 -0
  144. data/rbs/fills/tuple/tuple.rbs +28 -0
  145. data/rbs/shims/ast/0/node.rbs +5 -0
  146. data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
  147. data/rbs_collection.yaml +1 -1
  148. data/solargraph.gemspec +2 -1
  149. metadata +22 -17
  150. data/lib/solargraph/type_checker/checks.rb +0 -124
  151. data/lib/solargraph/type_checker/param_def.rb +0 -37
  152. data/lib/solargraph/yard_map/to_method.rb +0 -89
  153. data/sig/shims/ast/0/node.rbs +0 -5
  154. /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
  155. /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
  156. /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
  157. /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
  158. /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
  159. /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
  160. /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
  161. /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
  162. /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
@@ -1,79 +1,94 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- module Common
6
- # @!method source
7
- # @abstract
8
- # @return [Source, nil]
9
- # @type @closure [Pin::Closure, nil]
10
-
11
- # @return [Location]
12
- attr_reader :location
13
-
14
- # @sg-ignore Solargraph::Pin::Common#closure return type could not be inferred
15
- # @return [Pin::Closure, nil]
16
- def closure
17
- Solargraph.assert_or_log(:closure, "Closure not set on #{self.class} #{name.inspect} from #{source.inspect}") unless @closure
18
- @closure
19
- end
20
-
21
- # @return [String]
22
- def name
23
- @name ||= ''
24
- end
25
-
26
- # @return [ComplexType]
27
- def return_type
28
- @return_type ||= ComplexType::UNDEFINED
29
- end
30
-
31
- # @return [ComplexType]
32
- def context
33
- # Get the static context from the nearest namespace
34
- @context ||= find_context
35
- end
36
- alias full_context context
37
-
38
- # @return [String]
39
- def namespace
40
- context.namespace.to_s
41
- end
42
-
43
- # @return [ComplexType]
44
- def binder
45
- @binder || context
46
- end
47
-
48
- # @return [String]
49
- def comments
50
- @comments ||= ''
51
- end
52
-
53
- # @return [String]
54
- def path
55
- @path ||= name.empty? ? context.namespace : "#{context.namespace}::#{name}"
56
- end
57
-
58
- protected
59
-
60
- attr_writer :context
61
-
62
- private
63
-
64
- # @return [ComplexType]
65
- def find_context
66
- here = closure
67
- until here.nil?
68
- if here.is_a?(Pin::Namespace)
69
- return here.return_type
70
- elsif here.is_a?(Pin::Method)
71
- return here.context
72
- end
73
- here = here.closure
74
- end
75
- ComplexType::ROOT
76
- end
77
- end
78
- end
79
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ module Common
6
+ # @!method source
7
+ # @abstract
8
+ # @return [Source, nil]
9
+ # @!method reset_generated!
10
+ # @abstract
11
+ # @return [void]
12
+ # @type @closure [Pin::Closure, nil]
13
+ # @type @binder [ComplexType, ComplexType::UniqueType, nil]
14
+
15
+ # @todo Missed nil violation
16
+ # @return [Location, nil]
17
+ attr_accessor :location
18
+
19
+ # @param value [Pin::Closure]
20
+ # @return [void]
21
+ def closure=(value)
22
+ @closure = value
23
+ # remove cached values generated from closure
24
+ reset_generated!
25
+ end
26
+
27
+ # @return [Pin::Closure, nil]
28
+ def closure
29
+ Solargraph.assert_or_log(:closure, "Closure not set on #{self.class} #{name.inspect} from #{source.inspect}") unless @closure
30
+ @closure
31
+ end
32
+
33
+ # @return [String]
34
+ def name
35
+ @name ||= ''
36
+ end
37
+
38
+ # @todo redundant with Base#return_type?
39
+ # @return [ComplexType]
40
+ def return_type
41
+ @return_type ||= ComplexType::UNDEFINED
42
+ end
43
+
44
+ # @return [ComplexType, ComplexType::UniqueType]
45
+ def context
46
+ # Get the static context from the nearest namespace
47
+ @context ||= find_context
48
+ end
49
+ alias full_context context
50
+
51
+ # @return [String]
52
+ def namespace
53
+ context.namespace.to_s
54
+ end
55
+
56
+ # @return [ComplexType, ComplexType::UniqueType]
57
+ # @sg-ignore https://github.com/castwide/solargraph/pull/1100
58
+ def binder
59
+ @binder || context
60
+ end
61
+
62
+ # @return [String]
63
+ def comments
64
+ @comments ||= ''
65
+ end
66
+
67
+ # @return [String]
68
+ def path
69
+ @path ||= name.empty? ? context.namespace : "#{context.namespace}::#{name}"
70
+ end
71
+
72
+ protected
73
+
74
+ attr_writer :context
75
+
76
+ private
77
+
78
+ # @return [ComplexType]
79
+ def find_context
80
+ here = closure
81
+ until here.nil?
82
+ if here.is_a?(Pin::Namespace)
83
+ return here.return_type
84
+ elsif here.is_a?(Pin::Method)
85
+ return here.context
86
+ end
87
+ # @sg-ignore Need to add nil check here
88
+ here = here.closure
89
+ end
90
+ ComplexType::ROOT
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,55 @@
1
+ module Solargraph
2
+ module Pin
3
+ # A series of statements where if a given statement executes, /all
4
+ # of the previous statements in the sequence must have executed as
5
+ # well/. In other words, the statements are run from the top in
6
+ # sequence, until interrupted by something like a
7
+ # return/break/next/raise/etc.
8
+ #
9
+ # This mix-in is used in flow sensitive typing to determine how
10
+ # far we can assume a given assertion about a type can be trusted
11
+ # to be true.
12
+ #
13
+ # Some examples in Ruby:
14
+ #
15
+ # * Bodies of methods and Ruby blocks
16
+ # * Branches of conditionals and loops - if/elsif/else,
17
+ # unless/else, when, until, ||=, ?:, switch/case/else
18
+ # * The body of begin-end/try/rescue/ensure statements
19
+ #
20
+ # Compare/contrast with:
21
+ #
22
+ # * Scope - a sequence where variables declared are not available
23
+ # after the end of the scope. Note that this is not necessarily
24
+ # true for a compound statement.
25
+ # * Compound statement - synonym
26
+ # * Block - in Ruby this has a special meaning (a closure passed to a method), but
27
+ # in general parlance this is also a synonym.
28
+ # * Closure - a sequence which is also a scope
29
+ # * Namespace - a named sequence which is also a scope and a
30
+ # closure
31
+ #
32
+ # See:
33
+ # https://cse.buffalo.edu/~regan/cse305/RubyBNF.pdf
34
+ # https://ruby-doc.org/docs/ruby-doc-bundle/Manual/man-1.4/syntax.html
35
+ # https://en.wikipedia.org/wiki/Block_(programming)
36
+ #
37
+ # Note:
38
+ #
39
+ # Just because statement #1 in a sequence is executed, it doesn't
40
+ # mean that future ones will. Consider the effect of
41
+ # break/next/return/raise/etc. on control flow.
42
+ class CompoundStatement < Pin::Base
43
+ attr_reader :node
44
+
45
+ # @param receiver [Parser::AST::Node, nil]
46
+ # @param node [Parser::AST::Node, nil]
47
+ # @param context [ComplexType, nil]
48
+ # @param args [::Array<Parameter>]
49
+ def initialize node: nil, **splat
50
+ super(**splat)
51
+ @node = node
52
+ end
53
+ end
54
+ end
55
+ end
@@ -1,123 +1,124 @@
1
- # frozen_string_literal: true
2
-
3
- require 'cgi'
4
-
5
- module Solargraph
6
- module Pin
7
- # @todo Move this stuff. It should be the responsibility of the language server.
8
- # @todo abstract methods below should be verified to be overridden
9
- # by type checker when mixin included by non-abstract class
10
- module Conversions
11
- # @!parse
12
- # include Documenting
13
- # include Common
14
-
15
- # @return [Integer]
16
- # @abstract
17
- def completion_item_kind
18
- raise NotImplementedError
19
- end
20
-
21
- # @abstract
22
- # @return [Boolean]
23
- def deprecated?
24
- raise NotImplementedError
25
- end
26
-
27
- # @abstract
28
- def probed?
29
- raise NotImplementedError
30
- end
31
-
32
- # @abstract
33
- def proxied?
34
- raise NotImplementedError
35
- end
36
-
37
- # @return [Hash]
38
- def completion_item
39
- @completion_item ||= {
40
- label: name,
41
- kind: completion_item_kind,
42
- detail: detail,
43
- data: {
44
- path: path,
45
- return_type: return_type.tag,
46
- location: (location ? location.to_hash : nil),
47
- deprecated: deprecated?
48
- }
49
- }
50
- end
51
-
52
- # @return [Hash]
53
- def resolve_completion_item
54
- @resolve_completion_item ||= begin
55
- extra = {}
56
- alldoc = ''
57
- # alldoc += link_documentation unless link_documentation.nil?
58
- # alldoc += "\n\n" unless alldoc.empty?
59
- alldoc += documentation unless documentation.nil?
60
- extra[:documentation] = alldoc unless alldoc.empty?
61
- completion_item.merge(extra)
62
- end
63
- end
64
-
65
- # @return [::Array<Hash>]
66
- def signature_help
67
- []
68
- end
69
-
70
- # @return [String, nil]
71
- def detail
72
- # This property is not cached in an instance variable because it can
73
- # change when pins get proxied.
74
- detail = String.new
75
- detail += "=#{probed? ? '~' : (proxied? ? '^' : '>')} #{return_type.to_s}" unless return_type.undefined?
76
- detail.strip!
77
- return nil if detail.empty?
78
- detail
79
- end
80
-
81
- # Get a markdown-flavored link to a documentation page.
82
- #
83
- # @return [String]
84
- def link_documentation
85
- @link_documentation ||= generate_link
86
- end
87
-
88
- # @return [String, nil]
89
- def text_documentation
90
- this_path = path || name || return_type.tag
91
- return nil if this_path == 'undefined'
92
- escape_brackets this_path
93
- end
94
-
95
- # @return [void]
96
- def reset_conversions
97
- @completion_item = nil
98
- @resolve_completion_item = nil
99
- @signature_help = nil
100
- @detail = nil
101
- @link_documentation = nil
102
- end
103
-
104
- private
105
-
106
- # @return [String, nil]
107
- def generate_link
108
- this_path = path || name || return_type.tag
109
- return nil if this_path == 'undefined'
110
- return nil if this_path.nil? || this_path == 'undefined'
111
- return this_path if path.nil?
112
- "[#{escape_brackets(this_path).gsub('_', '\\\\_')}](solargraph:/document?query=#{CGI.escape(this_path)})"
113
- end
114
-
115
- # @param text [String]
116
- # @return [String]
117
- def escape_brackets text
118
- # text.gsub(/(\<|\>)/, "\\#{$1}")
119
- text.gsub("<", '\<').gsub(">", '\>')
120
- end
121
- end
122
- end
123
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'cgi'
4
+
5
+ module Solargraph
6
+ module Pin
7
+ # @todo Move this stuff. It should be the responsibility of the language server.
8
+ # @todo abstract methods below should be verified to be overridden
9
+ # by type checker when mixin included by non-abstract class
10
+ module Conversions
11
+ # @!parse
12
+ # include Documenting
13
+ # include Common
14
+
15
+ # @return [Integer]
16
+ # @abstract
17
+ def completion_item_kind
18
+ raise NotImplementedError
19
+ end
20
+
21
+ # @abstract
22
+ # @return [Boolean]
23
+ def deprecated?
24
+ raise NotImplementedError
25
+ end
26
+
27
+ # @abstract
28
+ def probed?
29
+ raise NotImplementedError
30
+ end
31
+
32
+ # @abstract
33
+ def proxied?
34
+ raise NotImplementedError
35
+ end
36
+
37
+ # @return [Hash]
38
+ def completion_item
39
+ @completion_item ||= {
40
+ label: name,
41
+ kind: completion_item_kind,
42
+ detail: detail,
43
+ data: {
44
+ path: path,
45
+ return_type: return_type.tag,
46
+ # @sg-ignore flow sensitive typing needs to handle attrs
47
+ location: (location ? location.to_hash : nil),
48
+ deprecated: deprecated?
49
+ }
50
+ }
51
+ end
52
+
53
+ # @return [Hash]
54
+ def resolve_completion_item
55
+ @resolve_completion_item ||= begin
56
+ extra = {}
57
+ alldoc = ''
58
+ # alldoc += link_documentation unless link_documentation.nil?
59
+ # alldoc += "\n\n" unless alldoc.empty?
60
+ alldoc += documentation unless documentation.nil?
61
+ extra[:documentation] = alldoc unless alldoc.empty?
62
+ completion_item.merge(extra)
63
+ end
64
+ end
65
+
66
+ # @return [::Array<Hash>]
67
+ def signature_help
68
+ []
69
+ end
70
+
71
+ # @return [String, nil]
72
+ def detail
73
+ # This property is not cached in an instance variable because it can
74
+ # change when pins get proxied.
75
+ detail = String.new
76
+ detail += "=#{probed? ? '~' : (proxied? ? '^' : '>')} #{return_type.to_s}" unless return_type.undefined?
77
+ detail.strip!
78
+ return nil if detail.empty?
79
+ detail
80
+ end
81
+
82
+ # Get a markdown-flavored link to a documentation page.
83
+ #
84
+ # @return [String, nil]
85
+ def link_documentation
86
+ @link_documentation ||= generate_link
87
+ end
88
+
89
+ # @return [String, nil]
90
+ def text_documentation
91
+ this_path = path || name || return_type.tag
92
+ return nil if this_path == 'undefined'
93
+ escape_brackets this_path
94
+ end
95
+
96
+ # @return [void]
97
+ def reset_conversions
98
+ @completion_item = nil
99
+ @resolve_completion_item = nil
100
+ @signature_help = nil
101
+ @detail = nil
102
+ @link_documentation = nil
103
+ end
104
+
105
+ private
106
+
107
+ # @return [String, nil]
108
+ def generate_link
109
+ this_path = path || name || return_type.tag
110
+ return nil if this_path == 'undefined'
111
+ return nil if this_path.nil? || this_path == 'undefined'
112
+ return this_path if path.nil?
113
+ "[#{escape_brackets(this_path).gsub('_', '\\\\_')}](solargraph:/document?query=#{CGI.escape(this_path)})"
114
+ end
115
+
116
+ # @param text [String]
117
+ # @return [String]
118
+ def escape_brackets text
119
+ # text.gsub(/(\<|\>)/, "\\#{$1}")
120
+ text.gsub("<", '\<').gsub(">", '\>')
121
+ end
122
+ end
123
+ end
124
+ end