diff --git a/codegen/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/Symbol.java b/codegen/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/Symbol.java index 78946cb1237..aeb2de15891 100644 --- a/codegen/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/Symbol.java +++ b/codegen/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/Symbol.java @@ -382,7 +382,23 @@ public Builder addDependency(SymbolDependency dependency) { * @return Returns the builder. */ public Builder addDependency(String packageName, String version) { - return addDependency(SymbolDependency.builder().packageName(packageName).version(version).build()); + return addDependency(null, packageName, version); + } + + /** + * Add a symbol dependency. + * + * @param dependencyType Type of dependency. + * @param packageName Name of the package to depend on. + * @param version Version to depend on. + * @return Returns the builder. + */ + public Builder addDependency(String dependencyType, String packageName, String version) { + return addDependency(SymbolDependency.builder() + .dependencyType(dependencyType) + .packageName(packageName) + .version(version) + .build()); } } } diff --git a/codegen/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/SymbolDependency.java b/codegen/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/SymbolDependency.java index d62bb00206b..345a075db23 100644 --- a/codegen/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/SymbolDependency.java +++ b/codegen/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/SymbolDependency.java @@ -59,7 +59,8 @@ * of the suggested package, and {@code version} to the description of the * suggestion. */ -public final class SymbolDependency extends TypedPropertiesBag implements ToSmithyBuilder { +public final class SymbolDependency extends TypedPropertiesBag + implements ToSmithyBuilder, Comparable { private final String dependencyType; private final String packageName; @@ -67,7 +68,7 @@ public final class SymbolDependency extends TypedPropertiesBag implements ToSmit private SymbolDependency(Builder builder) { super(builder.properties); - this.dependencyType = SmithyBuilder.requiredState("dependencyType", builder.dependencyType); + this.dependencyType = builder.dependencyType == null ? "" : builder.dependencyType; this.packageName = SmithyBuilder.requiredState("packageName", builder.packageName); this.version = SmithyBuilder.requiredState("version", builder.version); } @@ -145,6 +146,27 @@ public int hashCode() { return Objects.hash(dependencyType, packageName, version); } + /** + * Dependencies can be sorted based on the natural sort order of + * the dependencyType, packageName, and finally the version. + * + * {@inheritDoc} + */ + @Override + public int compareTo(SymbolDependency other) { + int typeResult = dependencyType.compareTo(other.dependencyType); + if (typeResult != 0) { + return typeResult; + } + + int packageResult = packageName.compareTo(other.packageName); + if (packageResult != 0) { + return packageResult; + } + + return version.compareTo(other.version); + } + /** * Builds a SymbolDependency. */ diff --git a/codegen/smithy-codegen-core/src/test/java/software/amazon/smithy/codegen/core/SymbolDependencyTest.java b/codegen/smithy-codegen-core/src/test/java/software/amazon/smithy/codegen/core/SymbolDependencyTest.java index eac1042f786..889b1514f90 100644 --- a/codegen/smithy-codegen-core/src/test/java/software/amazon/smithy/codegen/core/SymbolDependencyTest.java +++ b/codegen/smithy-codegen-core/src/test/java/software/amazon/smithy/codegen/core/SymbolDependencyTest.java @@ -1,8 +1,12 @@ package software.amazon.smithy.codegen.core; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.equalTo; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; import org.junit.jupiter.api.Test; public class SymbolDependencyTest { @@ -40,4 +44,18 @@ public void hasProperties() { assertThat(dependency.expectProperty("foo", String.class), equalTo("baz!")); } + + @Test + public void canBeSorted() { + SymbolDependency a = SymbolDependency.builder().dependencyType("a").packageName("a").version("1").build(); + SymbolDependency a2 = SymbolDependency.builder().dependencyType("a").packageName("a2").version("1").build(); + SymbolDependency a3 = SymbolDependency.builder().dependencyType("a2").packageName("a").version("1").build(); + SymbolDependency b = SymbolDependency.builder().dependencyType("b").packageName("b").version("1").build(); + SymbolDependency b2 = SymbolDependency.builder().dependencyType("b").packageName("b").version("2").build(); + SymbolDependency c = SymbolDependency.builder().dependencyType("b").packageName("c").version("1").build(); + List dependencies = Arrays.asList(c, b2, b, a3, a2, a); + Collections.sort(dependencies); + + assertThat(dependencies, contains(a, a2, a3, b, b2, c)); + } }