Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit f5f8b6a

Browse files
committed
Even more parser gem locations
1 parent 4dac90b commit f5f8b6a

File tree

1 file changed

+67
-62
lines changed

1 file changed

+67
-62
lines changed

lib/syntax_tree/translation/parser.rb

Lines changed: 67 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1287,35 +1287,13 @@ def visit_ident(node)
12871287

12881288
# Visit an IfNode node.
12891289
def visit_if(node)
1290-
predicate =
1291-
case node.predicate
1292-
when RangeNode
1293-
type =
1294-
node.predicate.operator.value == ".." ? :iflipflop : :eflipflop
1295-
s(type, visit(node.predicate).children, nil)
1296-
when RegexpLiteral
1297-
s(:match_current_line, [visit(node.predicate)], nil)
1298-
when Unary
1299-
if node.predicate.operator.value == "!" &&
1300-
node.predicate.statement.is_a?(RegexpLiteral)
1301-
s(
1302-
:send,
1303-
[
1304-
s(:match_current_line, [visit(node.predicate.statement)]),
1305-
:!
1306-
],
1307-
nil
1308-
)
1309-
else
1310-
visit(node.predicate)
1311-
end
1312-
else
1313-
visit(node.predicate)
1314-
end
1315-
13161290
s(
13171291
:if,
1318-
[predicate, visit(node.statements), visit(node.consequent)],
1292+
[
1293+
visit_predicate(node.predicate),
1294+
visit(node.statements),
1295+
visit(node.consequent)
1296+
],
13191297
if node.modifier?
13201298
smap_keyword_bare(
13211299
srange_find_between(node.statements, node.predicate, "if"),
@@ -2376,22 +2354,42 @@ def visit_tstring_content(node)
23762354
# Visit a Unary node.
23772355
def visit_unary(node)
23782356
# Special handling here for flipflops
2379-
if node.statement.is_a?(Paren) &&
2380-
node.statement.contents.is_a?(Statements) &&
2381-
node.statement.contents.body.length == 1 &&
2382-
(range = node.statement.contents.body.first).is_a?(RangeNode) &&
2357+
if (paren = node.statement).is_a?(Paren) &&
2358+
paren.contents.is_a?(Statements) &&
2359+
paren.contents.body.length == 1 &&
2360+
(range = paren.contents.body.first).is_a?(RangeNode) &&
23832361
node.operator == "!"
2384-
type = range.operator.value == ".." ? :iflipflop : :eflipflop
2385-
return(
2386-
s(
2387-
:send,
2388-
[s(:begin, [s(type, visit(range).children, nil)], nil), :!],
2389-
nil
2362+
s(
2363+
:send,
2364+
[
2365+
s(
2366+
:begin,
2367+
[
2368+
s(
2369+
range.operator.value == ".." ? :iflipflop : :eflipflop,
2370+
visit(range).children,
2371+
smap_operator(
2372+
srange_node(range.operator),
2373+
srange_node(range)
2374+
)
2375+
)
2376+
],
2377+
smap_collection(
2378+
srange_length(paren.start_char, 1),
2379+
srange_length(paren.end_char, -1),
2380+
srange_node(paren)
2381+
)
2382+
),
2383+
:!
2384+
],
2385+
smap_send_bare(
2386+
srange_length(node.start_char, 1),
2387+
srange_node(node)
23902388
)
23912389
)
2390+
else
2391+
visit(canonical_unary(node))
23922392
end
2393-
2394-
visit(canonical_unary(node))
23952393
end
23962394

23972395
# Visit an Undef node.
@@ -2408,31 +2406,13 @@ def visit_undef(node)
24082406

24092407
# Visit an UnlessNode node.
24102408
def visit_unless(node)
2411-
predicate =
2412-
case node.predicate
2413-
when RegexpLiteral
2414-
s(:match_current_line, [visit(node.predicate)], nil)
2415-
when Unary
2416-
if node.predicate.operator.value == "!" &&
2417-
node.predicate.statement.is_a?(RegexpLiteral)
2418-
s(
2419-
:send,
2420-
[
2421-
s(:match_current_line, [visit(node.predicate.statement)]),
2422-
:!
2423-
],
2424-
nil
2425-
)
2426-
else
2427-
visit(node.predicate)
2428-
end
2429-
else
2430-
visit(node.predicate)
2431-
end
2432-
24332409
s(
24342410
:if,
2435-
[predicate, visit(node.consequent), visit(node.statements)],
2411+
[
2412+
visit_predicate(node.predicate),
2413+
visit(node.consequent),
2414+
visit(node.statements)
2415+
],
24362416
if node.modifier?
24372417
smap_keyword_bare(
24382418
srange_find_between(node.statements, node.predicate, "unless"),
@@ -3014,6 +2994,31 @@ def srange_node(node)
30142994
location = node.location
30152995
srange(location.start_char, location.end_char)
30162996
end
2997+
2998+
def visit_predicate(node)
2999+
case node
3000+
when RangeNode
3001+
s(
3002+
node.operator.value == ".." ? :iflipflop : :eflipflop,
3003+
visit(node).children,
3004+
smap_operator(srange_node(node.operator), srange_node(node))
3005+
)
3006+
when RegexpLiteral
3007+
s(:match_current_line, [visit(node)], smap(srange_node(node)))
3008+
when Unary
3009+
if node.operator.value == "!" && node.statement.is_a?(RegexpLiteral)
3010+
s(
3011+
:send,
3012+
[s(:match_current_line, [visit(node.statement)]), :!],
3013+
smap_send_bare(srange_node(node.operator), srange_node(node))
3014+
)
3015+
else
3016+
visit(node)
3017+
end
3018+
else
3019+
visit(node)
3020+
end
3021+
end
30173022
end
30183023
end
30193024
end

0 commit comments

Comments
 (0)