parser 2.1.0.pre2 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -2
- data/CHANGELOG.md +5 -7
- data/Gemfile +5 -0
- data/doc/AST_FORMAT.md +26 -0
- data/lib/parser.rb +1 -0
- data/lib/parser/builders/default.rb +17 -3
- data/lib/parser/lexer.rl +9 -6
- data/lib/parser/lexer/literal.rb +24 -21
- data/lib/parser/source/map.rb +4 -0
- data/lib/parser/source/map/heredoc.rb +17 -0
- data/lib/parser/version.rb +1 -1
- data/test/test_lexer.rb +38 -38
- data/test/test_parser.rb +23 -0
- metadata +6 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6c8816d86f0b6658877e3cf52a953145a3cfb6a8
|
4
|
+
data.tar.gz: 2190740a21e07f44df7171d0f6128cf215db2d9e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 75057aa78a15de4a464146b0d979f6c039e9ca8407cb140b293168b23d1d87829da79762402683cf8909e696e6d9b85b216e09e004d9eff568cdec819797abcb
|
7
|
+
data.tar.gz: 4508a8d6b23ecb1bbe786c1c3bdea5621ab4ef45b83eff998f2a27726c7fb13d8c6a58d4bf0492742bc45e62e3f4c11a5c10baf8cc5f63d44c42246d0e2db0fc
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,18 +1,16 @@
|
|
1
1
|
Changelog
|
2
2
|
=========
|
3
3
|
|
4
|
-
v2.1.0
|
5
|
-
|
4
|
+
v2.1.0 (2013-12-25)
|
5
|
+
-------------------
|
6
6
|
|
7
7
|
API modifications:
|
8
8
|
* Parser::Diagnostic: expose reason symbolically (closes #115, #116). (Ian MacLeod)
|
9
|
-
|
10
|
-
vir (2013-11-13)
|
11
|
-
----------------
|
12
|
-
|
13
|
-
API modifications:
|
14
9
|
* lexer.rl: coerce literals to UTF-8 in ASCII-encoded files if they contain \uXXXX (Peter Zotov)
|
15
10
|
|
11
|
+
Bugs fixed:
|
12
|
+
* builders/default: represent heredocs with dedicated map (fixes #100). (Peter Zotov)
|
13
|
+
|
16
14
|
v2.1.0.pre1 (2013-11-12)
|
17
15
|
------------------------
|
18
16
|
|
data/Gemfile
CHANGED
data/doc/AST_FORMAT.md
CHANGED
@@ -76,6 +76,18 @@ Format:
|
|
76
76
|
~~~~~~~~~~~~~~ expression
|
77
77
|
~~~
|
78
78
|
|
79
|
+
#### Here document
|
80
|
+
|
81
|
+
Format:
|
82
|
+
|
83
|
+
~~~
|
84
|
+
(str "foo\nbar\n")
|
85
|
+
'<<HERE␊foo␊bar␊HERE'
|
86
|
+
~~~~~~ expression
|
87
|
+
~~~~~~~~ heredoc_body
|
88
|
+
~~~~ heredoc_end
|
89
|
+
~~~
|
90
|
+
|
79
91
|
### Symbol
|
80
92
|
|
81
93
|
#### Plain
|
@@ -106,6 +118,8 @@ Format:
|
|
106
118
|
|
107
119
|
### Execute-string
|
108
120
|
|
121
|
+
#### Plain
|
122
|
+
|
109
123
|
Format:
|
110
124
|
|
111
125
|
~~~
|
@@ -115,6 +129,18 @@ Format:
|
|
115
129
|
~~~~~~~~~~~ expression
|
116
130
|
~~~
|
117
131
|
|
132
|
+
#### Here document
|
133
|
+
|
134
|
+
Format:
|
135
|
+
|
136
|
+
~~~
|
137
|
+
(xstr (str "foo\nbar\n"))
|
138
|
+
"<<`HERE`␊foo␊bar␊HERE"
|
139
|
+
~~~~~~~~ expression
|
140
|
+
~~~~~~~~ heredoc_body
|
141
|
+
~~~~ heredoc_end
|
142
|
+
~~~
|
143
|
+
|
118
144
|
### Regexp
|
119
145
|
|
120
146
|
#### Options
|
data/lib/parser.rb
CHANGED
@@ -109,11 +109,11 @@ module Parser
|
|
109
109
|
parts.first
|
110
110
|
else
|
111
111
|
n(:str, parts.first.children,
|
112
|
-
|
112
|
+
string_map(begin_t, parts, end_t))
|
113
113
|
end
|
114
114
|
else
|
115
115
|
n(:dstr, [ *parts ],
|
116
|
-
|
116
|
+
string_map(begin_t, parts, end_t))
|
117
117
|
end
|
118
118
|
end
|
119
119
|
|
@@ -157,7 +157,7 @@ module Parser
|
|
157
157
|
|
158
158
|
def xstring_compose(begin_t, parts, end_t)
|
159
159
|
n(:xstr, [ *parts ],
|
160
|
-
|
160
|
+
string_map(begin_t, parts, end_t))
|
161
161
|
end
|
162
162
|
|
163
163
|
# Regular expressions
|
@@ -1092,6 +1092,20 @@ module Parser
|
|
1092
1092
|
Source::Map::Collection.new(loc(begin_t), loc(end_t), expr_l)
|
1093
1093
|
end
|
1094
1094
|
|
1095
|
+
def string_map(begin_t, parts, end_t)
|
1096
|
+
if begin_t && value(begin_t).start_with?('<<')
|
1097
|
+
if parts.any?
|
1098
|
+
expr_l = join_exprs(parts.first, parts.last)
|
1099
|
+
else
|
1100
|
+
expr_l = loc(end_t).begin
|
1101
|
+
end
|
1102
|
+
|
1103
|
+
Source::Map::Heredoc.new(loc(begin_t), expr_l, loc(end_t))
|
1104
|
+
else
|
1105
|
+
collection_map(begin_t, parts, end_t)
|
1106
|
+
end
|
1107
|
+
end
|
1108
|
+
|
1095
1109
|
def regexp_map(begin_t, end_t, options_e)
|
1096
1110
|
Source::Map::Collection.new(loc(begin_t), loc(end_t),
|
1097
1111
|
loc(begin_t).join(options_e.loc.expression))
|
data/lib/parser/lexer.rl
CHANGED
@@ -81,6 +81,12 @@ class Parser::Lexer
|
|
81
81
|
%% write data nofinal;
|
82
82
|
# %
|
83
83
|
|
84
|
+
ESCAPES = {
|
85
|
+
'a' => "\a", 'b' => "\b", 'e' => "\e", 'f' => "\f",
|
86
|
+
'n' => "\n", 'r' => "\r", 's' => "\s", 't' => "\t",
|
87
|
+
'v' => "\v", '\\' => "\\"
|
88
|
+
}
|
89
|
+
|
84
90
|
attr_reader :source_buffer
|
85
91
|
attr_reader :encoding
|
86
92
|
|
@@ -635,11 +641,8 @@ class Parser::Lexer
|
|
635
641
|
}
|
636
642
|
|
637
643
|
action unescape_char {
|
638
|
-
|
639
|
-
|
640
|
-
'n' => "\n", 'r' => "\r", 's' => "\s", 't' => "\t",
|
641
|
-
'v' => "\v", '\\' => "\\"
|
642
|
-
}.fetch(@source[p - 1].chr, @source[p - 1].chr)
|
644
|
+
char = @source[p - 1].chr
|
645
|
+
@escape = ESCAPES.fetch(char, char)
|
643
646
|
}
|
644
647
|
|
645
648
|
action invalid_complex_escape {
|
@@ -1591,7 +1594,7 @@ class Parser::Lexer
|
|
1591
1594
|
tok(@ts, @heredoc_e) =~ /^<<(-?)(["'`]?)(.*)\2$/
|
1592
1595
|
|
1593
1596
|
indent = !$1.empty?
|
1594
|
-
type = $2.empty? ? '"' : $2
|
1597
|
+
type = '<<' + ($2.empty? ? '"' : $2)
|
1595
1598
|
delimiter = $3
|
1596
1599
|
|
1597
1600
|
fnext *push_literal(type, delimiter, @ts, @heredoc_e, indent);
|
data/lib/parser/lexer/literal.rb
CHANGED
@@ -8,27 +8,30 @@ module Parser
|
|
8
8
|
|
9
9
|
TYPES = {
|
10
10
|
# type start token interpolate?
|
11
|
-
"'"
|
12
|
-
'
|
13
|
-
'
|
14
|
-
'
|
15
|
-
'
|
16
|
-
|
17
|
-
'%
|
18
|
-
|
19
|
-
|
20
|
-
'%
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
'
|
26
|
-
|
27
|
-
'
|
28
|
-
|
29
|
-
|
30
|
-
'%
|
31
|
-
|
11
|
+
"'" => [ :tSTRING_BEG, false ],
|
12
|
+
"<<'" => [ :tSTRING_BEG, false ],
|
13
|
+
'%q' => [ :tSTRING_BEG, false ],
|
14
|
+
'"' => [ :tSTRING_BEG, true ],
|
15
|
+
'<<"' => [ :tSTRING_BEG, true ],
|
16
|
+
'%' => [ :tSTRING_BEG, true ],
|
17
|
+
'%Q' => [ :tSTRING_BEG, true ],
|
18
|
+
|
19
|
+
'%w' => [ :tQWORDS_BEG, false ],
|
20
|
+
'%W' => [ :tWORDS_BEG, true ],
|
21
|
+
|
22
|
+
'%i' => [ :tQSYMBOLS_BEG, false ],
|
23
|
+
'%I' => [ :tSYMBOLS_BEG, true ],
|
24
|
+
|
25
|
+
":'" => [ :tSYMBEG, false ],
|
26
|
+
'%s' => [ :tSYMBEG, false ],
|
27
|
+
':"' => [ :tSYMBEG, true ],
|
28
|
+
|
29
|
+
'/' => [ :tREGEXP_BEG, true ],
|
30
|
+
'%r' => [ :tREGEXP_BEG, true ],
|
31
|
+
|
32
|
+
'%x' => [ :tXSTRING_BEG, true ],
|
33
|
+
'`' => [ :tXSTRING_BEG, true ],
|
34
|
+
'<<`' => [ :tXSTRING_BEG, true ],
|
32
35
|
}
|
33
36
|
|
34
37
|
attr_reader :heredoc_e, :str_s
|
data/lib/parser/source/map.rb
CHANGED
@@ -10,6 +10,10 @@ module Parser
|
|
10
10
|
# * other ranges (`begin`, `end`, `operator`, ...): node-specific ranges
|
11
11
|
# pointing to various interesting tokens corresponding to the node.
|
12
12
|
#
|
13
|
+
# Note that the {Map::Heredoc} map is the only one whose `expression` does
|
14
|
+
# not include other ranges. It only covers the heredoc marker (`<<HERE`),
|
15
|
+
# not the here document itself.
|
16
|
+
#
|
13
17
|
# All ranges except `expression` are defined by {Map} subclasses.
|
14
18
|
#
|
15
19
|
# Ranges (except `expression`) can be `nil` if the corresponding token is
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Parser
|
2
|
+
module Source
|
3
|
+
|
4
|
+
class Map::Heredoc < Map
|
5
|
+
attr_reader :heredoc_body
|
6
|
+
attr_reader :heredoc_end
|
7
|
+
|
8
|
+
def initialize(begin_l, body_l, end_l)
|
9
|
+
@heredoc_body = body_l
|
10
|
+
@heredoc_end = end_l
|
11
|
+
|
12
|
+
super(begin_l)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
data/lib/parser/version.rb
CHANGED
data/test/test_lexer.rb
CHANGED
@@ -745,8 +745,8 @@ class TestLexer < Minitest::Test
|
|
745
745
|
def test_heredoc_backtick
|
746
746
|
assert_scanned("a = <<`EOF`\n blah blah\nEOF\n",
|
747
747
|
:tIDENTIFIER, "a",
|
748
|
-
:tEQL,
|
749
|
-
:tXSTRING_BEG, "
|
748
|
+
:tEQL, "=",
|
749
|
+
:tXSTRING_BEG, "<<`",
|
750
750
|
:tSTRING_CONTENT, " blah blah\n",
|
751
751
|
:tSTRING_END, "EOF",
|
752
752
|
:tNL, nil)
|
@@ -755,8 +755,8 @@ class TestLexer < Minitest::Test
|
|
755
755
|
def test_heredoc_double
|
756
756
|
assert_scanned("a = <<\"EOF\"\n blah blah\nEOF\n",
|
757
757
|
:tIDENTIFIER, "a",
|
758
|
-
:tEQL,
|
759
|
-
:tSTRING_BEG, "
|
758
|
+
:tEQL, "=",
|
759
|
+
:tSTRING_BEG, "<<\"",
|
760
760
|
:tSTRING_CONTENT, " blah blah\n",
|
761
761
|
:tSTRING_END, "EOF",
|
762
762
|
:tNL, nil)
|
@@ -765,8 +765,8 @@ class TestLexer < Minitest::Test
|
|
765
765
|
def test_heredoc_double_dash
|
766
766
|
assert_scanned("a = <<-\"EOF\"\n blah blah\n EOF\n",
|
767
767
|
:tIDENTIFIER, "a",
|
768
|
-
:tEQL,
|
769
|
-
:tSTRING_BEG, "
|
768
|
+
:tEQL, "=",
|
769
|
+
:tSTRING_BEG, "<<\"",
|
770
770
|
:tSTRING_CONTENT, " blah blah\n",
|
771
771
|
:tSTRING_END, "EOF",
|
772
772
|
:tNL, nil)
|
@@ -775,22 +775,22 @@ class TestLexer < Minitest::Test
|
|
775
775
|
def test_heredoc_double_eos
|
776
776
|
refute_scanned("a = <<\"EOF\"\nblah",
|
777
777
|
:tIDENTIFIER, "a",
|
778
|
-
:tEQL,
|
779
|
-
:tSTRING_BEG, "
|
778
|
+
:tEQL, "=",
|
779
|
+
:tSTRING_BEG, "<<\"")
|
780
780
|
end
|
781
781
|
|
782
782
|
def test_heredoc_double_eos_nl
|
783
783
|
refute_scanned("a = <<\"EOF\"\nblah\n",
|
784
784
|
:tIDENTIFIER, "a",
|
785
|
-
:tEQL,
|
786
|
-
:tSTRING_BEG, "
|
785
|
+
:tEQL, "=",
|
786
|
+
:tSTRING_BEG, "<<\"")
|
787
787
|
end
|
788
788
|
|
789
789
|
def test_heredoc_double_interp
|
790
790
|
assert_scanned("a = <<\"EOF\"\n#x a \#@a b \#$b c \#{3} \nEOF\n",
|
791
791
|
:tIDENTIFIER, "a",
|
792
|
-
:tEQL,
|
793
|
-
:tSTRING_BEG, "
|
792
|
+
:tEQL, "=",
|
793
|
+
:tSTRING_BEG, "<<\"",
|
794
794
|
:tSTRING_CONTENT, "#x a ",
|
795
795
|
:tSTRING_DVAR, nil,
|
796
796
|
:tIVAR, "@a",
|
@@ -808,7 +808,7 @@ class TestLexer < Minitest::Test
|
|
808
808
|
|
809
809
|
def test_heredoc_empty
|
810
810
|
assert_scanned("<<\"\"\n\#{x}\nblah2\n\n",
|
811
|
-
:tSTRING_BEG, "
|
811
|
+
:tSTRING_BEG, "<<\"",
|
812
812
|
:tSTRING_DBEG, "\#{",
|
813
813
|
:tIDENTIFIER, "x",
|
814
814
|
:tRCURLY, "}",
|
@@ -821,8 +821,8 @@ class TestLexer < Minitest::Test
|
|
821
821
|
def test_heredoc_none
|
822
822
|
assert_scanned("a = <<EOF\nblah\nblah\nEOF",
|
823
823
|
:tIDENTIFIER, "a",
|
824
|
-
:tEQL,
|
825
|
-
:tSTRING_BEG, "
|
824
|
+
:tEQL, "=",
|
825
|
+
:tSTRING_BEG, "<<\"",
|
826
826
|
:tSTRING_CONTENT, "blah\n",
|
827
827
|
:tSTRING_CONTENT, "blah\n",
|
828
828
|
:tSTRING_END, "EOF",
|
@@ -832,8 +832,8 @@ class TestLexer < Minitest::Test
|
|
832
832
|
def test_heredoc_none_dash
|
833
833
|
assert_scanned("a = <<-EOF\nblah\nblah\n EOF",
|
834
834
|
:tIDENTIFIER, "a",
|
835
|
-
:tEQL,
|
836
|
-
:tSTRING_BEG, "
|
835
|
+
:tEQL, "=",
|
836
|
+
:tSTRING_BEG, "<<\"",
|
837
837
|
:tSTRING_CONTENT, "blah\n",
|
838
838
|
:tSTRING_CONTENT, "blah\n",
|
839
839
|
:tSTRING_END, "EOF",
|
@@ -843,8 +843,8 @@ class TestLexer < Minitest::Test
|
|
843
843
|
def test_heredoc_single
|
844
844
|
assert_scanned("a = <<'EOF'\n blah blah\nEOF\n",
|
845
845
|
:tIDENTIFIER, "a",
|
846
|
-
:tEQL,
|
847
|
-
:tSTRING_BEG, "'",
|
846
|
+
:tEQL, "=",
|
847
|
+
:tSTRING_BEG, "<<'",
|
848
848
|
:tSTRING_CONTENT, " blah blah\n",
|
849
849
|
:tSTRING_END, "EOF",
|
850
850
|
:tNL, nil)
|
@@ -860,8 +860,8 @@ class TestLexer < Minitest::Test
|
|
860
860
|
def test_heredoc_single_dash
|
861
861
|
assert_scanned("a = <<-'EOF'\n blah blah\n EOF\n",
|
862
862
|
:tIDENTIFIER, "a",
|
863
|
-
:tEQL,
|
864
|
-
:tSTRING_BEG, "'",
|
863
|
+
:tEQL, "=",
|
864
|
+
:tSTRING_BEG, "<<'",
|
865
865
|
:tSTRING_CONTENT, " blah blah\n",
|
866
866
|
:tSTRING_END, "EOF",
|
867
867
|
:tNL, nil)
|
@@ -870,8 +870,8 @@ class TestLexer < Minitest::Test
|
|
870
870
|
def test_heredoc_one_character
|
871
871
|
assert_scanned("a = <<E\nABCDEF\nE\n",
|
872
872
|
:tIDENTIFIER, "a",
|
873
|
-
:tEQL,
|
874
|
-
:tSTRING_BEG, "
|
873
|
+
:tEQL, "=",
|
874
|
+
:tSTRING_BEG, "<<\"",
|
875
875
|
:tSTRING_CONTENT, "ABCDEF\n",
|
876
876
|
:tSTRING_END, "E",
|
877
877
|
:tNL, nil)
|
@@ -880,8 +880,8 @@ class TestLexer < Minitest::Test
|
|
880
880
|
def test_heredoc_cr
|
881
881
|
assert_scanned("a = <<E\r\r\nABCDEF\r\r\nE\r\r\r\n",
|
882
882
|
:tIDENTIFIER, "a",
|
883
|
-
:tEQL,
|
884
|
-
:tSTRING_BEG, "
|
883
|
+
:tEQL, "=",
|
884
|
+
:tSTRING_BEG, "<<\"",
|
885
885
|
:tSTRING_CONTENT, "ABCDEF\r\n",
|
886
886
|
:tSTRING_END, "E",
|
887
887
|
:tNL, nil)
|
@@ -2495,14 +2495,14 @@ class TestLexer < Minitest::Test
|
|
2495
2495
|
def test_whitespace_cr
|
2496
2496
|
setup_lexer(20)
|
2497
2497
|
assert_scanned("<<E\nfoo\nE\rO",
|
2498
|
-
:tSTRING_BEG, '"',
|
2498
|
+
:tSTRING_BEG, '<<"',
|
2499
2499
|
:tSTRING_CONTENT, "foo\n",
|
2500
2500
|
:tSTRING_END, 'E',
|
2501
2501
|
:tNL, nil)
|
2502
2502
|
|
2503
2503
|
setup_lexer(21)
|
2504
2504
|
refute_scanned("<<E\nfoo\nE\rO",
|
2505
|
-
:tSTRING_BEG, '"',
|
2505
|
+
:tSTRING_BEG, '<<"',
|
2506
2506
|
:tSTRING_CONTENT, "foo\n")
|
2507
2507
|
end
|
2508
2508
|
|
@@ -2581,7 +2581,7 @@ class TestLexer < Minitest::Test
|
|
2581
2581
|
|
2582
2582
|
def test_bug_expr_beg_heredoc
|
2583
2583
|
assert_scanned("<<EOL % [\nfoo\nEOL\n]",
|
2584
|
-
:tSTRING_BEG, '"',
|
2584
|
+
:tSTRING_BEG, '<<"',
|
2585
2585
|
:tSTRING_CONTENT, "foo\n",
|
2586
2586
|
:tSTRING_END, 'EOL',
|
2587
2587
|
:tPERCENT, '%',
|
@@ -2638,9 +2638,9 @@ class TestLexer < Minitest::Test
|
|
2638
2638
|
|
2639
2639
|
@lex.state = :expr_arg
|
2640
2640
|
assert_scanned(" <<EOS\nEOS",
|
2641
|
-
:tSTRING_BEG,
|
2642
|
-
:tSTRING_END,
|
2643
|
-
:tNL,
|
2641
|
+
:tSTRING_BEG, "<<\"",
|
2642
|
+
:tSTRING_END, "EOS",
|
2643
|
+
:tNL, nil)
|
2644
2644
|
end
|
2645
2645
|
|
2646
2646
|
def test_bug_expr_arg_slash
|
@@ -2682,7 +2682,7 @@ class TestLexer < Minitest::Test
|
|
2682
2682
|
def test_bug_heredoc_continuation
|
2683
2683
|
@lex.state = :expr_arg
|
2684
2684
|
assert_scanned(" <<EOS\nEOS\nend",
|
2685
|
-
:tSTRING_BEG, "
|
2685
|
+
:tSTRING_BEG, "<<\"",
|
2686
2686
|
:tSTRING_END, "EOS",
|
2687
2687
|
:tNL, nil,
|
2688
2688
|
:kEND, "end")
|
@@ -2690,7 +2690,7 @@ class TestLexer < Minitest::Test
|
|
2690
2690
|
|
2691
2691
|
def test_bug_heredoc_cr_lf
|
2692
2692
|
assert_scanned("<<FIN\r\nfoo\r\nFIN\r\n",
|
2693
|
-
:tSTRING_BEG, "
|
2693
|
+
:tSTRING_BEG, "<<\"",
|
2694
2694
|
:tSTRING_CONTENT, "foo\n",
|
2695
2695
|
:tSTRING_END, "FIN",
|
2696
2696
|
:tNL, nil)
|
@@ -2735,7 +2735,7 @@ class TestLexer < Minitest::Test
|
|
2735
2735
|
|
2736
2736
|
def test_bug_heredoc_backspace_nl
|
2737
2737
|
assert_scanned(" <<'XXX'\nf \\\nXXX\n",
|
2738
|
-
:tSTRING_BEG, "'",
|
2738
|
+
:tSTRING_BEG, "<<'",
|
2739
2739
|
:tSTRING_CONTENT, "f \\\n",
|
2740
2740
|
:tSTRING_END, "XXX",
|
2741
2741
|
:tNL, nil)
|
@@ -2743,7 +2743,7 @@ class TestLexer < Minitest::Test
|
|
2743
2743
|
|
2744
2744
|
def test_bug_heredoc_lshft
|
2745
2745
|
assert_scanned("<<RULES << CLEANINGS\nRULES",
|
2746
|
-
:tSTRING_BEG, '"',
|
2746
|
+
:tSTRING_BEG, '<<"',
|
2747
2747
|
:tSTRING_END, 'RULES',
|
2748
2748
|
:tLSHFT, '<<',
|
2749
2749
|
:tCONSTANT, 'CLEANINGS')
|
@@ -2871,7 +2871,7 @@ class TestLexer < Minitest::Test
|
|
2871
2871
|
|
2872
2872
|
def test_bug_interleaved_heredoc
|
2873
2873
|
assert_scanned(%Q{<<w; "\nfoo\nw\n"},
|
2874
|
-
:tSTRING_BEG, '"',
|
2874
|
+
:tSTRING_BEG, '<<"',
|
2875
2875
|
:tSTRING_CONTENT, "foo\n",
|
2876
2876
|
:tSTRING_END, 'w',
|
2877
2877
|
:tSEMI, ';',
|
@@ -2881,7 +2881,7 @@ class TestLexer < Minitest::Test
|
|
2881
2881
|
|
2882
2882
|
@lex.state = :expr_beg
|
2883
2883
|
assert_scanned(%Q{<<w; %w[\nfoo\nw\n1]},
|
2884
|
-
:tSTRING_BEG, '"',
|
2884
|
+
:tSTRING_BEG, '<<"',
|
2885
2885
|
:tSTRING_CONTENT, "foo\n",
|
2886
2886
|
:tSTRING_END, 'w',
|
2887
2887
|
:tSEMI, ';',
|
@@ -2892,7 +2892,7 @@ class TestLexer < Minitest::Test
|
|
2892
2892
|
|
2893
2893
|
@lex.state = :expr_beg
|
2894
2894
|
assert_scanned(%Q{<<w; "\#{\nfoo\nw\n}"},
|
2895
|
-
:tSTRING_BEG, '"',
|
2895
|
+
:tSTRING_BEG, '<<"',
|
2896
2896
|
:tSTRING_CONTENT, "foo\n",
|
2897
2897
|
:tSTRING_END, 'w',
|
2898
2898
|
:tSEMI, ';',
|
data/test/test_parser.rb
CHANGED
@@ -237,6 +237,29 @@ class TestParser < Minitest::Test
|
|
237
237
|
%w(1.8))
|
238
238
|
end
|
239
239
|
|
240
|
+
def test_heredoc
|
241
|
+
assert_parses(
|
242
|
+
s(:dstr, s(:str, "foo\n"), s(:str, "bar\n")),
|
243
|
+
%Q{<<HERE!foo!bar!HERE}.gsub('!', "\n"),
|
244
|
+
%q{~~~~~~ expression
|
245
|
+
| ~~~~~~~~ heredoc_body
|
246
|
+
| ~~~~ heredoc_end})
|
247
|
+
|
248
|
+
assert_parses(
|
249
|
+
s(:dstr, s(:str, "foo\n"), s(:str, "bar\n")),
|
250
|
+
%Q{<<'HERE'!foo!bar!HERE}.gsub('!', "\n"),
|
251
|
+
%q{~~~~~~~~ expression
|
252
|
+
| ~~~~~~~~ heredoc_body
|
253
|
+
| ~~~~ heredoc_end})
|
254
|
+
|
255
|
+
assert_parses(
|
256
|
+
s(:xstr, s(:str, "foo\n"), s(:str, "bar\n")),
|
257
|
+
%Q{<<`HERE`!foo!bar!HERE}.gsub('!', "\n"),
|
258
|
+
%q{~~~~~~~~ expression
|
259
|
+
| ~~~~~~~~ heredoc_body
|
260
|
+
| ~~~~ heredoc_end})
|
261
|
+
end
|
262
|
+
|
240
263
|
# Symbols
|
241
264
|
|
242
265
|
def test_symbol_plain
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.0
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Zotov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-12-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ast
|
@@ -286,6 +286,7 @@ files:
|
|
286
286
|
- lib/parser/source/map/constant.rb
|
287
287
|
- lib/parser/source/map/definition.rb
|
288
288
|
- lib/parser/source/map/for.rb
|
289
|
+
- lib/parser/source/map/heredoc.rb
|
289
290
|
- lib/parser/source/map/keyword.rb
|
290
291
|
- lib/parser/source/map/operator.rb
|
291
292
|
- lib/parser/source/map/rescue_body.rb
|
@@ -337,12 +338,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
337
338
|
version: '0'
|
338
339
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
339
340
|
requirements:
|
340
|
-
- - '
|
341
|
+
- - '>='
|
341
342
|
- !ruby/object:Gem::Version
|
342
|
-
version:
|
343
|
+
version: '0'
|
343
344
|
requirements: []
|
344
345
|
rubyforge_project:
|
345
|
-
rubygems_version: 2.0.
|
346
|
+
rubygems_version: 2.0.14
|
346
347
|
signing_key:
|
347
348
|
specification_version: 4
|
348
349
|
summary: A Ruby parser written in pure Ruby.
|