]> git.lizzy.rs Git - rust.git/commitdiff
Revert "Merge #4233"
authorAleksey Kladov <aleksey.kladov@gmail.com>
Fri, 1 May 2020 23:12:37 +0000 (01:12 +0200)
committerAleksey Kladov <aleksey.kladov@gmail.com>
Fri, 1 May 2020 23:12:37 +0000 (01:12 +0200)
This reverts commit a5f2b16366f027ad60c58266a66eb7fbdcbda9f9, reversing
changes made to c96b2180c1c4206a0a98c280b4d30897eb116336.

crates/ra_hir_def/src/body/lower.rs
crates/ra_hir_def/src/expr.rs
crates/ra_hir_ty/src/infer/expr.rs
crates/ra_parser/src/grammar/expressions/atom.rs
crates/ra_parser/src/syntax_kind/generated.rs
crates/ra_syntax/src/ast.rs
crates/ra_syntax/src/ast/expr_extensions.rs
crates/ra_syntax/src/ast/generated/nodes.rs
xtask/src/ast_src.rs

index e9dd65b0a436894f5b74b16c794ed102b32abafc..f06cc115b1d68bfbaeb005c538a6e9e8504787e4 100644 (file)
@@ -203,6 +203,10 @@ fn collect_expr(&mut self, expr: ast::Expr) -> ExprId {
 
                 self.alloc_expr(Expr::If { condition, then_branch, else_branch }, syntax_ptr)
             }
+            ast::Expr::TryBlockExpr(e) => {
+                let body = self.collect_block_opt(e.body());
+                self.alloc_expr(Expr::TryBlock { body }, syntax_ptr)
+            }
             ast::Expr::BlockExpr(e) => self.collect_block(e),
             ast::Expr::LoopExpr(e) => {
                 let body = self.collect_block_opt(e.loop_body());
index aad12e1235d3e6fe60dc2689d278da35e27b207e..a0cdad529b3fb8404e4216df17ab6cb353a912cd 100644 (file)
@@ -101,6 +101,9 @@ pub enum Expr {
     Try {
         expr: ExprId,
     },
+    TryBlock {
+        body: ExprId,
+    },
     Cast {
         expr: ExprId,
         type_ref: TypeRef,
@@ -236,6 +239,7 @@ pub fn walk_child_exprs(&self, mut f: impl FnMut(ExprId)) {
                     f(*expr);
                 }
             }
+            Expr::TryBlock { body } => f(*body),
             Expr::Loop { body } => f(*body),
             Expr::While { condition, body } => {
                 f(*condition);
index efc60986bd03af2b51b485f1b6c272dd72364cca..83f946eeea0567155459f8931d878ac4cfa6188d 100644 (file)
@@ -73,6 +73,11 @@ fn infer_expr_inner(&mut self, tgt_expr: ExprId, expected: &Expectation) -> Ty {
                 self.coerce_merge_branch(&then_ty, &else_ty)
             }
             Expr::Block { statements, tail } => self.infer_block(statements, *tail, expected),
+            Expr::TryBlock { body } => {
+                let _inner = self.infer_expr(*body, expected);
+                // FIXME should be std::result::Result<{inner}, _>
+                Ty::Unknown
+            }
             Expr::Loop { body } => {
                 self.infer_expr(*body, &Expectation::has_type(Ty::unit()));
                 // FIXME handle break with value
index 76aa601cb56c4561e5416446d7e54aef0d79c688..166dfc472b0ff7113975ead362499b0e99357696 100644 (file)
@@ -84,7 +84,7 @@ pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option<(CompletedMar
         T![box] => box_expr(p, None),
         T![for] => for_expr(p, None),
         T![while] => while_expr(p, None),
-        T![try] => try_expr(p, None),
+        T![try] => try_block_expr(p, None),
         LIFETIME if la == T![:] => {
             let m = p.start();
             label(p);
@@ -134,7 +134,7 @@ pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option<(CompletedMar
         }
     };
     let blocklike = match done.kind() {
-        IF_EXPR | WHILE_EXPR | FOR_EXPR | LOOP_EXPR | MATCH_EXPR | BLOCK_EXPR | TRY_EXPR => {
+        IF_EXPR | WHILE_EXPR | FOR_EXPR | LOOP_EXPR | MATCH_EXPR | BLOCK_EXPR | TRY_BLOCK_EXPR => {
             BlockLike::Block
         }
         _ => BlockLike::NotBlock,
@@ -532,7 +532,7 @@ fn break_expr(p: &mut Parser, r: Restrictions) -> CompletedMarker {
 // fn foo() {
 //     let _ = try {};
 // }
-fn try_expr(p: &mut Parser, m: Option<Marker>) -> CompletedMarker {
+fn try_block_expr(p: &mut Parser, m: Option<Marker>) -> CompletedMarker {
     assert!(p.at(T![try]));
     let m = m.unwrap_or_else(|| p.start());
     // Special-case `try!` as macro.
index ab727ed7e18dcbeadf78ef7231fb9d843ef0c803..524e7d784e5be057537bbe56033875a15b0cec2f 100644 (file)
@@ -191,6 +191,7 @@ pub enum SyntaxKind {
     RECORD_LIT,
     RECORD_FIELD_LIST,
     RECORD_FIELD,
+    TRY_BLOCK_EXPR,
     BOX_EXPR,
     CALL_EXPR,
     INDEX_EXPR,
index 521ca8ab8eda3a18034d0b44d334adad5f1a2d82..a716e525b9520a828b3ab0ccc11f77054d318120 100644 (file)
@@ -16,9 +16,7 @@
 };
 
 pub use self::{
-    expr_extensions::{
-        ArrayExprKind, BinOp, BlockModifier, ElseBranch, LiteralKind, PrefixOp, RangeOp,
-    },
+    expr_extensions::{ArrayExprKind, BinOp, ElseBranch, LiteralKind, PrefixOp, RangeOp},
     extensions::{
         AttrKind, FieldKind, NameOrNameRef, PathSegmentKind, SelfParamKind, SlicePatComponents,
         StructKind, TypeBoundKind, VisibilityKind,
index 352c0d2c57e2226ff403a17af2073563b37d30a7..ecf74fd3662fdb1f7fd51d6d33a5fe05c1b3ffd1 100644 (file)
@@ -16,7 +16,7 @@ pub fn is_block_like(&self) -> bool {
             | ast::Expr::WhileExpr(_)
             | ast::Expr::BlockExpr(_)
             | ast::Expr::MatchExpr(_)
-            | ast::Expr::TryExpr(_) => true,
+            | ast::Expr::TryBlockExpr(_) => true,
             _ => false,
         }
     }
@@ -359,22 +359,7 @@ pub fn kind(&self) -> LiteralKind {
     }
 }
 
-pub enum BlockModifier {
-    Async(SyntaxToken),
-    Unsafe(SyntaxToken),
-}
-
 impl ast::BlockExpr {
-    pub fn modifier(&self) -> Option<BlockModifier> {
-        if let Some(token) = self.async_token() {
-            return Some(BlockModifier::Async(token));
-        }
-        if let Some(token) = self.unsafe_token() {
-            return Some(BlockModifier::Unsafe(token));
-        }
-        None
-    }
-
     /// false if the block is an intrinsic part of the syntax and can't be
     /// replaced with arbitrary expression.
     ///
@@ -383,15 +368,15 @@ pub fn modifier(&self) -> Option<BlockModifier> {
     /// const FOO: () = { stand_alone };
     /// ```
     pub fn is_standalone(&self) -> bool {
-        if self.modifier().is_some() {
+        if self.unsafe_token().is_some() || self.async_token().is_some() {
             return false;
         }
-        let parent = match self.syntax().parent() {
-            Some(it) => it,
+        let kind = match self.syntax().parent() {
             None => return true,
+            Some(it) => it.kind(),
         };
-        match parent.kind() {
-            FN_DEF | IF_EXPR | WHILE_EXPR | LOOP_EXPR => false,
+        match kind {
+            FN_DEF | IF_EXPR | WHILE_EXPR | LOOP_EXPR | TRY_BLOCK_EXPR => false,
             _ => true,
         }
     }
index 3f16592b69c9ad6c4a4af70157db75d5174b849f..2096f12f1b6ae5ba2ac6a9888142d8e7c533ce6b 100644 (file)
@@ -475,6 +475,16 @@ impl LoopExpr {
     pub fn loop_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![loop]) }
 }
 
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub struct TryBlockExpr {
+    pub(crate) syntax: SyntaxNode,
+}
+impl ast::AttrsOwner for TryBlockExpr {}
+impl TryBlockExpr {
+    pub fn try_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![try]) }
+    pub fn body(&self) -> Option<BlockExpr> { support::child(&self.syntax) }
+}
+
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub struct ForExpr {
     pub(crate) syntax: SyntaxNode,
@@ -1467,6 +1477,7 @@ pub enum Expr {
     FieldExpr(FieldExpr),
     AwaitExpr(AwaitExpr),
     TryExpr(TryExpr),
+    TryBlockExpr(TryBlockExpr),
     CastExpr(CastExpr),
     RefExpr(RefExpr),
     PrefixExpr(PrefixExpr),
@@ -1949,6 +1960,17 @@ fn cast(syntax: SyntaxNode) -> Option<Self> {
     }
     fn syntax(&self) -> &SyntaxNode { &self.syntax }
 }
+impl AstNode for TryBlockExpr {
+    fn can_cast(kind: SyntaxKind) -> bool { kind == TRY_BLOCK_EXPR }
+    fn cast(syntax: SyntaxNode) -> Option<Self> {
+        if Self::can_cast(syntax.kind()) {
+            Some(Self { syntax })
+        } else {
+            None
+        }
+    }
+    fn syntax(&self) -> &SyntaxNode { &self.syntax }
+}
 impl AstNode for ForExpr {
     fn can_cast(kind: SyntaxKind) -> bool { kind == FOR_EXPR }
     fn cast(syntax: SyntaxNode) -> Option<Self> {
@@ -3290,6 +3312,9 @@ fn from(node: AwaitExpr) -> Expr { Expr::AwaitExpr(node) }
 impl From<TryExpr> for Expr {
     fn from(node: TryExpr) -> Expr { Expr::TryExpr(node) }
 }
+impl From<TryBlockExpr> for Expr {
+    fn from(node: TryBlockExpr) -> Expr { Expr::TryBlockExpr(node) }
+}
 impl From<CastExpr> for Expr {
     fn from(node: CastExpr) -> Expr { Expr::CastExpr(node) }
 }
@@ -3320,8 +3345,9 @@ fn can_cast(kind: SyntaxKind) -> bool {
             TUPLE_EXPR | ARRAY_EXPR | PAREN_EXPR | PATH_EXPR | LAMBDA_EXPR | IF_EXPR
             | LOOP_EXPR | FOR_EXPR | WHILE_EXPR | CONTINUE_EXPR | BREAK_EXPR | LABEL
             | BLOCK_EXPR | RETURN_EXPR | MATCH_EXPR | RECORD_LIT | CALL_EXPR | INDEX_EXPR
-            | METHOD_CALL_EXPR | FIELD_EXPR | AWAIT_EXPR | TRY_EXPR | CAST_EXPR | REF_EXPR
-            | PREFIX_EXPR | RANGE_EXPR | BIN_EXPR | LITERAL | MACRO_CALL | BOX_EXPR => true,
+            | METHOD_CALL_EXPR | FIELD_EXPR | AWAIT_EXPR | TRY_EXPR | TRY_BLOCK_EXPR
+            | CAST_EXPR | REF_EXPR | PREFIX_EXPR | RANGE_EXPR | BIN_EXPR | LITERAL | MACRO_CALL
+            | BOX_EXPR => true,
             _ => false,
         }
     }
@@ -3349,6 +3375,7 @@ fn cast(syntax: SyntaxNode) -> Option<Self> {
             FIELD_EXPR => Expr::FieldExpr(FieldExpr { syntax }),
             AWAIT_EXPR => Expr::AwaitExpr(AwaitExpr { syntax }),
             TRY_EXPR => Expr::TryExpr(TryExpr { syntax }),
+            TRY_BLOCK_EXPR => Expr::TryBlockExpr(TryBlockExpr { syntax }),
             CAST_EXPR => Expr::CastExpr(CastExpr { syntax }),
             REF_EXPR => Expr::RefExpr(RefExpr { syntax }),
             PREFIX_EXPR => Expr::PrefixExpr(PrefixExpr { syntax }),
@@ -3385,6 +3412,7 @@ fn syntax(&self) -> &SyntaxNode {
             Expr::FieldExpr(it) => &it.syntax,
             Expr::AwaitExpr(it) => &it.syntax,
             Expr::TryExpr(it) => &it.syntax,
+            Expr::TryBlockExpr(it) => &it.syntax,
             Expr::CastExpr(it) => &it.syntax,
             Expr::RefExpr(it) => &it.syntax,
             Expr::PrefixExpr(it) => &it.syntax,
@@ -3865,6 +3893,11 @@ fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
         std::fmt::Display::fmt(self.syntax(), f)
     }
 }
+impl std::fmt::Display for TryBlockExpr {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        std::fmt::Display::fmt(self.syntax(), f)
+    }
+}
 impl std::fmt::Display for ForExpr {
     fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
         std::fmt::Display::fmt(self.syntax(), f)
index 703fb9be995e15572e2bfe764397610dc2c4dba1..1abb62f6faecdde90dd13da2f75fe43e54097a40 100644 (file)
@@ -162,6 +162,7 @@ pub(crate) struct KindsSrc<'a> {
         "RECORD_LIT",
         "RECORD_FIELD_LIST",
         "RECORD_FIELD",
+        "TRY_BLOCK_EXPR",
         "BOX_EXPR",
         // postfix
         "CALL_EXPR",
@@ -439,6 +440,7 @@ struct LambdaExpr: AttrsOwner {
         }
         struct IfExpr: AttrsOwner { T![if], Condition }
         struct LoopExpr: AttrsOwner, LoopBodyOwner { T![loop] }
+        struct TryBlockExpr: AttrsOwner { T![try], body: BlockExpr }
         struct ForExpr: AttrsOwner, LoopBodyOwner {
             T![for],
             Pat,
@@ -449,7 +451,7 @@ struct WhileExpr: AttrsOwner, LoopBodyOwner { T![while], Condition }
         struct ContinueExpr: AttrsOwner { T![continue], T![lifetime] }
         struct BreakExpr: AttrsOwner { T![break], T![lifetime], Expr }
         struct Label { T![lifetime] }
-        struct BlockExpr: AttrsOwner { Label, T![unsafe], T![async], Block }
+        struct BlockExpr: AttrsOwner { Label, T![unsafe], T![async], Block  }
         struct ReturnExpr: AttrsOwner { Expr }
         struct CallExpr: ArgListOwner { Expr }
         struct MethodCallExpr: AttrsOwner, ArgListOwner {
@@ -720,6 +722,7 @@ enum Expr: AttrsOwner {
             FieldExpr,
             AwaitExpr,
             TryExpr,
+            TryBlockExpr,
             CastExpr,
             RefExpr,
             PrefixExpr,