diff --git a/lombok/build.gradle b/lombok/build.gradle new file mode 100644 index 0000000..7a7fe06 --- /dev/null +++ b/lombok/build.gradle @@ -0,0 +1,15 @@ +plugins { + id 'maven-publish' + id 'java-gradle-plugin' +} + +version = "0.1" + +gradlePlugin { + plugins { + create("LombokPlugin") { + id = "net.woggioni.gradle.lombok" + implementationClass = "net.woggioni.gradle.lombok.LombokPlugin" + } + } +} diff --git a/lombok/src/main/java/net/woggioni/gradle/lombok/Delombok.java b/lombok/src/main/java/net/woggioni/gradle/lombok/Delombok.java new file mode 100644 index 0000000..82a7494 --- /dev/null +++ b/lombok/src/main/java/net/woggioni/gradle/lombok/Delombok.java @@ -0,0 +1,52 @@ +package net.woggioni.gradle.lombok; + +import lombok.Getter; +import org.gradle.api.file.Directory; +import org.gradle.api.tasks.JavaExec; +import org.gradle.api.tasks.OutputDirectory; + +import javax.inject.Inject; +import java.io.File; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +public class Delombok extends JavaExec { + + @Getter + @OutputDirectory + private final File outputDir; + + private static String buildClasspathString(Iterable classpath) { + StringBuilder sb = new StringBuilder(); + Iterator it = classpath.iterator(); + String separator = System.getProperty("path.separator"); + if(it.hasNext()) { + sb.append(it.next().getPath()); + } + while(it.hasNext()) { + sb.append(separator); + sb.append(it.next().getPath()); + } + for(File file : classpath) { + sb.append(file.getPath()); + } + return sb.toString(); + } + + @Inject + public Delombok(File lombokJar, File outputDir, Iterable sourceDirs, String classpath) { + this.outputDir = outputDir; + classpath(lombokJar); + List args = new ArrayList<>(); + args.add("delombok"); + args.add("-d"); + args.add(outputDir.getPath()); + args.add("-c"); + args.add(classpath); + for(File sourceDir : sourceDirs) args.add(sourceDir.getPath()); + Object[] argsArray = new String[args.size()]; + args.toArray(argsArray); + args(argsArray); + } +} diff --git a/lombok/src/main/java/net/woggioni/gradle/lombok/LombokExtension.java b/lombok/src/main/java/net/woggioni/gradle/lombok/LombokExtension.java new file mode 100644 index 0000000..7a96812 --- /dev/null +++ b/lombok/src/main/java/net/woggioni/gradle/lombok/LombokExtension.java @@ -0,0 +1,13 @@ +package net.woggioni.gradle.lombok; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.gradle.api.provider.Property; + +import javax.inject.Inject; + +@RequiredArgsConstructor(onConstructor_ = { @Inject }) +public class LombokExtension { + @Getter + private final Property version; +} diff --git a/lombok/src/main/java/net/woggioni/gradle/lombok/LombokPlugin.java b/lombok/src/main/java/net/woggioni/gradle/lombok/LombokPlugin.java new file mode 100644 index 0000000..db637aa --- /dev/null +++ b/lombok/src/main/java/net/woggioni/gradle/lombok/LombokPlugin.java @@ -0,0 +1,76 @@ +package net.woggioni.gradle.lombok; + +import org.gradle.api.Plugin; +import org.gradle.api.Project; +import org.gradle.api.Task; +import org.gradle.api.artifacts.Configuration; +import org.gradle.api.artifacts.dsl.DependencyHandler; +import org.gradle.api.model.ObjectFactory; +import org.gradle.api.plugins.JavaPlugin; +import org.gradle.api.plugins.JavaPluginConvention; +import org.gradle.api.provider.Provider; +import org.gradle.api.tasks.SourceSet; +import org.gradle.api.tasks.SourceSetContainer; +import org.gradle.api.tasks.TaskContainer; +import org.gradle.api.tasks.javadoc.Javadoc; + +import java.io.File; +import java.util.Map; + +public class LombokPlugin implements Plugin { + @Override + public void apply(Project project) { + project.getPluginManager().apply(JavaPlugin.class); + ObjectFactory objectFactory = project.getObjects(); + LombokExtension ext = project.getExtensions() + .create("lombok", LombokExtension.class, + objectFactory.property(String.class).convention("1.18.20") + ); + JavaPluginConvention javaPluginConvention = project.getConvention().getPlugin(JavaPluginConvention.class); + SourceSetContainer sourceSetContainer = javaPluginConvention.getSourceSets(); + project.afterEvaluate(p -> { + Provider> dependencyNotationProvider = project.provider(() -> + Map.of("group", "org.projectlombok", + "name", "lombok", + "version", ext.getVersion().get()) + ); + Configuration lombokConfiguration = project.getConfigurations().create("lombok"); + project.getDependencies().addProvider( + lombokConfiguration.getName(), + dependencyNotationProvider, + externalModuleDependency -> { + } + ); + for (SourceSet ss : sourceSetContainer) { + DependencyHandler dependencyHandler = project.getDependencies(); + dependencyHandler.addProvider( + ss.getCompileOnlyConfigurationName(), + dependencyNotationProvider, + externalModuleDependency -> { + }); + dependencyHandler.addProvider( + ss.getAnnotationProcessorConfigurationName(), + dependencyNotationProvider, + externalModuleDependency -> { + }); + TaskContainer tasks = project.getTasks(); + String javadocTaskName = ss.getJavadocTaskName(); + Task javadocTask = tasks.findByName(javadocTaskName); + if(javadocTask != null) { + String delombokTaskName = "delombok" + ss.getName().substring(0, 1).toUpperCase() + ss.getName().substring(1); + File outputDir = new File(new File(project.getBuildDir(), "delombok"), ss.getName()); + Provider delombokTask = tasks.register(delombokTaskName, + Delombok.class, + lombokConfiguration.getSingleFile(), + outputDir, + ss.getJava().getSrcDirs(), + ss.getCompileClasspath().getAsPath() + ); + Javadoc javadoc = (Javadoc) javadocTask; + javadoc.setSource(outputDir); + javadoc.getInputs().files(delombokTask); + } + } + }); + } +} diff --git a/settings.gradle b/settings.gradle index 8783327..5709198 100644 --- a/settings.gradle +++ b/settings.gradle @@ -15,3 +15,4 @@ include("dependency-export") include("jpms-check") include("multi-release-jar") include("wildfly") +include("lombok")