Skip to content

Commit 848b415

Browse files
committed
Fix duplicate asset loader registration warning
The original fix (bevyengine#11870) did not actually implement the described logic. It checked if there were independently multiple loaders for a given asset type and multiple loaders for a given extension. However, this did not handle the case where those loaders were not the same. For example, there could be a loader for type `Foo` and extension `.foo`. Anther loader could exist for type `Bar` but extension `.bar`. If a third loader was added for type `Foo` but extension `.bar`, the warning would have been incorrectly logged. Instead of independently checking to see if there are preexisting loaders for both the extension and type, look up the indices of the loaders for the type in question. Then check to see if the loaders registered for the extensions has any overlap. Only log if there are loaders that fit this criteria.
1 parent 765166b commit 848b415

File tree

1 file changed

+31
-22
lines changed

1 file changed

+31
-22
lines changed

crates/bevy_asset/src/server/loaders.rs

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ impl AssetLoaders {
4646
};
4747

4848
if is_new {
49+
let existing_loaders_for_type_id = self.type_id_to_loaders.get(&loader_asset_type);
4950
let mut duplicate_extensions = Vec::new();
5051
for extension in AssetLoader::extensions(&*loader) {
5152
let list = self
@@ -54,26 +55,29 @@ impl AssetLoaders {
5455
.or_default();
5556

5657
if !list.is_empty() {
57-
duplicate_extensions.push(extension);
58+
if let Some(existing_loaders_for_type_id) = existing_loaders_for_type_id {
59+
if list
60+
.iter()
61+
.any(|index| existing_loaders_for_type_id.contains(index))
62+
{
63+
duplicate_extensions.push(extension);
64+
}
65+
}
5866
}
5967

6068
list.push(loader_index);
6169
}
62-
63-
self.type_name_to_loader.insert(type_name, loader_index);
64-
65-
let list = self
66-
.type_id_to_loaders
67-
.entry(loader_asset_type)
68-
.or_default();
69-
70-
let duplicate_asset_registration = !list.is_empty();
71-
if !duplicate_extensions.is_empty() && duplicate_asset_registration {
70+
if !duplicate_extensions.is_empty() {
7271
warn!("Duplicate AssetLoader registered for Asset type `{loader_asset_type_name}` with extensions `{duplicate_extensions:?}`. \
7372
Loader must be specified in a .meta file in order to load assets of this type with these extensions.");
7473
}
7574

76-
list.push(loader_index);
75+
self.type_name_to_loader.insert(type_name, loader_index);
76+
77+
self.type_id_to_loaders
78+
.entry(loader_asset_type)
79+
.or_default()
80+
.push(loader_index);
7781

7882
self.loaders.push(MaybeAssetLoader::Ready(loader));
7983
} else {
@@ -107,6 +111,8 @@ impl AssetLoaders {
107111

108112
self.preregistered_loaders.insert(type_name, loader_index);
109113
self.type_name_to_loader.insert(type_name, loader_index);
114+
115+
let existing_loaders_for_type_id = self.type_id_to_loaders.get(&loader_asset_type);
110116
let mut duplicate_extensions = Vec::new();
111117
for extension in extensions {
112118
let list = self
@@ -115,24 +121,27 @@ impl AssetLoaders {
115121
.or_default();
116122

117123
if !list.is_empty() {
118-
duplicate_extensions.push(extension);
124+
if let Some(existing_loaders_for_type_id) = existing_loaders_for_type_id {
125+
if list
126+
.iter()
127+
.any(|index| existing_loaders_for_type_id.contains(index))
128+
{
129+
duplicate_extensions.push(extension);
130+
}
131+
}
119132
}
120133

121134
list.push(loader_index);
122135
}
123-
124-
let list = self
125-
.type_id_to_loaders
126-
.entry(loader_asset_type)
127-
.or_default();
128-
129-
let duplicate_asset_registration = !list.is_empty();
130-
if !duplicate_extensions.is_empty() && duplicate_asset_registration {
136+
if !duplicate_extensions.is_empty() {
131137
warn!("Duplicate AssetLoader preregistered for Asset type `{loader_asset_type_name}` with extensions `{duplicate_extensions:?}`. \
132138
Loader must be specified in a .meta file in order to load assets of this type with these extensions.");
133139
}
134140

135-
list.push(loader_index);
141+
self.type_id_to_loaders
142+
.entry(loader_asset_type)
143+
.or_default()
144+
.push(loader_index);
136145

137146
let (mut sender, receiver) = async_broadcast::broadcast(1);
138147
sender.set_overflow(true);

0 commit comments

Comments
 (0)