提交 71c08734 编写于 作者: E Esteban Küber

Move `ExprPrecedence` to `libsyntax/util/parser.rs`

上级 afe8d13a
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
use syntax::symbol::{Symbol, keywords}; use syntax::symbol::{Symbol, keywords};
use syntax::tokenstream::TokenStream; use syntax::tokenstream::TokenStream;
use syntax::util::ThinVec; use syntax::util::ThinVec;
use syntax::ast::ExprPrecedence; use syntax::util::parser::ExprPrecedence;
use ty::AdtKind; use ty::AdtKind;
use rustc_data_structures::indexed_vec; use rustc_data_structures::indexed_vec;
......
...@@ -15,17 +15,7 @@ ...@@ -15,17 +15,7 @@
pub use self::PathParameters::*; pub use self::PathParameters::*;
pub use symbol::{Ident, Symbol as Name}; pub use symbol::{Ident, Symbol as Name};
pub use util::ThinVec; pub use util::ThinVec;
pub use util::parser::{ pub use util::parser::ExprPrecedence;
AssocOp,
PREC_RESET,
PREC_CLOSURE,
PREC_JUMP,
PREC_RANGE,
PREC_PREFIX,
PREC_POSTFIX,
PREC_PAREN,
PREC_FORCE_PAREN,
};
use syntax_pos::{Span, DUMMY_SP}; use syntax_pos::{Span, DUMMY_SP};
use codemap::{respan, Spanned}; use codemap::{respan, Spanned};
...@@ -39,7 +29,6 @@ ...@@ -39,7 +29,6 @@
use serialize::{self, Encoder, Decoder}; use serialize::{self, Encoder, Decoder};
use std::collections::HashSet; use std::collections::HashSet;
use std::cmp::Ordering;
use std::fmt; use std::fmt;
use std::rc::Rc; use std::rc::Rc;
use std::u32; use std::u32;
...@@ -917,129 +906,6 @@ pub struct Expr { ...@@ -917,129 +906,6 @@ pub struct Expr {
pub attrs: ThinVec<Attribute> pub attrs: ThinVec<Attribute>
} }
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ExprPrecedence {
Closure,
Break,
Continue,
Ret,
Yield,
Range,
Binary(BinOpKind),
InPlace,
Cast,
Type,
Assign,
AssignOp,
Box,
AddrOf,
Unary,
Call,
MethodCall,
Field,
TupField,
Index,
Try,
InlineAsm,
Mac,
Array,
Repeat,
Tup,
Lit,
Path,
Paren,
If,
IfLet,
While,
WhileLet,
ForLoop,
Loop,
Match,
Block,
Catch,
Struct,
}
impl PartialOrd for ExprPrecedence {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.order().cmp(&other.order()))
}
}
impl Ord for ExprPrecedence {
fn cmp(&self, other: &Self) -> Ordering {
self.order().cmp(&other.order())
}
}
impl ExprPrecedence {
pub fn order(self) -> i8 {
match self {
ExprPrecedence::Closure => PREC_CLOSURE,
ExprPrecedence::Break |
ExprPrecedence::Continue |
ExprPrecedence::Ret |
ExprPrecedence::Yield => PREC_JUMP,
// `Range` claims to have higher precedence than `Assign`, but `x .. x = x` fails to
// parse, instead of parsing as `(x .. x) = x`. Giving `Range` a lower precedence
// ensures that `pprust` will add parentheses in the right places to get the desired
// parse.
ExprPrecedence::Range => PREC_RANGE,
// Binop-like expr kinds, handled by `AssocOp`.
ExprPrecedence::Binary(op) => AssocOp::from_ast_binop(op).precedence() as i8,
ExprPrecedence::InPlace => AssocOp::Inplace.precedence() as i8,
ExprPrecedence::Cast => AssocOp::As.precedence() as i8,
ExprPrecedence::Type => AssocOp::Colon.precedence() as i8,
ExprPrecedence::Assign |
ExprPrecedence::AssignOp => AssocOp::Assign.precedence() as i8,
// Unary, prefix
ExprPrecedence::Box |
ExprPrecedence::AddrOf |
ExprPrecedence::Unary => PREC_PREFIX,
// Unary, postfix
ExprPrecedence::Call |
ExprPrecedence::MethodCall |
ExprPrecedence::Field |
ExprPrecedence::TupField |
ExprPrecedence::Index |
ExprPrecedence::Try |
ExprPrecedence::InlineAsm |
ExprPrecedence::Mac => PREC_POSTFIX,
// Never need parens
ExprPrecedence::Array |
ExprPrecedence::Repeat |
ExprPrecedence::Tup |
ExprPrecedence::Lit |
ExprPrecedence::Path |
ExprPrecedence::Paren |
ExprPrecedence::If |
ExprPrecedence::IfLet |
ExprPrecedence::While |
ExprPrecedence::WhileLet |
ExprPrecedence::ForLoop |
ExprPrecedence::Loop |
ExprPrecedence::Match |
ExprPrecedence::Block |
ExprPrecedence::Catch |
ExprPrecedence::Struct => PREC_PAREN,
}
}
}
impl Expr { impl Expr {
/// Wether this expression would be valid somewhere that expects a value, for example, an `if` /// Wether this expression would be valid somewhere that expects a value, for example, an `if`
/// condition. /// condition.
......
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
use symbol::keywords; use symbol::keywords;
use ast::{self, BinOpKind}; use ast::{self, BinOpKind};
use std::cmp::Ordering;
/// Associative operator with precedence. /// Associative operator with precedence.
/// ///
/// This is the enum which specifies operator precedence and fixity to the parser. /// This is the enum which specifies operator precedence and fixity to the parser.
...@@ -228,6 +230,130 @@ pub fn to_ast_binop(&self) -> Option<BinOpKind> { ...@@ -228,6 +230,130 @@ pub fn to_ast_binop(&self) -> Option<BinOpKind> {
pub const PREC_PAREN: i8 = 99; pub const PREC_PAREN: i8 = 99;
pub const PREC_FORCE_PAREN: i8 = 100; pub const PREC_FORCE_PAREN: i8 = 100;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ExprPrecedence {
Closure,
Break,
Continue,
Ret,
Yield,
Range,
Binary(BinOpKind),
InPlace,
Cast,
Type,
Assign,
AssignOp,
Box,
AddrOf,
Unary,
Call,
MethodCall,
Field,
TupField,
Index,
Try,
InlineAsm,
Mac,
Array,
Repeat,
Tup,
Lit,
Path,
Paren,
If,
IfLet,
While,
WhileLet,
ForLoop,
Loop,
Match,
Block,
Catch,
Struct,
}
impl PartialOrd for ExprPrecedence {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.order().cmp(&other.order()))
}
}
impl Ord for ExprPrecedence {
fn cmp(&self, other: &Self) -> Ordering {
self.order().cmp(&other.order())
}
}
impl ExprPrecedence {
pub fn order(self) -> i8 {
match self {
ExprPrecedence::Closure => PREC_CLOSURE,
ExprPrecedence::Break |
ExprPrecedence::Continue |
ExprPrecedence::Ret |
ExprPrecedence::Yield => PREC_JUMP,
// `Range` claims to have higher precedence than `Assign`, but `x .. x = x` fails to
// parse, instead of parsing as `(x .. x) = x`. Giving `Range` a lower precedence
// ensures that `pprust` will add parentheses in the right places to get the desired
// parse.
ExprPrecedence::Range => PREC_RANGE,
// Binop-like expr kinds, handled by `AssocOp`.
ExprPrecedence::Binary(op) => AssocOp::from_ast_binop(op).precedence() as i8,
ExprPrecedence::InPlace => AssocOp::Inplace.precedence() as i8,
ExprPrecedence::Cast => AssocOp::As.precedence() as i8,
ExprPrecedence::Type => AssocOp::Colon.precedence() as i8,
ExprPrecedence::Assign |
ExprPrecedence::AssignOp => AssocOp::Assign.precedence() as i8,
// Unary, prefix
ExprPrecedence::Box |
ExprPrecedence::AddrOf |
ExprPrecedence::Unary => PREC_PREFIX,
// Unary, postfix
ExprPrecedence::Call |
ExprPrecedence::MethodCall |
ExprPrecedence::Field |
ExprPrecedence::TupField |
ExprPrecedence::Index |
ExprPrecedence::Try |
ExprPrecedence::InlineAsm |
ExprPrecedence::Mac => PREC_POSTFIX,
// Never need parens
ExprPrecedence::Array |
ExprPrecedence::Repeat |
ExprPrecedence::Tup |
ExprPrecedence::Lit |
ExprPrecedence::Path |
ExprPrecedence::Paren |
ExprPrecedence::If |
ExprPrecedence::IfLet |
ExprPrecedence::While |
ExprPrecedence::WhileLet |
ExprPrecedence::ForLoop |
ExprPrecedence::Loop |
ExprPrecedence::Match |
ExprPrecedence::Block |
ExprPrecedence::Catch |
ExprPrecedence::Struct => PREC_PAREN,
}
}
}
/// Expressions that syntactically contain an "exterior" struct literal i.e. not surrounded by any /// Expressions that syntactically contain an "exterior" struct literal i.e. not surrounded by any
/// parens or other delimiters, e.g. `X { y: 1 }`, `X { y: 1 }.method()`, `foo == X { y: 1 }` and /// parens or other delimiters, e.g. `X { y: 1 }`, `X { y: 1 }.method()`, `foo == X { y: 1 }` and
/// `X { y: 1 } == foo` all do, but `(X { y: 1 }) == foo` does not. /// `X { y: 1 } == foo` all do, but `(X { y: 1 }) == foo` does not.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册