parser 2.3.0.pre.5 → 2.3.0.pre.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +15 -0
- data/lib/parser/current.rb +4 -4
- data/lib/parser/lexer.rl +10 -3
- data/lib/parser/lexer/literal.rb +6 -4
- data/lib/parser/ruby22.y +2 -17
- data/lib/parser/ruby23.y +2 -17
- data/lib/parser/runner/ruby_parse.rb +10 -1
- data/lib/parser/version.rb +1 -1
- data/parser.gemspec +1 -1
- data/test/test_lexer.rb +11 -0
- data/test/test_parser.rb +43 -0
- metadata +6 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 76b617323cf8143b8935312b8ce39e4c2d847b63
|
4
|
+
data.tar.gz: 13f93cde47689ad2352602d2aac0555b674f860d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ddac7c4fdf0503ff15acbb45eedb8bdd9713ed38ceefd5f306044b68e8ce6c016919a689e543ad7b9648c0dcfee43870164194ed8f02fcfd90b9e383219ad9bf
|
7
|
+
data.tar.gz: 7831e67d2cb5ad9e65e1230a86c5117804e17e088e78f01c28632917c1cf0b3cce3abfb46ab889007acf7232f315989467d756a3a89d4b335d71022b53899c2a
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,21 @@
|
|
1
1
|
Changelog
|
2
2
|
=========
|
3
3
|
|
4
|
+
v2.3.0.pre.6 (2015-12-20)
|
5
|
+
-------------------------
|
6
|
+
|
7
|
+
API modifications:
|
8
|
+
* parser/current: update 2.2 warning to 2.2.4. (whitequark)
|
9
|
+
* ruby{22,23}.y: "1 ? p do end : 0". (whitequark)
|
10
|
+
* lexer.rl: "{%'a':1}": %-string cannot be a label. (whitequark)
|
11
|
+
* parser/current: update 2.1 warning to 2.1.8. (whitequark)
|
12
|
+
|
13
|
+
Features implemented:
|
14
|
+
* ruby-parse: add --emit-ruby option. (whitequark)
|
15
|
+
|
16
|
+
Bugs fixed:
|
17
|
+
* lexer.rl: "f(a ? 'a':1)": disallow quoted label at expr_value. (whitequark)
|
18
|
+
|
4
19
|
v2.3.0.pre.5 (2015-12-16)
|
5
20
|
-------------------------
|
6
21
|
|
data/lib/parser/current.rb
CHANGED
@@ -34,16 +34,16 @@ module Parser
|
|
34
34
|
CurrentRuby = Ruby20
|
35
35
|
|
36
36
|
when /^2\.1\./
|
37
|
-
if RUBY_VERSION != '2.1.
|
38
|
-
warn_syntax_deviation 'parser/ruby21', '2.1.
|
37
|
+
if RUBY_VERSION != '2.1.8'
|
38
|
+
warn_syntax_deviation 'parser/ruby21', '2.1.8'
|
39
39
|
end
|
40
40
|
|
41
41
|
require 'parser/ruby21'
|
42
42
|
CurrentRuby = Ruby21
|
43
43
|
|
44
44
|
when /^2\.2\./
|
45
|
-
if RUBY_VERSION != '2.2.
|
46
|
-
warn_syntax_deviation 'parser/ruby22', '2.2.
|
45
|
+
if RUBY_VERSION != '2.2.4'
|
46
|
+
warn_syntax_deviation 'parser/ruby22', '2.2.4'
|
47
47
|
end
|
48
48
|
|
49
49
|
require 'parser/ruby22'
|
data/lib/parser/lexer.rl
CHANGED
@@ -854,7 +854,8 @@ class Parser::Lexer
|
|
854
854
|
end
|
855
855
|
|
856
856
|
current_literal = literal
|
857
|
-
if !current_literal.heredoc? &&
|
857
|
+
if !current_literal.heredoc? &&
|
858
|
+
(token = current_literal.nest_and_try_closing(string, @ts, @te, lookahead))
|
858
859
|
if token[0] == :tLABEL_END
|
859
860
|
p += 1
|
860
861
|
pop_literal
|
@@ -1886,7 +1887,7 @@ class Parser::Lexer
|
|
1886
1887
|
c_eof => do_eof;
|
1887
1888
|
*|;
|
1888
1889
|
|
1889
|
-
# Like expr_beg, but no 1.9 label possible.
|
1890
|
+
# Like expr_beg, but no 1.9 label or 2.2 quoted label possible.
|
1890
1891
|
#
|
1891
1892
|
expr_value := |*
|
1892
1893
|
# a:b: a(:b), a::B, A::B
|
@@ -1894,6 +1895,12 @@ class Parser::Lexer
|
|
1894
1895
|
=> { p = @ts - 1
|
1895
1896
|
fgoto expr_end; };
|
1896
1897
|
|
1898
|
+
# "bar", 'baz'
|
1899
|
+
['"] # '
|
1900
|
+
=> {
|
1901
|
+
fgoto *push_literal(tok, tok, @ts, nil, false, false);
|
1902
|
+
};
|
1903
|
+
|
1897
1904
|
w_space_comment;
|
1898
1905
|
|
1899
1906
|
w_newline
|
@@ -2087,7 +2094,7 @@ class Parser::Lexer
|
|
2087
2094
|
'`' | ['"] # '
|
2088
2095
|
=> {
|
2089
2096
|
type, delimiter = tok, tok[-1].chr
|
2090
|
-
fgoto *push_literal(type, delimiter, @ts);
|
2097
|
+
fgoto *push_literal(type, delimiter, @ts, nil, false, true);
|
2091
2098
|
};
|
2092
2099
|
|
2093
2100
|
#
|
data/lib/parser/lexer/literal.rb
CHANGED
@@ -37,7 +37,8 @@ module Parser
|
|
37
37
|
attr_reader :heredoc_e, :str_s
|
38
38
|
attr_accessor :saved_herebody_s
|
39
39
|
|
40
|
-
def initialize(lexer, str_type, delimiter, str_s, heredoc_e = nil,
|
40
|
+
def initialize(lexer, str_type, delimiter, str_s, heredoc_e = nil,
|
41
|
+
indent = false, label_allowed = false)
|
41
42
|
@lexer = lexer
|
42
43
|
@nesting = 1
|
43
44
|
|
@@ -60,8 +61,9 @@ module Parser
|
|
60
61
|
@start_delim = DELIMITERS.include?(delimiter) ? delimiter : nil
|
61
62
|
@end_delim = DELIMITERS.fetch(delimiter, delimiter)
|
62
63
|
|
63
|
-
@heredoc_e
|
64
|
-
@indent
|
64
|
+
@heredoc_e = heredoc_e
|
65
|
+
@indent = indent
|
66
|
+
@label_allowed = label_allowed
|
65
67
|
|
66
68
|
@interp_braces = 0
|
67
69
|
|
@@ -130,7 +132,7 @@ module Parser
|
|
130
132
|
end
|
131
133
|
|
132
134
|
if lookahead && lookahead[0] == ?: && lookahead[1] != ?: &&
|
133
|
-
|
135
|
+
@label_allowed && @start_tok == :tSTRING_BEG
|
134
136
|
# This is a quoted label.
|
135
137
|
flush_string
|
136
138
|
emit(:tLABEL_END, @end_delim, ts, te + 1)
|
data/lib/parser/ruby22.y
CHANGED
@@ -784,25 +784,10 @@ rule
|
|
784
784
|
{
|
785
785
|
result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[2] ], nil)
|
786
786
|
}
|
787
|
-
|
788
|
-
# Note: MRI eventually came to rely on disambiguation based on
|
789
|
-
# the lexer state, but it is too contrived with the Ragel lexer,
|
790
|
-
# so we kept this approach. See ruby/ruby@b0c03f63e5 for
|
791
|
-
# the initial commit, and ruby/ruby@23352f62a for MRI revert,
|
792
|
-
# which we decided not to track.
|
793
|
-
| arg tEH
|
794
|
-
{
|
795
|
-
@lexer.push_cond
|
796
|
-
@lexer.cond.push(true)
|
797
|
-
}
|
798
|
-
arg opt_nl tCOLON
|
799
|
-
{
|
800
|
-
@lexer.pop_cond
|
801
|
-
}
|
802
|
-
arg
|
787
|
+
| arg tEH arg opt_nl tCOLON arg
|
803
788
|
{
|
804
789
|
result = @builder.ternary(val[0], val[1],
|
805
|
-
val[
|
790
|
+
val[2], val[4], val[5])
|
806
791
|
}
|
807
792
|
| primary
|
808
793
|
|
data/lib/parser/ruby23.y
CHANGED
@@ -784,25 +784,10 @@ rule
|
|
784
784
|
{
|
785
785
|
result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[2] ], nil)
|
786
786
|
}
|
787
|
-
|
788
|
-
# Note: MRI eventually came to rely on disambiguation based on
|
789
|
-
# the lexer state, but it is too contrived with the Ragel lexer,
|
790
|
-
# so we kept this approach. See ruby/ruby@b0c03f63e5 for
|
791
|
-
# the initial commit, and ruby/ruby@23352f62a for MRI revert,
|
792
|
-
# which we decided not to track.
|
793
|
-
| arg tEH
|
794
|
-
{
|
795
|
-
@lexer.push_cond
|
796
|
-
@lexer.cond.push(true)
|
797
|
-
}
|
798
|
-
arg opt_nl tCOLON
|
799
|
-
{
|
800
|
-
@lexer.pop_cond
|
801
|
-
}
|
802
|
-
arg
|
787
|
+
| arg tEH arg opt_nl tCOLON arg
|
803
788
|
{
|
804
789
|
result = @builder.ternary(val[0], val[1],
|
805
|
-
val[
|
790
|
+
val[2], val[4], val[5])
|
806
791
|
}
|
807
792
|
| primary
|
808
793
|
|
@@ -93,6 +93,7 @@ module Parser
|
|
93
93
|
super
|
94
94
|
|
95
95
|
@locate = false
|
96
|
+
@emit_ruby = false
|
96
97
|
end
|
97
98
|
|
98
99
|
private
|
@@ -113,6 +114,10 @@ module Parser
|
|
113
114
|
|
114
115
|
Lexer.send :include, Lexer::Explanation
|
115
116
|
end
|
117
|
+
|
118
|
+
opts.on '--emit-ruby', 'Emit S-expressions as valid Ruby code' do
|
119
|
+
@emit_ruby = true
|
120
|
+
end
|
116
121
|
end
|
117
122
|
|
118
123
|
def process_all_input
|
@@ -129,7 +134,11 @@ module Parser
|
|
129
134
|
if @locate
|
130
135
|
LocationProcessor.new.process(ast)
|
131
136
|
elsif !@benchmark
|
132
|
-
|
137
|
+
if @emit_ruby
|
138
|
+
puts ast.inspect
|
139
|
+
else
|
140
|
+
puts ast.to_s
|
141
|
+
end
|
133
142
|
end
|
134
143
|
end
|
135
144
|
end
|
data/lib/parser/version.rb
CHANGED
data/parser.gemspec
CHANGED
@@ -28,7 +28,7 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.test_files = spec.files.grep(%r{^test/})
|
29
29
|
spec.require_paths = ['lib']
|
30
30
|
|
31
|
-
spec.add_dependency 'ast',
|
31
|
+
spec.add_dependency 'ast', '~> 2.2'
|
32
32
|
|
33
33
|
spec.add_development_dependency 'bundler', '~> 1.2'
|
34
34
|
spec.add_development_dependency 'rake', '~> 10.0'
|
data/test/test_lexer.rb
CHANGED
@@ -308,6 +308,17 @@ class TestLexer < Minitest::Test
|
|
308
308
|
:tCOLON2, '::')
|
309
309
|
end
|
310
310
|
|
311
|
+
def test_pct_string_colon__22
|
312
|
+
setup_lexer 22
|
313
|
+
|
314
|
+
assert_scanned("{%'a':",
|
315
|
+
:tLBRACE, '{',
|
316
|
+
:tSTRING_BEG, "%'",
|
317
|
+
:tSTRING_CONTENT, 'a',
|
318
|
+
:tSTRING_END, "'",
|
319
|
+
:tCOLON, ':')
|
320
|
+
end
|
321
|
+
|
311
322
|
def test_command_start__19
|
312
323
|
setup_lexer 19
|
313
324
|
|
data/test/test_parser.rb
CHANGED
@@ -5052,6 +5052,49 @@ class TestParser < Minitest::Test
|
|
5052
5052
|
ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
|
5053
5053
|
end
|
5054
5054
|
|
5055
|
+
def test_ruby_bug_10653
|
5056
|
+
assert_parses(
|
5057
|
+
s(:if,
|
5058
|
+
s(:true),
|
5059
|
+
s(:block,
|
5060
|
+
s(:send,
|
5061
|
+
s(:int, 1), :tap),
|
5062
|
+
s(:args,
|
5063
|
+
s(:arg, :n)),
|
5064
|
+
s(:send, nil, :p,
|
5065
|
+
s(:lvar, :n))),
|
5066
|
+
s(:int, 0)),
|
5067
|
+
%q{true ? 1.tap do |n| p n end : 0},
|
5068
|
+
%q{},
|
5069
|
+
ALL_VERSIONS)
|
5070
|
+
|
5071
|
+
assert_parses(
|
5072
|
+
s(:if,
|
5073
|
+
s(:false),
|
5074
|
+
s(:block,
|
5075
|
+
s(:send, nil, :raise),
|
5076
|
+
s(:args), nil),
|
5077
|
+
s(:block,
|
5078
|
+
s(:send, nil, :tap),
|
5079
|
+
s(:args), nil)),
|
5080
|
+
%q{false ? raise {} : tap {}},
|
5081
|
+
%q{},
|
5082
|
+
ALL_VERSIONS)
|
5083
|
+
|
5084
|
+
assert_parses(
|
5085
|
+
s(:if,
|
5086
|
+
s(:false),
|
5087
|
+
s(:block,
|
5088
|
+
s(:send, nil, :raise),
|
5089
|
+
s(:args), nil),
|
5090
|
+
s(:block,
|
5091
|
+
s(:send, nil, :tap),
|
5092
|
+
s(:args), nil)),
|
5093
|
+
%q{false ? raise do end : tap do end},
|
5094
|
+
%q{},
|
5095
|
+
ALL_VERSIONS)
|
5096
|
+
end
|
5097
|
+
|
5055
5098
|
def test_ruby_bug_11107
|
5056
5099
|
assert_parses(
|
5057
5100
|
s(:send, nil, :p,
|
metadata
CHANGED
@@ -1,35 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.3.0.pre.
|
4
|
+
version: 2.3.0.pre.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- whitequark
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-12-
|
11
|
+
date: 2015-12-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ast
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '1.1'
|
20
|
-
- - "<"
|
17
|
+
- - "~>"
|
21
18
|
- !ruby/object:Gem::Version
|
22
|
-
version: '
|
19
|
+
version: '2.2'
|
23
20
|
type: :runtime
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
|
-
- - "
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '1.1'
|
30
|
-
- - "<"
|
24
|
+
- - "~>"
|
31
25
|
- !ruby/object:Gem::Version
|
32
|
-
version: '
|
26
|
+
version: '2.2'
|
33
27
|
- !ruby/object:Gem::Dependency
|
34
28
|
name: bundler
|
35
29
|
requirement: !ruby/object:Gem::Requirement
|