From 213fe277b678bb9467c6f470e7cffb1b6a68e233 Mon Sep 17 00:00:00 2001 From: Justin Van Dort Date: Mon, 19 Dec 2022 16:26:57 -0500 Subject: [PATCH] Fix #23096 on release --- subprojects/base-services/build.gradle.kts | 1 + .../java/org/gradle/util/internal/GUtil.java | 2 + .../MinimalExternalModuleDependency.java | 6 + .../DependencyFactoryInternal.java | 1 + .../ArtifactDeclarationIntegrationTest.groovy | 48 +++++++ .../artifacts/DefaultDependencyFactory.java | 5 +- .../DefaultExternalModuleDependency.java | 2 +- .../DefaultMinimalDependency.java | 8 +- .../DefaultMinimalDependencyVariant.java | 117 +++++++++++++----- .../DefaultMutableMinimalDependency.java | 8 +- ...nimalExternalModuleDependencyInternal.java | 23 ++++ .../DefaultDependencyHandler.java | 4 +- .../notations/DependencyNotationParser.java | 63 ++++++---- 13 files changed, 230 insertions(+), 58 deletions(-) create mode 100644 subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/dependencies/MinimalExternalModuleDependencyInternal.java diff --git a/subprojects/base-services/build.gradle.kts b/subprojects/base-services/build.gradle.kts index e8c828e796ea..4c408aabc608 100644 --- a/subprojects/base-services/build.gradle.kts +++ b/subprojects/base-services/build.gradle.kts @@ -24,6 +24,7 @@ tasks.named("jmhCompileGeneratedClasses") { moduleIdentity.createBuildReceipt() dependencies { + api(libs.jetbrainsAnnotations) api(project(":base-annotations")) api(project(":worker-services")) api(project(":hashing")) diff --git a/subprojects/base-services/src/main/java/org/gradle/util/internal/GUtil.java b/subprojects/base-services/src/main/java/org/gradle/util/internal/GUtil.java index 8dce73409c96..849edb6c7911 100644 --- a/subprojects/base-services/src/main/java/org/gradle/util/internal/GUtil.java +++ b/subprojects/base-services/src/main/java/org/gradle/util/internal/GUtil.java @@ -24,6 +24,7 @@ import org.gradle.internal.InternalTransformer; import org.gradle.internal.IoActions; import org.gradle.internal.UncheckedException; +import org.jetbrains.annotations.Contract; import javax.annotation.Nullable; import java.io.File; @@ -157,6 +158,7 @@ public static boolean isTrue(@Nullable Object object) { * would trigger early configuration. */ @Nullable + @Contract("!null, _ -> param1; null, !null -> param2; null, null -> null") public static T elvis(@Nullable T object, @Nullable T defaultValue) { return isTrue(object) ? object : defaultValue; } diff --git a/subprojects/core-api/src/main/java/org/gradle/api/artifacts/MinimalExternalModuleDependency.java b/subprojects/core-api/src/main/java/org/gradle/api/artifacts/MinimalExternalModuleDependency.java index f3566ef2fd6a..cf00aa8861ba 100644 --- a/subprojects/core-api/src/main/java/org/gradle/api/artifacts/MinimalExternalModuleDependency.java +++ b/subprojects/core-api/src/main/java/org/gradle/api/artifacts/MinimalExternalModuleDependency.java @@ -26,4 +26,10 @@ public interface MinimalExternalModuleDependency extends ExternalModuleDependency { ModuleIdentifier getModule(); VersionConstraint getVersionConstraint(); + + /** + * {@inheritDoc} + */ + @Override + MinimalExternalModuleDependency copy(); } diff --git a/subprojects/core/src/main/java/org/gradle/api/internal/artifacts/dsl/dependencies/DependencyFactoryInternal.java b/subprojects/core/src/main/java/org/gradle/api/internal/artifacts/dsl/dependencies/DependencyFactoryInternal.java index c4d942a7f418..6d8869455ae4 100644 --- a/subprojects/core/src/main/java/org/gradle/api/internal/artifacts/dsl/dependencies/DependencyFactoryInternal.java +++ b/subprojects/core/src/main/java/org/gradle/api/internal/artifacts/dsl/dependencies/DependencyFactoryInternal.java @@ -47,4 +47,5 @@ enum ClassPathNotation { DependencyConstraint createDependencyConstraint(Object dependencyNotation); ClientModule createModule(Object dependencyNotation, Closure configureClosure); ProjectDependency createProjectDependencyFromMap(ProjectFinder projectFinder, Map map); + void injectServices(Dependency dependency); } diff --git a/subprojects/dependency-management/src/integTest/groovy/org/gradle/integtests/resolve/api/ArtifactDeclarationIntegrationTest.groovy b/subprojects/dependency-management/src/integTest/groovy/org/gradle/integtests/resolve/api/ArtifactDeclarationIntegrationTest.groovy index 0672c1c9fb20..f44da37249f5 100644 --- a/subprojects/dependency-management/src/integTest/groovy/org/gradle/integtests/resolve/api/ArtifactDeclarationIntegrationTest.groovy +++ b/subprojects/dependency-management/src/integTest/groovy/org/gradle/integtests/resolve/api/ArtifactDeclarationIntegrationTest.groovy @@ -500,4 +500,52 @@ classes.attributes.keySet().collect { it.name } == ['usage', 'format'] } } } + + def 'artifacts are copied when declaring dependency on existing version catalog dependency with artifact'() { + given: + buildFile << """ + configurations { + implementation + destination1 + destination2 + } + + dependencies { + implementation(libs.test) { + artifact { + classifier = "alternative" + } + } + } + + task copyAndPrintDependencies { + doLast { + configurations.implementation.dependencies.each { + project.dependencies.add("destination1", it) + configurations.destination2.dependencies.add(it) + } + configurations.implementation.dependencies.each { + println("implementation " + it + " " + it.artifacts*.classifier) + } + configurations.destination1.dependencies.each { + println("destination1 " + it + " " + it.artifacts*.classifier) + } + configurations.destination2.dependencies.each { + println("destination2 " + it + " " + it.artifacts*.classifier) + } + } + } + """ + file("gradle/libs.versions.toml") << """[libraries] +test = { module = 'org:test', version = '1.0' } +""" + + when: + succeeds "copyAndPrintDependencies" + + then: + outputContains("""implementation org:test:1.0 [alternative] +destination1 org:test:1.0 [alternative] +destination2 org:test:1.0 [alternative]""") + } } diff --git a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/DefaultDependencyFactory.java b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/DefaultDependencyFactory.java index 6c3809748998..db54bd6b47cb 100644 --- a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/DefaultDependencyFactory.java +++ b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/DefaultDependencyFactory.java @@ -79,14 +79,15 @@ public Dependency createDependency(Object dependencyNotation) { Dependency dependency; if (dependencyNotation instanceof Dependency && !(dependencyNotation instanceof MinimalExternalModuleDependency)) { dependency = (Dependency) dependencyNotation; + injectServices(dependency); } else { dependency = dependencyNotationParser.getNotationParser().parseNotation(dependencyNotation); } - injectServices(dependency); return dependency; } - private void injectServices(Dependency dependency) { + @Override + public void injectServices(Dependency dependency) { if (dependency instanceof AbstractModuleDependency) { AbstractModuleDependency moduleDependency = (AbstractModuleDependency) dependency; moduleDependency.setAttributesFactory(attributesFactory); diff --git a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/dependencies/DefaultExternalModuleDependency.java b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/dependencies/DefaultExternalModuleDependency.java index 568858d08f1a..72ff9177baff 100644 --- a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/dependencies/DefaultExternalModuleDependency.java +++ b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/dependencies/DefaultExternalModuleDependency.java @@ -36,7 +36,7 @@ public DefaultExternalModuleDependency(ModuleIdentifier id, MutableVersionConstr } @Override - public DefaultExternalModuleDependency copy() { + public ExternalModuleDependency copy() { DefaultExternalModuleDependency copiedModuleDependency = new DefaultExternalModuleDependency(getGroup(), getName(), getVersion(), getTargetConfiguration()); copyTo(copiedModuleDependency); return copiedModuleDependency; diff --git a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/dependencies/DefaultMinimalDependency.java b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/dependencies/DefaultMinimalDependency.java index 1222bfdedf38..15f1563cd19d 100644 --- a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/dependencies/DefaultMinimalDependency.java +++ b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/dependencies/DefaultMinimalDependency.java @@ -15,13 +15,12 @@ */ package org.gradle.api.internal.artifacts.dependencies; -import org.gradle.api.artifacts.MinimalExternalModuleDependency; import org.gradle.api.artifacts.ModuleIdentifier; import org.gradle.api.artifacts.MutableVersionConstraint; import java.io.Serializable; -public class DefaultMinimalDependency extends DefaultExternalModuleDependency implements MinimalExternalModuleDependency, Serializable { +public class DefaultMinimalDependency extends DefaultExternalModuleDependency implements MinimalExternalModuleDependencyInternal, Serializable { public DefaultMinimalDependency(ModuleIdentifier module, MutableVersionConstraint versionConstraint) { super(module, versionConstraint); } @@ -41,6 +40,11 @@ protected void validateMutation(Object currentValue, Object newValue) { validateMutation(); } + @Override + public void copyTo(AbstractExternalModuleDependency target) { + super.copyTo(target); + } + // Intentionally changes to the mutable version. @Override public DefaultMutableMinimalDependency copy() { diff --git a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/dependencies/DefaultMinimalDependencyVariant.java b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/dependencies/DefaultMinimalDependencyVariant.java index 77c00d044182..2d248d26f5b6 100644 --- a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/dependencies/DefaultMinimalDependencyVariant.java +++ b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/dependencies/DefaultMinimalDependencyVariant.java @@ -18,38 +18,96 @@ import org.gradle.api.Action; import org.gradle.api.artifacts.MinimalExternalModuleDependency; import org.gradle.api.artifacts.ModuleDependencyCapabilitiesHandler; +import org.gradle.api.artifacts.ModuleIdentifier; +import org.gradle.api.artifacts.MutableVersionConstraint; import org.gradle.api.attributes.AttributeContainer; +import org.gradle.api.internal.artifacts.dsl.dependencies.ModuleFactoryHelper; import org.gradle.internal.Actions; +import org.gradle.util.internal.GUtil; import javax.annotation.Nullable; -public class DefaultMinimalDependencyVariant extends DefaultExternalModuleDependency implements MinimalExternalModuleDependency, DependencyVariant { - private final MinimalExternalModuleDependency delegate; - private final Action attributesMutator; - private final Action capabilitiesMutator; - private final String classifier; - private final String artifactType; - - public DefaultMinimalDependencyVariant(MinimalExternalModuleDependency delegate, - @Nullable Action attributesMutator, - @Nullable Action capabilitiesMutator, - @Nullable String classifier, - @Nullable String artifactType) { - super(delegate.getModule(), new DefaultMutableVersionConstraint(delegate.getVersionConstraint())); - this.delegate = delegate; - boolean delegateIsVariant = delegate instanceof DefaultMinimalDependencyVariant; - this.attributesMutator = delegateIsVariant ? Actions.composite(((DefaultMinimalDependencyVariant) delegate).attributesMutator, attributesMutator == null ? Actions.doNothing() : attributesMutator) : attributesMutator; - this.capabilitiesMutator = delegateIsVariant ? Actions.composite(((DefaultMinimalDependencyVariant) delegate).capabilitiesMutator, capabilitiesMutator == null ? Actions.doNothing() : capabilitiesMutator) : capabilitiesMutator; - if (classifier == null && delegateIsVariant) { - classifier = ((DefaultMinimalDependencyVariant) delegate).getClassifier(); - } - if (artifactType == null && delegateIsVariant) { - artifactType = ((DefaultMinimalDependencyVariant) delegate).getArtifactType(); +public class DefaultMinimalDependencyVariant extends DefaultExternalModuleDependency implements MinimalExternalModuleDependencyInternal, DependencyVariant { + private Action attributesMutator; + private Action capabilitiesMutator; + private String classifier; + private String artifactType; + + public static DefaultMinimalDependencyVariant create( + MinimalExternalModuleDependency delegate, + @Nullable Action attributesMutator, + @Nullable Action capabilitiesMutator, + @Nullable String classifier, + @Nullable String artifactType + ) { + attributesMutator = GUtil.elvis(attributesMutator, Actions.doNothing()); + capabilitiesMutator = GUtil.elvis(capabilitiesMutator, Actions.doNothing()); + + if (delegate instanceof DefaultMinimalDependencyVariant) { + DefaultMinimalDependencyVariant defaultDelegate = (DefaultMinimalDependencyVariant) delegate; + return new DefaultMinimalDependencyVariant( + delegate.getModule(), + new DefaultMutableVersionConstraint(delegate.getVersionConstraint()), + Actions.composite(defaultDelegate.attributesMutator, attributesMutator), + Actions.composite(defaultDelegate.capabilitiesMutator, capabilitiesMutator), + classifier == null ? defaultDelegate.getClassifier() : classifier, + artifactType == null ? defaultDelegate.getArtifactType() : artifactType + ); + } else { + return new DefaultMinimalDependencyVariant( + delegate.getModule(), + new DefaultMutableVersionConstraint(delegate.getVersionConstraint()), + attributesMutator, + capabilitiesMutator, + classifier, + artifactType + ); } + } + + private DefaultMinimalDependencyVariant( + ModuleIdentifier id, + MutableVersionConstraint versionConstraint, + Action attributesMutator, + Action capabilitiesMutator, + @Nullable String classifier, + @Nullable String artifactType + ) { + super(id, versionConstraint); + this.attributesMutator = attributesMutator; + this.capabilitiesMutator = capabilitiesMutator; this.classifier = classifier; this.artifactType = artifactType; } + @Override + public void copyTo(AbstractExternalModuleDependency target) { + super.copyTo(target); + if (target instanceof DefaultMinimalDependencyVariant) { + DefaultMinimalDependencyVariant depVariant = (DefaultMinimalDependencyVariant) target; + depVariant.attributesMutator = attributesMutator; + depVariant.capabilitiesMutator = capabilitiesMutator; + depVariant.classifier = classifier; + depVariant.artifactType = artifactType; + } else { + target.attributes(attributesMutator); + target.capabilities(capabilitiesMutator); + if (classifier != null || artifactType != null) { + ModuleFactoryHelper.addExplicitArtifactsIfDefined(target, artifactType, classifier); + } + } + } + + @Override + public MinimalExternalModuleDependency copy() { + DefaultMinimalDependencyVariant dependency = new DefaultMinimalDependencyVariant( + getModule(), new DefaultMutableVersionConstraint(getVersionConstraint()), + attributesMutator, capabilitiesMutator, classifier, artifactType + ); + copyTo(dependency); + return dependency; + } + @Override public void because(String reason) { validateMutation(); @@ -67,16 +125,12 @@ protected void validateMutation(Object currentValue, Object newValue) { @Override public void mutateAttributes(AttributeContainer attributes) { - if (attributesMutator!= null) { - attributesMutator.execute(attributes); - } + attributesMutator.execute(attributes); } @Override public void mutateCapabilities(ModuleDependencyCapabilitiesHandler capabilitiesHandler) { - if (capabilitiesMutator != null) { - capabilitiesMutator.execute(capabilitiesHandler); - } + capabilitiesMutator.execute(capabilitiesHandler); } @Nullable @@ -93,6 +147,11 @@ public String getArtifactType() { @Override public String toString() { - return delegate.toString(); + return "DefaultMinimalDependencyVariant{" + + ", attributesMutator=" + attributesMutator + + ", capabilitiesMutator=" + capabilitiesMutator + + ", classifier='" + classifier + '\'' + + ", artifactType='" + artifactType + '\'' + + "} " + super.toString(); } } diff --git a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/dependencies/DefaultMutableMinimalDependency.java b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/dependencies/DefaultMutableMinimalDependency.java index c51481ede0a4..6ce58307d727 100644 --- a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/dependencies/DefaultMutableMinimalDependency.java +++ b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/dependencies/DefaultMutableMinimalDependency.java @@ -15,13 +15,12 @@ */ package org.gradle.api.internal.artifacts.dependencies; -import org.gradle.api.artifacts.MinimalExternalModuleDependency; import org.gradle.api.artifacts.ModuleIdentifier; import org.gradle.api.artifacts.MutableVersionConstraint; import java.io.Serializable; -public class DefaultMutableMinimalDependency extends DefaultExternalModuleDependency implements MinimalExternalModuleDependency, Serializable { +public class DefaultMutableMinimalDependency extends DefaultExternalModuleDependency implements MinimalExternalModuleDependencyInternal, Serializable { public DefaultMutableMinimalDependency(ModuleIdentifier module, MutableVersionConstraint versionConstraint) { super(module, versionConstraint); } @@ -33,6 +32,11 @@ public DefaultMutableMinimalDependency copy() { return dependency; } + @Override + public void copyTo(AbstractExternalModuleDependency target) { + super.copyTo(target); + } + public String toString() { String versionConstraintAsString = getVersionConstraint().toString(); return versionConstraintAsString.isEmpty() diff --git a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/dependencies/MinimalExternalModuleDependencyInternal.java b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/dependencies/MinimalExternalModuleDependencyInternal.java new file mode 100644 index 000000000000..0c2f103470f6 --- /dev/null +++ b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/dependencies/MinimalExternalModuleDependencyInternal.java @@ -0,0 +1,23 @@ +/* + * Copyright 2022 the original author or authors. + * + * 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 org.gradle.api.internal.artifacts.dependencies; + +import org.gradle.api.artifacts.MinimalExternalModuleDependency; + +public interface MinimalExternalModuleDependencyInternal extends MinimalExternalModuleDependency { + void copyTo(AbstractExternalModuleDependency target); +} diff --git a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/dsl/dependencies/DefaultDependencyHandler.java b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/dsl/dependencies/DefaultDependencyHandler.java index b62f927dab04..19bf60279b90 100644 --- a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/dsl/dependencies/DefaultDependencyHandler.java +++ b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/dsl/dependencies/DefaultDependencyHandler.java @@ -400,7 +400,9 @@ public Provider variantOf(Provider { DefaultExternalModuleDependencyVariantSpec spec = objects.newInstance(DefaultExternalModuleDependencyVariantSpec.class, objects, dep); variantSpec.execute(spec); - return new DefaultMinimalDependencyVariant(dep, spec.attributesAction, spec.capabilitiesMutator, spec.classifier, spec.artifactType); + DefaultMinimalDependencyVariant newDep = DefaultMinimalDependencyVariant.create(dep, spec.attributesAction, spec.capabilitiesMutator, spec.classifier, spec.artifactType); + dependencyFactory.injectServices(newDep); + return newDep; }); } diff --git a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/notations/DependencyNotationParser.java b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/notations/DependencyNotationParser.java index e7e7bde38980..919e112081bc 100644 --- a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/notations/DependencyNotationParser.java +++ b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/notations/DependencyNotationParser.java @@ -27,11 +27,11 @@ import org.gradle.api.file.FileCollection; import org.gradle.api.internal.ClassPathRegistry; import org.gradle.api.internal.artifacts.DefaultProjectDependencyFactory; +import org.gradle.api.internal.artifacts.dependencies.AbstractModuleDependency; import org.gradle.api.internal.artifacts.dependencies.DefaultExternalModuleDependency; import org.gradle.api.internal.artifacts.dependencies.DefaultMutableMinimalDependency; -import org.gradle.api.internal.artifacts.dependencies.DependencyVariant; +import org.gradle.api.internal.artifacts.dependencies.MinimalExternalModuleDependencyInternal; import org.gradle.api.internal.artifacts.dsl.dependencies.DependencyFactoryInternal; -import org.gradle.api.internal.artifacts.dsl.dependencies.ModuleFactoryHelper; import org.gradle.api.internal.attributes.ImmutableAttributesFactory; import org.gradle.api.internal.file.FileCollectionFactory; import org.gradle.api.internal.runtimeshaded.RuntimeShadedJarFactory; @@ -61,7 +61,7 @@ public static DependencyNotationParser create(Instantiator instantiator, NotationConverter stringNotationConverter = new DependencyStringNotationConverter<>(instantiator, DefaultExternalModuleDependency.class, stringInterner); NotationConverter minimalExternalDependencyNotationConverter = - new MinimalExternalDependencyNotationConverter(instantiator, attributesFactory, capabilityNotationParser); + new MinimalExternalDependencyNotationConverter(instantiator); MapNotationConverter mapNotationConverter = new DependencyMapNotationConverter<>(instantiator, DefaultExternalModuleDependency.class); NotationConverter filesNotationConverter = @@ -80,8 +80,9 @@ public static DependencyNotationParser create(Instantiator instantiator, .fromType(DependencyFactoryInternal.ClassPathNotation.class, dependencyClassPathNotationConverter) .invalidNotationMessage("Comprehensive documentation on dependency notations is available in DSL reference for DependencyHandler type.") .toComposite(); - return new DependencyNotationParser( - notationParser, + return + new DependencyNotationParser( + new ServiceInjectingNotationParser(notationParser, attributesFactory, capabilityNotationParser), new NotationConverterToNotationParserAdapter<>(stringNotationConverter), new NotationConverterToNotationParserAdapter<>(minimalExternalDependencyNotationConverter), new NotationConverterToNotationParserAdapter<>(mapNotationConverter), @@ -138,37 +139,57 @@ public NotationParser getNotationParser() { private static class MinimalExternalDependencyNotationConverter implements NotationConverter { private final Instantiator instantiator; + + public MinimalExternalDependencyNotationConverter(Instantiator instantiator) { + this.instantiator = instantiator; + } + + @Override + public void convert(MinimalExternalModuleDependency notation, NotationConvertResult result) throws TypeConversionException { + DefaultMutableMinimalDependency moduleDependency = instantiator.newInstance(DefaultMutableMinimalDependency.class, notation.getModule(), notation.getVersionConstraint()); + MinimalExternalModuleDependencyInternal internal = (MinimalExternalModuleDependencyInternal) notation; + internal.copyTo(moduleDependency); + result.converted(moduleDependency); + } + + @Override + public void describe(DiagnosticsVisitor visitor) { + } + } + + private static class ServiceInjectingNotationParser implements NotationParser { + + private final NotationParser delegate; private final ImmutableAttributesFactory attributesFactory; private final NotationParser capabilityNotationParser; - public MinimalExternalDependencyNotationConverter(Instantiator instantiator, ImmutableAttributesFactory attributesFactory, NotationParser capabilityNotationParser) { - this.instantiator = instantiator; + public ServiceInjectingNotationParser( + NotationParser delegate, + ImmutableAttributesFactory attributesFactory, + NotationParser capabilityNotationParser + ) { + this.delegate = delegate; this.attributesFactory = attributesFactory; this.capabilityNotationParser = capabilityNotationParser; } @Override - public void convert(MinimalExternalModuleDependency notation, NotationConvertResult result) throws TypeConversionException { - DefaultMutableMinimalDependency moduleDependency = instantiator.newInstance(DefaultMutableMinimalDependency.class, notation.getModule(), notation.getVersionConstraint()); - if (notation instanceof DependencyVariant) { + public Dependency parseNotation(Object notation) throws TypeConversionException { + Dependency parsed = delegate.parseNotation(notation); + + if (parsed instanceof AbstractModuleDependency) { + AbstractModuleDependency moduleDependency = (AbstractModuleDependency) parsed; moduleDependency.setAttributesFactory(attributesFactory); moduleDependency.setCapabilityNotationParser(capabilityNotationParser); - DependencyVariant dependencyVariant = (DependencyVariant) notation; - moduleDependency.attributes(dependencyVariant::mutateAttributes); - moduleDependency.capabilities(dependencyVariant::mutateCapabilities); - String classifier = dependencyVariant.getClassifier(); - String artifactType = dependencyVariant.getArtifactType(); - if (classifier != null || artifactType != null) { - ModuleFactoryHelper.addExplicitArtifactsIfDefined(moduleDependency, artifactType, classifier); - } } - result.converted(moduleDependency); + + return parsed; } @Override public void describe(DiagnosticsVisitor visitor) { + delegate.describe(visitor); } - - } + }