2022-04-07 18:48:38 +00:00
|
|
|
////////////////////////////
|
|
|
|
// Automatically Generated//
|
|
|
|
////////////////////////////
|
|
|
|
use crate::logger::messages::Message;
|
|
|
|
use crate::parsing::lexer::lex;
|
|
|
|
use crate::parsing::lexer::lex_tokens::LexToken;
|
|
|
|
use crate::parsing::parser::parse;
|
|
|
|
use crate::parsing::parser::parsed_statement::ParsedStatement;
|
|
|
|
use crate::span::Span;
|
|
|
|
|
|
|
|
fn ignore_error(_msg: Message, _: Span) {
|
|
|
|
}
|
|
|
|
|
|
|
|
fn panic_on_error(msg: Message, _: Span) {
|
|
|
|
std::panic::panic_any(msg.stringify());
|
|
|
|
}
|
|
|
|
#[test]
|
|
|
|
fn integration_class_with_many_statements() {
|
|
|
|
let script = "final shared class Foobar {
|
|
|
|
int _a;
|
|
|
|
int _b;
|
|
|
|
|
|
|
|
Foobar(int a, int b) {
|
|
|
|
_a = a;
|
|
|
|
_b = b;
|
|
|
|
}
|
|
|
|
|
|
|
|
int GetA(){
|
|
|
|
return _a;
|
|
|
|
}
|
|
|
|
|
|
|
|
int Add() {
|
|
|
|
return _a + _b;
|
|
|
|
}
|
|
|
|
|
|
|
|
class Inner {
|
|
|
|
int a;
|
|
|
|
}
|
|
|
|
}";
|
|
|
|
let lexed_tokens = lex(script, &mut panic_on_error);
|
|
|
|
println!("Lexed tokens JSON: {}", serde_json::to_string(&lexed_tokens).unwrap());
|
|
|
|
|
|
|
|
let parsed_tree = parse(lexed_tokens, &mut panic_on_error);
|
|
|
|
println!("Parsed Tree JSON: {}", serde_json::to_string(&parsed_tree).unwrap());
|
2022-04-07 18:55:50 +00:00
|
|
|
let expected_tree: Box<ParsedStatement> =
|
|
|
|
serde_json::from_str(r#"{
|
2022-04-08 14:55:45 +00:00
|
|
|
"data": {
|
2022-04-07 18:55:50 +00:00
|
|
|
"Script": {
|
2022-04-08 14:55:45 +00:00
|
|
|
"statements": [
|
|
|
|
{
|
|
|
|
"data": {
|
|
|
|
"ClassDeclaration": {
|
|
|
|
"modifiers": 10,
|
|
|
|
"name": "Foobar",
|
|
|
|
"inherits": [],
|
|
|
|
"statements": [
|
|
|
|
{
|
|
|
|
"data": {
|
|
|
|
"Var": {
|
|
|
|
"modifier": 0,
|
|
|
|
"var_type": {
|
|
|
|
"data": {
|
|
|
|
"Type": {
|
|
|
|
"is_const": false,
|
|
|
|
"scope": null,
|
|
|
|
"datatype": {
|
|
|
|
"data": {
|
|
|
|
"DataTypePrimType": {
|
|
|
|
"prim_type": "Int32"
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 32,
|
|
|
|
"end": 35
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"modifiers": []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 32,
|
|
|
|
"end": 35
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"identifier": "_a",
|
|
|
|
"assignment": null
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 32,
|
|
|
|
"end": 39
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"data": {
|
|
|
|
"Var": {
|
|
|
|
"modifier": 0,
|
|
|
|
"var_type": {
|
|
|
|
"data": {
|
|
|
|
"Type": {
|
|
|
|
"is_const": false,
|
|
|
|
"scope": null,
|
|
|
|
"datatype": {
|
|
|
|
"data": {
|
|
|
|
"DataTypePrimType": {
|
|
|
|
"prim_type": "Int32"
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 44,
|
|
|
|
"end": 47
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"modifiers": []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 44,
|
|
|
|
"end": 47
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"identifier": "_b",
|
|
|
|
"assignment": null
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 44,
|
|
|
|
"end": 51
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"data": {
|
|
|
|
"FuncDeclaration": {
|
|
|
|
"modifiers": 0,
|
|
|
|
"field_mod": null,
|
|
|
|
"is_destructor": false,
|
|
|
|
"is_constructor": true,
|
|
|
|
"returns_reference": false,
|
|
|
|
"return_type": {
|
|
|
|
"data": {
|
|
|
|
"Type": {
|
|
|
|
"is_const": false,
|
|
|
|
"scope": null,
|
|
|
|
"datatype": {
|
|
|
|
"data": {
|
|
|
|
"DataTypeIdentifier": {
|
|
|
|
"identifier": "Foobar"
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 57,
|
|
|
|
"end": 63
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"modifiers": []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 57,
|
|
|
|
"end": 63
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"name": "Foobar",
|
|
|
|
"param_list": {
|
|
|
|
"data": {
|
|
|
|
"ParamList": {
|
|
|
|
"parameters": [
|
|
|
|
{
|
|
|
|
"parameter_type": {
|
|
|
|
"data": {
|
2022-04-07 18:55:50 +00:00
|
|
|
"Type": {
|
2022-04-08 14:55:45 +00:00
|
|
|
"is_const": false,
|
|
|
|
"scope": null,
|
|
|
|
"datatype": {
|
|
|
|
"data": {
|
|
|
|
"DataTypePrimType": {
|
|
|
|
"prim_type": "Int32"
|
|
|
|
}
|
2022-04-07 18:55:50 +00:00
|
|
|
},
|
2022-04-08 14:55:45 +00:00
|
|
|
"span": {
|
|
|
|
"start": 64,
|
|
|
|
"end": 67
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"modifiers": []
|
2022-04-07 18:55:50 +00:00
|
|
|
}
|
2022-04-08 14:55:45 +00:00
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 64,
|
|
|
|
"end": 67
|
|
|
|
}
|
2022-04-07 18:55:50 +00:00
|
|
|
},
|
2022-04-08 14:55:45 +00:00
|
|
|
"type_mod": null,
|
|
|
|
"identifier": "a",
|
|
|
|
"default": null
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"parameter_type": {
|
|
|
|
"data": {
|
2022-04-07 18:55:50 +00:00
|
|
|
"Type": {
|
2022-04-08 14:55:45 +00:00
|
|
|
"is_const": false,
|
|
|
|
"scope": null,
|
|
|
|
"datatype": {
|
|
|
|
"data": {
|
|
|
|
"DataTypePrimType": {
|
|
|
|
"prim_type": "Int32"
|
|
|
|
}
|
2022-04-07 18:55:50 +00:00
|
|
|
},
|
2022-04-08 14:55:45 +00:00
|
|
|
"span": {
|
|
|
|
"start": 71,
|
|
|
|
"end": 74
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"modifiers": []
|
2022-04-07 18:55:50 +00:00
|
|
|
}
|
2022-04-08 14:55:45 +00:00
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 71,
|
|
|
|
"end": 74
|
|
|
|
}
|
2022-04-07 18:55:50 +00:00
|
|
|
},
|
2022-04-08 14:55:45 +00:00
|
|
|
"type_mod": null,
|
|
|
|
"identifier": "b",
|
|
|
|
"default": null
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
2022-04-07 18:55:50 +00:00
|
|
|
},
|
2022-04-08 14:55:45 +00:00
|
|
|
"span": {
|
|
|
|
"start": 63,
|
|
|
|
"end": 77
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"is_const": false,
|
|
|
|
"func_attr": 0,
|
|
|
|
"block": {
|
|
|
|
"data": {
|
|
|
|
"StatBlock": {
|
|
|
|
"statements": [
|
|
|
|
{
|
|
|
|
"data": {
|
|
|
|
"Assignment": {
|
|
|
|
"left": {
|
|
|
|
"data": {
|
|
|
|
"VarAccess": {
|
|
|
|
"scope": null,
|
|
|
|
"identifier": "_a"
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 88,
|
|
|
|
"end": 90
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"operator": "Assignment",
|
|
|
|
"right": {
|
|
|
|
"data": {
|
|
|
|
"VarAccess": {
|
|
|
|
"scope": null,
|
|
|
|
"identifier": "a"
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 93,
|
|
|
|
"end": 94
|
|
|
|
}
|
2022-04-07 18:55:50 +00:00
|
|
|
}
|
2022-04-08 14:55:45 +00:00
|
|
|
}
|
2022-04-07 18:55:50 +00:00
|
|
|
},
|
2022-04-08 14:55:45 +00:00
|
|
|
"span": {
|
|
|
|
"start": 88,
|
|
|
|
"end": 94
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"data": {
|
|
|
|
"Assignment": {
|
|
|
|
"left": {
|
|
|
|
"data": {
|
|
|
|
"VarAccess": {
|
|
|
|
"scope": null,
|
|
|
|
"identifier": "_b"
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 104,
|
|
|
|
"end": 106
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"operator": "Assignment",
|
|
|
|
"right": {
|
|
|
|
"data": {
|
|
|
|
"VarAccess": {
|
|
|
|
"scope": null,
|
|
|
|
"identifier": "b"
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 109,
|
|
|
|
"end": 110
|
|
|
|
}
|
2022-04-07 18:55:50 +00:00
|
|
|
}
|
2022-04-08 14:55:45 +00:00
|
|
|
}
|
2022-04-07 18:55:50 +00:00
|
|
|
},
|
2022-04-08 14:55:45 +00:00
|
|
|
"span": {
|
|
|
|
"start": 104,
|
|
|
|
"end": 110
|
2022-04-07 18:55:50 +00:00
|
|
|
}
|
2022-04-08 14:55:45 +00:00
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
2022-04-07 18:55:50 +00:00
|
|
|
},
|
2022-04-08 14:55:45 +00:00
|
|
|
"span": {
|
|
|
|
"start": 78,
|
|
|
|
"end": 117
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 57,
|
|
|
|
"end": 117
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"data": {
|
|
|
|
"FuncDeclaration": {
|
|
|
|
"modifiers": 0,
|
|
|
|
"field_mod": null,
|
|
|
|
"is_destructor": false,
|
|
|
|
"is_constructor": false,
|
|
|
|
"returns_reference": false,
|
|
|
|
"return_type": {
|
|
|
|
"data": {
|
|
|
|
"Type": {
|
|
|
|
"is_const": false,
|
|
|
|
"scope": null,
|
|
|
|
"datatype": {
|
|
|
|
"data": {
|
|
|
|
"DataTypePrimType": {
|
|
|
|
"prim_type": "Int32"
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 123,
|
|
|
|
"end": 126
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"modifiers": []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 123,
|
|
|
|
"end": 126
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"name": "GetA",
|
|
|
|
"param_list": {
|
|
|
|
"data": {
|
|
|
|
"ParamList": {
|
|
|
|
"parameters": []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 131,
|
|
|
|
"end": 133
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"is_const": false,
|
|
|
|
"func_attr": 0,
|
|
|
|
"block": {
|
|
|
|
"data": {
|
|
|
|
"StatBlock": {
|
|
|
|
"statements": [
|
|
|
|
{
|
|
|
|
"data": {
|
|
|
|
"ReturnStatement": {
|
|
|
|
"expression": {
|
|
|
|
"data": {
|
|
|
|
"VarAccess": {
|
|
|
|
"scope": null,
|
|
|
|
"identifier": "_a"
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 150,
|
|
|
|
"end": 152
|
|
|
|
}
|
2022-04-07 18:55:50 +00:00
|
|
|
}
|
2022-04-08 14:55:45 +00:00
|
|
|
}
|
2022-04-07 18:55:50 +00:00
|
|
|
},
|
2022-04-08 14:55:45 +00:00
|
|
|
"span": {
|
|
|
|
"start": 143,
|
|
|
|
"end": 153
|
2022-04-07 18:55:50 +00:00
|
|
|
}
|
2022-04-08 14:55:45 +00:00
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
2022-04-07 18:55:50 +00:00
|
|
|
},
|
2022-04-08 14:55:45 +00:00
|
|
|
"span": {
|
|
|
|
"start": 133,
|
|
|
|
"end": 159
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 123,
|
|
|
|
"end": 159
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"data": {
|
|
|
|
"FuncDeclaration": {
|
|
|
|
"modifiers": 0,
|
|
|
|
"field_mod": null,
|
|
|
|
"is_destructor": false,
|
|
|
|
"is_constructor": false,
|
|
|
|
"returns_reference": false,
|
|
|
|
"return_type": {
|
|
|
|
"data": {
|
|
|
|
"Type": {
|
|
|
|
"is_const": false,
|
|
|
|
"scope": null,
|
|
|
|
"datatype": {
|
|
|
|
"data": {
|
|
|
|
"DataTypePrimType": {
|
|
|
|
"prim_type": "Int32"
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 165,
|
|
|
|
"end": 168
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"modifiers": []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 165,
|
|
|
|
"end": 168
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"name": "Add",
|
|
|
|
"param_list": {
|
|
|
|
"data": {
|
|
|
|
"ParamList": {
|
|
|
|
"parameters": []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 172,
|
|
|
|
"end": 174
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"is_const": false,
|
|
|
|
"func_attr": 0,
|
|
|
|
"block": {
|
|
|
|
"data": {
|
|
|
|
"StatBlock": {
|
|
|
|
"statements": [
|
|
|
|
{
|
|
|
|
"data": {
|
|
|
|
"ReturnStatement": {
|
|
|
|
"expression": {
|
|
|
|
"data": {
|
|
|
|
"BinaryExpr": {
|
|
|
|
"left": {
|
|
|
|
"data": {
|
|
|
|
"VarAccess": {
|
|
|
|
"scope": null,
|
|
|
|
"identifier": "_a"
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 192,
|
|
|
|
"end": 194
|
2022-04-07 18:55:50 +00:00
|
|
|
}
|
2022-04-08 14:55:45 +00:00
|
|
|
},
|
|
|
|
"operator": "Addition",
|
|
|
|
"right": {
|
|
|
|
"data": {
|
|
|
|
"VarAccess": {
|
|
|
|
"scope": null,
|
|
|
|
"identifier": "_b"
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 197,
|
|
|
|
"end": 199
|
2022-04-07 18:55:50 +00:00
|
|
|
}
|
2022-04-08 14:55:45 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 192,
|
|
|
|
"end": 199
|
|
|
|
}
|
2022-04-07 18:55:50 +00:00
|
|
|
}
|
2022-04-08 14:55:45 +00:00
|
|
|
}
|
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 185,
|
|
|
|
"end": 200
|
2022-04-07 18:55:50 +00:00
|
|
|
}
|
2022-04-08 14:55:45 +00:00
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
2022-04-07 18:55:50 +00:00
|
|
|
},
|
2022-04-08 14:55:45 +00:00
|
|
|
"span": {
|
|
|
|
"start": 175,
|
|
|
|
"end": 206
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 165,
|
|
|
|
"end": 206
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"data": {
|
|
|
|
"ClassDeclaration": {
|
|
|
|
"modifiers": 0,
|
|
|
|
"name": "Inner",
|
|
|
|
"inherits": [],
|
|
|
|
"statements": [
|
2022-04-07 18:55:50 +00:00
|
|
|
{
|
2022-04-08 14:55:45 +00:00
|
|
|
"data": {
|
|
|
|
"Var": {
|
|
|
|
"modifier": 0,
|
|
|
|
"var_type": {
|
|
|
|
"data": {
|
|
|
|
"Type": {
|
|
|
|
"is_const": false,
|
|
|
|
"scope": null,
|
|
|
|
"datatype": {
|
|
|
|
"data": {
|
|
|
|
"DataTypePrimType": {
|
|
|
|
"prim_type": "Int32"
|
2022-04-07 18:55:50 +00:00
|
|
|
}
|
2022-04-08 14:55:45 +00:00
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 234,
|
|
|
|
"end": 237
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"modifiers": []
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 234,
|
|
|
|
"end": 237
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"identifier": "a",
|
|
|
|
"assignment": null
|
2022-04-07 18:55:50 +00:00
|
|
|
}
|
2022-04-08 14:55:45 +00:00
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 234,
|
|
|
|
"end": 240
|
|
|
|
}
|
2022-04-07 18:55:50 +00:00
|
|
|
}
|
2022-04-08 14:55:45 +00:00
|
|
|
]
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 212,
|
|
|
|
"end": 246
|
|
|
|
}
|
2022-04-07 18:55:50 +00:00
|
|
|
}
|
2022-04-08 14:55:45 +00:00
|
|
|
]
|
2022-04-07 18:55:50 +00:00
|
|
|
}
|
2022-04-08 14:55:45 +00:00
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 0,
|
|
|
|
"end": 248
|
|
|
|
}
|
|
|
|
}
|
|
|
|
]
|
2022-04-07 18:55:50 +00:00
|
|
|
}
|
2022-04-08 14:55:45 +00:00
|
|
|
},
|
|
|
|
"span": {
|
|
|
|
"start": 0,
|
|
|
|
"end": 248
|
|
|
|
}
|
2022-04-07 18:55:50 +00:00
|
|
|
}"#).unwrap();
|
|
|
|
assert_eq!(parsed_tree, expected_tree);
|
2022-04-07 18:48:38 +00:00
|
|
|
}
|
|
|
|
// A substring of a script should never panic, even though it might be completely invalid.
|
|
|
|
#[test]
|
|
|
|
fn integration_class_with_many_statements_substring() {
|
|
|
|
let mut script = "final shared class Foobar {
|
|
|
|
int _a;
|
|
|
|
int _b;
|
|
|
|
|
|
|
|
Foobar(int a, int b) {
|
|
|
|
_a = a;
|
|
|
|
_b = b;
|
|
|
|
}
|
|
|
|
|
|
|
|
int GetA(){
|
|
|
|
return _a;
|
|
|
|
}
|
|
|
|
|
|
|
|
int Add() {
|
|
|
|
return _a + _b;
|
|
|
|
}
|
|
|
|
|
|
|
|
class Inner {
|
|
|
|
int a;
|
|
|
|
}
|
|
|
|
}".to_string();
|
|
|
|
for _ in 0..script.len() {
|
|
|
|
script.pop();
|
|
|
|
let lexed_tokens = lex(script.as_str(), &mut ignore_error);
|
|
|
|
let _parsed_tree = parse(lexed_tokens, &mut ignore_error);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|