Skip to content

Commit 8df4254

Browse files
committed
Translate InterpolatedRegexpNode
1 parent 03b5fbd commit 8df4254

File tree

1 file changed

+50
-28
lines changed

1 file changed

+50
-28
lines changed

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

Lines changed: 50 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
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.regexp.InterpolatedRegexpNode;
4243
import org.truffleruby.core.regexp.RegexpOptions;
4344
import org.truffleruby.core.regexp.RubyRegexp;
4445
import org.truffleruby.core.rescue.AssignRescueVariableNode;
@@ -77,6 +78,7 @@
7778
import org.truffleruby.language.control.LocalReturnNode;
7879
import org.truffleruby.language.control.NextNode;
7980
import org.truffleruby.language.control.NotNodeGen;
81+
import org.truffleruby.language.control.OnceNode;
8082
import org.truffleruby.language.control.OrNodeGen;
8183
import org.truffleruby.language.control.RaiseException;
8284
import org.truffleruby.language.control.RedoNode;
@@ -1514,19 +1516,26 @@ public RubyNode visitInterpolatedMatchLastLineNode(Nodes.InterpolatedMatchLastLi
15141516

15151517
@Override
15161518
public RubyNode visitInterpolatedRegularExpressionNode(Nodes.InterpolatedRegularExpressionNode node) {
1517-
return defaultVisit(node);
1518-
}
1519+
final ToSNode[] children = translateInterpolatedParts(node.parts);
15191520

1520-
@Override
1521-
public RubyNode visitInterpolatedStringNode(Nodes.InterpolatedStringNode node) {
1522-
final ToSNode[] children = new ToSNode[node.parts.length];
1521+
var encodingAndOptions = getRegexpEncodingAndOptions(new Nodes.RegularExpressionFlags(node.flags));
15231522

1524-
for (int i = 0; i < node.parts.length; i++) {
1525-
var part = node.parts[i];
1523+
var rubyNode = new InterpolatedRegexpNode(children, encodingAndOptions.options);
1524+
assignNodePositionInSource(node, rubyNode);
15261525

1527-
children[i] = ToSNodeGen.create(part.accept(this));
1526+
if (node.isOnce()) {
1527+
final RubyNode ret = new OnceNode(rubyNode);
1528+
assignNodePositionOnly(node, ret);
1529+
return ret;
15281530
}
15291531

1532+
return rubyNode;
1533+
}
1534+
1535+
@Override
1536+
public RubyNode visitInterpolatedStringNode(Nodes.InterpolatedStringNode node) {
1537+
final ToSNode[] children = translateInterpolatedParts(node.parts);
1538+
15301539
final RubyNode rubyNode = new InterpolatedStringNode(children, sourceEncoding.jcoding);
15311540
assignNodePositionInSource(node, rubyNode);
15321541

@@ -1535,12 +1544,7 @@ public RubyNode visitInterpolatedStringNode(Nodes.InterpolatedStringNode node) {
15351544

15361545
@Override
15371546
public RubyNode visitInterpolatedSymbolNode(Nodes.InterpolatedSymbolNode node) {
1538-
final ToSNode[] children = new ToSNode[node.parts.length];
1539-
1540-
for (int i = 0; i < node.parts.length; i++) {
1541-
final RubyNode expression = node.parts[i].accept(this);
1542-
children[i] = ToSNodeGen.create(expression);
1543-
}
1547+
final ToSNode[] children = translateInterpolatedParts(node.parts);
15441548

15451549
final RubyNode stringNode = new InterpolatedStringNode(children, sourceEncoding.jcoding);
15461550
final RubyNode rubyNode = StringToSymbolNodeGen.create(stringNode);
@@ -1559,6 +1563,16 @@ public RubyNode visitInterpolatedXStringNode(Nodes.InterpolatedXStringNode node)
15591563
return rubyNode;
15601564
}
15611565

1566+
private ToSNode[] translateInterpolatedParts(Nodes.Node[] parts) {
1567+
final ToSNode[] children = new ToSNode[parts.length];
1568+
1569+
for (int i = 0; i < parts.length; i++) {
1570+
RubyNode expression = parts[i].accept(this);
1571+
children[i] = ToSNodeGen.create(expression);
1572+
}
1573+
return children;
1574+
}
1575+
15621576
@Override
15631577
public RubyNode visitKeywordHashNode(Nodes.KeywordHashNode node) {
15641578
// translate it like a HashNode, whether it is keywords or not is checked in getKeywordArgumentsDescriptor()
@@ -1832,24 +1846,39 @@ public RubyNode visitRedoNode(Nodes.RedoNode node) {
18321846
@Override
18331847
public RubyNode visitRegularExpressionNode(Nodes.RegularExpressionNode node) {
18341848
var source = toTString(node.unescaped);
1849+
var encodingAndOptions = getRegexpEncodingAndOptions(new Nodes.RegularExpressionFlags(node.flags));
1850+
try {
1851+
final RubyRegexp regexp = RubyRegexp.create(language, source, encodingAndOptions.encoding,
1852+
encodingAndOptions.options, currentNode);
1853+
final ObjectLiteralNode literalNode = new ObjectLiteralNode(regexp);
1854+
assignNodePositionInSource(node, literalNode);
1855+
return literalNode;
1856+
} catch (DeferredRaiseException dre) {
1857+
throw dre.getException(RubyLanguage.getCurrentContext());
1858+
}
1859+
}
18351860

1861+
private record RegexpEncodingAndOptions(RubyEncoding encoding, RegexpOptions options) {
1862+
}
1863+
1864+
private RegexpEncodingAndOptions getRegexpEncodingAndOptions(Nodes.RegularExpressionFlags flags) {
18361865
final KCode kcode;
18371866
final RubyEncoding regexpEncoding;
18381867
final boolean fixed;
18391868
boolean explicitEncoding = true;
1840-
if (node.isAscii8bit()) {
1869+
if (flags.isAscii8bit()) {
18411870
fixed = false;
18421871
kcode = KCode.NONE;
18431872
regexpEncoding = Encodings.BINARY;
1844-
} else if (node.isUtf8()) {
1873+
} else if (flags.isUtf8()) {
18451874
fixed = true;
18461875
kcode = KCode.UTF8;
18471876
regexpEncoding = Encodings.UTF_8;
1848-
} else if (node.isEucJp()) {
1877+
} else if (flags.isEucJp()) {
18491878
fixed = true;
18501879
kcode = KCode.EUC;
18511880
regexpEncoding = Encodings.getBuiltInEncoding(EUCJPEncoding.INSTANCE);
1852-
} else if (node.isWindows31j()) {
1881+
} else if (flags.isWindows31j()) {
18531882
fixed = true;
18541883
kcode = KCode.SJIS;
18551884
regexpEncoding = Encodings.getBuiltInEncoding(Windows_31JEncoding.INSTANCE);
@@ -1860,16 +1889,9 @@ public RubyNode visitRegularExpressionNode(Nodes.RegularExpressionNode node) {
18601889
explicitEncoding = false;
18611890
}
18621891

1863-
final RegexpOptions options = new RegexpOptions(kcode, fixed, node.isOnce(), node.isExtended(),
1864-
node.isMultiLine(), node.isIgnoreCase(), node.isAscii8bit(), !explicitEncoding, true);
1865-
try {
1866-
final RubyRegexp regexp = RubyRegexp.create(language, source, regexpEncoding, options, currentNode);
1867-
final ObjectLiteralNode literalNode = new ObjectLiteralNode(regexp);
1868-
assignNodePositionInSource(node, literalNode);
1869-
return literalNode;
1870-
} catch (DeferredRaiseException dre) {
1871-
throw dre.getException(RubyLanguage.getCurrentContext());
1872-
}
1892+
final RegexpOptions options = new RegexpOptions(kcode, fixed, flags.isOnce(), flags.isExtended(),
1893+
flags.isMultiLine(), flags.isIgnoreCase(), flags.isAscii8bit(), !explicitEncoding, true);
1894+
return new RegexpEncodingAndOptions(regexpEncoding, options);
18731895
}
18741896

18751897
@Override

0 commit comments

Comments
 (0)