Skip to content

Commit fd030f9

Browse files
committed
Revert "Merge #4233"
This reverts commit a5f2b16, reversing changes made to c96b218.
1 parent a984587 commit fd030f9

File tree

9 files changed

+63
-30
lines changed

9 files changed

+63
-30
lines changed

crates/ra_hir_def/src/body/lower.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,10 @@ impl ExprCollector<'_> {
203203

204204
self.alloc_expr(Expr::If { condition, then_branch, else_branch }, syntax_ptr)
205205
}
206+
ast::Expr::TryBlockExpr(e) => {
207+
let body = self.collect_block_opt(e.body());
208+
self.alloc_expr(Expr::TryBlock { body }, syntax_ptr)
209+
}
206210
ast::Expr::BlockExpr(e) => self.collect_block(e),
207211
ast::Expr::LoopExpr(e) => {
208212
let body = self.collect_block_opt(e.loop_body());

crates/ra_hir_def/src/expr.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,9 @@ pub enum Expr {
101101
Try {
102102
expr: ExprId,
103103
},
104+
TryBlock {
105+
body: ExprId,
106+
},
104107
Cast {
105108
expr: ExprId,
106109
type_ref: TypeRef,
@@ -236,6 +239,7 @@ impl Expr {
236239
f(*expr);
237240
}
238241
}
242+
Expr::TryBlock { body } => f(*body),
239243
Expr::Loop { body } => f(*body),
240244
Expr::While { condition, body } => {
241245
f(*condition);

crates/ra_hir_ty/src/infer/expr.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,11 @@ impl<'a> InferenceContext<'a> {
7373
self.coerce_merge_branch(&then_ty, &else_ty)
7474
}
7575
Expr::Block { statements, tail } => self.infer_block(statements, *tail, expected),
76+
Expr::TryBlock { body } => {
77+
let _inner = self.infer_expr(*body, expected);
78+
// FIXME should be std::result::Result<{inner}, _>
79+
Ty::Unknown
80+
}
7681
Expr::Loop { body } => {
7782
self.infer_expr(*body, &Expectation::has_type(Ty::unit()));
7883
// FIXME handle break with value

crates/ra_parser/src/grammar/expressions/atom.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option<(CompletedMar
8484
T![box] => box_expr(p, None),
8585
T![for] => for_expr(p, None),
8686
T![while] => while_expr(p, None),
87-
T![try] => try_expr(p, None),
87+
T![try] => try_block_expr(p, None),
8888
LIFETIME if la == T![:] => {
8989
let m = p.start();
9090
label(p);
@@ -134,7 +134,7 @@ pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option<(CompletedMar
134134
}
135135
};
136136
let blocklike = match done.kind() {
137-
IF_EXPR | WHILE_EXPR | FOR_EXPR | LOOP_EXPR | MATCH_EXPR | BLOCK_EXPR | TRY_EXPR => {
137+
IF_EXPR | WHILE_EXPR | FOR_EXPR | LOOP_EXPR | MATCH_EXPR | BLOCK_EXPR | TRY_BLOCK_EXPR => {
138138
BlockLike::Block
139139
}
140140
_ => BlockLike::NotBlock,
@@ -532,7 +532,7 @@ fn break_expr(p: &mut Parser, r: Restrictions) -> CompletedMarker {
532532
// fn foo() {
533533
// let _ = try {};
534534
// }
535-
fn try_expr(p: &mut Parser, m: Option<Marker>) -> CompletedMarker {
535+
fn try_block_expr(p: &mut Parser, m: Option<Marker>) -> CompletedMarker {
536536
assert!(p.at(T![try]));
537537
let m = m.unwrap_or_else(|| p.start());
538538
// Special-case `try!` as macro.

crates/ra_parser/src/syntax_kind/generated.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ pub enum SyntaxKind {
191191
RECORD_LIT,
192192
RECORD_FIELD_LIST,
193193
RECORD_FIELD,
194+
TRY_BLOCK_EXPR,
194195
BOX_EXPR,
195196
CALL_EXPR,
196197
INDEX_EXPR,

crates/ra_syntax/src/ast.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,7 @@ use crate::{
1616
};
1717

1818
pub use self::{
19-
expr_extensions::{
20-
ArrayExprKind, BinOp, BlockModifier, ElseBranch, LiteralKind, PrefixOp, RangeOp,
21-
},
19+
expr_extensions::{ArrayExprKind, BinOp, ElseBranch, LiteralKind, PrefixOp, RangeOp},
2220
extensions::{
2321
AttrKind, FieldKind, NameOrNameRef, PathSegmentKind, SelfParamKind, SlicePatComponents,
2422
StructKind, TypeBoundKind, VisibilityKind,

crates/ra_syntax/src/ast/expr_extensions.rs

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ impl ast::Expr {
1616
| ast::Expr::WhileExpr(_)
1717
| ast::Expr::BlockExpr(_)
1818
| ast::Expr::MatchExpr(_)
19-
| ast::Expr::TryExpr(_) => true,
19+
| ast::Expr::TryBlockExpr(_) => true,
2020
_ => false,
2121
}
2222
}
@@ -359,22 +359,7 @@ impl ast::Literal {
359359
}
360360
}
361361

362-
pub enum BlockModifier {
363-
Async(SyntaxToken),
364-
Unsafe(SyntaxToken),
365-
}
366-
367362
impl ast::BlockExpr {
368-
pub fn modifier(&self) -> Option<BlockModifier> {
369-
if let Some(token) = self.async_token() {
370-
return Some(BlockModifier::Async(token));
371-
}
372-
if let Some(token) = self.unsafe_token() {
373-
return Some(BlockModifier::Unsafe(token));
374-
}
375-
None
376-
}
377-
378363
/// false if the block is an intrinsic part of the syntax and can't be
379364
/// replaced with arbitrary expression.
380365
///
@@ -383,15 +368,15 @@ impl ast::BlockExpr {
383368
/// const FOO: () = { stand_alone };
384369
/// ```
385370
pub fn is_standalone(&self) -> bool {
386-
if self.modifier().is_some() {
371+
if self.unsafe_token().is_some() || self.async_token().is_some() {
387372
return false;
388373
}
389-
let parent = match self.syntax().parent() {
390-
Some(it) => it,
374+
let kind = match self.syntax().parent() {
391375
None => return true,
376+
Some(it) => it.kind(),
392377
};
393-
match parent.kind() {
394-
FN_DEF | IF_EXPR | WHILE_EXPR | LOOP_EXPR => false,
378+
match kind {
379+
FN_DEF | IF_EXPR | WHILE_EXPR | LOOP_EXPR | TRY_BLOCK_EXPR => false,
395380
_ => true,
396381
}
397382
}

crates/ra_syntax/src/ast/generated/nodes.rs

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,16 @@ impl LoopExpr {
475475
pub fn loop_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![loop]) }
476476
}
477477

478+
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
479+
pub struct TryBlockExpr {
480+
pub(crate) syntax: SyntaxNode,
481+
}
482+
impl ast::AttrsOwner for TryBlockExpr {}
483+
impl TryBlockExpr {
484+
pub fn try_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![try]) }
485+
pub fn body(&self) -> Option<BlockExpr> { support::child(&self.syntax) }
486+
}
487+
478488
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
479489
pub struct ForExpr {
480490
pub(crate) syntax: SyntaxNode,
@@ -1467,6 +1477,7 @@ pub enum Expr {
14671477
FieldExpr(FieldExpr),
14681478
AwaitExpr(AwaitExpr),
14691479
TryExpr(TryExpr),
1480+
TryBlockExpr(TryBlockExpr),
14701481
CastExpr(CastExpr),
14711482
RefExpr(RefExpr),
14721483
PrefixExpr(PrefixExpr),
@@ -1949,6 +1960,17 @@ impl AstNode for LoopExpr {
19491960
}
19501961
fn syntax(&self) -> &SyntaxNode { &self.syntax }
19511962
}
1963+
impl AstNode for TryBlockExpr {
1964+
fn can_cast(kind: SyntaxKind) -> bool { kind == TRY_BLOCK_EXPR }
1965+
fn cast(syntax: SyntaxNode) -> Option<Self> {
1966+
if Self::can_cast(syntax.kind()) {
1967+
Some(Self { syntax })
1968+
} else {
1969+
None
1970+
}
1971+
}
1972+
fn syntax(&self) -> &SyntaxNode { &self.syntax }
1973+
}
19521974
impl AstNode for ForExpr {
19531975
fn can_cast(kind: SyntaxKind) -> bool { kind == FOR_EXPR }
19541976
fn cast(syntax: SyntaxNode) -> Option<Self> {
@@ -3290,6 +3312,9 @@ impl From<AwaitExpr> for Expr {
32903312
impl From<TryExpr> for Expr {
32913313
fn from(node: TryExpr) -> Expr { Expr::TryExpr(node) }
32923314
}
3315+
impl From<TryBlockExpr> for Expr {
3316+
fn from(node: TryBlockExpr) -> Expr { Expr::TryBlockExpr(node) }
3317+
}
32933318
impl From<CastExpr> for Expr {
32943319
fn from(node: CastExpr) -> Expr { Expr::CastExpr(node) }
32953320
}
@@ -3320,8 +3345,9 @@ impl AstNode for Expr {
33203345
TUPLE_EXPR | ARRAY_EXPR | PAREN_EXPR | PATH_EXPR | LAMBDA_EXPR | IF_EXPR
33213346
| LOOP_EXPR | FOR_EXPR | WHILE_EXPR | CONTINUE_EXPR | BREAK_EXPR | LABEL
33223347
| BLOCK_EXPR | RETURN_EXPR | MATCH_EXPR | RECORD_LIT | CALL_EXPR | INDEX_EXPR
3323-
| METHOD_CALL_EXPR | FIELD_EXPR | AWAIT_EXPR | TRY_EXPR | CAST_EXPR | REF_EXPR
3324-
| PREFIX_EXPR | RANGE_EXPR | BIN_EXPR | LITERAL | MACRO_CALL | BOX_EXPR => true,
3348+
| METHOD_CALL_EXPR | FIELD_EXPR | AWAIT_EXPR | TRY_EXPR | TRY_BLOCK_EXPR
3349+
| CAST_EXPR | REF_EXPR | PREFIX_EXPR | RANGE_EXPR | BIN_EXPR | LITERAL | MACRO_CALL
3350+
| BOX_EXPR => true,
33253351
_ => false,
33263352
}
33273353
}
@@ -3349,6 +3375,7 @@ impl AstNode for Expr {
33493375
FIELD_EXPR => Expr::FieldExpr(FieldExpr { syntax }),
33503376
AWAIT_EXPR => Expr::AwaitExpr(AwaitExpr { syntax }),
33513377
TRY_EXPR => Expr::TryExpr(TryExpr { syntax }),
3378+
TRY_BLOCK_EXPR => Expr::TryBlockExpr(TryBlockExpr { syntax }),
33523379
CAST_EXPR => Expr::CastExpr(CastExpr { syntax }),
33533380
REF_EXPR => Expr::RefExpr(RefExpr { syntax }),
33543381
PREFIX_EXPR => Expr::PrefixExpr(PrefixExpr { syntax }),
@@ -3385,6 +3412,7 @@ impl AstNode for Expr {
33853412
Expr::FieldExpr(it) => &it.syntax,
33863413
Expr::AwaitExpr(it) => &it.syntax,
33873414
Expr::TryExpr(it) => &it.syntax,
3415+
Expr::TryBlockExpr(it) => &it.syntax,
33883416
Expr::CastExpr(it) => &it.syntax,
33893417
Expr::RefExpr(it) => &it.syntax,
33903418
Expr::PrefixExpr(it) => &it.syntax,
@@ -3865,6 +3893,11 @@ impl std::fmt::Display for LoopExpr {
38653893
std::fmt::Display::fmt(self.syntax(), f)
38663894
}
38673895
}
3896+
impl std::fmt::Display for TryBlockExpr {
3897+
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
3898+
std::fmt::Display::fmt(self.syntax(), f)
3899+
}
3900+
}
38683901
impl std::fmt::Display for ForExpr {
38693902
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
38703903
std::fmt::Display::fmt(self.syntax(), f)

xtask/src/ast_src.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ pub(crate) const KINDS_SRC: KindsSrc = KindsSrc {
162162
"RECORD_LIT",
163163
"RECORD_FIELD_LIST",
164164
"RECORD_FIELD",
165+
"TRY_BLOCK_EXPR",
165166
"BOX_EXPR",
166167
// postfix
167168
"CALL_EXPR",
@@ -439,6 +440,7 @@ pub(crate) const AST_SRC: AstSrc = AstSrc {
439440
}
440441
struct IfExpr: AttrsOwner { T![if], Condition }
441442
struct LoopExpr: AttrsOwner, LoopBodyOwner { T![loop] }
443+
struct TryBlockExpr: AttrsOwner { T![try], body: BlockExpr }
442444
struct ForExpr: AttrsOwner, LoopBodyOwner {
443445
T![for],
444446
Pat,
@@ -449,7 +451,7 @@ pub(crate) const AST_SRC: AstSrc = AstSrc {
449451
struct ContinueExpr: AttrsOwner { T![continue], T![lifetime] }
450452
struct BreakExpr: AttrsOwner { T![break], T![lifetime], Expr }
451453
struct Label { T![lifetime] }
452-
struct BlockExpr: AttrsOwner { Label, T![unsafe], T![async], Block }
454+
struct BlockExpr: AttrsOwner { Label, T![unsafe], T![async], Block }
453455
struct ReturnExpr: AttrsOwner { Expr }
454456
struct CallExpr: ArgListOwner { Expr }
455457
struct MethodCallExpr: AttrsOwner, ArgListOwner {
@@ -720,6 +722,7 @@ pub(crate) const AST_SRC: AstSrc = AstSrc {
720722
FieldExpr,
721723
AwaitExpr,
722724
TryExpr,
725+
TryBlockExpr,
723726
CastExpr,
724727
RefExpr,
725728
PrefixExpr,

0 commit comments

Comments
 (0)