Skip to content

Commit b62663c

Browse files
committed
Inspect RubyRootNode for warnings during syntax check
1 parent c98cb75 commit b62663c

File tree

8 files changed

+59
-28
lines changed

8 files changed

+59
-28
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
fails:Numbered parameters warns when numbered parameter is overwritten with local variable

src/main/java/org/truffleruby/language/EmitWarningsNode.java

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424

2525
public class EmitWarningsNode extends RubyContextSourceNode {
2626

27-
private final RubyDeferredWarnings warnings;
27+
public final RubyDeferredWarnings warnings;
2828

2929
public EmitWarningsNode(RubyDeferredWarnings warnings) {
3030
this.warnings = warnings;
@@ -33,28 +33,38 @@ public EmitWarningsNode(RubyDeferredWarnings warnings) {
3333
@Override
3434
public Object execute(VirtualFrame frame) {
3535
final RubyContext context = getContext();
36-
boolean isVerbose = context.getCoreLibrary().isVerbose();
37-
boolean warningsEnabled = context.getCoreLibrary().warningsEnabled();
38-
printWarnings(context, isVerbose, warningsEnabled);
36+
printWarnings(context);
3937
return nil;
4038
}
4139

40+
public void printWarnings(RubyContext context) {
41+
printWarnings(context, warnings);
42+
}
43+
4244
@TruffleBoundary
43-
private void printWarnings(RubyContext context, boolean isVerbose, boolean warningsEnabled) {
44-
for (RubyDeferredWarnings.WarningMessage warningMessage : warnings.warnings) {
45-
if (warningMessage.verbosity == RubyDeferredWarnings.Verbosity.VERBOSE) {
46-
if (isVerbose) {
47-
printWarning(context, warningMessage.message);
48-
}
49-
} else {
50-
if (warningsEnabled) {
51-
printWarning(context, warningMessage.message);
45+
public static void printWarnings(RubyContext context, RubyDeferredWarnings warnings) {
46+
if (context == null) {
47+
for (RubyDeferredWarnings.WarningMessage warningMessage : warnings.warnings) {
48+
System.err.println(warningMessage.message);
49+
}
50+
} else {
51+
boolean isVerbose = context.getCoreLibrary().isVerbose();
52+
boolean warningsEnabled = context.getCoreLibrary().warningsEnabled();
53+
for (RubyDeferredWarnings.WarningMessage warningMessage : warnings.warnings) {
54+
if (warningMessage.verbosity == RubyDeferredWarnings.Verbosity.VERBOSE) {
55+
if (isVerbose) {
56+
printWarning(context, warningMessage.message);
57+
}
58+
} else {
59+
if (warningsEnabled) {
60+
printWarning(context, warningMessage.message);
61+
}
5262
}
5363
}
5464
}
5565
}
5666

57-
public static void printWarning(RubyContext context, String message) {
67+
private static void printWarning(RubyContext context, String message) {
5868
if (context.getCoreLibrary().isLoaded()) {
5969
final Object warning = context.getCoreLibrary().warningModule;
6070
final Rope messageRope = StringOperations.encodeRope(message, UTF8Encoding.INSTANCE);
@@ -63,7 +73,7 @@ public static void printWarning(RubyContext context, String message) {
6373
RubyContext.send(warning, "warn", messageString);
6474
} else {
6575
try {
66-
context.getEnv().err().write(message.getBytes(StandardCharsets.UTF_8));
76+
context.getEnvErrStream().write(message.getBytes(StandardCharsets.UTF_8));
6777
} catch (IOException e) {
6878
throw new RaiseException(context, context.getCoreExceptions().ioError(e, null));
6979
}

src/main/java/org/truffleruby/language/TruffleBootNodes.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.util.stream.Collectors;
1616

1717
import com.oracle.truffle.api.library.CachedLibrary;
18+
import com.oracle.truffle.api.nodes.NodeUtil;
1819
import org.graalvm.options.OptionDescriptor;
1920
import org.jcodings.specific.UTF8Encoding;
2021
import org.truffleruby.RubyContext;
@@ -288,8 +289,14 @@ public abstract static class InnerCheckSyntaxNode extends CoreMethodArrayArgumen
288289
@TruffleBoundary
289290
@Specialization
290291
protected Object innerCheckSyntax(RubySource source) {
291-
getContext().getCodeLoader().parse(source, ParserContext.TOP_LEVEL, null, null, true, null);
292-
292+
RubyContext context = getContext();
293+
RubyRootNode rubyRootNode = context
294+
.getCodeLoader()
295+
.parse(source, ParserContext.TOP_LEVEL, null, null, true, null);
296+
EmitWarningsNode emitWarningsNode = NodeUtil.findFirstNodeInstance(rubyRootNode, EmitWarningsNode.class);
297+
if (emitWarningsNode != null) {
298+
emitWarningsNode.printWarnings(context);
299+
}
293300
return nil;
294301
}
295302

src/main/java/org/truffleruby/language/methods/CatchForMethodNode.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@ public Object execute(VirtualFrame frame) {
5555
}
5656
}
5757

58+
public RubyNode getBody() {
59+
return body;
60+
}
61+
5862
@Override
5963
public RubyNode simplifyAsTailExpression() {
6064
return new CatchForMethodNode(returnID, body.simplifyAsTailExpression()).copySourceSection(this);

src/main/java/org/truffleruby/language/methods/CatchNextNode.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ public CatchNextNode(RubyNode body) {
2626
this.body = body;
2727
}
2828

29+
public RubyNode getBody() {
30+
return body;
31+
}
32+
2933
@Override
3034
public Object execute(VirtualFrame frame) {
3135
try {

src/main/java/org/truffleruby/language/methods/CatchRetryAsErrorNode.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,8 @@ public Object execute(VirtualFrame frame) {
3737
}
3838
}
3939

40+
public RubyNode getBody() {
41+
return body;
42+
}
43+
4044
}

src/main/java/org/truffleruby/language/methods/ExceptionTranslatingNode.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ public Object execute(VirtualFrame frame) {
4040
}
4141
}
4242

43+
public RubyNode getChild() {
44+
return child;
45+
}
46+
4347
@Override
4448
public RubyNode simplifyAsTailExpression() {
4549
return new ExceptionTranslatingNode(child.simplifyAsTailExpression(), unsupportedOperationBehavior)

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

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -302,12 +302,6 @@ public RubyRootNode parse(RubySource rubySource, ParserContext parserContext, St
302302
Arrays.asList(BodyTranslator.initFlipFlopStates(environment, sourceIndexLength), truffleNode));
303303
}
304304

305-
if (!rubyWarnings.warnings.isEmpty()) {
306-
truffleNode = Translator.sequence(
307-
sourceIndexLength,
308-
Arrays.asList(new EmitWarningsNode(rubyWarnings), truffleNode));
309-
}
310-
311305
if (parserContext == ParserContext.TOP_LEVEL_FIRST && context.getOptions().GETS_LOOP) {
312306
if (context.getOptions().PRINT_LOOP) {
313307
truffleNode = Translator.sequence(
@@ -334,9 +328,16 @@ public RubyRootNode parse(RubySource rubySource, ParserContext parserContext, St
334328
Arrays.asList(beginNode, truffleNode));
335329
}
336330

331+
337332
final RubyNode writeSelfNode = Translator.loadSelf(language, environment);
338333
truffleNode = Translator.sequence(sourceIndexLength, Arrays.asList(writeSelfNode, truffleNode));
339334

335+
if (!rubyWarnings.warnings.isEmpty()) {
336+
truffleNode = Translator.sequence(
337+
sourceIndexLength,
338+
Arrays.asList(new EmitWarningsNode(rubyWarnings), truffleNode));
339+
}
340+
340341
// Catch next
341342

342343
truffleNode = new CatchNextNode(truffleNode);
@@ -416,11 +417,7 @@ public static RootParseNode parseToJRubyAST(RubyContext context, RubySource ruby
416417
result = parser.parse(configuration);
417418
} catch (SyntaxException e) {
418419
if (!rubyWarnings.warnings.isEmpty()) {
419-
if (context != null) {
420-
for (RubyDeferredWarnings.WarningMessage warningMessage : rubyWarnings.warnings) {
421-
EmitWarningsNode.printWarning(context, warningMessage.message);
422-
}
423-
}
420+
EmitWarningsNode.printWarnings(context, rubyWarnings);
424421
}
425422
switch (e.getPid()) {
426423
case UNKNOWN_ENCODING:

0 commit comments

Comments
 (0)