@@ -543,6 +543,15 @@ impl CompositionGraph {
543543 "invalid package id"
544544 ) ;
545545
546+ // Remove exports and definitions associated with the package before
547+ // removing nodes, as retain_nodes invalidates the node indices.
548+ self . exports
549+ . retain ( |_, n| self . graph [ * n] . package != Some ( package) ) ;
550+ self . defined
551+ . retain ( |_, n| self . graph [ * n] . package != Some ( package) ) ;
552+ self . imports
553+ . retain ( |_, n| self . graph [ * n] . package != Some ( package) ) ;
554+
546555 // Remove all nodes associated with the package
547556 self . graph
548557 . retain_nodes ( |g, i| g[ i] . package != Some ( package) ) ;
@@ -1959,4 +1968,34 @@ mod test {
19591968 UnexportError :: MustExportDefinition
19601969 ) ) ;
19611970 }
1971+
1972+ #[ test]
1973+ fn it_cleans_up_exports_on_unregister_package ( ) {
1974+ let mut graph = CompositionGraph :: new ( ) ;
1975+ let bytes = wat:: parse_str (
1976+ r#"(component
1977+ (import "f" (func))
1978+ (export "g" (func 0))
1979+ )"# ,
1980+ )
1981+ . unwrap ( ) ;
1982+
1983+ let package =
1984+ wac_types:: Package :: from_bytes ( "test:pkg" , None , bytes, graph. types_mut ( ) ) . unwrap ( ) ;
1985+ let pkg_id = graph. register_package ( package) . unwrap ( ) ;
1986+
1987+ // Create an instantiation and export an alias
1988+ let inst_id = graph. instantiate ( pkg_id) ;
1989+ let alias_id = graph. alias_instance_export ( inst_id, "g" ) . unwrap ( ) ;
1990+ graph. export ( alias_id, "g" ) . unwrap ( ) ;
1991+
1992+ assert ! ( graph. get_export( "g" ) . is_some( ) ) ;
1993+
1994+ // Unregistering the package should clean up exports
1995+ graph. unregister_package ( pkg_id) ;
1996+ assert ! (
1997+ graph. get_export( "g" ) . is_none( ) ,
1998+ "exports should be cleaned up after unregister_package"
1999+ ) ;
2000+ }
19622001}
0 commit comments