@@ -475,9 +475,9 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> {
475
475
} ) ;
476
476
debug ! ( "{} resolved to {:?} in namespace {:?}" , path_str, result, ns) ;
477
477
match result {
478
- // resolver doesn't know about true and false so we'll have to resolve them
478
+ // resolver doesn't know about true, false, and types that aren't paths (e.g. `()`)
479
479
// manually as bool
480
- Err ( ( ) ) => is_bool_value ( path_str, ns) ,
480
+ Err ( ( ) ) => resolve_primitive ( path_str, ns) ,
481
481
Ok ( res) => Some ( res) ,
482
482
}
483
483
}
@@ -1020,7 +1020,7 @@ impl LinkCollector<'_, '_> {
1020
1020
( link. trim ( ) , None )
1021
1021
} ;
1022
1022
1023
- if path_str. contains ( |ch : char | !( ch. is_alphanumeric ( ) || ":_<>, !" . contains ( ch) ) ) {
1023
+ if path_str. contains ( |ch : char | !( ch. is_alphanumeric ( ) || ":_<>, !*()[]&; " . contains ( ch) ) ) {
1024
1024
return None ;
1025
1025
}
1026
1026
@@ -1108,9 +1108,8 @@ impl LinkCollector<'_, '_> {
1108
1108
// Sanity check to make sure we don't have any angle brackets after stripping generics.
1109
1109
assert ! ( !path_str. contains( [ '<' , '>' ] . as_slice( ) ) ) ;
1110
1110
1111
- // The link is not an intra-doc link if it still contains commas or spaces after
1112
- // stripping generics.
1113
- if path_str. contains ( [ ',' , ' ' ] . as_slice ( ) ) {
1111
+ // The link is not an intra-doc link if it still contains spaces after stripping generics.
1112
+ if path_str. contains ( ' ' ) {
1114
1113
return None ;
1115
1114
}
1116
1115
@@ -1476,8 +1475,11 @@ impl Disambiguator {
1476
1475
( "!" , DefKind :: Macro ( MacroKind :: Bang ) ) ,
1477
1476
] ;
1478
1477
for & ( suffix, kind) in & suffixes {
1479
- if link. ends_with ( suffix) {
1480
- return Ok ( ( Kind ( kind) , link. trim_end_matches ( suffix) ) ) ;
1478
+ if let Some ( link) = link. strip_suffix ( suffix) {
1479
+ // Avoid turning `!` or `()` into an empty string
1480
+ if !link. is_empty ( ) {
1481
+ return Ok ( ( Kind ( kind) , link) ) ;
1482
+ }
1481
1483
}
1482
1484
}
1483
1485
Err ( ( ) )
@@ -2066,37 +2068,37 @@ fn resolve_primitive(path_str: &str, ns: Namespace) -> Option<Res> {
2066
2068
}
2067
2069
use PrimitiveType :: * ;
2068
2070
let prim = match path_str {
2069
- "u8" => U8 ,
2070
- "u16" => U16 ,
2071
- "u32" => U32 ,
2072
- "u64" => U64 ,
2073
- "u128" => U128 ,
2074
- "usize" => Usize ,
2071
+ "isize" => Isize ,
2075
2072
"i8" => I8 ,
2076
2073
"i16" => I16 ,
2077
2074
"i32" => I32 ,
2078
2075
"i64" => I64 ,
2079
2076
"i128" => I128 ,
2080
- "isize" => Isize ,
2077
+ "usize" => Usize ,
2078
+ "u8" => U8 ,
2079
+ "u16" => U16 ,
2080
+ "u32" => U32 ,
2081
+ "u64" => U64 ,
2082
+ "u128" => U128 ,
2081
2083
"f32" => F32 ,
2082
2084
"f64" => F64 ,
2083
- "str" => Str ,
2084
- "bool" | "true" | "false" => Bool ,
2085
2085
"char" => Char ,
2086
+ "bool" | "true" | "false" => Bool ,
2087
+ "str" => Str ,
2088
+ "slice" | "&[]" | "[T]" => Slice ,
2089
+ "array" | "[]" | "[T;N]" => Array ,
2090
+ "tuple" | "(,)" => Tuple ,
2091
+ "unit" | "()" => Unit ,
2092
+ "pointer" | "*" | "*const" | "*mut" => RawPointer ,
2093
+ "reference" | "&" | "&mut" => Reference ,
2094
+ "fn" => Fn ,
2095
+ "never" | "!" => Never ,
2086
2096
_ => return None ,
2087
2097
} ;
2098
+ debug ! ( "resolved primitives {:?}" , prim) ;
2088
2099
Some ( Res :: Primitive ( prim) )
2089
2100
}
2090
2101
2091
- /// Resolve a primitive value.
2092
- fn is_bool_value ( path_str : & str , ns : Namespace ) -> Option < Res > {
2093
- if ns == TypeNS && ( path_str == "true" || path_str == "false" ) {
2094
- Some ( Res :: Primitive ( PrimitiveType :: Bool ) )
2095
- } else {
2096
- None
2097
- }
2098
- }
2099
-
2100
2102
fn strip_generics_from_path ( path_str : & str ) -> Result < String , ResolutionFailure < ' static > > {
2101
2103
let mut stripped_segments = vec ! [ ] ;
2102
2104
let mut path = path_str. chars ( ) . peekable ( ) ;
0 commit comments