@@ -1037,12 +1037,16 @@ impl<'w> BundleInserter<'w> {
1037
1037
ON_REPLACE ,
1038
1038
entity,
1039
1039
archetype_after_insert. iter_existing ( ) ,
1040
+ #[ cfg( feature = "track_change_detection" ) ]
1041
+ caller,
1040
1042
) ;
1041
1043
}
1042
1044
deferred_world. trigger_on_replace (
1043
1045
archetype,
1044
1046
entity,
1045
1047
archetype_after_insert. iter_existing ( ) ,
1048
+ #[ cfg( feature = "track_change_detection" ) ]
1049
+ caller,
1046
1050
) ;
1047
1051
}
1048
1052
}
@@ -1213,12 +1217,16 @@ impl<'w> BundleInserter<'w> {
1213
1217
new_archetype,
1214
1218
entity,
1215
1219
archetype_after_insert. iter_added ( ) ,
1220
+ #[ cfg( feature = "track_change_detection" ) ]
1221
+ caller,
1216
1222
) ;
1217
1223
if new_archetype. has_add_observer ( ) {
1218
1224
deferred_world. trigger_observers (
1219
1225
ON_ADD ,
1220
1226
entity,
1221
1227
archetype_after_insert. iter_added ( ) ,
1228
+ #[ cfg( feature = "track_change_detection" ) ]
1229
+ caller,
1222
1230
) ;
1223
1231
}
1224
1232
match insert_mode {
@@ -1228,12 +1236,16 @@ impl<'w> BundleInserter<'w> {
1228
1236
new_archetype,
1229
1237
entity,
1230
1238
archetype_after_insert. iter_inserted ( ) ,
1239
+ #[ cfg( feature = "track_change_detection" ) ]
1240
+ caller,
1231
1241
) ;
1232
1242
if new_archetype. has_insert_observer ( ) {
1233
1243
deferred_world. trigger_observers (
1234
1244
ON_INSERT ,
1235
1245
entity,
1236
1246
archetype_after_insert. iter_inserted ( ) ,
1247
+ #[ cfg( feature = "track_change_detection" ) ]
1248
+ caller,
1237
1249
) ;
1238
1250
}
1239
1251
}
@@ -1244,12 +1256,16 @@ impl<'w> BundleInserter<'w> {
1244
1256
new_archetype,
1245
1257
entity,
1246
1258
archetype_after_insert. iter_added ( ) ,
1259
+ #[ cfg( feature = "track_change_detection" ) ]
1260
+ caller,
1247
1261
) ;
1248
1262
if new_archetype. has_insert_observer ( ) {
1249
1263
deferred_world. trigger_observers (
1250
1264
ON_INSERT ,
1251
1265
entity,
1252
1266
archetype_after_insert. iter_added ( ) ,
1267
+ #[ cfg( feature = "track_change_detection" ) ]
1268
+ caller,
1253
1269
) ;
1254
1270
}
1255
1271
}
@@ -1325,6 +1341,7 @@ impl<'w> BundleSpawner<'w> {
1325
1341
/// # Safety
1326
1342
/// `entity` must be allocated (but non-existent), `T` must match this [`BundleInfo`]'s type
1327
1343
#[ inline]
1344
+ #[ track_caller]
1328
1345
pub unsafe fn spawn_non_existent < T : DynamicBundle > (
1329
1346
& mut self ,
1330
1347
entity : Entity ,
@@ -1372,24 +1389,32 @@ impl<'w> BundleSpawner<'w> {
1372
1389
archetype,
1373
1390
entity,
1374
1391
bundle_info. iter_contributed_components ( ) ,
1392
+ #[ cfg( feature = "track_change_detection" ) ]
1393
+ caller,
1375
1394
) ;
1376
1395
if archetype. has_add_observer ( ) {
1377
1396
deferred_world. trigger_observers (
1378
1397
ON_ADD ,
1379
1398
entity,
1380
1399
bundle_info. iter_contributed_components ( ) ,
1400
+ #[ cfg( feature = "track_change_detection" ) ]
1401
+ caller,
1381
1402
) ;
1382
1403
}
1383
1404
deferred_world. trigger_on_insert (
1384
1405
archetype,
1385
1406
entity,
1386
1407
bundle_info. iter_contributed_components ( ) ,
1408
+ #[ cfg( feature = "track_change_detection" ) ]
1409
+ caller,
1387
1410
) ;
1388
1411
if archetype. has_insert_observer ( ) {
1389
1412
deferred_world. trigger_observers (
1390
1413
ON_INSERT ,
1391
1414
entity,
1392
1415
bundle_info. iter_contributed_components ( ) ,
1416
+ #[ cfg( feature = "track_change_detection" ) ]
1417
+ caller,
1393
1418
) ;
1394
1419
}
1395
1420
} ;
@@ -1642,6 +1667,7 @@ fn sorted_remove<T: Eq + Ord + Copy>(source: &mut Vec<T>, remove: &[T]) {
1642
1667
mod tests {
1643
1668
use crate as bevy_ecs;
1644
1669
use crate :: { component:: ComponentId , prelude:: * , world:: DeferredWorld } ;
1670
+ use core:: panic:: Location ;
1645
1671
1646
1672
#[ derive( Component ) ]
1647
1673
struct A ;
@@ -1650,19 +1676,39 @@ mod tests {
1650
1676
#[ component( on_add = a_on_add, on_insert = a_on_insert, on_replace = a_on_replace, on_remove = a_on_remove) ]
1651
1677
struct AMacroHooks ;
1652
1678
1653
- fn a_on_add ( mut world : DeferredWorld , _: Entity , _: ComponentId ) {
1679
+ fn a_on_add (
1680
+ mut world : DeferredWorld ,
1681
+ _: Entity ,
1682
+ _: ComponentId ,
1683
+ _: Option < & ' static Location < ' static > > ,
1684
+ ) {
1654
1685
world. resource_mut :: < R > ( ) . assert_order ( 0 ) ;
1655
1686
}
1656
1687
1657
- fn a_on_insert < T1 , T2 > ( mut world : DeferredWorld , _: T1 , _: T2 ) {
1688
+ fn a_on_insert < T1 , T2 > (
1689
+ mut world : DeferredWorld ,
1690
+ _: T1 ,
1691
+ _: T2 ,
1692
+ _: Option < & ' static Location < ' static > > ,
1693
+ ) {
1658
1694
world. resource_mut :: < R > ( ) . assert_order ( 1 ) ;
1659
1695
}
1660
1696
1661
- fn a_on_replace < T1 , T2 > ( mut world : DeferredWorld , _: T1 , _: T2 ) {
1697
+ fn a_on_replace < T1 , T2 > (
1698
+ mut world : DeferredWorld ,
1699
+ _: T1 ,
1700
+ _: T2 ,
1701
+ _: Option < & ' static Location < ' static > > ,
1702
+ ) {
1662
1703
world. resource_mut :: < R > ( ) . assert_order ( 2 ) ;
1663
1704
}
1664
1705
1665
- fn a_on_remove < T1 , T2 > ( mut world : DeferredWorld , _: T1 , _: T2 ) {
1706
+ fn a_on_remove < T1 , T2 > (
1707
+ mut world : DeferredWorld ,
1708
+ _: T1 ,
1709
+ _: T2 ,
1710
+ _: Option < & ' static Location < ' static > > ,
1711
+ ) {
1666
1712
world. resource_mut :: < R > ( ) . assert_order ( 3 ) ;
1667
1713
}
1668
1714
@@ -1695,10 +1741,10 @@ mod tests {
1695
1741
world. init_resource :: < R > ( ) ;
1696
1742
world
1697
1743
. register_component_hooks :: < A > ( )
1698
- . on_add ( |mut world, _, _| world. resource_mut :: < R > ( ) . assert_order ( 0 ) )
1699
- . on_insert ( |mut world, _, _| world. resource_mut :: < R > ( ) . assert_order ( 1 ) )
1700
- . on_replace ( |mut world, _, _| world. resource_mut :: < R > ( ) . assert_order ( 2 ) )
1701
- . on_remove ( |mut world, _, _| world. resource_mut :: < R > ( ) . assert_order ( 3 ) ) ;
1744
+ . on_add ( |mut world, _, _, _ | world. resource_mut :: < R > ( ) . assert_order ( 0 ) )
1745
+ . on_insert ( |mut world, _, _, _ | world. resource_mut :: < R > ( ) . assert_order ( 1 ) )
1746
+ . on_replace ( |mut world, _, _, _ | world. resource_mut :: < R > ( ) . assert_order ( 2 ) )
1747
+ . on_remove ( |mut world, _, _, _ | world. resource_mut :: < R > ( ) . assert_order ( 3 ) ) ;
1702
1748
1703
1749
let entity = world. spawn ( A ) . id ( ) ;
1704
1750
world. despawn ( entity) ;
@@ -1722,10 +1768,10 @@ mod tests {
1722
1768
world. init_resource :: < R > ( ) ;
1723
1769
world
1724
1770
. register_component_hooks :: < A > ( )
1725
- . on_add ( |mut world, _, _| world. resource_mut :: < R > ( ) . assert_order ( 0 ) )
1726
- . on_insert ( |mut world, _, _| world. resource_mut :: < R > ( ) . assert_order ( 1 ) )
1727
- . on_replace ( |mut world, _, _| world. resource_mut :: < R > ( ) . assert_order ( 2 ) )
1728
- . on_remove ( |mut world, _, _| world. resource_mut :: < R > ( ) . assert_order ( 3 ) ) ;
1771
+ . on_add ( |mut world, _, _, _ | world. resource_mut :: < R > ( ) . assert_order ( 0 ) )
1772
+ . on_insert ( |mut world, _, _, _ | world. resource_mut :: < R > ( ) . assert_order ( 1 ) )
1773
+ . on_replace ( |mut world, _, _, _ | world. resource_mut :: < R > ( ) . assert_order ( 2 ) )
1774
+ . on_remove ( |mut world, _, _, _ | world. resource_mut :: < R > ( ) . assert_order ( 3 ) ) ;
1729
1775
1730
1776
let mut entity = world. spawn_empty ( ) ;
1731
1777
entity. insert ( A ) ;
@@ -1739,8 +1785,8 @@ mod tests {
1739
1785
let mut world = World :: new ( ) ;
1740
1786
world
1741
1787
. register_component_hooks :: < A > ( )
1742
- . on_replace ( |mut world, _, _| world. resource_mut :: < R > ( ) . assert_order ( 0 ) )
1743
- . on_insert ( |mut world, _, _| {
1788
+ . on_replace ( |mut world, _, _, _ | world. resource_mut :: < R > ( ) . assert_order ( 0 ) )
1789
+ . on_insert ( |mut world, _, _, _ | {
1744
1790
if let Some ( mut r) = world. get_resource_mut :: < R > ( ) {
1745
1791
r. assert_order ( 1 ) ;
1746
1792
}
@@ -1761,22 +1807,22 @@ mod tests {
1761
1807
world. init_resource :: < R > ( ) ;
1762
1808
world
1763
1809
. register_component_hooks :: < A > ( )
1764
- . on_add ( |mut world, entity, _| {
1810
+ . on_add ( |mut world, entity, _, _ | {
1765
1811
world. resource_mut :: < R > ( ) . assert_order ( 0 ) ;
1766
1812
world. commands ( ) . entity ( entity) . insert ( B ) ;
1767
1813
} )
1768
- . on_remove ( |mut world, entity, _| {
1814
+ . on_remove ( |mut world, entity, _, _ | {
1769
1815
world. resource_mut :: < R > ( ) . assert_order ( 2 ) ;
1770
1816
world. commands ( ) . entity ( entity) . remove :: < B > ( ) ;
1771
1817
} ) ;
1772
1818
1773
1819
world
1774
1820
. register_component_hooks :: < B > ( )
1775
- . on_add ( |mut world, entity, _| {
1821
+ . on_add ( |mut world, entity, _, _ | {
1776
1822
world. resource_mut :: < R > ( ) . assert_order ( 1 ) ;
1777
1823
world. commands ( ) . entity ( entity) . remove :: < A > ( ) ;
1778
1824
} )
1779
- . on_remove ( |mut world, _, _| {
1825
+ . on_remove ( |mut world, _, _, _ | {
1780
1826
world. resource_mut :: < R > ( ) . assert_order ( 3 ) ;
1781
1827
} ) ;
1782
1828
@@ -1793,27 +1839,27 @@ mod tests {
1793
1839
world. init_resource :: < R > ( ) ;
1794
1840
world
1795
1841
. register_component_hooks :: < A > ( )
1796
- . on_add ( |mut world, entity, _| {
1842
+ . on_add ( |mut world, entity, _, _ | {
1797
1843
world. resource_mut :: < R > ( ) . assert_order ( 0 ) ;
1798
1844
world. commands ( ) . entity ( entity) . insert ( B ) . insert ( C ) ;
1799
1845
} ) ;
1800
1846
1801
1847
world
1802
1848
. register_component_hooks :: < B > ( )
1803
- . on_add ( |mut world, entity, _| {
1849
+ . on_add ( |mut world, entity, _, _ | {
1804
1850
world. resource_mut :: < R > ( ) . assert_order ( 1 ) ;
1805
1851
world. commands ( ) . entity ( entity) . insert ( D ) ;
1806
1852
} ) ;
1807
1853
1808
1854
world
1809
1855
. register_component_hooks :: < C > ( )
1810
- . on_add ( |mut world, _, _| {
1856
+ . on_add ( |mut world, _, _, _ | {
1811
1857
world. resource_mut :: < R > ( ) . assert_order ( 3 ) ;
1812
1858
} ) ;
1813
1859
1814
1860
world
1815
1861
. register_component_hooks :: < D > ( )
1816
- . on_add ( |mut world, _, _| {
1862
+ . on_add ( |mut world, _, _, _ | {
1817
1863
world. resource_mut :: < R > ( ) . assert_order ( 2 ) ;
1818
1864
} ) ;
1819
1865
0 commit comments