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

Commit 1eec9e7

Browse files
committed
More whitequark/parser translation
1 parent b7da73a commit 1eec9e7

File tree

2 files changed

+80
-11
lines changed

2 files changed

+80
-11
lines changed

lib/syntax_tree/parser.rb

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1559,7 +1559,14 @@ def on_elsif(predicate, statements, consequent)
15591559
beginning = consume_keyword(:elsif)
15601560
ending = consequent || consume_keyword(:end)
15611561

1562-
start_char = find_next_statement_start(predicate.location.end_char)
1562+
delimiter =
1563+
find_keyword_between(:then, predicate, statements) ||
1564+
find_token_between(Semicolon, predicate, statements)
1565+
1566+
tokens.delete(delimiter) if delimiter
1567+
start_char =
1568+
find_next_statement_start((delimiter || predicate).location.end_char)
1569+
15631570
statements.bind(
15641571
self,
15651572
start_char,
@@ -2045,6 +2052,7 @@ def on_if(predicate, statements, consequent)
20452052

20462053
start_char =
20472054
find_next_statement_start((keyword || predicate).location.end_char)
2055+
20482056
statements.bind(
20492057
self,
20502058
start_char,
@@ -3805,6 +3813,7 @@ def on_unless(predicate, statements, consequent)
38053813

38063814
start_char =
38073815
find_next_statement_start((keyword || predicate).location.end_char)
3816+
38083817
statements.bind(
38093818
self,
38103819
start_char,

lib/syntax_tree/translation/parser.rb

Lines changed: 70 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -336,8 +336,8 @@ def visit_assign(node)
336336
# Visit an Assoc node.
337337
def visit_assoc(node)
338338
if node.value.nil?
339+
# { foo: }
339340
expression = srange(node.start_char, node.end_char - 1)
340-
341341
type, location =
342342
if node.key.value.start_with?(/[A-Z]/)
343343
[:const, smap_constant(nil, expression, expression)]
@@ -356,13 +356,38 @@ def visit_assoc(node)
356356
srange_node(node)
357357
)
358358
)
359-
else
359+
elsif node.key.is_a?(Label)
360+
# { foo: 1 }
360361
s(
361362
:pair,
362363
[visit(node.key), visit(node.value)],
363364
smap_operator(
364-
srange_search_between(node.key, node.value, "=>") ||
365-
srange_length(node.key.end_char, -1),
365+
srange_length(node.key.end_char, -1),
366+
srange_node(node)
367+
)
368+
)
369+
elsif (operator = srange_search_between(node.key, node.value, "=>"))
370+
# { :foo => 1 }
371+
s(
372+
:pair,
373+
[visit(node.key), visit(node.value)],
374+
smap_operator(operator, srange_node(node))
375+
)
376+
else
377+
# { "foo": 1 }
378+
key = visit(node.key)
379+
key_location =
380+
smap_collection(
381+
key.location.begin,
382+
srange_length(node.key.end_char - 2, 1),
383+
srange(node.key.start_char, node.key.end_char - 1)
384+
)
385+
386+
s(
387+
:pair,
388+
[s(key.type, key.children, key_location), visit(node.value)],
389+
smap_operator(
390+
srange_length(node.key.end_char, -1),
366391
srange_node(node)
367392
)
368393
)
@@ -769,7 +794,11 @@ def visit_command_call(node)
769794

770795
srange(node.start_char, end_char)
771796
elsif node.block
772-
srange_node(node.message)
797+
if node.receiver
798+
srange(node.receiver.start_char, node.message.end_char)
799+
else
800+
srange_node(node.message)
801+
end
773802
else
774803
srange_node(node)
775804
end
@@ -1010,6 +1039,21 @@ def visit_else(node)
10101039

10111040
# Visit an Elsif node.
10121041
def visit_elsif(node)
1042+
begin_start = node.predicate.end_char
1043+
begin_end =
1044+
if node.statements.empty?
1045+
node.statements.end_char
1046+
else
1047+
node.statements.body.first.start_char
1048+
end
1049+
1050+
begin_token =
1051+
if buffer.source[begin_start...begin_end].include?("then")
1052+
srange_find(begin_start, begin_end, "then")
1053+
elsif buffer.source[begin_start...begin_end].include?(";")
1054+
srange_find(begin_start, begin_end, ";")
1055+
end
1056+
10131057
else_token =
10141058
case node.consequent
10151059
when Elsif
@@ -1029,7 +1073,7 @@ def visit_elsif(node)
10291073
],
10301074
smap_condition(
10311075
srange_length(node.start_char, 5),
1032-
nil,
1076+
begin_token,
10331077
else_token,
10341078
nil,
10351079
expression
@@ -1529,12 +1573,14 @@ def visit_lambda_var(node)
15291573
location =
15301574
if node.start_char == node.end_char
15311575
smap_collection_bare(nil)
1532-
else
1576+
elsif buffer.source[node.start_char - 1] == "("
15331577
smap_collection(
15341578
srange_length(node.start_char, 1),
15351579
srange_length(node.end_char, -1),
15361580
srange_node(node)
15371581
)
1582+
else
1583+
smap_collection_bare(srange_node(node))
15381584
end
15391585

15401586
s(:args, visit(node.params).children + shadowargs, location)
@@ -1565,7 +1611,7 @@ def visit_method_add_block(node)
15651611
srange_node(node.block.opening),
15661612
srange_length(
15671613
node.block.end_char,
1568-
node.block.opening.is_a?(Kw) ? -3 : -1
1614+
node.block.keywords? ? -3 : -1
15691615
),
15701616
srange_node(node)
15711617
)
@@ -2244,7 +2290,16 @@ def visit_super(node)
22442290
)
22452291
)
22462292
when ArgsForward
2247-
s(:super, [visit(node.arguments.arguments)], nil)
2293+
s(
2294+
:super,
2295+
[visit(node.arguments.arguments)],
2296+
smap_keyword(
2297+
srange_length(node.start_char, 5),
2298+
srange_find(node.start_char + 5, node.end_char, "("),
2299+
srange_length(node.end_char, -1),
2300+
srange_node(node)
2301+
)
2302+
)
22482303
else
22492304
s(
22502305
:super,
@@ -2442,10 +2497,15 @@ def visit_unless(node)
24422497
srange_find(begin_start, begin_end, ";")
24432498
end
24442499

2500+
else_token =
2501+
if node.consequent
2502+
srange_length(node.consequent.start_char, 4)
2503+
end
2504+
24452505
smap_condition(
24462506
srange_length(node.start_char, 6),
24472507
begin_token,
2448-
nil,
2508+
else_token,
24492509
srange_length(node.end_char, -3),
24502510
srange_node(node)
24512511
)

0 commit comments

Comments
 (0)