Skip to content

Commit d804b74

Browse files
authored
Rollup merge of #114549 - chenyukang:yukang-review-resolve-part, r=petrochenkov
Style fix and refactor on resolve diagnostics - coding style - refactor api of `span_look_ahead`
2 parents cbe2522 + eb0fcc5 commit d804b74

File tree

3 files changed

+53
-61
lines changed

3 files changed

+53
-61
lines changed

compiler/rustc_resolve/src/late/diagnostics.rs

+35-38
Original file line numberDiff line numberDiff line change
@@ -555,7 +555,6 @@ impl<'a: 'ast, 'ast, 'tcx> LateResolutionVisitor<'a, '_, 'ast, 'tcx> {
555555
}
556556
})
557557
.collect::<Vec<_>>();
558-
let crate_def_id = CRATE_DEF_ID.to_def_id();
559558
// Try to filter out intrinsics candidates, as long as we have
560559
// some other candidates to suggest.
561560
let intrinsic_candidates: Vec<_> = candidates
@@ -566,8 +565,9 @@ impl<'a: 'ast, 'ast, 'tcx> LateResolutionVisitor<'a, '_, 'ast, 'tcx> {
566565
.collect();
567566
if candidates.is_empty() {
568567
// Put them back if we have no more candidates to suggest...
569-
candidates.extend(intrinsic_candidates);
568+
candidates = intrinsic_candidates;
570569
}
570+
let crate_def_id = CRATE_DEF_ID.to_def_id();
571571
if candidates.is_empty() && is_expected(Res::Def(DefKind::Enum, crate_def_id)) {
572572
let mut enum_candidates: Vec<_> = self
573573
.r
@@ -1180,37 +1180,34 @@ impl<'a: 'ast, 'ast, 'tcx> LateResolutionVisitor<'a, '_, 'ast, 'tcx> {
11801180
/// return the span of whole call and the span for all arguments expect the first one (`self`).
11811181
fn call_has_self_arg(&self, source: PathSource<'_>) -> Option<(Span, Option<Span>)> {
11821182
let mut has_self_arg = None;
1183-
if let PathSource::Expr(Some(parent)) = source {
1184-
match &parent.kind {
1185-
ExprKind::Call(_, args) if !args.is_empty() => {
1186-
let mut expr_kind = &args[0].kind;
1187-
loop {
1188-
match expr_kind {
1189-
ExprKind::Path(_, arg_name) if arg_name.segments.len() == 1 => {
1190-
if arg_name.segments[0].ident.name == kw::SelfLower {
1191-
let call_span = parent.span;
1192-
let tail_args_span = if args.len() > 1 {
1193-
Some(Span::new(
1194-
args[1].span.lo(),
1195-
args.last().unwrap().span.hi(),
1196-
call_span.ctxt(),
1197-
None,
1198-
))
1199-
} else {
1200-
None
1201-
};
1202-
has_self_arg = Some((call_span, tail_args_span));
1203-
}
1204-
break;
1183+
if let PathSource::Expr(Some(parent)) = source
1184+
&& let ExprKind::Call(_, args) = &parent.kind
1185+
&& !args.is_empty() {
1186+
let mut expr_kind = &args[0].kind;
1187+
loop {
1188+
match expr_kind {
1189+
ExprKind::Path(_, arg_name) if arg_name.segments.len() == 1 => {
1190+
if arg_name.segments[0].ident.name == kw::SelfLower {
1191+
let call_span = parent.span;
1192+
let tail_args_span = if args.len() > 1 {
1193+
Some(Span::new(
1194+
args[1].span.lo(),
1195+
args.last().unwrap().span.hi(),
1196+
call_span.ctxt(),
1197+
None,
1198+
))
1199+
} else {
1200+
None
1201+
};
1202+
has_self_arg = Some((call_span, tail_args_span));
12051203
}
1206-
ExprKind::AddrOf(_, _, expr) => expr_kind = &expr.kind,
1207-
_ => break,
1204+
break;
12081205
}
1206+
ExprKind::AddrOf(_, _, expr) => expr_kind = &expr.kind,
1207+
_ => break,
12091208
}
12101209
}
1211-
_ => (),
1212-
}
1213-
};
1210+
}
12141211
has_self_arg
12151212
}
12161213

@@ -1220,15 +1217,15 @@ impl<'a: 'ast, 'ast, 'tcx> LateResolutionVisitor<'a, '_, 'ast, 'tcx> {
12201217
// where a brace being opened means a block is being started. Look
12211218
// ahead for the next text to see if `span` is followed by a `{`.
12221219
let sm = self.r.tcx.sess.source_map();
1223-
let sp = sm.span_look_ahead(span, None, Some(50));
1224-
let followed_by_brace = matches!(sm.span_to_snippet(sp), Ok(ref snippet) if snippet == "{");
1225-
// In case this could be a struct literal that needs to be surrounded
1226-
// by parentheses, find the appropriate span.
1227-
let closing_span = sm.span_look_ahead(span, Some("}"), Some(50));
1228-
let closing_brace: Option<Span> = sm
1229-
.span_to_snippet(closing_span)
1230-
.map_or(None, |s| if s == "}" { Some(span.to(closing_span)) } else { None });
1231-
(followed_by_brace, closing_brace)
1220+
if let Some(followed_brace_span) = sm.span_look_ahead(span, "{", Some(50)) {
1221+
// In case this could be a struct literal that needs to be surrounded
1222+
// by parentheses, find the appropriate span.
1223+
let close_brace_span = sm.span_look_ahead(followed_brace_span, "}", Some(50));
1224+
let closing_brace = close_brace_span.map(|sp| span.to(sp));
1225+
(true, closing_brace)
1226+
} else {
1227+
(false, None)
1228+
}
12321229
}
12331230

12341231
/// Provides context-dependent help for errors reported by the `smart_resolve_path_fragment`

compiler/rustc_span/src/source_map.rs

+6-9
Original file line numberDiff line numberDiff line change
@@ -973,24 +973,21 @@ impl SourceMap {
973973
Span::new(BytePos(start_of_next_point), end_of_next_point, sp.ctxt(), None)
974974
}
975975

976-
/// Returns a new span to check next none-whitespace character or some specified expected character
977-
/// If `expect` is none, the first span of non-whitespace character is returned.
978-
/// If `expect` presented, the first span of the character `expect` is returned
979-
/// Otherwise, the span reached to limit is returned.
980-
pub fn span_look_ahead(&self, span: Span, expect: Option<&str>, limit: Option<usize>) -> Span {
976+
/// Check whether span is followed by some specified expected string in limit scope
977+
pub fn span_look_ahead(&self, span: Span, expect: &str, limit: Option<usize>) -> Option<Span> {
981978
let mut sp = span;
982979
for _ in 0..limit.unwrap_or(100_usize) {
983980
sp = self.next_point(sp);
984981
if let Ok(ref snippet) = self.span_to_snippet(sp) {
985-
if expect.is_some_and(|es| snippet == es) {
986-
break;
982+
if snippet == expect {
983+
return Some(sp);
987984
}
988-
if expect.is_none() && snippet.chars().any(|c| !c.is_whitespace()) {
985+
if snippet.chars().any(|c| !c.is_whitespace()) {
989986
break;
990987
}
991988
}
992989
}
993-
sp
990+
None
994991
}
995992

996993
/// Finds the width of the character, either before or after the end of provided span,

compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs

+12-14
Original file line numberDiff line numberDiff line change
@@ -1429,20 +1429,18 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
14291429

14301430
// Issue #109436, we need to add parentheses properly for method calls
14311431
// for example, `foo.into()` should be `(&foo).into()`
1432-
if let Ok(snippet) = self.tcx.sess.source_map().span_to_snippet(
1433-
self.tcx.sess.source_map().span_look_ahead(span, Some("."), Some(50)),
1434-
) {
1435-
if snippet == "." {
1436-
err.multipart_suggestion_verbose(
1437-
sugg_msg,
1438-
vec![
1439-
(span.shrink_to_lo(), format!("({sugg_prefix}")),
1440-
(span.shrink_to_hi(), ")".to_string()),
1441-
],
1442-
Applicability::MaybeIncorrect,
1443-
);
1444-
return true;
1445-
}
1432+
if let Some(_) =
1433+
self.tcx.sess.source_map().span_look_ahead(span, ".", Some(50))
1434+
{
1435+
err.multipart_suggestion_verbose(
1436+
sugg_msg,
1437+
vec![
1438+
(span.shrink_to_lo(), format!("({sugg_prefix}")),
1439+
(span.shrink_to_hi(), ")".to_string()),
1440+
],
1441+
Applicability::MaybeIncorrect,
1442+
);
1443+
return true;
14461444
}
14471445

14481446
// Issue #104961, we need to add parentheses properly for compound expressions

0 commit comments

Comments
 (0)