diff --git a/src/parser.rs b/src/parser.rs index 8005acbc..c8f71d7c 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -622,28 +622,33 @@ impl Expr { | Self::Or(_) | Self::True(_) | Self::False(_) - | Self::Unit(_) => false, + | Self::Unit(_) + | Self::Assignment(_) => false, Self::StringConstant(_) | Self::Stmt(_) | Self::FnCall(_) - | Self::Assignment(_) | Self::Dot(_) | Self::Index(_) | Self::Array(_) | Self::Map(_) => match token { + #[cfg(not(feature = "no_index"))] Token::LeftBracket => true, _ => false, }, Self::Variable(_) => match token { - Token::LeftBracket | Token::LeftParen => true, + #[cfg(not(feature = "no_index"))] + Token::LeftBracket => true, + Token::LeftParen => true, Token::DoubleColon => true, _ => false, }, Self::Property(_) => match token { - Token::LeftBracket | Token::LeftParen => true, + #[cfg(not(feature = "no_index"))] + Token::LeftBracket => true, + Token::LeftParen => true, _ => false, }, } @@ -1267,7 +1272,11 @@ fn parse_primary<'a>( parse_index_chain(input, state, expr, token_pos, level + 1, allow_stmt_expr)? } // Unknown postfix operator - (expr, token) => panic!("unknown postfix operator {:?} for {:?}", token, expr), + (expr, token) => panic!( + "unknown postfix operator '{}' for {:?}", + token.syntax(), + expr + ), } } diff --git a/tests/string.rs b/tests/string.rs index b868f050..995bd76e 100644 --- a/tests/string.rs +++ b/tests/string.rs @@ -23,9 +23,24 @@ fn test_string() -> Result<(), Box> { assert_eq!(engine.eval::(r#""foo" + 123"#)?, "foo123"); #[cfg(not(feature = "no_object"))] - assert_eq!(engine.eval::("(42).to_string()")?, "42"); + assert_eq!(engine.eval::("to_string(42)")?, "42"); + + #[cfg(not(feature = "no_index"))] + assert_eq!(engine.eval::(r#"let y = "hello"; y[1]"#)?, 'e'); #[cfg(not(feature = "no_object"))] + assert_eq!(engine.eval::(r#"let y = "hello"; y.len"#)?, 5); + + #[cfg(not(feature = "no_object"))] + assert_eq!( + engine.eval::(r#"let y = "hello"; y.clear(); y.len"#)?, + 0 + ); + + assert_eq!(engine.eval::(r#"let y = "hello"; len(y)"#)?, 5); + + #[cfg(not(feature = "no_object"))] + #[cfg(not(feature = "no_index"))] assert_eq!(engine.eval::(r#"let y = "hello"; y[y.len-1]"#)?, 'o'); #[cfg(not(feature = "no_float"))]