Skip to content

Commit ca03bdf

Browse files
committed
Refactor #visitLocalVariableWriteNode method
1 parent 236eec2 commit ca03bdf

File tree

5 files changed

+27
-33
lines changed

5 files changed

+27
-33
lines changed

spec/truffle/parsing/fixtures/rescue/capturing/with_local_variable.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ ast: |
6666
DeadNode
6767
attributes:
6868
flags = 0
69-
reason = "YARPTranslator#visitLocalVariableWriteNode"
69+
reason = "YARPTranslator#visitLocalVariableTargetNode"
7070
IntegerFixnumLiteralNode
7171
attributes:
7272
flags = 1

spec/truffle/parsing/fixtures/rescue/with_exception_and_variable.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ ast: |
6969
DeadNode
7070
attributes:
7171
flags = 0
72-
reason = "YARPTranslator#visitLocalVariableWriteNode"
72+
reason = "YARPTranslator#visitLocalVariableTargetNode"
7373
IntegerFixnumLiteralNode
7474
attributes:
7575
flags = 1

spec/truffle/parsing/fixtures/rescue/without_exception_but_with_variable.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ ast: |
4242
DeadNode
4343
attributes:
4444
flags = 0
45-
reason = "YARPTranslator#visitLocalVariableWriteNode"
45+
reason = "YARPTranslator#visitLocalVariableTargetNode"
4646
IntegerFixnumLiteralNode
4747
attributes:
4848
flags = 1

src/main/java/org/truffleruby/parser/YARPMultiTargetNodeTranslator.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import org.truffleruby.core.cast.SplatCastNodeGen;
2121
import org.truffleruby.language.RubyNode;
2222
import org.truffleruby.language.literal.NilLiteralNode;
23+
import org.truffleruby.language.locals.ReadLocalNode;
24+
import org.truffleruby.language.locals.WriteLocalNode;
2325

2426
// Could be used in ordinal multi-assignment and for destructuring array argument in method/proc parameters:
2527
// - a, (b, c) = 1, [2, 3]
@@ -164,11 +166,15 @@ public AssignableNode visitSplatNode(Nodes.SplatNode node) {
164166
@Override
165167
// RequiredParameterNode is handled during destructuring method/proc arguments
166168
public AssignableNode visitRequiredParameterNode(Nodes.RequiredParameterNode node) {
167-
// TODO: this could be done more directly but the logic of visitLocalVariableWriteNode() needs to be simpler first
168-
// NOTE: depth is not supposed to be used anyway so pass 0 value.
169-
final RubyNode rubyNode = yarpTranslator.visitLocalVariableWriteNode(
170-
new Nodes.LocalVariableWriteNode(node.name, 0, null, node.startOffset, node.length));
171-
return ((AssignableNode) rubyNode).toAssignableNode();
169+
final String name = node.name;
170+
final ReadLocalNode lhs = yarpTranslator.getEnvironment().findLocalVarNode(name, null);
171+
172+
assert lhs != null;
173+
174+
final RubyNode rhs = new DeadNode("YARPMultiTargetNodeTranslator#visitRequiredParameterNode");
175+
final WriteLocalNode rubyNode = lhs.makeWriteNode(rhs);
176+
177+
return rubyNode.toAssignableNode();
172178
}
173179

174180
@Override

src/main/java/org/truffleruby/parser/YARPTranslator.java

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2491,30 +2491,11 @@ public RubyNode visitLocalVariableOrWriteNode(Nodes.LocalVariableOrWriteNode nod
24912491
@Override
24922492
public WriteLocalNode visitLocalVariableWriteNode(Nodes.LocalVariableWriteNode node) {
24932493
final String name = node.name;
2494+
final ReadLocalNode lhs = environment.findLocalVarNode(name, null);
24942495

2495-
if (environment.getNeverAssignInParentScope()) {
2496-
environment.declareVar(name);
2497-
}
2498-
2499-
ReadLocalNode lhs = environment.findLocalVarNode(name, null);
2500-
2501-
// TODO: it should always be present if we use byte[][] locals
2502-
if (lhs == null) {
2503-
TranslatorEnvironment environmentToDeclareIn = environment;
2504-
while (!environmentToDeclareIn.hasOwnScopeForAssignments()) {
2505-
environmentToDeclareIn = environmentToDeclareIn.getParent();
2506-
}
2507-
environmentToDeclareIn.declareVar(name);
2508-
2509-
lhs = environment.findLocalVarNode(name, null);
2510-
2511-
if (lhs == null) {
2512-
throw CompilerDirectives.shouldNotReachHere();
2513-
}
2514-
}
2496+
assert lhs != null;
25152497

2516-
// TODO simplify once visitLocalVariableTargetNode does not reuse this method
2517-
final RubyNode rhs = translateNodeOrDeadNode(node.value, "YARPTranslator#visitLocalVariableWriteNode");
2498+
final RubyNode rhs = node.value.accept(this);
25182499
final WriteLocalNode rubyNode = lhs.makeWriteNode(rhs);
25192500

25202501
assignPositionAndFlags(node, rubyNode);
@@ -2523,9 +2504,16 @@ public WriteLocalNode visitLocalVariableWriteNode(Nodes.LocalVariableWriteNode n
25232504

25242505
@Override
25252506
public WriteLocalNode visitLocalVariableTargetNode(Nodes.LocalVariableTargetNode node) {
2526-
// TODO: this could be done more directly but the logic of visitLocalVariableWriteNode() needs to be simpler first
2527-
return visitLocalVariableWriteNode(
2528-
new Nodes.LocalVariableWriteNode(node.name, node.depth, null, node.startOffset, node.length));
2507+
final String name = node.name;
2508+
final ReadLocalNode lhs = environment.findLocalVarNode(name, null);
2509+
2510+
assert lhs != null;
2511+
2512+
final RubyNode rhs = new DeadNode("YARPTranslator#visitLocalVariableTargetNode");
2513+
final WriteLocalNode rubyNode = lhs.makeWriteNode(rhs);
2514+
2515+
assignPositionAndFlags(node, rubyNode);
2516+
return rubyNode;
25292517
}
25302518

25312519
@Override

0 commit comments

Comments
 (0)