spotless
spotless copied to clipboard
Enabling Parrot Parser for Groovy Eclipse
Since spotless depends on groovy-eclipse for groovy parsing/formatting, and since groovy-eclipse doesn't enable the parrot parser by default, Spotless fails when configured for groovy code that utilizes Groovy 3+ syntax.
After experiencing some pain with spotless + groovy, I stumbled upon #246 which led me to dig into groovy-eclipse. Turns out groovy-eclipse leaves the new antlr4 based Parrot Parser disabled by default, which means any newer Groovy 3 syntax that contains, for example, Java lambdas, blows up.
I can manually add -Dgroovy.antlr4=true to my Gradle execution and that gets it working for me locally, but there should be some way to configure this right within build.gradle? I'm trying to find a solution that is more amenable to a team environment.
In the past I've modified JavaExec tasks and the like to include forked JVM options. But there seems to be no way to do that for SpotlessTask.
Am I missing something obvious here?
So I didn't think this workaround would work since spotlessGroovy runs before the compileGroovy task, but it did...
Assuming you use gradle, If you add a config.groovy file anywhere to your project containing the following:
configuration.pluginFactory = org.codehaus.groovy.control.ParserPluginFactory.antlr4()
and then reference that file in your build.gradle a la:
compileGroovy.groovyOptions.configurationScript = file('config.groovy')
It should get it working with groovy 3+ syntax. This really should work by default though.
I stand corrected...my previous example doesn't work. There seems to be no way to enable this short of passing JVM options when running gradle 😞
@jamesdh Thanks for the hint. I would not like to extend the interface for this one, but just accept groovy.antlr4 as a property in the configuration files.
Setting a system property is not an option, but eclipse-groovy allows the configuration per PU.
Unfortunately it creates the PU statically
That could be solved by declaring this option as not changeable, as we did it for WTP.
I am afraid this one is not high on my list. PRs are welcome...
You need to enable the _ext projects to build spotless-eclipse-groovy.
@jamesdh Sorry, was writing my previous comment while you were writing yours :smile:
I really don't want to add too much code on Spotless side. In my opinion the best solution would be on eclipse-groovy side, making the groovy.antlr4 configurable per Eclipse project.
That could be solved by declaring this option as not changeable, as we did it for WTP.
I'm struggling to understand what you mean by this. Could you give a bit more context? Thanks for the help already!
For the Eclipse WTP formatter you cannot configure everything per project. Some things are still configured for per workspace. The WTP stores them statically. The spotless user doesn't see this difference. In a multi-project build, you can configure multiple WTP based formatters.
So I propose for groovy.antlr4:
- Store value statically
- If GrEclipseFormatterStepImpl is called is twice with different values, throw an
IllegalArgumentException