Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion crates/pine-ast/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,11 @@ pub enum Stmt {
type_qualifier: Option<TypeQualifier>,
type_annotation: Option<String>,
initializer: Option<Expr>,
is_varip: bool, // true for varip, false for var
is_varip: bool, // true for varip, false for var/non-var
/// true when the `var` or `varip` keyword was present — initialize once, retain across bars.
/// false for plain `float x = expr` — re-evaluate every bar.
#[serde(default)]
is_var_persistent: bool,
},
Assignment {
target: Expr, // Can be Variable or MemberAccess
Expand Down
215 changes: 199 additions & 16 deletions crates/pine-interpreter/src/lib.rs

Large diffs are not rendered by default.

23 changes: 17 additions & 6 deletions crates/pine-parser/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -407,22 +407,27 @@ impl Parser {
let type_qualifier = self.parse_optional_type_qualifier();

// Check for var or varip keyword (can be followed by type annotation)
let is_varip = if self.match_token(&[TokenType::Varip]) {
true
let (is_varip, is_var_persistent) = if self.match_token(&[TokenType::Varip]) {
(true, true)
} else if self.match_token(&[TokenType::Var]) {
false
(false, true)
} else if type_qualifier.is_some() {
// If we have a type qualifier but no var/varip, it's still a variable declaration
// e.g., const int x = 5
false
(false, false)
} else {
// Not a var/varip declaration, continue to other statement types
return self.check_type_annotated_declaration();
};

// Check if followed by type annotation: var int x = ..., var float y = ..., var label l = ...
let type_annotation = self.parse_optional_type_annotation();
self.typed_var_declaration_with_qualifier(type_qualifier, type_annotation, is_varip)
self.typed_var_declaration_with_qualifier(
type_qualifier,
type_annotation,
is_varip,
is_var_persistent,
)
}

fn check_type_annotated_declaration(&mut self) -> Result<Stmt, ParserError> {
Expand Down Expand Up @@ -723,14 +728,15 @@ impl Parser {
type_annotation: Option<String>,
is_varip: bool,
) -> Result<Stmt, ParserError> {
self.typed_var_declaration_with_qualifier(None, type_annotation, is_varip)
self.typed_var_declaration_with_qualifier(None, type_annotation, is_varip, false)
}

fn typed_var_declaration_with_qualifier(
&mut self,
type_qualifier: Option<pine_ast::TypeQualifier>,
type_annotation: Option<String>,
is_varip: bool,
is_var_persistent: bool,
) -> Result<Stmt, ParserError> {
let name = self.expect_identifier()?;

Expand All @@ -746,6 +752,7 @@ impl Parser {
type_annotation,
initializer,
is_varip,
is_var_persistent,
})
}

Expand Down Expand Up @@ -859,6 +866,7 @@ impl Parser {
type_annotation: None,
initializer,
is_varip: false,
is_var_persistent: false,
});
}

Expand All @@ -876,6 +884,7 @@ impl Parser {
type_annotation: None,
initializer,
is_varip: false,
is_var_persistent: false,
})
} else if p.match_token(&[TokenType::ColonAssign]) {
// This is a reassignment with :=
Expand Down Expand Up @@ -1910,11 +1919,13 @@ mod tests {
type_annotation,
initializer,
is_varip,
is_var_persistent,
} = &stmts[0]
{
assert_eq!(name, "x");
assert_eq!(*type_qualifier, None);
assert_eq!(*type_annotation, None);
assert!(*is_var_persistent, "var x = 10 must be persistent");
assert_eq!(
initializer.as_ref().unwrap(),
&Expr::Literal(Literal::Number(10.0))
Expand Down
9 changes: 6 additions & 3 deletions crates/pine-parser/testdata/basics/arithmetic_ast.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@
}
}
},
"is_varip": false
"is_varip": false,
"is_var_persistent": true
}
},
{
Expand All @@ -42,7 +43,8 @@
}
}
},
"is_varip": false
"is_varip": false,
"is_var_persistent": true
}
},
{
Expand All @@ -62,7 +64,8 @@
}
}
},
"is_varip": false
"is_varip": false,
"is_var_persistent": true
}
}
]
9 changes: 6 additions & 3 deletions crates/pine-parser/testdata/basics/comparison_ops_ast.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@
}
}
},
"is_varip": false
"is_varip": false,
"is_var_persistent": false
}
},
{
Expand All @@ -32,7 +33,8 @@
}
}
},
"is_varip": false
"is_varip": false,
"is_var_persistent": false
}
},
{
Expand Down Expand Up @@ -70,7 +72,8 @@
}
}
},
"is_varip": false
"is_varip": false,
"is_var_persistent": false
}
}
]
9 changes: 6 additions & 3 deletions crates/pine-parser/testdata/basics/decimal_numbers_ast.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
"Number": 0.5
}
},
"is_varip": false
"is_varip": false,
"is_var_persistent": false
}
},
{
Expand All @@ -20,7 +21,8 @@
"Number": 0.088
}
},
"is_varip": false
"is_varip": false,
"is_var_persistent": false
}
},
{
Expand All @@ -42,7 +44,8 @@
}
}
},
"is_varip": false
"is_varip": false,
"is_var_persistent": false
}
}
]
6 changes: 4 additions & 2 deletions crates/pine-parser/testdata/basics/simple_ast.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
"Number": 10.0
}
},
"is_varip": false
"is_varip": false,
"is_var_persistent": true
}
},
{
Expand All @@ -27,7 +28,8 @@
}
}
},
"is_varip": false
"is_varip": false,
"is_var_persistent": true
}
}
]
6 changes: 4 additions & 2 deletions crates/pine-parser/testdata/basics/var_int_ast.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@
}
}
},
"is_varip": false
"is_varip": false,
"is_var_persistent": true
}
},
{
Expand All @@ -25,7 +26,8 @@
"Number": 3.14
}
},
"is_varip": false
"is_varip": false,
"is_var_persistent": true
}
}
]
3 changes: 2 additions & 1 deletion crates/pine-parser/testdata/basics/varip_simple_ast.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
"Number": 0.0
}
},
"is_varip": true
"is_varip": true,
"is_var_persistent": true
}
},
{
Expand Down
6 changes: 4 additions & 2 deletions crates/pine-parser/testdata/control_flow/else_if_ast.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
"Number": 5.0
}
},
"is_varip": false
"is_varip": false,
"is_var_persistent": false
}
},
{
Expand All @@ -20,7 +21,8 @@
"Number": 0.0
}
},
"is_varip": false
"is_varip": false,
"is_var_persistent": false
}
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,8 @@
]
}
},
"is_varip": false
"is_varip": false,
"is_var_persistent": true
}
},
{
Expand All @@ -64,7 +65,8 @@
"Number": 0.0
}
},
"is_varip": false
"is_varip": false,
"is_var_persistent": true
}
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,8 @@
]
}
},
"is_varip": false
"is_varip": false,
"is_var_persistent": true
}
},
{
Expand All @@ -64,7 +65,8 @@
"Number": 0.0
}
},
"is_varip": false
"is_varip": false,
"is_var_persistent": true
}
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@
]
}
},
"is_varip": false
"is_varip": false,
"is_var_persistent": true
}
},
{
Expand All @@ -50,7 +51,8 @@
"Number": 0.0
}
},
"is_varip": false
"is_varip": false,
"is_var_persistent": true
}
},
{
Expand Down
12 changes: 8 additions & 4 deletions crates/pine-parser/testdata/control_flow/if_advanced_ast.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@
}
}
},
"is_varip": false
"is_varip": false,
"is_var_persistent": true
}
},
{
Expand Down Expand Up @@ -103,7 +104,8 @@
}
}
},
"is_varip": false
"is_varip": false,
"is_var_persistent": true
}
},
{
Expand Down Expand Up @@ -170,7 +172,8 @@
"Bool": true
}
},
"is_varip": false
"is_varip": false,
"is_var_persistent": true
}
},
{
Expand All @@ -193,7 +196,8 @@
"Number": 100.0
}
},
"is_varip": false
"is_varip": false,
"is_var_persistent": false
}
}
],
Expand Down
Loading