enso-org / enso

Hybrid visual and textual functional programming.
https://enso.org
Apache License 2.0
7.31k stars 317 forks source link

Unexpected Type error when checking a Java type, currently only seen on CI #10250

Open radeusgd opened 3 weeks ago

radeusgd commented 3 weeks ago

I have been getting the following error on the CI: https://github.com/enso-org/enso/actions/runs/9464904329/job/26073226464?pr=10229#step:7:1085

An unexpected panic was thrown: Type error: expected the result of `to_java_charset` to be java.nio.charset.Charset, but got sun.nio.cs.UTF_8.

        at <enso> Encoding.to_java_charset(/runner/_work/enso/enso/built-distribution/enso-engine-2024.2.1-dev-linux-amd64/enso-2024.2.1-dev/lib/Standard/Base/2024.2.1-dev/src/Data/Text/Encoding.enso:92-95)
        at <enso> Text.bytes<arg-2>(/runner/_work/enso/enso/built-distribution/enso-engine-2024.2.1-dev-linux-amd64/enso-2024.2.1-dev/lib/Standard/Base/2024.2.1-dev/src/Data/Text/Extensions.enso:745:44-67)
        at <enso> Text.bytes(/runner/_work/enso/enso/built-distribution/enso-engine-2024.2.1-dev-linux-amd64/enso-2024.2.1-dev/lib/Standard/Base/2024.2.1-dev/src/Data/Text/Extensions.enso:745:14-67)
        at <enso> Text.write(/runner/_work/enso/enso/built-distribution/enso-engine-2024.2.1-dev-linux-amd64/enso-2024.2.1-dev/lib/Standard/Base/2024.2.1-dev/src/System/File/Write_Extensions.enso:59:13-43)
        at <enso> Encoding_Spec.add_specs.Encoding_Spec.add_specs<arg-1>(/runner/_work/enso/enso/test/Base_Tests/src/Data/Text/Encoding_Spec.enso:172:17-94)
        at <enso> null(Internal)
        at <enso> case_branch.case <internal-1017>(/runner/_work/enso/enso/built-distribution/enso-engine-2024.2.1-dev-linux-amd64/enso-2024.2.1-dev/lib/Standard/Test/2024.2.1-dev/src/Group.enso:28:61-64)
        at <enso> Helpers.execute_spec_code<arg-1>(/runner/_work/enso/enso/built-distribution/enso-engine-2024.2.1-dev-linux-amd64/enso-2024.2.1-dev/lib/Standard/Test/2024.2.1-dev/src/Helpers.enso:57:18-34)
        at <enso> Panic.catch(Internal)
        at <enso> Panic.type.recover.<internal-975>(/runner/_work/enso/enso/built-distribution/enso-engine-2024.2.1-dev-linux-amd64/enso-2024.2.1-dev/lib/Standard/Base/2024.2.1-dev/src/Panic.enso:191-193)
        at <enso> Panic.catch(Internal)
        at <enso> Panic.type.recover(/runner/_work/enso/enso/built-distribution/enso-engine-2024.2.1-dev-linux-amd64/enso-2024.2.1-dev/lib/Standard/Base/2024.2.1-dev/src/Panic.enso:188-193)
        at <enso> Helpers.execute_spec_code(/runner/_work/enso/enso/built-distribution/enso-engine-2024.2.1-dev-linux-amd64/enso-2024.2.1-dev/lib/Standard/Test/2024.2.1-dev/src/Helpers.enso:56-60)
        at <enso> case_branch<arg-3>(/runner/_work/enso/enso/built-distribution/enso-engine-2024.2.1-dev-linux-amd64/enso-2024.2.1-dev/lib/Standard/Test/2024.2.1-dev/src/Helpers.enso:48:37-63)
        at <enso> case_branch<arg-1>(/runner/_work/enso/enso/built-distribution/enso-engine-2024.2.1-dev-linux-amd64/enso-2024.2.1-dev/lib/Standard/Test/2024.2.1-dev/src/Helpers.enso:48:13-64)
        at <enso> Runtime.no_inline(Internal)
        at <enso> Duration.type.time_execution(/runner/_work/enso/enso/built-distribution/enso-engine-2024.2.1-dev-linux-amd64/enso-2024.2.1-dev/lib/Standard/Base/2024.2.1-dev/src/Data/Time/Duration.enso:131:18-43)
        at <enso> case_branch(/runner/_work/enso/enso/built-distribution/enso-engine-2024.2.1-dev-linux-amd64/enso-2024.2.1-dev/lib/Standard/Test/2024.2.1-dev/src/Helpers.enso:47-48)
        at <enso> Helpers.run_spec(/runner/_work/enso/enso/built-distribution/enso-engine-2024.2.1-dev-linux-amd64/enso-2024.2.1-dev/lib/Standard/Test/2024.2.1-dev/src/Helpers.enso:46-49)
        at <enso> case_branch.test_results(/runner/_work/enso/enso/built-distribution/enso-engine-2024.2.1-dev-linux-amd64/enso-2024.2.1-dev/lib/Standard/Test/2024.2.1-dev/src/Helpers.enso:27:24-36)
        at <enso> Array_Like_Helpers.map.Array_Like_Helpers.map(/runner/_work/enso/enso/built-distribution/enso-engine-2024.2.1-dev-linux-amd64/enso-2024.2.1-dev/lib/Standard/Base/2024.2.1-dev/src/Internal/Array_Like_Helpers.enso:249:45-66)
        at <enso> Array_Like_Helpers.vector_from_function.wrapped_function(/runner/_work/enso/enso/built-distribution/enso-engine-2024.2.1-dev-linux-amd64/enso-2024.2.1-dev/lib/Standard/Base/2024.2.1-dev/src/Internal/Array_Like_Helpers.enso:89:18-27)
        at <enso> Array_Like_Helpers.vector_from_function(Internal)
        at <enso> Array_Like_Helpers.vector_from_function(/runner/_work/enso/enso/built-distribution/enso-engine-2024.2.1-dev-linux-amd64/enso-2024.2.1-dev/lib/Standard/Base/2024.2.1-dev/src/Internal/Array_Like_Helpers.enso:104:15-68)
        at <enso> Array_Like_Helpers.map(/runner/_work/enso/enso/built-distribution/enso-engine-2024.2.1-dev-linux-amd64/enso-2024.2.1-dev/lib/Standard/Base/2024.2.1-dev/src/Internal/Array_Like_Helpers.enso:249:5-79)
        at <enso> Vector.map(/runner/_work/enso/enso/built-distribution/enso-engine-2024.2.1-dev-linux-amd64/enso-2024.2.1-dev/lib/Standard/Base/2024.2.1-dev/src/Data/Vector.enso:703:9-56)
        at <enso> case_branch(/runner/_work/enso/enso/built-distribution/enso-engine-2024.2.1-dev-linux-amd64/enso-2024.2.1-dev/lib/Standard/Test/2024.2.1-dev/src/Helpers.enso:24-30)
        at <enso> Helpers.run_specs_from_group(/runner/_work/enso/enso/built-distribution/enso-engine-2024.2.1-dev-linux-amd64/enso-2024.2.1-dev/lib/Standard/Test/2024.2.1-dev/src/Helpers.enso:21-36)
        at <enso> case_branch(/runner/_work/enso/enso/built-distribution/enso-engine-2024.2.1-dev-linux-amd64/enso-2024.2.1-dev/lib/Standard/Test/2024.2.1-dev/src/Suite.enso:97:35-92)
        at <enso> Suite.run_with_filter.junit_sb_builder(/runner/_work/enso/enso/built-distribution/enso-engine-2024.2.1-dev-linux-amd64/enso-2024.2.1-dev/lib/Standard/Test/2024.2.1-dev/src/Suite.enso:95-101)
        at <enso> Array_Like_Helpers.each.Array_Like_Helpers.each(/runner/_work/enso/enso/built-distribution/enso-engine-2024.2.1-dev-linux-amd64/enso-2024.2.1-dev/lib/Standard/Base/2024.2.1-dev/src/Internal/Array_Like_Helpers.enso:289:9-24)
        at <enso> Range.each.go<arg-1>(/runner/_work/enso/enso/built-distribution/enso-engine-2024.2.1-dev-linux-amd64/enso-2024.2.1-dev/lib/Standard/Base/2024.2.1-dev/src/Data/Range.enso:262:36-51)
        at <enso> Range.each.go<arg-2>(/runner/_work/enso/enso/built-distribution/enso-engine-2024.2.1-dev-linux-amd64/enso-2024.2.1-dev/lib/Standard/Base/2024.2.1-dev/src/Data/Range.enso:262:21-52)
        at <enso> Range.each.go(/runner/_work/enso/enso/built-distribution/enso-engine-2024.2.1-dev-linux-amd64/enso-2024.2.1-dev/lib/Standard/Base/2024.2.1-dev/src/Data/Range.enso:261-263)
        at <enso> Test_Reporter.wrap_junit_testsuites(/runner/_work/enso/enso/built-distribution/enso-engine-2024.2.1-dev-linux-amd64/enso-2024.2.1-dev/lib/Standard/Test/2024.2.1-dev/src/Test_Reporter.enso:26:14-19)
        at <enso> Suite.run_with_filter(/runner/_work/enso/enso/built-distribution/enso-engine-2024.2.1-dev-linux-amd64/enso-2024.2.1-dev/lib/Standard/Test/2024.2.1-dev/src/Suite.enso:91-101)
        at <enso> Main.main(/runner/_work/enso/enso/test/Base_Tests/src/Main.enso:182:5-32)

This is a Type error that says that sun.nio.cs.UTF_8 does not pass a -> Charset typecheck (checking for Java class java.nio.charset.Charset). Surely, sun.nio.cs.UTF_8 is a subclass of java.nio.charset.Charset. Moreover, in most cases (e.g. on my local computer) this typecheck does correctly pass without any errors. So I suspect the non-determinism may be caused by some specialization issue.

Currently I couldn't find any other repro than this CI run.

radeusgd commented 3 weeks ago

In my related PR #10229, I've added a workaround to be able to progress with the important changes. I did not want to block that PR as this error occurred only in the Charset check which is not really that important - we can keep it as an unchecked ascription, as we know the returned type will be right anyway.

Ideally we should solve this bug, but it is not that high priority until it will start showing in practice, and I did not find any good way to find a more reliable repro or to debug this.

If anyone wants to debug it, you can revert my workaround by the following patch:

Subject: [PATCH] avoid problematic check as workaround for https://github.com/enso-org/enso/issues/10250
---
Index: distribution/lib/Standard/Base/0.0.0-dev/src/Data/Text/Encoding.enso
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Text/Encoding.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Text/Encoding.enso
--- a/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Text/Encoding.enso  (revision 9cde5e7f7c3bdac7f15e0c30ee476666e0c5bbee)
+++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Data/Text/Encoding.enso  (revision b55cdb29dfbc823e09447531f4de8ba68a6ea0e0)
@@ -89,8 +89,7 @@
        Convert an Encoding to it's corresponding Java Charset, if applicable.
        This method should be used in places not aware of special logic for the
        Default encoding. In such places, usage of Default encoding will be forbidden.
-    to_java_charset : Charset ! Illegal_Argument
-    to_java_charset self =
+    to_java_charset self -> Charset ! Illegal_Argument =
         self.to_java_charset_or_null.if_nothing <|
             warning = Illegal_Argument.Error "The Default encoding has been used in an unexpected place (e.g. Write operation). It will be replaced with UTF-8. Please specify the desired encoding explicitly)"
             Warning.attach warning (Encoding.utf_8.to_java_charset)
@@ -98,8 +97,7 @@
     ## PRIVATE
        Convert an Encoding to it's corresponding Java Charset or null if it is the Default encoding.
        This method should only be used in places where a null Charset is expected - i.e. places aware of the Default encoding.
-    to_java_charset_or_null : Charset | Nothing ! Illegal_Argument
-    to_java_charset_or_null self = case self of
+    to_java_charset_or_null self -> (Charset | Nothing) ! Illegal_Argument = case self of
         Encoding.Value charset_name ->
             Panic.catch UnsupportedCharsetException (Charset.forName charset_name) _->
                 Error.throw (Illegal_Argument.Error ("Unknown Character Set: " + charset_name))

Pushing the code with the above to CI should show the errors in CI tests.

We may also want to investigate it further if we find other similar instances of such problem.