Skip to content

FormatExtension.replaceStep() forces the evaluation of steps #219

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
muryoh opened this issue Mar 7, 2018 · 2 comments
Closed

FormatExtension.replaceStep() forces the evaluation of steps #219

muryoh opened this issue Mar 7, 2018 · 2 comments

Comments

@muryoh
Copy link

muryoh commented Mar 7, 2018

I noticed this with a script similar to this one:

            spotless {
                java {
                    licenseHeaderFile someHeaderFile
                    eclipse().configFile someEclipseConfigFile
                }
            }

Basically, in my case, none of the 2 files exist. I'd like to create them later somehow.
This ends up at configuration phase with the following stack trace:

Caused by: com.diffplug.spotless.ThrowingEx$WrappedAsRuntimeException: java.nio.file.NoSuchFileException: /mnt/dev/git/ul-odisys/odisys/configurationmanager-api/build/tmp/createCodeFormatterFile/ullink.java.header
        at com.diffplug.spotless.ThrowingEx.asRuntime(ThrowingEx.java:86)
        at com.diffplug.spotless.LazyForwardingEquality.state(LazyForwardingEquality.java:58)
        at com.diffplug.spotless.LazyForwardingEquality.toBytes(LazyForwardingEquality.java:85)
        at com.diffplug.spotless.LazyForwardingEquality.equals(LazyForwardingEquality.java:94)
        at com.diffplug.gradle.spotless.FormatExtension.replaceStep(FormatExtension.java:235)
        at com.diffplug.gradle.spotless.JavaExtension$EclipseConfig.configFile(JavaExtension.java:165)
        at JavaUllinkFormatterPlugin$_apply_closure1$_closure3$_closure7.doCall(JavaUllinkFormatterPlugin.groovy:35)
        at org.gradle.api.internal.ClosureBackedAction.execute(ClosureBackedAction.java:71)
        at org.gradle.util.ConfigureUtil.configureTarget(ConfigureUtil.java:160)
        at org.gradle.util.ConfigureUtil.configure(ConfigureUtil.java:106)
        at org.gradle.util.ConfigureUtil$1.execute(ConfigureUtil.java:123)
        at com.diffplug.gradle.spotless.SpotlessExtension.configure(SpotlessExtension.java:156)
        at com.diffplug.gradle.spotless.SpotlessExtension.java(SpotlessExtension.java:79)
        at com.diffplug.gradle.spotless.SpotlessExtension_Decorated.java(Unknown Source)
        at org.gradle.internal.metaobject.BeanDynamicObject$MetaClassAdapter.invokeMethod(BeanDynamicObject.java:479)
        at org.gradle.internal.metaobject.BeanDynamicObject.tryInvokeMethod(BeanDynamicObject.java:191)
        at org.gradle.internal.metaobject.CompositeDynamicObject.tryInvokeMethod(CompositeDynamicObject.java:98)
        at org.gradle.internal.metaobject.MixInClosurePropertiesAsMethodsDynamicObject.tryInvokeMethod(MixInClosurePropertiesAsMethodsDynamicObject.java:30)
        at org.gradle.internal.metaobject.ConfigureDelegate.invokeMethod(ConfigureDelegate.java:57)
        at JavaUllinkFormatterPlugin$_apply_closure1$_closure3.doCall(JavaUllinkFormatterPlugin.groovy:33)
        at org.gradle.api.internal.ClosureBackedAction.execute(ClosureBackedAction.java:71)
        at org.gradle.util.ConfigureUtil.configureTarget(ConfigureUtil.java:160)
        at org.gradle.util.ConfigureUtil.configure(ConfigureUtil.java:106)
        at org.gradle.util.ConfigureUtil$1.execute(ConfigureUtil.java:123)
        at org.gradle.api.internal.plugins.ExtensionsStorage$ExtensionHolder.configure(ExtensionsStorage.java:173)
        at org.gradle.api.internal.plugins.ExtensionsStorage.configureExtension(ExtensionsStorage.java:70)
        at org.gradle.api.internal.plugins.DefaultConvention.configureExtension(DefaultConvention.java:367)
        at org.gradle.api.internal.plugins.DefaultConvention.access$500(DefaultConvention.java:45)
        at org.gradle.api.internal.plugins.DefaultConvention$ExtensionsDynamicObject.tryInvokeMethod(DefaultConvention.java:310)
        at org.gradle.internal.metaobject.CompositeDynamicObject.tryInvokeMethod(CompositeDynamicObject.java:98)
        at org.gradle.internal.metaobject.MixInClosurePropertiesAsMethodsDynamicObject.tryInvokeMethod(MixInClosurePropertiesAsMethodsDynamicObject.java:30)
        at org.gradle.internal.metaobject.AbstractDynamicObject.invokeMethod(AbstractDynamicObject.java:160)
        at org.gradle.api.internal.project.DefaultProject_Decorated.invokeMethod(Unknown Source)
        at JavaUllinkFormatterPlugin$_apply_closure1.doCall(JavaUllinkFormatterPlugin.groovy:32)
        at JavaUllinkFormatterPlugin.apply(JavaUllinkFormatterPlugin.groovy:21)
        at JavaUllinkFormatterPlugin.apply(JavaUllinkFormatterPlugin.groovy)
        at org.gradle.api.internal.plugins.ImperativeOnlyPluginTarget.applyImperative(ImperativeOnlyPluginTarget.java:42)
        at org.gradle.api.internal.plugins.RuleBasedPluginTarget.applyImperative(RuleBasedPluginTarget.java:50)
        at org.gradle.api.internal.plugins.DefaultPluginManager.addPlugin(DefaultPluginManager.java:165)
        at org.gradle.api.internal.plugins.DefaultPluginManager.access$200(DefaultPluginManager.java:47)
        at org.gradle.api.internal.plugins.DefaultPluginManager$AddPluginBuildOperation.run(DefaultPluginManager.java:252)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
        at org.gradle.api.internal.plugins.DefaultPluginManager.doApply(DefaultPluginManager.java:144)
        ... 104 more
Caused by: java.nio.file.NoSuchFileException: /mnt/dev/git/ul-odisys/odisys/configurationmanager-api/build/tmp/createCodeFormatterFile/ullink.java.header
        at com.diffplug.spotless.generic.LicenseHeaderStep.<init>(LicenseHeaderStep.java:114)
        at com.diffplug.spotless.generic.LicenseHeaderStep.lambda$createFromFile$1(LicenseHeaderStep.java:78)
        at com.diffplug.spotless.FormatterStepImpl.calculateState(FormatterStepImpl.java:56)
        at com.diffplug.spotless.LazyForwardingEquality.state(LazyForwardingEquality.java:56)
        ... 148 more

But the eclipse().configFile someEclipseConfigFile ends up trying to replace itself

This is implemented the following way:

protected void replaceStep(FormatterStep replacementStep) {
FormatterStep existing = getExistingStep(replacementStep.getName());
if (existing == null) {
throw new GradleException("Cannot replace step '" + replacementStep.getName() + "' for spotless format '" + formatName() + "' because it hasn't been added yet.");
}
int index = steps.indexOf(existing);
steps.set(index, replacementStep);
}

I think the indexOf() ends up trying to test the equality of steps, forcing their evaluation
I guess the step index could be retrieved starting from 0, incrementing until a step with the same name is found?

@nedtwigg
Copy link
Member

nedtwigg commented Mar 7, 2018

Doing the indexOf based on name is a good solution. I'd definitely merge a PR for this approach.

@nedtwigg
Copy link
Member

Fixed in 3.18.0.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants