Default switch case must be last.

This commit is contained in:
Stephen Chung
2021-04-16 09:41:02 +08:00
parent 187dbe537f
commit 8da4c0c2b2
3 changed files with 9 additions and 2 deletions

View File

@@ -113,8 +113,10 @@ pub enum ParseErrorType {
///
/// Never appears under the `no_object` feature.
DuplicatedProperty(String),
/// A switch case is duplicated.
/// A `switch` case is duplicated.
DuplicatedSwitchCase,
/// The default case of a `switch` statement is not the last.
WrongSwitchDefaultCase,
/// Missing a property name for custom types and maps.
///
/// Never appears under the `no_object` feature.
@@ -195,6 +197,7 @@ impl ParseErrorType {
Self::MalformedCapture(_) => "Invalid capturing",
Self::DuplicatedProperty(_) => "Duplicated property in object map literal",
Self::DuplicatedSwitchCase => "Duplicated switch case",
Self::WrongSwitchDefaultCase => "Default switch case is not the last",
Self::PropertyExpected => "Expecting name of a property",
Self::VariableExpected => "Expecting name of a variable",
Self::Reserved(_) => "Invalid use of reserved keyword",

View File

@@ -809,6 +809,7 @@ fn parse_switch(
}
let mut table = BTreeMap::<u64, Box<StmtBlock>>::new();
let mut def_pos = Position::NONE;
let mut def_stmt = None;
loop {
@@ -825,11 +826,13 @@ fn parse_switch(
.into_err(*pos),
)
}
(Token::Underscore, _) if def_stmt.is_none() => {
(Token::Underscore, pos) if def_stmt.is_none() => {
def_pos = *pos;
eat_token(input, Token::Underscore);
None
}
(Token::Underscore, pos) => return Err(PERR::DuplicatedSwitchCase.into_err(*pos)),
_ if def_stmt.is_some() => return Err(PERR::WrongSwitchDefaultCase.into_err(def_pos)),
_ => Some(parse_expr(input, state, lib, settings.level_up())?),
};