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,144 @@
1
+ Sourcify.require_rb('method', 'parser', 'raw_scanner_extensions')
2
+
3
+ module Sourcify
4
+ module Method
5
+ class Parser
6
+ module RawScanner #:nodoc:all
7
+
8
+ %%{
9
+
10
+ machine scanner;
11
+ include common 'common.rl';
12
+
13
+ ## MACHINE >> New statement
14
+ new_statement := |*
15
+
16
+ (kw_for | kw_while | kw_until) . ^vchar => {
17
+ push(:kw_do_alias2, ts, te)
18
+ increment_counter(0..1)
19
+ fgoto main;
20
+ };
21
+
22
+ (
23
+ ((kw_class | kw_module | kw_do | kw_begin | kw_case | kw_if | kw_unless) . ^vchar) |
24
+ (kw_class . ospaces . '<<' . ospaces . ^(newline | smcolon)+)
25
+ ) => {
26
+ push(:kw_do_alias1, ts, te)
27
+ increment_counter(1)
28
+ fgoto main;
29
+ };
30
+
31
+ ospaces => { push(:space, ts, te) };
32
+ any => { fhold; fgoto main; };
33
+
34
+ *|;
35
+
36
+
37
+ ## MACHINE >> Main
38
+ main := |*
39
+
40
+ ## == Start/end of def..end block
41
+
42
+ kw_def => {
43
+ push(:kw_def, ts, te)
44
+ increment_counter(1)
45
+ fgoto new_statement;
46
+ };
47
+
48
+ kw_end => {
49
+ push(:kw_end, ts, te)
50
+ decrement_counter()
51
+ };
52
+
53
+ ## == Start/end of {...} block
54
+
55
+ lbrace => {
56
+ push(:lbrace, ts, te)
57
+ };
58
+
59
+ rbrace => {
60
+ push(:rbrace, ts, te)
61
+ };
62
+
63
+ assoc => {
64
+ push(:assoc, ts, te)
65
+ };
66
+
67
+ label => {
68
+ push_label(ts, te)
69
+ };
70
+
71
+ ## == New statement
72
+
73
+ newline => {
74
+ push(:newline, ts, te)
75
+ increment_lineno
76
+ fgoto new_statement;
77
+ };
78
+
79
+ smcolon | lparen | assgn | kw_then | comma => {
80
+ push(:newline_alias, ts, te)
81
+ fgoto new_statement;
82
+ };
83
+
84
+ ## == Comment
85
+
86
+ '#' => {
87
+ fgoto per_line_comment;
88
+ };
89
+
90
+ newline . '=begin' . ospaces . (ospaces . ^newline+)* . newline => {
91
+ push_comment(ts, te)
92
+ increment_lineno
93
+ fgoto block_comment;
94
+ };
95
+
96
+ ## == Strings
97
+
98
+ ('<<' | '<<-') . ["']? . (const | var) . ["']? . newline => {
99
+ push_heredoc(ts, te)
100
+ increment_lineno
101
+ fgoto heredoc;
102
+ };
103
+
104
+ ('"' | "'" | '`' | '%') => {
105
+ fhold; fgoto string;
106
+ };
107
+
108
+ '/' => {
109
+ if preceded_with?(:char, :digit, :var, :const, :symbol, :dstring, :sstring, ')', ']', '}')
110
+ push(:op, ts, te)
111
+ else
112
+ fhold; fgoto string;
113
+ end
114
+ };
115
+
116
+ ## == Misc
117
+
118
+ var => { push(:var, ts, te) };
119
+ bslash => { push(:bslash, ts, te) };
120
+ const => { push(:const, ts, te) };
121
+ symbol => { push(:symbol, ts, te) };
122
+ mspaces => { push(:space, ts, te) };
123
+ [0-9] => { push(:digit, ts, te) };
124
+ lower => { push(:char, ts, te) };
125
+ any => { push(:any, ts, te) };
126
+
127
+ *|;
128
+
129
+ }%%
130
+ %% write data;
131
+
132
+ extend Extensions
133
+
134
+ def self.execute!
135
+ data = @data
136
+ eof = data.length
137
+ %% write init;
138
+ %% write exec;
139
+ end
140
+
141
+ end
142
+ end
143
+ end
144
+ end
@@ -0,0 +1,68 @@
1
+ Sourcify.require_rb('common', 'parser', 'raw_scanner', 'extensions')
2
+
3
+ module Sourcify
4
+ module Method
5
+ class Parser
6
+ module RawScanner #:nodoc:all
7
+ module Extensions
8
+
9
+ include Common::Parser::RawScanner::Extensions
10
+ Counter = Common::Parser::RawScanner::Counter
11
+
12
+ def increment_lineno
13
+ stop_if_probably_defined_by_proc
14
+ super
15
+ end
16
+
17
+ def stop_if_probably_defined_by_proc
18
+ raise ProbablyDefinedByProc if @lineno == 1 && @results.empty? && !@counter.started?
19
+ end
20
+
21
+ def increment_counter(count = 1)
22
+ unless @counter.started?
23
+ return if (@rejecting_block = codified_tokens !~ @start_pattern)
24
+ offset_attributes
25
+ end
26
+ @counter.increment(count)
27
+ end
28
+
29
+ def decrement_counter
30
+ @counter.decrement
31
+ construct_result_code if @counter.balanced?
32
+ end
33
+
34
+ def construct_result_code
35
+ codes = [false, true].map do |fix_heredoc|
36
+ codified_tokens(fix_heredoc).force_encoding(@encoding)
37
+ end
38
+
39
+ begin
40
+ if valid?(codes[1]) && @body_matcher.call(codes[0])
41
+ # NOTE: Need to fix singleton method to avoid errors (eg. undefined object)
42
+ # downstream
43
+ @results << codes.map do |s|
44
+ s.sub(%r{^(def\s+)(?:[^\.]+\.)?(#{@name}.*end)$}m, '\1\2')
45
+ end
46
+ raise Escape if @stop_on_newline or @lineno != 1
47
+ reset_attributes
48
+ end
49
+ rescue Exception
50
+ raise if $!.is_a?(Escape)
51
+ end
52
+ end
53
+
54
+ def reset_attributes
55
+ @counter = Counter.new
56
+ super
57
+ end
58
+
59
+ def valid?(*args)
60
+ # TODO: shouldn't need this check, there seems to be a bug w raw_scanner.rl.
61
+ args[0].start_with?('def') && super
62
+ end
63
+
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,52 @@
1
+ Sourcify.require_rb('method', 'parser', 'raw_scanner')
2
+
3
+ module Sourcify
4
+ module Method
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 NoMatchingMethodError
19
+ when 1 then results[0]
20
+ else raise MultipleMatchingMethodsPerLineError
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(
41
+ outer[0].sub(/^def(.*)end$/,'\1').sub(/^(?:.*?)(def.*)$/,'\1'),
42
+ inner_opts
43
+ )
44
+ ]
45
+ end.flatten(1)
46
+ end
47
+
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,8 @@
1
+ module Sourcify
2
+ module Method
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,63 @@
1
+ if RUBY_VERSION.include?('1.8.6')
2
+
3
+ unless 1.respond_to?(:pred)
4
+ class Integer
5
+ def pred
6
+ self - 1
7
+ end
8
+ end
9
+ end
10
+
11
+ unless :a.respond_to?(:to_proc)
12
+ class Symbol
13
+ def to_proc
14
+ Proc.new{|*args| args.shift.__send__(self, *args)}
15
+ end
16
+ end
17
+ end
18
+
19
+ end
20
+
21
+ unless binding.respond_to?(:has_local_variable?)
22
+ class Binding
23
+ def has_local_variable?(name)
24
+ check_str = "local_variables.include?(#{name})"
25
+ self.eval(check_str) rescue eval(check_str, self)
26
+ end
27
+ end
28
+ end
29
+
30
+ # New way of adding new functionalities
31
+ module Sourcify
32
+ module Patches
33
+
34
+ module String
35
+ if ''.respond_to?(:force_encoding)
36
+
37
+ def same_encoding_as(other)
38
+ force_encoding(other.encoding)
39
+ end
40
+
41
+ else
42
+
43
+ def same_encoding_as(other)
44
+ self
45
+ end
46
+
47
+ def encoding
48
+ nil
49
+ end
50
+
51
+ def force_encoding(dummy)
52
+ self
53
+ end
54
+
55
+ end
56
+ end
57
+
58
+ ::String.class_eval do
59
+ include Sourcify::Patches::String
60
+ end
61
+
62
+ end
63
+ end
@@ -0,0 +1,183 @@
1
+ module Sourcify
2
+
3
+ class MultipleMatchingProcsPerLineError < Exception; end
4
+ class NoMatchingProcError < Exception; end
5
+ class CannotHandleCreatedOnTheFlyProcError < Exception; end
6
+
7
+ module Proc
8
+
9
+ def self.included(base) #:nodoc:
10
+ base.class_eval do
11
+ Sourcify.require_rb('proc', 'methods')
12
+ include Methods::SourceLocation
13
+ include Methods::ToRawSource
14
+ include Methods::ToSource
15
+ include Methods::ToSexp
16
+ end
17
+ end
18
+
19
+ module Stubs
20
+
21
+ ###
22
+ # Returns the ruby source filename and line number containing this proc.
23
+ #
24
+ # # /tmp/test.rb
25
+ # x = lambda { 1 }
26
+ # x.source_location # >> ["/tmp/test.rb", 2]
27
+ #
28
+ # When proc is not defined in ruby (i.e. native), or when the proc is created using
29
+ # Method#to_proc or Symbol#to_proc, nil is returned.
30
+ #
31
+ # class AA
32
+ # class << self
33
+ # def m1; 1; end
34
+ # def m2(&block); block; end
35
+ # end
36
+ # end
37
+ #
38
+ # AA.method(:m1).to_proc.source_location # >> nil
39
+ # AA.m2(&:m1).source_location # >> nil
40
+ #
41
+ # For 1.9.2, the proc obtained using Method#to_proc by default yields info pointing
42
+ # to where the method is located. Sourcify respects this builtin implementation and
43
+ # assumes you usually want it. It is possible to get info that is consistent with all
44
+ # other rubies by passing in +get_original+ as false:
45
+ #
46
+ # # /tmp/test.rb
47
+ # class AA
48
+ # def m; 1; end
49
+ # end
50
+ #
51
+ # x = AA.new.method(:m).to_proc
52
+ # x.source_location # >> ["/tmp/test.rb", 2]
53
+ # x.source_location(false) # >> nil
54
+ #
55
+ def source_location(get_original = true)
56
+ # NOTE: this is a stub for the actual one in Methods::SourceLocation
57
+ end
58
+
59
+ ###
60
+ # Returns the code representation of this proc. Unlike Proc#to_raw_source, the
61
+ # returned code retains only the functional aspects, fluff like comments are
62
+ # stripped off.
63
+ #
64
+ # lambda do |i|
65
+ # i+1 # (blah)
66
+ # end.to_source
67
+ # # >> "proc {|i| i+1 }"
68
+ #
69
+ # The following options are supported:
70
+ #
71
+ # * +:strip_enclosure+ when set to true, strips the enclosing "proc { ... }" to get
72
+ # just the meat within.
73
+ #
74
+ # lambda {|i| i+1 }.to_source(:strip_enclosure => true)
75
+ # # >> "i+2"
76
+ #
77
+ # (this option is effective regardless of presence of ParseTree)
78
+ #
79
+ # * +:attached_to+ is useful to avoid the nasty
80
+ # Sourcify::MultipleMatchingProcsPerLineError (as a result of ambiguities when doing
81
+ # static code analysis), it declares the condition that must be met prior grabbing
82
+ # the code block:
83
+ #
84
+ # x = lambda { proc { :blah } }
85
+ #
86
+ # x.to_source
87
+ # # >> Sourcify::MultipleMatchingProcsPerLineError
88
+ #
89
+ # x.to_source(:attached_to => :lambda)
90
+ # # >> "proc { proc { :blah } }"
91
+ #
92
+ # Sometimes more control is needed:
93
+ #
94
+ # # We want to ignore everything associated with ignore
95
+ # def ignore(&block); block; end
96
+ # x = lambda { ignore { :blah } }
97
+ #
98
+ # x.to_source
99
+ # # >> Sourcify::MultipleMatchingProcsPerLineError
100
+ #
101
+ # x.to_source(:attached_to => /^(.*\W|)(lambda|proc)\W/)
102
+ # # >> "proc { ignore { :blah } }"
103
+ #
104
+ # (this option is effective ONLY when ParseTree is not available)
105
+ #
106
+ # * +:ignore_nested+ is useful when only the outermost proc matters and we want to
107
+ # ignore all other nested proc(s):
108
+ #
109
+ # x = lambda { lambda { :blah } }
110
+ #
111
+ # x.to_source
112
+ # # >> Sourcify::MultipleMatchingProcsPerLineError
113
+ #
114
+ # x.to_source(:ignore_nested => true)
115
+ # # >> "proc { lambda { :blah } }"
116
+ #
117
+ # However, since code scanning stops at the outermost proc, beware of the following:
118
+ #
119
+ # x = lambda {|_| lambda { lambda { :blah } } }.call(nil)
120
+ #
121
+ # x.to_source
122
+ # # >> "proc { lambda { :blah } }"
123
+ #
124
+ # x.to_source(:ignore_nested => true)
125
+ # # >> Sourcify::NoMatchingProcError
126
+ #
127
+ # (this option is effective ONLY when ParseTree is not available)
128
+ #
129
+ # When in static code analysis (non-ParseTree) mode, it is even possible to
130
+ # specify how the proc body should look like by passing in a code block:
131
+ #
132
+ # x, y = lambda { def secret; 1; end }, lambda { :blah }
133
+ #
134
+ # x.to_source
135
+ # # >> Sourcify::MultipleMatchingProcsPerLineError
136
+ #
137
+ # x.to_source{|body| body =~ /^(.*\W|)def\W/ }
138
+ # # >> "proc { def secret; 1; end }"
139
+ #
140
+ def to_source(opts={}, &body_matcher)
141
+ # NOTE: this is a stub for the actual one in Methods::ToSource
142
+ end
143
+
144
+ ###
145
+ # Returns the S-expression representation of this proc.
146
+ #
147
+ # lambda {|i| i+1 }.to_sexp
148
+ # # >> s(:iter,
149
+ # # >> s(:call, nil, :proc, s(:arglist)),
150
+ # # >> s(:lasgn, :i),
151
+ # # >> s(:call, s(:lvar, :i), :+, s(:arglist, s(:lit, 1))))
152
+ #
153
+ # (pls see #to_source for options/arguments supported)
154
+ #
155
+ def to_sexp(opts={}, &body_matcher)
156
+ # NOTE: this is a stub for the actual one in Methods::ToSexp
157
+ end
158
+
159
+ ###
160
+ # Returns the raw code enclosed within this proc.
161
+ #
162
+ # lambda do |i|
163
+ # i+1 # (blah)
164
+ # end.to_source
165
+ # # >> "proc do |i|
166
+ # # >> i+1 # (blah)
167
+ # # >> end"
168
+ #
169
+ # NOTE: The options supported are the same as those for Proc#to_source.
170
+ #
171
+ def to_raw_source(opts={}, &body_matcher)
172
+ # NOTE: this is a stub for the actual one in Methods::ToRawSource
173
+ end
174
+
175
+ end
176
+
177
+ end
178
+
179
+ end
180
+
181
+ Proc.class_eval do
182
+ include Sourcify::Proc
183
+ end