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,149 @@
1
+ Sourcify.require_rb('proc', 'parser', 'raw_scanner_extensions')
2
+
3
+ module Sourcify
4
+ module Proc
5
+ class Parser
6
+ module RawScanner #:nodoc:all
7
+
8
+ %%{
9
+
10
+ machine scanner;
11
+ include common 'common.rl';
12
+
13
+
14
+ ## MACHINE >> New statement
15
+ new_statement := |*
16
+
17
+ (kw_for | kw_while | kw_until) . ^vchar => {
18
+ push(:kw_do_alias2, ts, te)
19
+ increment_counter(:do_end, 0..1)
20
+ fgoto main;
21
+ };
22
+
23
+ (
24
+ ((kw_class | kw_module | kw_def | kw_begin | kw_case | kw_if | kw_unless) . ^vchar) |
25
+ (kw_class . ospaces . '<<' . ospaces . ^newline+)
26
+ ) => {
27
+ push(:kw_do_alias1, ts, te)
28
+ increment_counter(:do_end, 1)
29
+ fgoto main;
30
+ };
31
+
32
+ ospaces => { push(:space, ts, te) };
33
+ any => { fhold; fgoto main; };
34
+
35
+ *|;
36
+
37
+
38
+ ## MACHINE >> Main
39
+ main := |*
40
+
41
+ ## == Start/end of do..end block
42
+
43
+ kw_do => {
44
+ push(:kw_do, ts, te)
45
+ increment_counter(:do_end)
46
+ fgoto new_statement;
47
+ };
48
+
49
+ kw_end => {
50
+ push(:kw_end, ts, te)
51
+ decrement_counter(:do_end)
52
+ };
53
+
54
+ ## == Start/end of {...} block
55
+
56
+ lbrace => {
57
+ push(:lbrace, ts, te)
58
+ increment_counter(:brace)
59
+ };
60
+
61
+ rbrace => {
62
+ push(:rbrace, ts, te)
63
+ decrement_counter(:brace)
64
+ };
65
+
66
+ assoc => {
67
+ push(:assoc, ts, te)
68
+ fix_counter_false_start(:brace)
69
+ };
70
+
71
+ label => {
72
+ push_label(ts, te)
73
+ fix_counter_false_start(:brace)
74
+ };
75
+
76
+ ## == New statement
77
+
78
+ newline => {
79
+ push(:newline, ts, te)
80
+ increment_lineno
81
+ fgoto new_statement;
82
+ };
83
+
84
+ smcolon | lparen | assgn | kw_then | comma => {
85
+ push(:newline_alias, ts, te)
86
+ fgoto new_statement;
87
+ };
88
+
89
+ ## == Comment
90
+
91
+ '#' => {
92
+ fgoto per_line_comment;
93
+ };
94
+
95
+ newline . '=begin' . ospaces . (ospaces . ^newline+)* . newline => {
96
+ push_comment(ts, te)
97
+ increment_lineno
98
+ fgoto block_comment;
99
+ };
100
+
101
+ ## == Strings
102
+
103
+ ('<<' | '<<-') . ["']? . (const | var) . ["']? . newline => {
104
+ push_heredoc(ts, te)
105
+ increment_lineno
106
+ fgoto heredoc;
107
+ };
108
+
109
+ ('"' | "'" | '`' | '%') => {
110
+ fhold; fgoto string;
111
+ };
112
+
113
+ '/' => {
114
+ if preceded_with?(:char, :digit, :var, :const, :symbol, :dstring, :sstring, ')', ']', '}')
115
+ push(:op, ts, te)
116
+ else
117
+ fhold; fgoto string;
118
+ end
119
+ };
120
+
121
+ ## == Misc
122
+
123
+ var => { push(:var, ts, te) };
124
+ bslash => { push(:bslash, ts, te) };
125
+ const => { push(:const, ts, te) };
126
+ symbol => { push(:symbol, ts, te) };
127
+ mspaces => { push(:space, ts, te) };
128
+ [0-9] => { push(:digit, ts, te) };
129
+ lower => { push(:char, ts, te) };
130
+ any => { push(:any, ts, te) };
131
+
132
+ *|;
133
+
134
+ }%%
135
+ %% write data;
136
+
137
+ extend Extensions
138
+
139
+ def self.execute!
140
+ data = @data
141
+ eof = data.length
142
+ %% write init;
143
+ %% write exec;
144
+ end
145
+
146
+ end
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,74 @@
1
+ Sourcify.require_rb('common', 'parser', 'raw_scanner', 'extensions')
2
+
3
+ module Sourcify
4
+ module Proc
5
+ class Parser
6
+ module RawScanner #:nodoc:all
7
+ module Extensions
8
+
9
+ include Common::Parser::RawScanner::Extensions
10
+ class DoEndBlockCounter < Common::Parser::RawScanner::Counter; end
11
+ class BraceBlockCounter < Common::Parser::RawScanner::Counter; end
12
+
13
+ def fix_counter_false_start(key)
14
+ return unless this_counter(key).just_started?
15
+ return unless really_false_started?
16
+ reset_attributes
17
+ @tokens, @false_start_backup = @false_start_backup.dup, nil if @false_start_backup
18
+ end
19
+
20
+ def increment_counter(key, count = 1)
21
+ return if other_counter(key).started?
22
+ unless (counter = this_counter(key)).started?
23
+ return if (@rejecting_block = codified_tokens !~ @start_pattern)
24
+ @false_start_backup = @tokens.dup if key == :brace
25
+ offset_attributes
26
+ end
27
+ counter.increment(count)
28
+ end
29
+
30
+ def decrement_counter(key)
31
+ return unless (counter = this_counter(key)).started?
32
+ counter.decrement
33
+ construct_result_code if counter.balanced?
34
+ end
35
+
36
+ def other_counter(type)
37
+ {:do_end => @brace_counter, :brace => @do_end_counter}[type]
38
+ end
39
+
40
+ def this_counter(type)
41
+ {:brace => @brace_counter, :do_end => @do_end_counter}[type]
42
+ end
43
+
44
+ def construct_result_code
45
+ codes = [false, true].map do |fix_heredoc|
46
+ %Q(proc #{codified_tokens(fix_heredoc)}).force_encoding(@encoding)
47
+ end
48
+
49
+ begin
50
+ if valid?(codes[1]) && @body_matcher.call(codes[0])
51
+ @results << codes
52
+ raise Escape if @stop_on_newline or @lineno != 1
53
+ reset_attributes
54
+ end
55
+ rescue Exception
56
+ raise if $!.is_a?(Escape)
57
+ end
58
+ end
59
+
60
+ def really_false_started?
61
+ valid?(%Q(#{codified_tokens(true)} 1}), :hash)
62
+ end
63
+
64
+ def reset_attributes
65
+ @do_end_counter = DoEndBlockCounter.new
66
+ @brace_counter = BraceBlockCounter.new
67
+ super
68
+ end
69
+
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,49 @@
1
+ Sourcify.require_rb('proc', 'parser', 'raw_scanner')
2
+
3
+ module Sourcify
4
+ module Proc
5
+ class Parser #:nodoc:all
6
+ class Scanner
7
+ class << self
8
+
9
+ def process(source_code, opts, &matcher)
10
+ results = rscan(source_code.to_s, {
11
+ :start_pattern => scan_pattern_hint(opts[:attached_to]),
12
+ :body_matcher => opts[:body_matcher],
13
+ :ignore_nested => opts[:ignore_nested],
14
+ :stop_on_newline => false,
15
+ }).select{|(raw, normalized)| matcher.call(raw) }
16
+
17
+ case results.size
18
+ when 0 then raise NoMatchingProcError
19
+ when 1 then results[0]
20
+ else raise MultipleMatchingProcsPerLineError
21
+ end
22
+ end
23
+
24
+ def scan_pattern_hint(val)
25
+ case val
26
+ when Regexp then val
27
+ when String, Symbol then /^(?:.*?\W|)#{val}(?:\W)/
28
+ when nil then /.*/
29
+ else raise TypeError
30
+ end
31
+ end
32
+
33
+ def rscan(str, opts)
34
+ results = RawScanner.process(str, opts) || []
35
+ inner_opts = opts.merge(:stop_on_newline => true)
36
+ return results if opts[:ignore_nested]
37
+ results.map do |outer|
38
+ [
39
+ outer,
40
+ *rscan(outer[1].sub(/^proc\s*(do|\{)/,''), inner_opts)
41
+ ]
42
+ end.flatten(1)
43
+ end
44
+
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,8 @@
1
+ module Sourcify
2
+ module Proc
3
+ class Parser #:nodoc:all
4
+ Sourcify.require_rb('common', 'parser', 'source_code')
5
+ SourceCode = Common::Parser::SourceCode
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,3 @@
1
+ module Sourcify
2
+ VERSION = "0.6.0.rc4"
3
+ end
@@ -0,0 +1,31 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "sourcify/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "sourcify"
7
+ s.version = Sourcify::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["NgTzeYang"]
10
+ s.email = ["ngty77@gmail.com"]
11
+ s.homepage = "http://github.com/ngty/sourcify"
12
+ s.summary = %q{Workarounds before ruby-core officially supports Proc#to_source (& friends)}
13
+ s.description = %q{}
14
+
15
+ s.add_dependency 'ruby2ruby', '~> 1.3.1'
16
+ s.add_dependency 'sexp_processor', '~> 3.2.0'
17
+ s.add_dependency 'ruby_parser', '~> 2.3.1'
18
+ s.add_dependency 'file-tail', '~> 1.0.10'
19
+
20
+ s.add_development_dependency 'bacon'
21
+ s.add_development_dependency 'pry'
22
+
23
+ # ParseTree (better performance + dynamic goodness, but not supported on java & 1.9.*),
24
+ # optional for any 1.8.*.
25
+ #s.add_dependency "ParseTree", ">= 3.0.6"
26
+
27
+ s.extra_rdoc_files = ["README.rdoc"]
28
+ s.files = `git ls-files`.split("\n")
29
+ s.test_files = `git ls-files -- spec/*`.split("\n")
30
+ s.require_paths = ["lib"]
31
+ end
@@ -0,0 +1,84 @@
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), '..', 'lib', 'sourcify')
2
+ require 'benchmark'
3
+ require 'pp'
4
+
5
+ if RUBY_PLATFORM =~ /java/i
6
+ require 'jruby'
7
+ JRuby.objectspace = true
8
+ reload! rescue nil
9
+ end
10
+
11
+ DUMPED_OBJECT_SPACE_PROCS = {:max => nil, :done => 0}
12
+ DUMP_OBJECT_SPACE_PROCS_ERRORS = []
13
+ class STOP_DUMPING_OBJECT_SPACE_PROCS < Exception; end
14
+
15
+ def dump_object_space_procs(debug = false)
16
+ # Determine working dir
17
+ name = [
18
+ RUBY_DESCRIPTION =~ /enterprise/i ? 'ree' : (RUBY_PLATFORM =~ /java/i ? 'jruby' : 'mri'),
19
+ RUBY_VERSION,
20
+ Object.const_defined?(:ParseTree) ? 'parsetree' : nil
21
+ ].compact.join('~')
22
+ dump_dir = File.join(File.dirname(File.expand_path(__FILE__)), '..', 'tmp', name)
23
+ Dir.mkdir(dump_dir) unless File.exists?(dump_dir)
24
+
25
+ puts '',
26
+ '== NOTE: dump files can be found at %s' % dump_dir
27
+
28
+ # Core processing
29
+ ObjectSpace.each_object(Proc).to_a.select{|o| o.source_location }.
30
+ group_by{|o| o.source_location[0] }.each do |ofile, objs|
31
+ nfile = File.join(dump_dir, ofile.gsub('/','~'))
32
+ File.open(nfile,'w') do |f|
33
+ objs.sort_by{|o| o.source_location[1] }.map do |o|
34
+ DUMPED_OBJECT_SPACE_PROCS[:done] += 1
35
+ begin
36
+ data = {
37
+ :location => o.source_location,
38
+ :sexp => o.to_sexp,
39
+ :source => o.to_source
40
+ }
41
+ f.puts(data.pretty_inspect)
42
+ print '.'
43
+ rescue Exception
44
+ data = {
45
+ :location => o.source_location,
46
+ :error => $!.inspect
47
+ }
48
+ DUMP_OBJECT_SPACE_PROCS_ERRORS << data
49
+ f.puts(data.pretty_inspect)
50
+ pp(data) if debug
51
+ print 'x'
52
+ ensure
53
+ raise STOP_DUMPING_OBJECT_SPACE_PROCS \
54
+ if DUMPED_OBJECT_SPACE_PROCS.values.uniq.size == 1
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ # Dumping in action
62
+ figures = Benchmark.measure do
63
+ begin
64
+ dump_object_space_procs
65
+ rescue STOP_DUMPING_OBJECT_SPACE_PROCS
66
+ end
67
+ end
68
+
69
+ # Printout the failures/passes
70
+ unless DUMP_OBJECT_SPACE_PROCS_ERRORS.empty?
71
+ puts '', '== OOPS, we have some erorrs :('
72
+ DUMP_OBJECT_SPACE_PROCS_ERRORS.each_with_index do |e, i|
73
+ print "#{i}). %s" % e.pretty_inspect
74
+ end
75
+ else
76
+ puts '', '== YEAH, no errors :)'
77
+ end
78
+
79
+ # Printout the benchmark results
80
+ puts '',
81
+ '== Benchmark results for processing %s procs:' % DUMPED_OBJECT_SPACE_PROCS[:done],
82
+ figures.to_s, ''
83
+
84
+ # __END__
@@ -0,0 +1,33 @@
1
+ # -*- coding: utf-8 -*-
2
+ require File.join(File.expand_path(File.dirname(__FILE__)), 'spec_helper')
3
+
4
+ describe "Encoding (from def..end block)" do
5
+ next unless Sourcify::IS_19x
6
+
7
+ should "handle body as UTF-8 string" do
8
+ def m1; "こんにちは"; end
9
+ method(:m1).should.be having_sexp(
10
+ s(:defn, :m1, s(:args), s(:scope, s(:block, s(:str, "こんにちは"))))
11
+ )
12
+ end
13
+
14
+ should "handle body with unicode regexp" do
15
+ # NOTE: This specifically addresses https://github.com/ngty/sourcify/issues/15
16
+ def m2; /\p{Lu}/ ; end
17
+ method(:m2).should.be having_sexp(
18
+ s(:defn, :m2, s(:args), s(:scope, s(:block, s(:lit, /\p{Lu}/))))
19
+ )
20
+ end
21
+
22
+ should "handle body with UTF-8 heredoc" do
23
+ def m3
24
+ <<-EOL
25
+ こんにちは
26
+ EOL
27
+ end
28
+ method(:m3).should.be having_sexp(
29
+ s(:defn, :m3, s(:args), s(:scope, s(:block, s(:str, " こんにちは\n"))))
30
+ )
31
+ end
32
+
33
+ end
@@ -0,0 +1,37 @@
1
+ # -*- coding: utf-8 -*-
2
+ require File.join(File.expand_path(File.dirname(__FILE__)), 'spec_helper')
3
+
4
+ describe "Encoding (from define_method)" do
5
+ next unless Sourcify::IS_19x
6
+
7
+ before { @thing = Object.new }
8
+
9
+ should "handle body as UTF-8 string" do
10
+ b = lambda { "こんにちは" }
11
+ @thing.class.send(:define_method, :m1, &b)
12
+ @thing.method(:m1).should.be having_sexp(
13
+ s(:defn, :m1, s(:args), s(:scope, s(:block, s(:str, "こんにちは"))))
14
+ )
15
+ end
16
+
17
+ should "handle body with unicode regexp" do
18
+ # NOTE: This specifically addresses https://github.com/ngty/sourcify/issues/15
19
+ b = lambda { /\p{Lu}/ }
20
+ @thing.class.send(:define_method, :m2, &b)
21
+ @thing.method(:m2).should.be having_sexp(
22
+ s(:defn, :m2, s(:args), s(:scope, s(:block, s(:lit, /\p{Lu}/))))
23
+ )
24
+ end
25
+
26
+ should "handle body with UTF-8 heredoc" do
27
+ b = lambda do
28
+ <<-EOL
29
+ こんにちは
30
+ EOL
31
+ end
32
+ @thing.class.send(:define_method, :m3, &b)
33
+ @thing.method(:m3).should.be having_sexp(
34
+ s(:defn, :m3, s(:args), s(:scope, s(:block, s(:str, " こんにちは\n"))))
35
+ )
36
+ end
37
+ end