jimeh-solargraph 0.40.4.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 (252) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ci.yml +54 -0
  3. data/.gitignore +9 -0
  4. data/.rspec +2 -0
  5. data/.travis.yml +24 -0
  6. data/.yardopts +2 -0
  7. data/CHANGELOG.md +1003 -0
  8. data/Gemfile +7 -0
  9. data/LICENSE +21 -0
  10. data/README.md +123 -0
  11. data/Rakefile +25 -0
  12. data/SPONSORS.md +15 -0
  13. data/bin/solargraph +5 -0
  14. data/jimeh-solargraph.gemspec +44 -0
  15. data/lib/.rubocop.yml +21 -0
  16. data/lib/solargraph.rb +67 -0
  17. data/lib/solargraph/api_map.rb +752 -0
  18. data/lib/solargraph/api_map/bundler_methods.rb +27 -0
  19. data/lib/solargraph/api_map/cache.rb +70 -0
  20. data/lib/solargraph/api_map/source_to_yard.rb +81 -0
  21. data/lib/solargraph/api_map/store.rb +256 -0
  22. data/lib/solargraph/bench.rb +30 -0
  23. data/lib/solargraph/compat.rb +23 -0
  24. data/lib/solargraph/complex_type.rb +213 -0
  25. data/lib/solargraph/complex_type/type_methods.rb +127 -0
  26. data/lib/solargraph/complex_type/unique_type.rb +75 -0
  27. data/lib/solargraph/convention.rb +47 -0
  28. data/lib/solargraph/convention/base.rb +33 -0
  29. data/lib/solargraph/convention/gemfile.rb +15 -0
  30. data/lib/solargraph/convention/gemspec.rb +22 -0
  31. data/lib/solargraph/convention/rspec.rb +21 -0
  32. data/lib/solargraph/converters/dd.rb +12 -0
  33. data/lib/solargraph/converters/dl.rb +12 -0
  34. data/lib/solargraph/converters/dt.rb +12 -0
  35. data/lib/solargraph/converters/misc.rb +1 -0
  36. data/lib/solargraph/diagnostics.rb +55 -0
  37. data/lib/solargraph/diagnostics/base.rb +29 -0
  38. data/lib/solargraph/diagnostics/require_not_found.rb +37 -0
  39. data/lib/solargraph/diagnostics/rubocop.rb +90 -0
  40. data/lib/solargraph/diagnostics/rubocop_helpers.rb +45 -0
  41. data/lib/solargraph/diagnostics/severities.rb +15 -0
  42. data/lib/solargraph/diagnostics/type_check.rb +54 -0
  43. data/lib/solargraph/diagnostics/update_errors.rb +41 -0
  44. data/lib/solargraph/documentor.rb +78 -0
  45. data/lib/solargraph/environ.rb +45 -0
  46. data/lib/solargraph/language_server.rb +19 -0
  47. data/lib/solargraph/language_server/completion_item_kinds.rb +35 -0
  48. data/lib/solargraph/language_server/error_codes.rb +20 -0
  49. data/lib/solargraph/language_server/host.rb +746 -0
  50. data/lib/solargraph/language_server/host/cataloger.rb +56 -0
  51. data/lib/solargraph/language_server/host/diagnoser.rb +81 -0
  52. data/lib/solargraph/language_server/host/dispatch.rb +112 -0
  53. data/lib/solargraph/language_server/host/sources.rb +156 -0
  54. data/lib/solargraph/language_server/message.rb +92 -0
  55. data/lib/solargraph/language_server/message/base.rb +85 -0
  56. data/lib/solargraph/language_server/message/cancel_request.rb +13 -0
  57. data/lib/solargraph/language_server/message/client.rb +11 -0
  58. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -0
  59. data/lib/solargraph/language_server/message/completion_item.rb +11 -0
  60. data/lib/solargraph/language_server/message/completion_item/resolve.rb +57 -0
  61. data/lib/solargraph/language_server/message/exit_notification.rb +13 -0
  62. data/lib/solargraph/language_server/message/extended.rb +21 -0
  63. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +100 -0
  64. data/lib/solargraph/language_server/message/extended/document.rb +20 -0
  65. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -0
  66. data/lib/solargraph/language_server/message/extended/download_core.rb +23 -0
  67. data/lib/solargraph/language_server/message/extended/environment.rb +25 -0
  68. data/lib/solargraph/language_server/message/extended/search.rb +20 -0
  69. data/lib/solargraph/language_server/message/initialize.rb +153 -0
  70. data/lib/solargraph/language_server/message/initialized.rb +26 -0
  71. data/lib/solargraph/language_server/message/method_not_found.rb +16 -0
  72. data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -0
  73. data/lib/solargraph/language_server/message/shutdown.rb +13 -0
  74. data/lib/solargraph/language_server/message/text_document.rb +28 -0
  75. data/lib/solargraph/language_server/message/text_document/base.rb +19 -0
  76. data/lib/solargraph/language_server/message/text_document/code_action.rb +17 -0
  77. data/lib/solargraph/language_server/message/text_document/completion.rb +57 -0
  78. data/lib/solargraph/language_server/message/text_document/definition.rb +38 -0
  79. data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -0
  80. data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -0
  81. data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -0
  82. data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -0
  83. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +23 -0
  84. data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -0
  85. data/lib/solargraph/language_server/message/text_document/formatting.rb +105 -0
  86. data/lib/solargraph/language_server/message/text_document/hover.rb +44 -0
  87. data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +34 -0
  88. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -0
  89. data/lib/solargraph/language_server/message/text_document/references.rb +16 -0
  90. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -0
  91. data/lib/solargraph/language_server/message/text_document/signature_help.rb +29 -0
  92. data/lib/solargraph/language_server/message/workspace.rb +14 -0
  93. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +29 -0
  94. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +33 -0
  95. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -0
  96. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -0
  97. data/lib/solargraph/language_server/message_types.rb +14 -0
  98. data/lib/solargraph/language_server/request.rb +24 -0
  99. data/lib/solargraph/language_server/symbol_kinds.rb +36 -0
  100. data/lib/solargraph/language_server/transport.rb +13 -0
  101. data/lib/solargraph/language_server/transport/adapter.rb +56 -0
  102. data/lib/solargraph/language_server/transport/data_reader.rb +72 -0
  103. data/lib/solargraph/language_server/uri_helpers.rb +49 -0
  104. data/lib/solargraph/library.rb +426 -0
  105. data/lib/solargraph/location.rb +37 -0
  106. data/lib/solargraph/logging.rb +27 -0
  107. data/lib/solargraph/page.rb +83 -0
  108. data/lib/solargraph/parser.rb +26 -0
  109. data/lib/solargraph/parser/comment_ripper.rb +52 -0
  110. data/lib/solargraph/parser/legacy.rb +12 -0
  111. data/lib/solargraph/parser/legacy/class_methods.rb +109 -0
  112. data/lib/solargraph/parser/legacy/flawed_builder.rb +16 -0
  113. data/lib/solargraph/parser/legacy/node_chainer.rb +118 -0
  114. data/lib/solargraph/parser/legacy/node_methods.rb +311 -0
  115. data/lib/solargraph/parser/legacy/node_processors.rb +54 -0
  116. data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +23 -0
  117. data/lib/solargraph/parser/legacy/node_processors/args_node.rb +35 -0
  118. data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +15 -0
  119. data/lib/solargraph/parser/legacy/node_processors/block_node.rb +22 -0
  120. data/lib/solargraph/parser/legacy/node_processors/casgn_node.rb +25 -0
  121. data/lib/solargraph/parser/legacy/node_processors/cvasgn_node.rb +23 -0
  122. data/lib/solargraph/parser/legacy/node_processors/def_node.rb +63 -0
  123. data/lib/solargraph/parser/legacy/node_processors/defs_node.rb +36 -0
  124. data/lib/solargraph/parser/legacy/node_processors/gvasgn_node.rb +23 -0
  125. data/lib/solargraph/parser/legacy/node_processors/ivasgn_node.rb +38 -0
  126. data/lib/solargraph/parser/legacy/node_processors/lvasgn_node.rb +28 -0
  127. data/lib/solargraph/parser/legacy/node_processors/namespace_node.rb +39 -0
  128. data/lib/solargraph/parser/legacy/node_processors/orasgn_node.rb +16 -0
  129. data/lib/solargraph/parser/legacy/node_processors/resbody_node.rb +36 -0
  130. data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +21 -0
  131. data/lib/solargraph/parser/legacy/node_processors/send_node.rb +257 -0
  132. data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +18 -0
  133. data/lib/solargraph/parser/node_methods.rb +43 -0
  134. data/lib/solargraph/parser/node_processor.rb +43 -0
  135. data/lib/solargraph/parser/node_processor/base.rb +80 -0
  136. data/lib/solargraph/parser/region.rb +66 -0
  137. data/lib/solargraph/parser/rubyvm.rb +40 -0
  138. data/lib/solargraph/parser/rubyvm/class_methods.rb +150 -0
  139. data/lib/solargraph/parser/rubyvm/node_chainer.rb +135 -0
  140. data/lib/solargraph/parser/rubyvm/node_methods.rb +301 -0
  141. data/lib/solargraph/parser/rubyvm/node_processors.rb +62 -0
  142. data/lib/solargraph/parser/rubyvm/node_processors/alias_node.rb +23 -0
  143. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +86 -0
  144. data/lib/solargraph/parser/rubyvm/node_processors/begin_node.rb +15 -0
  145. data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +22 -0
  146. data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +22 -0
  147. data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +23 -0
  148. data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +64 -0
  149. data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +57 -0
  150. data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +23 -0
  151. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +38 -0
  152. data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +39 -0
  153. data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +20 -0
  154. data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +27 -0
  155. data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +39 -0
  156. data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +26 -0
  157. data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +15 -0
  158. data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +45 -0
  159. data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +21 -0
  160. data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +15 -0
  161. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +277 -0
  162. data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +18 -0
  163. data/lib/solargraph/parser/snippet.rb +13 -0
  164. data/lib/solargraph/pin.rb +36 -0
  165. data/lib/solargraph/pin/base.rb +296 -0
  166. data/lib/solargraph/pin/base_variable.rb +84 -0
  167. data/lib/solargraph/pin/block.rb +62 -0
  168. data/lib/solargraph/pin/class_variable.rb +8 -0
  169. data/lib/solargraph/pin/closure.rb +37 -0
  170. data/lib/solargraph/pin/common.rb +70 -0
  171. data/lib/solargraph/pin/constant.rb +43 -0
  172. data/lib/solargraph/pin/conversions.rb +96 -0
  173. data/lib/solargraph/pin/documenting.rb +105 -0
  174. data/lib/solargraph/pin/duck_method.rb +16 -0
  175. data/lib/solargraph/pin/global_variable.rb +8 -0
  176. data/lib/solargraph/pin/instance_variable.rb +30 -0
  177. data/lib/solargraph/pin/keyword.rb +15 -0
  178. data/lib/solargraph/pin/keyword_param.rb +8 -0
  179. data/lib/solargraph/pin/local_variable.rb +21 -0
  180. data/lib/solargraph/pin/localized.rb +43 -0
  181. data/lib/solargraph/pin/method.rb +245 -0
  182. data/lib/solargraph/pin/method_alias.rb +31 -0
  183. data/lib/solargraph/pin/namespace.rb +85 -0
  184. data/lib/solargraph/pin/parameter.rb +206 -0
  185. data/lib/solargraph/pin/proxy_type.rb +29 -0
  186. data/lib/solargraph/pin/reference.rb +14 -0
  187. data/lib/solargraph/pin/reference/extend.rb +10 -0
  188. data/lib/solargraph/pin/reference/include.rb +10 -0
  189. data/lib/solargraph/pin/reference/override.rb +29 -0
  190. data/lib/solargraph/pin/reference/prepend.rb +10 -0
  191. data/lib/solargraph/pin/reference/require.rb +14 -0
  192. data/lib/solargraph/pin/reference/superclass.rb +10 -0
  193. data/lib/solargraph/pin/singleton.rb +11 -0
  194. data/lib/solargraph/pin/symbol.rb +47 -0
  195. data/lib/solargraph/position.rb +100 -0
  196. data/lib/solargraph/range.rb +95 -0
  197. data/lib/solargraph/server_methods.rb +16 -0
  198. data/lib/solargraph/shell.rb +222 -0
  199. data/lib/solargraph/source.rb +537 -0
  200. data/lib/solargraph/source/chain.rb +154 -0
  201. data/lib/solargraph/source/chain/block_variable.rb +13 -0
  202. data/lib/solargraph/source/chain/call.rb +203 -0
  203. data/lib/solargraph/source/chain/class_variable.rb +13 -0
  204. data/lib/solargraph/source/chain/constant.rb +75 -0
  205. data/lib/solargraph/source/chain/global_variable.rb +13 -0
  206. data/lib/solargraph/source/chain/head.rb +35 -0
  207. data/lib/solargraph/source/chain/instance_variable.rb +13 -0
  208. data/lib/solargraph/source/chain/link.rb +67 -0
  209. data/lib/solargraph/source/chain/literal.rb +23 -0
  210. data/lib/solargraph/source/chain/or.rb +23 -0
  211. data/lib/solargraph/source/chain/variable.rb +13 -0
  212. data/lib/solargraph/source/chain/z_super.rb +30 -0
  213. data/lib/solargraph/source/change.rb +79 -0
  214. data/lib/solargraph/source/cursor.rb +164 -0
  215. data/lib/solargraph/source/encoding_fixes.rb +23 -0
  216. data/lib/solargraph/source/source_chainer.rb +190 -0
  217. data/lib/solargraph/source/updater.rb +54 -0
  218. data/lib/solargraph/source_map.rb +188 -0
  219. data/lib/solargraph/source_map/clip.rb +224 -0
  220. data/lib/solargraph/source_map/completion.rb +23 -0
  221. data/lib/solargraph/source_map/mapper.rb +215 -0
  222. data/lib/solargraph/type_checker.rb +503 -0
  223. data/lib/solargraph/type_checker/checks.rb +99 -0
  224. data/lib/solargraph/type_checker/param_def.rb +35 -0
  225. data/lib/solargraph/type_checker/problem.rb +32 -0
  226. data/lib/solargraph/type_checker/rules.rb +57 -0
  227. data/lib/solargraph/version.rb +5 -0
  228. data/lib/solargraph/views/_method.erb +62 -0
  229. data/lib/solargraph/views/_name_type_tag.erb +10 -0
  230. data/lib/solargraph/views/_namespace.erb +24 -0
  231. data/lib/solargraph/views/document.erb +23 -0
  232. data/lib/solargraph/views/environment.erb +58 -0
  233. data/lib/solargraph/views/layout.erb +44 -0
  234. data/lib/solargraph/views/search.erb +11 -0
  235. data/lib/solargraph/workspace.rb +209 -0
  236. data/lib/solargraph/workspace/config.rb +230 -0
  237. data/lib/solargraph/yard_map.rb +435 -0
  238. data/lib/solargraph/yard_map/cache.rb +19 -0
  239. data/lib/solargraph/yard_map/core_docs.rb +170 -0
  240. data/lib/solargraph/yard_map/core_fills.rb +185 -0
  241. data/lib/solargraph/yard_map/core_gen.rb +76 -0
  242. data/lib/solargraph/yard_map/helpers.rb +16 -0
  243. data/lib/solargraph/yard_map/mapper.rb +77 -0
  244. data/lib/solargraph/yard_map/mapper/to_constant.rb +25 -0
  245. data/lib/solargraph/yard_map/mapper/to_method.rb +78 -0
  246. data/lib/solargraph/yard_map/mapper/to_namespace.rb +27 -0
  247. data/lib/solargraph/yard_map/rdoc_to_yard.rb +140 -0
  248. data/lib/solargraph/yard_map/stdlib_fills.rb +43 -0
  249. data/lib/solargraph/yard_map/to_method.rb +79 -0
  250. data/lib/yard-solargraph.rb +30 -0
  251. data/yardoc/2.2.2.tar.gz +0 -0
  252. metadata +564 -0
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ # A section of text identified by its filename and range.
5
+ #
6
+ class Location
7
+ # @return [String]
8
+ attr_reader :filename
9
+
10
+ # @return [Solargraph::Range]
11
+ attr_reader :range
12
+
13
+ # @param filename [String]
14
+ # @param range [Solargraph::Range]
15
+ def initialize filename, range
16
+ @filename = filename
17
+ @range = range
18
+ end
19
+
20
+ # @return [Hash]
21
+ def to_hash
22
+ {
23
+ filename: filename,
24
+ range: range.to_hash
25
+ }
26
+ end
27
+
28
+ def == other
29
+ return false unless other.is_a?(Location)
30
+ filename == other.filename and range == other.range
31
+ end
32
+
33
+ def inspect
34
+ "#<#{self.class} #{filename}, #{range.inspect}>"
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,27 @@
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
@@ -0,0 +1,83 @@
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
+ class Binder < OpenStruct
11
+ # @param locals [Hash]
12
+ # @param render_method [Proc]
13
+ def initialize locals, render_method
14
+ super(locals)
15
+ define_singleton_method :render do |template, layout: false, locals: {}|
16
+ render_method.call(template, layout: layout, locals: locals)
17
+ end
18
+ define_singleton_method :erb do |template, layout: false, locals: {}|
19
+ render_method.call(template, layout: layout, locals: locals)
20
+ end
21
+ end
22
+
23
+ # @param text [String]
24
+ # @return [String]
25
+ def htmlify text
26
+ YARD::Templates::Helpers::Markup::RDocMarkup.new(text).to_html
27
+ end
28
+
29
+ # @param text [String]
30
+ # @return [String]
31
+ def escape text
32
+ CGI.escapeHTML(text)
33
+ end
34
+
35
+ # @param code [String]
36
+ # @return [String]
37
+ def ruby_to_html code
38
+ code
39
+ end
40
+ end
41
+ private_constant :Binder
42
+
43
+ # @param directory [String]
44
+ def initialize directory = VIEWS_PATH
45
+ directory = VIEWS_PATH if directory.nil? or !File.directory?(directory)
46
+ directories = [directory]
47
+ directories.push VIEWS_PATH if directory != VIEWS_PATH
48
+ # @type [Proc]
49
+ # @param template [String]
50
+ # @param layout [Boolean]
51
+ # @param locals [Hash]
52
+ @render_method = proc { |template, layout: false, locals: {}|
53
+ binder = Binder.new(locals, @render_method)
54
+ if layout
55
+ Tilt::ERBTemplate.new(Page.select_template(directories, 'layout')).render(binder) do
56
+ Tilt::ERBTemplate.new(Page.select_template(directories, template)).render(binder)
57
+ end
58
+ else
59
+ Tilt::ERBTemplate.new(Page.select_template(directories, template)).render(binder)
60
+ end
61
+ }
62
+ end
63
+
64
+ # @param template [String]
65
+ # @param layout [Boolean]
66
+ # @param locals [Hash]
67
+ # @return [String]
68
+ def render template, layout: true, locals: {}
69
+ @render_method.call(template, layout: layout, locals: locals)
70
+ end
71
+
72
+ # @param directories [Array<String>]
73
+ # @param name [String]
74
+ # @return [String]
75
+ def self.select_template directories, name
76
+ directories.each do |dir|
77
+ path = File.join(dir, "#{name}.erb")
78
+ return path if File.file?(path)
79
+ end
80
+ raise FileNotFoundError, "Template not found: #{name}"
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,26 @@
1
+ module Solargraph
2
+ module Parser
3
+ autoload :CommentRipper, 'solargraph/parser/comment_ripper'
4
+ autoload :Legacy, 'solargraph/parser/legacy'
5
+ autoload :Rubyvm, 'solargraph/parser/rubyvm'
6
+ autoload :Region, 'solargraph/parser/region'
7
+ autoload :NodeProcessor, 'solargraph/parser/node_processor'
8
+ autoload :Snippet, 'solargraph/parser/snippet'
9
+
10
+ class SyntaxError < StandardError
11
+ end
12
+
13
+ # True if the parser can use RubyVM.
14
+ #
15
+ def self.rubyvm?
16
+ !!defined?(RubyVM::AbstractSyntaxTree)
17
+ # false
18
+ end
19
+
20
+ selected = rubyvm? ? Rubyvm : Legacy
21
+ # include selected
22
+ extend selected::ClassMethods
23
+
24
+ NodeMethods = (rubyvm? ? Rubyvm::NodeMethods : Legacy::NodeMethods)
25
+ end
26
+ end
@@ -0,0 +1,52 @@
1
+ require 'ripper'
2
+
3
+ module Solargraph
4
+ module Parser
5
+ class CommentRipper < Ripper::SexpBuilder
6
+ def initialize src, filename = '(ripper)', lineno = 0
7
+ super
8
+ @buffer = src
9
+ @buffer_lines = @buffer.lines
10
+ end
11
+
12
+ def on_comment *args
13
+ result = super
14
+ if @buffer_lines[result[2][0]][0..result[2][1]].strip =~ /^#/
15
+ chomped = result[1].chomp
16
+ if result[2][0] == 0 && chomped.encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '').match(/^#\s*frozen_string_literal:/)
17
+ chomped = '#'
18
+ end
19
+ @comments[result[2][0]] = Snippet.new(Range.from_to(result[2][0], result[2][1], result[2][0], result[2][1] + chomped.length), chomped)
20
+ end
21
+ result
22
+ end
23
+
24
+ def on_embdoc_beg *args
25
+ result = super
26
+ chomped = result[1].chomp
27
+ @comments[result[2][0]] = Snippet.new(Range.from_to(result[2][0], result[2][1], result[2][0], result[2][1] + chomped.length), chomped)
28
+ result
29
+ end
30
+
31
+ def on_embdoc *args
32
+ result = super
33
+ chomped = result[1].chomp
34
+ @comments[result[2][0]] = Snippet.new(Range.from_to(result[2][0], result[2][1], result[2][0], result[2][1] + chomped.length), chomped)
35
+ result
36
+ end
37
+
38
+ def on_embdoc_end *args
39
+ result = super
40
+ chomped = result[1].chomp
41
+ @comments[result[2][0]] = Snippet.new(Range.from_to(result[2][0], result[2][1], result[2][0], result[2][1] + chomped.length), chomped)
42
+ result
43
+ end
44
+
45
+ def parse
46
+ @comments = {}
47
+ super
48
+ @comments
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,12 @@
1
+ module Solargraph
2
+ module Parser
3
+ module Legacy
4
+ autoload :FlawedBuilder, 'solargraph/parser/legacy/flawed_builder'
5
+ autoload :ClassMethods, 'solargraph/parser/legacy/class_methods'
6
+ autoload :NodeMethods, 'solargraph/parser/legacy/node_methods'
7
+ autoload :NodeChainer, 'solargraph/parser/legacy/node_chainer'
8
+ end
9
+ end
10
+ end
11
+
12
+ require 'solargraph/parser/legacy/node_processors'
@@ -0,0 +1,109 @@
1
+ require 'parser/current'
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module Legacy
6
+ module ClassMethods
7
+ # @param code [String]
8
+ # @param filename [String]
9
+ # @return [Array(Parser::AST::Node, Array<Parser::Source::Comment>)]
10
+ def parse_with_comments code, filename = nil
11
+ buffer = ::Parser::Source::Buffer.new(filename, 0)
12
+ buffer.source = code
13
+ node = parser.parse(buffer)
14
+ comments = CommentRipper.new(code, filename, 0).parse
15
+ [node, comments]
16
+ rescue ::Parser::SyntaxError => e
17
+ raise Parser::SyntaxError, e.message
18
+ end
19
+
20
+ # @param code [String]
21
+ # @param filename [String, nil]
22
+ # @param line [Integer]
23
+ # @return [Parser::AST::Node]
24
+ def parse code, filename = nil, line = 0
25
+ buffer = ::Parser::Source::Buffer.new(filename, line)
26
+ buffer.source = code
27
+ parser.parse(buffer)
28
+ rescue ::Parser::SyntaxError => e
29
+ raise Parser::SyntaxError, e.message
30
+ end
31
+
32
+ # @return [Parser::Base]
33
+ def parser
34
+ # @todo Consider setting an instance variable. We might not need to
35
+ # recreate the parser every time we use it.
36
+ parser = ::Parser::CurrentRuby.new(FlawedBuilder.new)
37
+ parser.diagnostics.all_errors_are_fatal = true
38
+ parser.diagnostics.ignore_warnings = true
39
+ parser
40
+ end
41
+
42
+ def map source
43
+ NodeProcessor.process(source.node, Region.new(source: source))
44
+ end
45
+
46
+ def returns_from node
47
+ NodeMethods.returns_from(node)
48
+ end
49
+
50
+ def references source, name
51
+ inner_node_references(name, source.node).map do |n|
52
+ offset = Position.to_offset(source.code, NodeMethods.get_node_start_position(n))
53
+ soff = source.code.index(name, offset)
54
+ eoff = soff + name.length
55
+ Location.new(
56
+ source.filename,
57
+ Range.new(
58
+ Position.from_offset(source.code, soff),
59
+ Position.from_offset(source.code, eoff)
60
+ )
61
+ )
62
+ end
63
+ end
64
+
65
+ # @param name [String]
66
+ # @param top [AST::Node]
67
+ # @return [Array<AST::Node>]
68
+ def inner_node_references name, top
69
+ result = []
70
+ if top.is_a?(AST::Node) && top.to_s.include?(":#{name}")
71
+ result.push top if top.children.any? { |c| c.to_s == name }
72
+ top.children.each { |c| result.concat inner_node_references(name, c) }
73
+ end
74
+ result
75
+ end
76
+
77
+ def chain *args
78
+ NodeChainer.chain *args
79
+ end
80
+
81
+ def chain_string *args
82
+ NodeChainer.load_string *args
83
+ end
84
+
85
+ def process_node *args
86
+ Solargraph::Parser::NodeProcessor.process *args
87
+ end
88
+
89
+ def infer_literal_node_type node
90
+ NodeMethods.infer_literal_node_type node
91
+ end
92
+
93
+ def version
94
+ parser.version
95
+ end
96
+
97
+ def is_ast_node? node
98
+ node.is_a?(::Parser::AST::Node)
99
+ end
100
+
101
+ def node_range node
102
+ st = Position.new(node.loc.line, node.loc.column)
103
+ en = Position.new(node.loc.last_line, node.loc.last_column)
104
+ Range.new(st, en)
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module Legacy
6
+ # A custom builder for source parsers that ignores character encoding
7
+ # issues in literal strings.
8
+ #
9
+ class FlawedBuilder < ::Parser::Builders::Default
10
+ def string_value(token)
11
+ value(token)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module Legacy
6
+ # A factory for generating chains from nodes.
7
+ #
8
+ class NodeChainer
9
+ include NodeMethods
10
+ Chain = Source::Chain
11
+
12
+ # @param node [Parser::AST::Node]
13
+ # @param filename [String]
14
+ def initialize node, filename = nil, in_block = false
15
+ @node = node
16
+ @filename = filename
17
+ @in_block = in_block ? 1 : 0
18
+ end
19
+
20
+ # @return [Source::Chain]
21
+ def chain
22
+ links = generate_links(@node)
23
+ Chain.new(links, @node, (Parser.is_ast_node?(@node) && @node.type == :splat))
24
+ end
25
+
26
+ class << self
27
+ # @param node [Parser::AST::Node]
28
+ # @param filename [String]
29
+ # @return [Source::Chain]
30
+ def chain node, filename = nil, in_block = false
31
+ NodeChainer.new(node, filename, in_block).chain
32
+ end
33
+
34
+ # @param code [String]
35
+ # @return [Source::Chain]
36
+ def load_string(code)
37
+ node = Parser.parse(code.sub(/\.$/, ''))
38
+ chain = NodeChainer.new(node).chain
39
+ chain.links.push(Chain::Link.new) if code.end_with?('.')
40
+ chain
41
+ end
42
+ end
43
+
44
+ private
45
+
46
+ # @param n [Parser::AST::Node]
47
+ # @return [Array<Chain::Link>]
48
+ def generate_links n
49
+ return [] unless n.is_a?(::Parser::AST::Node)
50
+ return generate_links(n.children[0]) if n.type == :begin
51
+ return generate_links(n.children[0]) if n.type == :splat
52
+ result = []
53
+ if n.type == :block
54
+ @in_block += 1
55
+ result.concat generate_links(n.children[0])
56
+ @in_block -= 1
57
+ elsif n.type == :send
58
+ if n.children[0].is_a?(::Parser::AST::Node)
59
+ result.concat generate_links(n.children[0])
60
+ args = []
61
+ n.children[2..-1].each do |c|
62
+ args.push NodeChainer.chain(c)
63
+ end
64
+ result.push Chain::Call.new(n.children[1].to_s, args, @in_block > 0 || block_passed?(n))
65
+ elsif n.children[0].nil?
66
+ args = []
67
+ n.children[2..-1].each do |c|
68
+ args.push NodeChainer.chain(c)
69
+ end
70
+ result.push Chain::Call.new(n.children[1].to_s, args, @in_block > 0 || block_passed?(n))
71
+ else
72
+ raise "No idea what to do with #{n}"
73
+ end
74
+ elsif n.type == :self
75
+ result.push Chain::Head.new('self')
76
+ elsif n.type == :zsuper
77
+ result.push Chain::ZSuper.new('super', @in_block > 0 || block_passed?(n))
78
+ elsif n.type == :super
79
+ args = n.children.map { |c| NodeChainer.chain(c) }
80
+ result.push Chain::Call.new('super', args, @in_block > 0 || block_passed?(n))
81
+ elsif n.type == :const
82
+ const = unpack_name(n)
83
+ result.push Chain::Constant.new(const)
84
+ elsif [:lvar, :lvasgn].include?(n.type)
85
+ result.push Chain::Call.new(n.children[0].to_s)
86
+ elsif [:ivar, :ivasgn].include?(n.type)
87
+ result.push Chain::InstanceVariable.new(n.children[0].to_s)
88
+ elsif [:cvar, :cvasgn].include?(n.type)
89
+ result.push Chain::ClassVariable.new(n.children[0].to_s)
90
+ elsif [:gvar, :gvasgn].include?(n.type)
91
+ result.push Chain::GlobalVariable.new(n.children[0].to_s)
92
+ elsif n.type == :or_asgn
93
+ result.concat generate_links n.children[1]
94
+ elsif [:class, :module, :def, :defs].include?(n.type)
95
+ # @todo Undefined or what?
96
+ result.push Chain::UNDEFINED_CALL
97
+ elsif n.type == :and
98
+ result.concat generate_links(n.children.last)
99
+ elsif n.type == :or
100
+ result.push Chain::Or.new([NodeChainer.chain(n.children[0], @filename), NodeChainer.chain(n.children[1], @filename)])
101
+ elsif [:begin, :kwbegin].include?(n.type)
102
+ result.concat generate_links(n.children[0])
103
+ elsif n.type == :block_pass
104
+ result.push Chain::BlockVariable.new("&#{n.children[0].children[0].to_s}")
105
+ else
106
+ lit = infer_literal_node_type(n)
107
+ result.push (lit ? Chain::Literal.new(lit) : Chain::Link.new)
108
+ end
109
+ result
110
+ end
111
+
112
+ def block_passed? node
113
+ node.children.last.is_a?(::Parser::AST::Node) && node.children.last.type == :block_pass
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end