@@ -1769,9 +1769,13 @@ fn get_real_types(
1769
1769
generics : & Generics ,
1770
1770
arg : & Type ,
1771
1771
cx : & DocContext < ' _ > ,
1772
+ recurse : i32 ,
1772
1773
) -> FxHashSet < Type > {
1773
1774
let arg_s = arg. to_string ( ) ;
1774
1775
let mut res = FxHashSet :: default ( ) ;
1776
+ if recurse >= 10 { // FIXME: remove this whole recurse thing when the recursion bug is fixed
1777
+ return res;
1778
+ }
1775
1779
if arg. is_full_generic ( ) {
1776
1780
if let Some ( where_pred) = generics. where_predicates . iter ( ) . find ( |g| {
1777
1781
match g {
@@ -1788,7 +1792,7 @@ fn get_real_types(
1788
1792
continue
1789
1793
}
1790
1794
if let Some ( ty) = x. get_type ( cx) {
1791
- let adds = get_real_types ( generics, & ty, cx) ;
1795
+ let adds = get_real_types ( generics, & ty, cx, recurse + 1 ) ;
1792
1796
if !adds. is_empty ( ) {
1793
1797
res. extend ( adds) ;
1794
1798
} else if !ty. is_full_generic ( ) {
@@ -1806,7 +1810,7 @@ fn get_real_types(
1806
1810
} ) {
1807
1811
for bound in bound. get_bounds ( ) . unwrap_or_else ( || & [ ] ) {
1808
1812
if let Some ( ty) = bound. get_trait_type ( ) {
1809
- let adds = get_real_types ( generics, & ty, cx) ;
1813
+ let adds = get_real_types ( generics, & ty, cx, recurse + 1 ) ;
1810
1814
if !adds. is_empty ( ) {
1811
1815
res. extend ( adds) ;
1812
1816
} else if !ty. is_full_generic ( ) {
@@ -1820,7 +1824,7 @@ fn get_real_types(
1820
1824
if let Some ( gens) = arg. generics ( ) {
1821
1825
for gen in gens. iter ( ) {
1822
1826
if gen. is_full_generic ( ) {
1823
- let adds = get_real_types ( generics, gen, cx) ;
1827
+ let adds = get_real_types ( generics, gen, cx, recurse + 1 ) ;
1824
1828
if !adds. is_empty ( ) {
1825
1829
res. extend ( adds) ;
1826
1830
}
@@ -1847,7 +1851,7 @@ pub fn get_all_types(
1847
1851
if arg. type_ . is_self_type ( ) {
1848
1852
continue ;
1849
1853
}
1850
- let args = get_real_types ( generics, & arg. type_ , cx) ;
1854
+ let args = get_real_types ( generics, & arg. type_ , cx, 0 ) ;
1851
1855
if !args. is_empty ( ) {
1852
1856
all_types. extend ( args) ;
1853
1857
} else {
@@ -1857,7 +1861,7 @@ pub fn get_all_types(
1857
1861
1858
1862
let ret_types = match decl. output {
1859
1863
FunctionRetTy :: Return ( ref return_type) => {
1860
- let mut ret = get_real_types ( generics, & return_type, cx) ;
1864
+ let mut ret = get_real_types ( generics, & return_type, cx, 0 ) ;
1861
1865
if ret. is_empty ( ) {
1862
1866
ret. insert ( return_type. clone ( ) ) ;
1863
1867
}
0 commit comments