TypeSmart: ClassCastException - StrategoList cannot be cast to IStrategoString
Switching from Spoofax 2 beta1 to nightly introduces a build failure.
Setup:
Ubuntu 15.10 x86_64 Eclipse Mars.2 Release (4.5.2), Build id: 20160218-0600 Spoofax 2.0.0.20160601-164609-master
Stacktrace:
java.lang.ClassCastException: org.spoofax.terms.StrategoList cannot be cast to org.spoofax.interpreter.terms.IStrategoString at org.metaborg.spoofax.meta.core.pluto.build.Typesmart.extractSortType(Typesmart.java:288) ~[org.metaborg.spoofax.meta.core_2.0.0.20160601-164609-master.jar:na] at org.metaborg.spoofax.meta.core.pluto.build.Typesmart.processSignature(Typesmart.java:232) ~[org.metaborg.spoofax.meta.core_2.0.0.20160601-164609-master.jar:na] at org.metaborg.spoofax.meta.core.pluto.build.Typesmart.processModule(Typesmart.java:187) ~[org.metaborg.spoofax.meta.core_2.0.0.20160601-164609-master.jar:na] at org.metaborg.spoofax.meta.core.pluto.build.Typesmart.processMainStrategoFile(Typesmart.java:141) ~[org.metaborg.spoofax.meta.core_2.0.0.20160601-164609-master.jar:na] at org.metaborg.spoofax.meta.core.pluto.build.Typesmart.build(Typesmart.java:100) ~[org.metaborg.spoofax.meta.core_2.0.0.20160601-164609-master.jar:na] at org.metaborg.spoofax.meta.core.pluto.build.Typesmart.build(Typesmart.java:1) ~[org.metaborg.spoofax.meta.core_2.0.0.20160601-164609-master.jar:na] at build.pluto.builder.Builder.triggerBuild(Builder.java:134) [pluto-1.9.1.jar:na] at build.pluto.builder.BuildManager.executeBuilder(BuildManager.java:95) [pluto-1.9.1.jar:na] at build.pluto.builder.BuildManager.require(BuildManager.java:328) [pluto-1.9.1.jar:na] at build.pluto.builder.Builder.requireBuild(Builder.java:215) [pluto-1.9.1.jar:na] at build.pluto.builder.Builder.requireBuild(Builder.java:234) [pluto-1.9.1.jar:na] at org.metaborg.spoofax.meta.core.pluto.build.main.GenerateSourcesBuilder.build(GenerateSourcesBuilder.java:285) [org.metaborg.spoofax.meta.core_2.0.0.20160601-164609-master.jar:na] at org.metaborg.spoofax.meta.core.pluto.build.main.GenerateSourcesBuilder.build(GenerateSourcesBuilder.java:1) [org.metaborg.spoofax.meta.core_2.0.0.20160601-164609-master.jar:na] at build.pluto.builder.Builder.triggerBuild(Builder.java:134) [pluto-1.9.1.jar:na] at build.pluto.builder.BuildManager.executeBuilder(BuildManager.java:95) [pluto-1.9.1.jar:na] at build.pluto.builder.BuildManager.require(BuildManager.java:328) [pluto-1.9.1.jar:na] at build.pluto.builder.BuildManager.requireInitially(BuildManager.java:255) [pluto-1.9.1.jar:na] at build.pluto.builder.BuildManagers.build(BuildManagers.java:72) [pluto-1.9.1.jar:na] at org.metaborg.spoofax.meta.core.build.LanguageSpecBuilder.plutoBuild(LanguageSpecBuilder.java:291) [org.metaborg.spoofax.meta.core_2.0.0.20160601-164609-master.jar:na] at org.metaborg.spoofax.meta.core.build.LanguageSpecBuilder.compile(LanguageSpecBuilder.java:132) [org.metaborg.spoofax.meta.core_2.0.0.20160601-164609-master.jar:na] at org.metaborg.spoofax.eclipse.meta.build.CompileBuilder$1.run(CompileBuilder.java:49) [org.metaborg.spoofax.eclipse.meta_2.0.0.20160601-164609-master.jar:na] at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2241) [org.eclipse.core.resources_3.10.1.v20150725-1910.jar:na] at org.metaborg.spoofax.eclipse.meta.build.CompileBuilder.build(CompileBuilder.java:69) [org.metaborg.spoofax.eclipse.meta_2.0.0.20160601-164609-master.jar:na] at org.metaborg.spoofax.eclipse.meta.build.Builder.build(Builder.java:53) [org.metaborg.spoofax.eclipse.meta_2.0.0.20160601-164609-master.jar:na] at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:734) [org.eclipse.core.resources_3.10.1.v20150725-1910.jar:na] at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) [org.eclipse.equinox.common_3.7.0.v20150402-1709.jar:na] at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:205) [org.eclipse.core.resources_3.10.1.v20150725-1910.jar:na] at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:245) [org.eclipse.core.resources_3.10.1.v20150725-1910.jar:na] at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:300) [org.eclipse.core.resources_3.10.1.v20150725-1910.jar:na] at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) [org.eclipse.equinox.common_3.7.0.v20150402-1709.jar:na] at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:303) [org.eclipse.core.resources_3.10.1.v20150725-1910.jar:na] at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:359) [org.eclipse.core.resources_3.10.1.v20150725-1910.jar:na] at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:382) [org.eclipse.core.resources_3.10.1.v20150725-1910.jar:na] at org.eclipse.core.internal.resources.Workspace.buildInternal(Workspace.java:486) [org.eclipse.core.resources_3.10.1.v20150725-1910.jar:na] at org.eclipse.core.internal.resources.Workspace.build(Workspace.java:405) [org.eclipse.core.resources_3.10.1.v20150725-1910.jar:na] at org.eclipse.ui.actions.BuildAction$1.runInWorkspace(BuildAction.java:287) [org.eclipse.ui.ide_3.11.0.v20150825-2158.jar:na] at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:39) [org.eclipse.core.resources_3.10.1.v20150725-1910.jar:na] at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) [org.eclipse.core.jobs_3.7.0.v20150330-2103.jar:na]
Unfortunately, due to IP I am not sure whether I may publish the code. However, I have a hunch: We are defining multiple productions with the same constructor and same sort but different templates on the right side. When I put these in one sdf3 files, Eclipse gives a warning that this might produce errors during pretty-printing. I thus assume it should not be done.
To conclude:
Issue 1. We should not have multiple productions with the same ctor name (Our error).
Issue 2. When putting one production into one sdf3 file and the other somewhere else, Eclipse doesn’t warn about this. (I assume it is still wrong to do so, the warning is just missing. One should add a warning in Spoofax/Eclipse.)
Issue 3. Typesmart crashes without meaningful error message (e.g. at which term/file/signature the error occurred).Since this is blocking us and I might not be able to fix the root cause (Issue 1), is there a way to disable typesmart checking in nightly?
Submitted by Daniel Lehmann on 1 June 2016 at 21:50
Thanks in advance and sorry that I cannot give any code…
Issue Log
Just for completeness: This is the same trace I showed Sebastian this afternoon.
I tried to reduce the project to a minimal example. A fresh project with this added to an *.str file fails with the same error for me:
module testlang signature constructors SomeCtor : ()
whereas this builds fine:
module testlang signature constructors SomeCtor : Type
Also, we can compare the Stratego ASTs
Module( "testlang" , [Signature( [Constructors([OpDecl("SomeCtor", ConstType(SortTuple([])))])] )] )
(where the build fails) with
Module( "testlang" , [Signature( [Constructors([OpDecl("SomeCtor", ConstType(SortNoArgs("Type")))])] )] )
(where it builds fine)
Looking at line 288 where the ClassCastException is thrown (https://github.com/metaborg/spoofax/blob/master/org.metaborg.spoofax.meta.core/src/main/java/org/metaborg/spoofax/meta/core/pluto/build/Typesmart.java#L288)
we see thatgetSubterm(0)
on theSortTuple
gives back a list instead of the expected string. Does one need an extra check forkind.equals("SortTuple")
before that?
I changed the signature extraction to be more defensive (https://github.com/metaborg/spoofax/commit/18264d3590d8212b8277d0775784b2ac9f0dc65c).
SortTuple
is now correctly parsed into a tuple type (the empty tuple type in your example above)- Other ill-formed sorts are rejected with an error during the build. I did not want to touch the Stratego language, which would be necessary for reporting errors in the editor
Does this solve the problem for you?
Yes, perfect. Thanks alot for this fast fix!
Ok, closing.
Log in to post comments