Remove now unreachable parse recovery code
StructLiteralNeedingParens is no longer reachable always giving precedence to StructLiteralNotAllowedHere. As an aside: The former error struct shouldn't've existed in the first place. We should've just used the latter in this branch.
This commit is contained in:
parent
82796dd858
commit
9f336ce2eb
6 changed files with 24 additions and 76 deletions
|
@ -40,9 +40,8 @@ use crate::errors::{
|
|||
HelpIdentifierStartsWithNumber, HelpUseLatestEdition, InInTypo, IncorrectAwait,
|
||||
IncorrectSemicolon, IncorrectUseOfAwait, IncorrectUseOfUse, PatternMethodParamWithoutBody,
|
||||
QuestionMarkInType, QuestionMarkInTypeSugg, SelfParamNotFirst, StructLiteralBodyWithoutPath,
|
||||
StructLiteralBodyWithoutPathSugg, StructLiteralNeedingParens, StructLiteralNeedingParensSugg,
|
||||
SuggAddMissingLetStmt, SuggEscapeIdentifier, SuggRemoveComma, TernaryOperator,
|
||||
UnexpectedConstInGenericParam, UnexpectedConstParamDeclaration,
|
||||
StructLiteralBodyWithoutPathSugg, SuggAddMissingLetStmt, SuggEscapeIdentifier, SuggRemoveComma,
|
||||
TernaryOperator, UnexpectedConstInGenericParam, UnexpectedConstParamDeclaration,
|
||||
UnexpectedConstParamDeclarationSugg, UnmatchedAngleBrackets, UseEqInstead, WrapType,
|
||||
};
|
||||
use crate::parser::attr::InnerAttrPolicy;
|
||||
|
@ -949,7 +948,6 @@ impl<'a> Parser<'a> {
|
|||
lo: Span,
|
||||
s: BlockCheckMode,
|
||||
maybe_struct_name: token::Token,
|
||||
can_be_struct_literal: bool,
|
||||
) -> Option<PResult<'a, P<Block>>> {
|
||||
if self.token.is_ident() && self.look_ahead(1, |t| t == &token::Colon) {
|
||||
// We might be having a struct literal where people forgot to include the path:
|
||||
|
@ -971,49 +969,27 @@ impl<'a> Parser<'a> {
|
|||
// fn foo() -> Foo {
|
||||
// field: value,
|
||||
// }
|
||||
let guar = err.delay_as_bug();
|
||||
// Suggest:
|
||||
// fn foo() -> Foo { Path {
|
||||
// field: value,
|
||||
// } }
|
||||
err.cancel();
|
||||
self.restore_snapshot(snapshot);
|
||||
if maybe_struct_name.is_ident() && can_be_struct_literal {
|
||||
// Account for `if Example { a: one(), }.is_pos() {}`.
|
||||
// expand `before` so that we take care of module path such as:
|
||||
// `foo::Bar { ... } `
|
||||
// we expect to suggest `(foo::Bar { ... })` instead of `foo::(Bar { ... })`
|
||||
let sm = self.psess.source_map();
|
||||
let before = maybe_struct_name.span.shrink_to_lo();
|
||||
if let Ok(extend_before) = sm.span_extend_prev_while(before, |t| {
|
||||
t.is_alphanumeric() || t == ':' || t == '_'
|
||||
}) {
|
||||
Err(self.dcx().create_err(StructLiteralNeedingParens {
|
||||
span: maybe_struct_name.span.to(expr.span),
|
||||
sugg: StructLiteralNeedingParensSugg {
|
||||
before: extend_before.shrink_to_lo(),
|
||||
after: expr.span.shrink_to_hi(),
|
||||
},
|
||||
}))
|
||||
} else {
|
||||
return None;
|
||||
}
|
||||
} else {
|
||||
// Suggest:
|
||||
// fn foo() -> Foo { Path {
|
||||
// field: value,
|
||||
// } }
|
||||
self.dcx().emit_err(StructLiteralBodyWithoutPath {
|
||||
span: expr.span,
|
||||
sugg: StructLiteralBodyWithoutPathSugg {
|
||||
before: expr.span.shrink_to_lo(),
|
||||
after: expr.span.shrink_to_hi(),
|
||||
},
|
||||
});
|
||||
Ok(self.mk_block(
|
||||
thin_vec![self.mk_stmt_err(expr.span, guar)],
|
||||
s,
|
||||
lo.to(self.prev_token.span),
|
||||
))
|
||||
}
|
||||
let guar = self.dcx().emit_err(StructLiteralBodyWithoutPath {
|
||||
span: expr.span,
|
||||
sugg: StructLiteralBodyWithoutPathSugg {
|
||||
before: expr.span.shrink_to_lo(),
|
||||
after: expr.span.shrink_to_hi(),
|
||||
},
|
||||
});
|
||||
Ok(self.mk_block(
|
||||
thin_vec![self.mk_stmt_err(expr.span, guar)],
|
||||
s,
|
||||
lo.to(self.prev_token.span),
|
||||
))
|
||||
}
|
||||
(Err(err), Ok(tail)) => {
|
||||
// We have a block tail that contains a somehow valid type ascription expr.
|
||||
// We have a block tail that contains a somehow valid expr.
|
||||
err.cancel();
|
||||
Ok(tail)
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue