ikra 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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