GithubHelp home page GithubHelp logo

metaborg / spoofax-pie Goto Github PK

View Code? Open in Web Editor NEW
11.0 13.0 9.0 11.02 MB

Spoofax implementation using PIE pipelines

License: Apache License 2.0

Java 92.79% Kotlin 1.76% Makefile 0.27% AMPL 0.01% Mustache 5.17%

spoofax-pie's Introduction

GitHub license GitHub actions Jenkins Jenkins Tests Spoofax 3 core Documentation

Spoofax 3

Spoofax 3 is a modular and incremental textual language workbench running on the JVM: a collection of tools and Java libraries that enable the development of textual languages, embeddable into batch compilers, code editors and IDEs, or custom applications. It is a reimplementation of Spoofax 2, with the goal of being more modular, flexible, and correctly incremental.

Currently, Spoofax 3 is experimental and still a work-in-progress. Therefore, it does not have a stable API, lacks documentation and test coverage, and has not yet been applied to real-world use cases. If you are looking for a more mature alternative, see Spoofax 2, which Spoofax 3 is based on.

See the (incomplete/under construction) documentation website for the motivation, key ideas, and current status of Spoofax 3.

Directory structure

.
├── build.gradle.kts        # Gradle build configuration
├── settings.gradle.kts     # Gradle build settings (multi-project and composite build)
├── core                    # Spoofax 3 core libraries
├── lwb                     # Spoofax 3 language workbench, in a separate composite build because
│                             it uses Gradle plugins from core.
├── lwb.distrib             # Spoofax 3 language workbench distribution, in a separate composite
│                             build because it uses Gradle plugins from core and lwb.
├── example                 # Spoofax 3 examples, in a separate composite build because
│                             it uses Gradle plugins from core and lwb.
├── gradle.properties       # Gradle properties file
├── mkdocs.yml              # Documentation configuration file (MkDocs)
├── mkdocs_requirements.txt # Documentation Python requirements file
├── docs                    # Documentation root
├── .github                 # GitHub issue template and action workflows
├── LICENSE                 # License file
├── NOTICE                  # License NOTICE file
├── CHANGELOG.md            # Changelog
└── README.md

Development

Git conventions

The master branch of this repository is buildable in isolation, and is used to publish new releases. The develop branch of this repository is built via the devenv repository, against the develop branch of other repositories that are part of devenv, and is used for development. Other branches are feature branches and should be merged into develop at some point.

Building

The master branch of this repository can be built in isolation. However, the develop branch must be built via the devenv repository, due to it depending on development versions of other projects.

This repository is built with Gradle, which requires a JDK of at least version 8 to be installed. Higher versions may work depending on which version of Gradle is used.

To build this repository, run:

./repo checkout
./gradlew buildAll

Note

On Windows, instead run:

repo.bat checkout
gradlew.bat buildAll

Important

When using MacOS, ensure you have Docker installed and running.

To run a local Eclipse instance using the Spoofax version in this repository, run:

./gradlew :spoofax3.lwb.distrib.root:spoofax.lwb.eclipse:runEclipse

Note

On Windows, instead run:

gradlew.bat :spoofax3.lwb.distrib.root:spoofax.lwb.eclipse:runEclipse

To build the documentation, see docs/README.md.

Automated Builds

This repository is built on:

Publishing

This repository is published via Gradle and Git with the Gitonium and Gradle Config plugins. It is published to our artifact server in the releases repository.

First, ensure that you depend on only released versions of other projects. That is, no SNAPSHOT or other development versions. Most dependencies are managed in the core/spoofax.depconstraints/build.gradle.kts file. Spoofax 2 versions are managed in gradle.properties:

  • systemProp.spoofax2Version sets the version of Spoofax 2 that Spoofax 3 uses, for Spoofax 2 artifacts. At the moment of writing, this is only the org.metaborg:strategoxt-min-jar artifact.
  • systemProp.spoofax2DevenvVersion sets the version of Spoofax 2 that Spoofax 3 uses, which is built as part of the master branch of spoofax-deploy.

NOTE: If you're updating the spoofax2Version because you want to use some changes in a new Spoofax 2 release, you most likely will need to update to spoofax2DevenvVersion too, and in order to do so need to follow the above link and follow the instructions for releasing a new devenv version for the Spoofax 2 artifacts.

Then, update CHANGELOG.md with your changes, create a new release entry, and update the release links at the bottom of the file. Commit your changes and merge them from the develop branch into the master branch.

To make a new release, create a tag in the form of release-* where * is the version of the release you'd like to make. Then first build the project with ./gradlew buildAll to check if building succeeds.

If you want our buildfarm to publish this release, just push the tag you just made, and our buildfarm will build the repository and publish the release.

If you want to publish this release locally, you will need an account with write access to our artifact server, and tell Gradle about this account. Create the ~/.gradle/gradle.properties file if it does not exist. Add the following lines to it, replacing <username> and <password> with those of your artifact server account:

publish.repository.metaborg.artifacts.username=<username>
publish.repository.metaborg.artifacts.password=<password>

Then run ./gradlew publishAll to publish all built artifacts. You should also push the release tag you made such that this release is reproducible by others.

Finally, add the release to the documentation by adding the release and date to the top of the release_versions dictionary in docs/macro.py. Push this change to the develop branch and a GitHub actions build will automatically update the documentation website.

Copyright and License

Copyright © 2018-2024 Delft University of Technology

The files in this repository are licensed under the Apache License, Version 2.0. You may use the files in this repository in compliance with the license.

spoofax-pie's People

Contributors

apanatshka avatar azwn avatar gohla avatar molenzwiebel avatar rvanbaarle avatar virtlink avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

spoofax-pie's Issues

Moving a project to a different directory and then building it causes build errors

Summary

Moving a project to a different directory (e.g., renaming/moving the Eclipse workspace and then using that workspace and/or importing the previous language project into it) and then building it causes build errors.

What you did

Close Eclipse, rename or move the workspace, open Eclipse in this workspace.
Then optionally delete and reimport the project if it is closed.
Then build that language project.

What you expected to happen

Building to succeed.

What actually happened

Build failed unexpectedly with an overlapping provided file exception.

Context

  • Spoofax version: 0.11.6
  • Operating system & version: Any

Statix analysis of specific contructor causes editor to hang

Summary

In this project, if a variable used in a test or cpy file, then the editor hangs on updating.

What you did

In the above project define a test such as the following:

test variable [[
abcdef
]] analysis succeeds

What you expected to happen

An error appears at analysis succeeds, since the variable is undefined

What actually happened

The SPT update job hangs indefinitely.

Context

  • Spoofax version: 0.13.0
  • Operating system & version: Unknown
  • Java version (if applicable): Unknown (most likely embedded jvm)
  • Eclipse version (if applicable): 2021-09
  • Gradle version (if applicable):

Additional information

I haven't tried reproducing the bug myself (a student showed me the issue). If I find anything noteworthy, then I'll update the bug report.

Grammar with overlapping concrete syntax but different constructors give an error in the parse table generator

Summary

Grammar with overlapping concrete syntax but different constructors give an error in the parse table generator

What you did

Create grammar with overlapping concrete syntax but different constructors, for example due to a copy-paste mistake:

Exp.And = <<Exp> and <Exp>> {left}
Exp.Or = <<Or> and <Expr>> {left}

What you expected to happen

This to work (but be ambiguous at parse time), or give an error in the SDF3 file.

What actually happened

There was an error in the parse table generator.

Context

  • Spoofax version: 0.11.9
  • Operating system & version: Any

Additional information

This was reported from the lab, but it should be reproduced more thoroughly.

Eclipse LWB Spoofax console on Windows does not correctly show Unicode symbols

Summary

The Eclipse LWB Spoofax console on Windows does not correctly show Unicode symbols.

What you did

Look at the console after a language build.

What you expected to happen

The console to contain Unicode symbols as can be seen on macOS (and probably Linux?).

What actually happened

All Unicode symbols are shown as ?.

Context

  • Spoofax version: 0.11.10
  • Operating system & version: Windows

Additional information

Changing several settings to use UTF-8/Unicode does not help. Changing the font to one that can display the symbols also does not seem to help.

adapterProject.set not honored

Summary

This line in build.gradle.kts is not honored:

languageEclipseProject {
  adapterProject.set(project(":tiger.spoofax3"))
}

Instead, it falls back to the default, depending on :tiger.

What you did

Override the adapter project with a name other than just the project name :tiger:

languageEclipseProject {
  adapterProject.set(project(":tiger.spoofax3"))
}

What you expected to happen

I expected it to depend on :tiger.spoofax3, not :tiger.

What actually happened

I get an exception when importing the Gradle file in Intellij:

A problem occurred configuring project ':spoofax3.example.root:tiger.spoofax3.eclipse'.
> Project with path ':tiger' could not be found in project ':spoofax3.example.root:tiger.spoofax3.eclipse'.

* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Exception is:
org.gradle.api.ProjectConfigurationException: A problem occurred configuring project ':spoofax3.example.root:tiger.spoofax3.eclipse'.
	at org.gradle.configuration.project.LifecycleProjectEvaluator.wrapException(LifecycleProjectEvaluator.java:75)
	at org.gradle.configuration.project.LifecycleProjectEvaluator.addConfigurationFailure(LifecycleProjectEvaluator.java:68)
	at org.gradle.configuration.project.LifecycleProjectEvaluator.access$400(LifecycleProjectEvaluator.java:51)
	at org.gradle.configuration.project.LifecycleProjectEvaluator$NotifyAfterEvaluate.run(LifecycleProjectEvaluator.java:191)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:71)
	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:71)
	at org.gradle.configuration.project.LifecycleProjectEvaluator$EvaluateProject.lambda$run$0(LifecycleProjectEvaluator.java:105)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.lambda$applyToMutableState$0(DefaultProjectStateRegistry.java:250)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.lambda$withProjectLock$3(DefaultProjectStateRegistry.java:310)
	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:213)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.withProjectLock(DefaultProjectStateRegistry.java:310)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.fromMutableState(DefaultProjectStateRegistry.java:291)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.applyToMutableState(DefaultProjectStateRegistry.java:249)
	at org.gradle.configuration.project.LifecycleProjectEvaluator$EvaluateProject.run(LifecycleProjectEvaluator.java:91)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:71)
	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:71)
	at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:63)
	at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:721)
	at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:151)
	at org.gradle.execution.TaskPathProjectEvaluator.configure(TaskPathProjectEvaluator.java:41)
	at org.gradle.execution.TaskPathProjectEvaluator.configureHierarchy(TaskPathProjectEvaluator.java:69)
	at org.gradle.configuration.DefaultProjectsPreparer.prepareProjects(DefaultProjectsPreparer.java:46)
	at org.gradle.configuration.BuildTreePreparingProjectsPreparer.prepareProjects(BuildTreePreparingProjectsPreparer.java:56)
	at org.gradle.configuration.BuildOperationFiringProjectsPreparer$ConfigureBuild.run(BuildOperationFiringProjectsPreparer.java:52)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:71)
	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:71)
	at org.gradle.configuration.BuildOperationFiringProjectsPreparer.prepareProjects(BuildOperationFiringProjectsPreparer.java:40)
	at org.gradle.initialization.DefaultGradleLauncher.prepareProjects(DefaultGradleLauncher.java:226)
	at org.gradle.initialization.DefaultGradleLauncher.doClassicBuildStages(DefaultGradleLauncher.java:163)
	at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:148)
	at org.gradle.initialization.DefaultGradleLauncher.getConfiguredBuild(DefaultGradleLauncher.java:113)
	at org.gradle.composite.internal.DefaultIncludedBuild.getConfiguredBuild(DefaultIncludedBuild.java:167)
	at org.gradle.composite.internal.DefaultIncludedBuild_Decorated.getConfiguredBuild(Unknown Source)
	at org.gradle.composite.internal.DefaultIncludedBuild.getBuild(DefaultIncludedBuild.java:172)
	at org.gradle.composite.internal.DefaultIncludedBuild_Decorated.getBuild(Unknown Source)
	at org.gradle.composite.internal.AbstractCompositeParticipantBuildState.getAvailableModules(AbstractCompositeParticipantBuildState.java:44)
	at org.gradle.composite.internal.DefaultIncludedBuild_Decorated.getAvailableModules(Unknown Source)
	at org.gradle.composite.internal.IncludedBuildDependencySubstitutionsBuilder.build(IncludedBuildDependencySubstitutionsBuilder.java:62)
	at org.gradle.composite.internal.DefaultIncludedBuildRegistry.registerSubstitutions(DefaultIncludedBuildRegistry.java:180)
	at org.gradle.composite.internal.DefaultIncludedBuildRegistry.beforeConfigureRootBuild(DefaultIncludedBuildRegistry.java:160)
	at org.gradle.configuration.BuildTreePreparingProjectsPreparer.prepareProjects(BuildTreePreparingProjectsPreparer.java:51)
	at org.gradle.configuration.BuildOperationFiringProjectsPreparer$ConfigureBuild.run(BuildOperationFiringProjectsPreparer.java:52)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:71)
	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:71)
	at org.gradle.configuration.BuildOperationFiringProjectsPreparer.prepareProjects(BuildOperationFiringProjectsPreparer.java:40)
	at org.gradle.initialization.DefaultGradleLauncher.prepareProjects(DefaultGradleLauncher.java:226)
	at org.gradle.initialization.DefaultGradleLauncher.doClassicBuildStages(DefaultGradleLauncher.java:163)
	at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:148)
	at org.gradle.initialization.DefaultGradleLauncher.executeTasks(DefaultGradleLauncher.java:124)
	at org.gradle.internal.invocation.GradleBuildController$1.create(GradleBuildController.java:72)
	at org.gradle.internal.invocation.GradleBuildController$1.create(GradleBuildController.java:67)
	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:213)
	at org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:67)
	at org.gradle.internal.invocation.GradleBuildController.run(GradleBuildController.java:56)
	at org.gradle.tooling.internal.provider.runner.AbstractClientProvidedBuildActionRunner.runClientAction(AbstractClientProvidedBuildActionRunner.java:53)
	at org.gradle.tooling.internal.provider.runner.ClientProvidedPhasedActionRunner.run(ClientProvidedPhasedActionRunner.java:47)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.launcher.exec.BuildOutcomeReportingBuildActionRunner.run(BuildOutcomeReportingBuildActionRunner.java:63)
	at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
	at org.gradle.tooling.internal.provider.FileSystemWatchingBuildActionRunner.run(FileSystemWatchingBuildActionRunner.java:77)
	at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run(BuildCompletionNotifyingBuildActionRunner.java:41)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.call(RunAsBuildOperationBuildActionRunner.java:49)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.call(RunAsBuildOperationBuildActionRunner.java:44)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:76)
	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:76)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:44)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.lambda$execute$0(InProcessBuildActionExecuter.java:54)
	at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:86)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:53)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:29)
	at org.gradle.launcher.exec.BuildTreeScopeLifecycleBuildActionExecuter.lambda$execute$0(BuildTreeScopeLifecycleBuildActionExecuter.java:33)
	at org.gradle.internal.buildtree.BuildTreeState.run(BuildTreeState.java:49)
	at org.gradle.launcher.exec.BuildTreeScopeLifecycleBuildActionExecuter.execute(BuildTreeScopeLifecycleBuildActionExecuter.java:32)
	at org.gradle.launcher.exec.BuildTreeScopeLifecycleBuildActionExecuter.execute(BuildTreeScopeLifecycleBuildActionExecuter.java:27)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:104)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:55)
	at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:64)
	at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:37)
	at org.gradle.tooling.internal.provider.SessionScopeLifecycleBuildActionExecuter.lambda$execute$0(SessionScopeLifecycleBuildActionExecuter.java:54)
	at org.gradle.internal.session.BuildSessionState.run(BuildSessionState.java:67)
	at org.gradle.tooling.internal.provider.SessionScopeLifecycleBuildActionExecuter.execute(SessionScopeLifecycleBuildActionExecuter.java:50)
	at org.gradle.tooling.internal.provider.SessionScopeLifecycleBuildActionExecuter.execute(SessionScopeLifecycleBuildActionExecuter.java:36)
	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:36)
	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:25)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:59)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:31)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:55)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:41)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:47)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:31)
	at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:65)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:39)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:29)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:35)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:78)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:75)
	at org.gradle.util.Swapper.swap(Swapper.java:38)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:75)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:63)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:84)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:52)
	at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
Caused by: org.gradle.api.UnknownProjectException: Project with path ':tiger' could not be found in project ':spoofax3.example.root:tiger.spoofax3.eclipse'.
	at org.gradle.api.internal.project.DefaultProject.project(DefaultProject.java:657)
	at org.gradle.internal.service.scopes.DefaultProjectFinder.getProject(DefaultProjectFinder.java:33)
	at org.gradle.api.internal.notations.ProjectDependencyFactory$ProjectDependencyMapNotationConverter.parseMap(ProjectDependencyFactory.java:55)
	at jdk.internal.reflect.GeneratedMethodAccessor170.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at org.gradle.internal.typeconversion.MapNotationConverter.parseType(MapNotationConverter.java:93)
	at org.gradle.internal.typeconversion.MapNotationConverter.parseType(MapNotationConverter.java:40)
	at org.gradle.internal.typeconversion.TypedNotationConverter.convert(TypedNotationConverter.java:43)
	at org.gradle.internal.typeconversion.NotationConverterToNotationParserAdapter.parseNotation(NotationConverterToNotationParserAdapter.java:31)
	at org.gradle.internal.typeconversion.JustReturningParser.parseNotation(JustReturningParser.java:40)
	at org.gradle.internal.typeconversion.ErrorHandlingNotationParser.parseNotation(ErrorHandlingNotationParser.java:48)
	at org.gradle.api.internal.notations.ProjectDependencyFactory.createFromMap(ProjectDependencyFactory.java:38)
	at org.gradle.api.internal.artifacts.DefaultDependencyFactory.createProjectDependencyFromMap(DefaultDependencyFactory.java:99)
	at org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.project(DefaultDependencyHandler.java:223)
	at org.gradle.kotlin.dsl.DependencyHandlerExtensionsKt.project(DependencyHandlerExtensions.kt:232)
	at org.gradle.kotlin.dsl.DependencyHandlerExtensionsKt.project$default(DependencyHandlerExtensions.kt:227)
	at mb.spoofax.compiler.gradle.UtilKt$toGradleDependency$1.apply(Util.kt:126)
	at mb.spoofax.compiler.gradle.UtilKt$toGradleDependency$1.apply(Util.kt)
	at mb.spoofax.compiler.util.GradleDependencies$LambdaCases.project(GradleDependencies.java:80)
	at mb.spoofax.compiler.util.GradleDependencies$Project.match(GradleDependencies.java:103)
	at mb.spoofax.compiler.util.GradleDependencies$CaseOfMatchers$TotalMatcher_Files.files(GradleDependencies.java:357)
	at mb.spoofax.compiler.gradle.UtilKt.toGradleDependency(Util.kt:128)
	at mb.spoofax.compiler.gradle.plugin.EclipsePluginKt$configureBundleDependencies$1$$special$$inlined$forEach$lambda$3.apply(EclipsePlugin.kt:181)
	at mb.spoofax.compiler.gradle.plugin.EclipsePluginKt$configureBundleDependencies$1$$special$$inlined$forEach$lambda$3.apply(EclipsePlugin.kt)
	at mb.spoofax.compiler.util.GradleConfiguredBundleDependencies$LambdaCases.bundleEmbedApi(GradleConfiguredBundleDependencies.java:142)
	at mb.spoofax.compiler.util.GradleConfiguredBundleDependencies$BundleEmbedApi.match(GradleConfiguredBundleDependencies.java:236)
	at mb.spoofax.compiler.util.GradleConfiguredBundleDependencies$CaseOfMatchers$TotalMatcher_BundleTargetPlatformImplementation.bundleTargetPlatformImplementation(GradleConfiguredBundleDependencies.java:805)
	at mb.spoofax.compiler.gradle.plugin.EclipsePluginKt$configureBundleDependencies$1.invoke(EclipsePlugin.kt:184)
	at mb.spoofax.compiler.gradle.plugin.EclipsePluginKt$configureBundleDependencies$1.invoke(EclipsePlugin.kt)
	at mb.spoofax.compiler.gradle.plugin.EclipsePluginKt.configureBundleDependencies(EclipsePlugin.kt:191)
	at mb.spoofax.compiler.gradle.plugin.EclipsePlugin.configureBundle(EclipsePlugin.kt:145)
	at mb.spoofax.compiler.gradle.plugin.EclipsePlugin.configure(EclipsePlugin.kt:92)
	at mb.spoofax.compiler.gradle.plugin.EclipsePlugin.access$configure(EclipsePlugin.kt:67)
	at mb.spoofax.compiler.gradle.plugin.EclipsePlugin$apply$1$1.invoke(EclipsePlugin.kt:78)
	at mb.spoofax.compiler.gradle.plugin.EclipsePlugin$apply$1$1.invoke(EclipsePlugin.kt:67)
	at mb.spoofax.compiler.gradle.plugin.LanguagePluginKt.whenAllLanguageProjectsFinalized(LanguagePlugin.kt:145)
	at mb.spoofax.compiler.gradle.plugin.LanguagePluginKt$whenLanguageProjectFinalized$1.invoke(LanguagePlugin.kt:139)
	at mb.spoofax.compiler.gradle.plugin.LanguagePluginKt$whenLanguageProjectFinalized$1.invoke(LanguagePlugin.kt)
	at mb.spoofax.compiler.gradle.UtilKt.whenFinalized(Util.kt:37)
	at mb.spoofax.compiler.gradle.plugin.LanguagePluginKt.whenLanguageProjectFinalized(LanguagePlugin.kt:136)
	at mb.spoofax.compiler.gradle.plugin.AdapterPluginKt$whenAdapterProjectFinalized$1.invoke(AdapterPlugin.kt:81)
	at mb.spoofax.compiler.gradle.plugin.AdapterPluginKt$whenAdapterProjectFinalized$1.invoke(AdapterPlugin.kt)
	at mb.spoofax.compiler.gradle.UtilKt.whenFinalized(Util.kt:37)
	at mb.spoofax.compiler.gradle.plugin.AdapterPluginKt.whenAdapterProjectFinalized(AdapterPlugin.kt:78)
	at mb.spoofax.compiler.gradle.plugin.EclipsePlugin$apply$1.execute(EclipsePlugin.kt:76)
	at mb.spoofax.compiler.gradle.plugin.EclipsePlugin$apply$1.execute(EclipsePlugin.kt:67)
	at org.gradle.configuration.internal.DefaultUserCodeApplicationContext$CurrentApplication$1.execute(DefaultUserCodeApplicationContext.java:100)
	at org.gradle.configuration.internal.DefaultListenerBuildOperationDecorator$BuildOperationEmittingAction$1.run(DefaultListenerBuildOperationDecorator.java:153)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:71)
	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:71)
	at org.gradle.configuration.internal.DefaultListenerBuildOperationDecorator$BuildOperationEmittingAction.execute(DefaultListenerBuildOperationDecorator.java:150)
	at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:95)
	at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:83)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:43)
	at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:245)
	at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:157)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:61)
	at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:346)
	at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:249)
	at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:141)
	at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:37)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
	at com.sun.proxy.$Proxy40.afterEvaluate(Unknown Source)
	at org.gradle.configuration.project.LifecycleProjectEvaluator$NotifyAfterEvaluate$1.execute(LifecycleProjectEvaluator.java:183)
	at org.gradle.configuration.project.LifecycleProjectEvaluator$NotifyAfterEvaluate$1.execute(LifecycleProjectEvaluator.java:180)
	at org.gradle.api.internal.project.DefaultProject.stepEvaluationListener(DefaultProject.java:1465)
	at org.gradle.configuration.project.LifecycleProjectEvaluator$NotifyAfterEvaluate.run(LifecycleProjectEvaluator.java:189)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:71)
	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:71)
	at org.gradle.configuration.project.LifecycleProjectEvaluator$EvaluateProject.lambda$run$0(LifecycleProjectEvaluator.java:105)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.lambda$applyToMutableState$0(DefaultProjectStateRegistry.java:250)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.lambda$withProjectLock$3(DefaultProjectStateRegistry.java:310)
	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:213)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.withProjectLock(DefaultProjectStateRegistry.java:310)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.fromMutableState(DefaultProjectStateRegistry.java:291)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.applyToMutableState(DefaultProjectStateRegistry.java:249)
	at org.gradle.configuration.project.LifecycleProjectEvaluator$EvaluateProject.run(LifecycleProjectEvaluator.java:91)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:71)
	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:71)
	at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:63)
	at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:721)
	at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:151)
	at org.gradle.execution.TaskPathProjectEvaluator.configure(TaskPathProjectEvaluator.java:41)
	at org.gradle.execution.TaskPathProjectEvaluator.configureHierarchy(TaskPathProjectEvaluator.java:69)
	at org.gradle.configuration.DefaultProjectsPreparer.prepareProjects(DefaultProjectsPreparer.java:46)
	at org.gradle.configuration.BuildTreePreparingProjectsPreparer.prepareProjects(BuildTreePreparingProjectsPreparer.java:56)
	at org.gradle.configuration.BuildOperationFiringProjectsPreparer$ConfigureBuild.run(BuildOperationFiringProjectsPreparer.java:52)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:71)
	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:71)
	at org.gradle.configuration.BuildOperationFiringProjectsPreparer.prepareProjects(BuildOperationFiringProjectsPreparer.java:40)
	at org.gradle.initialization.DefaultGradleLauncher.prepareProjects(DefaultGradleLauncher.java:226)
	at org.gradle.initialization.DefaultGradleLauncher.doClassicBuildStages(DefaultGradleLauncher.java:163)
	at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:148)
	at org.gradle.initialization.DefaultGradleLauncher.getConfiguredBuild(DefaultGradleLauncher.java:113)
	at org.gradle.composite.internal.DefaultIncludedBuild.getConfiguredBuild(DefaultIncludedBuild.java:167)
	at org.gradle.composite.internal.DefaultIncludedBuild_Decorated.getConfiguredBuild(Unknown Source)
	at org.gradle.composite.internal.DefaultIncludedBuild.getBuild(DefaultIncludedBuild.java:172)
	at org.gradle.composite.internal.DefaultIncludedBuild_Decorated.getBuild(Unknown Source)
	at org.gradle.composite.internal.AbstractCompositeParticipantBuildState.getAvailableModules(AbstractCompositeParticipantBuildState.java:44)
	at org.gradle.composite.internal.DefaultIncludedBuild_Decorated.getAvailableModules(Unknown Source)
	at org.gradle.composite.internal.IncludedBuildDependencySubstitutionsBuilder.build(IncludedBuildDependencySubstitutionsBuilder.java:62)
	at org.gradle.composite.internal.DefaultIncludedBuildRegistry.registerSubstitutions(DefaultIncludedBuildRegistry.java:180)
	at org.gradle.composite.internal.DefaultIncludedBuildRegistry.beforeConfigureRootBuild(DefaultIncludedBuildRegistry.java:160)
	at org.gradle.configuration.BuildTreePreparingProjectsPreparer.prepareProjects(BuildTreePreparingProjectsPreparer.java:51)
	at org.gradle.configuration.BuildOperationFiringProjectsPreparer$ConfigureBuild.run(BuildOperationFiringProjectsPreparer.java:52)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:71)
	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:71)
	at org.gradle.configuration.BuildOperationFiringProjectsPreparer.prepareProjects(BuildOperationFiringProjectsPreparer.java:40)
	at org.gradle.initialization.DefaultGradleLauncher.prepareProjects(DefaultGradleLauncher.java:226)
	at org.gradle.initialization.DefaultGradleLauncher.doClassicBuildStages(DefaultGradleLauncher.java:163)
	at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:148)
	at org.gradle.initialization.DefaultGradleLauncher.executeTasks(DefaultGradleLauncher.java:124)
	at org.gradle.internal.invocation.GradleBuildController$1.create(GradleBuildController.java:72)
	at org.gradle.internal.invocation.GradleBuildController$1.create(GradleBuildController.java:67)
	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:213)
	at org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:67)
	at org.gradle.internal.invocation.GradleBuildController.run(GradleBuildController.java:56)
	at org.gradle.tooling.internal.provider.runner.AbstractClientProvidedBuildActionRunner.runClientAction(AbstractClientProvidedBuildActionRunner.java:53)
	at org.gradle.tooling.internal.provider.runner.ClientProvidedPhasedActionRunner.run(ClientProvidedPhasedActionRunner.java:47)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.launcher.exec.BuildOutcomeReportingBuildActionRunner.run(BuildOutcomeReportingBuildActionRunner.java:63)
	at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
	at org.gradle.tooling.internal.provider.FileSystemWatchingBuildActionRunner.run(FileSystemWatchingBuildActionRunner.java:77)
	at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run(BuildCompletionNotifyingBuildActionRunner.java:41)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.call(RunAsBuildOperationBuildActionRunner.java:49)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.call(RunAsBuildOperationBuildActionRunner.java:44)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:76)
	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:76)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:44)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.lambda$execute$0(InProcessBuildActionExecuter.java:54)
	at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:86)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:53)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:29)
	at org.gradle.launcher.exec.BuildTreeScopeLifecycleBuildActionExecuter.lambda$execute$0(BuildTreeScopeLifecycleBuildActionExecuter.java:33)
	at org.gradle.internal.buildtree.BuildTreeState.run(BuildTreeState.java:49)
	at org.gradle.launcher.exec.BuildTreeScopeLifecycleBuildActionExecuter.execute(BuildTreeScopeLifecycleBuildActionExecuter.java:32)
	at org.gradle.launcher.exec.BuildTreeScopeLifecycleBuildActionExecuter.execute(BuildTreeScopeLifecycleBuildActionExecuter.java:27)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:104)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:55)
	at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:64)
	at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:37)
	at org.gradle.tooling.internal.provider.SessionScopeLifecycleBuildActionExecuter.lambda$execute$0(SessionScopeLifecycleBuildActionExecuter.java:54)
	at org.gradle.internal.session.BuildSessionState.run(BuildSessionState.java:67)
	at org.gradle.tooling.internal.provider.SessionScopeLifecycleBuildActionExecuter.execute(SessionScopeLifecycleBuildActionExecuter.java:50)
	at org.gradle.tooling.internal.provider.SessionScopeLifecycleBuildActionExecuter.execute(SessionScopeLifecycleBuildActionExecuter.java:36)
	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:36)
	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:25)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:59)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:31)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:55)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:41)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:47)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:31)
	at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:65)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:39)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:29)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:35)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:78)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:75)
	at org.gradle.util.Swapper.swap(Swapper.java:38)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:75)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:63)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:84)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:52)
	at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)

Context

  • Spoofax version: 12.1-develop (latest)
  • Operating system & version: macOS 11.5.2
  • Java version: AdoptOpenJDK-11.0.11+9
  • Eclipse version: N/A
  • Gradle version: Gradle 7.2

Labels in SDF3 are not checked

Summary

Labels in SDF3 are not checked.

What you did

Use a label reference (in layout constraints) in SDF3, without defining the label.

What you expected to happen

An error message to appear.

What actually happened

No errors appeared.

Context

  • Spoofax version: 0.11.9
  • Operating system & version: Any

SDF3: Error in import causes a cascade of unrelated errors in the file

Summary

In SDF3, an error in an import causes a cascase of unrelated errors in the file.

What you did

An existing SDF3 file had a broken import. I imported Common (upper case) from Common.sdf3, but the module in Common.sdf3 was named module common (lower case).

imports Common

What you expected to happen

I expected only an error on the import and maybe errors on the undefined sorts.

What actually happened

I got errors on all the constructors and sorts.

Context

  • Spoofax version: Spoofax 3 v0.11.0
  • Operating system & version: macOS 11.5.2
  • Java version: AdoptOpenJDK-11.0.11+9
  • Eclipse version: 2021-03 (4.19.0) build 20210312-0638
  • Gradle version: Gradle 6.8

Additional information

Screenshot 2021-09-07 at 13 42 34

Commands that fail give no feedback in the Eclipse LWB

Summary

Commands that fail give no feedback. For example, running the "Show parsed AST" on a file that does not parse gives no feedback.

What you did

Run a command that fails.

What you expected to happen

Feedback in the form of an error pop-up to appear.

What actually happened

No feedback appears.

Context

  • Spoofax version: 0.12.1
  • Operating system & version: Any

Additional information

This used to work, but probably happened due to now running commands in Eclipse jobs? I also changed how errors are handled, which may have caused it.

SDF3 signature generation fails when alternation is used in context-free syntax

Summary

Using alternation in context-free syntax directly results in a failure during signature generation.

What you did

Consider a program such as:

Program.Program = (VarDef | FuncDef | ClassDef)* Stmt*

This syntax is only allowed for lexical productions, but unfortunately it is also supported for context-free and as a result passes both parsing and the new statix static analysis.

What you expected to happen

An error (Spoofax 2 behavior).

What actually happened

Messages of ./:
  ERROR: Could not check Stratego because it could not be configured
  Exception of message: mb.spoofax.lwb.compiler.stratego.StrategoConfigureExceptions$Sdf3SignatureGenerateFail: SDF3 to signature generator failed
  Caused by: mb.stratego.common.StrategoExceptions$StrategyFail: Invoking Stratego strategy 'pp-stratego-string' failed

Context

  • Spoofax version: 0.11.6
  • Operating system & version: Any

Constructorless SDF3 production causes build to fail at stratego signature generation

Statego signature generation fails if an SDF3 file contains a production without a constructor, such as Exp = Word in the following example:

module start

context-free start-symbols

  Start

context-free sorts

  Start
  Word
  Exp

context-free syntax

  Start.Empty = <>
  Start.Program = Exp
  Word.Hello = "Hello"
  Word.World = "World"
  Exp.Eq = Exp "==" Exp {non-assoc}
  Exp = Word  // Line causing the error

lexical syntax

  LAYOUT = [\ \n\v\f\r]

context-free restrictions

  LAYOUT? -/- [\ \n\v\f\r]

For that failing line the following signature AST is generated, which can't be pretty-printed:

OpDeclInj(
    FunType(
          FunType([ConstType(SortNoArgs("Word"{TermIndex("./src/start.sdf3", 58)}))], ConstType(SortNoArgs("Exp"{TermIndex("./src/start.sdf3", 115)})))
        , ConstType(SortNoArgs("Exp"{TermIndex("./src/start.sdf3", 115)}))
    )
)

I assume the issue is the nested FunType terms.

The entire error is as follows:

  Exception of message: mb.spoofax.lwb.compiler.stratego.StrategoConfigureExceptions$Sdf3SignatureGenerateFail: SDF3 to signature generator failed
  Caused by: mb.stratego.common.StrategoExceptions$StrategyFail: Invoking Stratego strategy 'pp-stratego-string' failed 
Stratego stack trace:
	abox2text_list_1_2
	abox2text_1_2
	abox2text_0_1
	box2text_string_0_1
	pp_stratego_string_0_0
	pp_stratego_string_0_0
Stratego input term:
Module(
  "signatures/start-sig"
, [ Imports([Import("libstratego-lib")])
  , Signature(
      [ Sorts([SortNoArgs("Start"{TermIndex("./src/start.sdf3", 12)}), SortNoArgs("Word"{TermIndex("./src/start.sdf3", 14)}), SortNoArgs("Exp"{TermIndex("./src/start.sdf3", 16)})]{TermIndex("./src/start.sdf3", 22)})
      , Constructors(
          [ OpDecl("Empty"{TermIndex("./src/start.sdf3", 27)}, ConstType(SortNoArgs("Start"{TermIndex("./src/start.sdf3", 25)})))
          , OpDecl(
              "Program"{TermIndex("./src/start.sdf3", 44)}
            , FunType([ConstType(SortNoArgs("Exp"{TermIndex("./src/start.sdf3", 90)}))], ConstType(SortNoArgs("Start"{TermIndex("./src/start.sdf3", 42)})))
            )
          , OpDecl("Hello"{TermIndex("./src/start.sdf3", 60)}, ConstType(SortNoArgs("Word"{TermIndex("./src/start.sdf3", 58)})))
          , OpDecl("World"{TermIndex("./src/start.sdf3", 76)}, ConstType(SortNoArgs("Word"{TermIndex("./src/start.sdf3", 74)})))
          , OpDecl(
              "Eq"{TermIndex("./src/start.sdf3", 92)}
            , FunType(
                [ConstType(SortNoArgs("Exp"{TermIndex("./src/start.sdf3", 90)})), ConstType(SortNoArgs("Exp"{TermIndex("./src/start.sdf3", 90)}))]
              , ConstType(SortNoArgs("Exp"{TermIndex("./src/start.sdf3", 90)}))
              )
            )
          , OpDeclInj(
              FunType(
                FunType([ConstType(SortNoArgs("Word"{TermIndex("./src/start.sdf3", 58)}))], ConstType(SortNoArgs("Exp"{TermIndex("./src/start.sdf3", 115)})))
              , ConstType(SortNoArgs("Exp"{TermIndex("./src/start.sdf3", 115)}))
              )
            )
          , OpDecl("Start-Plhdr", ConstType(SortNoArgs("Start")))
          , OpDecl("Exp-Plhdr", ConstType(SortNoArgs("Exp")))
          , OpDecl("Word-Plhdr", ConstType(SortNoArgs("Word")))
          , OpDecl(
              "Start-Plhdr"
            , FunType([ConstType(SortNoArgs("COMPLETION-INSERTION"))], ConstType(SortNoArgs("Start")))
            )
          , OpDecl(
              "Exp-Plhdr"
            , FunType([ConstType(SortNoArgs("COMPLETION-INSERTION"))], ConstType(SortNoArgs("Exp")))
            )
          , OpDecl(
              "Word-Plhdr"
            , FunType([ConstType(SortNoArgs("COMPLETION-INSERTION"))], ConstType(SortNoArgs("Word")))
            )
          , OpDecl("Start-Opt-Plhdr", ConstType(SortNoArgs("Start")))
          ]
        )
      ]
    )
  ]
)

Changing the start symbol causes an error in the Statix pre-analyze strategy

Summary

Changing the start symbol causes an error in the Statix pre/post-analyze strategy, because it refers to the start symbol.

What you did

Change the start symbol.

What you expected to happen

Things to work.

What actually happened

An error occurs due to the pre/post-analyze strategy depending on the start symbol name.

Context

  • Spoofax version: 0.11.9
  • Operating system & version: Any

Additional information

This was reported from the lab, but it should be reproduced more thoroughly.

Deleting a file causes errors

Summary

Deleting a file causes errors about the file not being found. It may be because another file with the same name exists in a subdirectory, but I'm not sure.

What you did

I had a file src/statics/declarations.stx which didn't seem to be found, so I copied it to src/declarations.stx. I opened both files (both files had errors), then closed the src/declarations.stx file and deleted it. Upon opening the src/statics/declarations.stx file and typing a letter, errors started to appear.

What you expected to happen

I expected no errors.

What actually happened

In the console the following error appeared:

15:32:37.045 | ERROR | Worker-68: Statix editor update                    | mb.spoofax.eclipse.pie.WorkspaceUpdate             | Cannot clear markers for resource 'L/tego/src/declarations.stx'; resource does not exist
15:32:37.045 | ERROR | Worker-68: Statix editor update                    | mb.spoofax.eclipse.pie.WorkspaceUpdate             | Running marker update failed unexpectedly
org.eclipse.core.internal.resources.ResourceException(/tego/src/declarations.stx)[368]: java.lang.Exception: Resource '/tego/src/declarations.stx' does not exist.
	at org.eclipse.core.internal.resources.ResourceException.provideStackTrace(ResourceException.java:42)
	at org.eclipse.core.internal.resources.ResourceException.<init>(ResourceException.java:38)
	at org.eclipse.core.internal.resources.Resource.checkExists(Resource.java:330)
	at org.eclipse.core.internal.resources.Resource.checkAccessible(Resource.java:204)
	at org.eclipse.core.internal.resources.Resource.createMarker(Resource.java:698)
	at org.eclipse.core.internal.resources.Resource.createMarker(Resource.java:689)
	at mb.spoofax.eclipse.util.MarkerUtil.create(MarkerUtil.java:26)
	at mb.spoofax.eclipse.pie.WorkspaceUpdate.createMarker(WorkspaceUpdate.java:193)
	at mb.spoofax.eclipse.pie.WorkspaceUpdate.lambda$createMarkerUpdate$0(WorkspaceUpdate.java:170)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
	at mb.spoofax.eclipse.pie.WorkspaceUpdate.lambda$createMarkerUpdate$1(WorkspaceUpdate.java:170)
	at java.base/java.lang.Iterable.forEach(Iterable.java:75)
	at mb.spoofax.eclipse.pie.WorkspaceUpdate.lambda$createMarkerUpdate$3(WorkspaceUpdate.java:166)
	at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2292)
	at mb.spoofax.eclipse.pie.WorkspaceUpdate.update(WorkspaceUpdate.java:203)
	at mb.spoofax.eclipse.pie.PieRunner.addOrUpdateEditor(PieRunner.java:145)
	at mb.spoofax.eclipse.editor.EditorUpdateJob.update(EditorUpdateJob.java:89)
	at mb.spoofax.eclipse.editor.EditorUpdateJob.run(EditorUpdateJob.java:74)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)

When trying to build the project, I get a window with the following error:

Errors occurred during the build.
Errors running builder 'Spoofax LWB builder' on project 'tego'.
Resource '/tego/src/declarations.stx' does not exist.
Resource '/tego/src/declarations.stx' does not exist.
Resource '/tego/src/declarations.stx' does not exist.
Resource '/tego/src/declarations.stx' does not exist.

Performing a Clean solved this issue.

Context

  • Spoofax version: Spoofax 3 v0.11.0
  • Operating system & version: macOS 11.5.2
  • Java version: AdoptOpenJDK-11.0.11+9
  • Eclipse version: 2021-03 (4.19.0) build 20210312-0638
  • Gradle version: Gradle 6.8

SDF3 files in subdirectories can cause the parenthesizer file to not import the correct signatures, causing build errors

Summary

SDF3 files in subdirectories can cause the parenthesizer file to not import the correct signatures, causing build errors.

What you did

Put syntax in subdirectories and build the language project.

What you expected to happen

Building to succeed.

What actually happened

Build fails with errors in in the generated parenthesizer file.

Context

  • Spoofax version: 0.11.11
  • Operating system & version: Any

Additional information

Commit from student that reproduces the problem: https://gitlab.ewi.tudelft.nl/CS4200/2021-2022/student-njkyu/-/commit/44d4d4f09f161a5702dbc17afdce8db7625468de

Editor errors while SPT tests pass

Summary

Sometimes (after an unknown series of events) syntax highlighting in SDF files just stop working. If you copy seemingly correct code from one file to a different file, eclipse decides it is not valid anymore. For example, this file:

image

Has no code highlighting and a couple of errors (even though SPT tests pass!).

What you did

Having certain files open/closed has to do with it. In the above screenshot, expression.sdf3 also has errors (of a similar nature) and that happened after I closed all files and then reopened that specific one. Since then the errors persist (even though the contents did not change).

The errors I got were of the following nature:
image
in the image above it says "syntax error - unexpected character i" (so that's where the red line starts)

image
in this line it didn't like the character a, same error message.

image
image
here (in expression.sdf3, the other failing file) it can't find any of the constructors for sorts (for every sort) even though they are quite clearly defined above. The fact that SPT tests pass shows that the syntax is fine. It's just the editor.

I tried to resolve these editor errors in a number of ways:

  • creating a new project from scratch with the same source files in them
  • deleting the build folder
  • cleaning the project
  • asking for TAs during the course CS4200 to take a look at it (they recommended me to create an issue here)
  • moving the code in the erronious files to different files which (when created) did not contain errors. Errors persist so that does suggest something is wrong with the syntax definition itself. It does however not explain why SPT tests pass

Context

  • Spoofax version: org.metaborg.spoofax.eclipse 2.6.0.20201009-123724-cs4200
  • Operating system & version: Archlinux + Gnome with kernel 5.14.8-arch1-1
  • Java version (if applicable): issues found with both java-11-openjdk and java-16-openjdk as system default.
  • Eclipse version (if applicable):
  • Gradle version (if applicable):

Giving a name to a bracket production in SDF3 breaks generated Stratego

Summary

Using an SDF3 bracket production with a constructor name breaks the generated Stratego 2 pretty printer.

What you did

Expr.Bracketed = <(<Expr>)> {bracket}

What you expected to happen

Error.

What actually happened

Messages of ./build/generated/sources/languageSpecification/stratego/pp/exps-pp.str2:
  ERROR 46628-46635@1583-1584: Undefined constructor with arity 1 and type DynT(Dyn).
  ERROR 46360-46367@1572-1573: Undefined constructor with arity 1 and type DynT(Dyn).
  ERROR 46102-46109@1561-1562: Undefined constructor with arity 1 and type DynT(Dyn).
  ERROR 46060-46067@1558-1559: Undefined constructor with arity 1 and type DynT(Dyn).
  ERROR 45388-45395@1540-1541: Undefined constructor with arity 1 and type DynT(Dyn).

Context

  • Spoofax version: 0.11.11
  • Operating system & version: All

Spaces in Eclipse workspace path make language builds fail (on Windows)

Summary

Spaces in Eclipse workspace path make language builds fail.

What you did

Build a language in an Eclipse workspace with spaces in the path.

What you expected to happen

Building to succeed.

What actually happened

Building fails with an unhelpful error.

Context

  • Spoofax version: 0.11.6
  • Operating system & version: Windows, but may apply to others as well.

SDF3 file cannot be named main.sdf3

Summary

An sdf3 file cannot be named main.sdf3.

What you did

As all the main files in a Spoofax 3 project are named main, I renamed start.sdf3 to main.sdf3 (and changed the module name). This, however, failed because the build could no longer locate src/start.sdf3. Then I thought I would add a dummy start.sdf3 that redirects to main, but then I get errors that main cannot be found (even after clean). Renaming main.sdf3 to main2.sdf3 (and changing the module name) fixed the issue.

module start
imports main

What you expected to happen

I expected main.sdf3 to be fine.

What actually happened

The main SDF3 module could not be found, whereas renaming it to main2 fixed the issue.

Context

  • Spoofax version: Spoofax 3 v0.11.0
  • Operating system & version: macOS 11.5.2
  • Java version: AdoptOpenJDK-11.0.11+9
  • Eclipse version: 2021-03 (4.19.0) build 20210312-0638
  • Gradle version: Gradle 6.8

SDF3 constructors that start with a lowercase letter cause errors in the generated Statix signature

Summary

Starting a constructor with a lower-case letter results in invalid syntax for the generated Statix signature.

What you did

Start.aa = <1>

What you expected to happen

Works.

What actually happened

Messages of ./build/generated/sources/languageSpecification/statix/signatures/start-sig.stx:
ERROR 292-295@23: Syntax error, expected: 'imports'
ERROR 296-302@24: Syntax error, not expected here: '    aa'
ERROR 303-304@24: Syntax error, not expected here: ':'
ERROR 310@24: Syntax error, expected: 'constructors'
ERROR ...

Context

  • Spoofax version: 0.11.9
  • Operating system & version: all

Deadlock when closing editor while build is running in the Eclipse LWB

Summary

Eclipse deadlocks when closing an editor while build is running in the Eclipse LWB.

What you did

Close an editor.

What you expected to happen

The editor to be closed and no deadlocks.

What actually happened

A deadlock occurs and Eclipse hangs.

Context

  • Spoofax version: 0.11.12
  • Operating system & version: Any

Additional information

Thread dump: https://gist.github.com/Gohla/52a47533c560be6d30b32021af2a2d44

Should be solved by performing the editor close in a job.

LAYOUT?-CF not accepted in Sdf3 Statix

The Statix specification correctly rejects any optional sorts (A?) in context-free syntax. However, the LAYOUT? sort is special in kernel syntax, and I think it should be allowed:

Section-CF.Section = "section" SectionName-CF LAYOUT?-CF Definition*-CF

Optionals (A?) are not allowed in context-free syntax

Here is a project with WebDSL syntax in which this is an issue, in WebDSL-Core.sdf3, line 49:

📂 webdsl.zip

SDF3 module name not corresponding to filename causes unexpected errors

Summary

SDF3 module name not corresponding to filename causes unexpected errors.

What you did

Create an SDF3 file where the module name does not correspond to the filename. For example, src/start.sdf3 with module bla at the top.

What you expected to happen

Either give an error or make sure that things work correctly even when the names do not match.

What actually happened

There was an error in the generated pp.str2 about some strategies not existing, due to them being generated with a different name.

Context

  • Spoofax version: 0.11.9
  • Operating system & version: Any

Additional information

This was reported from the lab, but it should be reproduced more thoroughly.

UI hang when invoking hover/reference resolution for the first time after a change in the Eclipse LWB

Summary

The UI hangs when invoking hover/reference resolution for the first time after a change in the Eclipse LWB. After that first time it is fast until a change is made to a source file again.

What you did

Invoke hover/reference resolution for the first time after a change.

What you expected to happen

No UI hang to occur, and to get hover/reference resolution feedback quickly.

What actually happened

The UI briefly hangs.

Context

  • Spoofax version: 0.11.10
  • Operating system & version: Any

Several generated files fail when using SDF3 files with a capitalized name.

Summary

Several of the files generated by Spoofax during SDF3 compilation will choose to lowercase the generated file name, without also lowercasing the module name. As a result, compilation fails since the module name differs from the file name.

What you did

In src/Exp.sdf:

module Exp

...

What you expected to happen

Either compilation fails (require a lowercase filename), or everything works fine (and support mixed-case filenames).

What actually happened

In generated/statix/signatures/exp-sig.stx (fully lowercase path):

module signatures/Exp-sig
...

In generated/stratego/injections/exp-injections.str2 (fully lowercase path):

module injections/Exp-injections
...

In generated/stratego/pp/exp-pp.str2 (fully lowercase path):

module pp/Exp-pp
...

In generated/stratego/signatures/exp-sig.str2 (fully lowercase path):

module signatures/Exp-sig
...

The modules do not match the names of the files. The contents of the files all reference the capitalized name, but the files are written with a lowercase name. Causes several build errors.

Context

  • Spoofax version: 0.11.11
  • Operating system & version: Windows 10

Spoofax menus disappearing in Eclipse

Summary

Spoofax adds custom menus to the top of Eclipse to activate certain actions, but these menus do not work because they disappear when clicked on.
Examples of these menus are Spoofax, SDF3, ESV, etc.

What you did

Click on the menus to open debug options.

What you expected to happen

The menu to open and be accessible.

What actually happened

The menus disappears, see the clip attached below.

Context

  • Spoofax version: 0.11.9
  • Operating system & version: Fedora 33 kernel 5.12.8-200.fc33.x86_64
  • Java version (if applicable): openjdk 11.0.12 2021-07-20
  • Eclipse version (if applicable): 2021-03 (4.19.0)

Additional information

Button Menu is gone

Rebuilding project doesn't recreate the structure of the build directory

Summary

After cleaning and rebuilding the language project, there are errors about the missing files in the build directory.

Stacktrace from the error:

Printing with context:
  currentDir: ./ = /week1prolog/
mb.pie.api.ExecException: Executing task 'mb.pie.task.archive.UnarchiveFromJar(Input{inputJarFile=java##file:/home/homedir/bin/spoofax3/plugins/libspoofax2.eclipse_0.11.7.jar, o...)' failed unexpectedly
  at mb.pie.runtime.exec.TaskExecutor.execInternal(TaskExecutor.java:123)
  at mb.pie.runtime.exec.TaskExecutor.exec(TaskExecutor.java:81)
  at mb.pie.runtime.exec.TopDownRunner.exec(TopDownRunner.java:195)
  at mb.pie.runtime.exec.TopDownRunner.executeOrGetExisting(TopDownRunner.java:140)
  at mb.pie.runtime.exec.TopDownRunner.require(TopDownRunner.java:80)
  at mb.pie.runtime.exec.ExecContextImpl.require(ExecContextImpl.java:95)
  at mb.pie.runtime.exec.ExecContextImpl.require(ExecContextImpl.java:114)
  at mb.pie.api.STask.get(STask.java:61)
  at mb.pie.api.MappedSupplier.get(MappedSupplier.java:17)
  at mb.pie.api.MappedSupplier.get(MappedSupplier.java:17)
  at mb.pie.api.MappedSupplier.get(MappedSupplier.java:17)
  at mb.pie.runtime.exec.ExecContextImpl.require(ExecContextImpl.java:124)
  at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
  at mb.common.util.BaseCollectionView.forEach(BaseCollectionView.java:88)
  at mb.esv.task.spoofax.EsvParseWrapper.lambda$exec$0(EsvParseWrapper.java:38)
  at mb.common.option.Option.ifSome(Option.java:66)
  at mb.esv.task.spoofax.EsvParseWrapper.lambda$exec$1(EsvParseWrapper.java:38)
  at mb.common.option.Option.ifSome(Option.java:66)
  at mb.common.result.Result.ifOk(Result.java:88)
  at mb.esv.task.spoofax.EsvParseWrapper.lambda$exec$2(EsvParseWrapper.java:38)
  at java.base/java.util.Optional.ifPresent(Optional.java:183)
  at mb.esv.task.spoofax.EsvParseWrapper.exec(EsvParseWrapper.java:38)
  at mb.esv.task.spoofax.EsvParseWrapper.exec(EsvParseWrapper.java:16)
  at mb.pie.api.Task.exec(Task.java:56)
  at mb.pie.runtime.exec.TaskExecutor.execInternal(TaskExecutor.java:110)
  at mb.pie.runtime.exec.TaskExecutor.exec(TaskExecutor.java:81)
  at mb.pie.runtime.exec.TopDownRunner.exec(TopDownRunner.java:195)
  at mb.pie.runtime.exec.TopDownRunner.executeOrGetExisting(TopDownRunner.java:140)
  at mb.pie.runtime.exec.TopDownRunner.require(TopDownRunner.java:80)
  at mb.pie.runtime.exec.ExecContextImpl.require(ExecContextImpl.java:95)
  at mb.pie.runtime.exec.ExecContextImpl.require(ExecContextImpl.java:78)
  at mb.esv.util.EsvVisitor.parse(EsvVisitor.java:131)
  at mb.esv.util.EsvVisitor.visitMainFile(EsvVisitor.java:62)
  at mb.esv.task.EsvCheck.exec(EsvCheck.java:74)
  at mb.esv.task.EsvCheck.exec(EsvCheck.java:23)
  at mb.pie.api.Task.exec(Task.java:56)
  at mb.pie.runtime.exec.TaskExecutor.execInternal(TaskExecutor.java:110)
  at mb.pie.runtime.exec.TaskExecutor.exec(TaskExecutor.java:81)
  at mb.pie.runtime.exec.TopDownRunner.exec(TopDownRunner.java:195)
  at mb.pie.runtime.exec.TopDownRunner.executeOrGetExisting(TopDownRunner.java:140)
  at mb.pie.runtime.exec.TopDownRunner.require(TopDownRunner.java:80)
  at mb.pie.runtime.exec.ExecContextImpl.require(ExecContextImpl.java:95)
  at mb.pie.runtime.exec.ExecContextImpl.require(ExecContextImpl.java:78)
  at mb.spoofax.lwb.compiler.esv.CheckEsv.lambda$exec$0(CheckEsv.java:33)
  at mb.common.option.Option.mapOrElse(Option.java:126)
  at mb.spoofax.lwb.compiler.esv.CheckEsv.lambda$exec$1(CheckEsv.java:32)
  at mb.common.option.Option.mapOrElse(Option.java:126)
  at mb.common.result.Result.mapOrElse(Result.java:271)
  at mb.spoofax.lwb.compiler.esv.CheckEsv.exec(CheckEsv.java:31)
  at mb.spoofax.lwb.compiler.esv.CheckEsv.exec(CheckEsv.java:13)
  at mb.pie.api.Task.exec(Task.java:56)
  at mb.pie.runtime.exec.TaskExecutor.execInternal(TaskExecutor.java:110)
  at mb.pie.runtime.exec.TaskExecutor.exec(TaskExecutor.java:81)
  at mb.pie.runtime.exec.TopDownRunner.exec(TopDownRunner.java:195)
  at mb.pie.runtime.exec.TopDownRunner.executeOrGetExisting(TopDownRunner.java:140)
  at mb.pie.runtime.exec.TopDownRunner.require(TopDownRunner.java:80)
  at mb.pie.runtime.exec.ExecContextImpl.require(ExecContextImpl.java:95)
  at mb.pie.runtime.exec.ExecContextImpl.require(ExecContextImpl.java:78)
  at mb.spoofax.lwb.compiler.CheckLanguageSpecification.exec(CheckLanguageSpecification.java:55)
  at mb.spoofax.lwb.compiler.CheckLanguageSpecification.exec(CheckLanguageSpecification.java:24)
  at mb.pie.api.Task.exec(Task.java:56)
  at mb.pie.runtime.exec.TaskExecutor.execInternal(TaskExecutor.java:110)
  at mb.pie.runtime.exec.TaskExecutor.exec(TaskExecutor.java:81)
  at mb.pie.runtime.exec.TopDownRunner.exec(TopDownRunner.java:195)
  at mb.pie.runtime.exec.TopDownRunner.executeOrGetExisting(TopDownRunner.java:140)
  at mb.pie.runtime.exec.TopDownRunner.require(TopDownRunner.java:80)
  at mb.pie.runtime.exec.TopDownRunner.requireInitial(TopDownRunner.java:59)
  at mb.pie.runtime.MixedSessionImpl.lambda$require$1(MixedSessionImpl.java:86)
  at mb.pie.runtime.SessionImpl.handleException(SessionImpl.java:149)
  at mb.pie.runtime.MixedSessionImpl.require(MixedSessionImpl.java:86)
  at mb.spoofax.lwb.eclipse.SpoofaxLwbBuilder.topDownBuild(SpoofaxLwbBuilder.java:145)
  at mb.spoofax.lwb.eclipse.SpoofaxLwbBuilder.fullBuild(SpoofaxLwbBuilder.java:114)
  at mb.spoofax.lwb.eclipse.SpoofaxLwbBuilder.access$000(SpoofaxLwbBuilder.java:58)
  at mb.spoofax.lwb.eclipse.SpoofaxLwbBuilder$1.run(SpoofaxLwbBuilder.java:81)
  at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2292)
  at mb.spoofax.lwb.eclipse.SpoofaxLwbBuilder.build(SpoofaxLwbBuilder.java:96)
  at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:846)
  at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
  at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:229)
  at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:277)
  at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:330)
  at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
  at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:333)
  at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:385)
  at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:406)
  at org.eclipse.core.internal.resources.Workspace.buildInternal(Workspace.java:515)
  at org.eclipse.core.internal.resources.Workspace.build(Workspace.java:405)
  at org.eclipse.ui.actions.GlobalBuildAction$1.run(GlobalBuildAction.java:180)
  at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
Caused by: java.io.IOException: Creating a new output stream for resource 'L./build/unarchive/libspoofax2/libspoofax2.eclipse_0.11.7.jar/mb/libspoofax2/editor/libspoofax/color/default.esv' failed unexpectedly
  at mb.spoofax.eclipse.resource.EclipseResource.openWrite(EclipseResource.java:226)
  at mb.resource.WritableResource.openWriteBuffered(WritableResource.java:56)
  at mb.pie.task.archive.UnarchiveCommon.unarchive(UnarchiveCommon.java:185)
  at mb.pie.task.archive.UnarchiveCommon.unarchiveJar(UnarchiveCommon.java:130)
  at mb.pie.task.archive.UnarchiveCommon.unarchiveJar(UnarchiveCommon.java:88)
  at mb.pie.task.archive.UnarchiveFromJar.exec(UnarchiveFromJar.java:102)
  at mb.pie.task.archive.UnarchiveFromJar.exec(UnarchiveFromJar.java:15)
  at mb.pie.api.Task.exec(Task.java:56)
  at mb.pie.runtime.exec.TaskExecutor.execInternal(TaskExecutor.java:110)
  ... 88 more in common with parent stacktrace
Caused by: org.eclipse.core.runtime.CoreException: Could not write file: /home/homedir/spoofax-workspace./build/unarchive/libspoofax2/libspoofax2.eclipse_0.11.7.jar/mb/libspoofax2/editor/libspoofax/color/default.esv.
  at org.eclipse.core.internal.filesystem.Policy.error(Policy.java:48)
  at org.eclipse.core.internal.filesystem.local.LocalFile.openOutputStream(LocalFile.java:434)
  at mb.spoofax.eclipse.resource.EclipseResource.openWrite(EclipseResource.java:224)
  ... 96 more in common with parent stacktrace
Caused by: java.io.FileNotFoundException: /home/homedir/spoofax-workspace./build/unarchive/libspoofax2/libspoofax2.eclipse_0.11.7.jar/mb/libspoofax2/editor/libspoofax/color/default.esv (No such file or directory)
  at java.base/java.io.FileOutputStream.open0(Native Method)
  at java.base/java.io.FileOutputStream.open(FileOutputStream.java:298)
  at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:237)
  at org.eclipse.core.internal.filesystem.local.LocalFile.openOutputStream(LocalFile.java:424)
  ... 97 more in common with parent stacktrace

What you did

Tried restarting Eclipse, cleaning the cache (.metadata/.plugins/spoofax.lwb.eclipse/pieStore file in the Eclipse workspace) and repeatedly cleaning and rebuilding the project.

What you expected to happen

Since the build directory is part of the .gitignore file, it should be recreated deterministically every time it's removed and the build action is invoked in Eclipse.

What actually happened

Upon removal of the build directory, its structure is not rebuilt properly and it's impossible to continue working with the project in the IDE.

Context

  • Spoofax version: 0.11.7
  • Operating system & version: OS=linux, ARCH=x86_64, WS=gtk, NL=en_US
  • Java version (if applicable): 11.0.11 (AdoptOpenJDK)
  • Eclipse version (if applicable): Version: 2021-03 (4.19.0), Build id: 20210312-0638
  • Gradle version (if applicable): N/A

Additional information

The build directory contains only one eclipseclasses folder:

Screenshot from 2021-09-11 17-11-30

Could not generate unknown file: Attempt to recreate a file for type

Summary

After the initial compilation, recompilation of Spoofax 3 fails with a hundred of these errors:

> Task :pie.lang.root:pie.lang.test:compileTestJava
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/unary/toNullable/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.unary.toNullable.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/unary/notFalse/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.unary.notFalse.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^

It also makes the build extremely slow.

What you did

Invoke the build:

./gradlew buildAll --info --stacktrace

What you expected to happen

The build should succeed.

What actually happened

The build fails with a hundred of these errors.

Context

  • Spoofax version: devenv-latest
  • Operating system & version: macOS 11.5.2
  • Java version: AdoptOpenJDK-11.0.11+9
  • Eclipse version: N/A
  • Gradle version: 6.8

Additional information

Apparently this issue sometimes pops up with Dagger, see here and here. Supposedly with Maven (but also Gradle), in both Intellij and Eclipse:

The maven-compiler-plugin adds the generated sources to the sources passed to the compiler, so compilation can only run once without error; afterwards, a file generated by Dagger will be fed as a source (like all your src/main/java) to JavaC, and compilation will fail when Dagger will try to regenerate the file as JavaC will refuse to overwrite a source file.

I suspect there is a problem where something is already generated before the Dagger annotation processor starts to work.

Therefore, a workaround could be to delete the generated files before building. The following command in the pie project deletes all untracked and ignored files and directories, and seems to help:

git clean -fdx

Full Gradle output:


> Task :pie.lang.root:pie.lang.test:compileTestJava
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/unary/toNullable/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.unary.toNullable.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/unary/notFalse/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.unary.notFalse.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/unary/toNonNullableValue/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.unary.toNonNullableValue.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/unary/notVarFalse/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.unary.notVarFalse.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/unary/toNonNullableNull/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.unary.toNonNullableNull.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/unary/notTrue/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.unary.notTrue.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/unary/toNullableVar/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.unary.toNullableVar.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/unary/notVarTrue/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.unary.notVarTrue.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/imports/subModule/importPartialModulePathForeignJava/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.imports.subModule.importPartialModulePathForeignJava.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/imports/subModule/importPartialModulePathRename/PieTestModule.java:16: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.imports.subModule.importPartialModulePathRename.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/imports/subModule/importFunctionRename/PieTestModule.java:16: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.imports.subModule.importFunctionRename.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/imports/subModule/importFullModulePathForeignPie/PieTestModule.java:16: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.imports.subModule.importFullModulePathForeignPie.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/imports/subModule/importFullModulePath/PieTestModule.java:16: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.imports.subModule.importFullModulePath.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/imports/subModule/importFullModulePathDataAssignment/PieTestModule.java:17: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.imports.subModule.importFullModulePathDataAssignment.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/imports/subModule/multiImportPseudoModule/PieTestModule.java:16: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.imports.subModule.multiImportPseudoModule.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/imports/subModule/importDataRename/PieTestModule.java:16: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.imports.subModule.importDataRename.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/imports/subModule/importFunction/PieTestModule.java:16: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.imports.subModule.importFunction.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/imports/subModule/importPartialModulePathData/PieTestModule.java:17: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.imports.subModule.importPartialModulePathData.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/imports/subModule/importPartialModulePath/PieTestModule.java:16: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.imports.subModule.importPartialModulePath.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/imports/subModule/importFullModulePathForeignJava/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.imports.subModule.importFullModulePathForeignJava.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/imports/subModule/importPartialModulePathForeignPie/PieTestModule.java:16: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.imports.subModule.importPartialModulePathForeignPie.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/imports/subModule/importFullyQualifiedData/PieTestModule.java:17: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.imports.subModule.importFullyQualifiedData.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/imports/subModule/importFullyQualifiedForeignPie/PieTestModule.java:16: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.imports.subModule.importFullyQualifiedForeignPie.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/imports/subModule/importPartialModulePathPseudo/PieTestModule.java:16: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.imports.subModule.importPartialModulePathPseudo.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/imports/subModule/importFullyQualified/PieTestModule.java:16: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.imports.subModule.importFullyQualified.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/imports/subModule/importData/PieTestModule.java:16: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.imports.subModule.importData.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/imports/subModule/importDataPseudoModule/PieTestModule.java:16: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.imports.subModule.importDataPseudoModule.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/imports/subModule/importFunctionPseudoModule/PieTestModule.java:16: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.imports.subModule.importFunctionPseudoModule.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/imports/subModule/multiImport/PieTestModule.java:16: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.imports.subModule.multiImport.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/imports/subModule/importFullModulePathData/PieTestModule.java:17: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.imports.subModule.importFullModulePathData.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/imports/subModule/importFullyQualifiedForeignJava/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.imports.subModule.importFullyQualifiedForeignJava.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/foreignFunc/constructor/twoParam/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.foreignFunc.constructor.twoParam.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/foreignFunc/constructor/singleParam/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.foreignFunc.constructor.singleParam.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/foreignFunc/constructor/threeParam/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.foreignFunc.constructor.threeParam.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/foreignFunc/constructor/nullary/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.foreignFunc.constructor.nullary.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/supplier/createAndGet/typeInt/PieTestModule.java:16: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.supplier.createAndGet.typeInt.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/supplier/createAndGet/nested/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.supplier.createAndGet.nested.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/supplier/createAndGet/typeString/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.supplier.createAndGet.typeString.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/supplier/inputSupplier/inputFromPiePassAlong/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.supplier.inputSupplier.inputFromPiePassAlong.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/supplier/inputSupplier/inputFromPieCreate/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.supplier.inputSupplier.inputFromPieCreate.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/supplier/inputSupplier/inputFromTest/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.supplier.inputSupplier.inputFromTest.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/supplier/fromTaskAndGet/helloName/PieTestModule.java:17: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.supplier.fromTaskAndGet.helloName.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/supplier/fromTaskAndGet/foreignTask/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.supplier.fromTaskAndGet.foreignTask.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/supplier/fromTaskAndGet/tripleInt/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.supplier.fromTaskAndGet.tripleInt.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/supplier/fromTaskAndGet/fullyQualifiedSupplier/PieTestModule.java:16: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.supplier.fromTaskAndGet.fullyQualifiedSupplier.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/variables/variableTupleDecompositionMixedType/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.variables.variableTupleDecompositionMixedType.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/variables/variableTupleAssignment/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.variables.variableTupleAssignment.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/variables/variableImplicitType/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.variables.variableImplicitType.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/variables/variableTupleDecompositionImplicitType/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.variables.variableTupleDecompositionImplicitType.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/variables/variableTupleDecompositionExplicitType/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.variables.variableTupleDecompositionExplicitType.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/variables/variableExplicitType/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.variables.variableExplicitType.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/funcDef/oneFunc/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.funcDef.oneFunc.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/funcDef/emptyFile/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.funcDef.emptyFile.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs() {
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/funcDef/twoFuncRecursive/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.funcDef.twoFuncRecursive.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/funcDef/twoFuncLinear/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.funcDef.twoFuncLinear.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/funcDef/twoFuncUnused/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.funcDef.twoFuncUnused.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/land/landFalseFalse/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.land.landFalseFalse.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/land/landTrueTrue/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.land.landTrueTrue.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/land/landFalseTrue/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.land.landFalseTrue.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/land/landTrueFalse/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.land.landTrueFalse.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/eq/eqPathDifferent/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.eq.eqPathDifferent.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/eq/eqListEqualEmpty/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.eq.eqListEqualEmpty.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/eq/eqStringDifferent/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.eq.eqStringDifferent.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/eq/eqTupleDifferent/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.eq.eqTupleDifferent.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/eq/eqBoolEqual/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.eq.eqBoolEqual.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/eq/eqPathEqual/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.eq.eqPathEqual.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/eq/eqTupleEqual/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.eq.eqTupleEqual.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/eq/eqDataDifferent/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.eq.eqDataDifferent.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/eq/eqNullableIntDifferent/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.eq.eqNullableIntDifferent.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/eq/eqBoolDifferent/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.eq.eqBoolDifferent.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/eq/eqListDifferentElements/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.eq.eqListDifferentElements.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/eq/eqListDifferentSize/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.eq.eqListDifferentSize.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/eq/eqNullableIntNull/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.eq.eqNullableIntNull.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/eq/eqStringEqual/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.eq.eqStringEqual.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/eq/eqIntEqual/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.eq.eqIntEqual.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/eq/eqIntDifferent/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.eq.eqIntDifferent.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/eq/eqNullableIntEqual/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.eq.eqNullableIntEqual.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/eq/eqListEqual/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.eq.eqListEqual.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/eq/eqDataEqual/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.eq.eqDataEqual.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/add/addIntInt/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.add.addIntInt.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/add/addStrData/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.add.addStrData.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/add/addListList/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.add.addListList.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/add/addStrNullableIntValue/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.add.addStrNullableIntValue.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/add/addPathPathRelativeAbsolute/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.add.addPathPathRelativeAbsolute.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/add/addStrBool/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.add.addStrBool.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/add/addStrList/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.add.addStrList.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/add/addStrNullableIntNull/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.add.addStrNullableIntNull.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/add/addPathPathAbsoluteRelative/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.add.addPathPathAbsoluteRelative.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/add/addPathPathRelativeRelative/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.add.addPathPathRelativeRelative.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/add/addListElem/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.add.addListElem.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/add/addStrPath/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.add.addStrPath.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/add/addStrStr/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.add.addStrStr.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/add/addPathPathAbsoluteAbsolute/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.add.addPathPathAbsoluteAbsolute.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/add/addPathStr/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.add.addPathStr.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/add/addStrInt/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.add.addStrInt.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/add/addStrUnit/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.add.addStrUnit.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/add/addStrTuple/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.add.addStrTuple.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/lor/lorTrueTrue/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.lor.lorTrueTrue.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/lor/lorFalseFalse/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.lor.lorFalseFalse.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
/Users/daniel/repos/spoofax3/devenv-cc-sept-21-2/pie/lang/lang.test/src/test/java/mb/pie/lang/test/binary/lor/lorFalseTrue/PieTestModule.java:15: error: Could not generate unknown file: Attempt to recreate a file for type mb.pie.lang.test.binary.lor.lorFalseTrue.PieTestModule_ProvideTaskDefsFactory.
    public static Set<TaskDef<?, ?>> provideTaskDefs(
                                     ^
100 errors

> Task :pie.lang.root:pie.lang.test:compileTestJava FAILED
:pie.lang.root:pie.lang.test:compileTestJava (Thread[included builds Thread 14,5,main]) completed. Took 7.603 secs.

Support SDF3 placeholder prefix/postfix option

In Spoofax 2, the placeholder characters that SDF3 generates for a grammar can be configured with:

language:
  sdf:
    placeholder:
      prefix: "$"

but this is not yet supported in Spoofax 3. We should add configuration options for this to spoofaxc.cfg

Inconsistency between generated SDF constructor names in Spoofax 2 and Spoofax 3

Spoofax 3 generates different names for "alias" SDF3 terms. Consider the following:

Expr.ExprCExpr = CExpr

Spoofax 2 will ignore the explicitly given constructor name and generate a rule called CExpr2Expr. Spoofax 3 does the right thing (in my opinion, at least) and uses ExprCExpr. Unsure if this is a bug or something that should just be documented in some transition to Spoofax 3 guide.

If you don't explicitly give a constructor (e.g. Expr = CExpr), both Spoofax 2 and 3 will generate CExpr2Expr.

SPT syntax tests succeed even if the parse result is ambiguous

Summary

A parse test that yields an ambiguous AST succeeds, whereas the same test in Spoofax 2 would fail.

What you did

SDF3:

Term.Lit = INT
Term.Add = Term "+" Term

SPT:

test ambiguous [[
3 + 1 + 2
]] parse succeeds

What you expected to happen

The test fails.

What actually happened

The test succeeds.

Context

  • Spoofax version: 0.11.6
  • Operating system & version: All

Additional information

Especially annoying because the WebLab tests for CS4200 still use Spoofax 2, so students end up having a solution that works in their own Eclipse but fails on WebLab (rightfully so, since it is ambiguous).

ValidationException on configuration change

Summary

I changed the .cfg of my Tiger language to use JSGLR2 instead of JSGLR1, rebuilt and restarted the LWB, and PIE fails to compile the new language, giving this error:

ValidationException: Visited task with same key was required with different input in same session.

What you did

I changed the parser configuration of my Tiger pure Spoofax 3 project from:

parser {
  default-start-symbol = sort Module
  variant = jsglr1
}

to

parser {
  default-start-symbol = sort Module
  variant = jsglr2 { }
}

I did some other things in between, which is why I rebuilt and restarted the LWB. The Tiger language was loaded again, and PIE gave the above error on build.

What you expected to happen

I expected PIE to recognize that the configuration has changed, and rerun the appropriate tasks. I suspect PIE has serialized some state that is now incorrect.

What actually happened

I got this error:

11:34:12.354 | DEBUG | → mb.spoofax.compiler.adapter.AdapterProjectCompiler(AdapterProjectInputSupplier(mb.cfg.task.CfgRootDirectoryToObject(eclipse-resource##/tiger))) (reason: directly or indirectly affected by change)
11:34:12.361 | DEBUG | ← mb.pie.runtime.layer.ValidationException: Visited task with same key was required with different input in same session.
mb.pie.runtime.layer.ValidationException: Visited task with same key was required with different input in same session. Cause:
task with key
  #mb.spoofax.compiler.adapter.ParserAdapterCompiler(eclipse-resource##/tiger)
was already visited with input
  Input{..., languageProjectInput=Input{..., variant=jsglr1(), ...}, ...}
while now required with input
  Input{..., languageProjectInput=Input{..., variant=jsglr2(Recovery), ...}, ...}
	at mb.pie.runtime.layer.ValidationLayer.error(ValidationLayer.java:466)
	at mb.pie.runtime.layer.ValidationLayer.validateVisited(ValidationLayer.java:187)
	at mb.pie.runtime.exec.BottomUpRunner.getData(BottomUpRunner.java:201)
	at mb.pie.runtime.exec.BottomUpRunner.require(BottomUpRunner.java:185)
	at mb.pie.runtime.exec.ExecContextImpl.require(ExecContextImpl.java:110)
	at mb.pie.runtime.exec.ExecContextImpl.require(ExecContextImpl.java:90)
	at mb.spoofax.compiler.adapter.AdapterProjectCompiler.lambda$compile$1(AdapterProjectCompiler.java:134)
	at java.base/java.util.Optional.ifPresent(Optional.java:183)
	at mb.spoofax.compiler.adapter.AdapterProjectCompiler.compile(AdapterProjectCompiler.java:134)
	at mb.spoofax.compiler.adapter.AdapterProjectCompiler.lambda$exec$0(AdapterProjectCompiler.java:125)
	at mb.common.result.Result.mapThrowing(Result.java:294)
	at mb.spoofax.compiler.adapter.AdapterProjectCompiler.exec(AdapterProjectCompiler.java:125)
	at mb.spoofax.compiler.adapter.AdapterProjectCompiler.exec(AdapterProjectCompiler.java:47)
	at mb.pie.api.Task.exec(Task.java:56)
	at mb.pie.runtime.exec.TaskExecutor.execInternal(TaskExecutor.java:126)
	at mb.pie.runtime.exec.TaskExecutor.exec(TaskExecutor.java:82)
	at mb.pie.runtime.exec.BottomUpRunner.exec(BottomUpRunner.java:369)
	at mb.pie.runtime.exec.BottomUpRunner.execAndSchedule(BottomUpRunner.java:133)
	at mb.pie.runtime.exec.BottomUpRunner.execScheduled(BottomUpRunner.java:120)
	at mb.pie.runtime.exec.BottomUpRunner.requireInitial(BottomUpRunner.java:83)
	at mb.pie.runtime.MixedSessionImpl.lambda$updateAffectedBy$0(MixedSessionImpl.java:70)
	at mb.pie.runtime.SessionImpl.handleException(SessionImpl.java:160)
	at mb.pie.runtime.MixedSessionImpl.updateAffectedBy(MixedSessionImpl.java:70)
	at mb.spoofax.lwb.eclipse.SpoofaxLwbBuilder.bottomUpBuild(SpoofaxLwbBuilder.java:192)
	at mb.spoofax.lwb.eclipse.SpoofaxLwbBuilder.incrBuild(SpoofaxLwbBuilder.java:135)

Full error:

11:34:12.354 | DEBUG | Worker-23: Build Project                           | mb.pie.runtime.tracer.LoggingTracer                |   → mb.spoofax.compiler.adapter.AdapterProjectCompiler(AdapterProjectInputSupplier(mb.cfg.task.CfgRootDirectoryToObject(eclipse-resource##/tiger))) (reason: directly or indirectly affected by change)
11:34:12.361 | DEBUG | Worker-23: Build Project                           | mb.pie.runtime.tracer.LoggingTracer                |   ← mb.pie.runtime.layer.ValidationException: Visited task with same key was required with different input in same session. Cause:\ntask with key\n  #mb.spoofax.compiler.adapter.ParserAdapterCompiler(eclipse-resource##/tiger)\nwas already visited with input\n  Input{classKind=Generated, baseParseTaskDef=TypeInfo{packageId=mb.tiger.task, id=TigerParse}, baseTokenizeTaskDef=TypeInfo{packageId=mb.tiger.task, id=TigerTokenize}, baseShowParsedAstTaskDef=TypeInfo{packageId=mb.tiger.task, id=TigerShowParsedAst}, showParsedAstCommand=CommandDefRepr{type=TypeInfo{packageId=mb.tiger.command, id=TigerShowParsedAstCommand}, taskDefType=TypeInfo{packageId=mb.tiger.task, id=TigerShowParsedAst}, argType=TypeInfo{packageId=mb.tiger.task, id=TigerShowParsedAst.Args}, displayName=Show parsed AST, description=Shows the parsed AST, supportedExecutionTypes=[ManualOnce, ManualContinuous, AutomaticContinuous], params=[ParamRepr{id=file, type=TypeInfo{packageId=mb.resource, id=ResourceKey}, required=true, providers=[context(ReadableRes...
mb.pie.runtime.layer.ValidationException: Visited task with same key was required with different input in same session. Cause:
task with key
  #mb.spoofax.compiler.adapter.ParserAdapterCompiler(eclipse-resource##/tiger)
was already visited with input
  Input{classKind=Generated, baseParseTaskDef=TypeInfo{packageId=mb.tiger.task, id=TigerParse}, baseTokenizeTaskDef=TypeInfo{packageId=mb.tiger.task, id=TigerTokenize}, baseShowParsedAstTaskDef=TypeInfo{packageId=mb.tiger.task, id=TigerShowParsedAst}, showParsedAstCommand=CommandDefRepr{type=TypeInfo{packageId=mb.tiger.command, id=TigerShowParsedAstCommand}, taskDefType=TypeInfo{packageId=mb.tiger.task, id=TigerShowParsedAst}, argType=TypeInfo{packageId=mb.tiger.task, id=TigerShowParsedAst.Args}, displayName=Show parsed AST, description=Shows the parsed AST, supportedExecutionTypes=[ManualOnce, ManualContinuous, AutomaticContinuous], params=[ParamRepr{id=file, type=TypeInfo{packageId=mb.resource, id=ResourceKey}, required=true, providers=[context(ReadableResource)]}]}, baseShowParsedTokensTaskDef=TypeInfo{packageId=mb.tiger.task, id=TigerShowParsedTokens}, showParsedTokensCommand=CommandDefRepr{type=TypeInfo{packageId=mb.tiger.command, id=TigerShowParsedTokensCommand}, taskDefType=TypeInfo{packageId=mb.tiger.task, id=TigerShowParsedTokens}, argType=TypeInfo{packageId=mb.tiger.task, id=TigerShowParsedTokens.Args}, displayName=Show parsed tokens, description=Shows the parsed tokens, supportedExecutionTypes=[ManualOnce, ManualContinuous, AutomaticContinuous], params=[ParamRepr{id=file, type=TypeInfo{packageId=mb.resource, id=ResourceKey}, required=true, providers=[context(ReadableResource)]}]}, mainMenu=menu(MenuRepr{displayName=Debug, items=[commandAction(CommandActionRepr{displayName=Show parsed AST, description=Shows the parsed AST, commandRequest=CommandRequestRepr{commandDefType=TypeInfo{packageId=mb.tiger.command, id=TigerShowParsedAstCommand}, executionType=ManualOnce, initialArgs={}}, requiredEditorSelectionTypes=[], requiredEditorFileTypes=[ReadableResource], requiredResourceTypes=[], requiredEnclosingResourceTypes=[]}), commandAction(CommandActionRepr{displayName=Show parsed AST (continuous), description=Shows the parsed AST, commandRequest=CommandRequestRepr{commandDefType=TypeInfo{packageId=mb.tiger.command, id=TigerShowParsedAstCommand}, executionType=ManualContinuous, initialArgs={}}, requiredEditorSelectionTypes=[], requiredEditorFileTypes=[ReadableResource], requiredResourceTypes=[], requiredEnclosingResourceTypes=[]}), commandAction(CommandActionRepr{displayName=Show parsed tokens, description=Shows the parsed tokens, commandRequest=CommandRequestRepr{commandDefType=TypeInfo{packageId=mb.tiger.command, id=TigerShowParsedTokensCommand}, executionType=ManualOnce, initialArgs={}}, requiredEditorSelectionTypes=[], requiredEditorFileTypes=[ReadableResource], requiredResourceTypes=[], requiredEnclosingResourceTypes=[]}), commandAction(CommandActionRepr{displayName=Show parsed tokens (continuous), description=Shows the parsed tokens, commandRequest=CommandRequestRepr{commandDefType=TypeInfo{packageId=mb.tiger.command, id=TigerShowParsedTokensCommand}, executionType=ManualContinuous, initialArgs={}}, requiredEditorSelectionTypes=[], requiredEditorFileTypes=[ReadableResource], requiredResourceTypes=[], requiredEnclosingResourceTypes=[]})]}), resourceContextMenu=menu(MenuRepr{displayName=Debug, items=[commandAction(CommandActionRepr{displayName=Show parsed AST, description=Shows the parsed AST, commandRequest=CommandRequestRepr{commandDefType=TypeInfo{packageId=mb.tiger.command, id=TigerShowParsedAstCommand}, executionType=ManualOnce, initialArgs={}}, requiredEditorSelectionTypes=[], requiredEditorFileTypes=[], requiredResourceTypes=[File], requiredEnclosingResourceTypes=[]}), commandAction(CommandActionRepr{displayName=Show parsed AST (continuous), description=Shows the parsed AST, commandRequest=CommandRequestRepr{commandDefType=TypeInfo{packageId=mb.tiger.command, id=TigerShowParsedAstCommand}, executionType=ManualContinuous, initialArgs={}}, requiredEditorSelectionTypes=[], requiredEditorFileTypes=[], requiredResourceTypes=[File], requiredEnclosingResourceTypes=[]}), commandAction(CommandActionRepr{displayName=Show parsed tokens, description=Shows the parsed tokens, commandRequest=CommandRequestRepr{commandDefType=TypeInfo{packageId=mb.tiger.command, id=TigerShowParsedTokensCommand}, executionType=ManualOnce, initialArgs={}}, requiredEditorSelectionTypes=[], requiredEditorFileTypes=[], requiredResourceTypes=[File], requiredEnclosingResourceTypes=[]}), commandAction(CommandActionRepr{displayName=Show parsed tokens (continuous), description=Shows the parsed tokens, commandRequest=CommandRequestRepr{commandDefType=TypeInfo{packageId=mb.tiger.command, id=TigerShowParsedTokensCommand}, executionType=ManualContinuous, initialArgs={}}, requiredEditorSelectionTypes=[], requiredEditorFileTypes=[], requiredResourceTypes=[File], requiredEnclosingResourceTypes=[]})]}), editorContextMenu=menu(MenuRepr{displayName=Debug, items=[commandAction(CommandActionRepr{displayName=Show parsed AST, description=Shows the parsed AST, commandRequest=CommandRequestRepr{commandDefType=TypeInfo{packageId=mb.tiger.command, id=TigerShowParsedAstCommand}, executionType=ManualOnce, initialArgs={}}, requiredEditorSelectionTypes=[], requiredEditorFileTypes=[ReadableResource], requiredResourceTypes=[], requiredEnclosingResourceTypes=[]}), commandAction(CommandActionRepr{displayName=Show parsed AST (continuous), description=Shows the parsed AST, commandRequest=CommandRequestRepr{commandDefType=TypeInfo{packageId=mb.tiger.command, id=TigerShowParsedAstCommand}, executionType=ManualContinuous, initialArgs={}}, requiredEditorSelectionTypes=[], requiredEditorFileTypes=[ReadableResource], requiredResourceTypes=[], requiredEnclosingResourceTypes=[]}), commandAction(CommandActionRepr{displayName=Show parsed tokens, description=Shows the parsed tokens, commandRequest=CommandRequestRepr{commandDefType=TypeInfo{packageId=mb.tiger.command, id=TigerShowParsedTokensCommand}, executionType=ManualOnce, initialArgs={}}, requiredEditorSelectionTypes=[], requiredEditorFileTypes=[ReadableResource], requiredResourceTypes=[], requiredEnclosingResourceTypes=[]}), commandAction(CommandActionRepr{displayName=Show parsed tokens (continuous), description=Shows the parsed tokens, commandRequest=CommandRequestRepr{commandDefType=TypeInfo{packageId=mb.tiger.command, id=TigerShowParsedTokensCommand}, executionType=ManualContinuous, initialArgs={}}, requiredEditorSelectionTypes=[], requiredEditorFileTypes=[ReadableResource], requiredResourceTypes=[], requiredEnclosingResourceTypes=[]})]}), adapterProject=AdapterProject{project=GradleProject{coordinate=org.metaborg:tiger:0.1.0, baseDirectory=eclipse-resource##/tiger, srcDirectory=eclipse-resource##/tiger/src, srcMainDirectory=eclipse-resource##/tiger/src/main, buildDirectory=eclipse-resource##/tiger/build, buildGeneratedSourcesDirectory=eclipse-resource##/tiger/build/generated/sources, buildGeneratedSourcesAnnotationProcessorJavaMainDirectory=eclipse-resource##/tiger/build/generated/sources/annotationProcessor/java/main, buildGeneratedResourcesDirectory=eclipse-resource##/tiger/build/generated/resources, buildClassesDirectory=eclipse-resource##/tiger/build/classes, buildClassesJavaMainDirectory=eclipse-resource##/tiger/build/classes/java/main}, packageId=mb.tiger, taskPackageId=mb.tiger.task, commandPackageId=mb.tiger.command, generatedJavaSourcesDirectory=eclipse-resource##/tiger/build/generated/sources/adapter, classKind=Generated, baseResourcesScope=TypeInfo{packageId=mb.tiger, id=TigerResourcesScope}, baseScope=TypeInfo{packageId=mb.tiger, id=TigerScope}, baseQualifier=TypeInfo{packageId=mb.tiger, id=TigerQualifier}, shared=Shared{name=tiger, fileExtensions=[tig], defaultClassPrefix=Tiger, defaultGroupId=org.metaborg, defaultArtifactId=tiger, defaultVersion=0.1.0, defaultPackageIdPrefix=mb., defaultPackageId=mb.tiger, metaborgPublicRepository=maven(https://artifacts.metaborg.org/content/groups/public/), defaultRepositories=[maven(https://artifacts.metaborg.org/content/groups/public/)], defaultPluginRepositories=[maven(https://artifacts.metaborg.org/content/groups/public/)], metaborgGradleConfigVersion=0.3.21, metaborgCoroniumVersion=0.3.0, bndPluginVersion=5.0.1, intellijGradlePluginVersion=0.4.21, spoofax3Version=null, spoofaxDependencyConstraintsDep=module(org.metaborg:spoofax.depconstraints), checkerFrameworkQualifiersDep=module(org.checkerframework:checker-qual-android), daggerDep=module(com.google.dagger:dagger), daggerCompilerDep=module(com.google.dagger:dagger-compiler), slf4jSimpleDep=module(org.slf4j:slf4j-simple), commonDep=module(org.metaborg:common), logApiDep=module(org.metaborg:log.api), logBackendSLF4JDep=module(org.metaborg:log.backend.slf4j), resourceDep=module(org.metaborg:resource), strategoXTMinJarDep=module(org.metaborg:strategoxt-min-jar), orgStrategoXTStrjDep=module(org.metaborg.devenv:org.strategoxt.strj), pieApiDep=module(org.metaborg:pie.api), pieRuntimeDep=module(org.metaborg:pie.runtime), atermCommonDep=module(org.metaborg:aterm.common), statixCodeCompletionDep=module(org.metaborg:statix.codecompletion), statixCodeCompletionPieDep=module(org.metaborg:statix.codecompletion.pie), jsglrCommonDep=module(org.metaborg:jsglr.common), jsglrPieDep=module(org.metaborg:jsglr.pie), jsglr1CommonDep=module(org.metaborg:jsglr1.common), jsglr2CommonDep=module(org.metaborg:jsglr2.common), esvCommonDep=module(org.metaborg:esv.common), strategoCommonDep=module(org.metaborg:stratego.common), strategoPieDep=module(org.metaborg:stratego.pie), constraintCommonDep=module(org.metaborg:constraint.common), constraintPieDep=module(org.metaborg:constraint.pie), nabl2CommonDep=module(org.metaborg:nabl2.common), statixCommonDep=module(org.metaborg:statix.common), statixPieDep=module(org.metaborg:statix.pie), spoofax2CommonDep=module(org.metaborg:spoofax2.common), spoofaxCompilerInterfacesDep=module(org.metaborg:spoofax.compiler.interfaces), spoofaxCoreDep=module(org.metaborg:spoofax.core), spoofaxCliDep=module(org.metaborg:spoofax.cli), spoofaxEclipseDep=module(org.metaborg:spoofax.eclipse), toolingEclipseBundleDep=module(org.metaborg:tooling.eclipsebundle), spoofaxIntellijDep=module(org.metaborg:spoofax.intellij), multilangDep=module(org.metaborg:statix.multilang), multilangEclipseDep=module(org.metaborg:statix.multilang.eclipse), sptApiDep=module(org.metaborg:spt.api), tegoDep=module(org.metaborg:tego), tegoPieDep=module(org.metaborg:tego.pie)}}, languageProjectInput=Input{startSymbol=Module, parseTableAtermFileRelativePath=sdf.tbl, parseTablePersistedFileRelativePath=sdf.bin, variant=jsglr1(), classKind=Generated, baseParseTable=TypeInfo{packageId=mb.tiger, id=TigerParseTable}, baseParser=TypeInfo{packageId=mb.tiger, id=TigerParser}, baseParserFactory=TypeInfo{packageId=mb.tiger, id=TigerParserFactory}, shared=Shared{name=tiger, fileExtensions=[tig], defaultClassPrefix=Tiger, defaultGroupId=org.metaborg, defaultArtifactId=tiger, defaultVersion=0.1.0, defaultPackageIdPrefix=mb., defaultPackageId=mb.tiger, metaborgPublicRepository=maven(https://artifacts.metaborg.org/content/groups/public/), defaultRepositories=[maven(https://artifacts.metaborg.org/content/groups/public/)], defaultPluginRepositories=[maven(https://artifacts.metaborg.org/content/groups/public/)], metaborgGradleConfigVersion=0.3.21, metaborgCoroniumVersion=0.3.0, bndPluginVersion=5.0.1, intellijGradlePluginVersion=0.4.21, spoofax3Version=null, spoofaxDependencyConstraintsDep=module(org.metaborg:spoofax.depconstraints), checkerFrameworkQualifiersDep=module(org.checkerframework:checker-qual-android), daggerDep=module(com.google.dagger:dagger), daggerCompilerDep=module(com.google.dagger:dagger-compiler), slf4jSimpleDep=module(org.slf4j:slf4j-simple), commonDep=module(org.metaborg:common), logApiDep=module(org.metaborg:log.api), logBackendSLF4JDep=module(org.metaborg:log.backend.slf4j), resourceDep=module(org.metaborg:resource), strategoXTMinJarDep=module(org.metaborg:strategoxt-min-jar), orgStrategoXTStrjDep=module(org.metaborg.devenv:org.strategoxt.strj), pieApiDep=module(org.metaborg:pie.api), pieRuntimeDep=module(org.metaborg:pie.runtime), atermCommonDep=module(org.metaborg:aterm.common), statixCodeCompletionDep=module(org.metaborg:statix.codecompletion), statixCodeCompletionPieDep=module(org.metaborg:statix.codecompletion.pie), jsglrCommonDep=module(org.metaborg:jsglr.common), jsglrPieDep=module(org.metaborg:jsglr.pie), jsglr1CommonDep=module(org.metaborg:jsglr1.common), jsglr2CommonDep=module(org.metaborg:jsglr2.common), esvCommonDep=module(org.metaborg:esv.common), strategoCommonDep=module(org.metaborg:stratego.common), strategoPieDep=module(org.metaborg:stratego.pie), constraintCommonDep=module(org.metaborg:constraint.common), constraintPieDep=module(org.metaborg:constraint.pie), nabl2CommonDep=module(org.metaborg:nabl2.common), statixCommonDep=module(org.metaborg:statix.common), statixPieDep=module(org.metaborg:statix.pie), spoofax2CommonDep=module(org.metaborg:spoofax2.common), spoofaxCompilerInterfacesDep=module(org.metaborg:spoofax.compiler.interfaces), spoofaxCoreDep=module(org.metaborg:spoofax.core), spoofaxCliDep=module(org.metaborg:spoofax.cli), spoofaxEclipseDep=module(org.metaborg:spoofax.eclipse), toolingEclipseBundleDep=module(org.metaborg:tooling.eclipsebundle), spoofaxIntellijDep=module(org.metaborg:spoofax.intellij), multilangDep=module(org.metaborg:statix.multilang), multilangEclipseDep=module(org.metaborg:statix.multilang.eclipse), sptApiDep=module(org.metaborg:spt.api), tegoDep=module(org.metaborg:tego), tegoPieDep=module(org.metaborg:tego.pie)}, languageProject=LanguageProject{project=GradleProject{coordinate=org.metaborg:tiger:0.1.0, baseDirectory=eclipse-resource##/tiger, srcDirectory=eclipse-resource##/tiger/src, srcMainDirectory=eclipse-resource##/tiger/src/main, buildDirectory=eclipse-resource##/tiger/build, buildGeneratedSourcesDirectory=eclipse-resource##/tiger/build/generated/sources, buildGeneratedSourcesAnnotationProcessorJavaMainDirectory=eclipse-resource##/tiger/build/generated/sources/annotationProcessor/java/main, buildGeneratedResourcesDirectory=eclipse-resource##/tiger/build/generated/resources, buildClassesDirectory=eclipse-resource##/tiger/build/classes, buildClassesJavaMainDirectory=eclipse-resource##/tiger/build/classes/java/main}, packageId=mb.tiger, packagePath=mb/tiger, generatedJavaSourcesDirectory=eclipse-resource##/tiger/build/generated/sources/language}}, classLoaderResourcesInput=Input{classKind=Generated, baseClassLoaderResources=TypeInfo{packageId=mb.tiger, id=TigerClassLoaderResources}, qualifier=mb-tiger-classloader-resource, shared=Shared{name=tiger, fileExtensions=[tig], defaultClassPrefix=Tiger, defaultGroupId=org.metaborg, defaultArtifactId=tiger, defaultVersion=0.1.0, defaultPackageIdPrefix=mb., defaultPackageId=mb.tiger, metaborgPublicRepository=maven(https://artifacts.metaborg.org/content/groups/public/), defaultRepositories=[maven(https://artifacts.metaborg.org/content/groups/public/)], defaultPluginRepositories=[maven(https://artifacts.metaborg.org/content/groups/public/)], metaborgGradleConfigVersion=0.3.21, metaborgCoroniumVersion=0.3.0, bndPluginVersion=5.0.1, intellijGradlePluginVersion=0.4.21, spoofax3Version=null, spoofaxDependencyConstraintsDep=module(org.metaborg:spoofax.depconstraints), checkerFrameworkQualifiersDep=module(org.checkerframework:checker-qual-android), daggerDep=module(com.google.dagger:dagger), daggerCompilerDep=module(com.google.dagger:dagger-compiler), slf4jSimpleDep=module(org.slf4j:slf4j-simple), commonDep=module(org.metaborg:common), logApiDep=module(org.metaborg:log.api), logBackendSLF4JDep=module(org.metaborg:log.backend.slf4j), resourceDep=module(org.metaborg:resource), strategoXTMinJarDep=module(org.metaborg:strategoxt-min-jar), orgStrategoXTStrjDep=module(org.metaborg.devenv:org.strategoxt.strj), pieApiDep=module(org.metaborg:pie.api), pieRuntimeDep=module(org.metaborg:pie.runtime), atermCommonDep=module(org.metaborg:aterm.common), statixCodeCompletionDep=module(org.metaborg:statix.codecompletion), statixCodeCompletionPieDep=module(org.metaborg:statix.codecompletion.pie), jsglrCommonDep=module(org.metaborg:jsglr.common), jsglrPieDep=module(org.metaborg:jsglr.pie), jsglr1CommonDep=module(org.metaborg:jsglr1.common), jsglr2CommonDep=module(org.metaborg:jsglr2.common), esvCommonDep=module(org.metaborg:esv.common), strategoCommonDep=module(org.metaborg:stratego.common), strategoPieDep=module(org.metaborg:stratego.pie), constraintCommonDep=module(org.metaborg:constraint.common), constraintPieDep=module(org.metaborg:constraint.pie), nabl2CommonDep=module(org.metaborg:nabl2.common), statixCommonDep=module(org.metaborg:statix.common), statixPieDep=module(org.metaborg:statix.pie), spoofax2CommonDep=module(org.metaborg:spoofax2.common), spoofaxCompilerInterfacesDep=module(org.metaborg:spoofax.compiler.interfaces), spoofaxCoreDep=module(org.metaborg:spoofax.core), spoofaxCliDep=module(org.metaborg:spoofax.cli), spoofaxEclipseDep=module(org.metaborg:spoofax.eclipse), toolingEclipseBundleDep=module(org.metaborg:tooling.eclipsebundle), spoofaxIntellijDep=module(org.metaborg:spoofax.intellij), multilangDep=module(org.metaborg:statix.multilang), multilangEclipseDep=module(org.metaborg:statix.multilang.eclipse), sptApiDep=module(org.metaborg:spt.api), tegoDep=module(org.metaborg:tego), tegoPieDep=module(org.metaborg:tego.pie)}, languageProject=LanguageProject{project=GradleProject{coordinate=org.metaborg:tiger:0.1.0, baseDirectory=eclipse-resource##/tiger, srcDirectory=eclipse-resource##/tiger/src, srcMainDirectory=eclipse-resource##/tiger/src/main, buildDirectory=eclipse-resource##/tiger/build, buildGeneratedSourcesDirectory=eclipse-resource##/tiger/build/generated/sources, buildGeneratedSourcesAnnotationProcessorJavaMainDirectory=eclipse-resource##/tiger/build/generated/sources/annotationProcessor/java/main, buildGeneratedResourcesDirectory=eclipse-resource##/tiger/build/generated/resources, buildClassesDirectory=eclipse-resource##/tiger/build/classes, buildClassesJavaMainDirectory=eclipse-resource##/tiger/build/classes/java/main}, packageId=mb.tiger, packagePath=mb/tiger, generatedJavaSourcesDirectory=eclipse-resource##/tiger/build/generated/sources/language}}}
while now required with input
  Input{classKind=Generated, baseParseTaskDef=TypeInfo{packageId=mb.tiger.task, id=TigerParse}, baseTokenizeTaskDef=TypeInfo{packageId=mb.tiger.task, id=TigerTokenize}, baseShowParsedAstTaskDef=TypeInfo{packageId=mb.tiger.task, id=TigerShowParsedAst}, showParsedAstCommand=CommandDefRepr{type=TypeInfo{packageId=mb.tiger.command, id=TigerShowParsedAstCommand}, taskDefType=TypeInfo{packageId=mb.tiger.task, id=TigerShowParsedAst}, argType=TypeInfo{packageId=mb.tiger.task, id=TigerShowParsedAst.Args}, displayName=Show parsed AST, description=Shows the parsed AST, supportedExecutionTypes=[ManualOnce, ManualContinuous, AutomaticContinuous], params=[ParamRepr{id=file, type=TypeInfo{packageId=mb.resource, id=ResourceKey}, required=true, providers=[context(ReadableResource)]}]}, baseShowParsedTokensTaskDef=TypeInfo{packageId=mb.tiger.task, id=TigerShowParsedTokens}, showParsedTokensCommand=CommandDefRepr{type=TypeInfo{packageId=mb.tiger.command, id=TigerShowParsedTokensCommand}, taskDefType=TypeInfo{packageId=mb.tiger.task, id=TigerShowParsedTokens}, argType=TypeInfo{packageId=mb.tiger.task, id=TigerShowParsedTokens.Args}, displayName=Show parsed tokens, description=Shows the parsed tokens, supportedExecutionTypes=[ManualOnce, ManualContinuous, AutomaticContinuous], params=[ParamRepr{id=file, type=TypeInfo{packageId=mb.resource, id=ResourceKey}, required=true, providers=[context(ReadableResource)]}]}, mainMenu=menu(MenuRepr{displayName=Debug, items=[commandAction(CommandActionRepr{displayName=Show parsed AST, description=Shows the parsed AST, commandRequest=CommandRequestRepr{commandDefType=TypeInfo{packageId=mb.tiger.command, id=TigerShowParsedAstCommand}, executionType=ManualOnce, initialArgs={}}, requiredEditorSelectionTypes=[], requiredEditorFileTypes=[ReadableResource], requiredResourceTypes=[], requiredEnclosingResourceTypes=[]}), commandAction(CommandActionRepr{displayName=Show parsed AST (continuous), description=Shows the parsed AST, commandRequest=CommandRequestRepr{commandDefType=TypeInfo{packageId=mb.tiger.command, id=TigerShowParsedAstCommand}, executionType=ManualContinuous, initialArgs={}}, requiredEditorSelectionTypes=[], requiredEditorFileTypes=[ReadableResource], requiredResourceTypes=[], requiredEnclosingResourceTypes=[]}), commandAction(CommandActionRepr{displayName=Show parsed tokens, description=Shows the parsed tokens, commandRequest=CommandRequestRepr{commandDefType=TypeInfo{packageId=mb.tiger.command, id=TigerShowParsedTokensCommand}, executionType=ManualOnce, initialArgs={}}, requiredEditorSelectionTypes=[], requiredEditorFileTypes=[ReadableResource], requiredResourceTypes=[], requiredEnclosingResourceTypes=[]}), commandAction(CommandActionRepr{displayName=Show parsed tokens (continuous), description=Shows the parsed tokens, commandRequest=CommandRequestRepr{commandDefType=TypeInfo{packageId=mb.tiger.command, id=TigerShowParsedTokensCommand}, executionType=ManualContinuous, initialArgs={}}, requiredEditorSelectionTypes=[], requiredEditorFileTypes=[ReadableResource], requiredResourceTypes=[], requiredEnclosingResourceTypes=[]})]}), resourceContextMenu=menu(MenuRepr{displayName=Debug, items=[commandAction(CommandActionRepr{displayName=Show parsed AST, description=Shows the parsed AST, commandRequest=CommandRequestRepr{commandDefType=TypeInfo{packageId=mb.tiger.command, id=TigerShowParsedAstCommand}, executionType=ManualOnce, initialArgs={}}, requiredEditorSelectionTypes=[], requiredEditorFileTypes=[], requiredResourceTypes=[File], requiredEnclosingResourceTypes=[]}), commandAction(CommandActionRepr{displayName=Show parsed AST (continuous), description=Shows the parsed AST, commandRequest=CommandRequestRepr{commandDefType=TypeInfo{packageId=mb.tiger.command, id=TigerShowParsedAstCommand}, executionType=ManualContinuous, initialArgs={}}, requiredEditorSelectionTypes=[], requiredEditorFileTypes=[], requiredResourceTypes=[File], requiredEnclosingResourceTypes=[]}), commandAction(CommandActionRepr{displayName=Show parsed tokens, description=Shows the parsed tokens, commandRequest=CommandRequestRepr{commandDefType=TypeInfo{packageId=mb.tiger.command, id=TigerShowParsedTokensCommand}, executionType=ManualOnce, initialArgs={}}, requiredEditorSelectionTypes=[], requiredEditorFileTypes=[], requiredResourceTypes=[File], requiredEnclosingResourceTypes=[]}), commandAction(CommandActionRepr{displayName=Show parsed tokens (continuous), description=Shows the parsed tokens, commandRequest=CommandRequestRepr{commandDefType=TypeInfo{packageId=mb.tiger.command, id=TigerShowParsedTokensCommand}, executionType=ManualContinuous, initialArgs={}}, requiredEditorSelectionTypes=[], requiredEditorFileTypes=[], requiredResourceTypes=[File], requiredEnclosingResourceTypes=[]})]}), editorContextMenu=menu(MenuRepr{displayName=Debug, items=[commandAction(CommandActionRepr{displayName=Show parsed AST, description=Shows the parsed AST, commandRequest=CommandRequestRepr{commandDefType=TypeInfo{packageId=mb.tiger.command, id=TigerShowParsedAstCommand}, executionType=ManualOnce, initialArgs={}}, requiredEditorSelectionTypes=[], requiredEditorFileTypes=[ReadableResource], requiredResourceTypes=[], requiredEnclosingResourceTypes=[]}), commandAction(CommandActionRepr{displayName=Show parsed AST (continuous), description=Shows the parsed AST, commandRequest=CommandRequestRepr{commandDefType=TypeInfo{packageId=mb.tiger.command, id=TigerShowParsedAstCommand}, executionType=ManualContinuous, initialArgs={}}, requiredEditorSelectionTypes=[], requiredEditorFileTypes=[ReadableResource], requiredResourceTypes=[], requiredEnclosingResourceTypes=[]}), commandAction(CommandActionRepr{displayName=Show parsed tokens, description=Shows the parsed tokens, commandRequest=CommandRequestRepr{commandDefType=TypeInfo{packageId=mb.tiger.command, id=TigerShowParsedTokensCommand}, executionType=ManualOnce, initialArgs={}}, requiredEditorSelectionTypes=[], requiredEditorFileTypes=[ReadableResource], requiredResourceTypes=[], requiredEnclosingResourceTypes=[]}), commandAction(CommandActionRepr{displayName=Show parsed tokens (continuous), description=Shows the parsed tokens, commandRequest=CommandRequestRepr{commandDefType=TypeInfo{packageId=mb.tiger.command, id=TigerShowParsedTokensCommand}, executionType=ManualContinuous, initialArgs={}}, requiredEditorSelectionTypes=[], requiredEditorFileTypes=[ReadableResource], requiredResourceTypes=[], requiredEnclosingResourceTypes=[]})]}), adapterProject=AdapterProject{project=GradleProject{coordinate=org.metaborg:tiger:0.1.0, baseDirectory=eclipse-resource##/tiger, srcDirectory=eclipse-resource##/tiger/src, srcMainDirectory=eclipse-resource##/tiger/src/main, buildDirectory=eclipse-resource##/tiger/build, buildGeneratedSourcesDirectory=eclipse-resource##/tiger/build/generated/sources, buildGeneratedSourcesAnnotationProcessorJavaMainDirectory=eclipse-resource##/tiger/build/generated/sources/annotationProcessor/java/main, buildGeneratedResourcesDirectory=eclipse-resource##/tiger/build/generated/resources, buildClassesDirectory=eclipse-resource##/tiger/build/classes, buildClassesJavaMainDirectory=eclipse-resource##/tiger/build/classes/java/main}, packageId=mb.tiger, taskPackageId=mb.tiger.task, commandPackageId=mb.tiger.command, generatedJavaSourcesDirectory=eclipse-resource##/tiger/build/generated/sources/adapter, classKind=Generated, baseResourcesScope=TypeInfo{packageId=mb.tiger, id=TigerResourcesScope}, baseScope=TypeInfo{packageId=mb.tiger, id=TigerScope}, baseQualifier=TypeInfo{packageId=mb.tiger, id=TigerQualifier}, shared=Shared{name=tiger, fileExtensions=[tig], defaultClassPrefix=Tiger, defaultGroupId=org.metaborg, defaultArtifactId=tiger, defaultVersion=0.1.0, defaultPackageIdPrefix=mb., defaultPackageId=mb.tiger, metaborgPublicRepository=maven(https://artifacts.metaborg.org/content/groups/public/), defaultRepositories=[maven(https://artifacts.metaborg.org/content/groups/public/)], defaultPluginRepositories=[maven(https://artifacts.metaborg.org/content/groups/public/)], metaborgGradleConfigVersion=0.3.21, metaborgCoroniumVersion=0.3.0, bndPluginVersion=5.0.1, intellijGradlePluginVersion=0.4.21, spoofax3Version=null, spoofaxDependencyConstraintsDep=module(org.metaborg:spoofax.depconstraints), checkerFrameworkQualifiersDep=module(org.checkerframework:checker-qual-android), daggerDep=module(com.google.dagger:dagger), daggerCompilerDep=module(com.google.dagger:dagger-compiler), slf4jSimpleDep=module(org.slf4j:slf4j-simple), commonDep=module(org.metaborg:common), logApiDep=module(org.metaborg:log.api), logBackendSLF4JDep=module(org.metaborg:log.backend.slf4j), resourceDep=module(org.metaborg:resource), strategoXTMinJarDep=module(org.metaborg:strategoxt-min-jar), orgStrategoXTStrjDep=module(org.metaborg.devenv:org.strategoxt.strj), pieApiDep=module(org.metaborg:pie.api), pieRuntimeDep=module(org.metaborg:pie.runtime), atermCommonDep=module(org.metaborg:aterm.common), statixCodeCompletionDep=module(org.metaborg:statix.codecompletion), statixCodeCompletionPieDep=module(org.metaborg:statix.codecompletion.pie), jsglrCommonDep=module(org.metaborg:jsglr.common), jsglrPieDep=module(org.metaborg:jsglr.pie), jsglr1CommonDep=module(org.metaborg:jsglr1.common), jsglr2CommonDep=module(org.metaborg:jsglr2.common), esvCommonDep=module(org.metaborg:esv.common), strategoCommonDep=module(org.metaborg:stratego.common), strategoPieDep=module(org.metaborg:stratego.pie), constraintCommonDep=module(org.metaborg:constraint.common), constraintPieDep=module(org.metaborg:constraint.pie), nabl2CommonDep=module(org.metaborg:nabl2.common), statixCommonDep=module(org.metaborg:statix.common), statixPieDep=module(org.metaborg:statix.pie), spoofax2CommonDep=module(org.metaborg:spoofax2.common), spoofaxCompilerInterfacesDep=module(org.metaborg:spoofax.compiler.interfaces), spoofaxCoreDep=module(org.metaborg:spoofax.core), spoofaxCliDep=module(org.metaborg:spoofax.cli), spoofaxEclipseDep=module(org.metaborg:spoofax.eclipse), toolingEclipseBundleDep=module(org.metaborg:tooling.eclipsebundle), spoofaxIntellijDep=module(org.metaborg:spoofax.intellij), multilangDep=module(org.metaborg:statix.multilang), multilangEclipseDep=module(org.metaborg:statix.multilang.eclipse), sptApiDep=module(org.metaborg:spt.api), tegoDep=module(org.metaborg:tego), tegoPieDep=module(org.metaborg:tego.pie)}}, languageProjectInput=Input{startSymbol=Module, parseTableAtermFileRelativePath=sdf.tbl, parseTablePersistedFileRelativePath=sdf.bin, variant=jsglr2(Recovery), classKind=Generated, baseParseTable=TypeInfo{packageId=mb.tiger, id=TigerParseTable}, baseParser=TypeInfo{packageId=mb.tiger, id=TigerParser}, baseParserFactory=TypeInfo{packageId=mb.tiger, id=TigerParserFactory}, shared=Shared{name=tiger, fileExtensions=[tig], defaultClassPrefix=Tiger, defaultGroupId=org.metaborg, defaultArtifactId=tiger, defaultVersion=0.1.0, defaultPackageIdPrefix=mb., defaultPackageId=mb.tiger, metaborgPublicRepository=maven(https://artifacts.metaborg.org/content/groups/public/), defaultRepositories=[maven(https://artifacts.metaborg.org/content/groups/public/)], defaultPluginRepositories=[maven(https://artifacts.metaborg.org/content/groups/public/)], metaborgGradleConfigVersion=0.3.21, metaborgCoroniumVersion=0.3.0, bndPluginVersion=5.0.1, intellijGradlePluginVersion=0.4.21, spoofax3Version=null, spoofaxDependencyConstraintsDep=module(org.metaborg:spoofax.depconstraints), checkerFrameworkQualifiersDep=module(org.checkerframework:checker-qual-android), daggerDep=module(com.google.dagger:dagger), daggerCompilerDep=module(com.google.dagger:dagger-compiler), slf4jSimpleDep=module(org.slf4j:slf4j-simple), commonDep=module(org.metaborg:common), logApiDep=module(org.metaborg:log.api), logBackendSLF4JDep=module(org.metaborg:log.backend.slf4j), resourceDep=module(org.metaborg:resource), strategoXTMinJarDep=module(org.metaborg:strategoxt-min-jar), orgStrategoXTStrjDep=module(org.metaborg.devenv:org.strategoxt.strj), pieApiDep=module(org.metaborg:pie.api), pieRuntimeDep=module(org.metaborg:pie.runtime), atermCommonDep=module(org.metaborg:aterm.common), statixCodeCompletionDep=module(org.metaborg:statix.codecompletion), statixCodeCompletionPieDep=module(org.metaborg:statix.codecompletion.pie), jsglrCommonDep=module(org.metaborg:jsglr.common), jsglrPieDep=module(org.metaborg:jsglr.pie), jsglr1CommonDep=module(org.metaborg:jsglr1.common), jsglr2CommonDep=module(org.metaborg:jsglr2.common), esvCommonDep=module(org.metaborg:esv.common), strategoCommonDep=module(org.metaborg:stratego.common), strategoPieDep=module(org.metaborg:stratego.pie), constraintCommonDep=module(org.metaborg:constraint.common), constraintPieDep=module(org.metaborg:constraint.pie), nabl2CommonDep=module(org.metaborg:nabl2.common), statixCommonDep=module(org.metaborg:statix.common), statixPieDep=module(org.metaborg:statix.pie), spoofax2CommonDep=module(org.metaborg:spoofax2.common), spoofaxCompilerInterfacesDep=module(org.metaborg:spoofax.compiler.interfaces), spoofaxCoreDep=module(org.metaborg:spoofax.core), spoofaxCliDep=module(org.metaborg:spoofax.cli), spoofaxEclipseDep=module(org.metaborg:spoofax.eclipse), toolingEclipseBundleDep=module(org.metaborg:tooling.eclipsebundle), spoofaxIntellijDep=module(org.metaborg:spoofax.intellij), multilangDep=module(org.metaborg:statix.multilang), multilangEclipseDep=module(org.metaborg:statix.multilang.eclipse), sptApiDep=module(org.metaborg:spt.api), tegoDep=module(org.metaborg:tego), tegoPieDep=module(org.metaborg:tego.pie)}, languageProject=LanguageProject{project=GradleProject{coordinate=org.metaborg:tiger:0.1.0, baseDirectory=eclipse-resource##/tiger, srcDirectory=eclipse-resource##/tiger/src, srcMainDirectory=eclipse-resource##/tiger/src/main, buildDirectory=eclipse-resource##/tiger/build, buildGeneratedSourcesDirectory=eclipse-resource##/tiger/build/generated/sources, buildGeneratedSourcesAnnotationProcessorJavaMainDirectory=eclipse-resource##/tiger/build/generated/sources/annotationProcessor/java/main, buildGeneratedResourcesDirectory=eclipse-resource##/tiger/build/generated/resources, buildClassesDirectory=eclipse-resource##/tiger/build/classes, buildClassesJavaMainDirectory=eclipse-resource##/tiger/build/classes/java/main}, packageId=mb.tiger, packagePath=mb/tiger, generatedJavaSourcesDirectory=eclipse-resource##/tiger/build/generated/sources/language}}, classLoaderResourcesInput=Input{classKind=Generated, baseClassLoaderResources=TypeInfo{packageId=mb.tiger, id=TigerClassLoaderResources}, qualifier=mb-tiger-classloader-resource, shared=Shared{name=tiger, fileExtensions=[tig], defaultClassPrefix=Tiger, defaultGroupId=org.metaborg, defaultArtifactId=tiger, defaultVersion=0.1.0, defaultPackageIdPrefix=mb., defaultPackageId=mb.tiger, metaborgPublicRepository=maven(https://artifacts.metaborg.org/content/groups/public/), defaultRepositories=[maven(https://artifacts.metaborg.org/content/groups/public/)], defaultPluginRepositories=[maven(https://artifacts.metaborg.org/content/groups/public/)], metaborgGradleConfigVersion=0.3.21, metaborgCoroniumVersion=0.3.0, bndPluginVersion=5.0.1, intellijGradlePluginVersion=0.4.21, spoofax3Version=null, spoofaxDependencyConstraintsDep=module(org.metaborg:spoofax.depconstraints), checkerFrameworkQualifiersDep=module(org.checkerframework:checker-qual-android), daggerDep=module(com.google.dagger:dagger), daggerCompilerDep=module(com.google.dagger:dagger-compiler), slf4jSimpleDep=module(org.slf4j:slf4j-simple), commonDep=module(org.metaborg:common), logApiDep=module(org.metaborg:log.api), logBackendSLF4JDep=module(org.metaborg:log.backend.slf4j), resourceDep=module(org.metaborg:resource), strategoXTMinJarDep=module(org.metaborg:strategoxt-min-jar), orgStrategoXTStrjDep=module(org.metaborg.devenv:org.strategoxt.strj), pieApiDep=module(org.metaborg:pie.api), pieRuntimeDep=module(org.metaborg:pie.runtime), atermCommonDep=module(org.metaborg:aterm.common), statixCodeCompletionDep=module(org.metaborg:statix.codecompletion), statixCodeCompletionPieDep=module(org.metaborg:statix.codecompletion.pie), jsglrCommonDep=module(org.metaborg:jsglr.common), jsglrPieDep=module(org.metaborg:jsglr.pie), jsglr1CommonDep=module(org.metaborg:jsglr1.common), jsglr2CommonDep=module(org.metaborg:jsglr2.common), esvCommonDep=module(org.metaborg:esv.common), strategoCommonDep=module(org.metaborg:stratego.common), strategoPieDep=module(org.metaborg:stratego.pie), constraintCommonDep=module(org.metaborg:constraint.common), constraintPieDep=module(org.metaborg:constraint.pie), nabl2CommonDep=module(org.metaborg:nabl2.common), statixCommonDep=module(org.metaborg:statix.common), statixPieDep=module(org.metaborg:statix.pie), spoofax2CommonDep=module(org.metaborg:spoofax2.common), spoofaxCompilerInterfacesDep=module(org.metaborg:spoofax.compiler.interfaces), spoofaxCoreDep=module(org.metaborg:spoofax.core), spoofaxCliDep=module(org.metaborg:spoofax.cli), spoofaxEclipseDep=module(org.metaborg:spoofax.eclipse), toolingEclipseBundleDep=module(org.metaborg:tooling.eclipsebundle), spoofaxIntellijDep=module(org.metaborg:spoofax.intellij), multilangDep=module(org.metaborg:statix.multilang), multilangEclipseDep=module(org.metaborg:statix.multilang.eclipse), sptApiDep=module(org.metaborg:spt.api), tegoDep=module(org.metaborg:tego), tegoPieDep=module(org.metaborg:tego.pie)}, languageProject=LanguageProject{project=GradleProject{coordinate=org.metaborg:tiger:0.1.0, baseDirectory=eclipse-resource##/tiger, srcDirectory=eclipse-resource##/tiger/src, srcMainDirectory=eclipse-resource##/tiger/src/main, buildDirectory=eclipse-resource##/tiger/build, buildGeneratedSourcesDirectory=eclipse-resource##/tiger/build/generated/sources, buildGeneratedSourcesAnnotationProcessorJavaMainDirectory=eclipse-resource##/tiger/build/generated/sources/annotationProcessor/java/main, buildGeneratedResourcesDirectory=eclipse-resource##/tiger/build/generated/resources, buildClassesDirectory=eclipse-resource##/tiger/build/classes, buildClassesJavaMainDirectory=eclipse-resource##/tiger/build/classes/java/main}, packageId=mb.tiger, packagePath=mb/tiger, generatedJavaSourcesDirectory=eclipse-resource##/tiger/build/generated/sources/language}}}
	at mb.pie.runtime.layer.ValidationLayer.error(ValidationLayer.java:466)
	at mb.pie.runtime.layer.ValidationLayer.validateVisited(ValidationLayer.java:187)
	at mb.pie.runtime.exec.BottomUpRunner.getData(BottomUpRunner.java:201)
	at mb.pie.runtime.exec.BottomUpRunner.require(BottomUpRunner.java:185)
	at mb.pie.runtime.exec.ExecContextImpl.require(ExecContextImpl.java:110)
	at mb.pie.runtime.exec.ExecContextImpl.require(ExecContextImpl.java:90)
	at mb.spoofax.compiler.adapter.AdapterProjectCompiler.lambda$compile$1(AdapterProjectCompiler.java:134)
	at java.base/java.util.Optional.ifPresent(Optional.java:183)
	at mb.spoofax.compiler.adapter.AdapterProjectCompiler.compile(AdapterProjectCompiler.java:134)
	at mb.spoofax.compiler.adapter.AdapterProjectCompiler.lambda$exec$0(AdapterProjectCompiler.java:125)
	at mb.common.result.Result.mapThrowing(Result.java:294)
	at mb.spoofax.compiler.adapter.AdapterProjectCompiler.exec(AdapterProjectCompiler.java:125)
	at mb.spoofax.compiler.adapter.AdapterProjectCompiler.exec(AdapterProjectCompiler.java:47)
	at mb.pie.api.Task.exec(Task.java:56)
	at mb.pie.runtime.exec.TaskExecutor.execInternal(TaskExecutor.java:126)
	at mb.pie.runtime.exec.TaskExecutor.exec(TaskExecutor.java:82)
	at mb.pie.runtime.exec.BottomUpRunner.exec(BottomUpRunner.java:369)
	at mb.pie.runtime.exec.BottomUpRunner.execAndSchedule(BottomUpRunner.java:133)
	at mb.pie.runtime.exec.BottomUpRunner.execScheduled(BottomUpRunner.java:120)
	at mb.pie.runtime.exec.BottomUpRunner.requireInitial(BottomUpRunner.java:83)
	at mb.pie.runtime.MixedSessionImpl.lambda$updateAffectedBy$0(MixedSessionImpl.java:70)
	at mb.pie.runtime.SessionImpl.handleException(SessionImpl.java:160)
	at mb.pie.runtime.MixedSessionImpl.updateAffectedBy(MixedSessionImpl.java:70)
	at mb.spoofax.lwb.eclipse.SpoofaxLwbBuilder.bottomUpBuild(SpoofaxLwbBuilder.java:192)
	at mb.spoofax.lwb.eclipse.SpoofaxLwbBuilder.incrBuild(SpoofaxLwbBuilder.java:135)
	at mb.spoofax.lwb.eclipse.SpoofaxLwbBuilder.access$100(SpoofaxLwbBuilder.java:58)
	at mb.spoofax.lwb.eclipse.SpoofaxLwbBuilder$1.run(SpoofaxLwbBuilder.java:87)
	at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2292)
	at mb.spoofax.lwb.eclipse.SpoofaxLwbBuilder.build(SpoofaxLwbBuilder.java:96)
	at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:846)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:229)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:277)
	at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:330)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:333)
	at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:385)
	at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:406)
	at org.eclipse.core.internal.resources.Workspace.buildInternal(Workspace.java:515)
	at org.eclipse.core.internal.resources.Workspace.build(Workspace.java:412)
	at org.eclipse.ui.actions.BuildAction$1.runInWorkspace(BuildAction.java:291)
	at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:42)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)

Context

  • Spoofax version: 12.1-develop (latest)
  • Operating system & version: macOS 11.5.2
  • Java version: AdoptOpenJDK-11.0.11+9
  • Eclipse version: 2021-03
  • Gradle version: Gradle 7.2

SPT parse to ATerm constructor names don't support underscores

Summary

Constructor names containing underscores aren't parsed correctly in SPT files.

What you did

Defining a constructor such as

Start.Hello_World = <Hello world>

And a test such a

test hello [[
Hello world
]] parse to Hello_World()

What you expected to happen

The test should pass

What actually happened

The test fails with the error "Expected parse to (), but got Hello_World()"

Context

  • Spoofax version: devenv (spoofax.pie commit c7ed510)
  • Operating system & version: Ubuntu 20.04
  • Java version (if applicable): 11.0.11
  • Eclipse version (if applicable): Version: 2021-03 (4.19) Build id: I20210303-1800
  • Gradle version (if applicable): 6.8

Additional information

The SPT file does evaluate, but "Show parsed AST" does not produce an AST.

Support for Statix tests

Supporting Statix tests greatly helps debugging Statix specifications, and would therefore be a nice feature to support in Spoofax 3.

Support can be added when the following steps are implemented:

  • In the Statix language, add a menu option "Evaluate test" that executes the evaluate-test :: AST -> TestResult strategy, available in statix.lang. This strategy takes the test AST as input, and returns a test result.
  • The test result can be pretty-printed with the pp-Statix-string(prettyprint-Statix-TestResult) strategy. The resulting string should be opened in a file with (preferably) an .stxresult extension.

For reference, the definition of this menu in Spoofax 2 can be found here.

Starting Eclipse with embedded JVM on Linux fails

Summary

Starting Eclipse with embedded JVM on Linux fails with a long and confusing error. This is due to the java executable not having executable permission, probably due to that bit not being copied when unarchiving the JVM when creating the installer, or that bit not being copied into the new archive.

What you did

Start Eclipse with embedded JVM on Linux.

What you expected to happen

Eclipse to start.

What actually happened

A long and confusing error popup appears.

Context

  • Spoofax version: 0.11.6
  • Operating system & version: Linux

Productions without constructors (that are not an injection) make the Statix implication/explication fail without an error in SDF3

Summary

Productions without constructors (that are not an injection) make the Statix implication/explication fail without an error in SDF3.

What you expected to happen

SDF3 should give an error on productions without constructors that are not an injection (i.e., Stm = Exp), or that are a bracket production (i.e., Stm.Block = <{<Stm>}> {bracket})

What actually happened

Analysis failed unexpectedly.

Context

  • Spoofax version: 0.11.6
  • Operating system & version: Any

Exception when editing during startup in Eclipse LWB

Summary

An exception occurs when editing (and thus running an editor update job) during startup in Eclipse LWB.

What you did

Edit during startup.

What you expected to happen

No exception to be thrown.

What actually happened

The following exception was thrown:

!ENTRY org.eclipse.core.jobs 4 2 2021-09-17 11:40:24.455
!MESSAGE An internal error occurred during: "SDF3 editor update".
!STACK 0
java.lang.IllegalArgumentException: Attempted to beginRule: P/chocopy.reference, does not match outer scope rule: MultiRule[P/test,Startup read lock]
	at org.eclipse.core.runtime.Assert.isLegal(Assert.java:66)
	at org.eclipse.core.internal.jobs.ThreadJob.illegalPush(ThreadJob.java:137)
	at org.eclipse.core.internal.jobs.ThreadJob.push(ThreadJob.java:392)
	at org.eclipse.core.internal.jobs.ImplicitJobs.begin(ImplicitJobs.java:88)
	at org.eclipse.core.internal.jobs.JobManager.beginRule(JobManager.java:299)
	at org.eclipse.core.internal.resources.WorkManager.checkIn(WorkManager.java:124)
	at org.eclipse.core.internal.resources.Workspace.prepareOperation(Workspace.java:2242)
	at org.eclipse.core.internal.resources.Resource.refreshLocal(Resource.java:1554)
	at mb.spoofax.eclipse.resource.EclipseResource.walk(EclipseResource.java:380)
	at mb.pie.api.stamp.resource.Modified.modifiedDirRec(Modified.java:70)
	at mb.pie.api.stamp.resource.Modified.modifiedRec(Modified.java:39)
	at mb.pie.api.stamp.resource.ModifiedWalkResourceStamper.stamp(ModifiedWalkResourceStamper.java:27)
	at mb.pie.api.stamp.resource.ModifiedWalkResourceStamper.stamp(ModifiedWalkResourceStamper.java:12)
	at mb.pie.runtime.exec.ExecContextImpl.require(ExecContextImpl.java:162)
	at mb.pie.api.ExecContext.require(ExecContext.java:351)
	at mb.sdf3.task.spec.Sdf3CheckSpec.exec(Sdf3CheckSpec.java:70)
	at mb.sdf3.task.spec.Sdf3CheckSpec.exec(Sdf3CheckSpec.java:38)
	at mb.pie.api.Task.exec(Task.java:56)
	at mb.pie.runtime.exec.TaskExecutor.execInternal(TaskExecutor.java:126)
	at mb.pie.runtime.exec.TaskExecutor.exec(TaskExecutor.java:82)
	at mb.pie.runtime.exec.BottomUpRunner.exec(BottomUpRunner.java:369)
	at mb.pie.runtime.exec.BottomUpRunner.execAndSchedule(BottomUpRunner.java:133)
	at mb.pie.runtime.exec.BottomUpRunner.execScheduled(BottomUpRunner.java:120)
	at mb.pie.runtime.exec.BottomUpRunner.requireInitial(BottomUpRunner.java:83)
	at mb.pie.runtime.MixedSessionImpl.lambda$updateAffectedBy$0(MixedSessionImpl.java:59)
	at mb.pie.runtime.SessionImpl.handleException(SessionImpl.java:161)
	at mb.pie.runtime.MixedSessionImpl.updateAffectedBy(MixedSessionImpl.java:59)
	at mb.spoofax.eclipse.pie.PieRunner.updateAffectedBy(PieRunner.java:458)
	at mb.spoofax.eclipse.pie.PieRunner.addOrUpdateEditor(PieRunner.java:132)
	at mb.spoofax.eclipse.editor.EditorUpdateJob.update(EditorUpdateJob.java:89)
	at mb.spoofax.eclipse.editor.EditorUpdateJob.run(EditorUpdateJob.java:74)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)

Context

  • Spoofax version: 0.11.10
  • Operating system & version: Any

Additional information

Console log can be found here: https://gist.github.com/Gohla/52d67ec582d3dd902520a475df8afe00

TermTracer.getRegion returns incorrect region if region starts in a testcase and ends in a fixture

In case the last token of an AST occurs in a test fixture, and the first token occurs in a test case defined after the fixture, then the resulting region will be of length 0.
This seems to occur when using layout-sensitive JSGLR2 (not tested with other JSGLR2 variants), but does not occur with JSGLR1.

This causes the following test to fail with JSGLR2 and succeed with JSGLR1:

module test

language noanalysis

fixture [[
[[...]]
World
]]

test hello goodbye [[
[[Hello]]
]] run hello-to-goodbye on #1 to Goodbye()

With the following syntax:

module start

context-free start-symbols

  Start

context-free sorts

  Start Greeting Object

context-free syntax

  Start.Sequence = Greeting
  Greeting.Hello = "Hello" Object
  Greeting.Goodbye = "Goodbye" Object
  Object.World = "World"
  Object.Moon = "Moon"

lexical syntax

  LAYOUT = [\ \n\v\f\r]

context-free restrictions

  LAYOUT? -/- [\ \n\v\f\r]

And this stratego strategy: hello-to-goodbye : Hello(x) -> Goodbye(x)

And the following spoofaxc.cfg

name = "noanalysis"
java-class-id-prefix = java Noanalysis
file-extension = "noa"

sdf3 {
	parse-table-generator {
		layout-sensitive = true
	}
}
esv {}
stratego {
  sdf3-statix-explication-generation = true
}

parser {
  default-start-symbol = sort Start
  variant = jsglr2 { preset = LayoutSensitive }
}
styler {}
constraint-analyzer {}
stratego-runtime {}

SPT errors stick around in Eclipse after a rebuild

Summary

If an SPT editor is open and has errors, those errors may persist even if a rebuild is done that will cause those tests to succeed. Editing or reopening the SPT file will then cause those errors to recompute (and disappear).

What you did

  • Write a test that fails
  • Open the SPT file in Eclipse such that the error marker shows up for that test
  • Change the grammar to allow the test to succeed
  • Trigger a build, compiling the grammar
  • Error marker still shows in SPT editor until it is reopened or the contents are changed

What you expected to happen

Errors/error markers are automatically updated.

What actually happened

Old results persist.

Context

  • Spoofax version: 0.11.9
  • Operating system & version: all

SDF3 constructor name reuse across different sorts results in errors in the Statix signature

Summary

Using the same constructor name across different sorts results in errors in the generated Statix signatures (and possibly other things).

What you did

  Start.Program = Exp* Stmt*
  
  Stmt.Aa = <<ID>>
  Exp.Aa = <<INT>>

What you expected to happen

Error that Aa is duplicated across Stmt and Exp.

What actually happened

Messages of ./build/generated/sources/languageSpecification/statix/signatures/start-sig.stx:
ERROR 333-335@25: Duplicate constructor "Aa/1"
ERROR 294-296@23: Duplicate constructor "Aa/1"

Context

  • Spoofax version: 0.11.9
  • Operating system & version: all

Additional information

This may also cause issues in other parts. Spoofax 2 normally emits a warning here, talking about the generated pretty printer.

Undo in the Eclipse LWB sometimes does not work

Summary

Undo in the Eclipse LWB sometimes does not work. It seems to sometimes undo in a different editor than the active one.

What you did

I do not have a precise reproduction yet. But when opening multiple editors, it seems to happen more often.

What you expected to happen

Undo to undo my last change in the active editor.

What actually happened

Undo does nothing, or undoes a change in a different (maybe last opened) editor.

Context

  • Spoofax version: 0.11.9
  • Operating system & version: Seems to be any OS

Additional information

There is a discussion about the same issue in the bnd Eclipse plugin here: https://bnd.discourse.group/t/undo-ctrl-z-not-working-in-bnd-files/91 which also links to this issue: bndtools/bnd#4433

Updating the Eclipse LWB plugin and then building a language project causes build errors

Summary

Updating the Eclipse LWB plugin and then building a language project causes unexpected/weird build errors.

What you did

Update the Eclipse LWB plugin to a newer version, and then build the language project.

What you expected to happen

Building to succeed.

What actually happened

Building fails with a PIE exception, such as hidden dependencies, overlapping provided files, etc.

Context

  • Spoofax version: Any
  • Operating system & version: Any

Additional information

Updating Spoofax may change the equals/hashCode of certain objects, which may influence the build and make it go wrong. It can also happen that deserializing an older serialized state may cause wierd errors.

Internal error occurs during SPT editor update related to non-associative operators

When writing a test for a non-assoc expression, if there is no whitespace after an expression, an exception is thrown on editor update.

An example test would be:

module test

language example

test hello [[ Hello == World == World]] parse fails

For the following small language:

module start

context-free start-symbols

  Start

context-free sorts

  Start
  Word
  Exp

context-free syntax

  Start.Empty = <>
  Start.Program = Exp
  Word.Hello = "Hello"
  Word.World = "World"
  Exp.Eq = Exp "==" Exp {non-assoc}
  Exp.Word = Word

lexical syntax

  LAYOUT = [\ \n\v\f\r]

context-free restrictions

  LAYOUT? -/- [\ \n\v\f\r]

This results in the following stack trace:

java.lang.IllegalArgumentException: The end offset 24 must be greater than or equal to the start offset 45
	at mb.common.region.Region.<init>(Region.java:24)
	at mb.common.region.Region.<init>(Region.java:37)
	at mb.common.region.Region.fromOffsets(Region.java:58)
	at mb.jsglr.common.FragmentedOriginLocationFixer.lambda$fixOriginLocations$1(FragmentedOriginLocationFixer.java:109)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
	at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
	at mb.common.message.KeyedMessages.lambda$map$1(KeyedMessages.java:201)
	at mb.common.util.MultiMap.forEach(MultiMap.java:169)
	at mb.common.util.MultiMapView.forEachEntry(MultiMapView.java:140)
	at mb.common.message.KeyedMessages.map(KeyedMessages.java:200)
	at mb.jsglr.common.FragmentedOriginLocationFixer.lambda$fixOriginLocations$2(FragmentedOriginLocationFixer.java:90)
	at mb.common.text.Texts$LambdaCases.fragmentedString(Texts.java:66)
	at mb.common.text.Texts$FragmentedString_.match(Texts.java:103)
	at mb.common.text.Texts$CaseOfMatchers$TotalMatcher_FragmentedString.fragmentedString(Texts.java:228)
	at mb.jsglr.common.FragmentedOriginLocationFixer.fixOriginLocations(FragmentedOriginLocationFixer.java:41)
	at mb.jsglr2.common.Jsglr2Parser.parse(Jsglr2Parser.java:72)
	at mb.Example.ExampleParser.parse(%2Flayoutdependent%2Fbuild%2Fgenerated%2Fsources%2Flanguage%2Fmb%2FExample%2FExampleParser.java:19)
	at mb.Example.task.ExampleParse.parse(%2Flayoutdependent%2Fbuild%2Fgenerated%2Fsources%2Fadapter%2Fmb%2FExample%2Ftask%2FExampleParse.java:50)
	at mb.jsglr.pie.JsglrParseTaskDef.exec(JsglrParseTaskDef.java:100)
	at mb.jsglr.pie.JsglrParseTaskDef.exec(JsglrParseTaskDef.java:23)
	at mb.pie.api.Task.exec(Task.java:56)
	at mb.pie.runtime.exec.TaskExecutor.execInternal(TaskExecutor.java:110)
	at mb.pie.runtime.exec.TaskExecutor.exec(TaskExecutor.java:81)
	at mb.pie.runtime.exec.TopDownRunner.exec(TopDownRunner.java:195)
	at mb.pie.runtime.exec.TopDownRunner.executeOrGetExisting(TopDownRunner.java:167)
	at mb.pie.runtime.exec.TopDownRunner.require(TopDownRunner.java:80)
	at mb.pie.runtime.exec.TopDownRunner.requireInitial(TopDownRunner.java:59)
	at mb.pie.runtime.MixedSessionImpl.lambda$requireWithoutObserving$2(MixedSessionImpl.java:103)
	at mb.pie.runtime.SessionImpl.handleException(SessionImpl.java:149)
	at mb.pie.runtime.MixedSessionImpl.requireWithoutObserving(MixedSessionImpl.java:103)
	at mb.pie.runtime.MixedSessionImpl.requireWithoutObserving(MixedSessionImpl.java:97)
	at mb.Example.ExampleInstance.testParse(%2Flayoutdependent%2Fbuild%2Fgenerated%2Fsources%2Fadapter%2Fmb%2FExample%2FExampleInstance.java:164)
	at mb.spt.expectation.ParseExpectation.evaluate(ParseExpectation.java:52)
	at mb.spt.task.SptCheck.runTests(SptCheck.java:162)
	at mb.spt.task.SptCheck.lambda$runTests$1(SptCheck.java:146)
	at mb.common.result.Result.ifThrowingElse(Result.java:150)
	at mb.spt.task.SptCheck.runTests(SptCheck.java:145)
	at mb.spt.task.SptCheck.lambda$exec$0(SptCheck.java:110)
	at mb.common.result.Result.ifThrowingElse(Result.java:150)
	at mb.spt.task.SptCheck.exec(SptCheck.java:108)
	at mb.spt.task.SptCheck.exec(SptCheck.java:40)
	at mb.pie.api.Task.exec(Task.java:56)
	at mb.pie.runtime.exec.TaskExecutor.execInternal(TaskExecutor.java:110)
	at mb.pie.runtime.exec.TaskExecutor.exec(TaskExecutor.java:81)
	at mb.pie.runtime.exec.BottomUpRunner.exec(BottomUpRunner.java:354)
	at mb.pie.runtime.exec.BottomUpRunner.execAndSchedule(BottomUpRunner.java:118)
	at mb.pie.runtime.exec.BottomUpRunner.execScheduled(BottomUpRunner.java:110)
	at mb.pie.runtime.exec.BottomUpRunner.requireInitial(BottomUpRunner.java:75)
	at mb.pie.runtime.MixedSessionImpl.lambda$updateAffectedBy$0(MixedSessionImpl.java:65)
	at mb.pie.runtime.SessionImpl.handleException(SessionImpl.java:161)
	at mb.pie.runtime.MixedSessionImpl.updateAffectedBy(MixedSessionImpl.java:65)
	at mb.spoofax.eclipse.pie.PieRunner.updateAffectedBy(PieRunner.java:442)
	at mb.spoofax.eclipse.pie.PieRunner.addOrUpdateEditor(PieRunner.java:128)
	at mb.spoofax.eclipse.editor.EditorUpdateJob.update(EditorUpdateJob.java:89)
	at mb.spoofax.eclipse.editor.EditorUpdateJob.run(EditorUpdateJob.java:74)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)

Note that adding some whitespace after the test will make the test work as intended:

test hello [[ Hello == World == World ]] parse fails

Using left, right or nothing instead of non-assoc will also not cause an internal error.

Generation/analysis loop when opening a Statix signature file in Eclipse

When opening a statix signature file in Eclipse, some task seems to run that ends up writing an identical signature file to disk. This will then cause Eclipse to reload the file, which in turn triggers another analysis, which will write a file, etc.

I haven't looked to deeply into what causes this, but I suspect either moving to a hash resource stamper or preventing the writing of an indentical file would be a simple way to fix this.

This issue is slightly higher priority now that we have go-to-definition support in Statix, since that means that it becomes more likely for the user to actually open the generated files in their Eclipse instance.

Continuous commands stop updating for dynamically loaded languages after rebuilding/reloading the language

Summary

Continuous commands, such as "Show parsed AST (continuous)" stop updating for dynamically loaded languages after reloading the language. This is annoying, because most of the time we want to check the result of a continuous command after rebuilding a language.

What you did

Run a continuous debugging command, change and rebuild the language.

What you expected to happen

The command to run and show new feedback after rebuilding the language.

What actually happened

The command is not updated any more, until it is initiated again.

Context

  • Spoofax version: 0.12.0
  • Operating system & version: Any

Additional information

The continuous command is initially observed in the PIE instance of the dynamically loaded language. After rebuilding the language, if the PIE store of that dynamically loaded language is thrown away, the task does not exist any more and hence it is not re-executed.

If we serialize the PIE store of the language on unload, and deserialize it again on reload, the task does still exist and is still observed. However, to re-execute all affected tasks (including continuous commands), we must run a bottom-up build on the PIE instance of the language after reloading it, with the resources that were provided during the build of that language. The DynamicLoadingTest does this, and this should be implemented in the Eclipse LWB plugin as well.

Support start symbol directive in SPT

Summary

The start symbol directive in SPT is ignored, with the SPT tests opting to use the default start symbol instead.

What you did

language foo

start symbol Exp

test parse to num [[ 1 ]] parse to Int("1")

What you expected to happen

Test succeeds.

What actually happened

Test fails, since it is parsed from the start symbol (i.e. something like Program(Exprs([Int("1")]))).

Context

  • Spoofax version: 0.11.9
  • Operating system & version: all

Error markers on directories are not cleared

Summary

Error markers on directories, such as "SDF3 analysis failed unexpectedly" are created but never removed even if the underlying issue is solved, leading to confusion.

What you did

Something that causes an error marker on a directory, and then fix that issue.

What you expected to happen

The error marker to disappear after fixing the issue.

What actually happened

The error marker stays indefinitely.

Context

  • Spoofax version: 0.11.6
  • Operating system & version: Any

Deadlock when invoking hover/reference resolution in the Eclipse LWB

Summary

A deadlock can occur sometimes when invoking hover/reference resolution in the Eclipse LWB.

What you did

Build a language and then invoke hover/reference resolution.

What you expected to happen

No deadlock to occur.

What actually happened

A deadlock occurs.

Context

  • Spoofax version: 0.11.10
  • Operating system & version: Any

Additional information

Thread dump: https://gist.github.com/Gohla/661524b25904b5010f3ddd98525a2057
The dump indicates that both the:

  • Main thread (which is invoking hover) is waiting on a lock because it walks the project resources (due to executing the Sdf3GetSourceFiles task), and this lock is probably locked because the Spoofax LWB builder thread holds a lock on the entire project.
  • Spoofax LWB builder thread probably locks the entire project, but is stuck waiting on a lock for writing to the console.

It is unclear to me why the builder thread is stuck waiting on the console.

NullPointerException when editing files

Summary

The spoofax editor crashes when I make changes to a .spt test file, giving a NullPointerException on every keystroke.

What you did

Open a .spt file, make some changes, wait until the editor reloads and immediately crashes with 'SPT Editor Update'.

What you expected to happen

Editor updates and reruns tests

What actually happened

Editor crashes

Context

  • Spoofax version: 0.14.2
  • Operating system & version: MacOS 11.6
  • Java version (if applicable): embedded JVM
  • Eclipse version (if applicable): 2021-03
  • Gradle version (if applicable):

Additional information

Log of SPT Editor Update:
error-log.txt

Spoofax 3 in Eclipse slow in large project

Summary

The WebDSL syntax is spread across about 30 files. Changing any of the files results in the notification:

The user is waiting for "SDF3 editor update" to complete

Which takes about 10 seconds to disappear. Subsequently, I can type a bit, but when I save or type in a different file, the notification appears again for a while.

What you did

I am editing the attached WebDSL project in Spoofax 3.

What you expected to happen

I expected the editor to not interfere with normal usage.

What actually happened

I have to wait a lot.

Context

  • Spoofax version: 0.13.0 (01-10-2021)
  • Operating system & version: macOS 11.5.2
  • Java version: embedded JRE
  • Eclipse version: pre-built 2021-09 with JRE from here
  • Gradle version: N/A

Additional information

Project in which this occurs:

📂 webdsl.zip

Stratego signature generation fails with string literals in context-free syntax

Using string or character literals in context-free syntax causes the build to fail on signature generation. Such as the following example:

module start

context-free start-symbols

  Start

context-free sorts

  Start
  Word

context-free syntax

  Start.Empty = <>
  Start.Program = Word*
  Word.Hello = "Hello"  // Does not work
  Word.World = <World>  // Templates do work
  
syntax
  Word-CF.DoubleQuotedWord =  "\"" Word-CF "\""  // Does not work
  Word-CF.QuotedWord = QUOTE-CF Word-CF QUOTE-CF // Does work

lexical sorts
  QUOTE

lexical syntax
  QUOTE = "'"

  LAYOUT = [\ \n\v\f\r]

context-free restrictions

  LAYOUT? -/- [\ \n\v\f\r]

This example produces the following error (Note the occurences of nabl2.Var("./src/start.sdf3", "y_1-..."){OfSort(SORT("TYPE"))} in the AST):

ERROR: Could not check Stratego because it could not be configured
  Exception of message: mb.spoofax.lwb.compiler.stratego.StrategoConfigureExceptions$Sdf3SignatureGenerateFail: SDF3 to signature generator failed
  Caused by: mb.stratego.common.StrategoExceptions$StrategyFail: Invoking Stratego strategy 'pp-stratego-string' failed 
Stratego stack trace:
	abox2text_list_1_2
	abox2text_1_2
	abox2text_0_1
	box2text_string_0_1
	pp_stratego_string_0_0
	pp_stratego_string_0_0
Stratego input term:
Module(
  "signatures/start-sig"
, [ Imports([Import("libstratego-lib")])
  , Signature(
      [ Sorts([SortNoArgs("Start"{TermIndex("./src/start.sdf3", 12)}), SortNoArgs("Word"{TermIndex("./src/start.sdf3", 14)})]{TermIndex("./src/start.sdf3", 19)})
      , Sorts([SortNoArgs("QUOTE"{TermIndex("./src/start.sdf3", 154)})]{TermIndex("./src/start.sdf3", 158)})
      , Constructors(
          [ OpDecl("Empty"{TermIndex("./src/start.sdf3", 24)}, ConstType(SortNoArgs("Start"{TermIndex("./src/start.sdf3", 22)})))
          , OpDecl(
              "Program"{TermIndex("./src/start.sdf3", 41)}
            , FunType(
                [ConstType(Sort("List", [ConstType(SortNoArgs("Word"{TermIndex("./src/start.sdf3", 72)}))]))]
              , ConstType(SortNoArgs("Start"{TermIndex("./src/start.sdf3", 39)}))
              )
            )
          , OpDecl(
              "Hello"{TermIndex("./src/start.sdf3", 58)}
            , FunType([nabl2.Var("./src/start.sdf3", "y_1-225"){OfSort(SORT("TYPE"))}], ConstType(SortNoArgs("Word"{TermIndex("./src/start.sdf3", 56)})))
            )
          , OpDecl("World"{TermIndex("./src/start.sdf3", 74)}, ConstType(SortNoArgs("Word"{TermIndex("./src/start.sdf3", 72)})))
          , OpDecl("Start-Plhdr", ConstType(SortNoArgs("Start")))
          , OpDecl("Word-Plhdr", ConstType(SortNoArgs("Word")))
          , OpDecl(
              "Start-Plhdr"
            , FunType([ConstType(SortNoArgs("COMPLETION-INSERTION"))], ConstType(SortNoArgs("Start")))
            )
          , OpDecl(
              "Word-Plhdr"
            , FunType([ConstType(SortNoArgs("COMPLETION-INSERTION"))], ConstType(SortNoArgs("Word")))
            )
          , OpDecl("Start-Opt-Plhdr", ConstType(SortNoArgs("Start")))
          , OpDecl("Word-Opt-Plhdr", ConstType(SortNoArgs("Word")))
          , OpDecl(
              "DoubleQuotedWord"{TermIndex("./src/start.sdf3", 103)}
            , FunType(
                [nabl2.Var("./src/start.sdf3", "y_1-139"){OfSort(SORT("TYPE"))}, ConstType(SortNoArgs("Word"{TermIndex("./src/start.sdf3", 72)})), nabl2.Var("./src/start.sdf3", "y_1-147"){OfSort(SORT("TYPE"))}]
              , ConstType(SortNoArgs("Word"{TermIndex("./src/start.sdf3", 100)}))
              )
            )
          , OpDecl(
              "QuotedWord"{TermIndex("./src/start.sdf3", 126)}
            , FunType(
                [ConstType(SortNoArgs("QUOTE"{TermIndex("./src/start.sdf3", 161)})), ConstType(SortNoArgs("Word"{TermIndex("./src/start.sdf3", 72)})), ConstType(SortNoArgs("QUOTE"{TermIndex("./src/start.sdf3", 161)}))]
              , ConstType(SortNoArgs("Word"{TermIndex("./src/start.sdf3", 123)}))
              )
            )
          , OpDecl("Word-Plhdr", ConstType(SortNoArgs("Word")))
          , OpDecl("QUOTE-Plhdr", ConstType(SortNoArgs("QUOTE")))
          , OpDecl(
              "Word-Plhdr"
            , FunType([ConstType(SortNoArgs("COMPLETION-INSERTION"))], ConstType(SortNoArgs("Word")))
            )
          , OpDecl(
              "QUOTE-Plhdr"
            , FunType([ConstType(SortNoArgs("COMPLETION-INSERTION"))], ConstType(SortNoArgs("QUOTE")))
            )
          , OpDeclInj(FunType([SortVar("string")], ConstType(SortNoArgs("QUOTE"{TermIndex("./src/start.sdf3", 161)}))))
          ]
        )
      ]
    )
  ]
)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.