From 8c610108225eb8319e1cba3c84afcc30cacd3f20 Mon Sep 17 00:00:00 2001 From: Michael Dowling Date: Sun, 10 Nov 2019 12:31:30 -0800 Subject: [PATCH] Add abstractions over Symbols A SymbolContainer is an abstraction over Symbols that allows for more easily creating and aggregating Symbols together. A SymbolDependencyContainer is a similar abstraction for SymbolDependency objects. --- .../amazon/smithy/codegen/core/Symbol.java | 35 +++++++++++------- .../smithy/codegen/core/SymbolContainer.java | 30 ++++++++++++++++ .../smithy/codegen/core/SymbolDependency.java | 9 ++++- .../core/SymbolDependencyContainer.java | 36 +++++++++++++++++++ .../smithy/codegen/core/SymbolReference.java | 15 +++++++- 5 files changed, 110 insertions(+), 15 deletions(-) create mode 100644 codegen/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/SymbolContainer.java create mode 100644 codegen/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/SymbolDependencyContainer.java 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 aeb2de15891..0fa08f2159a 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 @@ -16,6 +16,7 @@ package software.amazon.smithy.codegen.core; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Objects; import software.amazon.smithy.utils.ListUtils; @@ -58,7 +59,8 @@ * } * */ -public final class Symbol extends TypedPropertiesBag implements ToSmithyBuilder { +public final class Symbol extends TypedPropertiesBag + implements SymbolContainer, SymbolDependencyContainer, ToSmithyBuilder { private final String namespace; private final String namespaceDelimiter; private final String name; @@ -187,20 +189,16 @@ public List getReferences() { return references; } - /** - * Gets the list of dependencies that this symbol introduces. - * - *

A dependency is a dependency on another package that the symbol - * requires. It is quite different from a reference since a reference - * only refers to a symbol; a reference provides no context as to whether - * or not a dependency is required or the dependency's coordinates. - * - * @return Returns the Symbol's dependencies. - */ + @Override public List getDependencies() { return dependencies; } + @Override + public List getSymbols() { + return Collections.singletonList(this); + } + @Override public Builder toBuilder() { Builder builder = new Builder(); @@ -363,14 +361,25 @@ public Builder dependencies(List dependencies) { return this; } + /** + * Replaces the symbol dependencies of the symbol. + * + * @param container Dependencies to set. + * @return Returns the builder. + */ + public Builder dependencies(SymbolDependencyContainer container) { + this.dependencies.clear(); + return addDependency(container); + } + /** * Add a symbol dependency. * * @param dependency Symbol dependency to add. * @return Returns the builder. */ - public Builder addDependency(SymbolDependency dependency) { - dependencies.add(dependency); + public Builder addDependency(SymbolDependencyContainer dependency) { + dependencies.addAll(dependency.getDependencies()); return this; } diff --git a/codegen/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/SymbolContainer.java b/codegen/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/SymbolContainer.java new file mode 100644 index 00000000000..1330711f37f --- /dev/null +++ b/codegen/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/SymbolContainer.java @@ -0,0 +1,30 @@ +/* + * Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file 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 software.amazon.smithy.codegen.core; + +import java.util.List; + +/** + * A holder for {@link Symbol} objects. + */ +public interface SymbolContainer { + /** + * Returns any {@link Symbol} objects contained in the object. + * + * @return Returns a collection of {@code Symbol}s. + */ + List getSymbols(); +} 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 96123deaf1f..3aaa8be0978 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 @@ -15,6 +15,8 @@ package software.amazon.smithy.codegen.core; +import java.util.Collections; +import java.util.List; import java.util.Map; import java.util.Objects; import java.util.TreeMap; @@ -66,7 +68,7 @@ * suggestion. */ public final class SymbolDependency extends TypedPropertiesBag - implements ToSmithyBuilder, Comparable { + implements SymbolDependencyContainer, ToSmithyBuilder, Comparable { private final String dependencyType; private final String packageName; @@ -187,6 +189,11 @@ public String getVersion() { return version; } + @Override + public List getDependencies() { + return Collections.singletonList(this); + } + @Override public Builder toBuilder() { return builder() diff --git a/codegen/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/SymbolDependencyContainer.java b/codegen/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/SymbolDependencyContainer.java new file mode 100644 index 00000000000..f08855ae3db --- /dev/null +++ b/codegen/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/SymbolDependencyContainer.java @@ -0,0 +1,36 @@ +/* + * Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file 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 software.amazon.smithy.codegen.core; + +import java.util.List; + +/** + * A container for {@link SymbolDependency} objects. + */ +public interface SymbolDependencyContainer { + /** + * Gets the list of dependencies that this object introduces. + * + *

A dependency is a dependency on another package that a Symbol + * or type requires. It is quite different from a reference since a + * reference only refers to a symbol; a reference provides no context + * as to whether or not a dependency is required or the dependency's + * coordinates. + * + * @return Returns the dependencies. + */ + List getDependencies(); +} diff --git a/codegen/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/SymbolReference.java b/codegen/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/SymbolReference.java index d283bd7850c..73d6efcaea9 100644 --- a/codegen/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/SymbolReference.java +++ b/codegen/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/SymbolReference.java @@ -17,6 +17,7 @@ import java.util.Collections; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; @@ -42,7 +43,9 @@ * {@link ContextOption#USE} options, meaning that the reference is * necessary both when defining and when using a symbol. */ -public final class SymbolReference extends TypedPropertiesBag implements ToSmithyBuilder { +public final class SymbolReference + extends TypedPropertiesBag + implements SymbolContainer, SymbolDependencyContainer, ToSmithyBuilder { /** * Top-level interface for all {@code SymbolReference} options. @@ -153,6 +156,16 @@ public boolean hasOption(Option option) { return options.contains(option); } + @Override + public List getSymbols() { + return Collections.singletonList(getSymbol()); + } + + @Override + public List getDependencies() { + return symbol.getDependencies(); + } + @Override public Builder toBuilder() { return new Builder()