ikra 0.0.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 (220) hide show
  1. checksums.yaml +7 -0
  2. data/lib/ast/builder.rb +100 -0
  3. data/lib/ast/lexical_variables_enumerator.rb +34 -0
  4. data/lib/ast/method_definition.rb +37 -0
  5. data/lib/ast/nodes.rb +208 -0
  6. data/lib/ast/printer.rb +99 -0
  7. data/lib/ast/translator.rb +264 -0
  8. data/lib/ast/visitor.rb +173 -0
  9. data/lib/config/configuration.rb +18 -0
  10. data/lib/config/os_configuration.rb +56 -0
  11. data/lib/entity.rb +11 -0
  12. data/lib/ikra.rb +7 -0
  13. data/lib/parsing.rb +32 -0
  14. data/lib/resources/cuda/block_function_head.cpp +1 -0
  15. data/lib/resources/cuda/env_builder_copy_array.cpp +4 -0
  16. data/lib/resources/cuda/header.cpp +46 -0
  17. data/lib/resources/cuda/kernel.cpp +8 -0
  18. data/lib/resources/cuda/kernel_launcher.cpp +28 -0
  19. data/lib/resources/cuda/soa_header.cpp +4 -0
  20. data/lib/scope.rb +166 -0
  21. data/lib/sourcify/Gemfile +10 -0
  22. data/lib/sourcify/HISTORY.txt +88 -0
  23. data/lib/sourcify/LICENSE +20 -0
  24. data/lib/sourcify/README.rdoc +352 -0
  25. data/lib/sourcify/Rakefile +111 -0
  26. data/lib/sourcify/lib/sourcify.rb +44 -0
  27. data/lib/sourcify/lib/sourcify/common/parser/converter.rb +29 -0
  28. data/lib/sourcify/lib/sourcify/common/parser/raw_scanner/comment.rb +23 -0
  29. data/lib/sourcify/lib/sourcify/common/parser/raw_scanner/counter.rb +43 -0
  30. data/lib/sourcify/lib/sourcify/common/parser/raw_scanner/dstring.rb +58 -0
  31. data/lib/sourcify/lib/sourcify/common/parser/raw_scanner/extensions.rb +140 -0
  32. data/lib/sourcify/lib/sourcify/common/parser/raw_scanner/heredoc.rb +26 -0
  33. data/lib/sourcify/lib/sourcify/common/parser/source_code.rb +45 -0
  34. data/lib/sourcify/lib/sourcify/common/ragel/common.rl +5 -0
  35. data/lib/sourcify/lib/sourcify/common/ragel/expressions.rl +38 -0
  36. data/lib/sourcify/lib/sourcify/common/ragel/machines.rl +317 -0
  37. data/lib/sourcify/lib/sourcify/errors.rb +4 -0
  38. data/lib/sourcify/lib/sourcify/method.rb +138 -0
  39. data/lib/sourcify/lib/sourcify/method/methods.rb +3 -0
  40. data/lib/sourcify/lib/sourcify/method/methods/to_raw_source.rb +30 -0
  41. data/lib/sourcify/lib/sourcify/method/methods/to_sexp.rb +30 -0
  42. data/lib/sourcify/lib/sourcify/method/methods/to_source.rb +30 -0
  43. data/lib/sourcify/lib/sourcify/method/parser.rb +110 -0
  44. data/lib/sourcify/lib/sourcify/method/parser/converter.rb +8 -0
  45. data/lib/sourcify/lib/sourcify/method/parser/raw_scanner.rb +2494 -0
  46. data/lib/sourcify/lib/sourcify/method/parser/raw_scanner.rl +144 -0
  47. data/lib/sourcify/lib/sourcify/method/parser/raw_scanner_extensions.rb +68 -0
  48. data/lib/sourcify/lib/sourcify/method/parser/scanner.rb +52 -0
  49. data/lib/sourcify/lib/sourcify/method/parser/source_code.rb +8 -0
  50. data/lib/sourcify/lib/sourcify/patches.rb +63 -0
  51. data/lib/sourcify/lib/sourcify/proc.rb +183 -0
  52. data/lib/sourcify/lib/sourcify/proc/methods.rb +3 -0
  53. data/lib/sourcify/lib/sourcify/proc/methods/source_location.rb +61 -0
  54. data/lib/sourcify/lib/sourcify/proc/methods/to_raw_source.rb +20 -0
  55. data/lib/sourcify/lib/sourcify/proc/methods/to_sexp.rb +40 -0
  56. data/lib/sourcify/lib/sourcify/proc/methods/to_source.rb +48 -0
  57. data/lib/sourcify/lib/sourcify/proc/parser.rb +51 -0
  58. data/lib/sourcify/lib/sourcify/proc/parser/converter.rb +8 -0
  59. data/lib/sourcify/lib/sourcify/proc/parser/normalizer.rb +43 -0
  60. data/lib/sourcify/lib/sourcify/proc/parser/raw_scanner.rb +2498 -0
  61. data/lib/sourcify/lib/sourcify/proc/parser/raw_scanner.rl +149 -0
  62. data/lib/sourcify/lib/sourcify/proc/parser/raw_scanner_extensions.rb +74 -0
  63. data/lib/sourcify/lib/sourcify/proc/parser/scanner.rb +49 -0
  64. data/lib/sourcify/lib/sourcify/proc/parser/source_code.rb +8 -0
  65. data/lib/sourcify/lib/sourcify/version.rb +3 -0
  66. data/lib/sourcify/sourcify.gemspec +31 -0
  67. data/lib/sourcify/spec/dump_object_space_procs.rb +84 -0
  68. data/lib/sourcify/spec/method/encoding_from_def_end_block_spec.rb +33 -0
  69. data/lib/sourcify/spec/method/encoding_from_define_method_spec.rb +37 -0
  70. data/lib/sourcify/spec/method/others_from_def_end_block_spec.rb +49 -0
  71. data/lib/sourcify/spec/method/others_from_define_method_spec.rb +63 -0
  72. data/lib/sourcify/spec/method/raw_scanner/block_comment_spec.rb +8 -0
  73. data/lib/sourcify/spec/method/raw_scanner/double_colons_spec.rb +8 -0
  74. data/lib/sourcify/spec/method/raw_scanner/double_quote_str_w_interpolation_spec.rb +8 -0
  75. data/lib/sourcify/spec/method/raw_scanner/double_quote_str_wo_interpolation_spec.rb +8 -0
  76. data/lib/sourcify/spec/method/raw_scanner/heredoc_w_indent_spec.rb +8 -0
  77. data/lib/sourcify/spec/method/raw_scanner/heredoc_wo_indent_spec.rb +8 -0
  78. data/lib/sourcify/spec/method/raw_scanner/kw_block_start_alias1_spec.rb +20 -0
  79. data/lib/sourcify/spec/method/raw_scanner/kw_block_start_alias2_spec.rb +20 -0
  80. data/lib/sourcify/spec/method/raw_scanner/per_line_comment_spec.rb +8 -0
  81. data/lib/sourcify/spec/method/raw_scanner/single_quote_str_spec.rb +8 -0
  82. data/lib/sourcify/spec/method/raw_scanner/slash_operator_spec.rb +8 -0
  83. data/lib/sourcify/spec/method/raw_scanner/spec_helper.rb +80 -0
  84. data/lib/sourcify/spec/method/spec_helper.rb +1 -0
  85. data/lib/sourcify/spec/method/to_raw_source_spec.rb +31 -0
  86. data/lib/sourcify/spec/method/to_raw_source_w_specified_strip_enclosure_spec.rb +148 -0
  87. data/lib/sourcify/spec/method/to_sexp_from_def_end_block_w_variables_spec.rb +46 -0
  88. data/lib/sourcify/spec/method/to_sexp_from_def_end_block_within_irb_spec.rb +38 -0
  89. data/lib/sourcify/spec/method/to_sexp_from_def_end_block_within_pry_spec.rb +38 -0
  90. data/lib/sourcify/spec/method/to_sexp_from_define_method_w_multi_blocks_and_specified_attached_to_spec.rb +56 -0
  91. data/lib/sourcify/spec/method/to_sexp_from_define_method_w_variables_spec.rb +52 -0
  92. data/lib/sourcify/spec/method/to_sexp_from_define_method_within_irb_spec.rb +42 -0
  93. data/lib/sourcify/spec/method/to_sexp_from_define_method_within_pry_spec.rb +42 -0
  94. data/lib/sourcify/spec/method/to_sexp_w_specified_strip_enclosure_spec.rb +74 -0
  95. data/lib/sourcify/spec/method/to_source_from_def_end_block_w_19_extras_spec.rb +23 -0
  96. data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_begin_spec.rb +35 -0
  97. data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_case_spec.rb +35 -0
  98. data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_class_spec.rb +51 -0
  99. data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_do_end_block_spec.rb +33 -0
  100. data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_for_spec.rb +126 -0
  101. data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_if_spec.rb +83 -0
  102. data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_literal_keyword_spec.rb +141 -0
  103. data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_method_spec.rb +33 -0
  104. data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_module_spec.rb +59 -0
  105. data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_unless_spec.rb +83 -0
  106. data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_until_spec.rb +179 -0
  107. data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_while_spec.rb +179 -0
  108. data/lib/sourcify/spec/method/to_source_from_def_end_block_w_singleton_method_spec.rb +19 -0
  109. data/lib/sourcify/spec/method/to_source_from_def_end_block_within_irb_spec.rb +30 -0
  110. data/lib/sourcify/spec/method/to_source_from_def_end_block_within_pry_spec.rb +45 -0
  111. data/lib/sourcify/spec/method/to_source_from_def_end_w_multi_blocks_and_many_matches_spec.rb +30 -0
  112. data/lib/sourcify/spec/method/to_source_from_def_end_w_multi_blocks_and_single_match_spec.rb +36 -0
  113. data/lib/sourcify/spec/method/to_source_from_define_method_w_braced_block_spec.rb +113 -0
  114. data/lib/sourcify/spec/method/to_source_from_define_method_w_do_end_block_spec.rb +145 -0
  115. data/lib/sourcify/spec/method/to_source_from_define_method_w_multi_blocks_and_many_matches_spec.rb +56 -0
  116. data/lib/sourcify/spec/method/to_source_from_define_method_w_multi_blocks_and_single_match_spec.rb +73 -0
  117. data/lib/sourcify/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_attached_to_and_many_matches_spec.rb +36 -0
  118. data/lib/sourcify/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_attached_to_and_no_match_spec.rb +36 -0
  119. data/lib/sourcify/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_attached_to_and_single_match_spec.rb +28 -0
  120. data/lib/sourcify/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_attached_to_spec.rb +103 -0
  121. data/lib/sourcify/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_body_matcher_and_many_matches_spec.rb +36 -0
  122. data/lib/sourcify/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_body_matcher_and_no_match_spec.rb +36 -0
  123. data/lib/sourcify/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_body_matcher_and_single_match_spec.rb +28 -0
  124. data/lib/sourcify/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_ignore_nested_spec.rb +36 -0
  125. data/lib/sourcify/spec/method/to_source_from_define_method_within_irb_spec.rb +32 -0
  126. data/lib/sourcify/spec/method/to_source_from_define_method_within_pry_spec.rb +49 -0
  127. data/lib/sourcify/spec/method/to_source_magic_file_var_spec.rb +176 -0
  128. data/lib/sourcify/spec/method/to_source_magic_line_var_spec.rb +298 -0
  129. data/lib/sourcify/spec/method/to_source_w_specified_strip_enclosure_spec.rb +39 -0
  130. data/lib/sourcify/spec/no_method/unsupported_platform_spec.rb +26 -0
  131. data/lib/sourcify/spec/proc/19x_extras.rb +27 -0
  132. data/lib/sourcify/spec/proc/created_on_the_fly_proc_spec.rb +80 -0
  133. data/lib/sourcify/spec/proc/encoding_spec.rb +36 -0
  134. data/lib/sourcify/spec/proc/others_spec.rb +40 -0
  135. data/lib/sourcify/spec/proc/raw_scanner/block_comment_spec.rb +8 -0
  136. data/lib/sourcify/spec/proc/raw_scanner/double_colons_spec.rb +8 -0
  137. data/lib/sourcify/spec/proc/raw_scanner/double_quote_str_w_interpolation_spec.rb +8 -0
  138. data/lib/sourcify/spec/proc/raw_scanner/double_quote_str_wo_interpolation_spec.rb +8 -0
  139. data/lib/sourcify/spec/proc/raw_scanner/heredoc_w_indent_spec.rb +8 -0
  140. data/lib/sourcify/spec/proc/raw_scanner/heredoc_wo_indent_spec.rb +8 -0
  141. data/lib/sourcify/spec/proc/raw_scanner/kw_block_start_alias1_spec.rb +20 -0
  142. data/lib/sourcify/spec/proc/raw_scanner/kw_block_start_alias2_spec.rb +20 -0
  143. data/lib/sourcify/spec/proc/raw_scanner/per_line_comment_spec.rb +8 -0
  144. data/lib/sourcify/spec/proc/raw_scanner/single_quote_str_spec.rb +8 -0
  145. data/lib/sourcify/spec/proc/raw_scanner/slash_operator_spec.rb +8 -0
  146. data/lib/sourcify/spec/proc/raw_scanner/spec_helper.rb +63 -0
  147. data/lib/sourcify/spec/proc/readme +5 -0
  148. data/lib/sourcify/spec/proc/spec_helper.rb +1 -0
  149. data/lib/sourcify/spec/proc/to_raw_source_spec.rb +33 -0
  150. data/lib/sourcify/spec/proc/to_raw_source_w_specified_strip_enclosure_spec.rb +69 -0
  151. data/lib/sourcify/spec/proc/to_sexp_from_multi_blocks_w_specified_attached_to_spec.rb +46 -0
  152. data/lib/sourcify/spec/proc/to_sexp_variables_spec.rb +146 -0
  153. data/lib/sourcify/spec/proc/to_sexp_w_specified_strip_enclosure_spec.rb +60 -0
  154. data/lib/sourcify/spec/proc/to_sexp_within_irb_spec.rb +146 -0
  155. data/lib/sourcify/spec/proc/to_sexp_within_pry_spec.rb +149 -0
  156. data/lib/sourcify/spec/proc/to_source_from_braced_block_w_nested_braced_block_spec.rb +33 -0
  157. data/lib/sourcify/spec/proc/to_source_from_braced_block_w_nested_hash_spec.rb +82 -0
  158. data/lib/sourcify/spec/proc/to_source_from_braced_block_wo_nesting_complication_spec.rb +46 -0
  159. data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_begin_spec.rb +35 -0
  160. data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_case_spec.rb +35 -0
  161. data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_class_spec.rb +89 -0
  162. data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_do_end_block_spec.rb +33 -0
  163. data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_for_spec.rb +132 -0
  164. data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_if_spec.rb +87 -0
  165. data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_literal_keyword_spec.rb +103 -0
  166. data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_method_spec.rb +33 -0
  167. data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_module_spec.rb +49 -0
  168. data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_unless_spec.rb +87 -0
  169. data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_until_spec.rb +189 -0
  170. data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_while_spec.rb +189 -0
  171. data/lib/sourcify/spec/proc/to_source_from_do_end_block_wo_nesting_complication_spec.rb +46 -0
  172. data/lib/sourcify/spec/proc/to_source_from_multi_blocks_w_many_matches_spec.rb +43 -0
  173. data/lib/sourcify/spec/proc/to_source_from_multi_blocks_w_single_match_spec.rb +20 -0
  174. data/lib/sourcify/spec/proc/to_source_from_multi_blocks_w_specified_attached_to_and_many_matches_spec.rb +45 -0
  175. data/lib/sourcify/spec/proc/to_source_from_multi_blocks_w_specified_attached_to_and_no_match_spec.rb +45 -0
  176. data/lib/sourcify/spec/proc/to_source_from_multi_blocks_w_specified_attached_to_and_single_match_spec.rb +22 -0
  177. data/lib/sourcify/spec/proc/to_source_from_multi_blocks_w_specified_attached_to_spec.rb +84 -0
  178. data/lib/sourcify/spec/proc/to_source_from_multi_blocks_w_specified_body_matcher_and_many_matches_spec.rb +45 -0
  179. data/lib/sourcify/spec/proc/to_source_from_multi_blocks_w_specified_body_matcher_and_no_match_spec.rb +45 -0
  180. data/lib/sourcify/spec/proc/to_source_from_multi_blocks_w_specified_body_matcher_and_single_match_spec.rb +22 -0
  181. data/lib/sourcify/spec/proc/to_source_from_multi_blocks_w_specified_ignore_nested_spec.rb +43 -0
  182. data/lib/sourcify/spec/proc/to_source_from_multi_do_end_blocks_w_single_match_spec.rb +31 -0
  183. data/lib/sourcify/spec/proc/to_source_magic_file_var_spec.rb +127 -0
  184. data/lib/sourcify/spec/proc/to_source_magic_line_var_spec.rb +127 -0
  185. data/lib/sourcify/spec/proc/to_source_variables_spec.rb +29 -0
  186. data/lib/sourcify/spec/proc/to_source_w_specified_strip_enclosure_spec.rb +33 -0
  187. data/lib/sourcify/spec/proc/to_source_within_irb_spec.rb +38 -0
  188. data/lib/sourcify/spec/proc/to_source_within_pry_spec.rb +61 -0
  189. data/lib/sourcify/spec/raw_scanner/block_comment_shared_spec.rb +57 -0
  190. data/lib/sourcify/spec/raw_scanner/double_colons_shared_spec.rb +11 -0
  191. data/lib/sourcify/spec/raw_scanner/double_quote_str_w_interpolation_shared_spec.rb +60 -0
  192. data/lib/sourcify/spec/raw_scanner/double_quote_str_wo_interpolation_shared_spec.rb +86 -0
  193. data/lib/sourcify/spec/raw_scanner/heredoc_w_indent_shared_spec.rb +69 -0
  194. data/lib/sourcify/spec/raw_scanner/heredoc_wo_indent_shared_spec.rb +70 -0
  195. data/lib/sourcify/spec/raw_scanner/kw_block_start_alias1_shared_spec.rb +73 -0
  196. data/lib/sourcify/spec/raw_scanner/kw_block_start_alias2_shared_spec.rb +73 -0
  197. data/lib/sourcify/spec/raw_scanner/per_line_comment_shared_spec.rb +32 -0
  198. data/lib/sourcify/spec/raw_scanner/shared_specs.rb +3 -0
  199. data/lib/sourcify/spec/raw_scanner/single_quote_str_shared_spec.rb +79 -0
  200. data/lib/sourcify/spec/raw_scanner/slash_operator_shared_spec.rb +71 -0
  201. data/lib/sourcify/spec/run_build.sh +25 -0
  202. data/lib/sourcify/spec/spec_helper.rb +130 -0
  203. data/lib/symbolic/symbolic.rb +248 -0
  204. data/lib/symbolic/visitor.rb +51 -0
  205. data/lib/translator/block_translator.rb +123 -0
  206. data/lib/translator/command_translator.rb +421 -0
  207. data/lib/translator/last_returns_visitor.rb +57 -0
  208. data/lib/translator/local_variables_enumerator.rb +35 -0
  209. data/lib/translator/method_translator.rb +24 -0
  210. data/lib/translator/translator.rb +49 -0
  211. data/lib/type_aware_array.rb +71 -0
  212. data/lib/types/array_type.rb +51 -0
  213. data/lib/types/class_type.rb +128 -0
  214. data/lib/types/object_tracer.rb +162 -0
  215. data/lib/types/primitive_type.rb +73 -0
  216. data/lib/types/ruby_extension.rb +67 -0
  217. data/lib/types/ruby_type.rb +45 -0
  218. data/lib/types/type_inference.rb +382 -0
  219. data/lib/types/union_type.rb +155 -0
  220. metadata +321 -0
@@ -0,0 +1,44 @@
1
+ require 'rubygems'
2
+ require 'ruby_parser'
3
+ require 'sexp_processor'
4
+ require 'ruby2ruby'
5
+ require 'file/tail'
6
+
7
+ begin
8
+ require 'parse_tree'
9
+ require 'parse_tree_extensions'
10
+ rescue LoadError
11
+ # ParseTree is now optional for all supported rubies :)
12
+ end
13
+
14
+ module Sourcify #:nodoc:
15
+
16
+ IS_19x = RUBY_VERSION.include?('1.9.')
17
+
18
+ HAS_RIPPER =
19
+ begin
20
+ require 'ripper'
21
+ true
22
+ rescue LoadError
23
+ false
24
+ end
25
+
26
+ class << self
27
+
28
+ def require_rb(*args)
29
+ require root(*args)
30
+ end
31
+
32
+ def root(*args)
33
+ @root ||= File.join(File.dirname(File.expand_path(__FILE__)), 'sourcify')
34
+ File.join(@root, *args)
35
+ end
36
+
37
+ end
38
+ end
39
+
40
+ Sourcify.require_rb('patches')
41
+ Sourcify.require_rb('errors')
42
+ Sourcify.require_rb('version')
43
+ Sourcify.require_rb('proc')
44
+ Sourcify.require_rb('method')
@@ -0,0 +1,29 @@
1
+ module Sourcify
2
+ module Common
3
+ class Parser #:nodoc:all
4
+ class Converter
5
+ class << self
6
+
7
+ RUBY_PARSER = RubyParser.new
8
+ RUBY_2_RUBY = Ruby2Ruby.new
9
+
10
+ def to_sexp(code, file = nil)
11
+ retried = false
12
+ begin
13
+ RUBY_PARSER.reset
14
+ (retried ? RubyParser.new : RUBY_PARSER).parse(*[code, file].compact)
15
+ rescue Racc::ParseError, SyntaxError
16
+ return nil if retried
17
+ retried = true; retry
18
+ end
19
+ end
20
+
21
+ def to_code(sexp)
22
+ RUBY_2_RUBY.process(Sexp.from_array(sexp.to_a))
23
+ end
24
+
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,23 @@
1
+ module Sourcify
2
+ module Common
3
+ class Parser
4
+ module RawScanner #:nodoc:all
5
+ class Comment
6
+
7
+ def <<(content)
8
+ (@contents ||= []) << content
9
+ end
10
+
11
+ def to_s
12
+ @contents.join
13
+ end
14
+
15
+ def closed?
16
+ @contents[-1].split("\n")[-1].strip == '=end'
17
+ end
18
+
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,43 @@
1
+ module Sourcify
2
+ module Common
3
+ class Parser
4
+ module RawScanner #:nodoc:all
5
+ class Counter
6
+
7
+ attr_reader :counts
8
+
9
+ def initialize
10
+ @counts = [0,0]
11
+ end
12
+
13
+ def started?
14
+ @counts.any?(&:nonzero?)
15
+ end
16
+
17
+ def just_started?
18
+ @counts.any?{|count| count == 1 }
19
+ end
20
+
21
+ def balanced?
22
+ @counts.any?(&:zero?)
23
+ end
24
+
25
+ def decrement
26
+ (0..1).each{|i| @counts[i] -= 1 unless @counts[i].zero? }
27
+ end
28
+
29
+ def increment(val = 1)
30
+ if val.is_a?(Range)
31
+ @counts[0] += val.first
32
+ @counts[1] += val.last
33
+ else
34
+ (0..1).each{|i| @counts[i] += 1 }
35
+ end
36
+ end
37
+
38
+ end
39
+
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,58 @@
1
+ module Sourcify
2
+ module Common
3
+ class Parser
4
+ module RawScanner #:nodoc:all
5
+ class DString < Struct.new(:tag, :encoding)
6
+
7
+ # To suppress 'warning: Object#type is deprecated; use Object#class' when
8
+ # evaluating string
9
+ attr_reader :type
10
+
11
+ def <<(content)
12
+ (@contents ||= []) << content
13
+ end
14
+
15
+ def to_s
16
+ @contents.join
17
+ end
18
+
19
+ def closed?
20
+ evaluable? && parsable?
21
+ end
22
+
23
+ private
24
+
25
+ CLOSING_TAGS = {'(' => ')', '[' => ']', '<' => '>', '{' => '}'}
26
+
27
+ def evaluable?
28
+ @contents.length >= 2 &&
29
+ @contents[-1][-1].chr == end_tag
30
+ end
31
+
32
+ def parsable?
33
+ !!RubyParser.new.parse(safe_contents)
34
+ rescue SyntaxError, Racc::ParseError
35
+ false
36
+ end
37
+
38
+ def safe_contents
39
+ # NOTE: %x & ` strings are dangerous to eval cos they execute shell commands,
40
+ # thus we convert them to normal strings 1st
41
+ to_s.gsub(/(%x)(\W|\_)/, '%Q\2').gsub(/.{0,2}(`)/) do |s|
42
+ s =~ /^(%Q|%W|%r|%x|.?%|.?\\)/ ? s : s.sub(/`$/,'%Q`')
43
+ end.force_encoding(encoding)
44
+ end
45
+
46
+ def start_tag
47
+ @start_tag ||= tag[-1].chr
48
+ end
49
+
50
+ def end_tag
51
+ @end_tag ||= (CLOSING_TAGS[start_tag] || start_tag)
52
+ end
53
+
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,140 @@
1
+ %w{heredoc comment dstring counter}.each do |f|
2
+ Sourcify.require_rb('common', 'parser', 'raw_scanner', f)
3
+ end
4
+
5
+ module Sourcify
6
+ module Common
7
+ class Parser
8
+ module RawScanner #:nodoc:all
9
+ module Extensions
10
+
11
+ class Escape < Exception; end
12
+
13
+ def process(data, opts={})
14
+ begin
15
+ @encoding = data.encoding
16
+ @start_pattern = opts[:start_pattern] || /.*/
17
+ @body_matcher = opts[:body_matcher] || lambda{|_| true }
18
+ @stop_on_newline = opts[:stop_on_newline]
19
+ @results, @data = [], data.unpack("c*")
20
+ reset_attributes
21
+ execute!
22
+ rescue Escape
23
+ @results
24
+ else
25
+ @results
26
+ end
27
+ end
28
+
29
+ def data_frag(range)
30
+ @data[range].pack('c*')
31
+ end
32
+
33
+ def push(key, ts, te)
34
+ @tokens << [key, data_frag(ts .. te.pred)]
35
+ end
36
+
37
+ def push_dstring(ts, te)
38
+ data = data_frag(ts .. te.pred)
39
+ @dstring ||= DString.new(data[%r{^("|`|/|%(?:Q|W|r|x|)(?:\W|_))},1], @encoding)
40
+ @dstring << data
41
+ return true unless @dstring.closed?
42
+ @tokens << [:dstring, @dstring.to_s]
43
+ @dstring = nil
44
+ end
45
+
46
+ def push_comment(ts, te)
47
+ data = data_frag(ts .. te.pred)
48
+ @comment ||= Comment.new
49
+ @comment << data
50
+ return true unless @comment.closed?
51
+ @tokens << [:comment, @comment.to_s]
52
+ @comment = nil
53
+ end
54
+
55
+ def push_heredoc(ts, te)
56
+ data = data_frag(ts .. te.pred)
57
+ unless @heredoc
58
+ indented, tag = data.match(/\<\<(\-?)['"]?(\w+)['"]?$/)[1..3]
59
+ @heredoc = Heredoc.new(tag, !indented.empty?, @encoding)
60
+ end
61
+ @heredoc << data
62
+ return true unless @heredoc.closed?(data_frag(te .. te))
63
+ @tokens << [:heredoc, @heredoc.to_s]
64
+ @heredoc = nil
65
+ end
66
+
67
+ def push_label(ts, te)
68
+ # NOTE: 1.9.* supports label key, which RubyParser cannot handle, thus
69
+ # conversion is needed.
70
+ @tokens << [:symbol, ':' + data_frag(ts .. te - 2)]
71
+ @tokens << [:space, ' ']
72
+ @tokens << [:assoc, '=>']
73
+ end
74
+
75
+ def preceded_with?(*args)
76
+ prev_token = @tokens[-1][0] == :space ? @tokens[-2] : @tokens[-1]
77
+ !([args].flatten & prev_token).empty? rescue nil
78
+ end
79
+
80
+ def increment_lineno
81
+ @lineno += 1
82
+ raise Escape \
83
+ if @stop_on_newline || !@results.empty? || (@results.empty? && @rejecting_block)
84
+ end
85
+
86
+ def codified_tokens(fix_heredoc = false)
87
+ (
88
+ if fix_heredoc
89
+ @tokens.map do |key, val|
90
+ case key
91
+ when :heredoc
92
+ %(\n%"#{
93
+ val.sub(/^(?:[^\n]+\n)(.*\n)(?:[^\n]+)$/m, '\1').
94
+ gsub(/\\|"/) {|c| "\\#{c}" }
95
+ }")
96
+ else val
97
+ end
98
+ end
99
+ else
100
+ @tokens.map(&:last)
101
+ end
102
+ ).join
103
+ end
104
+
105
+ def reset_attributes
106
+ @tokens, @lineno = [], 1
107
+ @heredoc, @dstring, @comment, @rejecting_block = nil
108
+ end
109
+
110
+ def offset_attributes
111
+ @lineno = 1 # Fixing JRuby's lineno bug (see http://jira.codehaus.org/browse/JRUBY-5014)
112
+ @tokens = [@tokens[-1]] unless @tokens.empty?
113
+ end
114
+
115
+ if HAS_RIPPER
116
+
117
+ def valid?(snippet, validate_as = nil)
118
+ sexp = Ripper.sexp(snippet)
119
+ return false unless sexp
120
+
121
+ case validate_as
122
+ when :hash then sexp[-1][0][0] == :hash
123
+ when nil then true
124
+ else raise ArgumentError
125
+ end
126
+ end
127
+
128
+ else
129
+
130
+ def valid?(snippet, _ = nil)
131
+ RubyParser.new.parse("#{snippet}") rescue false
132
+ end
133
+
134
+ end
135
+
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,26 @@
1
+ module Sourcify
2
+ module Common
3
+ class Parser
4
+ module RawScanner #:nodoc:all
5
+ class Heredoc < Struct.new(:tag, :indented, :encoding)
6
+
7
+ def <<(content)
8
+ (@contents ||= []) << content
9
+ end
10
+
11
+ def to_s
12
+ @contents.join.force_encoding(encoding)
13
+ end
14
+
15
+ def closed?(sealer)
16
+ return false unless sealer == "\n"
17
+ parts = @contents[-1].split("\n")
18
+ return true if parts[-1] == tag
19
+ indented && parts[-1].sub(/^\s*(.*)$/,'\1') == tag
20
+ end
21
+
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,45 @@
1
+ module Sourcify
2
+ module Common
3
+ class Parser #:nodoc:all
4
+ class SourceCode < Struct.new(:file, :line)
5
+
6
+ def line
7
+ super.pred
8
+ end
9
+
10
+ def to_s
11
+ case file
12
+ when /\(irb\)/, /\(irb\#\d+\)/ then from_irb_to_s
13
+ when /\(pry\)/ then from_pry_to_s
14
+ else from_file_to_s
15
+ end
16
+ end
17
+
18
+ def from_file_to_s
19
+ File.open(file, 'r') do |fh|
20
+ fh.extend(File::Tail).forward(line)
21
+ fh.readlines.join
22
+ end
23
+ end
24
+
25
+ def from_irb_to_s
26
+ # Really owe it to Florian Groß's solution @ http://rubyquiz.com/quiz38.html ...
27
+ # anyway, note that we use *line.succ* instead of *line* here.
28
+ IRB.CurrentContext.io.line(line.succ .. -1).join
29
+ end
30
+
31
+ def from_pry_to_s
32
+ # NOTE: HACK to reliably construct the lines required, as:
33
+ # * Pry.line_buffer always fail to show the last entry
34
+ # * Pry.history deliberately skips duplicated consecutive lines,
35
+ # yet it reliably shows the last
36
+ [
37
+ Pry.line_buffer,
38
+ Pry.history.to_a[-1]
39
+ ].flatten[line.succ .. -1] * ""
40
+ end
41
+
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,5 @@
1
+ %%{
2
+ machine common;
3
+ include common_expressions 'expressions.rl';
4
+ include common_machines 'machines.rl';
5
+
@@ -0,0 +1,38 @@
1
+ %%{
2
+ machine common_expressions;
3
+
4
+ kw_class = 'class';
5
+ kw_module = 'module';
6
+ kw_def = 'def';
7
+ kw_begin = 'begin';
8
+ kw_case = 'case';
9
+ kw_if = 'if';
10
+ kw_unless = 'unless';
11
+ kw_do = 'do';
12
+ kw_then = 'then';
13
+ kw_for = 'for';
14
+ kw_while = 'while';
15
+ kw_until = 'until';
16
+ kw_end = 'end';
17
+
18
+ vchar = alnum | '_';
19
+ const = upper . vchar* . ('::' . alpha . vchar*)*;
20
+ var = (lower | '_') . vchar*;
21
+ meth = (alpha | '_') . vchar*;
22
+ symbol = ':' . (var | const);
23
+ assoc = '=>';
24
+ assgn = '=';
25
+ comma = ',';
26
+ label = (var | const) . ':';
27
+
28
+ lparen = '(';
29
+ rparen = ')';
30
+ lbrace = '{';
31
+ rbrace = '}';
32
+ smcolon = ';';
33
+ newline = '\n';
34
+ bslash = '\\' . newline;
35
+ ospaces = space* -- newline;
36
+ mspaces = space+ -- newline;
37
+
38
+ }%%