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