solargraph 0.58.0 → 0.59.0

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 (219) hide show
  1. checksums.yaml +4 -4
  2. data/.envrc +3 -0
  3. data/.gitattributes +2 -0
  4. data/.github/workflows/linting.yml +6 -5
  5. data/.github/workflows/plugins.yml +48 -35
  6. data/.github/workflows/rspec.yml +15 -28
  7. data/.github/workflows/typecheck.yml +3 -2
  8. data/.gitignore +1 -0
  9. data/.rubocop.yml +38 -6
  10. data/.rubocop_todo.yml +53 -966
  11. data/CHANGELOG.md +24 -0
  12. data/Gemfile +3 -1
  13. data/README.md +3 -3
  14. data/Rakefile +26 -23
  15. data/bin/solargraph +9 -8
  16. data/lib/solargraph/api_map/cache.rb +110 -110
  17. data/lib/solargraph/api_map/constants.rb +288 -279
  18. data/lib/solargraph/api_map/index.rb +204 -193
  19. data/lib/solargraph/api_map/source_to_yard.rb +110 -97
  20. data/lib/solargraph/api_map/store.rb +395 -384
  21. data/lib/solargraph/api_map.rb +1029 -945
  22. data/lib/solargraph/bench.rb +44 -45
  23. data/lib/solargraph/complex_type/conformance.rb +176 -0
  24. data/lib/solargraph/complex_type/type_methods.rb +240 -228
  25. data/lib/solargraph/complex_type/unique_type.rb +641 -482
  26. data/lib/solargraph/complex_type.rb +557 -444
  27. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
  28. data/lib/solargraph/convention/data_definition/data_definition_node.rb +93 -91
  29. data/lib/solargraph/convention/data_definition.rb +108 -105
  30. data/lib/solargraph/convention/gemfile.rb +15 -15
  31. data/lib/solargraph/convention/gemspec.rb +23 -23
  32. data/lib/solargraph/convention/rakefile.rb +17 -17
  33. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +62 -61
  34. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +103 -102
  35. data/lib/solargraph/convention/struct_definition.rb +168 -164
  36. data/lib/solargraph/convention.rb +78 -78
  37. data/lib/solargraph/converters/dd.rb +19 -17
  38. data/lib/solargraph/converters/dl.rb +17 -15
  39. data/lib/solargraph/converters/dt.rb +17 -15
  40. data/lib/solargraph/converters/misc.rb +3 -1
  41. data/lib/solargraph/diagnostics/require_not_found.rb +54 -53
  42. data/lib/solargraph/diagnostics/rubocop.rb +119 -118
  43. data/lib/solargraph/diagnostics/rubocop_helpers.rb +70 -68
  44. data/lib/solargraph/diagnostics/type_check.rb +56 -55
  45. data/lib/solargraph/diagnostics/update_errors.rb +37 -41
  46. data/lib/solargraph/doc_map.rb +438 -439
  47. data/lib/solargraph/equality.rb +34 -34
  48. data/lib/solargraph/gem_pins.rb +98 -98
  49. data/lib/solargraph/language_server/error_codes.rb +20 -20
  50. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  51. data/lib/solargraph/language_server/host/dispatch.rb +130 -130
  52. data/lib/solargraph/language_server/host/message_worker.rb +113 -112
  53. data/lib/solargraph/language_server/host/sources.rb +100 -99
  54. data/lib/solargraph/language_server/host.rb +886 -878
  55. data/lib/solargraph/language_server/message/base.rb +97 -97
  56. data/lib/solargraph/language_server/message/client/register_capability.rb +13 -15
  57. data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -60
  58. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +108 -114
  59. data/lib/solargraph/language_server/message/extended/document.rb +24 -23
  60. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  61. data/lib/solargraph/language_server/message/extended/download_core.rb +20 -19
  62. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  63. data/lib/solargraph/language_server/message/initialize.rb +197 -191
  64. data/lib/solargraph/language_server/message/text_document/completion.rb +58 -56
  65. data/lib/solargraph/language_server/message/text_document/definition.rb +49 -40
  66. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +23 -16
  67. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +36 -26
  68. data/lib/solargraph/language_server/message/text_document/formatting.rb +150 -148
  69. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
  70. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +18 -11
  71. data/lib/solargraph/language_server/message/text_document/references.rb +23 -16
  72. data/lib/solargraph/language_server/message/text_document/rename.rb +26 -19
  73. data/lib/solargraph/language_server/message/text_document/signature_help.rb +25 -24
  74. data/lib/solargraph/language_server/message/text_document/type_definition.rb +33 -25
  75. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +41 -35
  76. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +48 -40
  77. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +32 -26
  78. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +33 -23
  79. data/lib/solargraph/language_server/message.rb +94 -94
  80. data/lib/solargraph/language_server/request.rb +29 -27
  81. data/lib/solargraph/language_server/transport/data_reader.rb +72 -74
  82. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  83. data/lib/solargraph/library.rb +702 -683
  84. data/lib/solargraph/location.rb +85 -82
  85. data/lib/solargraph/logging.rb +55 -37
  86. data/lib/solargraph/page.rb +92 -92
  87. data/lib/solargraph/parser/comment_ripper.rb +84 -69
  88. data/lib/solargraph/parser/flow_sensitive_typing.rb +471 -255
  89. data/lib/solargraph/parser/node_processor/base.rb +122 -92
  90. data/lib/solargraph/parser/node_processor.rb +63 -62
  91. data/lib/solargraph/parser/parser_gem/class_methods.rb +165 -149
  92. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
  93. data/lib/solargraph/parser/parser_gem/node_chainer.rb +191 -166
  94. data/lib/solargraph/parser/parser_gem/node_methods.rb +507 -486
  95. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
  96. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +61 -59
  97. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +24 -15
  98. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +45 -46
  99. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +60 -53
  100. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +38 -37
  101. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +53 -23
  102. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +42 -40
  103. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +30 -29
  104. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +61 -59
  105. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
  106. data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
  107. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
  108. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +39 -38
  109. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +51 -52
  110. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +302 -291
  111. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
  112. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
  113. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +33 -29
  114. data/lib/solargraph/parser/parser_gem/node_processors.rb +74 -70
  115. data/lib/solargraph/parser/parser_gem.rb +14 -12
  116. data/lib/solargraph/parser/region.rb +75 -69
  117. data/lib/solargraph/parser/snippet.rb +19 -17
  118. data/lib/solargraph/parser.rb +25 -23
  119. data/lib/solargraph/pin/base.rb +773 -729
  120. data/lib/solargraph/pin/base_variable.rb +375 -126
  121. data/lib/solargraph/pin/block.rb +127 -104
  122. data/lib/solargraph/pin/breakable.rb +15 -9
  123. data/lib/solargraph/pin/callable.rb +275 -231
  124. data/lib/solargraph/pin/closure.rb +69 -72
  125. data/lib/solargraph/pin/common.rb +97 -79
  126. data/lib/solargraph/pin/compound_statement.rb +55 -0
  127. data/lib/solargraph/pin/constant.rb +43 -45
  128. data/lib/solargraph/pin/conversions.rb +129 -123
  129. data/lib/solargraph/pin/delegated_method.rb +131 -120
  130. data/lib/solargraph/pin/documenting.rb +116 -114
  131. data/lib/solargraph/pin/instance_variable.rb +38 -34
  132. data/lib/solargraph/pin/keyword.rb +16 -20
  133. data/lib/solargraph/pin/local_variable.rb +31 -75
  134. data/lib/solargraph/pin/method.rb +724 -672
  135. data/lib/solargraph/pin/method_alias.rb +42 -34
  136. data/lib/solargraph/pin/namespace.rb +122 -115
  137. data/lib/solargraph/pin/parameter.rb +339 -275
  138. data/lib/solargraph/pin/proxy_type.rb +42 -39
  139. data/lib/solargraph/pin/reference/override.rb +47 -47
  140. data/lib/solargraph/pin/reference/superclass.rb +17 -15
  141. data/lib/solargraph/pin/reference/type_alias.rb +16 -0
  142. data/lib/solargraph/pin/reference.rb +59 -39
  143. data/lib/solargraph/pin/search.rb +62 -61
  144. data/lib/solargraph/pin/signature.rb +64 -61
  145. data/lib/solargraph/pin/symbol.rb +54 -53
  146. data/lib/solargraph/pin/until.rb +16 -18
  147. data/lib/solargraph/pin/while.rb +16 -18
  148. data/lib/solargraph/pin.rb +46 -44
  149. data/lib/solargraph/pin_cache.rb +248 -245
  150. data/lib/solargraph/position.rb +139 -119
  151. data/lib/solargraph/range.rb +113 -112
  152. data/lib/solargraph/rbs_map/conversions.rb +952 -823
  153. data/lib/solargraph/rbs_map/core_fills.rb +91 -84
  154. data/lib/solargraph/rbs_map/core_map.rb +65 -58
  155. data/lib/solargraph/rbs_map/stdlib_map.rb +71 -43
  156. data/lib/solargraph/rbs_map.rb +207 -163
  157. data/lib/solargraph/server_methods.rb +16 -16
  158. data/lib/solargraph/shell.rb +555 -352
  159. data/lib/solargraph/source/chain/array.rb +39 -37
  160. data/lib/solargraph/source/chain/call.rb +377 -337
  161. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  162. data/lib/solargraph/source/chain/constant.rb +30 -26
  163. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  164. data/lib/solargraph/source/chain/hash.rb +37 -34
  165. data/lib/solargraph/source/chain/if.rb +30 -28
  166. data/lib/solargraph/source/chain/instance_variable.rb +36 -13
  167. data/lib/solargraph/source/chain/link.rb +99 -109
  168. data/lib/solargraph/source/chain/literal.rb +51 -48
  169. data/lib/solargraph/source/chain/or.rb +29 -23
  170. data/lib/solargraph/source/chain/q_call.rb +13 -11
  171. data/lib/solargraph/source/chain/variable.rb +15 -13
  172. data/lib/solargraph/source/chain/z_super.rb +28 -30
  173. data/lib/solargraph/source/chain.rb +304 -291
  174. data/lib/solargraph/source/change.rb +89 -82
  175. data/lib/solargraph/source/cursor.rb +172 -166
  176. data/lib/solargraph/source/encoding_fixes.rb +22 -23
  177. data/lib/solargraph/source/source_chainer.rb +218 -194
  178. data/lib/solargraph/source/updater.rb +59 -55
  179. data/lib/solargraph/source.rb +522 -498
  180. data/lib/solargraph/source_map/clip.rb +245 -226
  181. data/lib/solargraph/source_map/data.rb +37 -34
  182. data/lib/solargraph/source_map/mapper.rb +286 -259
  183. data/lib/solargraph/source_map.rb +224 -212
  184. data/lib/solargraph/type_checker/problem.rb +34 -32
  185. data/lib/solargraph/type_checker/rules.rb +157 -84
  186. data/lib/solargraph/type_checker.rb +888 -814
  187. data/lib/solargraph/version.rb +5 -5
  188. data/lib/solargraph/workspace/config.rb +258 -255
  189. data/lib/solargraph/workspace/gemspecs.rb +367 -0
  190. data/lib/solargraph/workspace/require_paths.rb +98 -97
  191. data/lib/solargraph/workspace.rb +242 -220
  192. data/lib/solargraph/yard_map/helpers.rb +49 -44
  193. data/lib/solargraph/yard_map/mapper/to_method.rb +136 -130
  194. data/lib/solargraph/yard_map/mapper/to_namespace.rb +32 -31
  195. data/lib/solargraph/yard_map/mapper.rb +84 -79
  196. data/lib/solargraph/yard_map.rb +17 -18
  197. data/lib/solargraph/yard_tags.rb +20 -20
  198. data/lib/solargraph/yardoc.rb +90 -87
  199. data/lib/solargraph.rb +128 -105
  200. data/rbs/fills/rubygems/0/dependency.rbs +193 -0
  201. data/rbs/fills/tuple/tuple.rbs +28 -0
  202. data/rbs/shims/ast/0/node.rbs +5 -0
  203. data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
  204. data/rbs_collection.yaml +1 -1
  205. data/solargraph.gemspec +37 -35
  206. metadata +52 -51
  207. data/lib/solargraph/type_checker/checks.rb +0 -124
  208. data/lib/solargraph/type_checker/param_def.rb +0 -37
  209. data/lib/solargraph/yard_map/to_method.rb +0 -89
  210. data/sig/shims/ast/0/node.rbs +0 -5
  211. /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
  212. /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
  213. /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
  214. /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
  215. /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
  216. /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
  217. /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
  218. /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
  219. /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
@@ -1,82 +1,85 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- # A pointer to a section of source text identified by its filename
5
- # and Range.
6
- #
7
- class Location
8
- include Equality
9
-
10
- # @return [String]
11
- attr_reader :filename
12
-
13
- # @return [Solargraph::Range]
14
- attr_reader :range
15
-
16
- # @param filename [String]
17
- # @param range [Solargraph::Range]
18
- def initialize filename, range
19
- @filename = filename
20
- @range = range
21
- end
22
-
23
- # @sg-ignore Fix "Not enough arguments to Module#protected"
24
- protected def equality_fields
25
- [filename, range]
26
- end
27
-
28
- # @param other [self]
29
- def <=>(other)
30
- return nil unless other.is_a?(Location)
31
- if filename == other.filename
32
- range <=> other.range
33
- else
34
- filename <=> other.filename
35
- end
36
- end
37
-
38
- def rbs?
39
- filename.end_with?('.rbs')
40
- end
41
-
42
- # @param location [self]
43
- def contain? location
44
- range.contain?(location.range.start) && range.contain?(location.range.ending) && filename == location.filename
45
- end
46
-
47
- def inspect
48
- "<#{self.class.name}: filename=#{filename}, range=#{range.inspect}>"
49
- end
50
-
51
- def to_s
52
- inspect
53
- end
54
-
55
- # @return [Hash]
56
- def to_hash
57
- {
58
- filename: filename,
59
- range: range.to_hash
60
- }
61
- end
62
-
63
- # @param node [Parser::AST::Node, nil]
64
- # @return [Location, nil]
65
- def self.from_node(node)
66
- return nil if node.nil? || node.loc.nil?
67
- range = Range.from_node(node)
68
- self.new(node.loc.expression.source_buffer.name, range)
69
- end
70
-
71
- # @param other [BasicObject]
72
- def == other
73
- return false unless other.is_a?(Location)
74
- # @sg-ignore https://github.com/castwide/solargraph/pull/1114
75
- filename == other.filename and range == other.range
76
- end
77
-
78
- def inspect
79
- "#<#{self.class} #{filename}, #{range.inspect}>"
80
- end
81
- end
82
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ # A pointer to a section of source text identified by its filename
5
+ # and Range.
6
+ #
7
+ class Location
8
+ include Equality
9
+ include Comparable
10
+
11
+ # @return [String]
12
+ attr_reader :filename
13
+
14
+ # @return [Solargraph::Range]
15
+ attr_reader :range
16
+
17
+ # @param filename [String, nil]
18
+ # @param range [Solargraph::Range]
19
+ def initialize filename, range
20
+ raise 'Use nil to represent no-file' if filename&.empty?
21
+
22
+ @filename = filename
23
+ @range = range
24
+ end
25
+
26
+ # @param other [self]
27
+ def <=> other
28
+ return nil unless other.is_a?(Location)
29
+ if filename == other.filename
30
+ range <=> other.range
31
+ else
32
+ filename <=> other.filename
33
+ end
34
+ end
35
+
36
+ def rbs?
37
+ filename.end_with?('.rbs')
38
+ end
39
+
40
+ # @param location [self]
41
+ def contain? location
42
+ range.contain?(location.range.start) && range.contain?(location.range.ending) && filename == location.filename
43
+ end
44
+
45
+ def to_s
46
+ inspect
47
+ end
48
+
49
+ # @return [Hash]
50
+ def to_hash
51
+ {
52
+ filename: filename,
53
+ range: range.to_hash
54
+ }
55
+ end
56
+
57
+ # @param node [Parser::AST::Node, nil]
58
+ # @return [Location, nil]
59
+ def self.from_node node
60
+ return nil if node.nil? || node.loc.nil?
61
+ filename = node.loc.expression.source_buffer.name
62
+ # @sg-ignore flow sensitive typing needs to create separate ranges for postfix if
63
+ filename = nil if filename.empty?
64
+ range = Range.from_node(node)
65
+ # @sg-ignore Need to add nil check here
66
+ new(filename, range)
67
+ end
68
+
69
+ # @param other [BasicObject]
70
+ def == other
71
+ return false unless other.is_a?(Location)
72
+ filename == other.filename and range == other.range
73
+ end
74
+
75
+ def inspect
76
+ "#<#{self.class} #{filename}, #{range.inspect}>"
77
+ end
78
+
79
+ protected
80
+
81
+ def equality_fields
82
+ [filename, range]
83
+ end
84
+ end
85
+ end
@@ -1,37 +1,55 @@
1
- # frozen_string_literal: true
2
-
3
- require 'logger'
4
-
5
- module Solargraph
6
- module Logging
7
- DEFAULT_LOG_LEVEL = Logger::WARN
8
-
9
- LOG_LEVELS = {
10
- 'warn' => Logger::WARN,
11
- 'info' => Logger::INFO,
12
- 'debug' => Logger::DEBUG
13
- }
14
- configured_level = ENV.fetch('SOLARGRAPH_LOG', nil)
15
- level = if LOG_LEVELS.keys.include?(configured_level)
16
- LOG_LEVELS.fetch(configured_level)
17
- else
18
- if configured_level
19
- warn "Invalid value for SOLARGRAPH_LOG: #{configured_level.inspect} - " \
20
- "valid values are #{LOG_LEVELS.keys}"
21
- end
22
- DEFAULT_LOG_LEVEL
23
- end
24
- @@logger = Logger.new(STDERR, level: level)
25
- # @sg-ignore Fix cvar issue
26
- @@logger.formatter = proc do |severity, datetime, progname, msg|
27
- "[#{severity}] #{msg}\n"
28
- end
29
-
30
- module_function
31
-
32
- # @return [Logger]
33
- def logger
34
- @@logger
35
- end
36
- end
37
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'logger'
4
+
5
+ module Solargraph
6
+ module Logging
7
+ DEFAULT_LOG_LEVEL = Logger::WARN
8
+
9
+ LOG_LEVELS = {
10
+ 'warn' => Logger::WARN,
11
+ 'info' => Logger::INFO,
12
+ 'debug' => Logger::DEBUG
13
+ }.freeze
14
+ configured_level = ENV.fetch('SOLARGRAPH_LOG', nil)
15
+ level = if LOG_LEVELS.keys.include?(configured_level)
16
+ LOG_LEVELS.fetch(configured_level)
17
+ else
18
+ if configured_level
19
+ warn "Invalid value for SOLARGRAPH_LOG: #{configured_level.inspect} - " \
20
+ "valid values are #{LOG_LEVELS.keys}"
21
+ end
22
+ DEFAULT_LOG_LEVEL
23
+ end
24
+ @@logger = Logger.new($stderr, level: level)
25
+ # @sg-ignore Fix cvar issue
26
+ @@logger.formatter = proc do |severity, _datetime, _progname, msg|
27
+ "[#{severity}] #{msg}\n"
28
+ end
29
+
30
+ module_function
31
+
32
+ # override this in your class to temporarily set a custom
33
+ # filtering log level for the class (e.g., suppress any debug
34
+ # message by setting it to :info even if it is set elsewhere, or
35
+ # show existing debug messages by setting to :debug).
36
+ #
37
+ # @return [Symbol]
38
+ def log_level
39
+ :warn
40
+ end
41
+
42
+ # @return [Logger]
43
+ def logger
44
+ if LOG_LEVELS[log_level.to_s] == DEFAULT_LOG_LEVEL
45
+ @@logger
46
+ else
47
+ new_log_level = LOG_LEVELS[log_level.to_s]
48
+ logger = Logger.new($stderr, level: new_log_level)
49
+
50
+ logger.formatter = @@logger.formatter
51
+ logger
52
+ end
53
+ end
54
+ end
55
+ end
@@ -1,92 +1,92 @@
1
- # frozen_string_literal: true
2
-
3
- require 'ostruct'
4
- require 'tilt'
5
- require 'yard'
6
- require 'cgi'
7
-
8
- module Solargraph
9
- class Page
10
- # @todo This method directive is necessary because OpenStruct.new confuses
11
- # the typechecker.
12
- # @!method self.new(locals, render_method)
13
- # @param locals[Hash]
14
- # @param render_method [Proc]
15
- # @return [Binder]
16
- class Binder < OpenStruct
17
- # @param locals [Hash]
18
- # @param render_method [Proc]
19
- def initialize locals, render_method
20
- super(locals)
21
- define_singleton_method :render do |template, layout: false, locals: {}|
22
- render_method.call(template, layout: layout, locals: locals)
23
- end
24
- define_singleton_method :erb do |template, layout: false, locals: {}|
25
- render_method.call(template, layout: layout, locals: locals)
26
- end
27
- end
28
-
29
- # @param text [String]
30
- # @return [String]
31
- def htmlify text
32
- # @type [String]
33
- YARD::Templates::Helpers::Markup::RDocMarkup.new(text).to_html
34
- end
35
-
36
- # @param text [String]
37
- # @return [String]
38
- def escape text
39
- CGI.escapeHTML(text)
40
- end
41
-
42
- # @param code [String]
43
- # @return [String]
44
- def ruby_to_html code
45
- code
46
- end
47
- end
48
- private_constant :Binder
49
-
50
- # @param directory [String]
51
- def initialize directory = VIEWS_PATH
52
- directory = VIEWS_PATH if directory.nil? or !File.directory?(directory)
53
- directories = [directory]
54
- directories.push VIEWS_PATH if directory != VIEWS_PATH
55
- # @type [Proc]
56
- # @param template [String]
57
- # @param layout [Boolean]
58
- # @param locals [Hash]
59
- @render_method = proc { |template, layout: false, locals: {}|
60
- binder = Binder.new(locals, @render_method)
61
- if layout
62
- Tilt::ERBTemplate.new(Page.select_template(directories, 'layout')).render(binder) do
63
- Tilt::ERBTemplate.new(Page.select_template(directories, template)).render(binder)
64
- end
65
- else
66
- Tilt::ERBTemplate.new(Page.select_template(directories, template)).render(binder)
67
- end
68
- }
69
- end
70
-
71
- # @param template [String]
72
- # @param layout [Boolean]
73
- # @param locals [Hash]
74
- # @sg-ignore
75
- # @return [String]
76
- def render template, layout: true, locals: {}
77
- # @type [String]
78
- @render_method.call(template, layout: layout, locals: locals)
79
- end
80
-
81
- # @param directories [Array<String>]
82
- # @param name [String]
83
- # @return [String]
84
- def self.select_template directories, name
85
- directories.each do |dir|
86
- path = File.join(dir, "#{name}.erb")
87
- return path if File.file?(path)
88
- end
89
- raise FileNotFoundError, "Template not found: #{name}"
90
- end
91
- end
92
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'ostruct'
4
+ require 'tilt'
5
+ require 'yard'
6
+ require 'cgi'
7
+
8
+ module Solargraph
9
+ class Page
10
+ # @todo This method directive is necessary because OpenStruct.new confuses
11
+ # the typechecker.
12
+ # @!method self.new(locals, render_method)
13
+ # @param locals[Hash]
14
+ # @param render_method [Proc]
15
+ # @return [Binder]
16
+ class Binder < OpenStruct
17
+ # @param locals [Hash]
18
+ # @param render_method [Proc]
19
+ def initialize locals, render_method
20
+ super(locals)
21
+ define_singleton_method :render do |template, layout: false, locals: {}|
22
+ render_method.call(template, layout: layout, locals: locals)
23
+ end
24
+ define_singleton_method :erb do |template, layout: false, locals: {}|
25
+ render_method.call(template, layout: layout, locals: locals)
26
+ end
27
+ end
28
+
29
+ # @param text [String]
30
+ # @return [String]
31
+ def htmlify text
32
+ # @type [String]
33
+ YARD::Templates::Helpers::Markup::RDocMarkup.new(text).to_html
34
+ end
35
+
36
+ # @param text [String]
37
+ # @return [String]
38
+ def escape text
39
+ CGI.escapeHTML(text)
40
+ end
41
+
42
+ # @param code [String]
43
+ # @return [String]
44
+ def ruby_to_html code
45
+ code
46
+ end
47
+ end
48
+ private_constant :Binder
49
+
50
+ # @param directory [String]
51
+ def initialize directory = VIEWS_PATH
52
+ directory = VIEWS_PATH if directory.nil? || !File.directory?(directory)
53
+ directories = [directory]
54
+ directories.push VIEWS_PATH if directory != VIEWS_PATH
55
+ # @type [Proc]
56
+ # @param template [String]
57
+ # @param layout [Boolean]
58
+ # @param locals [Hash]
59
+ @render_method = proc { |template, layout: false, locals: {}|
60
+ binder = Binder.new(locals, @render_method)
61
+ if layout
62
+ Tilt::ERBTemplate.new(Page.select_template(directories, 'layout')).render(binder) do
63
+ Tilt::ERBTemplate.new(Page.select_template(directories, template)).render(binder)
64
+ end
65
+ else
66
+ Tilt::ERBTemplate.new(Page.select_template(directories, template)).render(binder)
67
+ end
68
+ }
69
+ end
70
+
71
+ # @param template [String]
72
+ # @param layout [Boolean]
73
+ # @param locals [Hash]
74
+ # @sg-ignore
75
+ # @return [String]
76
+ def render template, layout: true, locals: {}
77
+ # @type [String]
78
+ @render_method.call(template, layout: layout, locals: locals)
79
+ end
80
+
81
+ # @param directories [Array<String>]
82
+ # @param name [String]
83
+ # @return [String]
84
+ def self.select_template directories, name
85
+ directories.each do |dir|
86
+ path = File.join(dir, "#{name}.erb")
87
+ return path if File.file?(path)
88
+ end
89
+ raise FileNotFoundError, "Template not found: #{name}"
90
+ end
91
+ end
92
+ end
@@ -1,69 +1,84 @@
1
- require 'ripper'
2
-
3
- module Solargraph
4
- module Parser
5
- class CommentRipper < Ripper::SexpBuilderPP
6
- # @!override Ripper::SexpBuilder#on_embdoc_beg
7
- # @return [Array(Symbol, String, Array)]
8
- # @!override Ripper::SexpBuilder#on_embdoc
9
- # @return [Array(Symbol, String, Array)]
10
- # @!override Ripper::SexpBuilder#on_embdoc_end
11
- # @return [Array(Symbol, String, Array)]
12
-
13
- # @param src [String]
14
- # @param filename [String]
15
- # @param lineno [Integer]
16
- def initialize src, filename = '(ripper)', lineno = 0
17
- super
18
- @buffer = src
19
- @buffer_lines = @buffer.lines
20
- end
21
-
22
- def on_comment *args
23
- # @sg-ignore
24
- # @type [Array(Symbol, String, Array([Integer, nil], [Integer, nil]))]
25
- result = super
26
- if @buffer_lines[result[2][0]][0..result[2][1]].strip =~ /^#/
27
- chomped = result[1].chomp
28
- if result[2][0] == 0 && chomped.encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '').match(/^#\s*frozen_string_literal:/)
29
- chomped = '#'
30
- end
31
- @comments[result[2][0]] = Snippet.new(Range.from_to(result[2][0], result[2][1], result[2][0], result[2][1] + chomped.length), chomped)
32
- end
33
- result
34
- end
35
-
36
- # @param result [Array(Symbol, String, Array([Integer, nil], [Integer, nil]))]
37
- # @return [void]
38
- def create_snippet(result)
39
- chomped = result[1].chomp
40
- @comments[result[2][0]] = Snippet.new(Range.from_to(result[2][0] || 0, result[2][1] || 0, result[2][0] || 0, (result[2][1] || 0) + chomped.length), chomped)
41
- end
42
-
43
- def on_embdoc_beg *args
44
- result = super
45
- create_snippet(result)
46
- result
47
- end
48
-
49
- def on_embdoc *args
50
- result = super
51
- create_snippet(result)
52
- result
53
- end
54
-
55
- def on_embdoc_end *args
56
- result = super
57
- create_snippet(result)
58
- result
59
- end
60
-
61
- # @return [Hash{Integer => Solargraph::Parser::Snippet}]
62
- def parse
63
- @comments = {}
64
- super
65
- @comments
66
- end
67
- end
68
- end
69
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'ripper'
4
+
5
+ module Solargraph
6
+ module Parser
7
+ class CommentRipper < Ripper::SexpBuilderPP
8
+ # @!override Ripper::SexpBuilder#on_embdoc_beg
9
+ # @return [Array(Symbol, String, Array)]
10
+ # @!override Ripper::SexpBuilder#on_embdoc
11
+ # @return [Array(Symbol, String, Array)]
12
+ # @!override Ripper::SexpBuilder#on_embdoc_end
13
+ # @return [Array(Symbol, String, Array)]
14
+
15
+ # @param src [String]
16
+ # @param filename [String]
17
+ # @param lineno [Integer]
18
+ def initialize src, filename = '(ripper)', lineno = 0
19
+ super
20
+ @buffer = src
21
+ @buffer_lines = @buffer.lines
22
+ end
23
+
24
+ def on_comment *args
25
+ # @sg-ignore
26
+ # @type [Array(Symbol, String, Array([Integer, nil], [Integer, nil]))]
27
+ result = super
28
+ # @sg-ignore Need to add nil check here
29
+ if @buffer_lines[result[2][0]][0..result[2][1]].strip =~ /^#/
30
+ chomped = result[1].chomp
31
+ if result[2][0].zero? && chomped.encode('UTF-8', 'binary', invalid: :replace, undef: :replace,
32
+ replace: '').match(/^#\s*frozen_string_literal:/)
33
+ chomped = '#'
34
+ end
35
+ @comments[result[2][0]] =
36
+ Snippet.new(Range.from_to(result[2][0], result[2][1], result[2][0], result[2][1] + chomped.length), chomped)
37
+ end
38
+ result
39
+ end
40
+
41
+ # @param result [Array(Symbol, String, Array([Integer, nil], [Integer, nil]))]
42
+ # @return [void]
43
+ def create_snippet result
44
+ chomped = result[1].chomp
45
+ @comments[result[2][0]] =
46
+ Snippet.new(
47
+ Range.from_to(result[2][0] || 0, result[2][1] || 0, result[2][0] || 0,
48
+ (result[2][1] || 0) + chomped.length), chomped
49
+ )
50
+ end
51
+
52
+ # @sg-ignore @override is adding, not overriding
53
+ def on_embdoc_beg *args
54
+ result = super
55
+ # @sg-ignore @override is adding, not overriding
56
+ create_snippet(result)
57
+ result
58
+ end
59
+
60
+ # @sg-ignore @override is adding, not overriding
61
+ def on_embdoc *args
62
+ result = super
63
+ # @sg-ignore @override is adding, not overriding
64
+ create_snippet(result)
65
+ result
66
+ end
67
+
68
+ # @sg-ignore @override is adding, not overriding
69
+ def on_embdoc_end *args
70
+ result = super
71
+ # @sg-ignore @override is adding, not overriding
72
+ create_snippet(result)
73
+ result
74
+ end
75
+
76
+ # @return [Hash{Integer => Solargraph::Parser::Snippet}]
77
+ def parse
78
+ @comments = {}
79
+ super
80
+ @comments
81
+ end
82
+ end
83
+ end
84
+ end