about summary refs log tree commit diff
path: root/src/libsyntax/util/classify.rs
diff options
context:
space:
mode:
authorMazdak Farrokhzad <twingoow@gmail.com>2019-10-11 13:17:20 +0200
committerMazdak Farrokhzad <twingoow@gmail.com>2019-11-07 13:59:13 +0100
commit255b12a8d3ef3639b4b389fc56d93bd80f03d087 (patch)
tree3bcc219b41a690d86423a52261a8f5b5ed0875c0 /src/libsyntax/util/classify.rs
parent3667e6248ec18740ce57db7997333a30c991929b (diff)
downloadrust-255b12a8d3ef3639b4b389fc56d93bd80f03d087.tar.gz
rust-255b12a8d3ef3639b4b389fc56d93bd80f03d087.zip
move parse::classify -> util::classify
Diffstat (limited to 'src/libsyntax/util/classify.rs')
-rw-r--r--src/libsyntax/util/classify.rs25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/libsyntax/util/classify.rs b/src/libsyntax/util/classify.rs
new file mode 100644
index 00000000000..44560688750
--- /dev/null
+++ b/src/libsyntax/util/classify.rs
@@ -0,0 +1,25 @@
+//! Routines the parser uses to classify AST nodes
+
+// Predicates on exprs and stmts that the pretty-printer and parser use
+
+use crate::ast;
+
+/// Does this expression require a semicolon to be treated
+/// as a statement? The negation of this: 'can this expression
+/// be used as a statement without a semicolon' -- is used
+/// as an early-bail-out in the parser so that, for instance,
+///     if true {...} else {...}
+///      |x| 5
+/// isn't parsed as (if true {...} else {...} | x) | 5
+pub fn expr_requires_semi_to_be_stmt(e: &ast::Expr) -> bool {
+    match e.kind {
+        ast::ExprKind::If(..) |
+        ast::ExprKind::Match(..) |
+        ast::ExprKind::Block(..) |
+        ast::ExprKind::While(..) |
+        ast::ExprKind::Loop(..) |
+        ast::ExprKind::ForLoop(..) |
+        ast::ExprKind::TryBlock(..) => false,
+        _ => true,
+    }
+}