Skip to content

Commit ad0d3b5

Browse files
committed
Move code from parser to diagnostics
1 parent 1ee45da commit ad0d3b5

File tree

2 files changed

+40
-36
lines changed

2 files changed

+40
-36
lines changed

src/libsyntax/parse/diagnostics.rs

+38-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
use crate::ast;
21
use crate::ast::{
3-
BlockCheckMode, BinOpKind, Expr, ExprKind, Item, ItemKind, Pat, PatKind, PathSegment, QSelf,
4-
Ty, TyKind, VariantData, Ident,
2+
self, Arg, BinOpKind, BindingMode, BlockCheckMode, Expr, ExprKind, Ident, Item, ItemKind,
3+
Mutability, Pat, PatKind, PathSegment, QSelf, Ty, TyKind, VariantData,
54
};
65
use crate::parse::{SeqSep, token, PResult, Parser};
76
use crate::parse::parser::{BlockMode, PathStyle, SemiColonMode, TokenType, TokenExpectType};
@@ -12,9 +11,25 @@ use crate::symbol::{kw, sym};
1211
use crate::ThinVec;
1312
use crate::util::parser::AssocOp;
1413
use errors::{Applicability, DiagnosticBuilder, DiagnosticId};
14+
use rustc_data_structures::fx::FxHashSet;
1515
use syntax_pos::{Span, DUMMY_SP, MultiSpan};
1616
use log::{debug, trace};
1717

18+
/// Creates a placeholder argument.
19+
crate fn dummy_arg(ident: Ident) -> Arg {
20+
let pat = P(Pat {
21+
id: ast::DUMMY_NODE_ID,
22+
node: PatKind::Ident(BindingMode::ByValue(Mutability::Immutable), ident, None),
23+
span: ident.span,
24+
});
25+
let ty = Ty {
26+
node: TyKind::Err,
27+
span: ident.span,
28+
id: ast::DUMMY_NODE_ID
29+
};
30+
Arg { ty: P(ty), pat: pat, id: ast::DUMMY_NODE_ID, source: ast::ArgSource::Normal }
31+
}
32+
1833
pub enum Error {
1934
FileNotFoundForModule {
2035
mod_name: String,
@@ -1217,4 +1232,24 @@ impl<'a> Parser<'a> {
12171232
err.span_label(span, "expected expression");
12181233
err
12191234
}
1235+
1236+
/// Replace duplicated recovered arguments with `_` pattern to avoid unecessary errors.
1237+
crate fn deduplicate_recovered_arg_names(&self, fn_inputs: &mut Vec<Arg>) {
1238+
let mut seen_inputs = FxHashSet::default();
1239+
for input in fn_inputs.iter_mut() {
1240+
let opt_ident = if let (PatKind::Ident(_, ident, _), TyKind::Err) = (
1241+
&input.pat.node, &input.ty.node,
1242+
) {
1243+
Some(*ident)
1244+
} else {
1245+
None
1246+
};
1247+
if let Some(ident) = opt_ident {
1248+
if seen_inputs.contains(&ident) {
1249+
input.pat.node = PatKind::Wild;
1250+
}
1251+
seen_inputs.insert(ident);
1252+
}
1253+
}
1254+
}
12201255
}

src/libsyntax/parse/parser.rs

+2-33
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,10 @@ use crate::parse::PResult;
4747
use crate::ThinVec;
4848
use crate::tokenstream::{self, DelimSpan, TokenTree, TokenStream, TreeAndJoint};
4949
use crate::symbol::{kw, sym, Symbol};
50-
use crate::parse::diagnostics::Error;
50+
use crate::parse::diagnostics::{Error, dummy_arg};
5151

5252
use errors::{Applicability, DiagnosticBuilder, DiagnosticId, FatalError};
5353
use rustc_target::spec::abi::{self, Abi};
54-
use rustc_data_structures::fx::FxHashSet;
5554
use syntax_pos::{Span, BytePos, DUMMY_SP, FileName, hygiene::CompilerDesugaringKind};
5655
use log::debug;
5756

@@ -452,21 +451,6 @@ impl From<P<Expr>> for LhsExpr {
452451
}
453452
}
454453

455-
/// Creates a placeholder argument.
456-
fn dummy_arg(ident: Ident) -> Arg {
457-
let pat = P(Pat {
458-
id: ast::DUMMY_NODE_ID,
459-
node: PatKind::Ident(BindingMode::ByValue(Mutability::Immutable), ident, None),
460-
span: ident.span,
461-
});
462-
let ty = Ty {
463-
node: TyKind::Err,
464-
span: ident.span,
465-
id: ast::DUMMY_NODE_ID
466-
};
467-
Arg { ty: P(ty), pat: pat, id: ast::DUMMY_NODE_ID, source: ast::ArgSource::Normal }
468-
}
469-
470454
#[derive(Copy, Clone, Debug)]
471455
crate enum TokenExpectType {
472456
Expect,
@@ -5617,22 +5601,7 @@ impl<'a> Parser<'a> {
56175601
self.expect(&token::CloseDelim(token::Paren))?;
56185602
}
56195603
// Replace duplicated recovered arguments with `_` pattern to avoid unecessary errors.
5620-
let mut seen_inputs = FxHashSet::default();
5621-
for input in fn_inputs.iter_mut() {
5622-
let opt_ident = if let (PatKind::Ident(_, ident, _), TyKind::Err) = (
5623-
&input.pat.node, &input.ty,
5624-
) {
5625-
Some(*ident)
5626-
} else {
5627-
None
5628-
};
5629-
if let Some(ident) = opt_ident {
5630-
if seen_inputs.contains(&ident) {
5631-
input.pat.node = PatKind::Wild;
5632-
}
5633-
seen_inputs.insert(ident);
5634-
}
5635-
}
5604+
self.deduplicate_recovered_arg_names(&mut fn_inputs);
56365605

56375606
Ok(P(FnDecl {
56385607
inputs: fn_inputs,

0 commit comments

Comments
 (0)