Skip to content

Commit c8083fa

Browse files
committed
Translate RangeNode
1 parent 8df4254 commit c8083fa

File tree

3 files changed

+26
-1
lines changed

3 files changed

+26
-1
lines changed

src/main/java/org/truffleruby/language/literal/IntegerFixnumLiteralNode.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ public IntegerFixnumLiteralNode(int value) {
2525
this.value = value;
2626
}
2727

28+
public int getValue() {
29+
return value;
30+
}
31+
2832
@Override
2933
public Object execute(VirtualFrame frame) {
3034
return value;

src/main/java/org/truffleruby/language/literal/LongFixnumLiteralNode.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ public LongFixnumLiteralNode(long value) {
2525
this.value = value;
2626
}
2727

28+
public long getValue() {
29+
return value;
30+
}
31+
2832
@Override
2933
public Object execute(VirtualFrame frame) {
3034
return value;

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

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@
3939
import org.truffleruby.core.hash.HashLiteralNode;
4040
import org.truffleruby.core.module.ModuleNodes;
4141
import org.truffleruby.core.numeric.RubyBignum;
42+
import org.truffleruby.core.range.RangeNodesFactory;
43+
import org.truffleruby.core.range.RubyIntRange;
44+
import org.truffleruby.core.range.RubyLongRange;
4245
import org.truffleruby.core.regexp.InterpolatedRegexpNode;
4346
import org.truffleruby.core.regexp.RegexpOptions;
4447
import org.truffleruby.core.regexp.RubyRegexp;
@@ -1802,7 +1805,21 @@ public RubyNode visitProgramNode(Nodes.ProgramNode node) {
18021805

18031806
@Override
18041807
public RubyNode visitRangeNode(Nodes.RangeNode node) {
1805-
return defaultVisit(node);
1808+
var left = translateNodeOrNil(node.left);
1809+
var right = translateNodeOrNil(node.right);
1810+
1811+
final RubyNode rubyNode;
1812+
if (left instanceof IntegerFixnumLiteralNode l && right instanceof IntegerFixnumLiteralNode r) {
1813+
final Object range = new RubyIntRange(node.isExcludeEnd(), l.getValue(), r.getValue());
1814+
rubyNode = new ObjectLiteralNode(range);
1815+
} else if (left instanceof LongFixnumLiteralNode l && right instanceof LongFixnumLiteralNode r) {
1816+
final Object range = new RubyLongRange(node.isExcludeEnd(), l.getValue(), r.getValue());
1817+
rubyNode = new ObjectLiteralNode(range);
1818+
} else {
1819+
rubyNode = RangeNodesFactory.RangeLiteralNodeGen.create(left, right, node.isExcludeEnd());
1820+
}
1821+
assignNodePositionInSource(node, rubyNode);
1822+
return rubyNode;
18061823
}
18071824

18081825
@Override

0 commit comments

Comments
 (0)