Skip to content

Commit e27d652

Browse files
committed
Also check world uses
Signed-off-by: Ryan Levick <ryan.levick@fermyon.com>
1 parent abd2984 commit e27d652

File tree

7 files changed

+43
-8
lines changed

7 files changed

+43
-8
lines changed

crates/wac-parser/tests/resolution/fail/targets-implicit-imports.wac renamed to crates/wac-parser/tests/resolution/fail/targets-interface-use.wac

File renamed without changes.

crates/wac-parser/tests/resolution/fail/targets-implicit-imports.wac.result renamed to crates/wac-parser/tests/resolution/fail/targets-interface-use.wac.result

File renamed without changes.

crates/wac-parser/tests/resolution/fail/targets-implicit-imports/foo/bar.wat renamed to crates/wac-parser/tests/resolution/fail/targets-interface-use/foo/bar.wat

File renamed without changes.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package test:comp targets test:comp/foo;
2+
3+
interface indirect-dependency {
4+
// The resource is actually named "other-resource" in the instance
5+
resource my-resource {}
6+
}
7+
8+
world foo {
9+
use indirect-dependency.{my-resource};
10+
import my-func: func() -> my-resource;
11+
}
12+
13+
let i = new foo:bar { ... };
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
failed to resolve document
2+
3+
× import `test:comp/indirect-dependency` has a mismatched type for target world `test:comp/foo`
4+
╰─▶ instance has unexpected resource export `other-resource`
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
(component
2+
(type (;0;)
3+
(instance
4+
(export (;0;) "other-resource" (type (sub resource)))
5+
)
6+
)
7+
(import "test:comp/indirect-dependency" (instance (;0;) (type 0)))
8+
(alias export 0 "other-resource" (type (;1;)))
9+
(import "my-resource" (type (;2;) (eq 1)))
10+
(type (;3;) (own 2))
11+
(type (;4;) (func (result 3)))
12+
(import "my-func" (func (;0;) (type 4)))
13+
(alias export 0 "other-resource" (type (;5;)))
14+
)

crates/wac-types/src/component.rs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -990,18 +990,22 @@ impl World {
990990
types: &'a Types,
991991
) -> IndexMap<&str, ItemKind> {
992992
let mut interfaces = IndexMap::new();
993+
let mut add_interface_for_used_type = |used_item: &UsedType| {
994+
let used_interface_id = used_item.interface;
995+
// The id must be set since used interfaces are always named.
996+
let used_interface_name = types[used_interface_id].id.as_deref().unwrap();
997+
interfaces.insert(used_interface_name, ItemKind::Instance(used_interface_id));
998+
};
999+
1000+
for (_, used_type) in self.uses.iter() {
1001+
add_interface_for_used_type(used_type);
1002+
}
1003+
9931004
for (_, import) in self.imports.iter() {
9941005
if let ItemKind::Instance(interface_id) = import {
9951006
let import = &types[*interface_id];
9961007
for (_, used_item) in &import.uses {
997-
let used_interface_id = used_item.interface;
998-
let used_interface = &types[used_interface_id];
999-
// The id must be set since used interfaces are always named.
1000-
let used_interface_name = used_interface.id.as_ref().unwrap();
1001-
interfaces.insert(
1002-
used_interface_name.as_str(),
1003-
ItemKind::Instance(used_interface_id),
1004-
);
1008+
add_interface_for_used_type(used_item);
10051009
}
10061010
}
10071011
}

0 commit comments

Comments
 (0)