From 944a3177302a559a2459145dbb63ceed15105292 Mon Sep 17 00:00:00 2001 From: Marcin Kostrzewa Date: Mon, 22 Feb 2021 15:04:48 +0100 Subject: [PATCH 1/5] hacks and ugliness --- .../std-lib/Base/src/Data/Any/Extensions.enso | 4 +- .../std-lib/Base/src/Error/Extensions.enso | 6 +- .../std-lib/Table/src/Data/Column.enso | 4 +- .../std-lib/Table/src/Data/Table.enso | 3 +- .../org/enso/runner/ContextFactory.scala | 1 + .../ArithmeticErrorToDisplayTextNode.java | 33 ++++++++++ .../ArityErrorToDisplayTextNode.java | 31 ++++++++++ .../CompileErrorToDisplayTextNode.java | 33 ++++++++++ ...ivePatternMatchErrorToDisplayTextNode.java | 33 ++++++++++ ...validArrayIndexErrorToDisplayTextNode.java | 29 +++++++++ ...uleDoesNotExistErrorToDisplayTextNode.java | 35 +++++++++++ ...uleNotInPackageErrorToDisplayTextNode.java | 21 +++++++ .../NoSuchMethodErrorToDisplayTextNode.java | 39 ++++++++++++ .../NotInvokableErrorToDisplayTextNode.java | 32 ++++++++++ .../PolyglotErrorToDisplayTextNode.java | 49 +++++++++++++++ .../SyntaxErrorToDisplayTextNode.java | 33 ++++++++++ .../TypeErrorToDisplayTextNode.java | 41 +++++++++++++ ...nitializedStateErrorToDisplayTextNode.java | 31 ++++++++++ ...pportedArgumentTypesToDisplayTextNode.java | 32 ++++++++++ .../builtin/text/AnyToDisplayTextNode.java | 27 ++++++++ .../text/util/TypeToDisplayTextNode.java | 60 ++++++++++++++++++ .../interpreter/runtime/builtin/Builtins.java | 2 + .../interpreter/runtime/builtin/Error.java | 61 +++++++++++++------ .../interpreter/runtime/data/text/Text.java | 30 +++++++++ .../interpreter/service/ExecutionService.java | 20 ++++++ .../runtime/src/main/resources/Builtins.enso | 9 +++ .../enso/compiler/codegen/IrToTruffle.scala | 7 +-- .../job/ProgramExecutionSupport.scala | 2 +- .../instrument/ExpressionErrorsTest.scala | 12 ++-- .../interpreter/test/semantic/TextTest.scala | 26 ++++++++ .../enso/interpreter/dsl/BuiltinMethod.java | 2 +- test/Tests/src/Semantic/Error_Spec.enso | 4 +- 32 files changed, 713 insertions(+), 39 deletions(-) create mode 100644 engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ArithmeticErrorToDisplayTextNode.java create mode 100644 engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ArityErrorToDisplayTextNode.java create mode 100644 engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/CompileErrorToDisplayTextNode.java create mode 100644 engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/InexhaustivePatternMatchErrorToDisplayTextNode.java create mode 100644 engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/InvalidArrayIndexErrorToDisplayTextNode.java create mode 100644 engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ModuleDoesNotExistErrorToDisplayTextNode.java create mode 100644 engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ModuleNotInPackageErrorToDisplayTextNode.java create mode 100644 engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/NoSuchMethodErrorToDisplayTextNode.java create mode 100644 engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/NotInvokableErrorToDisplayTextNode.java create mode 100644 engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/PolyglotErrorToDisplayTextNode.java create mode 100644 engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/SyntaxErrorToDisplayTextNode.java create mode 100644 engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/TypeErrorToDisplayTextNode.java create mode 100644 engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/UninitializedStateErrorToDisplayTextNode.java create mode 100644 engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/UnsupportedArgumentTypesToDisplayTextNode.java create mode 100644 engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/text/AnyToDisplayTextNode.java create mode 100644 engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/text/util/TypeToDisplayTextNode.java diff --git a/distribution/std-lib/Base/src/Data/Any/Extensions.enso b/distribution/std-lib/Base/src/Data/Any/Extensions.enso index d174d522095e..12b9e42a5535 100644 --- a/distribution/std-lib/Base/src/Data/Any/Extensions.enso +++ b/distribution/std-lib/Base/src/Data/Any/Extensions.enso @@ -127,5 +127,5 @@ Any.>> that = x -> that (this x) Types defining their own versions of this method should ensure that the result is reasonably small and the operation is quick to compute. -Any.to_display : Text -Any.to_display = this.to_json.to_text +Any.to_default_visualization_data : Text +Any.to_default_visualization_data = this.to_json.to_text diff --git a/distribution/std-lib/Base/src/Error/Extensions.enso b/distribution/std-lib/Base/src/Error/Extensions.enso index 03ad84c96807..e46ef1265d5a 100644 --- a/distribution/std-lib/Base/src/Error/Extensions.enso +++ b/distribution/std-lib/Base/src/Error/Extensions.enso @@ -30,9 +30,9 @@ Error.catch (handler = x->x) = this.catch_primitive handler > Example Displaying a dataflow error. - (Error.throw "oops!").to_display -Error.to_display : Text -Error.to_display = this.catch .to_display + (Error.throw "oops!").to_default_visualization_data +Error.to_default_visualization_data : Text +Error.to_default_visualization_data = this.catch .to_default_visualization_data ## Takes any value, and if it is a dataflow error, throws it as a Panic. Otherwise, returns the original value unchanged. diff --git a/distribution/std-lib/Table/src/Data/Column.enso b/distribution/std-lib/Table/src/Data/Column.enso index 9177d904ac82..20d85a70754b 100644 --- a/distribution/std-lib/Table/src/Data/Column.enso +++ b/distribution/std-lib/Table/src/Data/Column.enso @@ -307,8 +307,8 @@ type Column Shows a JSON serialization of a truncated version of this column, for the benefit of visualization in the IDE. - to_display : Text - to_display = + to_default_visualization_data : Text + to_default_visualization_data = size = ['length', this.length] name = ['name', this.name] max_data = 100 diff --git a/distribution/std-lib/Table/src/Data/Table.enso b/distribution/std-lib/Table/src/Data/Table.enso index 9b2f3eac0047..887e7da71ea3 100644 --- a/distribution/std-lib/Table/src/Data/Table.enso +++ b/distribution/std-lib/Table/src/Data/Table.enso @@ -58,7 +58,8 @@ type Table Returns a Text used to display this table in the IDE by default. Returns a JSON object containing useful metadata and previews of column values. - to_display = + to_default_visualization_data : Text + to_default_visualization_data = max_size = 10 nrows = ['number_of_rows', this.nrows] cols = this.columns.map c-> diff --git a/engine/runner/src/main/scala/org/enso/runner/ContextFactory.scala b/engine/runner/src/main/scala/org/enso/runner/ContextFactory.scala index 89f6b148e6cd..7ca725a27292 100644 --- a/engine/runner/src/main/scala/org/enso/runner/ContextFactory.scala +++ b/engine/runner/src/main/scala/org/enso/runner/ContextFactory.scala @@ -42,6 +42,7 @@ class ContextFactory { .option(RuntimeOptions.PACKAGES_PATH, packagesPath) .option(RuntimeOptions.STRICT_ERRORS, strictErrors.toString) .option(DebugServerInfo.ENABLE_OPTION, "true") + .option("js.foreign-object-prototype", "true") .out(out) .in(in) .serverTransport { (uri, peer) => diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ArithmeticErrorToDisplayTextNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ArithmeticErrorToDisplayTextNode.java new file mode 100644 index 000000000000..b43b544e2a6f --- /dev/null +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ArithmeticErrorToDisplayTextNode.java @@ -0,0 +1,33 @@ +package org.enso.interpreter.node.expression.builtin.error.displaytext; + +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.nodes.UnexpectedResultException; +import org.enso.interpreter.dsl.BuiltinMethod; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.callable.atom.AtomConstructor; +import org.enso.interpreter.runtime.data.text.Text; +import org.enso.interpreter.runtime.type.TypesGen; + +@BuiltinMethod(type = "Compile_Error", name = "to_display_text") +public abstract class ArithmeticErrorToDisplayTextNode extends Node { + static ArithmeticErrorToDisplayTextNode build() { + return ArithmeticErrorToDisplayTextNodeGen.create(); + } + + abstract Text execute(Object _this); + + @Specialization + Text doAtom(Atom _this) { + try { + return Text.create("Arithmetic error: ", TypesGen.expectText(_this.getFields()[0])); + } catch (UnexpectedResultException e) { + return Text.create("Arithmetic error."); + } + } + + @Specialization + Text doConstructor(AtomConstructor _this) { + return Text.create("Arithmetic error."); + } +} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ArityErrorToDisplayTextNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ArityErrorToDisplayTextNode.java new file mode 100644 index 000000000000..9c3e0adcb7f1 --- /dev/null +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ArityErrorToDisplayTextNode.java @@ -0,0 +1,31 @@ +package org.enso.interpreter.node.expression.builtin.error.displaytext; + +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.dsl.BuiltinMethod; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.callable.atom.AtomConstructor; +import org.enso.interpreter.runtime.data.text.Text; + +@BuiltinMethod(type = "Compile_Error", name = "to_display_text") +public abstract class ArityErrorToDisplayTextNode extends Node { + static ArityErrorToDisplayTextNode build() { + return ArityErrorToDisplayTextNodeGen.create(); + } + + abstract Text execute(Object _this); + + @Specialization + Text doAtom(Atom _this) { + return Text.create("Wrong number of arguments. Expected ") + .add(String.valueOf(_this.getFields()[0])) + .add(", but got ") + .add(String.valueOf(_this.getFields()[1])) + .add("."); + } + + @Specialization + Text doConstructor(AtomConstructor _this) { + return Text.create("Wrong number of arguments."); + } +} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/CompileErrorToDisplayTextNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/CompileErrorToDisplayTextNode.java new file mode 100644 index 000000000000..9b4d898cb9f9 --- /dev/null +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/CompileErrorToDisplayTextNode.java @@ -0,0 +1,33 @@ +package org.enso.interpreter.node.expression.builtin.error.displaytext; + +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.nodes.UnexpectedResultException; +import org.enso.interpreter.dsl.BuiltinMethod; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.callable.atom.AtomConstructor; +import org.enso.interpreter.runtime.data.text.Text; +import org.enso.interpreter.runtime.type.TypesGen; + +@BuiltinMethod(type = "Compile_Error", name = "to_display_text") +public abstract class CompileErrorToDisplayTextNode extends Node { + static CompileErrorToDisplayTextNode build() { + return CompileErrorToDisplayTextNodeGen.create(); + } + + abstract Text execute(Object _this); + + @Specialization + Text doAtom(Atom _this) { + try { + return Text.create("Compile error: ", TypesGen.expectText(_this.getFields()[0])); + } catch (UnexpectedResultException e) { + return Text.create("Compile error."); + } + } + + @Specialization + Text doConstructor(AtomConstructor _this) { + return Text.create("Compile error."); + } +} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/InexhaustivePatternMatchErrorToDisplayTextNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/InexhaustivePatternMatchErrorToDisplayTextNode.java new file mode 100644 index 000000000000..56b3817e5cd4 --- /dev/null +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/InexhaustivePatternMatchErrorToDisplayTextNode.java @@ -0,0 +1,33 @@ +package org.enso.interpreter.node.expression.builtin.error.displaytext; + +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.nodes.UnexpectedResultException; +import org.enso.interpreter.dsl.BuiltinMethod; +import org.enso.interpreter.node.expression.builtin.text.util.TypeToDisplayTextNode; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.callable.atom.AtomConstructor; +import org.enso.interpreter.runtime.data.text.Text; +import org.enso.interpreter.runtime.type.TypesGen; + +@BuiltinMethod(type = "Type_Error", name = "to_display_text") +public abstract class InexhaustivePatternMatchErrorToDisplayTextNode extends Node { + static InexhaustivePatternMatchErrorToDisplayTextNode build() { + return InexhaustivePatternMatchErrorToDisplayTextNodeGen.create(); + } + + abstract Text execute(Object _this); + + @Specialization + Text doAtom(Atom _this, @Cached TypeToDisplayTextNode displayTypeNode) { + return Text.create("Inexhaustive pattern match: no branch matches ") + .add(displayTypeNode.execute(_this.getFields()[0])) + .add("."); + } + + @Specialization + Text doConstructor(AtomConstructor _this) { + return Text.create("Inexhaustive pattern match."); + } +} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/InvalidArrayIndexErrorToDisplayTextNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/InvalidArrayIndexErrorToDisplayTextNode.java new file mode 100644 index 000000000000..c507d8ee6925 --- /dev/null +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/InvalidArrayIndexErrorToDisplayTextNode.java @@ -0,0 +1,29 @@ +package org.enso.interpreter.node.expression.builtin.error.displaytext; + +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.nodes.UnexpectedResultException; +import org.enso.interpreter.dsl.BuiltinMethod; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.callable.atom.AtomConstructor; +import org.enso.interpreter.runtime.data.text.Text; +import org.enso.interpreter.runtime.type.TypesGen; + +@BuiltinMethod(type = "Compile_Error", name = "to_display_text") +public abstract class InvalidArrayIndexErrorToDisplayTextNode extends Node { + static InvalidArrayIndexErrorToDisplayTextNode build() { + return InvalidArrayIndexErrorToDisplayTextNodeGen.create(); + } + + abstract Text execute(Object _this); + + @Specialization + Text doAtom(Atom _this) { + return Text.create("Invalid array index: ", String.valueOf(_this.getFields()[1])); + } + + @Specialization + Text doConstructor(AtomConstructor _this) { + return Text.create("Invalid array index."); + } +} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ModuleDoesNotExistErrorToDisplayTextNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ModuleDoesNotExistErrorToDisplayTextNode.java new file mode 100644 index 000000000000..631dfd3caa8d --- /dev/null +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ModuleDoesNotExistErrorToDisplayTextNode.java @@ -0,0 +1,35 @@ +package org.enso.interpreter.node.expression.builtin.error.displaytext; + +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.nodes.UnexpectedResultException; +import org.enso.interpreter.dsl.BuiltinMethod; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.callable.atom.AtomConstructor; +import org.enso.interpreter.runtime.data.text.Text; +import org.enso.interpreter.runtime.type.TypesGen; + +@BuiltinMethod(type = "Syntax_Error", name = "to_display_text") +public abstract class ModuleDoesNotExistErrorToDisplayTextNode extends Node { + static ModuleDoesNotExistErrorToDisplayTextNode build() { + return ModuleDoesNotExistErrorToDisplayTextNodeGen.create(); + } + + abstract Text execute(Object _this); + + @Specialization + Text doAtom(Atom _this) { + try { + return Text.create("Module ") + .add(TypesGen.expectText(_this.getFields()[0])) + .add(" does not exist."); + } catch (UnexpectedResultException e) { + return Text.create("Module does not exist."); + } + } + + @Specialization + Text doConstructor(AtomConstructor _this) { + return Text.create("Module does not exist."); + } +} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ModuleNotInPackageErrorToDisplayTextNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ModuleNotInPackageErrorToDisplayTextNode.java new file mode 100644 index 000000000000..fa5e6400eb3e --- /dev/null +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ModuleNotInPackageErrorToDisplayTextNode.java @@ -0,0 +1,21 @@ +package org.enso.interpreter.node.expression.builtin.error.displaytext; + +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.UnsupportedMessageException; +import com.oracle.truffle.api.library.CachedLibrary; +import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.dsl.BuiltinMethod; +import org.enso.interpreter.node.expression.builtin.text.util.TypeToDisplayTextNode; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.callable.atom.AtomConstructor; +import org.enso.interpreter.runtime.data.text.Text; + +@BuiltinMethod(type = "Type_Error", name = "to_display_text") +public class ModuleNotInPackageErrorToDisplayTextNode extends Node { + + Text execute(Object _this) { + return Text.create("Module is not a part of a package."); + } +} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/NoSuchMethodErrorToDisplayTextNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/NoSuchMethodErrorToDisplayTextNode.java new file mode 100644 index 000000000000..984a714d1706 --- /dev/null +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/NoSuchMethodErrorToDisplayTextNode.java @@ -0,0 +1,39 @@ +package org.enso.interpreter.node.expression.builtin.error.displaytext; + +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.nodes.UnexpectedResultException; +import org.enso.interpreter.dsl.BuiltinMethod; +import org.enso.interpreter.node.expression.builtin.text.util.TypeToDisplayTextNode; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.callable.atom.AtomConstructor; +import org.enso.interpreter.runtime.data.text.Text; +import org.enso.interpreter.runtime.type.TypesGen; + +@BuiltinMethod(type = "Type_Error", name = "to_display_text") +public abstract class NoSuchMethodErrorToDisplayTextNode extends Node { + static NoSuchMethodErrorToDisplayTextNode build() { + return NoSuchMethodErrorToDisplayTextNodeGen.create(); + } + + abstract Text execute(Object _this); + + @Specialization + Text doAtom(Atom _this, @Cached TypeToDisplayTextNode displayTypeNode) { + try { + return Text.create("Method `") + .add(TypesGen.expectUnresolvedSymbol(_this.getFields()[1]).getName()) + .add("` of ") + .add(displayTypeNode.execute(_this.getFields()[0])) + .add(" could not be found."); + } catch (UnexpectedResultException e) { + return Text.create("Method could not be found."); + } + } + + @Specialization + Text doConstructor(AtomConstructor _this) { + return Text.create("Method could not be found."); + } +} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/NotInvokableErrorToDisplayTextNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/NotInvokableErrorToDisplayTextNode.java new file mode 100644 index 000000000000..791c4fee4cf0 --- /dev/null +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/NotInvokableErrorToDisplayTextNode.java @@ -0,0 +1,32 @@ +package org.enso.interpreter.node.expression.builtin.error.displaytext; + +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.nodes.UnexpectedResultException; +import org.enso.interpreter.dsl.BuiltinMethod; +import org.enso.interpreter.node.expression.builtin.text.util.TypeToDisplayTextNode; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.callable.atom.AtomConstructor; +import org.enso.interpreter.runtime.data.text.Text; +import org.enso.interpreter.runtime.type.TypesGen; + +@BuiltinMethod(type = "Type_Error", name = "to_display_text") +public abstract class NotInvokableErrorToDisplayTextNode extends Node { + static NotInvokableErrorToDisplayTextNode build() { + return NotInvokableErrorToDisplayTextNodeGen.create(); + } + + abstract Text execute(Object _this); + + @Specialization + Text doAtom(Atom _this, @Cached TypeToDisplayTextNode displayTypeNode) { + return Text.create("Type error: expected a function, but got ") + .add(displayTypeNode.execute(_this.getFields()[0])); + } + + @Specialization + Text doConstructor(AtomConstructor _this) { + return Text.create("Type error."); + } +} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/PolyglotErrorToDisplayTextNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/PolyglotErrorToDisplayTextNode.java new file mode 100644 index 000000000000..41f73da680c0 --- /dev/null +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/PolyglotErrorToDisplayTextNode.java @@ -0,0 +1,49 @@ +package org.enso.interpreter.node.expression.builtin.error.displaytext; + +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.UnsupportedMessageException; +import com.oracle.truffle.api.library.CachedLibrary; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.nodes.UnexpectedResultException; +import org.enso.interpreter.dsl.BuiltinMethod; +import org.enso.interpreter.node.expression.builtin.text.util.TypeToDisplayTextNode; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.callable.atom.AtomConstructor; +import org.enso.interpreter.runtime.data.text.Text; +import org.enso.interpreter.runtime.type.TypesGen; + +@BuiltinMethod(type = "Type_Error", name = "to_display_text") +public abstract class PolyglotErrorToDisplayTextNode extends Node { + static PolyglotErrorToDisplayTextNode build() { + return PolyglotErrorToDisplayTextNodeGen.create(); + } + + abstract Text execute(Object _this); + + @Specialization + Text doAtom( + Atom _this, + @Cached TypeToDisplayTextNode displayTypeNode, + @CachedLibrary(limit = "5") InteropLibrary exceptions, + @CachedLibrary(limit = "5") InteropLibrary strings) { + try { + Object cause = _this.getFields()[0]; + String rep; + if (exceptions.hasExceptionMessage(cause)) { + rep = strings.asString(exceptions.getExceptionCause(cause)); + } else { + rep = displayTypeNode.execute(cause); + } + return Text.create("Polyglot error: ").add(rep); + } catch (UnsupportedMessageException e) { + return Text.create("Polyglot error."); + } + } + + @Specialization + Text doConstructor(AtomConstructor _this) { + return Text.create("Polyglot error."); + } +} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/SyntaxErrorToDisplayTextNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/SyntaxErrorToDisplayTextNode.java new file mode 100644 index 000000000000..3e27a700fd87 --- /dev/null +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/SyntaxErrorToDisplayTextNode.java @@ -0,0 +1,33 @@ +package org.enso.interpreter.node.expression.builtin.error.displaytext; + +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.nodes.UnexpectedResultException; +import org.enso.interpreter.dsl.BuiltinMethod; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.callable.atom.AtomConstructor; +import org.enso.interpreter.runtime.data.text.Text; +import org.enso.interpreter.runtime.type.TypesGen; + +@BuiltinMethod(type = "Syntax_Error", name = "to_display_text") +public abstract class SyntaxErrorToDisplayTextNode extends Node { + static SyntaxErrorToDisplayTextNode build() { + return SyntaxErrorToDisplayTextNodeGen.create(); + } + + abstract Text execute(Object _this); + + @Specialization + Text doAtom(Atom _this) { + try { + return Text.create("Syntax error: ", TypesGen.expectText(_this.getFields()[0])); + } catch (UnexpectedResultException e) { + return Text.create("Syntax error."); + } + } + + @Specialization + Text doConstructor(AtomConstructor _this) { + return Text.create("Syntax error."); + } +} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/TypeErrorToDisplayTextNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/TypeErrorToDisplayTextNode.java new file mode 100644 index 000000000000..e098a81b0114 --- /dev/null +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/TypeErrorToDisplayTextNode.java @@ -0,0 +1,41 @@ +package org.enso.interpreter.node.expression.builtin.error.displaytext; + +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.nodes.UnexpectedResultException; +import org.enso.interpreter.dsl.BuiltinMethod; +import org.enso.interpreter.node.expression.builtin.text.util.TypeToDisplayTextNode; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.callable.atom.AtomConstructor; +import org.enso.interpreter.runtime.data.text.Text; +import org.enso.interpreter.runtime.type.TypesGen; + +@BuiltinMethod(type = "Type_Error", name = "to_display_text") +public abstract class TypeErrorToDisplayTextNode extends Node { + static TypeErrorToDisplayTextNode build() { + return TypeErrorToDisplayTextNodeGen.create(); + } + + abstract Text execute(Object _this); + + @Specialization + Text doAtom(Atom _this, @Cached TypeToDisplayTextNode displayTypeNode) { + try { + return Text.create("Type error: expected ") + .add(TypesGen.expectText(_this.getFields()[2])) + .add(" to be ") + .add(displayTypeNode.execute(_this.getFields()[0])) + .add(", but got ") + .add(displayTypeNode.execute(_this.getFields()[1])) + .add("."); + } catch (UnexpectedResultException e) { + return Text.create("Type error."); + } + } + + @Specialization + Text doConstructor(AtomConstructor _this) { + return Text.create("Type error."); + } +} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/UninitializedStateErrorToDisplayTextNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/UninitializedStateErrorToDisplayTextNode.java new file mode 100644 index 000000000000..39784d007b31 --- /dev/null +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/UninitializedStateErrorToDisplayTextNode.java @@ -0,0 +1,31 @@ +package org.enso.interpreter.node.expression.builtin.error.displaytext; + +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.dsl.BuiltinMethod; +import org.enso.interpreter.node.expression.builtin.text.util.TypeToDisplayTextNode; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.callable.atom.AtomConstructor; +import org.enso.interpreter.runtime.data.text.Text; + +@BuiltinMethod(type = "Type_Error", name = "to_display_text") +public abstract class UninitializedStateErrorToDisplayTextNode extends Node { + static UninitializedStateErrorToDisplayTextNode build() { + return UninitializedStateErrorToDisplayTextNodeGen.create(); + } + + abstract Text execute(Object _this); + + @Specialization + Text doAtom(Atom _this, @Cached TypeToDisplayTextNode displayTypeNode) { + return Text.create("State is not initialized for type ") + .add(displayTypeNode.execute(_this.getFields()[0])) + .add("."); + } + + @Specialization + Text doConstructor(AtomConstructor _this) { + return Text.create("Uninitialized state error."); + } +} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/UnsupportedArgumentTypesToDisplayTextNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/UnsupportedArgumentTypesToDisplayTextNode.java new file mode 100644 index 000000000000..0e452627c514 --- /dev/null +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/UnsupportedArgumentTypesToDisplayTextNode.java @@ -0,0 +1,32 @@ +package org.enso.interpreter.node.expression.builtin.error.displaytext; + +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.nodes.UnexpectedResultException; +import org.enso.interpreter.dsl.BuiltinMethod; +import org.enso.interpreter.node.expression.builtin.text.util.TypeToDisplayTextNode; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.callable.atom.AtomConstructor; +import org.enso.interpreter.runtime.data.text.Text; +import org.enso.interpreter.runtime.type.TypesGen; + +@BuiltinMethod(type = "Type_Error", name = "to_display_text") +public abstract class UnsupportedArgumentTypesToDisplayTextNode extends Node { + static UnsupportedArgumentTypesToDisplayTextNode build() { + return UnsupportedArgumentTypesToDisplayTextNodeGen.create(); + } + + abstract Text execute(Object _this); + + @Specialization + Text doAtom(Atom _this, @Cached TypeToDisplayTextNode displayTypeNode) { + return Text.create("Unsupported argument types: ") + .add(displayTypeNode.execute(_this.getFields()[0])); + } + + @Specialization + Text doConstructor(AtomConstructor _this) { + return Text.create("Unsupported argument types."); + } +} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/text/AnyToDisplayTextNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/text/AnyToDisplayTextNode.java new file mode 100644 index 000000000000..12f7f0a0e701 --- /dev/null +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/text/AnyToDisplayTextNode.java @@ -0,0 +1,27 @@ +package org.enso.interpreter.node.expression.builtin.text; + +import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.UnsupportedMessageException; +import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.dsl.BuiltinMethod; +import org.enso.interpreter.node.expression.builtin.text.util.TypeToDisplayTextNode; +import org.enso.interpreter.runtime.callable.atom.Atom; +import org.enso.interpreter.runtime.data.text.Text; + +@BuiltinMethod(type = "Any", name = "to_display_text") +public abstract class AnyToDisplayTextNode extends Node { + static AnyToDisplayTextNode build() { + return AnyToDisplayTextNodeGen.create(); + } + + abstract Text execute(Object _this); + + @Specialization + Text doShowType(Object _this, @Cached TypeToDisplayTextNode typeToDisplayTextNode) { + return Text.create(typeToDisplayTextNode.execute(_this)); + } +} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/text/util/TypeToDisplayTextNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/text/util/TypeToDisplayTextNode.java new file mode 100644 index 000000000000..1d18eb2b8203 --- /dev/null +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/text/util/TypeToDisplayTextNode.java @@ -0,0 +1,60 @@ +package org.enso.interpreter.node.expression.builtin.text.util; + +import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.UnsupportedMessageException; +import com.oracle.truffle.api.library.CachedLibrary; +import com.oracle.truffle.api.nodes.Node; +import org.enso.interpreter.runtime.type.TypesGen; + +@GenerateUncached +public abstract class TypeToDisplayTextNode extends Node { + public abstract String execute(Object o); + + @Specialization + @CompilerDirectives.TruffleBoundary + String doDisplay( + Object value, + @CachedLibrary(limit = "5") InteropLibrary objects, + @CachedLibrary(limit = "5") InteropLibrary displays, + @CachedLibrary(limit = "5") InteropLibrary strings) { + if (TypesGen.isLong(value)) { + return value + " (Integer)"; + } else if (TypesGen.isEnsoBigInteger(value)) { + return "Integer"; + } else if (TypesGen.isDouble(value)) { + return value + " (Decimal)"; + } else if (TypesGen.isBoolean(value)) { + return (TypesGen.asBoolean(value) ? "True" : "False"); + } else if (TypesGen.isText(value)) { + return "Text"; + } else if (TypesGen.isFunction(value)) { + return "Function"; + } else if (TypesGen.isAtom(value)) { + return TypesGen.asAtom(value).getConstructor().getName(); + } else if (TypesGen.isAtomConstructor(value)) { + return TypesGen.asAtomConstructor(value).getName(); + } else if (TypesGen.isDataflowError(value)) { + return "Error"; + } else if (TypesGen.isUnresolvedSymbol(value)) { + return TypesGen.asUnresolvedSymbol(value).getName() + " (Unresolved_Symbol)"; + } else if (TypesGen.isManagedResource(value)) { + return "Managed_Resource"; + } else if (TypesGen.isArray(value)) { + return "Array"; + } else if (TypesGen.isRef(value)) { + return "Ref"; + } else if (objects.hasMetaObject(value)) { + try { + return strings.asString(displays.toDisplayString(objects.getMetaObject(value))); + } catch (UnsupportedMessageException e) { + throw new IllegalStateException( + "Receiver declares a meta object, but does not it return it."); + } + } else { + return "a polyglot object"; + } + } +} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/Builtins.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/Builtins.java index f02f596b141c..b39e2c1009f9 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/Builtins.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/Builtins.java @@ -28,6 +28,7 @@ import org.enso.interpreter.node.expression.builtin.state.GetStateMethodGen; import org.enso.interpreter.node.expression.builtin.state.PutStateMethodGen; import org.enso.interpreter.node.expression.builtin.state.RunStateMethodGen; +import org.enso.interpreter.node.expression.builtin.text.AnyToDisplayTextMethodGen; import org.enso.interpreter.node.expression.builtin.text.AnyToTextMethodGen; import org.enso.interpreter.node.expression.builtin.thread.WithInterruptHandlerMethodGen; import org.enso.interpreter.node.expression.builtin.unsafe.SetAtomFieldMethodGen; @@ -163,6 +164,7 @@ public Builtins(Context context) { scope.registerMethod(function, "call", ExplicitCallFunctionMethodGen.makeFunction(language)); scope.registerMethod(any, "to_text", AnyToTextMethodGen.makeFunction(language)); + scope.registerMethod(any, "to_display_text", AnyToDisplayTextMethodGen.makeFunction(language)); scope.registerMethod(java, "add_to_class_path", AddToClassPathMethodGen.makeFunction(language)); scope.registerMethod(java, "lookup_class", LookupClassMethodGen.makeFunction(language)); diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/Error.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/Error.java index 3d08bda06a5a..1703fe673d89 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/Error.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/Error.java @@ -1,6 +1,7 @@ package org.enso.interpreter.runtime.builtin; import org.enso.interpreter.Language; +import org.enso.interpreter.node.expression.builtin.error.displaytext.*; import org.enso.interpreter.runtime.callable.UnresolvedSymbol; import org.enso.interpreter.runtime.callable.argument.ArgumentDefinition; import org.enso.interpreter.runtime.callable.atom.Atom; @@ -24,7 +25,6 @@ public class Error { private final AtomConstructor arityError; private final AtomConstructor unsupportedArgumentsError; private final AtomConstructor moduleDoesNotExistError; - private final AtomConstructor duplicateArgumentNameError; private final AtomConstructor notInvokableError; private final Atom arithmeticErrorShiftTooBig; @@ -88,7 +88,7 @@ public Error(Language language, ModuleScope scope) { new AtomConstructor("Arity_Error", scope) .initializeFields( new ArgumentDefinition(0, "expected", ArgumentDefinition.ExecutionMode.EXECUTE), - new ArgumentDefinition(0, "actual", ArgumentDefinition.ExecutionMode.EXECUTE)); + new ArgumentDefinition(1, "actual", ArgumentDefinition.ExecutionMode.EXECUTE)); unsupportedArgumentsError = new AtomConstructor("Unsupported_Argument_Types", scope) @@ -98,28 +98,63 @@ public Error(Language language, ModuleScope scope) { new AtomConstructor("Module_Does_Not_Exist", scope) .initializeFields( new ArgumentDefinition(0, "name", ArgumentDefinition.ExecutionMode.EXECUTE)); - duplicateArgumentNameError = - new AtomConstructor("Duplicate_Argument_Name", scope) - .initializeFields( - new ArgumentDefinition(0, "name", ArgumentDefinition.ExecutionMode.EXECUTE)); notInvokableError = new AtomConstructor("Not_Invokable", scope) .initializeFields( new ArgumentDefinition(0, "target", ArgumentDefinition.ExecutionMode.EXECUTE)); + scope.registerConstructor(arityError); + scope.registerMethod( + arityError, "to_display_text", ArityErrorToDisplayTextMethodGen.makeFunction(language)); scope.registerConstructor(syntaxError); + scope.registerMethod( + syntaxError, "to_display_text", SyntaxErrorToDisplayTextMethodGen.makeFunction(language)); scope.registerConstructor(typeError); + scope.registerMethod( + typeError, "to_display_text", TypeErrorToDisplayTextMethodGen.makeFunction(language)); scope.registerConstructor(compileError); + scope.registerMethod( + compileError, "to_display_text", CompileErrorToDisplayTextMethodGen.makeFunction(language)); scope.registerConstructor(inexhaustivePatternMatchError); + scope.registerMethod( + inexhaustivePatternMatchError, + "to_display_text", + InexhaustivePatternMatchErrorToDisplayTextMethodGen.makeFunction(language)); scope.registerConstructor(uninitializedState); + scope.registerMethod( + uninitializedState, + "to_display_text", + UninitializedStateErrorToDisplayTextMethodGen.makeFunction(language)); scope.registerConstructor(noSuchMethodError); + scope.registerMethod( + noSuchMethodError, + "to_display_text", + NoSuchMethodErrorToDisplayTextMethodGen.makeFunction(language)); scope.registerConstructor(polyglotError); + scope.registerMethod( + polyglotError, + "to_display_text", + PolyglotErrorToDisplayTextMethodGen.makeFunction(language)); scope.registerConstructor(moduleNotInPackageError); + scope.registerMethod( + moduleNotInPackageError, + "to_display_text", + ModuleNotInPackageErrorToDisplayTextMethodGen.makeFunction(language)); scope.registerConstructor(arithmeticError); + scope.registerMethod( + arithmeticError, + "to_display_text", + ArithmeticErrorToDisplayTextMethodGen.makeFunction(language)); scope.registerConstructor(invalidArrayIndexError); - scope.registerConstructor(typeError); - scope.registerConstructor(arityError); + scope.registerMethod( + invalidArrayIndexError, + "to_display_text", + InvalidArrayIndexErrorToDisplayTextMethodGen.makeFunction(language)); scope.registerConstructor(unsupportedArgumentsError); + scope.registerMethod( + unsupportedArgumentsError, + "to_display_text", + UnsupportedArgumentTypesToDisplayTextMethodGen.makeFunction(language)); } /** @return the builtin {@code Syntax_Error} atom constructor. */ @@ -237,15 +272,7 @@ public Atom makeUnsupportedArgumentsError(Object[] args) { * @return a module does not exist error */ public Atom makeModuleDoesNotExistError(String name) { - return moduleDoesNotExistError.newInstance(name); - } - - /** - * @param name the name of the duplicated argument - * @return a duplicate argument name error - */ - public Atom makeDuplicateArgumentNameError(String name) { - return duplicateArgumentNameError.newInstance(name); + return moduleDoesNotExistError.newInstance(Text.create(name)); } /** diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/text/Text.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/text/Text.java index 527857ab5d0c..0d182187dea5 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/text/Text.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/text/Text.java @@ -69,6 +69,36 @@ public static Text create(Text t1, String t2) { return new Text(new ConcatRope(t1.contents, t2)); } + /** + * Creates a new Text by concatenating a text and a string. + * + * @param t1 the left operand. + * @param t2 the right operand. + * @return a Text representing concatenation of t1 and t2. + */ + public static Text create(String t1, Text t2) { + return new Text(new ConcatRope(t1, t2.contents)); + } + + /** + * Creates a new Text by concatenating two strings. + * + * @param t1 the left operand. + * @param t2 the right operand. + * @return a Text representing concatenation of t1 and t2. + */ + public static Text create(String t1, String t2) { + return new Text(new ConcatRope(t1, t2)); + } + + public Text add(String other) { + return new Text(new ConcatRope(this.contents, other)); + } + + public Text add(Text other) { + return new Text(new ConcatRope(this.contents, other.contents)); + } + @ExportMessage boolean isString() { return true; diff --git a/engine/runtime/src/main/java/org/enso/interpreter/service/ExecutionService.java b/engine/runtime/src/main/java/org/enso/interpreter/service/ExecutionService.java index c9c9c7d5005f..1d2944925e00 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/service/ExecutionService.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/service/ExecutionService.java @@ -11,10 +11,12 @@ import org.enso.interpreter.instrument.MethodCallsCache; import org.enso.interpreter.instrument.RuntimeCache; import org.enso.interpreter.node.callable.FunctionCallInstrumentationNode; +import org.enso.interpreter.node.expression.builtin.text.util.TypeToDisplayTextNodeGen; import org.enso.interpreter.runtime.Context; import org.enso.interpreter.runtime.Module; import org.enso.interpreter.runtime.callable.atom.AtomConstructor; import org.enso.interpreter.runtime.callable.function.Function; +import org.enso.interpreter.runtime.error.PanicException; import org.enso.interpreter.runtime.scope.ModuleScope; import org.enso.interpreter.runtime.state.data.EmptyMap; import org.enso.interpreter.service.error.*; @@ -311,4 +313,22 @@ public SourceSection getSourceLocation(Object o) { } return null; } + + public String getExceptionMessage(PanicException panic) { + try { + return interopLibrary.asString( + interopLibrary.invokeMember(panic.getPayload(), "to_display_text")); + } catch (UnsupportedMessageException + | ArityException + | UnknownIdentifierException + | UnsupportedTypeException e) { + return TypeToDisplayTextNodeGen.getUncached().execute(panic.getPayload()); + } catch (Throwable e) { + if (interopLibrary.isException(e)) { + return TypeToDisplayTextNodeGen.getUncached().execute(panic.getPayload()); + } else { + throw e; + } + } + } } diff --git a/engine/runtime/src/main/resources/Builtins.enso b/engine/runtime/src/main/resources/Builtins.enso index d22edc1974bd..76514da8033c 100644 --- a/engine/runtime/src/main/resources/Builtins.enso +++ b/engine/runtime/src/main/resources/Builtins.enso @@ -264,6 +264,15 @@ type Compile_Error message @Builtin_Type type Inexhaustive_Pattern_Match_Error scrutinee +## The error thrown when the number of arguments provided to an operation + does not match the expected number of arguments. + + Arguments: + - expected: the expected number of arguments. + - actual: the actual number of arguments passed. +@Builtin_Type +type Arity_Error expected actual + ## The error thrown when the program attempts to read from a state slot that has not yet been initialized. diff --git a/engine/runtime/src/main/scala/org/enso/compiler/codegen/IrToTruffle.scala b/engine/runtime/src/main/scala/org/enso/compiler/codegen/IrToTruffle.scala index 70727375c76a..fc023ed8f49e 100644 --- a/engine/runtime/src/main/scala/org/enso/compiler/codegen/IrToTruffle.scala +++ b/engine/runtime/src/main/scala/org/enso/compiler/codegen/IrToTruffle.scala @@ -63,7 +63,6 @@ import org.enso.interpreter.runtime.callable.function.{ Function => RuntimeFunction } import org.enso.interpreter.runtime.data.text.Text -import org.enso.interpreter.runtime.error.PanicException import org.enso.interpreter.runtime.scope.{ FramePointer, LocalScope, @@ -1052,9 +1051,9 @@ class IrToTruffle( val argName = arg.getName if (seenArgNames contains argName) { - val err = - context.getBuiltins.error.makeDuplicateArgumentNameError(argName) - throw new PanicException(err, null) + throw new IllegalStateException( + "A duplicate argument name found during codegen." + ) } else seenArgNames.add(argName) slot } diff --git a/engine/runtime/src/main/scala/org/enso/interpreter/instrument/job/ProgramExecutionSupport.scala b/engine/runtime/src/main/scala/org/enso/interpreter/instrument/job/ProgramExecutionSupport.scala index ca5919f324b0..16fc51bad382 100644 --- a/engine/runtime/src/main/scala/org/enso/interpreter/instrument/job/ProgramExecutionSupport.scala +++ b/engine/runtime/src/main/scala/org/enso/interpreter/instrument/job/ProgramExecutionSupport.scala @@ -328,7 +328,7 @@ trait ProgramExecutionSupport { case sentinel: PanicSentinel => Api.ExpressionUpdate.Payload .Panic( - sentinel.getPanic.getMessage, + ctx.executionService.getExceptionMessage(sentinel.getPanic), ErrorResolver.getStackTrace(sentinel).flatMap(_.expressionId) ) case error: DataflowError => diff --git a/engine/runtime/src/test/scala/org/enso/interpreter/test/instrument/ExpressionErrorsTest.scala b/engine/runtime/src/test/scala/org/enso/interpreter/test/instrument/ExpressionErrorsTest.scala index a972f99b04b6..8aef114a39b9 100644 --- a/engine/runtime/src/test/scala/org/enso/interpreter/test/instrument/ExpressionErrorsTest.scala +++ b/engine/runtime/src/test/scala/org/enso/interpreter/test/instrument/ExpressionErrorsTest.scala @@ -240,7 +240,7 @@ class ExpressionErrorsTest contextId, xId, Api.ExpressionUpdate.Payload.Panic( - "Compile_Error Variable `undefined` is not defined.", + "Compile error: Variable `undefined` is not defined.", Seq(xId) ) ), @@ -248,7 +248,7 @@ class ExpressionErrorsTest contextId, fooBodyId, Api.ExpressionUpdate.Payload.Panic( - "Compile_Error Variable `undefined` is not defined.", + "Compile error: Variable `undefined` is not defined.", Seq(xId) ) ), @@ -256,7 +256,7 @@ class ExpressionErrorsTest contextId, yId, Api.ExpressionUpdate.Payload.Panic( - "Compile_Error Variable `undefined` is not defined.", + "Compile error: Variable `undefined` is not defined.", Seq(xId) ) ), @@ -264,7 +264,7 @@ class ExpressionErrorsTest contextId, mainResId, Api.ExpressionUpdate.Payload.Panic( - "Compile_Error Variable `undefined` is not defined.", + "Compile error: Variable `undefined` is not defined.", Seq(xId) ) ), @@ -333,7 +333,7 @@ class ExpressionErrorsTest mainBodyId, Api.MethodPointer("Test.Main", "Test.Main", "foo"), Api.ExpressionUpdate.Payload.Panic( - "Compile_Error Variable `x` is not defined.", + "Compile error: Variable `x` is not defined.", Seq(mainBodyId) ) ), @@ -487,7 +487,7 @@ class ExpressionErrorsTest contextId, xId, Api.ExpressionUpdate.Payload.Panic( - "Compile_Error Variable `undefined` is not defined.", + "Compile error: Variable `undefined` is not defined.", Seq(xId) ) ), diff --git a/engine/runtime/src/test/scala/org/enso/interpreter/test/semantic/TextTest.scala b/engine/runtime/src/test/scala/org/enso/interpreter/test/semantic/TextTest.scala index 472f22502d73..748030d473c2 100644 --- a/engine/runtime/src/test/scala/org/enso/interpreter/test/semantic/TextTest.scala +++ b/engine/runtime/src/test/scala/org/enso/interpreter/test/semantic/TextTest.scala @@ -101,5 +101,31 @@ class TextTest extends InterpreterTest { eval(code) shouldEqual "foobarbaz yay!" } + + "support converting values to display texts" in { + val code = + """ + |from Builtins import all + | + |main = + | IO.println (Cons Nothing Nothing).to_display_text + | IO.println (Syntax_Error "foo").to_display_text + | IO.println (Type_Error Nothing Text "myvar").to_display_text + | IO.println (Compile_Error "error :(").to_display_text + | IO.println (Inexhaustive_Pattern_Match_Error 32).to_display_text + | IO.println (Arithmetic_Error "cannot frobnicate quaternions").to_display_text + | IO.println (Arity_Error 10 20).to_display_text + |""".stripMargin + eval(code) + consumeOut shouldEqual List( + "Cons", + "Syntax error: foo", + "Type error: expected myvar to be Nothing, but got Text.", + "Compile error: error :(", + "Inexhaustive pattern match: no branch matches 32 (Integer).", + "Arithmetic error: cannot frobnicate quaternions", + "Wrong number of arguments. Expected 10, but got 20." + ) + } } } diff --git a/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/BuiltinMethod.java b/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/BuiltinMethod.java index 03410907cf47..da182696c980 100644 --- a/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/BuiltinMethod.java +++ b/lib/scala/interpreter-dsl/src/main/java/org/enso/interpreter/dsl/BuiltinMethod.java @@ -16,5 +16,5 @@ String name(); /** @return a short description of this method. */ - String description(); + String description() default ""; } diff --git a/test/Tests/src/Semantic/Error_Spec.enso b/test/Tests/src/Semantic/Error_Spec.enso index ad428454aaae..036b4a277ce5 100644 --- a/test/Tests/src/Semantic/Error_Spec.enso +++ b/test/Tests/src/Semantic/Error_Spec.enso @@ -19,6 +19,6 @@ spec = err_3.target.to_text.should_equal "(My_Type False)" err_3.method_name.should_equal "nope" Test.group "Dataflow Errors" <| - Test.specify "should be able to be displayed" <| - json = (Error.throw <| My_Type "aaa").to_display + Test.specify "should be able to be shown in the default visualization" <| + json = (Error.throw <| My_Type "aaa").to_default_visualization_data json . should_equal <| (Json.from_pairs [["foo", "aaa"], ["type", "My_Type"]]).to_text From 70c044d7e50baec4515b557c6923102ce986a3c1 Mon Sep 17 00:00:00 2001 From: Marcin Kostrzewa Date: Mon, 22 Feb 2021 15:13:37 +0100 Subject: [PATCH 2/5] foo --- .../displaytext/ArithmeticErrorToDisplayTextNode.java | 2 +- .../error/displaytext/ArityErrorToDisplayTextNode.java | 2 +- ...InexhaustivePatternMatchErrorToDisplayTextNode.java | 2 +- .../InvalidArrayIndexErrorToDisplayTextNode.java | 2 +- .../ModuleDoesNotExistErrorToDisplayTextNode.java | 2 +- .../ModuleNotInPackageErrorToDisplayTextNode.java | 2 +- .../NoSuchMethodErrorToDisplayTextNode.java | 2 +- .../NotInvokableErrorToDisplayTextNode.java | 2 +- .../displaytext/PolyglotErrorToDisplayTextNode.java | 2 +- .../UninitializedStateErrorToDisplayTextNode.java | 2 +- .../UnsupportedArgumentTypesToDisplayTextNode.java | 2 +- .../org/enso/interpreter/runtime/data/text/Text.java | 10 ++++++++++ .../org/enso/interpreter/service/ExecutionService.java | 6 ++++++ 13 files changed, 27 insertions(+), 11 deletions(-) diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ArithmeticErrorToDisplayTextNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ArithmeticErrorToDisplayTextNode.java index b43b544e2a6f..0ee47429a798 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ArithmeticErrorToDisplayTextNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ArithmeticErrorToDisplayTextNode.java @@ -9,7 +9,7 @@ import org.enso.interpreter.runtime.data.text.Text; import org.enso.interpreter.runtime.type.TypesGen; -@BuiltinMethod(type = "Compile_Error", name = "to_display_text") +@BuiltinMethod(type = "Arithmetic_Error", name = "to_display_text") public abstract class ArithmeticErrorToDisplayTextNode extends Node { static ArithmeticErrorToDisplayTextNode build() { return ArithmeticErrorToDisplayTextNodeGen.create(); diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ArityErrorToDisplayTextNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ArityErrorToDisplayTextNode.java index 9c3e0adcb7f1..9c6354a16140 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ArityErrorToDisplayTextNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ArityErrorToDisplayTextNode.java @@ -7,7 +7,7 @@ import org.enso.interpreter.runtime.callable.atom.AtomConstructor; import org.enso.interpreter.runtime.data.text.Text; -@BuiltinMethod(type = "Compile_Error", name = "to_display_text") +@BuiltinMethod(type = "Arity_Error", name = "to_display_text") public abstract class ArityErrorToDisplayTextNode extends Node { static ArityErrorToDisplayTextNode build() { return ArityErrorToDisplayTextNodeGen.create(); diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/InexhaustivePatternMatchErrorToDisplayTextNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/InexhaustivePatternMatchErrorToDisplayTextNode.java index 56b3817e5cd4..264418aefbf6 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/InexhaustivePatternMatchErrorToDisplayTextNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/InexhaustivePatternMatchErrorToDisplayTextNode.java @@ -11,7 +11,7 @@ import org.enso.interpreter.runtime.data.text.Text; import org.enso.interpreter.runtime.type.TypesGen; -@BuiltinMethod(type = "Type_Error", name = "to_display_text") +@BuiltinMethod(type = "Inexhaustive_Pattern_Match_Error", name = "to_display_text") public abstract class InexhaustivePatternMatchErrorToDisplayTextNode extends Node { static InexhaustivePatternMatchErrorToDisplayTextNode build() { return InexhaustivePatternMatchErrorToDisplayTextNodeGen.create(); diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/InvalidArrayIndexErrorToDisplayTextNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/InvalidArrayIndexErrorToDisplayTextNode.java index c507d8ee6925..450ac5c0ef67 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/InvalidArrayIndexErrorToDisplayTextNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/InvalidArrayIndexErrorToDisplayTextNode.java @@ -9,7 +9,7 @@ import org.enso.interpreter.runtime.data.text.Text; import org.enso.interpreter.runtime.type.TypesGen; -@BuiltinMethod(type = "Compile_Error", name = "to_display_text") +@BuiltinMethod(type = "Invalid_Array_Index_Error", name = "to_display_text") public abstract class InvalidArrayIndexErrorToDisplayTextNode extends Node { static InvalidArrayIndexErrorToDisplayTextNode build() { return InvalidArrayIndexErrorToDisplayTextNodeGen.create(); diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ModuleDoesNotExistErrorToDisplayTextNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ModuleDoesNotExistErrorToDisplayTextNode.java index 631dfd3caa8d..9e9753f7b187 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ModuleDoesNotExistErrorToDisplayTextNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ModuleDoesNotExistErrorToDisplayTextNode.java @@ -9,7 +9,7 @@ import org.enso.interpreter.runtime.data.text.Text; import org.enso.interpreter.runtime.type.TypesGen; -@BuiltinMethod(type = "Syntax_Error", name = "to_display_text") +@BuiltinMethod(type = "Module_Does_Not_Exist_Error", name = "to_display_text") public abstract class ModuleDoesNotExistErrorToDisplayTextNode extends Node { static ModuleDoesNotExistErrorToDisplayTextNode build() { return ModuleDoesNotExistErrorToDisplayTextNodeGen.create(); diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ModuleNotInPackageErrorToDisplayTextNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ModuleNotInPackageErrorToDisplayTextNode.java index fa5e6400eb3e..5821c5172bed 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ModuleNotInPackageErrorToDisplayTextNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/ModuleNotInPackageErrorToDisplayTextNode.java @@ -12,7 +12,7 @@ import org.enso.interpreter.runtime.callable.atom.AtomConstructor; import org.enso.interpreter.runtime.data.text.Text; -@BuiltinMethod(type = "Type_Error", name = "to_display_text") +@BuiltinMethod(type = "Module_Not_In_Package_Error", name = "to_display_text") public class ModuleNotInPackageErrorToDisplayTextNode extends Node { Text execute(Object _this) { diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/NoSuchMethodErrorToDisplayTextNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/NoSuchMethodErrorToDisplayTextNode.java index 984a714d1706..88e24c3fa217 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/NoSuchMethodErrorToDisplayTextNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/NoSuchMethodErrorToDisplayTextNode.java @@ -11,7 +11,7 @@ import org.enso.interpreter.runtime.data.text.Text; import org.enso.interpreter.runtime.type.TypesGen; -@BuiltinMethod(type = "Type_Error", name = "to_display_text") +@BuiltinMethod(type = "No_Such_Method_Error", name = "to_display_text") public abstract class NoSuchMethodErrorToDisplayTextNode extends Node { static NoSuchMethodErrorToDisplayTextNode build() { return NoSuchMethodErrorToDisplayTextNodeGen.create(); diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/NotInvokableErrorToDisplayTextNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/NotInvokableErrorToDisplayTextNode.java index 791c4fee4cf0..446d768ba904 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/NotInvokableErrorToDisplayTextNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/NotInvokableErrorToDisplayTextNode.java @@ -11,7 +11,7 @@ import org.enso.interpreter.runtime.data.text.Text; import org.enso.interpreter.runtime.type.TypesGen; -@BuiltinMethod(type = "Type_Error", name = "to_display_text") +@BuiltinMethod(type = "Not_Invokable_Error", name = "to_display_text") public abstract class NotInvokableErrorToDisplayTextNode extends Node { static NotInvokableErrorToDisplayTextNode build() { return NotInvokableErrorToDisplayTextNodeGen.create(); diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/PolyglotErrorToDisplayTextNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/PolyglotErrorToDisplayTextNode.java index 41f73da680c0..eec8c2e0bd5d 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/PolyglotErrorToDisplayTextNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/PolyglotErrorToDisplayTextNode.java @@ -14,7 +14,7 @@ import org.enso.interpreter.runtime.data.text.Text; import org.enso.interpreter.runtime.type.TypesGen; -@BuiltinMethod(type = "Type_Error", name = "to_display_text") +@BuiltinMethod(type = "Polyglot_Error", name = "to_display_text") public abstract class PolyglotErrorToDisplayTextNode extends Node { static PolyglotErrorToDisplayTextNode build() { return PolyglotErrorToDisplayTextNodeGen.create(); diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/UninitializedStateErrorToDisplayTextNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/UninitializedStateErrorToDisplayTextNode.java index 39784d007b31..def865f9bc70 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/UninitializedStateErrorToDisplayTextNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/UninitializedStateErrorToDisplayTextNode.java @@ -9,7 +9,7 @@ import org.enso.interpreter.runtime.callable.atom.AtomConstructor; import org.enso.interpreter.runtime.data.text.Text; -@BuiltinMethod(type = "Type_Error", name = "to_display_text") +@BuiltinMethod(type = "Uninitialized_State_Error", name = "to_display_text") public abstract class UninitializedStateErrorToDisplayTextNode extends Node { static UninitializedStateErrorToDisplayTextNode build() { return UninitializedStateErrorToDisplayTextNodeGen.create(); diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/UnsupportedArgumentTypesToDisplayTextNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/UnsupportedArgumentTypesToDisplayTextNode.java index 0e452627c514..d85ff10b6316 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/UnsupportedArgumentTypesToDisplayTextNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/displaytext/UnsupportedArgumentTypesToDisplayTextNode.java @@ -11,7 +11,7 @@ import org.enso.interpreter.runtime.data.text.Text; import org.enso.interpreter.runtime.type.TypesGen; -@BuiltinMethod(type = "Type_Error", name = "to_display_text") +@BuiltinMethod(type = "Unsupported_Argument_Types", name = "to_display_text") public abstract class UnsupportedArgumentTypesToDisplayTextNode extends Node { static UnsupportedArgumentTypesToDisplayTextNode build() { return UnsupportedArgumentTypesToDisplayTextNodeGen.create(); diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/text/Text.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/text/Text.java index 0d182187dea5..368760e02a3c 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/text/Text.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/text/Text.java @@ -91,10 +91,20 @@ public static Text create(String t1, String t2) { return new Text(new ConcatRope(t1, t2)); } + /** + * Adds a string to this text. + * @param other the string add. + * @return the concatenation of this and the requested string. + */ public Text add(String other) { return new Text(new ConcatRope(this.contents, other)); } + /** + * Adds a text to this text. + * @param other the text add. + * @return the concatenation of this and the requested text. + */ public Text add(Text other) { return new Text(new ConcatRope(this.contents, other.contents)); } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/service/ExecutionService.java b/engine/runtime/src/main/java/org/enso/interpreter/service/ExecutionService.java index 1d2944925e00..6a0d6d5a2aee 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/service/ExecutionService.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/service/ExecutionService.java @@ -314,6 +314,12 @@ public SourceSection getSourceLocation(Object o) { return null; } + /** + * Returns a human-readable message for a panic exception. + * + * @param panic the panic to display. + * @return a human-readable version of its contents. + */ public String getExceptionMessage(PanicException panic) { try { return interopLibrary.asString( From 69524834381669c7d4e600652c3ec11215f7791f Mon Sep 17 00:00:00 2001 From: Marcin Kostrzewa Date: Mon, 22 Feb 2021 15:34:57 +0100 Subject: [PATCH 3/5] foo --- .../interpreter/test/instrument/ExpressionErrorsTest.scala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/engine/runtime/src/test/scala/org/enso/interpreter/test/instrument/ExpressionErrorsTest.scala b/engine/runtime/src/test/scala/org/enso/interpreter/test/instrument/ExpressionErrorsTest.scala index 8aef114a39b9..3c66ad530a1a 100644 --- a/engine/runtime/src/test/scala/org/enso/interpreter/test/instrument/ExpressionErrorsTest.scala +++ b/engine/runtime/src/test/scala/org/enso/interpreter/test/instrument/ExpressionErrorsTest.scala @@ -877,7 +877,7 @@ class ExpressionErrorsTest contextId, xId, Api.ExpressionUpdate.Payload.Panic( - "Compile_Error Variable `foo` is not defined.", + "Compile error: Variable `foo` is not defined.", Seq(xId) ) ), @@ -885,7 +885,7 @@ class ExpressionErrorsTest contextId, yId, Api.ExpressionUpdate.Payload.Panic( - "Compile_Error Variable `foo` is not defined.", + "Compile error: Variable `foo` is not defined.", Seq(xId) ) ), @@ -893,7 +893,7 @@ class ExpressionErrorsTest contextId, mainResId, Api.ExpressionUpdate.Payload.Panic( - "Compile_Error Variable `foo` is not defined.", + "Compile error: Variable `foo` is not defined.", Seq(xId) ) ), From 62250d8d1e7cbaa6825798d70dbeb7e134218cf2 Mon Sep 17 00:00:00 2001 From: Marcin Kostrzewa Date: Mon, 22 Feb 2021 15:46:51 +0100 Subject: [PATCH 4/5] Update engine/runtime/src/main/scala/org/enso/compiler/codegen/IrToTruffle.scala Co-authored-by: Ara Adkins --- .../src/main/scala/org/enso/compiler/codegen/IrToTruffle.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engine/runtime/src/main/scala/org/enso/compiler/codegen/IrToTruffle.scala b/engine/runtime/src/main/scala/org/enso/compiler/codegen/IrToTruffle.scala index fc023ed8f49e..bec35203e0ce 100644 --- a/engine/runtime/src/main/scala/org/enso/compiler/codegen/IrToTruffle.scala +++ b/engine/runtime/src/main/scala/org/enso/compiler/codegen/IrToTruffle.scala @@ -1052,7 +1052,7 @@ class IrToTruffle( if (seenArgNames contains argName) { throw new IllegalStateException( - "A duplicate argument name found during codegen." + s"A duplicate argument name, $argName, was found during codegen." ) } else seenArgNames.add(argName) slot From 974f786917bf9b731d3cbe99c92a1290e1722bab Mon Sep 17 00:00:00 2001 From: Marcin Kostrzewa Date: Mon, 22 Feb 2021 15:55:50 +0100 Subject: [PATCH 5/5] frobnicate --- distribution/std-lib/Base/src/Error/Extensions.enso | 4 ++++ test/Tests/src/Semantic/Error_Spec.enso | 2 ++ 2 files changed, 6 insertions(+) diff --git a/distribution/std-lib/Base/src/Error/Extensions.enso b/distribution/std-lib/Base/src/Error/Extensions.enso index e46ef1265d5a..546e7dfc28c5 100644 --- a/distribution/std-lib/Base/src/Error/Extensions.enso +++ b/distribution/std-lib/Base/src/Error/Extensions.enso @@ -34,6 +34,10 @@ Error.catch (handler = x->x) = this.catch_primitive handler Error.to_default_visualization_data : Text Error.to_default_visualization_data = this.catch .to_default_visualization_data +## Returns a human-readable text representing this error. +Error.to_display_text : Text +Error.to_display_text = "Error: " + (this.catch .to_display_text) + ## Takes any value, and if it is a dataflow error, throws it as a Panic. Otherwise, returns the original value unchanged. Panic.rethrow : (Any ! Any) -> Any diff --git a/test/Tests/src/Semantic/Error_Spec.enso b/test/Tests/src/Semantic/Error_Spec.enso index 036b4a277ce5..eeb5f45d2d0c 100644 --- a/test/Tests/src/Semantic/Error_Spec.enso +++ b/test/Tests/src/Semantic/Error_Spec.enso @@ -22,3 +22,5 @@ spec = Test.specify "should be able to be shown in the default visualization" <| json = (Error.throw <| My_Type "aaa").to_default_visualization_data json . should_equal <| (Json.from_pairs [["foo", "aaa"], ["type", "My_Type"]]).to_text + Test.specify "should implement to_display_text" <| + Error.throw Nothing . to_display_text . should_equal "Error: Nothing"