Skip to content

Commit 45faca7

Browse files
committed
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.
1 parent dea5176 commit 45faca7

File tree

5 files changed

+110
-15
lines changed

5 files changed

+110
-15
lines changed

codegen/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/Symbol.java

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package software.amazon.smithy.codegen.core;
1717

1818
import java.util.ArrayList;
19+
import java.util.Collections;
1920
import java.util.List;
2021
import java.util.Objects;
2122
import software.amazon.smithy.utils.ListUtils;
@@ -58,7 +59,8 @@
5859
* }
5960
* </pre>
6061
*/
61-
public final class Symbol extends TypedPropertiesBag implements ToSmithyBuilder<Symbol> {
62+
public final class Symbol extends TypedPropertiesBag
63+
implements SymbolContainer, SymbolDependencyContainer, ToSmithyBuilder<Symbol> {
6264
private final String namespace;
6365
private final String namespaceDelimiter;
6466
private final String name;
@@ -187,20 +189,16 @@ public List<SymbolReference> getReferences() {
187189
return references;
188190
}
189191

190-
/**
191-
* Gets the list of dependencies that this symbol introduces.
192-
*
193-
* <p>A dependency is a dependency on another package that the symbol
194-
* requires. It is quite different from a reference since a reference
195-
* only refers to a symbol; a reference provides no context as to whether
196-
* or not a dependency is required or the dependency's coordinates.
197-
*
198-
* @return Returns the Symbol's dependencies.
199-
*/
192+
@Override
200193
public List<SymbolDependency> getDependencies() {
201194
return dependencies;
202195
}
203196

197+
@Override
198+
public List<Symbol> getSymbols() {
199+
return Collections.singletonList(this);
200+
}
201+
204202
@Override
205203
public Builder toBuilder() {
206204
Builder builder = new Builder();
@@ -363,14 +361,25 @@ public Builder dependencies(List<SymbolDependency> dependencies) {
363361
return this;
364362
}
365363

364+
/**
365+
* Replaces the symbol dependencies of the symbol.
366+
*
367+
* @param container Dependencies to set.
368+
* @return Returns the builder.
369+
*/
370+
public Builder dependencies(SymbolDependencyContainer container) {
371+
this.dependencies.clear();
372+
return addDependency(container);
373+
}
374+
366375
/**
367376
* Add a symbol dependency.
368377
*
369378
* @param dependency Symbol dependency to add.
370379
* @return Returns the builder.
371380
*/
372-
public Builder addDependency(SymbolDependency dependency) {
373-
dependencies.add(dependency);
381+
public Builder addDependency(SymbolDependencyContainer dependency) {
382+
dependencies.addAll(dependency.getDependencies());
374383
return this;
375384
}
376385

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
* Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License").
5+
* You may not use this file except in compliance with the License.
6+
* A copy of the License is located at
7+
*
8+
* http://aws.amazon.com/apache2.0
9+
*
10+
* or in the "license" file accompanying this file. This file is distributed
11+
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
12+
* express or implied. See the License for the specific language governing
13+
* permissions and limitations under the License.
14+
*/
15+
16+
package software.amazon.smithy.codegen.core;
17+
18+
import java.util.List;
19+
20+
/**
21+
* A holder for {@link Symbol} objects.
22+
*/
23+
public interface SymbolContainer {
24+
/**
25+
* Returns any {@link Symbol} objects contained in the object.
26+
*
27+
* @return Returns a collection of {@code Symbol}s.
28+
*/
29+
List<Symbol> getSymbols();
30+
}

codegen/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/SymbolDependency.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
package software.amazon.smithy.codegen.core;
1717

18+
import java.util.Collections;
19+
import java.util.List;
1820
import java.util.Map;
1921
import java.util.Objects;
2022
import java.util.TreeMap;
@@ -66,7 +68,7 @@
6668
* suggestion.
6769
*/
6870
public final class SymbolDependency extends TypedPropertiesBag
69-
implements ToSmithyBuilder<SymbolDependency>, Comparable<SymbolDependency> {
71+
implements SymbolDependencyContainer, ToSmithyBuilder<SymbolDependency>, Comparable<SymbolDependency> {
7072

7173
private final String dependencyType;
7274
private final String packageName;
@@ -187,6 +189,11 @@ public String getVersion() {
187189
return version;
188190
}
189191

192+
@Override
193+
public List<SymbolDependency> getDependencies() {
194+
return Collections.singletonList(this);
195+
}
196+
190197
@Override
191198
public Builder toBuilder() {
192199
return builder()
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License").
5+
* You may not use this file except in compliance with the License.
6+
* A copy of the License is located at
7+
*
8+
* http://aws.amazon.com/apache2.0
9+
*
10+
* or in the "license" file accompanying this file. This file is distributed
11+
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
12+
* express or implied. See the License for the specific language governing
13+
* permissions and limitations under the License.
14+
*/
15+
16+
package software.amazon.smithy.codegen.core;
17+
18+
import java.util.List;
19+
20+
/**
21+
* A container for {@link SymbolDependency} objects.
22+
*/
23+
public interface SymbolDependencyContainer {
24+
/**
25+
* Gets the list of dependencies that this object introduces.
26+
*
27+
* <p>A dependency is a dependency on another package that a Symbol
28+
* or type requires. It is quite different from a reference since a
29+
* reference only refers to a symbol; a reference provides no context
30+
* as to whether or not a dependency is required or the dependency's
31+
* coordinates.
32+
*
33+
* @return Returns the dependencies.
34+
*/
35+
List<SymbolDependency> getDependencies();
36+
}

codegen/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/SymbolReference.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import java.util.Collections;
1919
import java.util.HashSet;
20+
import java.util.List;
2021
import java.util.Map;
2122
import java.util.Objects;
2223
import java.util.Set;
@@ -42,7 +43,9 @@
4243
* {@link ContextOption#USE} options, meaning that the reference is
4344
* necessary both when defining and when using a symbol.
4445
*/
45-
public final class SymbolReference extends TypedPropertiesBag implements ToSmithyBuilder<SymbolReference> {
46+
public final class SymbolReference
47+
extends TypedPropertiesBag
48+
implements SymbolContainer, SymbolDependencyContainer, ToSmithyBuilder<SymbolReference> {
4649

4750
/**
4851
* Top-level interface for all {@code SymbolReference} options.
@@ -153,6 +156,16 @@ public boolean hasOption(Option option) {
153156
return options.contains(option);
154157
}
155158

159+
@Override
160+
public List<Symbol> getSymbols() {
161+
return Collections.singletonList(getSymbol());
162+
}
163+
164+
@Override
165+
public List<SymbolDependency> getDependencies() {
166+
return symbol.getDependencies();
167+
}
168+
156169
@Override
157170
public Builder toBuilder() {
158171
return new Builder()

0 commit comments

Comments
 (0)