From 6a298ee30a05b570a9b509f44af293f6b8a11286 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Tue, 9 Dec 2025 14:22:00 +0100 Subject: [PATCH 1/5] Minimal reproducer --- .../java/org/enso/example/TestConstants.java | 8 ++++ .../org/enso/interpreter/test/CaseOfTest.java | 38 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 engine/runtime-integration-tests/src/test/java/org/enso/example/TestConstants.java diff --git a/engine/runtime-integration-tests/src/test/java/org/enso/example/TestConstants.java b/engine/runtime-integration-tests/src/test/java/org/enso/example/TestConstants.java new file mode 100644 index 000000000000..a9195dee9e41 --- /dev/null +++ b/engine/runtime-integration-tests/src/test/java/org/enso/example/TestConstants.java @@ -0,0 +1,8 @@ +package org.enso.example; + +public class TestConstants { + private TestConstants() {} + + public static final int A = 1; + public static final int B = 2020; +} diff --git a/engine/runtime-integration-tests/src/test/java/org/enso/interpreter/test/CaseOfTest.java b/engine/runtime-integration-tests/src/test/java/org/enso/interpreter/test/CaseOfTest.java index c49769374e1f..c0ec2ad7f76d 100644 --- a/engine/runtime-integration-tests/src/test/java/org/enso/interpreter/test/CaseOfTest.java +++ b/engine/runtime-integration-tests/src/test/java/org/enso/interpreter/test/CaseOfTest.java @@ -1,5 +1,7 @@ package org.enso.interpreter.test; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertEquals; import org.enso.interpreter.runtime.data.EnsoMultiValue; @@ -55,4 +57,40 @@ private void doCaseOfBoolean(Object t, Object f) { var two = choose.execute(f); assertEquals("With " + f + " we should get 2", 2, two.asInt()); } + + /** See #14426. */ + @Test + public void caseOfJavaFinalFields_SmallInteger() { + var code = + """ + polyglot java import org.enso.example.TestConstants + + main = + x = 1 + case x of + TestConstants.A -> "A" + _ -> "Unknown" + """; + var res = ctxRule.evalModule(code); + assertThat(res.isString(), is(true)); + assertThat(res.asString(), is("A")); + } + + /** See #14426. */ + @Test + public void caseOfJavaFinalFields_BiggerInteger() { + var code = + """ + polyglot java import org.enso.example.TestConstants + + main = + x = 2020 + case x of + TestConstants.B -> "B" + _ -> "Unknown" + """; + var res = ctxRule.evalModule(code); + assertThat(res.isString(), is(true)); + assertThat(res.asString(), is("B")); + } } From 4e8f5558513a52833aea71ae9637e47806f56f19 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Tue, 9 Dec 2025 14:33:51 +0100 Subject: [PATCH 2/5] Increase test coverage --- .../org/enso/base_test_helpers/Constants.java | 11 +++++++++++ test/Base_Tests/src/Semantic/Case_Spec.enso | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 test/Base_Tests/polyglot-sources/enso-test-java-helpers/src/main/java/org/enso/base_test_helpers/Constants.java diff --git a/test/Base_Tests/polyglot-sources/enso-test-java-helpers/src/main/java/org/enso/base_test_helpers/Constants.java b/test/Base_Tests/polyglot-sources/enso-test-java-helpers/src/main/java/org/enso/base_test_helpers/Constants.java new file mode 100644 index 000000000000..f3b2e93b1b03 --- /dev/null +++ b/test/Base_Tests/polyglot-sources/enso-test-java-helpers/src/main/java/org/enso/base_test_helpers/Constants.java @@ -0,0 +1,11 @@ +package org.enso.base_test_helpers; + +public class Constants { + private Constants() {} + + public static final int SMALL_INT = 1; + public static final int BIG_INT = 2020; + public static final long SMALL_LONG = 2L; + public static final long BIG_LONG = 20_000L; + public static final String STRING = "string"; +} diff --git a/test/Base_Tests/src/Semantic/Case_Spec.enso b/test/Base_Tests/src/Semantic/Case_Spec.enso index 485544f462b5..98496a6f7324 100644 --- a/test/Base_Tests/src/Semantic/Case_Spec.enso +++ b/test/Base_Tests/src/Semantic/Case_Spec.enso @@ -3,6 +3,7 @@ import Standard.Base.Data.Array as Array_Module import Standard.Base.Data.Text as Text_Module import Standard.Base.Data.Vector as Vector_Module +polyglot java import org.enso.base_test_helpers.Constants as Java_Constants polyglot java import java.lang.Class polyglot java import java.lang.Long as Java_Long polyglot java import java.lang.Object as Java_Object @@ -347,6 +348,23 @@ add_specs suite_builder = suite_builder.group "Pattern Matches" group_builder-> _ : Function -> Nothing _ -> Test.fail "Expected to match on Function type." + group_builder.specify "should pattern match on Java constant fields" <| + case 1 of + Java_Constants.SMALL_INT -> Nothing + _ -> Test.fail "Expected to match on SMALL_INT." + case "string" of + Java_Constants.STRING -> Nothing + _ -> Test.fail "Expected to match on STRING." + case 2 of + Java_Constants.SMALL_LONG -> Nothing + _ -> Test.fail "Expected to match on SMALL_LONG." + case 20000 of + Java_Constants.BIG_LONG -> Nothing + _ -> Test.fail "Expected to match on BIG_LONG." + case 2020 of + Java_Constants.BIG_INT -> Nothing + _ -> Test.fail "Expected to match on BIG_INT." + main filter=Nothing = suite = Test.build suite_builder-> add_specs suite_builder From e895b66fa955c16eabc11029e78f648c5da29015 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Tue, 9 Dec 2025 16:38:19 +0100 Subject: [PATCH 3/5] Add missing isSameLong specialization to IsSameObjectNode --- .../builtin/meta/IsSameObjectNode.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/meta/IsSameObjectNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/meta/IsSameObjectNode.java index ad640db092ae..bace23a444b5 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/meta/IsSameObjectNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/meta/IsSameObjectNode.java @@ -36,6 +36,24 @@ boolean isSameDouble(double left, double right) { } } + @Specialization( + guards = { + "interop.fitsInLong(left)", + "interop.fitsInLong(right)", + }) + boolean isSameLong( + Object left, + Object right, + @Shared("interop") @CachedLibrary(limit = "2") InteropLibrary interop) { + try { + var leftLong = interop.asLong(left); + var rightLong = interop.asLong(right); + return leftLong == rightLong; + } catch (UnsupportedMessageException e) { + return false; + } + } + @Specialization( guards = { "interop.isString(left)", From 2a84ac477d406873fc2145b929ba9c81002a526c Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Tue, 9 Dec 2025 16:45:46 +0100 Subject: [PATCH 4/5] Remove unnecessary fallback case branch from DuckDB type mappings --- .../DuckDB/0.0.0-dev/src/Internal/DuckDB_Type_Mapping.enso | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/distribution/lib/Standard/DuckDB/0.0.0-dev/src/Internal/DuckDB_Type_Mapping.enso b/distribution/lib/Standard/DuckDB/0.0.0-dev/src/Internal/DuckDB_Type_Mapping.enso index 8e874ac79f1b..010617c145df 100644 --- a/distribution/lib/Standard/DuckDB/0.0.0-dev/src/Internal/DuckDB_Type_Mapping.enso +++ b/distribution/lib/Standard/DuckDB/0.0.0-dev/src/Internal/DuckDB_Type_Mapping.enso @@ -111,11 +111,7 @@ type DuckDB_Type_Mapping Types.TIMESTAMP -> Value_Type.Date_Time False Types.BLOB -> Value_Type.Binary Nothing False Types.BIT -> Value_Type.Binary Nothing False - _ -> case sql_type.name of - "TIMESTAMP_NS" -> Value_Type.Date_Time False - "TIMESTAMPTZ" -> Value_Type.Date_Time True - "TIMESTAMP WITH TIME ZONE" -> Value_Type.Date_Time True - _ -> Value_Type.Unsupported_Data_Type sql_type.name sql_type + _ -> Value_Type.Unsupported_Data_Type sql_type.name sql_type ## --- private: true From 3bfd0bc928e10c385ed2b85d5ff558cdfca6117e Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Wed, 10 Dec 2025 13:12:35 +0100 Subject: [PATCH 5/5] Simplify isSameLong specialization --- .../builtin/meta/IsSameObjectNode.java | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/meta/IsSameObjectNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/meta/IsSameObjectNode.java index bace23a444b5..1f96785b2434 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/meta/IsSameObjectNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/meta/IsSameObjectNode.java @@ -36,22 +36,9 @@ boolean isSameDouble(double left, double right) { } } - @Specialization( - guards = { - "interop.fitsInLong(left)", - "interop.fitsInLong(right)", - }) - boolean isSameLong( - Object left, - Object right, - @Shared("interop") @CachedLibrary(limit = "2") InteropLibrary interop) { - try { - var leftLong = interop.asLong(left); - var rightLong = interop.asLong(right); - return leftLong == rightLong; - } catch (UnsupportedMessageException e) { - return false; - } + @Specialization + boolean isSameLong(long left, long right) { + return left == right; } @Specialization(