From 8ab2c733ee9ce76f02b56c3e15dc6a60f5610a52 Mon Sep 17 00:00:00 2001 From: Michael Dowling Date: Fri, 28 Aug 2020 13:01:40 -0700 Subject: [PATCH] Visit topological neighbors alphabetically --- .../amazon/smithy/codegen/core/TopologicalIndex.java | 9 ++++++++- .../amazon/smithy/codegen/core/TopologicalIndexTest.java | 4 ++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/TopologicalIndex.java b/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/TopologicalIndex.java index 80b9b806091..853ad2de9db 100644 --- a/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/TopologicalIndex.java +++ b/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/TopologicalIndex.java @@ -22,6 +22,7 @@ import java.util.Map; import java.util.Set; import java.util.TreeMap; +import java.util.TreeSet; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.knowledge.KnowledgeIndex; import software.amazon.smithy.model.knowledge.NeighborProviderIndex; @@ -108,14 +109,20 @@ private void computeRecursiveShapes(Model model) { private void visitShape(NeighborProvider provider, Shape shape) { // Visit members before visiting containers. Note that no 'visited' // set is needed since only non-recursive shapes are traversed. + // We sort the neighbors to better order the result. + Set neighbors = new TreeSet<>(); for (Relationship rel : provider.getNeighbors(shape)) { if (rel.getRelationshipType().getDirection() == RelationshipDirection.DIRECTED) { if (!rel.getNeighborShapeId().equals(shape.getId()) && rel.getNeighborShape().isPresent()) { - visitShape(provider, rel.getNeighborShape().get()); + neighbors.add(rel.getNeighborShape().get()); } } } + for (Shape neighbor : neighbors) { + visitShape(provider, neighbor); + } + shapes.add(shape); } diff --git a/smithy-codegen-core/src/test/java/software/amazon/smithy/codegen/core/TopologicalIndexTest.java b/smithy-codegen-core/src/test/java/software/amazon/smithy/codegen/core/TopologicalIndexTest.java index 127ee651150..1479f15f5e9 100644 --- a/smithy-codegen-core/src/test/java/software/amazon/smithy/codegen/core/TopologicalIndexTest.java +++ b/smithy-codegen-core/src/test/java/software/amazon/smithy/codegen/core/TopologicalIndexTest.java @@ -50,12 +50,12 @@ public void sortsTopologically() { "smithy.example#MyString", "smithy.example#BamList$member", "smithy.example#BamList", + "smithy.example#Bar$bam", "smithy.api#Integer", "smithy.example#Bar$baz", - "smithy.example#Bar$bam", "smithy.example#Bar", - "smithy.example#Foo$foo", "smithy.example#Foo$bar", + "smithy.example#Foo$foo", "smithy.example#Foo")); assertThat(recursive, contains(