# HG changeset patch # User cin # Date 2026-04-20 19:38:56 # Node ID c41a563716ec654dd8d790a410c71bbce73d67bb # Parent a06b08ec0a7f514c58d03cf4c544988aa5447f0a variants: refine public API boundary diff --git a/variants/build.gradle b/variants/build.gradle --- a/variants/build.gradle +++ b/variants/build.gradle @@ -36,6 +36,10 @@ test { useJUnitPlatform() } +javadoc { + exclude "**/internal/**" +} + publishing { repositories { ivy { diff --git a/variants/src/main/java/org/implab/gradle/internal/IdentityContainerFactory.java b/variants/src/main/java/org/implab/gradle/internal/IdentityContainerFactory.java deleted file mode 100644 --- a/variants/src/main/java/org/implab/gradle/internal/IdentityContainerFactory.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.implab.gradle.internal; - -import org.gradle.api.Named; -import org.gradle.api.NamedDomainObjectContainer; -import org.gradle.api.model.ObjectFactory; - -public final class IdentityContainerFactory { - private IdentityContainerFactory() { - } - - public static NamedDomainObjectContainer create(ObjectFactory objectFactory, Class type) { - return objectFactory.domainObjectContainer(type, name -> objectFactory.named(type, name)); - } -} diff --git a/variants/src/main/java/org/implab/gradle/variants/VariantArtifactsPlugin.java b/variants/src/main/java/org/implab/gradle/variants/VariantArtifactsPlugin.java --- a/variants/src/main/java/org/implab/gradle/variants/VariantArtifactsPlugin.java +++ b/variants/src/main/java/org/implab/gradle/variants/VariantArtifactsPlugin.java @@ -58,7 +58,7 @@ public abstract class VariantArtifactsPl // apply materialization policy hooks to outgoing variants outgoing.configureEach(materializationHandler::execute); - sourcesExtension.whenFinalized(sources -> { + sourcesExtension.whenAvailable(sources -> { var assemblyHandler = new ArtifactAssemblyHandler( objects, tasks, diff --git a/variants/src/main/java/org/implab/gradle/variants/VariantSourcesPlugin.java b/variants/src/main/java/org/implab/gradle/variants/VariantSourcesPlugin.java --- a/variants/src/main/java/org/implab/gradle/variants/VariantSourcesPlugin.java +++ b/variants/src/main/java/org/implab/gradle/variants/VariantSourcesPlugin.java @@ -77,7 +77,7 @@ public abstract class VariantSourcesPlug var variantSourcesExtension = new VariantSourcesExtension() { @Override - public void whenFinalized(Action action) { + public void whenAvailable(Action action) { deferred.whenResolved(action::execute); } @@ -98,7 +98,7 @@ public abstract class VariantSourcesPlug lateConfigurationPolicy.finalizePolicy(); - whenFinalized(ctx -> ctx.configureVariant(resolveVariant(ctx.getVariants(), variantName), action)); + whenAvailable(ctx -> ctx.configureVariant(resolveVariant(ctx.getVariants(), variantName), action)); } @Override @@ -109,7 +109,7 @@ public abstract class VariantSourcesPlug lateConfigurationPolicy.finalizePolicy(); - whenFinalized(ctx -> ctx.configureLayer(resolveLayer(ctx.getVariants(), layerName), action)); + whenAvailable(ctx -> ctx.configureLayer(resolveLayer(ctx.getVariants(), layerName), action)); } @Override @@ -120,7 +120,7 @@ public abstract class VariantSourcesPlug lateConfigurationPolicy.finalizePolicy(); - whenFinalized(ctx -> ctx.configureUnit(resolveCompileUnit(ctx, variantName, layerName), action)); + whenAvailable(ctx -> ctx.configureUnit(resolveCompileUnit(ctx, variantName, layerName), action)); } }; diff --git a/variants/src/main/java/org/implab/gradle/variants/VariantsPlugin.java b/variants/src/main/java/org/implab/gradle/variants/VariantsPlugin.java --- a/variants/src/main/java/org/implab/gradle/variants/VariantsPlugin.java +++ b/variants/src/main/java/org/implab/gradle/variants/VariantsPlugin.java @@ -6,13 +6,13 @@ import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.model.ObjectFactory; import org.implab.gradle.common.core.lang.Deferred; -import org.implab.gradle.internal.IdentityContainerFactory; import org.implab.gradle.variants.core.Layer; import org.implab.gradle.variants.core.Role; import org.implab.gradle.variants.core.Variant; import org.implab.gradle.variants.core.VariantDefinition; import org.implab.gradle.variants.core.VariantsExtension; import org.implab.gradle.variants.core.VariantsView; +import org.implab.gradle.variants.internal.IdentityContainerFactory; /** *
    diff --git a/variants/src/main/java/org/implab/gradle/variants/artifacts/internal/OutgoingRegistry.java b/variants/src/main/java/org/implab/gradle/variants/artifacts/internal/OutgoingRegistry.java --- a/variants/src/main/java/org/implab/gradle/variants/artifacts/internal/OutgoingRegistry.java +++ b/variants/src/main/java/org/implab/gradle/variants/artifacts/internal/OutgoingRegistry.java @@ -14,11 +14,11 @@ import org.gradle.api.artifacts.Configur import org.gradle.api.artifacts.ConfigurationContainer; import org.gradle.api.model.ObjectFactory; import org.gradle.api.provider.Property; -import org.implab.gradle.internal.IdentityContainerFactory; import org.implab.gradle.common.core.lang.ReplayableQueue; import org.implab.gradle.variants.artifacts.OutgoingVariant; import org.implab.gradle.variants.artifacts.Slot; import org.implab.gradle.variants.core.Variant; +import org.implab.gradle.variants.internal.IdentityContainerFactory; /** * Registry of variant-level outgoing models. diff --git a/variants/src/main/java/org/implab/gradle/variants/internal/IdentityContainerFactory.java b/variants/src/main/java/org/implab/gradle/variants/internal/IdentityContainerFactory.java new file mode 100644 --- /dev/null +++ b/variants/src/main/java/org/implab/gradle/variants/internal/IdentityContainerFactory.java @@ -0,0 +1,14 @@ +package org.implab.gradle.variants.internal; + +import org.gradle.api.Named; +import org.gradle.api.NamedDomainObjectContainer; +import org.gradle.api.model.ObjectFactory; + +public final class IdentityContainerFactory { + private IdentityContainerFactory() { + } + + public static NamedDomainObjectContainer create(ObjectFactory objectFactory, Class type) { + return objectFactory.domainObjectContainer(type, name -> objectFactory.named(type, name)); + } +} diff --git a/variants/src/main/java/org/implab/gradle/variants/internal/package-info.java b/variants/src/main/java/org/implab/gradle/variants/internal/package-info.java new file mode 100644 --- /dev/null +++ b/variants/src/main/java/org/implab/gradle/variants/internal/package-info.java @@ -0,0 +1,7 @@ +/** + * Internal implementation utilities of the variants module. + * + *

    Types in this package are not part of the public API. They may change, + * move, or be removed without compatibility guarantees. + */ +package org.implab.gradle.variants.internal; diff --git a/variants/src/main/java/org/implab/gradle/variants/sources/VariantSourcesExtension.java b/variants/src/main/java/org/implab/gradle/variants/sources/VariantSourcesExtension.java --- a/variants/src/main/java/org/implab/gradle/variants/sources/VariantSourcesExtension.java +++ b/variants/src/main/java/org/implab/gradle/variants/sources/VariantSourcesExtension.java @@ -17,9 +17,9 @@ public interface VariantSourcesExtension *

  • it must be selected before the first selector rule is registered via * {@link #variant(String, Action)}, {@link #layer(String, Action)} or * {@link #unit(String, String, Action)};
  • - *
  • it must be selected before the finalized context becomes observable via - * {@link #whenFinalized(Action)};
  • - *
  • once selected or once the finalized context is being created, it cannot + *
  • it must be selected before the source context becomes observable via + * {@link #whenAvailable(Action)};
  • + *
  • once selected or once source context creation begins, it cannot * be changed later;
  • *
  • the policy controls both diagnostics and late-application semantics.
  • *
@@ -34,14 +34,14 @@ public interface VariantSourcesExtension } /** - * Selects how compile-unit name collisions are handled when the finalized - * source context is created. + * Selects how compile-unit name collisions are handled when the source + * context is created from the finalized variant model. * *

This policy is single-valued: *

    *
  • it must be selected before the finalized * {@link VariantSourcesContext} becomes observable through - * {@link #whenFinalized(Action)};
  • + * {@link #whenAvailable(Action)}; *
  • once the context is being created, the policy is fixed and cannot be * changed later;
  • *
  • the policy governs validation of compile-unit names produced by the @@ -97,7 +97,7 @@ public interface VariantSourcesExtension } /** - * Invoked when finalized variants-derived source context becomes available. + * Invoked when the variants-derived source context becomes available. * * Replayable: *
      @@ -109,10 +109,10 @@ public interface VariantSourcesExtension * policy has already been fixed and symbolic source-set names for finalized * compile units are determined. */ - void whenFinalized(Action action); + void whenAvailable(Action action); - default void whenFinalized(Closure closure) { - whenFinalized(Closures.action(closure)); + default void whenAvailable(Closure closure) { + whenAvailable(Closures.action(closure)); } diff --git a/variants/src/main/java/org/implab/gradle/variants/sources/internal/package-info.java b/variants/src/main/java/org/implab/gradle/variants/sources/internal/package-info.java new file mode 100644 --- /dev/null +++ b/variants/src/main/java/org/implab/gradle/variants/sources/internal/package-info.java @@ -0,0 +1,9 @@ +/** + * Internal implementation of the variant sources plugin. + * + *

      Types in this package are not part of the public API. They may change, + * move, or be removed without compatibility guarantees. Build logic should use + * the public contracts from {@link org.implab.gradle.variants.sources} + * instead. + */ +package org.implab.gradle.variants.sources.internal; diff --git a/variants/src/test/java/org/implab/gradle/variants/VariantSourcesPluginFunctionalTest.java b/variants/src/test/java/org/implab/gradle/variants/VariantSourcesPluginFunctionalTest.java --- a/variants/src/test/java/org/implab/gradle/variants/VariantSourcesPluginFunctionalTest.java +++ b/variants/src/test/java/org/implab/gradle/variants/VariantSourcesPluginFunctionalTest.java @@ -26,7 +26,7 @@ class VariantSourcesPluginFunctionalTest def lines = [] - variantSources.whenFinalized { ctx -> + variantSources.whenAvailable { ctx -> lines << "units=" + ctx.compileUnits.units .collect { "${it.variant().name}:${it.layer().name}" } .sort() @@ -50,7 +50,7 @@ class VariantSourcesPluginFunctionalTest } afterEvaluate { - variantSources.whenFinalized { ctx -> + variantSources.whenAvailable { ctx -> lines << "late:variants=" + ctx.variants.variants.collect { it.name }.sort().join(',') } } @@ -107,7 +107,7 @@ class VariantSourcesPluginFunctionalTest } afterEvaluate { - variantSources.whenFinalized { ctx -> + variantSources.whenAvailable { ctx -> def browser = ctx.variants.variants.find { it.name == 'browser' } def node = ctx.variants.variants.find { it.name == 'node' } def mainLayer = ctx.variants.layers.find { it.name == 'main' } @@ -146,7 +146,7 @@ class VariantSourcesPluginFunctionalTest } afterEvaluate { - variantSources.whenFinalized { ctx -> + variantSources.whenAvailable { ctx -> def browser = ctx.variants.variants.find { it.name == 'browser' } def mainLayer = ctx.variants.layers.find { it.name == 'main' } def unit = ctx.compileUnits.requireUnit(browser, mainLayer) @@ -182,7 +182,7 @@ class VariantSourcesPluginFunctionalTest } afterEvaluate { - variantSources.whenFinalized { ctx -> + variantSources.whenAvailable { ctx -> def browser = ctx.variants.variants.find { it.name == 'browser' } def mainLayer = ctx.variants.layers.find { it.name == 'main' } def unit = ctx.compileUnits.requireUnit(browser, mainLayer) @@ -221,7 +221,7 @@ class VariantSourcesPluginFunctionalTest } afterEvaluate { - variantSources.whenFinalized { ctx -> + variantSources.whenAvailable { ctx -> def browser = ctx.variants.variants.find { it.name == 'browser' } def mainLayer = ctx.variants.layers.find { it.name == 'main' } def unit = ctx.compileUnits.requireUnit(browser, mainLayer) @@ -315,7 +315,7 @@ class VariantSourcesPluginFunctionalTest } afterEvaluate { - variantSources.whenFinalized { ctx -> + variantSources.whenAvailable { ctx -> def foo = ctx.variants.variants.find { it.name == 'foo' } def fooVariant = ctx.variants.variants.find { it.name == 'fooVariant' } def variantBar = ctx.variants.layers.find { it.name == 'variantBar' } @@ -419,7 +419,7 @@ class VariantSourcesPluginFunctionalTest role('production') { layers('main') } } - variantSources.whenFinalized { + variantSources.whenAvailable { variantSources.namingPolicy { resolveNameCollision() } @@ -442,7 +442,7 @@ class VariantSourcesPluginFunctionalTest role('production') { layers('main') } } - variantSources.whenFinalized { + variantSources.whenAvailable { variantSources.lateConfigurationPolicy { allowLateConfiguration() }