sourcify 0.5.0 → 0.6.0.rc1

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 (130) hide show
  1. data/.gitignore +1 -0
  2. data/HISTORY.txt +5 -0
  3. data/README.rdoc +86 -3
  4. data/Rakefile +47 -15
  5. data/lib/sourcify.rb +13 -0
  6. data/lib/sourcify/common/parser/converter.rb +29 -0
  7. data/lib/sourcify/common/parser/raw_scanner/comment.rb +23 -0
  8. data/lib/sourcify/common/parser/raw_scanner/counter.rb +43 -0
  9. data/lib/sourcify/common/parser/raw_scanner/dstring.rb +60 -0
  10. data/lib/sourcify/common/parser/raw_scanner/extensions.rb +121 -0
  11. data/lib/sourcify/common/parser/raw_scanner/heredoc.rb +26 -0
  12. data/lib/sourcify/common/parser/source_code.rb +33 -0
  13. data/lib/sourcify/common/ragel/common.rl +5 -0
  14. data/lib/sourcify/common/ragel/expressions.rl +38 -0
  15. data/lib/sourcify/{proc/scanner.rl → common/ragel/machines.rl} +10 -178
  16. data/lib/sourcify/errors.rb +4 -0
  17. data/lib/sourcify/method.rb +134 -0
  18. data/lib/sourcify/method/methods.rb +3 -0
  19. data/lib/sourcify/method/methods/to_raw_source.rb +30 -0
  20. data/lib/sourcify/method/methods/to_sexp.rb +30 -0
  21. data/lib/sourcify/method/methods/to_source.rb +30 -0
  22. data/lib/sourcify/method/parser.rb +104 -0
  23. data/lib/sourcify/method/parser/converter.rb +8 -0
  24. data/lib/sourcify/method/parser/raw_scanner.rb +2494 -0
  25. data/lib/sourcify/method/parser/raw_scanner.rl +144 -0
  26. data/lib/sourcify/method/parser/raw_scanner_extensions.rb +64 -0
  27. data/lib/sourcify/method/parser/scanner.rb +48 -0
  28. data/lib/sourcify/method/parser/source_code.rb +8 -0
  29. data/lib/sourcify/proc.rb +0 -2
  30. data/lib/sourcify/proc/parser.rb +2 -5
  31. data/lib/sourcify/proc/parser/converter.rb +2 -23
  32. data/lib/sourcify/proc/{scanner.rb → parser/raw_scanner.rb} +808 -806
  33. data/lib/sourcify/proc/parser/raw_scanner.rl +149 -0
  34. data/lib/sourcify/proc/parser/raw_scanner_extensions.rb +72 -0
  35. data/lib/sourcify/proc/parser/{code_scanner.rb → scanner.rb} +9 -5
  36. data/lib/sourcify/proc/parser/source_code.rb +2 -27
  37. data/lib/sourcify/version.rb +1 -1
  38. data/spec/method/others_from_def_end_block_spec.rb +49 -0
  39. data/spec/method/others_from_define_method_spec.rb +62 -0
  40. data/spec/method/raw_scanner/block_comment_spec.rb +8 -0
  41. data/spec/method/raw_scanner/double_colons_spec.rb +8 -0
  42. data/spec/method/raw_scanner/double_quote_str_w_interpolation_spec.rb +8 -0
  43. data/spec/method/raw_scanner/double_quote_str_wo_interpolation_spec.rb +8 -0
  44. data/spec/method/raw_scanner/heredoc_w_indent_spec.rb +8 -0
  45. data/spec/method/raw_scanner/heredoc_wo_indent_spec.rb +8 -0
  46. data/spec/method/raw_scanner/kw_block_start_alias1_spec.rb +20 -0
  47. data/spec/method/raw_scanner/kw_block_start_alias2_spec.rb +20 -0
  48. data/spec/method/raw_scanner/per_line_comment_spec.rb +8 -0
  49. data/spec/method/raw_scanner/single_quote_str_spec.rb +8 -0
  50. data/spec/method/raw_scanner/slash_operator_spec.rb +8 -0
  51. data/spec/method/raw_scanner/spec_helper.rb +80 -0
  52. data/spec/method/spec_helper.rb +1 -0
  53. data/spec/method/to_raw_source_spec.rb +31 -0
  54. data/spec/method/to_raw_source_w_specified_strip_enclosure_spec.rb +148 -0
  55. data/spec/method/to_sexp_from_def_end_block_w_variables_spec.rb +46 -0
  56. data/spec/method/to_sexp_from_def_end_block_within_irb_spec.rb +38 -0
  57. data/spec/method/to_sexp_from_define_method_w_multi_blocks_and_specified_attached_to_spec.rb +56 -0
  58. data/spec/method/to_sexp_from_define_method_w_variables_spec.rb +52 -0
  59. data/spec/method/to_sexp_from_define_method_within_irb_spec.rb +42 -0
  60. data/spec/method/to_sexp_w_specified_strip_enclosure_spec.rb +74 -0
  61. data/spec/method/to_source_from_def_end_block_w_19_extras_spec.rb +23 -0
  62. data/spec/method/to_source_from_def_end_block_w_nested_begin_spec.rb +35 -0
  63. data/spec/method/to_source_from_def_end_block_w_nested_case_spec.rb +35 -0
  64. data/spec/method/to_source_from_def_end_block_w_nested_class_spec.rb +51 -0
  65. data/spec/method/to_source_from_def_end_block_w_nested_do_end_block_spec.rb +33 -0
  66. data/spec/method/to_source_from_def_end_block_w_nested_for_spec.rb +126 -0
  67. data/spec/method/to_source_from_def_end_block_w_nested_if_spec.rb +82 -0
  68. data/spec/method/to_source_from_def_end_block_w_nested_literal_keyword_spec.rb +141 -0
  69. data/spec/method/to_source_from_def_end_block_w_nested_method_spec.rb +33 -0
  70. data/spec/method/to_source_from_def_end_block_w_nested_module_spec.rb +59 -0
  71. data/spec/method/to_source_from_def_end_block_w_nested_unless_spec.rb +82 -0
  72. data/spec/method/to_source_from_def_end_block_w_nested_until_spec.rb +179 -0
  73. data/spec/method/to_source_from_def_end_block_w_nested_while_spec.rb +179 -0
  74. data/spec/method/to_source_from_def_end_block_w_singleton_method_spec.rb +19 -0
  75. data/spec/method/to_source_from_def_end_block_within_irb_spec.rb +30 -0
  76. data/spec/method/to_source_from_def_end_w_multi_blocks_and_many_matches_spec.rb +30 -0
  77. data/spec/method/to_source_from_def_end_w_multi_blocks_and_single_match_spec.rb +36 -0
  78. data/spec/method/to_source_from_define_method_w_braced_block_spec.rb +113 -0
  79. data/spec/method/to_source_from_define_method_w_do_end_block_spec.rb +145 -0
  80. data/spec/method/to_source_from_define_method_w_multi_blocks_and_many_matches_spec.rb +56 -0
  81. data/spec/method/to_source_from_define_method_w_multi_blocks_and_single_match_spec.rb +73 -0
  82. data/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_attached_to_and_many_matches_spec.rb +36 -0
  83. data/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_attached_to_and_no_match_spec.rb +36 -0
  84. data/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_attached_to_and_single_match_spec.rb +28 -0
  85. data/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_attached_to_spec.rb +103 -0
  86. data/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_body_matcher_and_many_matches_spec.rb +36 -0
  87. data/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_body_matcher_and_no_match_spec.rb +36 -0
  88. data/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_body_matcher_and_single_match_spec.rb +28 -0
  89. data/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_ignore_nested_spec.rb +36 -0
  90. data/spec/method/to_source_from_define_method_within_irb_spec.rb +32 -0
  91. data/spec/method/to_source_magic_file_var_spec.rb +176 -0
  92. data/spec/method/to_source_magic_line_var_spec.rb +298 -0
  93. data/spec/method/to_source_w_specified_strip_enclosure_spec.rb +39 -0
  94. data/spec/no_method/unsupported_platform_spec.rb +26 -0
  95. data/spec/proc/raw_scanner/block_comment_spec.rb +8 -0
  96. data/spec/proc/raw_scanner/double_colons_spec.rb +8 -0
  97. data/spec/proc/raw_scanner/double_quote_str_w_interpolation_spec.rb +8 -0
  98. data/spec/proc/raw_scanner/double_quote_str_wo_interpolation_spec.rb +8 -0
  99. data/spec/proc/raw_scanner/heredoc_w_indent_spec.rb +8 -0
  100. data/spec/proc/raw_scanner/heredoc_wo_indent_spec.rb +8 -0
  101. data/spec/proc/raw_scanner/kw_block_start_alias1_spec.rb +20 -0
  102. data/spec/proc/raw_scanner/kw_block_start_alias2_spec.rb +20 -0
  103. data/spec/proc/raw_scanner/per_line_comment_spec.rb +8 -0
  104. data/spec/proc/raw_scanner/single_quote_str_spec.rb +8 -0
  105. data/spec/proc/raw_scanner/slash_operator_spec.rb +8 -0
  106. data/spec/proc/raw_scanner/spec_helper.rb +63 -0
  107. data/spec/{proc_scanner/block_comment_spec.rb → raw_scanner/block_comment_shared_spec.rb} +1 -5
  108. data/spec/{proc_scanner/double_colons_spec.rb → raw_scanner/double_colons_shared_spec.rb} +1 -5
  109. data/spec/{proc_scanner/double_quote_str_w_interpolation_spec.rb → raw_scanner/double_quote_str_w_interpolation_shared_spec.rb} +1 -5
  110. data/spec/{proc_scanner/double_quote_str_wo_interpolation_spec.rb → raw_scanner/double_quote_str_wo_interpolation_shared_spec.rb} +1 -5
  111. data/spec/raw_scanner/heredoc_w_indent_shared_spec.rb +69 -0
  112. data/spec/raw_scanner/heredoc_wo_indent_shared_spec.rb +70 -0
  113. data/spec/{proc_scanner/kw_do_alias1_spec.rb → raw_scanner/kw_block_start_alias1_shared_spec.rb} +10 -26
  114. data/spec/{proc_scanner/kw_do_alias2_spec.rb → raw_scanner/kw_block_start_alias2_shared_spec.rb} +10 -25
  115. data/spec/{proc_scanner/per_line_comment_spec.rb → raw_scanner/per_line_comment_shared_spec.rb} +1 -5
  116. data/spec/raw_scanner/shared_specs.rb +3 -0
  117. data/spec/{proc_scanner/single_quote_str_spec.rb → raw_scanner/single_quote_str_shared_spec.rb} +1 -5
  118. data/spec/{proc_scanner/slash_operator_spec.rb → raw_scanner/slash_operator_shared_spec.rb} +1 -5
  119. data/spec/run_spec.sh +7 -1
  120. data/spec/spec_helper.rb +8 -25
  121. metadata +204 -47
  122. data/.rvmrc +0 -1
  123. data/VERSION +0 -1
  124. data/lib/sourcify/proc/scanner/comment.rb +0 -21
  125. data/lib/sourcify/proc/scanner/counter.rb +0 -44
  126. data/lib/sourcify/proc/scanner/dstring.rb +0 -59
  127. data/lib/sourcify/proc/scanner/extensions.rb +0 -171
  128. data/lib/sourcify/proc/scanner/heredoc.rb +0 -24
  129. data/spec/proc_scanner/heredoc_spec.rb +0 -144
  130. data/spec/proc_scanner/spec_helper.rb +0 -33
@@ -0,0 +1,149 @@
1
+ Sourcify.require_rb('proc', 'parser', 'raw_scanner_extensions')
2
+
3
+ module Sourcify
4
+ module Proc
5
+ class Parser
6
+ module RawScanner #:nodoc:all
7
+
8
+ %%{
9
+
10
+ machine scanner;
11
+ include common 'common.rl';
12
+
13
+
14
+ ## MACHINE >> New statement
15
+ new_statement := |*
16
+
17
+ (kw_for | kw_while | kw_until) . ^vchar => {
18
+ push(:kw_do_alias2, ts, te)
19
+ increment_counter(:do_end, 0..1)
20
+ fgoto main;
21
+ };
22
+
23
+ (
24
+ ((kw_class | kw_module | kw_def | kw_begin | kw_case | kw_if | kw_unless) . ^vchar) |
25
+ (kw_class . ospaces . '<<' . ospaces . ^newline+)
26
+ ) => {
27
+ push(:kw_do_alias1, ts, te)
28
+ increment_counter(:do_end, 1)
29
+ fgoto main;
30
+ };
31
+
32
+ ospaces => { push(:space, ts, te) };
33
+ any => { fhold; fgoto main; };
34
+
35
+ *|;
36
+
37
+
38
+ ## MACHINE >> Main
39
+ main := |*
40
+
41
+ ## == Start/end of do..end block
42
+
43
+ kw_do => {
44
+ push(:kw_do, ts, te)
45
+ increment_counter(:do_end)
46
+ fgoto new_statement;
47
+ };
48
+
49
+ kw_end => {
50
+ push(:kw_end, ts, te)
51
+ decrement_counter(:do_end)
52
+ };
53
+
54
+ ## == Start/end of {...} block
55
+
56
+ lbrace => {
57
+ push(:lbrace, ts, te)
58
+ increment_counter(:brace)
59
+ };
60
+
61
+ rbrace => {
62
+ push(:rbrace, ts, te)
63
+ decrement_counter(:brace)
64
+ };
65
+
66
+ assoc => {
67
+ push(:assoc, ts, te)
68
+ fix_counter_false_start(:brace)
69
+ };
70
+
71
+ label => {
72
+ push_label(ts, te)
73
+ fix_counter_false_start(:brace)
74
+ };
75
+
76
+ ## == New statement
77
+
78
+ newline => {
79
+ push(:newline, ts, te)
80
+ increment_lineno
81
+ fgoto new_statement;
82
+ };
83
+
84
+ smcolon | lparen | assgn | kw_then | comma => {
85
+ push(:newline_alias, ts, te)
86
+ fgoto new_statement;
87
+ };
88
+
89
+ ## == Comment
90
+
91
+ '#' => {
92
+ fgoto per_line_comment;
93
+ };
94
+
95
+ newline . '=begin' . ospaces . (ospaces . ^newline+)* . newline => {
96
+ push_comment(ts, te)
97
+ increment_lineno
98
+ fgoto block_comment;
99
+ };
100
+
101
+ ## == Strings
102
+
103
+ ('<<' | '<<-') . ["']? . (const | var) . ["']? . newline => {
104
+ push_heredoc(ts, te)
105
+ increment_lineno
106
+ fgoto heredoc;
107
+ };
108
+
109
+ ('"' | "'" | '`' | '%') => {
110
+ fhold; fgoto string;
111
+ };
112
+
113
+ '/' => {
114
+ if preceded_with?(:char, :digit, :var, :const, :symbol, :dstring, :sstring, ')', ']', '}')
115
+ push(:op, ts, te)
116
+ else
117
+ fhold; fgoto string;
118
+ end
119
+ };
120
+
121
+ ## == Misc
122
+
123
+ var => { push(:var, ts, te) };
124
+ bslash => { push(:bslash, ts, te) };
125
+ const => { push(:const, ts, te) };
126
+ symbol => { push(:symbol, ts, te) };
127
+ mspaces => { push(:space, ts, te) };
128
+ [0-9] => { push(:digit, ts, te) };
129
+ lower => { push(:char, ts, te) };
130
+ any => { push(:any, ts, te) };
131
+
132
+ *|;
133
+
134
+ }%%
135
+ %% write data;
136
+
137
+ extend Extensions
138
+
139
+ def self.execute!
140
+ data = @data
141
+ eof = data.length
142
+ %% write init;
143
+ %% write exec;
144
+ end
145
+
146
+ end
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,72 @@
1
+ Sourcify.require_rb('common', 'parser', 'raw_scanner', 'extensions')
2
+
3
+ module Sourcify
4
+ module Proc
5
+ class Parser
6
+ module RawScanner #:nodoc:all
7
+ module Extensions
8
+
9
+ include Common::Parser::RawScanner::Extensions
10
+ class DoEndBlockCounter < Common::Parser::RawScanner::Counter; end
11
+ class BraceBlockCounter < Common::Parser::RawScanner::Counter; end
12
+
13
+ def fix_counter_false_start(key)
14
+ return unless this_counter(key).just_started?
15
+ return unless really_false_started?
16
+ reset_attributes
17
+ @tokens, @false_start_backup = @false_start_backup.dup, nil if @false_start_backup
18
+ end
19
+
20
+ def increment_counter(key, count = 1)
21
+ return if other_counter(key).started?
22
+ unless (counter = this_counter(key)).started?
23
+ return if (@rejecting_block = codified_tokens !~ @start_pattern)
24
+ @false_start_backup = @tokens.dup if key == :brace
25
+ offset_attributes
26
+ end
27
+ counter.increment(count)
28
+ end
29
+
30
+ def decrement_counter(key)
31
+ return unless (counter = this_counter(key)).started?
32
+ counter.decrement
33
+ construct_result_code if counter.balanced?
34
+ end
35
+
36
+ def other_counter(type)
37
+ {:do_end => @brace_counter, :brace => @do_end_counter}[type]
38
+ end
39
+
40
+ def this_counter(type)
41
+ {:brace => @brace_counter, :do_end => @do_end_counter}[type]
42
+ end
43
+
44
+ def construct_result_code
45
+ code = %Q(proc #{codified_tokens}).strip
46
+
47
+ begin
48
+ if valid?(code) && @body_matcher.call(code)
49
+ @results << code
50
+ raise Escape if @stop_on_newline or @lineno != 1
51
+ reset_attributes
52
+ end
53
+ rescue Exception
54
+ raise if $!.is_a?(Escape)
55
+ end
56
+ end
57
+
58
+ def really_false_started?
59
+ valid?(%Q(#{codified_tokens} 1}), :hash)
60
+ end
61
+
62
+ def reset_attributes
63
+ @do_end_counter = DoEndBlockCounter.new
64
+ @brace_counter = BraceBlockCounter.new
65
+ super
66
+ end
67
+
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -1,7 +1,9 @@
1
+ Sourcify.require_rb('proc', 'parser', 'raw_scanner')
2
+
1
3
  module Sourcify
2
4
  module Proc
3
5
  class Parser #:nodoc:all
4
- class CodeScanner
6
+ class Scanner
5
7
  class << self
6
8
 
7
9
  def process(source_code, opts, &matcher)
@@ -28,12 +30,13 @@ module Sourcify
28
30
  end
29
31
 
30
32
  def rscan(str, opts)
31
- results = Scanner.process(str, opts) || []
33
+ results = RawScanner.process(str, opts) || []
32
34
  return results if opts[:ignore_nested]
33
35
  results.map do |outer|
34
- inner = rscan(outer.sub(/^proc\s*(do|\{)/,''), opts.merge(:stop_on_newline => true))
35
- [outer, inner]
36
- end
36
+ [
37
+ outer,
38
+ rscan(outer.sub(/^proc\s*(do|\{)/,''), opts.merge(:stop_on_newline => true))
39
+ ]
37
40
  end
38
41
  end
39
42
 
@@ -41,3 +44,4 @@ module Sourcify
41
44
  end
42
45
  end
43
46
  end
47
+ end
@@ -1,33 +1,8 @@
1
1
  module Sourcify
2
2
  module Proc
3
3
  class Parser #:nodoc:all
4
- class SourceCode < Struct.new(:file, :line)
5
-
6
- def line
7
- super.pred
8
- end
9
-
10
- def to_s
11
- case file
12
- when /\(irb\)/ then from_irb_to_s
13
- else from_file_to_s
14
- end
15
- end
16
-
17
- def from_file_to_s
18
- File.open(file, 'r') do |fh|
19
- fh.extend(File::Tail).forward(line)
20
- fh.readlines.join
21
- end
22
- end
23
-
24
- def from_irb_to_s
25
- # Really owe it to Florian Groß's solution @ http://rubyquiz.com/quiz38.html ...
26
- # anyway, note that we use *line.succ* instead of *line* here.
27
- IRB.CurrentContext.io.line(line.succ .. -1).join
28
- end
29
-
30
- end
4
+ Sourcify.require_rb('common', 'parser', 'source_code')
5
+ SourceCode = Common::Parser::SourceCode
31
6
  end
32
7
  end
33
8
  end
@@ -1,3 +1,3 @@
1
1
  module Sourcify
2
- VERSION = "0.5.0"
2
+ VERSION = "0.6.0.rc1"
3
3
  end
@@ -0,0 +1,49 @@
1
+ require File.join(File.expand_path(File.dirname(__FILE__)), 'spec_helper')
2
+
3
+ describe "Misc (from def..end block)" do
4
+
5
+ should 'handle accessing #to_sexp after #to_source' do
6
+ def m1; x; end
7
+ (m = method(:m1)).to_source
8
+ m.should.be having_sexp(
9
+ s(:defn, :m1, s(:args), s(:scope, s(:block, s(:call, nil, :x, s(:arglist)))))
10
+ )
11
+ end
12
+
13
+ should 'handle accessing #to_source after #to_sexp' do
14
+ def m2; x; end
15
+ (m = method(:m2)).to_sexp
16
+ m.should.be having_source(%(
17
+ def m2; x; end
18
+ ))
19
+ end
20
+
21
+ should "handle body with '/' char" do
22
+ def m3; x/2; end
23
+ method(:m3).should.be having_source(%(
24
+ def m3; x/2; end
25
+ ))
26
+ end
27
+
28
+ should "handle lexer bug in missing trailing chars after '=>' operator" do
29
+ # This example addresses bug @ http://redmine.ruby-lang.org/issues/show/3765
30
+ {
31
+ __LINE__ => (def m4; x; end; method(:m4))
32
+ }.values.last.should.be having_source(%(
33
+ def m4; x; end
34
+ ))
35
+ end
36
+
37
+ should 'raise Sourcify::CannotFindSourceLocationError when Method#source_location is nil' do
38
+ lambda { 1.method(:to_s).to_source }.should.
39
+ raise(Sourcify::CannotFindSourceLocationError)
40
+ end
41
+
42
+ unless has_parsetree?
43
+ should "raise Sourcify::CannotParseEvalCodeError when method is created from eval" do
44
+ lambda { eval("def m5; x; end; method(:m5)").to_source }.should.
45
+ raise(Sourcify::CannotParseEvalCodeError)
46
+ end
47
+ end
48
+
49
+ end
@@ -0,0 +1,62 @@
1
+ require File.join(File.expand_path(File.dirname(__FILE__)), 'spec_helper')
2
+
3
+ describe "Misc (from define_method)" do
4
+
5
+ before { @thing = Object.new }
6
+
7
+ should 'handle accessing #to_sexp after #to_source' do
8
+ blk = lambda { x }
9
+ @thing.class.send(:define_method, :m1, &blk)
10
+ (m = @thing.method(:m1)).to_source
11
+ m.should.be having_sexp(
12
+ s(:defn, :m1, s(:args), s(:scope, s(:block, s(:call, nil, :x, s(:arglist)))))
13
+ )
14
+ end
15
+
16
+ should 'handle accessing #to_source after #to_sexp' do
17
+ blk = lambda { x }
18
+ @thing.class.send(:define_method, :m2, &blk)
19
+ (m = @thing.method(:m2)).to_sexp
20
+ m.should.be having_source(%(
21
+ def m2; x; end
22
+ ))
23
+ end
24
+
25
+ should "handle body with '/' char" do
26
+ blk = lambda { x / 2 }
27
+ @thing.class.send(:define_method, :m3, &blk)
28
+ @thing.method(:m3).should.be having_source(%(
29
+ def m3; x / 2; end
30
+ ))
31
+ end
32
+
33
+ should "handle lexer bug in missing trailing chars after '=>' operator" do
34
+ # This example addresses bug @ http://redmine.ruby-lang.org/issues/show/3765
35
+ hash = {
36
+ :x => lambda { x }
37
+ }
38
+ @thing.class.send(:define_method, :m4, &(hash[:x]))
39
+ @thing.method(:m4).should.be having_source(%(
40
+ def m4; x; end
41
+ ))
42
+ end
43
+
44
+ should "handle lexer bug in missing trailing chars after '=>' operator" do
45
+ # This example addresses bug @ http://redmine.ruby-lang.org/issues/show/3765
46
+ hash = {
47
+ :blk => lambda do x end
48
+ }
49
+ @thing.class.send(:define_method, :m5, &(hash[:blk]))
50
+ @thing.method(:m5).should.be having_source(%(
51
+ def m5; x; end
52
+ ))
53
+ end
54
+
55
+ unless has_parsetree?
56
+ should "raise Sourcify::CannotParseEvalCodeError when method is created from eval" do
57
+ lambda { eval("klass = Class.new { define_method(:m6){ x }; }; klass.new.method(:m6)").to_source }.
58
+ should.raise(Sourcify::CannotParseEvalCodeError)
59
+ end
60
+ end
61
+
62
+ end
@@ -0,0 +1,8 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+
3
+ unless has_parsetree?
4
+ describe "Method's raw scanner > block comment (=begin ... =end)" do
5
+ extend Sourcify::Method::Parser::RawScanner::Spec::GenericSupport
6
+ behaves_like "Block comment (=begin ... =end)"
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+
3
+ unless has_parsetree?
4
+ describe "Method's raw scanner > double colons" do
5
+ extend Sourcify::Method::Parser::RawScanner::Spec::GenericSupport
6
+ behaves_like "Double colons"
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+
3
+ unless has_parsetree?
4
+ describe "Method's raw scanner > double quote strings (w interpolation)" do
5
+ extend Sourcify::Method::Parser::RawScanner::Spec::GenericSupport
6
+ behaves_like "Double quote strings (w interpolation)"
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+
3
+ unless has_parsetree?
4
+ describe "Method's raw scanner > double quote strings (wo interpolation)" do
5
+ extend Sourcify::Method::Parser::RawScanner::Spec::GenericSupport
6
+ behaves_like "Double quote strings (wo interpolation)"
7
+ end
8
+ end