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.
- checksums.yaml +7 -0
- data/lib/ast/builder.rb +100 -0
- data/lib/ast/lexical_variables_enumerator.rb +34 -0
- data/lib/ast/method_definition.rb +37 -0
- data/lib/ast/nodes.rb +208 -0
- data/lib/ast/printer.rb +99 -0
- data/lib/ast/translator.rb +264 -0
- data/lib/ast/visitor.rb +173 -0
- data/lib/config/configuration.rb +18 -0
- data/lib/config/os_configuration.rb +56 -0
- data/lib/entity.rb +11 -0
- data/lib/ikra.rb +7 -0
- data/lib/parsing.rb +32 -0
- data/lib/resources/cuda/block_function_head.cpp +1 -0
- data/lib/resources/cuda/env_builder_copy_array.cpp +4 -0
- data/lib/resources/cuda/header.cpp +46 -0
- data/lib/resources/cuda/kernel.cpp +8 -0
- data/lib/resources/cuda/kernel_launcher.cpp +28 -0
- data/lib/resources/cuda/soa_header.cpp +4 -0
- data/lib/scope.rb +166 -0
- data/lib/sourcify/Gemfile +10 -0
- data/lib/sourcify/HISTORY.txt +88 -0
- data/lib/sourcify/LICENSE +20 -0
- data/lib/sourcify/README.rdoc +352 -0
- data/lib/sourcify/Rakefile +111 -0
- data/lib/sourcify/lib/sourcify.rb +44 -0
- data/lib/sourcify/lib/sourcify/common/parser/converter.rb +29 -0
- data/lib/sourcify/lib/sourcify/common/parser/raw_scanner/comment.rb +23 -0
- data/lib/sourcify/lib/sourcify/common/parser/raw_scanner/counter.rb +43 -0
- data/lib/sourcify/lib/sourcify/common/parser/raw_scanner/dstring.rb +58 -0
- data/lib/sourcify/lib/sourcify/common/parser/raw_scanner/extensions.rb +140 -0
- data/lib/sourcify/lib/sourcify/common/parser/raw_scanner/heredoc.rb +26 -0
- data/lib/sourcify/lib/sourcify/common/parser/source_code.rb +45 -0
- data/lib/sourcify/lib/sourcify/common/ragel/common.rl +5 -0
- data/lib/sourcify/lib/sourcify/common/ragel/expressions.rl +38 -0
- data/lib/sourcify/lib/sourcify/common/ragel/machines.rl +317 -0
- data/lib/sourcify/lib/sourcify/errors.rb +4 -0
- data/lib/sourcify/lib/sourcify/method.rb +138 -0
- data/lib/sourcify/lib/sourcify/method/methods.rb +3 -0
- data/lib/sourcify/lib/sourcify/method/methods/to_raw_source.rb +30 -0
- data/lib/sourcify/lib/sourcify/method/methods/to_sexp.rb +30 -0
- data/lib/sourcify/lib/sourcify/method/methods/to_source.rb +30 -0
- data/lib/sourcify/lib/sourcify/method/parser.rb +110 -0
- data/lib/sourcify/lib/sourcify/method/parser/converter.rb +8 -0
- data/lib/sourcify/lib/sourcify/method/parser/raw_scanner.rb +2494 -0
- data/lib/sourcify/lib/sourcify/method/parser/raw_scanner.rl +144 -0
- data/lib/sourcify/lib/sourcify/method/parser/raw_scanner_extensions.rb +68 -0
- data/lib/sourcify/lib/sourcify/method/parser/scanner.rb +52 -0
- data/lib/sourcify/lib/sourcify/method/parser/source_code.rb +8 -0
- data/lib/sourcify/lib/sourcify/patches.rb +63 -0
- data/lib/sourcify/lib/sourcify/proc.rb +183 -0
- data/lib/sourcify/lib/sourcify/proc/methods.rb +3 -0
- data/lib/sourcify/lib/sourcify/proc/methods/source_location.rb +61 -0
- data/lib/sourcify/lib/sourcify/proc/methods/to_raw_source.rb +20 -0
- data/lib/sourcify/lib/sourcify/proc/methods/to_sexp.rb +40 -0
- data/lib/sourcify/lib/sourcify/proc/methods/to_source.rb +48 -0
- data/lib/sourcify/lib/sourcify/proc/parser.rb +51 -0
- data/lib/sourcify/lib/sourcify/proc/parser/converter.rb +8 -0
- data/lib/sourcify/lib/sourcify/proc/parser/normalizer.rb +43 -0
- data/lib/sourcify/lib/sourcify/proc/parser/raw_scanner.rb +2498 -0
- data/lib/sourcify/lib/sourcify/proc/parser/raw_scanner.rl +149 -0
- data/lib/sourcify/lib/sourcify/proc/parser/raw_scanner_extensions.rb +74 -0
- data/lib/sourcify/lib/sourcify/proc/parser/scanner.rb +49 -0
- data/lib/sourcify/lib/sourcify/proc/parser/source_code.rb +8 -0
- data/lib/sourcify/lib/sourcify/version.rb +3 -0
- data/lib/sourcify/sourcify.gemspec +31 -0
- data/lib/sourcify/spec/dump_object_space_procs.rb +84 -0
- data/lib/sourcify/spec/method/encoding_from_def_end_block_spec.rb +33 -0
- data/lib/sourcify/spec/method/encoding_from_define_method_spec.rb +37 -0
- data/lib/sourcify/spec/method/others_from_def_end_block_spec.rb +49 -0
- data/lib/sourcify/spec/method/others_from_define_method_spec.rb +63 -0
- data/lib/sourcify/spec/method/raw_scanner/block_comment_spec.rb +8 -0
- data/lib/sourcify/spec/method/raw_scanner/double_colons_spec.rb +8 -0
- data/lib/sourcify/spec/method/raw_scanner/double_quote_str_w_interpolation_spec.rb +8 -0
- data/lib/sourcify/spec/method/raw_scanner/double_quote_str_wo_interpolation_spec.rb +8 -0
- data/lib/sourcify/spec/method/raw_scanner/heredoc_w_indent_spec.rb +8 -0
- data/lib/sourcify/spec/method/raw_scanner/heredoc_wo_indent_spec.rb +8 -0
- data/lib/sourcify/spec/method/raw_scanner/kw_block_start_alias1_spec.rb +20 -0
- data/lib/sourcify/spec/method/raw_scanner/kw_block_start_alias2_spec.rb +20 -0
- data/lib/sourcify/spec/method/raw_scanner/per_line_comment_spec.rb +8 -0
- data/lib/sourcify/spec/method/raw_scanner/single_quote_str_spec.rb +8 -0
- data/lib/sourcify/spec/method/raw_scanner/slash_operator_spec.rb +8 -0
- data/lib/sourcify/spec/method/raw_scanner/spec_helper.rb +80 -0
- data/lib/sourcify/spec/method/spec_helper.rb +1 -0
- data/lib/sourcify/spec/method/to_raw_source_spec.rb +31 -0
- data/lib/sourcify/spec/method/to_raw_source_w_specified_strip_enclosure_spec.rb +148 -0
- data/lib/sourcify/spec/method/to_sexp_from_def_end_block_w_variables_spec.rb +46 -0
- data/lib/sourcify/spec/method/to_sexp_from_def_end_block_within_irb_spec.rb +38 -0
- data/lib/sourcify/spec/method/to_sexp_from_def_end_block_within_pry_spec.rb +38 -0
- data/lib/sourcify/spec/method/to_sexp_from_define_method_w_multi_blocks_and_specified_attached_to_spec.rb +56 -0
- data/lib/sourcify/spec/method/to_sexp_from_define_method_w_variables_spec.rb +52 -0
- data/lib/sourcify/spec/method/to_sexp_from_define_method_within_irb_spec.rb +42 -0
- data/lib/sourcify/spec/method/to_sexp_from_define_method_within_pry_spec.rb +42 -0
- data/lib/sourcify/spec/method/to_sexp_w_specified_strip_enclosure_spec.rb +74 -0
- data/lib/sourcify/spec/method/to_source_from_def_end_block_w_19_extras_spec.rb +23 -0
- data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_begin_spec.rb +35 -0
- data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_case_spec.rb +35 -0
- data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_class_spec.rb +51 -0
- data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_do_end_block_spec.rb +33 -0
- data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_for_spec.rb +126 -0
- data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_if_spec.rb +83 -0
- data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_literal_keyword_spec.rb +141 -0
- data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_method_spec.rb +33 -0
- data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_module_spec.rb +59 -0
- data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_unless_spec.rb +83 -0
- data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_until_spec.rb +179 -0
- data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_while_spec.rb +179 -0
- data/lib/sourcify/spec/method/to_source_from_def_end_block_w_singleton_method_spec.rb +19 -0
- data/lib/sourcify/spec/method/to_source_from_def_end_block_within_irb_spec.rb +30 -0
- data/lib/sourcify/spec/method/to_source_from_def_end_block_within_pry_spec.rb +45 -0
- data/lib/sourcify/spec/method/to_source_from_def_end_w_multi_blocks_and_many_matches_spec.rb +30 -0
- data/lib/sourcify/spec/method/to_source_from_def_end_w_multi_blocks_and_single_match_spec.rb +36 -0
- data/lib/sourcify/spec/method/to_source_from_define_method_w_braced_block_spec.rb +113 -0
- data/lib/sourcify/spec/method/to_source_from_define_method_w_do_end_block_spec.rb +145 -0
- data/lib/sourcify/spec/method/to_source_from_define_method_w_multi_blocks_and_many_matches_spec.rb +56 -0
- data/lib/sourcify/spec/method/to_source_from_define_method_w_multi_blocks_and_single_match_spec.rb +73 -0
- data/lib/sourcify/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_attached_to_and_many_matches_spec.rb +36 -0
- data/lib/sourcify/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_attached_to_and_no_match_spec.rb +36 -0
- data/lib/sourcify/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_attached_to_and_single_match_spec.rb +28 -0
- data/lib/sourcify/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_attached_to_spec.rb +103 -0
- data/lib/sourcify/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_body_matcher_and_many_matches_spec.rb +36 -0
- data/lib/sourcify/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_body_matcher_and_no_match_spec.rb +36 -0
- data/lib/sourcify/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_body_matcher_and_single_match_spec.rb +28 -0
- data/lib/sourcify/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_ignore_nested_spec.rb +36 -0
- data/lib/sourcify/spec/method/to_source_from_define_method_within_irb_spec.rb +32 -0
- data/lib/sourcify/spec/method/to_source_from_define_method_within_pry_spec.rb +49 -0
- data/lib/sourcify/spec/method/to_source_magic_file_var_spec.rb +176 -0
- data/lib/sourcify/spec/method/to_source_magic_line_var_spec.rb +298 -0
- data/lib/sourcify/spec/method/to_source_w_specified_strip_enclosure_spec.rb +39 -0
- data/lib/sourcify/spec/no_method/unsupported_platform_spec.rb +26 -0
- data/lib/sourcify/spec/proc/19x_extras.rb +27 -0
- data/lib/sourcify/spec/proc/created_on_the_fly_proc_spec.rb +80 -0
- data/lib/sourcify/spec/proc/encoding_spec.rb +36 -0
- data/lib/sourcify/spec/proc/others_spec.rb +40 -0
- data/lib/sourcify/spec/proc/raw_scanner/block_comment_spec.rb +8 -0
- data/lib/sourcify/spec/proc/raw_scanner/double_colons_spec.rb +8 -0
- data/lib/sourcify/spec/proc/raw_scanner/double_quote_str_w_interpolation_spec.rb +8 -0
- data/lib/sourcify/spec/proc/raw_scanner/double_quote_str_wo_interpolation_spec.rb +8 -0
- data/lib/sourcify/spec/proc/raw_scanner/heredoc_w_indent_spec.rb +8 -0
- data/lib/sourcify/spec/proc/raw_scanner/heredoc_wo_indent_spec.rb +8 -0
- data/lib/sourcify/spec/proc/raw_scanner/kw_block_start_alias1_spec.rb +20 -0
- data/lib/sourcify/spec/proc/raw_scanner/kw_block_start_alias2_spec.rb +20 -0
- data/lib/sourcify/spec/proc/raw_scanner/per_line_comment_spec.rb +8 -0
- data/lib/sourcify/spec/proc/raw_scanner/single_quote_str_spec.rb +8 -0
- data/lib/sourcify/spec/proc/raw_scanner/slash_operator_spec.rb +8 -0
- data/lib/sourcify/spec/proc/raw_scanner/spec_helper.rb +63 -0
- data/lib/sourcify/spec/proc/readme +5 -0
- data/lib/sourcify/spec/proc/spec_helper.rb +1 -0
- data/lib/sourcify/spec/proc/to_raw_source_spec.rb +33 -0
- data/lib/sourcify/spec/proc/to_raw_source_w_specified_strip_enclosure_spec.rb +69 -0
- data/lib/sourcify/spec/proc/to_sexp_from_multi_blocks_w_specified_attached_to_spec.rb +46 -0
- data/lib/sourcify/spec/proc/to_sexp_variables_spec.rb +146 -0
- data/lib/sourcify/spec/proc/to_sexp_w_specified_strip_enclosure_spec.rb +60 -0
- data/lib/sourcify/spec/proc/to_sexp_within_irb_spec.rb +146 -0
- data/lib/sourcify/spec/proc/to_sexp_within_pry_spec.rb +149 -0
- data/lib/sourcify/spec/proc/to_source_from_braced_block_w_nested_braced_block_spec.rb +33 -0
- data/lib/sourcify/spec/proc/to_source_from_braced_block_w_nested_hash_spec.rb +82 -0
- data/lib/sourcify/spec/proc/to_source_from_braced_block_wo_nesting_complication_spec.rb +46 -0
- data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_begin_spec.rb +35 -0
- data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_case_spec.rb +35 -0
- data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_class_spec.rb +89 -0
- data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_do_end_block_spec.rb +33 -0
- data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_for_spec.rb +132 -0
- data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_if_spec.rb +87 -0
- data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_literal_keyword_spec.rb +103 -0
- data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_method_spec.rb +33 -0
- data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_module_spec.rb +49 -0
- data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_unless_spec.rb +87 -0
- data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_until_spec.rb +189 -0
- data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_while_spec.rb +189 -0
- data/lib/sourcify/spec/proc/to_source_from_do_end_block_wo_nesting_complication_spec.rb +46 -0
- data/lib/sourcify/spec/proc/to_source_from_multi_blocks_w_many_matches_spec.rb +43 -0
- data/lib/sourcify/spec/proc/to_source_from_multi_blocks_w_single_match_spec.rb +20 -0
- data/lib/sourcify/spec/proc/to_source_from_multi_blocks_w_specified_attached_to_and_many_matches_spec.rb +45 -0
- data/lib/sourcify/spec/proc/to_source_from_multi_blocks_w_specified_attached_to_and_no_match_spec.rb +45 -0
- data/lib/sourcify/spec/proc/to_source_from_multi_blocks_w_specified_attached_to_and_single_match_spec.rb +22 -0
- data/lib/sourcify/spec/proc/to_source_from_multi_blocks_w_specified_attached_to_spec.rb +84 -0
- data/lib/sourcify/spec/proc/to_source_from_multi_blocks_w_specified_body_matcher_and_many_matches_spec.rb +45 -0
- data/lib/sourcify/spec/proc/to_source_from_multi_blocks_w_specified_body_matcher_and_no_match_spec.rb +45 -0
- data/lib/sourcify/spec/proc/to_source_from_multi_blocks_w_specified_body_matcher_and_single_match_spec.rb +22 -0
- data/lib/sourcify/spec/proc/to_source_from_multi_blocks_w_specified_ignore_nested_spec.rb +43 -0
- data/lib/sourcify/spec/proc/to_source_from_multi_do_end_blocks_w_single_match_spec.rb +31 -0
- data/lib/sourcify/spec/proc/to_source_magic_file_var_spec.rb +127 -0
- data/lib/sourcify/spec/proc/to_source_magic_line_var_spec.rb +127 -0
- data/lib/sourcify/spec/proc/to_source_variables_spec.rb +29 -0
- data/lib/sourcify/spec/proc/to_source_w_specified_strip_enclosure_spec.rb +33 -0
- data/lib/sourcify/spec/proc/to_source_within_irb_spec.rb +38 -0
- data/lib/sourcify/spec/proc/to_source_within_pry_spec.rb +61 -0
- data/lib/sourcify/spec/raw_scanner/block_comment_shared_spec.rb +57 -0
- data/lib/sourcify/spec/raw_scanner/double_colons_shared_spec.rb +11 -0
- data/lib/sourcify/spec/raw_scanner/double_quote_str_w_interpolation_shared_spec.rb +60 -0
- data/lib/sourcify/spec/raw_scanner/double_quote_str_wo_interpolation_shared_spec.rb +86 -0
- data/lib/sourcify/spec/raw_scanner/heredoc_w_indent_shared_spec.rb +69 -0
- data/lib/sourcify/spec/raw_scanner/heredoc_wo_indent_shared_spec.rb +70 -0
- data/lib/sourcify/spec/raw_scanner/kw_block_start_alias1_shared_spec.rb +73 -0
- data/lib/sourcify/spec/raw_scanner/kw_block_start_alias2_shared_spec.rb +73 -0
- data/lib/sourcify/spec/raw_scanner/per_line_comment_shared_spec.rb +32 -0
- data/lib/sourcify/spec/raw_scanner/shared_specs.rb +3 -0
- data/lib/sourcify/spec/raw_scanner/single_quote_str_shared_spec.rb +79 -0
- data/lib/sourcify/spec/raw_scanner/slash_operator_shared_spec.rb +71 -0
- data/lib/sourcify/spec/run_build.sh +25 -0
- data/lib/sourcify/spec/spec_helper.rb +130 -0
- data/lib/symbolic/symbolic.rb +248 -0
- data/lib/symbolic/visitor.rb +51 -0
- data/lib/translator/block_translator.rb +123 -0
- data/lib/translator/command_translator.rb +421 -0
- data/lib/translator/last_returns_visitor.rb +57 -0
- data/lib/translator/local_variables_enumerator.rb +35 -0
- data/lib/translator/method_translator.rb +24 -0
- data/lib/translator/translator.rb +49 -0
- data/lib/type_aware_array.rb +71 -0
- data/lib/types/array_type.rb +51 -0
- data/lib/types/class_type.rb +128 -0
- data/lib/types/object_tracer.rb +162 -0
- data/lib/types/primitive_type.rb +73 -0
- data/lib/types/ruby_extension.rb +67 -0
- data/lib/types/ruby_type.rb +45 -0
- data/lib/types/type_inference.rb +382 -0
- data/lib/types/union_type.rb +155 -0
- 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,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
|