From 36996c893873fa7d083d08d3678c895d9803f1e0 Mon Sep 17 00:00:00 2001 From: Hubert Plociniczak Date: Thu, 23 Nov 2023 20:56:56 +0100 Subject: [PATCH] Don't NPE on `op ._` when translating tree to IR (#8381) Encountered a random NPE when playing with bookclubs. Test case demonstrating the problem is attached. Threw in a bunch of minor tweaks to logs to make life of the person debugging code more pleasant. --- .../src/main/resources/application.conf | 1 + .../org/enso/compiler/context/CompilerContext.java | 2 ++ .../instrument/command/AttachVisualizationCmd.scala | 2 +- .../instrument/job/UpsertVisualizationJob.scala | 2 +- .../src/main/java/org/enso/compiler/core/TreeToIr.java | 6 +++++- .../interpreter/runtime/TruffleCompilerContext.java | 5 +++++ .../test/java/org/enso/compiler/ErrorCompilerTest.java | 10 ++++++++++ 7 files changed, 25 insertions(+), 3 deletions(-) diff --git a/engine/language-server/src/main/resources/application.conf b/engine/language-server/src/main/resources/application.conf index 28ecbe9909..238285a59b 100644 --- a/engine/language-server/src/main/resources/application.conf +++ b/engine/language-server/src/main/resources/application.conf @@ -40,6 +40,7 @@ logging-service { org.enso.languageserver.protocol.json.JsonConnectionController = debug org.enso.jsonrpc.JsonRpcServer = debug org.enso.languageserver.runtime.RuntimeConnector = debug + org.enso.interpreter.runtime.HostClassLoader = error } appenders = [ { diff --git a/engine/runtime-compiler/src/main/java/org/enso/compiler/context/CompilerContext.java b/engine/runtime-compiler/src/main/java/org/enso/compiler/context/CompilerContext.java index dea58aaf38..938da72e3a 100644 --- a/engine/runtime-compiler/src/main/java/org/enso/compiler/context/CompilerContext.java +++ b/engine/runtime-compiler/src/main/java/org/enso/compiler/context/CompilerContext.java @@ -43,6 +43,8 @@ public interface CompilerContext extends CompilerStub { void log(Level level, String msg, Object... args); + void log(Level level, String msg, Throwable ex); + void logSerializationManager(Level level, String msg, Object... args); void notifySerializeModule(QualifiedName moduleName); diff --git a/engine/runtime-instrument-common/src/main/scala/org/enso/interpreter/instrument/command/AttachVisualizationCmd.scala b/engine/runtime-instrument-common/src/main/scala/org/enso/interpreter/instrument/command/AttachVisualizationCmd.scala index 0528114f19..6dd91106d6 100644 --- a/engine/runtime-instrument-common/src/main/scala/org/enso/interpreter/instrument/command/AttachVisualizationCmd.scala +++ b/engine/runtime-instrument-common/src/main/scala/org/enso/interpreter/instrument/command/AttachVisualizationCmd.scala @@ -26,7 +26,7 @@ class AttachVisualizationCmd( ): Future[Unit] = { ctx.executionService.getLogger.log( Level.FINE, - "Attach visualization cmd for request id [{}] and visualization id [{}]", + "Attach visualization cmd for request id [{0}] and visualization id [{1}]", Array(maybeRequestId, request.visualizationId) ) ctx.endpoint.sendToClient( diff --git a/engine/runtime-instrument-common/src/main/scala/org/enso/interpreter/instrument/job/UpsertVisualizationJob.scala b/engine/runtime-instrument-common/src/main/scala/org/enso/interpreter/instrument/job/UpsertVisualizationJob.scala index 62cd113f87..a840399c1f 100644 --- a/engine/runtime-instrument-common/src/main/scala/org/enso/interpreter/instrument/job/UpsertVisualizationJob.scala +++ b/engine/runtime-instrument-common/src/main/scala/org/enso/interpreter/instrument/job/UpsertVisualizationJob.scala @@ -139,7 +139,7 @@ class UpsertVisualizationJob( )(implicit ctx: RuntimeContext): Unit = { ctx.executionService.getLogger.log( Level.SEVERE, - "Visualization for expression {0} failed: {1} (evaluation result: {2}", + "Visualization for expression {0} failed: {1} (evaluation result: {2})", Array(expressionId, message, executionResult) ) ctx.endpoint.sendToClient( diff --git a/engine/runtime-parser/src/main/java/org/enso/compiler/core/TreeToIr.java b/engine/runtime-parser/src/main/java/org/enso/compiler/core/TreeToIr.java index d4af0ff27a..4bde2718f9 100644 --- a/engine/runtime-parser/src/main/java/org/enso/compiler/core/TreeToIr.java +++ b/engine/runtime-parser/src/main/java/org/enso/compiler/core/TreeToIr.java @@ -1438,7 +1438,11 @@ final class TreeToIr { } else { throw translateEntity(app, Syntax.UnexpectedExpression$.MODULE$); } - list = app.getLhs(); + if (app.getLhs() != null) { + list = app.getLhs(); + } else { + throw translateEntity(app, Syntax.UnexpectedExpression$.MODULE$); + } } segments.add(list); java.util.Collections.reverse(segments); diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/TruffleCompilerContext.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/TruffleCompilerContext.java index 4c9c1e9620..cecfa8b21e 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/TruffleCompilerContext.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/TruffleCompilerContext.java @@ -93,6 +93,11 @@ final class TruffleCompilerContext implements CompilerContext { loggerCompiler.log(level, msg, args); } + @Override + public void log(Level level, String msg, Throwable ex) { + loggerCompiler.log(level, msg, ex); + } + @Override public void logSerializationManager(Level level, String msg, Object... args) { loggerSerializationManager.log(level, msg, args); diff --git a/engine/runtime/src/test/java/org/enso/compiler/ErrorCompilerTest.java b/engine/runtime/src/test/java/org/enso/compiler/ErrorCompilerTest.java index 45e74cfbc7..d1cb34cf7a 100644 --- a/engine/runtime/src/test/java/org/enso/compiler/ErrorCompilerTest.java +++ b/engine/runtime/src/test/java/org/enso/compiler/ErrorCompilerTest.java @@ -30,6 +30,16 @@ public class ErrorCompilerTest extends CompilerTest { assertSingleSyntaxError(ir, Syntax.InvalidUnderscore$.MODULE$, "Invalid use of _", 14, 15); } + @Test + public void spaceDotUnderscore() throws Exception { + var ir = parse(""" + run op = + op ._ + """); + + assertSingleSyntaxError(ir, Syntax.UnexpectedExpression$.MODULE$, "Unexpected expression", 14, 16); + } + @Test public void unaryMinus() throws Exception { var ir = parse("""