solargraph 0.54.4 → 0.58.3

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 (238) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +2 -0
  3. data/.github/workflows/linting.yml +127 -0
  4. data/.github/workflows/plugins.yml +185 -6
  5. data/.github/workflows/rspec.yml +55 -5
  6. data/.github/workflows/typecheck.yml +8 -3
  7. data/.gitignore +8 -0
  8. data/.overcommit.yml +72 -0
  9. data/.rspec +1 -0
  10. data/.rubocop.yml +66 -0
  11. data/.rubocop_todo.yml +1279 -0
  12. data/.yardopts +1 -0
  13. data/CHANGELOG.md +143 -0
  14. data/README.md +20 -6
  15. data/Rakefile +125 -13
  16. data/bin/solargraph +3 -0
  17. data/lib/solargraph/api_map/cache.rb +110 -109
  18. data/lib/solargraph/api_map/constants.rb +279 -0
  19. data/lib/solargraph/api_map/index.rb +193 -167
  20. data/lib/solargraph/api_map/source_to_yard.rb +97 -88
  21. data/lib/solargraph/api_map/store.rb +384 -241
  22. data/lib/solargraph/api_map.rb +945 -875
  23. data/lib/solargraph/bench.rb +45 -28
  24. data/lib/solargraph/complex_type/type_methods.rb +228 -217
  25. data/lib/solargraph/complex_type/unique_type.rb +482 -386
  26. data/lib/solargraph/complex_type.rb +444 -394
  27. data/lib/solargraph/convention/active_support_concern.rb +111 -0
  28. data/lib/solargraph/convention/base.rb +20 -3
  29. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -0
  30. data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -0
  31. data/lib/solargraph/convention/data_definition.rb +105 -0
  32. data/lib/solargraph/convention/gemfile.rb +15 -15
  33. data/lib/solargraph/convention/gemspec.rb +23 -22
  34. data/lib/solargraph/convention/rakefile.rb +17 -17
  35. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -0
  36. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -0
  37. data/lib/solargraph/convention/struct_definition.rb +164 -0
  38. data/lib/solargraph/convention.rb +78 -47
  39. data/lib/solargraph/converters/dd.rb +17 -17
  40. data/lib/solargraph/converters/dl.rb +15 -15
  41. data/lib/solargraph/converters/dt.rb +15 -15
  42. data/lib/solargraph/converters/misc.rb +1 -1
  43. data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
  44. data/lib/solargraph/diagnostics/rubocop.rb +118 -113
  45. data/lib/solargraph/diagnostics/rubocop_helpers.rb +68 -66
  46. data/lib/solargraph/diagnostics/type_check.rb +55 -55
  47. data/lib/solargraph/diagnostics/update_errors.rb +41 -41
  48. data/lib/solargraph/doc_map.rb +439 -188
  49. data/lib/solargraph/environ.rb +9 -2
  50. data/lib/solargraph/equality.rb +34 -33
  51. data/lib/solargraph/gem_pins.rb +98 -72
  52. data/lib/solargraph/language_server/error_codes.rb +20 -20
  53. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  54. data/lib/solargraph/language_server/host/dispatch.rb +130 -128
  55. data/lib/solargraph/language_server/host/message_worker.rb +112 -106
  56. data/lib/solargraph/language_server/host/sources.rb +99 -99
  57. data/lib/solargraph/language_server/host.rb +878 -861
  58. data/lib/solargraph/language_server/message/base.rb +97 -96
  59. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
  60. data/lib/solargraph/language_server/message/completion_item/resolve.rb +60 -60
  61. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +114 -112
  62. data/lib/solargraph/language_server/message/extended/document.rb +23 -20
  63. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  64. data/lib/solargraph/language_server/message/extended/download_core.rb +19 -19
  65. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  66. data/lib/solargraph/language_server/message/initialize.rb +191 -191
  67. data/lib/solargraph/language_server/message/text_document/completion.rb +56 -56
  68. data/lib/solargraph/language_server/message/text_document/definition.rb +40 -38
  69. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
  70. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -26
  71. data/lib/solargraph/language_server/message/text_document/formatting.rb +148 -131
  72. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
  73. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
  74. data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
  75. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
  76. data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -24
  77. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -24
  78. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +35 -35
  79. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +40 -40
  80. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +26 -24
  81. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  82. data/lib/solargraph/language_server/message.rb +94 -94
  83. data/lib/solargraph/language_server/progress.rb +8 -0
  84. data/lib/solargraph/language_server/request.rb +27 -24
  85. data/lib/solargraph/language_server/transport/data_reader.rb +74 -74
  86. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  87. data/lib/solargraph/library.rb +683 -662
  88. data/lib/solargraph/location.rb +82 -58
  89. data/lib/solargraph/logging.rb +37 -27
  90. data/lib/solargraph/page.rb +92 -89
  91. data/lib/solargraph/parser/comment_ripper.rb +69 -56
  92. data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -0
  93. data/lib/solargraph/parser/node_processor/base.rb +92 -87
  94. data/lib/solargraph/parser/node_processor.rb +62 -45
  95. data/lib/solargraph/parser/parser_gem/class_methods.rb +149 -157
  96. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -18
  97. data/lib/solargraph/parser/parser_gem/node_chainer.rb +166 -164
  98. data/lib/solargraph/parser/parser_gem/node_methods.rb +486 -495
  99. data/lib/solargraph/parser/parser_gem/node_processors/alias_node.rb +2 -1
  100. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -0
  101. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +59 -57
  102. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +15 -15
  103. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -43
  104. data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +2 -1
  105. data/lib/solargraph/parser/parser_gem/node_processors/cvasgn_node.rb +2 -1
  106. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +53 -50
  107. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +37 -36
  108. data/lib/solargraph/parser/parser_gem/node_processors/gvasgn_node.rb +2 -1
  109. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -0
  110. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +40 -38
  111. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +29 -28
  112. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +59 -53
  113. data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +8 -7
  114. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -0
  115. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -16
  116. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +38 -36
  117. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +52 -42
  118. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +291 -259
  119. data/lib/solargraph/parser/parser_gem/node_processors/sym_node.rb +3 -1
  120. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -0
  121. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -0
  122. data/lib/solargraph/parser/parser_gem/node_processors.rb +70 -56
  123. data/lib/solargraph/parser/parser_gem.rb +12 -12
  124. data/lib/solargraph/parser/region.rb +69 -66
  125. data/lib/solargraph/parser/snippet.rb +17 -15
  126. data/lib/solargraph/parser.rb +23 -22
  127. data/lib/solargraph/pin/base.rb +729 -378
  128. data/lib/solargraph/pin/base_variable.rb +126 -118
  129. data/lib/solargraph/pin/block.rb +104 -101
  130. data/lib/solargraph/pin/breakable.rb +9 -0
  131. data/lib/solargraph/pin/callable.rb +231 -147
  132. data/lib/solargraph/pin/closure.rb +72 -57
  133. data/lib/solargraph/pin/common.rb +79 -70
  134. data/lib/solargraph/pin/constant.rb +45 -43
  135. data/lib/solargraph/pin/conversions.rb +123 -123
  136. data/lib/solargraph/pin/delegated_method.rb +120 -101
  137. data/lib/solargraph/pin/documenting.rb +114 -98
  138. data/lib/solargraph/pin/instance_variable.rb +34 -34
  139. data/lib/solargraph/pin/keyword.rb +20 -15
  140. data/lib/solargraph/pin/local_variable.rb +75 -67
  141. data/lib/solargraph/pin/method.rb +672 -527
  142. data/lib/solargraph/pin/method_alias.rb +34 -31
  143. data/lib/solargraph/pin/namespace.rb +115 -107
  144. data/lib/solargraph/pin/parameter.rb +275 -212
  145. data/lib/solargraph/pin/proxy_type.rb +39 -29
  146. data/lib/solargraph/pin/reference/override.rb +47 -29
  147. data/lib/solargraph/pin/reference/require.rb +2 -2
  148. data/lib/solargraph/pin/reference/superclass.rb +15 -10
  149. data/lib/solargraph/pin/reference.rb +39 -22
  150. data/lib/solargraph/pin/search.rb +61 -56
  151. data/lib/solargraph/pin/signature.rb +61 -17
  152. data/lib/solargraph/pin/singleton.rb +1 -1
  153. data/lib/solargraph/pin/symbol.rb +53 -47
  154. data/lib/solargraph/pin/until.rb +18 -0
  155. data/lib/solargraph/pin/while.rb +18 -0
  156. data/lib/solargraph/pin.rb +44 -41
  157. data/lib/solargraph/pin_cache.rb +245 -0
  158. data/lib/solargraph/position.rb +132 -107
  159. data/lib/solargraph/range.rb +112 -98
  160. data/lib/solargraph/rbs_map/conversions.rb +823 -646
  161. data/lib/solargraph/rbs_map/core_fills.rb +84 -50
  162. data/lib/solargraph/rbs_map/core_map.rb +58 -28
  163. data/lib/solargraph/rbs_map/stdlib_map.rb +43 -33
  164. data/lib/solargraph/rbs_map.rb +163 -93
  165. data/lib/solargraph/server_methods.rb +16 -16
  166. data/lib/solargraph/shell.rb +363 -269
  167. data/lib/solargraph/source/chain/array.rb +37 -33
  168. data/lib/solargraph/source/chain/block_symbol.rb +1 -1
  169. data/lib/solargraph/source/chain/block_variable.rb +1 -1
  170. data/lib/solargraph/source/chain/call.rb +337 -303
  171. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  172. data/lib/solargraph/source/chain/constant.rb +26 -89
  173. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  174. data/lib/solargraph/source/chain/hash.rb +34 -33
  175. data/lib/solargraph/source/chain/head.rb +1 -1
  176. data/lib/solargraph/source/chain/if.rb +28 -28
  177. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  178. data/lib/solargraph/source/chain/link.rb +109 -98
  179. data/lib/solargraph/source/chain/literal.rb +48 -28
  180. data/lib/solargraph/source/chain/or.rb +23 -23
  181. data/lib/solargraph/source/chain/q_call.rb +11 -11
  182. data/lib/solargraph/source/chain/variable.rb +13 -13
  183. data/lib/solargraph/source/chain/z_super.rb +30 -30
  184. data/lib/solargraph/source/chain.rb +291 -252
  185. data/lib/solargraph/source/change.rb +82 -82
  186. data/lib/solargraph/source/cursor.rb +166 -167
  187. data/lib/solargraph/source/encoding_fixes.rb +23 -23
  188. data/lib/solargraph/source/source_chainer.rb +194 -194
  189. data/lib/solargraph/source/updater.rb +55 -55
  190. data/lib/solargraph/source.rb +498 -495
  191. data/lib/solargraph/source_map/clip.rb +226 -232
  192. data/lib/solargraph/source_map/data.rb +34 -30
  193. data/lib/solargraph/source_map/mapper.rb +259 -255
  194. data/lib/solargraph/source_map.rb +212 -217
  195. data/lib/solargraph/type_checker/checks.rb +124 -120
  196. data/lib/solargraph/type_checker/param_def.rb +37 -35
  197. data/lib/solargraph/type_checker/problem.rb +32 -32
  198. data/lib/solargraph/type_checker/rules.rb +84 -62
  199. data/lib/solargraph/type_checker.rb +814 -672
  200. data/lib/solargraph/version.rb +5 -5
  201. data/lib/solargraph/views/_method.erb +10 -10
  202. data/lib/solargraph/views/_namespace.erb +3 -3
  203. data/lib/solargraph/views/document.erb +10 -10
  204. data/lib/solargraph/workspace/config.rb +255 -239
  205. data/lib/solargraph/workspace/require_paths.rb +97 -0
  206. data/lib/solargraph/workspace.rb +220 -239
  207. data/lib/solargraph/yard_map/helpers.rb +44 -16
  208. data/lib/solargraph/yard_map/mapper/to_constant.rb +7 -5
  209. data/lib/solargraph/yard_map/mapper/to_method.rb +130 -94
  210. data/lib/solargraph/yard_map/mapper/to_namespace.rb +31 -28
  211. data/lib/solargraph/yard_map/mapper.rb +79 -78
  212. data/lib/solargraph/yard_map/to_method.rb +89 -86
  213. data/lib/solargraph/yard_tags.rb +20 -20
  214. data/lib/solargraph/yardoc.rb +87 -52
  215. data/lib/solargraph.rb +105 -72
  216. data/rbs/fills/bundler/0/bundler.rbs +4271 -0
  217. data/rbs/fills/open3/0/open3.rbs +172 -0
  218. data/rbs/fills/rubygems/0/basic_specification.rbs +326 -0
  219. data/rbs/fills/rubygems/0/errors.rbs +364 -0
  220. data/rbs/fills/rubygems/0/spec_fetcher.rbs +107 -0
  221. data/rbs/fills/rubygems/0/specification.rbs +1753 -0
  222. data/rbs/fills/tuple/tuple.rbs +149 -0
  223. data/rbs/shims/ast/0/node.rbs +5 -0
  224. data/rbs/shims/ast/2.4/.rbs_meta.yaml +9 -0
  225. data/rbs/shims/ast/2.4/ast.rbs +73 -0
  226. data/rbs/shims/parser/3.2.0.1/builders/default.rbs +195 -0
  227. data/rbs/shims/parser/3.2.0.1/manifest.yaml +7 -0
  228. data/rbs/shims/parser/3.2.0.1/parser.rbs +201 -0
  229. data/rbs/shims/parser/3.2.0.1/polyfill.rbs +4 -0
  230. data/rbs/shims/thor/1.2.0.1/.rbs_meta.yaml +9 -0
  231. data/rbs/shims/thor/1.2.0.1/manifest.yaml +7 -0
  232. data/rbs/shims/thor/1.2.0.1/thor.rbs +17 -0
  233. data/rbs_collection.yaml +19 -0
  234. data/solargraph.gemspec +27 -5
  235. metadata +215 -18
  236. data/lib/.rubocop.yml +0 -22
  237. data/lib/solargraph/cache.rb +0 -77
  238. data/lib/solargraph/parser/node_methods.rb +0 -83
@@ -1,58 +1,82 @@
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 location [self]
29
- def contain? location
30
- range.contain?(location.range.start) && range.contain?(location.range.ending) && filename == location.filename
31
- end
32
-
33
- # @return [Hash]
34
- def to_hash
35
- {
36
- filename: filename,
37
- range: range.to_hash
38
- }
39
- end
40
-
41
- # @param node [Parser::AST::Node, nil]
42
- def self.from_node(node)
43
- return nil if node.nil? || node.loc.nil?
44
- range = Range.from_node(node)
45
- self.new(node.loc.expression.source_buffer.name, range)
46
- end
47
-
48
- # @param other [BasicObject]
49
- def == other
50
- return false unless other.is_a?(Location)
51
- filename == other.filename and range == other.range
52
- end
53
-
54
- def inspect
55
- "#<#{self.class} #{filename}, #{range.inspect}>"
56
- end
57
- end
58
- 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
+
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,27 +1,37 @@
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
-
15
- @@logger = Logger.new(STDERR, level: DEFAULT_LOG_LEVEL)
16
- @@logger.formatter = proc do |severity, datetime, progname, msg|
17
- "[#{severity}] #{msg}\n"
18
- end
19
-
20
- module_function
21
-
22
- # @return [Logger]
23
- def logger
24
- @@logger
25
- end
26
- end
27
- 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
+ }
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,89 +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
- YARD::Templates::Helpers::Markup::RDocMarkup.new(text).to_html
33
- end
34
-
35
- # @param text [String]
36
- # @return [String]
37
- def escape text
38
- CGI.escapeHTML(text)
39
- end
40
-
41
- # @param code [String]
42
- # @return [String]
43
- def ruby_to_html code
44
- code
45
- end
46
- end
47
- private_constant :Binder
48
-
49
- # @param directory [String]
50
- def initialize directory = VIEWS_PATH
51
- directory = VIEWS_PATH if directory.nil? or !File.directory?(directory)
52
- directories = [directory]
53
- directories.push VIEWS_PATH if directory != VIEWS_PATH
54
- # @type [Proc]
55
- # @param template [String]
56
- # @param layout [Boolean]
57
- # @param locals [Hash]
58
- @render_method = proc { |template, layout: false, locals: {}|
59
- binder = Binder.new(locals, @render_method)
60
- if layout
61
- Tilt::ERBTemplate.new(Page.select_template(directories, 'layout')).render(binder) do
62
- Tilt::ERBTemplate.new(Page.select_template(directories, template)).render(binder)
63
- end
64
- else
65
- Tilt::ERBTemplate.new(Page.select_template(directories, template)).render(binder)
66
- end
67
- }
68
- end
69
-
70
- # @param template [String]
71
- # @param layout [Boolean]
72
- # @param locals [Hash]
73
- # @return [String]
74
- def render template, layout: true, locals: {}
75
- @render_method.call(template, layout: layout, locals: locals)
76
- end
77
-
78
- # @param directories [Array<String>]
79
- # @param name [String]
80
- # @return [String]
81
- def self.select_template directories, name
82
- directories.each do |dir|
83
- path = File.join(dir, "#{name}.erb")
84
- return path if File.file?(path)
85
- end
86
- raise FileNotFoundError, "Template not found: #{name}"
87
- end
88
- end
89
- 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? 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,56 +1,69 @@
1
- require 'ripper'
2
-
3
- module Solargraph
4
- module Parser
5
- class CommentRipper < Ripper::SexpBuilderPP
6
- # @param src [String]
7
- # @param filename [String]
8
- # @param lineno [Integer]
9
- def initialize src, filename = '(ripper)', lineno = 0
10
- super
11
- @buffer = src
12
- @buffer_lines = @buffer.lines
13
- end
14
-
15
- def on_comment *args
16
- result = super
17
- if @buffer_lines[result[2][0]][0..result[2][1]].strip =~ /^#/
18
- chomped = result[1].chomp
19
- if result[2][0] == 0 && chomped.encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '').match(/^#\s*frozen_string_literal:/)
20
- chomped = '#'
21
- end
22
- @comments[result[2][0]] = Snippet.new(Range.from_to(result[2][0], result[2][1], result[2][0], result[2][1] + chomped.length), chomped)
23
- end
24
- result
25
- end
26
-
27
- def on_embdoc_beg *args
28
- result = super
29
- chomped = result[1].chomp
30
- @comments[result[2][0]] = Snippet.new(Range.from_to(result[2][0], result[2][1], result[2][0], result[2][1] + chomped.length), chomped)
31
- result
32
- end
33
-
34
- def on_embdoc *args
35
- result = super
36
- chomped = result[1].chomp
37
- @comments[result[2][0]] = Snippet.new(Range.from_to(result[2][0], result[2][1], result[2][0], result[2][1] + chomped.length), chomped)
38
- result
39
- end
40
-
41
- def on_embdoc_end *args
42
- result = super
43
- chomped = result[1].chomp
44
- @comments[result[2][0]] = Snippet.new(Range.from_to(result[2][0], result[2][1], result[2][0], result[2][1] + chomped.length), chomped)
45
- result
46
- end
47
-
48
- # @return [Hash{Integer => String}]
49
- def parse
50
- @comments = {}
51
- super
52
- @comments
53
- end
54
- end
55
- end
56
- end
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