Skip to content

Commit f96eb94

Browse files
Update ReplaceShapes to use DependencyGraph
1 parent 1debfac commit f96eb94

File tree

2 files changed

+24
-13
lines changed

2 files changed

+24
-13
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"type": "feature",
3+
"description": "Updated `ReplaceShapes` to use `DependencyGraph` to sort shapes.",
4+
"pull_requests": [
5+
"[#2774](https://github.com/smithy-lang/smithy/pull/2774)"
6+
]
7+
}

smithy-model/src/main/java/software/amazon/smithy/model/transform/ReplaceShapes.java

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
import java.util.ArrayList;
88
import java.util.Collection;
9-
import java.util.Collections;
109
import java.util.HashMap;
1110
import java.util.HashSet;
1211
import java.util.List;
@@ -16,7 +15,6 @@
1615
import java.util.Set;
1716
import java.util.TreeSet;
1817
import software.amazon.smithy.model.Model;
19-
import software.amazon.smithy.model.loader.TopologicalShapeSort;
2018
import software.amazon.smithy.model.shapes.AbstractShapeBuilder;
2119
import software.amazon.smithy.model.shapes.CollectionShape;
2220
import software.amazon.smithy.model.shapes.MemberShape;
@@ -26,6 +24,7 @@
2624
import software.amazon.smithy.model.shapes.StructureShape;
2725
import software.amazon.smithy.model.shapes.UnionShape;
2826
import software.amazon.smithy.model.traits.MixinTrait;
27+
import software.amazon.smithy.utils.DependencyGraph;
2928

3029
/**
3130
* Replaces shapes while ensuring that the transformed model is in a
@@ -161,30 +160,35 @@ private void updateMixins(Model model, Model.Builder builder, Collection<Shape>
161160
}
162161

163162
// Topologically sort the updated shapes to ensure shapes are updated in order.
164-
TopologicalShapeSort sorter = new TopologicalShapeSort();
163+
DependencyGraph<ShapeId> dependencyGraph = new DependencyGraph<>();
165164

166165
// Add shapes that are mixins or use mixins.
167166
for (Shape shape : model.toSet()) {
168167
if (!shape.isMemberShape() && (shape.hasTrait(MixinTrait.ID) || !shape.getMixins().isEmpty())) {
169-
sorter.enqueue(shape);
168+
dependencyGraph.add(shape.getId());
169+
dependencyGraph.addDependencies(shape.getId(), shape.getMixins());
170170
}
171171
}
172172

173173
// Add _all_ of the replacements in case mixins or the Mixin trait were removed from updated shapes.
174174
for (Shape shape : replacements) {
175175
// Enqueue member shapes with empty dependencies since the parent will be enqueued with them.
176-
if (shape.isMemberShape()) {
177-
sorter.enqueue(shape.getId(), Collections.emptySet());
178-
} else {
179-
sorter.enqueue(shape);
176+
dependencyGraph.add(shape.getId());
177+
if (!shape.isMemberShape()) {
178+
dependencyGraph.setDependencies(shape.getId(), shape.getMixins());
180179
}
181180
}
182181

183-
List<ShapeId> sorted = sorter.dequeueSortedShapes();
184-
for (ShapeId toRebuild : sorted) {
185-
Shape shape = updatedShapes.containsKey(toRebuild)
186-
? updatedShapes.get(toRebuild)
187-
: model.expectShape(toRebuild);
182+
for (ShapeId toRebuild : dependencyGraph.toSortedList()) {
183+
Shape shape;
184+
if (updatedShapes.containsKey(toRebuild)) {
185+
shape = updatedShapes.get(toRebuild);
186+
} else if (model.getShape(toRebuild).isPresent()) {
187+
shape = model.getShape(toRebuild).get();
188+
} else {
189+
continue;
190+
}
191+
188192
if (!shape.getMixins().isEmpty()) {
189193
// We don't clear mixins here because a shape might have an inherited
190194
// mixin member that was updated with an applied trait. Clearing mixins

0 commit comments

Comments
 (0)