Skip to content

Commit ea3f170

Browse files
committed
wit: type aliases force transitive dependency on the dependencies of their parent interface
1 parent bcebbf4 commit ea3f170

File tree

2 files changed

+8
-0
lines changed

2 files changed

+8
-0
lines changed

wit/interface.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,14 @@ func (i *Interface) dependsOn(dep Node) bool {
6161
if dep == i || dep == i.Package {
6262
return true
6363
}
64+
// _, depIsInterface := dep.(*Interface)
6465
var done bool
6566
i.TypeDefs.All()(func(_ string, t *TypeDef) bool {
6667
done = DependsOn(t, dep)
68+
// A type alias transitively pulls in the dependencies of its owner
69+
if root := t.Root(); !done && root != t && root.Owner != nil && root.Owner != i {
70+
done = DependsOn(root.Owner, dep)
71+
}
6772
return !done
6873
})
6974
if done {

wit/wit.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,12 @@ func DependsOn(node, dep Node) bool {
2727
if node == dep {
2828
return true
2929
}
30+
3031
// Dereference InterfaceRefs
3132
if ref, ok := dep.(*InterfaceRef); ok {
3233
dep = ref.Interface
3334
}
35+
3436
// TODO: is it harmful to despecialize before doing dependency check?
3537
// e.g. it breaks the node == dep check?
3638
if k, ok := node.(TypeDefKind); ok {
@@ -39,6 +41,7 @@ func DependsOn(node, dep Node) bool {
3941
if d, ok := node.(dependent); ok {
4042
return d.dependsOn(dep)
4143
}
44+
4245
return false
4346
}
4447

0 commit comments

Comments
 (0)