Skip to content

Commit 6535546

Browse files
authored
fix type sorting (#60)
This helps avoid using the `Any` type except in cases of true cyclic type dependencies. Signed-off-by: Joel Dice <joel.dice@fermyon.com>
1 parent 0ea8e88 commit 6535546

1 file changed

Lines changed: 45 additions & 41 deletions

File tree

src/summary.rs

Lines changed: 45 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -861,54 +861,58 @@ impl<'a> Summary<'a> {
861861
| Type::Float64
862862
| Type::String => (),
863863
Type::Id(id) => {
864-
if !visited.contains(&id) {
865-
visited.insert(id);
866-
867-
let ty = &self.resolve.types[id];
868-
match &ty.kind {
869-
TypeDefKind::Record(record) => {
870-
for field in &record.fields {
871-
self.sort(field.ty, sorted, visited);
872-
}
873-
sorted.insert(id);
874-
}
875-
TypeDefKind::Variant(variant) => {
876-
for case in &variant.cases {
877-
if let Some(ty) = case.ty {
878-
self.sort(ty, sorted, visited);
879-
}
880-
}
881-
sorted.insert(id);
882-
}
883-
TypeDefKind::Enum(_) | TypeDefKind::Flags(_) | TypeDefKind::Handle(_) => {
884-
sorted.insert(id);
885-
}
886-
TypeDefKind::Option(some) => {
887-
self.sort(*some, sorted, visited);
888-
sorted.insert(id);
864+
let ty = &self.resolve.types[id];
865+
match &ty.kind {
866+
TypeDefKind::Record(record) => {
867+
for field in &record.fields {
868+
self.sort(field.ty, sorted, visited);
889869
}
890-
TypeDefKind::Result(result) => {
891-
if let Some(ty) = result.ok {
892-
self.sort(ty, sorted, visited);
893-
}
894-
if let Some(ty) = result.err {
870+
sorted.insert(id);
871+
}
872+
TypeDefKind::Variant(variant) => {
873+
for case in &variant.cases {
874+
if let Some(ty) = case.ty {
895875
self.sort(ty, sorted, visited);
896876
}
897-
sorted.insert(id);
898877
}
899-
TypeDefKind::Tuple(tuple) => {
900-
for ty in &tuple.types {
901-
self.sort(*ty, sorted, visited);
902-
}
903-
sorted.insert(id);
878+
sorted.insert(id);
879+
}
880+
TypeDefKind::Enum(_) | TypeDefKind::Flags(_) => {
881+
sorted.insert(id);
882+
}
883+
TypeDefKind::Handle(Handle::Borrow(resource) | Handle::Own(resource)) => {
884+
self.sort(Type::Id(*resource), sorted, visited);
885+
sorted.insert(id);
886+
}
887+
TypeDefKind::Option(some) => {
888+
self.sort(*some, sorted, visited);
889+
sorted.insert(id);
890+
}
891+
TypeDefKind::Result(result) => {
892+
if let Some(ty) = result.ok {
893+
self.sort(ty, sorted, visited);
904894
}
905-
TypeDefKind::List(ty) => {
906-
self.sort(*ty, sorted, visited);
895+
if let Some(ty) = result.err {
896+
self.sort(ty, sorted, visited);
907897
}
908-
TypeDefKind::Type(ty) => {
898+
sorted.insert(id);
899+
}
900+
TypeDefKind::Tuple(tuple) => {
901+
for ty in &tuple.types {
909902
self.sort(*ty, sorted, visited);
910903
}
911-
TypeDefKind::Resource => {
904+
sorted.insert(id);
905+
}
906+
TypeDefKind::List(ty) => {
907+
self.sort(*ty, sorted, visited);
908+
}
909+
TypeDefKind::Type(ty) => {
910+
self.sort(*ty, sorted, visited);
911+
}
912+
TypeDefKind::Resource => {
913+
if !visited.contains(&id) {
914+
visited.insert(id);
915+
912916
let sort = |function: &MyFunction, sorted: &mut _, visited: &mut _| {
913917
for (_, ty) in function.params {
914918
self.sort(*ty, &mut *sorted, &mut *visited);
@@ -951,8 +955,8 @@ impl<'a> Summary<'a> {
951955

952956
sorted.insert(id);
953957
}
954-
kind => todo!("{kind:?}"),
955958
}
959+
kind => todo!("{kind:?}"),
956960
}
957961
}
958962
}

0 commit comments

Comments
 (0)