/* * Copyright 2016 DiffPlug * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.diffplug.gradle.spotless; import static com.diffplug.gradle.spotless.PluginGradlePreconditions.requireElementsNonNull; import java.util.List; import java.util.Objects; import org.gradle.api.GradleException; import org.gradle.api.Project; import org.gradle.api.internal.file.UnionFileCollection; import org.gradle.api.plugins.JavaPluginConvention; import org.gradle.api.tasks.SourceSet; import com.diffplug.common.base.StringPrinter; import com.diffplug.spotless.FormatterStep; import com.diffplug.spotless.SerializableFileFilter; import com.diffplug.spotless.extra.java.EclipseFormatterStep; import com.diffplug.spotless.generic.LicenseHeaderStep; import com.diffplug.spotless.java.GoogleJavaFormatStep; import com.diffplug.spotless.java.ImportOrderStep; import com.diffplug.spotless.java.RemoveUnusedImportsStep; public class JavaExtension extends FormatExtension { static final String NAME = "java"; public JavaExtension(SpotlessExtension rootExtension) { super(rootExtension); } // If this constant changes, don't forget to change the similarly-named one in // testlib/src/test/java/com/diffplug/spotless/generic/LicenseHeaderStepTest.java as well static final String LICENSE_HEADER_DELIMITER = "package "; public void licenseHeader(String licenseHeader) { licenseHeader(licenseHeader, LICENSE_HEADER_DELIMITER); } public void licenseHeaderFile(Object licenseHeaderFile) { licenseHeaderFile(licenseHeaderFile, LICENSE_HEADER_DELIMITER); } public void importOrder(List<String> importOrder) { addStep(ImportOrderStep.createFromOrder(importOrder)); } public void importOrderFile(Object importOrderFile) { Objects.requireNonNull(importOrderFile); addStep(ImportOrderStep.createFromFile(getProject().file(importOrderFile))); } /** Use {@link #eclipse()} instead */ @Deprecated public void eclipseFormatFile(Object eclipseFormatFile) { eclipseFormatFile(EclipseFormatterStep.defaultVersion(), eclipseFormatFile); } /** Use {@link #eclipse(String)} instead */ @Deprecated public void eclipseFormatFile(String eclipseVersion, Object eclipseFormatFile) { Objects.requireNonNull(eclipseVersion, "eclipseVersion"); Objects.requireNonNull(eclipseFormatFile, "eclipseFormatFile"); getProject().getLogger().warn( StringPrinter.buildStringFromLines( "'eclipseFormatFile [version] <file>' is deprecated.", "Use 'eclipse([version]).configFile(<file>)' instead.", "For details see https://github.com/diffplug/spotless/tree/master/plugin-gradle#applying-to-java-source")); eclipse(eclipseVersion).configFile(eclipseFormatFile); } /** Removes any unused imports. */ public void removeUnusedImports() { addStep(RemoveUnusedImportsStep.create(GradleProvisioner.fromProject(getProject()))); } /** Uses the [google-java-format](https://github.com/google/google-java-format) jar to format source code. */ public void googleJavaFormat() { googleJavaFormat(GoogleJavaFormatStep.defaultVersion()); } /** * Uses the given version of [google-java-format](https://github.com/google/google-java-format) to format source code. * * Limited to published versions. See [issue #33](https://github.com/diffplug/spotless/issues/33#issuecomment-252315095) * for an workaround for using snapshot versions. */ public void googleJavaFormat(String version) { Objects.requireNonNull(version); addStep(GoogleJavaFormatStep.create(version, GradleProvisioner.fromProject(getProject()))); } public EclipseConfig eclipse() { return eclipse(EclipseFormatterStep.defaultVersion()); } public EclipseConfig eclipse(String version) { return new EclipseConfig(version); } public class EclipseConfig { final String version; Object[] configFiles; EclipseConfig(String version) { configFiles = new Object[0]; this.version = Objects.requireNonNull(version); addStep(createStep()); } public void configFile(Object... configFiles) { this.configFiles = requireElementsNonNull(configFiles); replaceStep(createStep()); } private FormatterStep createStep() { Project project = getProject(); return EclipseFormatterStep.create(version, project.files(configFiles).getFiles(), GradleProvisioner.fromProject(project)); } } /** If the user hasn't specified the files yet, we'll assume he/she means all of the java files. */ @Override protected void setupTask(SpotlessTask task) { if (target == null) { JavaPluginConvention javaPlugin = getProject().getConvention().findPlugin(JavaPluginConvention.class); if (javaPlugin == null) { throw new GradleException("You must apply the java plugin before the spotless plugin if you are using the java extension."); } UnionFileCollection union = new UnionFileCollection(); for (SourceSet sourceSet : javaPlugin.getSourceSets()) { union.add(sourceSet.getAllJava()); } target = union; } // LicenseHeaderStep completely blows apart package-info.java - this common-sense check ensures that // it skips package-info.java. See https://github.com/diffplug/spotless/issues/1 steps.replaceAll(step -> { if (LicenseHeaderStep.name().equals(step.getName())) { return step.filterByFile(SerializableFileFilter.skipFilesNamed("package-info.java")); } else { return step; } }); super.setupTask(task); } }