-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Extract JVM/Gradle compatibility into standalone plugin-let
Signed-off-by: Daniel Lacasse <[email protected]>
- Loading branch information
Showing
33 changed files
with
662 additions
and
644 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
102 changes: 102 additions & 0 deletions
102
...le-plugin-development/src/main/java/dev/gradleplugins/internal/GradleCompatibilities.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
package dev.gradleplugins.internal; | ||
|
||
import org.gradle.api.Action; | ||
import org.gradle.api.Named; | ||
import org.gradle.api.NamedDomainObjectProvider; | ||
import org.gradle.api.NamedDomainObjectSet; | ||
import org.gradle.api.Project; | ||
import org.gradle.api.Transformer; | ||
import org.gradle.api.model.ObjectFactory; | ||
import org.gradle.api.provider.Property; | ||
import org.gradle.api.tasks.SourceSet; | ||
import org.gradle.util.GradleVersion; | ||
|
||
import javax.inject.Inject; | ||
|
||
import static dev.gradleplugins.GradlePluginDevelopmentDependencyExtension.GRADLE_API_LOCAL_VERSION; | ||
|
||
public abstract class GradleCompatibilities { | ||
public abstract Property<String> getMinimumGradleVersion(); | ||
public abstract Property<String> getGradleApiVersion(); | ||
|
||
/*private*/ static abstract /*final*/ class Rule implements org.gradle.api.Plugin<Project> { | ||
@Inject | ||
public Rule() {} | ||
|
||
@Override | ||
public void apply(Project project) { | ||
final GradleCompatibilitiesExtension extension = project.getExtensions().create("$gradleCompatibilities", GradleCompatibilitiesExtension.class); | ||
extension.configureEach(new Action<GradleCompatibilities>() { | ||
@Override | ||
public void execute(GradleCompatibilities it) { | ||
// For now, we will not allow to finalize the value just yet because of the override for 1.x series | ||
// See GradlePluginDevelopmentCompatibilityExtensionRule | ||
//it.getMinimumGradleVersion().finalizeValueOnRead(); | ||
|
||
it.getGradleApiVersion().convention(it.getMinimumGradleVersion().map(toLocalIfGradleSnapshotVersion())); | ||
it.getGradleApiVersion().finalizeValueOnRead(); | ||
} | ||
|
||
private /*static*/ Transformer<String, String> toLocalIfGradleSnapshotVersion() { | ||
return it -> { | ||
if (GradleVersion.version(it).isSnapshot()) { | ||
return GRADLE_API_LOCAL_VERSION; | ||
} | ||
return it; | ||
}; | ||
} | ||
}); | ||
} | ||
} | ||
|
||
public interface ForSourceSetExtension { | ||
NamedDomainObjectProvider<SourceSetGradleCompatibilities> forSourceSet(SourceSet sourceSet); | ||
void configureEach(Action<? super SourceSetGradleCompatibilities> action); | ||
|
||
abstract class SourceSetGradleCompatibilities extends GradleCompatibilities { | ||
public abstract SourceSet getSourceSet(); | ||
} | ||
} | ||
|
||
/*private*/ static abstract /*final*/ class GradleCompatibilitiesExtension implements ForSourceSetExtension { | ||
private final ObjectFactory objects; | ||
private final NamedDomainObjectSet<SourceSetGradleCompatibilities> compatibilities; | ||
|
||
@Inject | ||
public GradleCompatibilitiesExtension(ObjectFactory objects) { | ||
this.objects = objects; | ||
this.compatibilities = objects.namedDomainObjectSet(SourceSetGradleCompatibilities.class); | ||
} | ||
|
||
public NamedDomainObjectProvider<SourceSetGradleCompatibilities> forSourceSet(SourceSet sourceSet) { | ||
if (compatibilities.findByName(sourceSet.getName()) == null) { | ||
compatibilities.add(objects.newInstance(DefaultGradleCompatibility.class, sourceSet)); | ||
} | ||
return compatibilities.named(sourceSet.getName()); | ||
} | ||
|
||
@Override | ||
public void configureEach(Action<? super SourceSetGradleCompatibilities> action) { | ||
compatibilities.configureEach(action); | ||
} | ||
} | ||
|
||
/*private*/ static abstract /*final*/ class DefaultGradleCompatibility extends ForSourceSetExtension.SourceSetGradleCompatibilities implements Named { | ||
private final SourceSet sourceSet; | ||
|
||
@Inject | ||
public DefaultGradleCompatibility(SourceSet sourceSet) { | ||
this.sourceSet = sourceSet; | ||
} | ||
|
||
@Override | ||
public String getName() { | ||
return sourceSet.getName(); | ||
} | ||
|
||
@Override | ||
public SourceSet getSourceSet() { | ||
return sourceSet; | ||
} | ||
} | ||
} |
145 changes: 145 additions & 0 deletions
145
...radle-plugin-development/src/main/java/dev/gradleplugins/internal/JvmCompatibilities.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,145 @@ | ||
package dev.gradleplugins.internal; | ||
|
||
import org.gradle.api.Action; | ||
import org.gradle.api.JavaVersion; | ||
import org.gradle.api.Named; | ||
import org.gradle.api.NamedDomainObjectProvider; | ||
import org.gradle.api.NamedDomainObjectSet; | ||
import org.gradle.api.Project; | ||
import org.gradle.api.Transformer; | ||
import org.gradle.api.model.ObjectFactory; | ||
import org.gradle.api.plugins.JavaPluginExtension; | ||
import org.gradle.api.provider.Property; | ||
import org.gradle.api.tasks.SourceSet; | ||
import org.gradle.api.tasks.compile.JavaCompile; | ||
|
||
import javax.inject.Inject; | ||
import java.util.function.Consumer; | ||
import java.util.function.Supplier; | ||
|
||
public abstract class JvmCompatibilities { | ||
public abstract Property<JavaVersion> getSourceCompatibility(); | ||
public abstract Property<JavaVersion> getTargetCompatibility(); | ||
|
||
public static abstract class ForProjectExtension extends JvmCompatibilities {} | ||
|
||
/*private*/ static abstract /*final*/ class ProjectJvmCompatibilitiesExtension extends ForProjectExtension { | ||
@Inject | ||
public ProjectJvmCompatibilitiesExtension(Project project) { | ||
JavaPluginExtension java = project.getExtensions().getByType(JavaPluginExtension.class); | ||
|
||
getTargetCompatibility().convention(project.provider(java::getTargetCompatibility).map(toFinalValue(java::getTargetCompatibility, java::setTargetCompatibility, it -> { | ||
// Important to restore the normla behaviour | ||
// Normally, targetCompatibility derived from sourceCompatibility when not set | ||
final JavaVersion sourceCompatibility = java.getSourceCompatibility(); | ||
if (!sourceCompatibility.equals(JavaVersion.VERSION_1_1)) { | ||
java.setTargetCompatibility(sourceCompatibility); | ||
} else { | ||
java.setTargetCompatibility(it); | ||
} | ||
})).orElse(getSourceCompatibility())); | ||
getTargetCompatibility().finalizeValueOnRead(); | ||
getTargetCompatibility().disallowChanges(); | ||
project.afterEvaluate(__ -> getTargetCompatibility().finalizeValue()); | ||
|
||
getSourceCompatibility().convention(project.provider(java::getSourceCompatibility).map(toFinalValue(java::getSourceCompatibility, java::setSourceCompatibility, it -> { | ||
// Important to restore the normal behaviour | ||
java.setSourceCompatibility(it); | ||
}))); | ||
getSourceCompatibility().finalizeValueOnRead(); | ||
getSourceCompatibility().disallowChanges(); | ||
project.afterEvaluate(__ -> getSourceCompatibility().finalizeValue()); | ||
} | ||
|
||
private Transformer<JavaVersion, JavaVersion> toFinalValue(Supplier<JavaVersion> getter, Consumer<JavaVersion> setter, Action<? super JavaVersion> restoreAction) { | ||
final JavaVersion originalValue = getter.get(); | ||
setter.accept(JavaVersion.VERSION_1_1); | ||
return it -> { | ||
if (it.equals(JavaVersion.VERSION_1_1)) { | ||
restoreAction.execute(originalValue); | ||
return null; | ||
} else { | ||
return it; | ||
} | ||
}; | ||
} | ||
} | ||
|
||
/*private*/ static abstract /*final*/ class Rule implements org.gradle.api.Plugin<Project> { | ||
@Inject | ||
public Rule() {} | ||
|
||
@Override | ||
public void apply(Project project) { | ||
final ProjectJvmCompatibilitiesExtension jvmCompatibilities = project.getExtensions().create("$jvmProjectCompatibilities", ProjectJvmCompatibilitiesExtension.class, project); | ||
|
||
final SourceSetJvmCompatibilitiesExtension extension = project.getExtensions().create("$jvmCompatibilities", SourceSetJvmCompatibilitiesExtension.class); | ||
|
||
extension.configureEach(it -> { | ||
it.getSourceCompatibility().convention(jvmCompatibilities.getSourceCompatibility()); | ||
it.getTargetCompatibility().convention(jvmCompatibilities.getTargetCompatibility() | ||
.orElse(it.getSourceCompatibility())); | ||
}); | ||
|
||
extension.configureEach(it -> { | ||
project.getTasks().named(it.getSourceSet().getCompileJavaTaskName(), JavaCompile.class).configure(task -> { | ||
task.getConventionMapping().map("sourceCompatibility", () -> it.getSourceCompatibility().getOrElse(JavaVersion.current()).toString()); | ||
task.getConventionMapping().map("targetCompatibility", () -> it.getTargetCompatibility().getOrElse(JavaVersion.current()).toString()); | ||
// TODO: Gradle 6.7+ configure the javaCompiler property | ||
}); | ||
|
||
// TODO: Configure test task (if available) | ||
}); | ||
} | ||
} | ||
|
||
public interface ForSourceSetExtension { | ||
NamedDomainObjectProvider<SourceSetJvmCompatibilities> forSourceSet(SourceSet sourceSet); | ||
void configureEach(Action<? super SourceSetJvmCompatibilities> action); | ||
|
||
abstract class SourceSetJvmCompatibilities extends JvmCompatibilities { | ||
public abstract SourceSet getSourceSet(); | ||
} | ||
} | ||
|
||
/*private*/ static abstract /*final*/ class SourceSetJvmCompatibilitiesExtension implements ForSourceSetExtension { | ||
private final ObjectFactory objects; | ||
private final NamedDomainObjectSet<SourceSetJvmCompatibilities> compatibilities; | ||
|
||
@Inject | ||
public SourceSetJvmCompatibilitiesExtension(ObjectFactory objects) { | ||
this.objects = objects; | ||
this.compatibilities = objects.namedDomainObjectSet(SourceSetJvmCompatibilities.class); | ||
} | ||
|
||
public NamedDomainObjectProvider<SourceSetJvmCompatibilities> forSourceSet(SourceSet sourceSet) { | ||
if (compatibilities.findByName(sourceSet.getName()) == null) { | ||
compatibilities.add(objects.newInstance(DefaultSourceSetJvmCompatibilities.class, sourceSet)); | ||
} | ||
return compatibilities.named(sourceSet.getName()); | ||
} | ||
|
||
@Override | ||
public void configureEach(Action<? super SourceSetJvmCompatibilities> action) { | ||
compatibilities.configureEach(action); | ||
} | ||
} | ||
|
||
/*private*/ static abstract /*final*/ class DefaultSourceSetJvmCompatibilities extends ForSourceSetExtension.SourceSetJvmCompatibilities implements Named { | ||
private final SourceSet sourceSet; | ||
|
||
@Inject | ||
public DefaultSourceSetJvmCompatibilities(SourceSet sourceSet) { | ||
this.sourceSet = sourceSet; | ||
} | ||
|
||
@Override | ||
public String getName() { | ||
return sourceSet.getName(); | ||
} | ||
|
||
public SourceSet getSourceSet() { | ||
return sourceSet; | ||
} | ||
} | ||
} |
Oops, something went wrong.