breaking change: Add more KCL reserved words, part 1 (#4502)
This commit is contained in:
		| @ -36,15 +36,15 @@ fn add = (a, b) => { | ||||
|  | ||||
| // This function adds an array of numbers. | ||||
| // It uses the `reduce` function, to call the `add` function on every | ||||
| // element of the `array` parameter. The starting value is 0. | ||||
| fn sum = (array) => { | ||||
|   return reduce(array, 0, add) | ||||
| // element of the `arr` parameter. The starting value is 0. | ||||
| fn sum = (arr) => { | ||||
|   return reduce(arr, 0, add) | ||||
| } | ||||
|  | ||||
| /* The above is basically like this pseudo-code: | ||||
| fn sum(array): | ||||
| fn sum(arr): | ||||
|     let sumSoFar = 0 | ||||
|     for i in array: | ||||
|     for i in arr: | ||||
|         sumSoFar = add(sumSoFar, i) | ||||
|     return sumSoFar */ | ||||
|  | ||||
| @ -60,8 +60,8 @@ assertEqual(sum([1, 2, 3]), 6, 0.00001, "1 + 2 + 3 summed is 6") | ||||
| // This example works just like the previous example above, but it uses | ||||
| // an anonymous `add` function as its parameter, instead of declaring a | ||||
| // named function outside. | ||||
| array = [1, 2, 3] | ||||
| sum = reduce(array, 0, (i, result_so_far) => { | ||||
| arr = [1, 2, 3] | ||||
| sum = reduce(arr, 0, (i, result_so_far) => { | ||||
|   return i + result_so_far | ||||
| }) | ||||
|  | ||||
|  | ||||
| @ -162561,8 +162561,8 @@ | ||||
|     "unpublished": false, | ||||
|     "deprecated": false, | ||||
|     "examples": [ | ||||
|       "// This function adds two numbers.\nfn add = (a, b) => {\n  return a + b\n}\n\n// This function adds an array of numbers.\n// It uses the `reduce` function, to call the `add` function on every\n// element of the `array` parameter. The starting value is 0.\nfn sum = (array) => {\n  return reduce(array, 0, add)\n}\n\n/* The above is basically like this pseudo-code:\nfn sum(array):\n    let sumSoFar = 0\n    for i in array:\n        sumSoFar = add(sumSoFar, i)\n    return sumSoFar */\n\n\n// We use `assertEqual` to check that our `sum` function gives the\n// expected result. It's good to check your work!\nassertEqual(sum([1, 2, 3]), 6, 0.00001, \"1 + 2 + 3 summed is 6\")", | ||||
|       "// This example works just like the previous example above, but it uses\n// an anonymous `add` function as its parameter, instead of declaring a\n// named function outside.\narray = [1, 2, 3]\nsum = reduce(array, 0, (i, result_so_far) => {\n  return i + result_so_far\n})\n\n// We use `assertEqual` to check that our `sum` function gives the\n// expected result. It's good to check your work!\nassertEqual(sum, 6, 0.00001, \"1 + 2 + 3 summed is 6\")", | ||||
|       "// This function adds two numbers.\nfn add = (a, b) => {\n  return a + b\n}\n\n// This function adds an array of numbers.\n// It uses the `reduce` function, to call the `add` function on every\n// element of the `arr` parameter. The starting value is 0.\nfn sum = (arr) => {\n  return reduce(arr, 0, add)\n}\n\n/* The above is basically like this pseudo-code:\nfn sum(arr):\n    let sumSoFar = 0\n    for i in arr:\n        sumSoFar = add(sumSoFar, i)\n    return sumSoFar */\n\n\n// We use `assertEqual` to check that our `sum` function gives the\n// expected result. It's good to check your work!\nassertEqual(sum([1, 2, 3]), 6, 0.00001, \"1 + 2 + 3 summed is 6\")", | ||||
|       "// This example works just like the previous example above, but it uses\n// an anonymous `add` function as its parameter, instead of declaring a\n// named function outside.\narr = [1, 2, 3]\nsum = reduce(arr, 0, (i, result_so_far) => {\n  return i + result_so_far\n})\n\n// We use `assertEqual` to check that our `sum` function gives the\n// expected result. It's good to check your work!\nassertEqual(sum, 6, 0.00001, \"1 + 2 + 3 summed is 6\")", | ||||
|       "// Declare a function that sketches a decagon.\nfn decagon = (radius) => {\n  // Each side of the decagon is turned this many degrees from the previous angle.\n  stepAngle = 1 / 10 * tau()\n\n  // Start the decagon sketch at this point.\n  startOfDecagonSketch = startSketchAt([cos(0) * radius, sin(0) * radius])\n\n  // Use a `reduce` to draw the remaining decagon sides.\n  // For each number in the array 1..10, run the given function,\n  // which takes a partially-sketched decagon and adds one more edge to it.\n  fullDecagon = reduce([1..10], startOfDecagonSketch, (i, partialDecagon) => {\n    // Draw one edge of the decagon.\n    x = cos(stepAngle * i) * radius\n    y = sin(stepAngle * i) * radius\n    return lineTo([x, y], partialDecagon)\n})\n\n  return fullDecagon\n}\n\n/* The `decagon` above is basically like this pseudo-code:\nfn decagon(radius):\n    let stepAngle = (1/10) * tau()\n    let startOfDecagonSketch = startSketchAt([(cos(0)*radius), (sin(0) * radius)])\n\n    // Here's the reduce part.\n    let partialDecagon = startOfDecagonSketch\n    for i in [1..10]:\n        let x = cos(stepAngle * i) * radius\n        let y = sin(stepAngle * i) * radius\n        partialDecagon = lineTo([x, y], partialDecagon)\n    fullDecagon = partialDecagon // it's now full\n    return fullDecagon */\n\n\n// Use the `decagon` function declared above, to sketch a decagon with radius 5.\ndecagon(5.0)\n  |> close(%)" | ||||
|     ] | ||||
|   }, | ||||
|  | ||||
							
								
								
									
										1
									
								
								src/wasm-lib/Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1
									
								
								src/wasm-lib/Cargo.lock
									
									
									
										generated
									
									
									
								
							| @ -1691,6 +1691,7 @@ dependencies = [ | ||||
|  "databake", | ||||
|  "derive-docs", | ||||
|  "expectorate", | ||||
|  "fnv", | ||||
|  "form_urlencoded", | ||||
|  "futures", | ||||
|  "git_rev", | ||||
|  | ||||
| @ -21,6 +21,7 @@ convert_case = "0.6.0" | ||||
| dashmap = "6.1.0" | ||||
| databake = { version = "0.1.8", features = ["derive"] } | ||||
| derive-docs = { version = "0.1.29", path = "../derive-docs" } | ||||
| fnv = "1.0.7" | ||||
| form_urlencoded = "1.2.1" | ||||
| futures = { version = "0.3.31" } | ||||
| git_rev = "0.1.0" | ||||
|  | ||||
| @ -3052,14 +3052,14 @@ for var in [[3, 6, 10, [0,0]], [1.5, 3, 5, [-10,-10]]] { | ||||
|  | ||||
|     #[tokio::test(flavor = "multi_thread")] | ||||
|     async fn test_get_member_of_array_with_function() { | ||||
|         let ast = r#"fn box = (array) => { | ||||
|         let ast = r#"fn box = (arr) => { | ||||
|  let myBox =startSketchOn('XY') | ||||
|     |> startProfileAt(array[0], %) | ||||
|     |> line([0, array[1]], %) | ||||
|     |> line([array[2], 0], %) | ||||
|     |> line([0, -array[1]], %) | ||||
|     |> startProfileAt(arr[0], %) | ||||
|     |> line([0, arr[1]], %) | ||||
|     |> line([arr[2], 0], %) | ||||
|     |> line([0, -arr[1]], %) | ||||
|     |> close(%) | ||||
|     |> extrude(array[3], %) | ||||
|     |> extrude(arr[3], %) | ||||
|  | ||||
|   return myBox | ||||
| } | ||||
|  | ||||
| @ -2040,11 +2040,39 @@ fn fn_call(i: TokenSlice) -> PResult<Node<CallExpression>> { | ||||
|  | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     use itertools::Itertools; | ||||
|     use pretty_assertions::assert_eq; | ||||
|  | ||||
|     use super::*; | ||||
|     use crate::ast::types::{BodyItem, Expr, ModuleId, VariableKind}; | ||||
|  | ||||
|     fn assert_reserved(word: &str) { | ||||
|         // Try to use it as a variable name. | ||||
|         let code = format!(r#"{} = 0"#, word); | ||||
|         let result = crate::parser::top_level_parse(code.as_str()); | ||||
|         let err = result.unwrap_err(); | ||||
|         // Which token causes the error may change.  In "return = 0", for | ||||
|         // example, "return" is the problem. | ||||
|         assert!( | ||||
|             err.message().starts_with("Unexpected token: ") | ||||
|                 || err | ||||
|                     .message() | ||||
|                     .starts_with("Cannot assign a variable to a reserved keyword: "), | ||||
|             "Error message is: {}", | ||||
|             err.message(), | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn reserved_words() { | ||||
|         // Since these are stored in a set, we sort to make the tests | ||||
|         // deterministic. | ||||
|         for word in crate::token::RESERVED_WORDS.keys().sorted() { | ||||
|             assert_reserved(word); | ||||
|         } | ||||
|         assert_reserved("import"); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn parse_args() { | ||||
|         for (i, (test, expected_len)) in [("someVar", 1), ("5, 3", 2), (r#""a""#, 1)].into_iter().enumerate() { | ||||
|  | ||||
| @ -107,14 +107,14 @@ pub async fn reduce(exec_state: &mut ExecState, args: Args) -> Result<KclValue, | ||||
| /// | ||||
| /// // This function adds an array of numbers. | ||||
| /// // It uses the `reduce` function, to call the `add` function on every | ||||
| /// // element of the `array` parameter. The starting value is 0. | ||||
| /// fn sum = (array) => { return reduce(array, 0, add) } | ||||
| /// // element of the `arr` parameter. The starting value is 0. | ||||
| /// fn sum = (arr) => { return reduce(arr, 0, add) } | ||||
| /// | ||||
| /// /* | ||||
| /// The above is basically like this pseudo-code: | ||||
| /// fn sum(array): | ||||
| /// fn sum(arr): | ||||
| ///     let sumSoFar = 0 | ||||
| ///     for i in array: | ||||
| ///     for i in arr: | ||||
| ///         sumSoFar = add(sumSoFar, i) | ||||
| ///     return sumSoFar | ||||
| /// */ | ||||
| @ -127,8 +127,8 @@ pub async fn reduce(exec_state: &mut ExecState, args: Args) -> Result<KclValue, | ||||
| /// // This example works just like the previous example above, but it uses | ||||
| /// // an anonymous `add` function as its parameter, instead of declaring a | ||||
| /// // named function outside. | ||||
| /// array = [1, 2, 3] | ||||
| /// sum = reduce(array, 0, (i, result_so_far) => { return i + result_so_far }) | ||||
| /// arr = [1, 2, 3] | ||||
| /// sum = reduce(arr, 0, (i, result_so_far) => { return i + result_so_far }) | ||||
| /// | ||||
| /// // We use `assertEqual` to check that our `sum` function gives the | ||||
| /// // expected result. It's good to check your work! | ||||
|  | ||||
| @ -17,6 +17,8 @@ mod tokeniser; | ||||
|  | ||||
| // Re-export | ||||
| pub use tokeniser::Input; | ||||
| #[cfg(test)] | ||||
| pub(crate) use tokeniser::RESERVED_WORDS; | ||||
|  | ||||
| /// The types of tokens. | ||||
| #[derive(Debug, PartialEq, Eq, Copy, Clone, Deserialize, Serialize, ts_rs::TS, JsonSchema, FromStr, Display)] | ||||
|  | ||||
| @ -1,6 +1,8 @@ | ||||
| use fnv::FnvHashMap; | ||||
| use lazy_static::lazy_static; | ||||
| use winnow::{ | ||||
|     ascii::{digit1, multispace1}, | ||||
|     combinator::{alt, opt, peek, preceded, repeat, terminated}, | ||||
|     combinator::{alt, opt, peek, preceded, repeat}, | ||||
|     error::{ContextError, ParseError}, | ||||
|     prelude::*, | ||||
|     stream::{Location, Stream}, | ||||
| @ -13,6 +15,52 @@ use crate::{ | ||||
|     token::{Token, TokenType}, | ||||
| }; | ||||
|  | ||||
| lazy_static! { | ||||
|     pub(crate) static ref RESERVED_WORDS: FnvHashMap<&'static str, TokenType> = { | ||||
|         let mut set = FnvHashMap::default(); | ||||
|         set.insert("if", TokenType::Keyword); | ||||
|         set.insert("else", TokenType::Keyword); | ||||
|         set.insert("for", TokenType::Keyword); | ||||
|         set.insert("while", TokenType::Keyword); | ||||
|         set.insert("return", TokenType::Keyword); | ||||
|         set.insert("break", TokenType::Keyword); | ||||
|         set.insert("continue", TokenType::Keyword); | ||||
|         set.insert("fn", TokenType::Keyword); | ||||
|         set.insert("let", TokenType::Keyword); | ||||
|         set.insert("mut", TokenType::Keyword); | ||||
|         set.insert("as", TokenType::Keyword); | ||||
|         set.insert("loop", TokenType::Keyword); | ||||
|         set.insert("true", TokenType::Keyword); | ||||
|         set.insert("false", TokenType::Keyword); | ||||
|         set.insert("nil", TokenType::Keyword); | ||||
|         // This isn't a type because brackets are used for the type. | ||||
|         set.insert("array", TokenType::Keyword); | ||||
|         set.insert("and", TokenType::Keyword); | ||||
|         set.insert("or", TokenType::Keyword); | ||||
|         set.insert("not", TokenType::Keyword); | ||||
|         set.insert("var", TokenType::Keyword); | ||||
|         set.insert("const", TokenType::Keyword); | ||||
|         // "import" is special because of import(). | ||||
|         set.insert("export", TokenType::Keyword); | ||||
|         set.insert("interface", TokenType::Keyword); | ||||
|         set.insert("new", TokenType::Keyword); | ||||
|         set.insert("self", TokenType::Keyword); | ||||
|         set.insert("record", TokenType::Keyword); | ||||
|         set.insert("struct", TokenType::Keyword); | ||||
|         set.insert("object", TokenType::Keyword); | ||||
|         set.insert("_", TokenType::Keyword); | ||||
|  | ||||
|         set.insert("string", TokenType::Type); | ||||
|         set.insert("number", TokenType::Type); | ||||
|         set.insert("bool", TokenType::Type); | ||||
|         set.insert("sketch", TokenType::Type); | ||||
|         set.insert("sketch_surface", TokenType::Type); | ||||
|         set.insert("solid", TokenType::Type); | ||||
|  | ||||
|         set | ||||
|     }; | ||||
| } | ||||
|  | ||||
| pub fn lexer(i: &str, module_id: ModuleId) -> Result<Vec<Token>, ParseError<Input<'_>, ContextError>> { | ||||
|     let state = State::new(module_id); | ||||
|     let input = Input { | ||||
| @ -50,7 +98,7 @@ pub fn token(i: &mut Input<'_>) -> PResult<Token> { | ||||
|         '$' => dollar, | ||||
|         '!' => alt((operator, bang)), | ||||
|         ' ' | '\t' | '\n' => whitespace, | ||||
|         _ => alt((operator, keyword,type_, word)) | ||||
|         _ => alt((operator, keyword_type_or_word)) | ||||
|     } | ||||
|     .parse_next(i) | ||||
|     { | ||||
| @ -287,47 +335,16 @@ fn import_keyword(i: &mut Input<'_>) -> PResult<Token> { | ||||
|     )) | ||||
| } | ||||
|  | ||||
| fn unambiguous_keywords(i: &mut Input<'_>) -> PResult<Token> { | ||||
|     // These are the keywords themselves. | ||||
|     let keyword_candidates = alt(( | ||||
|         "if", "else", "for", "while", "return", "break", "continue", "fn", "let", "mut", "loop", "true", "false", | ||||
|         "nil", "and", "or", "not", "var", "const", "export", | ||||
|     )); | ||||
|     // Look ahead. If any of these characters follow the keyword, then it's not a keyword, it's just | ||||
|     // the start of a normal word. | ||||
|     let keyword = terminated( | ||||
|         keyword_candidates, | ||||
|         peek(none_of(('a'..='z', 'A'..='Z', '-', '_', '0'..='9'))), | ||||
|     ); | ||||
|     let (value, range) = keyword.with_span().parse_next(i)?; | ||||
|     Ok(Token::from_range( | ||||
|         range, | ||||
|         i.state.module_id, | ||||
|         TokenType::Keyword, | ||||
|         value.to_owned(), | ||||
|     )) | ||||
| fn unambiguous_keyword_type_or_word(i: &mut Input<'_>) -> PResult<Token> { | ||||
|     let mut w = word.parse_next(i)?; | ||||
|     if let Some(token_type) = RESERVED_WORDS.get(w.value.as_str()) { | ||||
|         w.token_type = *token_type; | ||||
|     } | ||||
|     Ok(w) | ||||
| } | ||||
|  | ||||
| fn keyword(i: &mut Input<'_>) -> PResult<Token> { | ||||
|     alt((import_keyword, unambiguous_keywords)).parse_next(i) | ||||
| } | ||||
|  | ||||
| fn type_(i: &mut Input<'_>) -> PResult<Token> { | ||||
|     // These are the types themselves. | ||||
|     let type_candidates = alt(("string", "number", "bool", "sketch", "sketch_surface", "solid")); | ||||
|     // Look ahead. If any of these characters follow the type, then it's not a type, it's just | ||||
|     // the start of a normal word. | ||||
|     let type_ = terminated( | ||||
|         type_candidates, | ||||
|         peek(none_of(('a'..='z', 'A'..='Z', '-', '_', '0'..='9'))), | ||||
|     ); | ||||
|     let (value, range) = type_.with_span().parse_next(i)?; | ||||
|     Ok(Token::from_range( | ||||
|         range, | ||||
|         i.state.module_id, | ||||
|         TokenType::Type, | ||||
|         value.to_owned(), | ||||
|     )) | ||||
| fn keyword_type_or_word(i: &mut Input<'_>) -> PResult<Token> { | ||||
|     alt((import_keyword, unambiguous_keyword_type_or_word)).parse_next(i) | ||||
| } | ||||
|  | ||||
| #[cfg(test)] | ||||
|  | ||||
| @ -9,42 +9,42 @@ snapshot_kind: text | ||||
|       { | ||||
|         "declarations": [ | ||||
|           { | ||||
|             "end": 55, | ||||
|             "end": 53, | ||||
|             "id": { | ||||
|               "end": 40, | ||||
|               "name": "array", | ||||
|               "end": 38, | ||||
|               "name": "arr", | ||||
|               "start": 35, | ||||
|               "type": "Identifier" | ||||
|             }, | ||||
|             "init": { | ||||
|               "elements": [ | ||||
|                 { | ||||
|                   "end": 46, | ||||
|                   "end": 44, | ||||
|                   "raw": "90", | ||||
|                   "start": 44, | ||||
|                   "start": 42, | ||||
|                   "type": "Literal", | ||||
|                   "type": "Literal", | ||||
|                   "value": 90 | ||||
|                 }, | ||||
|                 { | ||||
|                   "end": 50, | ||||
|                   "end": 48, | ||||
|                   "raw": "91", | ||||
|                   "start": 48, | ||||
|                   "start": 46, | ||||
|                   "type": "Literal", | ||||
|                   "type": "Literal", | ||||
|                   "value": 91 | ||||
|                 }, | ||||
|                 { | ||||
|                   "end": 54, | ||||
|                   "end": 52, | ||||
|                   "raw": "92", | ||||
|                   "start": 52, | ||||
|                   "start": 50, | ||||
|                   "type": "Literal", | ||||
|                   "type": "Literal", | ||||
|                   "value": 92 | ||||
|                 } | ||||
|               ], | ||||
|               "end": 55, | ||||
|               "start": 43, | ||||
|               "end": 53, | ||||
|               "start": 41, | ||||
|               "type": "ArrayExpression", | ||||
|               "type": "ArrayExpression" | ||||
|             }, | ||||
| @ -52,7 +52,7 @@ snapshot_kind: text | ||||
|             "type": "VariableDeclarator" | ||||
|           } | ||||
|         ], | ||||
|         "end": 55, | ||||
|         "end": 53, | ||||
|         "kind": "const", | ||||
|         "start": 35, | ||||
|         "type": "VariableDeclaration", | ||||
| @ -61,328 +61,328 @@ snapshot_kind: text | ||||
|       { | ||||
|         "declarations": [ | ||||
|           { | ||||
|             "end": 101, | ||||
|             "end": 97, | ||||
|             "id": { | ||||
|               "end": 90, | ||||
|               "end": 88, | ||||
|               "name": "result0", | ||||
|               "start": 83, | ||||
|               "start": 81, | ||||
|               "type": "Identifier" | ||||
|             }, | ||||
|             "init": { | ||||
|               "computed": false, | ||||
|               "end": 101, | ||||
|               "end": 97, | ||||
|               "object": { | ||||
|                 "end": 98, | ||||
|                 "name": "array", | ||||
|                 "start": 93, | ||||
|                 "end": 94, | ||||
|                 "name": "arr", | ||||
|                 "start": 91, | ||||
|                 "type": "Identifier", | ||||
|                 "type": "Identifier" | ||||
|               }, | ||||
|               "property": { | ||||
|                 "end": 100, | ||||
|                 "end": 96, | ||||
|                 "raw": "1", | ||||
|                 "start": 99, | ||||
|                 "start": 95, | ||||
|                 "type": "Literal", | ||||
|                 "type": "Literal", | ||||
|                 "value": 1 | ||||
|               }, | ||||
|               "start": 93, | ||||
|               "start": 91, | ||||
|               "type": "MemberExpression", | ||||
|               "type": "MemberExpression" | ||||
|             }, | ||||
|             "start": 83, | ||||
|             "start": 81, | ||||
|             "type": "VariableDeclarator" | ||||
|           } | ||||
|         ], | ||||
|         "end": 101, | ||||
|         "end": 97, | ||||
|         "kind": "const", | ||||
|         "start": 83, | ||||
|         "start": 81, | ||||
|         "type": "VariableDeclaration", | ||||
|         "type": "VariableDeclaration" | ||||
|       }, | ||||
|       { | ||||
|         "end": 161, | ||||
|         "end": 157, | ||||
|         "expression": { | ||||
|           "arguments": [ | ||||
|             { | ||||
|               "end": 129, | ||||
|               "end": 125, | ||||
|               "name": "result0", | ||||
|               "start": 122, | ||||
|               "start": 118, | ||||
|               "type": "Identifier", | ||||
|               "type": "Identifier" | ||||
|             }, | ||||
|             { | ||||
|               "end": 133, | ||||
|               "end": 129, | ||||
|               "raw": "91", | ||||
|               "start": 131, | ||||
|               "start": 127, | ||||
|               "type": "Literal", | ||||
|               "type": "Literal", | ||||
|               "value": 91 | ||||
|             }, | ||||
|             { | ||||
|               "end": 160, | ||||
|               "end": 156, | ||||
|               "raw": "\"Literal property lookup\"", | ||||
|               "start": 135, | ||||
|               "start": 131, | ||||
|               "type": "Literal", | ||||
|               "type": "Literal", | ||||
|               "value": "Literal property lookup" | ||||
|             } | ||||
|           ], | ||||
|           "callee": { | ||||
|             "end": 121, | ||||
|             "end": 117, | ||||
|             "name": "assertLessThanOrEq", | ||||
|             "start": 103, | ||||
|             "start": 99, | ||||
|             "type": "Identifier" | ||||
|           }, | ||||
|           "end": 161, | ||||
|           "end": 157, | ||||
|           "optional": false, | ||||
|           "start": 103, | ||||
|           "start": 99, | ||||
|           "type": "CallExpression", | ||||
|           "type": "CallExpression" | ||||
|         }, | ||||
|         "start": 103, | ||||
|         "start": 99, | ||||
|         "type": "ExpressionStatement", | ||||
|         "type": "ExpressionStatement" | ||||
|       }, | ||||
|       { | ||||
|         "end": 223, | ||||
|         "end": 219, | ||||
|         "expression": { | ||||
|           "arguments": [ | ||||
|             { | ||||
|               "end": 191, | ||||
|               "end": 187, | ||||
|               "name": "result0", | ||||
|               "start": 184, | ||||
|               "start": 180, | ||||
|               "type": "Identifier", | ||||
|               "type": "Identifier" | ||||
|             }, | ||||
|             { | ||||
|               "end": 195, | ||||
|               "end": 191, | ||||
|               "raw": "91", | ||||
|               "start": 193, | ||||
|               "start": 189, | ||||
|               "type": "Literal", | ||||
|               "type": "Literal", | ||||
|               "value": 91 | ||||
|             }, | ||||
|             { | ||||
|               "end": 222, | ||||
|               "end": 218, | ||||
|               "raw": "\"Literal property lookup\"", | ||||
|               "start": 197, | ||||
|               "start": 193, | ||||
|               "type": "Literal", | ||||
|               "type": "Literal", | ||||
|               "value": "Literal property lookup" | ||||
|             } | ||||
|           ], | ||||
|           "callee": { | ||||
|             "end": 183, | ||||
|             "end": 179, | ||||
|             "name": "assertGreaterThanOrEq", | ||||
|             "start": 162, | ||||
|             "start": 158, | ||||
|             "type": "Identifier" | ||||
|           }, | ||||
|           "end": 223, | ||||
|           "end": 219, | ||||
|           "optional": false, | ||||
|           "start": 162, | ||||
|           "start": 158, | ||||
|           "type": "CallExpression", | ||||
|           "type": "CallExpression" | ||||
|         }, | ||||
|         "start": 162, | ||||
|         "start": 158, | ||||
|         "type": "ExpressionStatement", | ||||
|         "type": "ExpressionStatement" | ||||
|       }, | ||||
|       { | ||||
|         "declarations": [ | ||||
|           { | ||||
|             "end": 266, | ||||
|             "end": 262, | ||||
|             "id": { | ||||
|               "end": 253, | ||||
|               "end": 249, | ||||
|               "name": "i", | ||||
|               "start": 252, | ||||
|               "start": 248, | ||||
|               "type": "Identifier" | ||||
|             }, | ||||
|             "init": { | ||||
|               "arguments": [ | ||||
|                 { | ||||
|                   "end": 265, | ||||
|                   "left": { | ||||
|                   "end": 261, | ||||
|                   "left": { | ||||
|                     "end": 257, | ||||
|                     "raw": "1", | ||||
|                     "start": 260, | ||||
|                     "start": 256, | ||||
|                     "type": "Literal", | ||||
|                     "type": "Literal", | ||||
|                     "value": 1 | ||||
|                   }, | ||||
|                   "operator": "+", | ||||
|                   "right": { | ||||
|                     "end": 265, | ||||
|                     "end": 261, | ||||
|                     "raw": "0", | ||||
|                     "start": 264, | ||||
|                     "start": 260, | ||||
|                     "type": "Literal", | ||||
|                     "type": "Literal", | ||||
|                     "value": 0 | ||||
|                   }, | ||||
|                   "start": 260, | ||||
|                   "start": 256, | ||||
|                   "type": "BinaryExpression", | ||||
|                   "type": "BinaryExpression" | ||||
|                 } | ||||
|               ], | ||||
|               "callee": { | ||||
|                 "end": 259, | ||||
|                 "end": 255, | ||||
|                 "name": "int", | ||||
|                 "start": 256, | ||||
|                 "start": 252, | ||||
|                 "type": "Identifier" | ||||
|               }, | ||||
|               "end": 266, | ||||
|               "end": 262, | ||||
|               "optional": false, | ||||
|               "start": 256, | ||||
|               "start": 252, | ||||
|               "type": "CallExpression", | ||||
|               "type": "CallExpression" | ||||
|             }, | ||||
|             "start": 252, | ||||
|             "start": 248, | ||||
|             "type": "VariableDeclarator" | ||||
|           } | ||||
|         ], | ||||
|         "end": 266, | ||||
|         "end": 262, | ||||
|         "kind": "const", | ||||
|         "start": 252, | ||||
|         "start": 248, | ||||
|         "type": "VariableDeclaration", | ||||
|         "type": "VariableDeclaration" | ||||
|       }, | ||||
|       { | ||||
|         "declarations": [ | ||||
|           { | ||||
|             "end": 285, | ||||
|             "end": 279, | ||||
|             "id": { | ||||
|               "end": 274, | ||||
|               "end": 270, | ||||
|               "name": "result1", | ||||
|               "start": 267, | ||||
|               "start": 263, | ||||
|               "type": "Identifier" | ||||
|             }, | ||||
|             "init": { | ||||
|               "computed": true, | ||||
|               "end": 285, | ||||
|               "end": 279, | ||||
|               "object": { | ||||
|                 "end": 282, | ||||
|                 "name": "array", | ||||
|                 "start": 277, | ||||
|                 "end": 276, | ||||
|                 "name": "arr", | ||||
|                 "start": 273, | ||||
|                 "type": "Identifier", | ||||
|                 "type": "Identifier" | ||||
|               }, | ||||
|               "property": { | ||||
|                 "end": 284, | ||||
|                 "end": 278, | ||||
|                 "name": "i", | ||||
|                 "start": 283, | ||||
|                 "start": 277, | ||||
|                 "type": "Identifier", | ||||
|                 "type": "Identifier" | ||||
|               }, | ||||
|               "start": 277, | ||||
|               "start": 273, | ||||
|               "type": "MemberExpression", | ||||
|               "type": "MemberExpression" | ||||
|             }, | ||||
|             "start": 267, | ||||
|             "start": 263, | ||||
|             "type": "VariableDeclarator" | ||||
|           } | ||||
|         ], | ||||
|         "end": 285, | ||||
|         "end": 279, | ||||
|         "kind": "const", | ||||
|         "start": 267, | ||||
|         "start": 263, | ||||
|         "type": "VariableDeclaration", | ||||
|         "type": "VariableDeclaration" | ||||
|       }, | ||||
|       { | ||||
|         "end": 346, | ||||
|         "end": 340, | ||||
|         "expression": { | ||||
|           "arguments": [ | ||||
|             { | ||||
|               "end": 313, | ||||
|               "end": 307, | ||||
|               "name": "result1", | ||||
|               "start": 306, | ||||
|               "start": 300, | ||||
|               "type": "Identifier", | ||||
|               "type": "Identifier" | ||||
|             }, | ||||
|             { | ||||
|               "end": 317, | ||||
|               "end": 311, | ||||
|               "raw": "91", | ||||
|               "start": 315, | ||||
|               "start": 309, | ||||
|               "type": "Literal", | ||||
|               "type": "Literal", | ||||
|               "value": 91 | ||||
|             }, | ||||
|             { | ||||
|               "end": 345, | ||||
|               "end": 339, | ||||
|               "raw": "\"Computed property lookup\"", | ||||
|               "start": 319, | ||||
|               "start": 313, | ||||
|               "type": "Literal", | ||||
|               "type": "Literal", | ||||
|               "value": "Computed property lookup" | ||||
|             } | ||||
|           ], | ||||
|           "callee": { | ||||
|             "end": 305, | ||||
|             "end": 299, | ||||
|             "name": "assertLessThanOrEq", | ||||
|             "start": 287, | ||||
|             "start": 281, | ||||
|             "type": "Identifier" | ||||
|           }, | ||||
|           "end": 346, | ||||
|           "end": 340, | ||||
|           "optional": false, | ||||
|           "start": 287, | ||||
|           "start": 281, | ||||
|           "type": "CallExpression", | ||||
|           "type": "CallExpression" | ||||
|         }, | ||||
|         "start": 287, | ||||
|         "start": 281, | ||||
|         "type": "ExpressionStatement", | ||||
|         "type": "ExpressionStatement" | ||||
|       }, | ||||
|       { | ||||
|         "end": 409, | ||||
|         "end": 403, | ||||
|         "expression": { | ||||
|           "arguments": [ | ||||
|             { | ||||
|               "end": 376, | ||||
|               "end": 370, | ||||
|               "name": "result1", | ||||
|               "start": 369, | ||||
|               "start": 363, | ||||
|               "type": "Identifier", | ||||
|               "type": "Identifier" | ||||
|             }, | ||||
|             { | ||||
|               "end": 380, | ||||
|               "end": 374, | ||||
|               "raw": "91", | ||||
|               "start": 378, | ||||
|               "start": 372, | ||||
|               "type": "Literal", | ||||
|               "type": "Literal", | ||||
|               "value": 91 | ||||
|             }, | ||||
|             { | ||||
|               "end": 408, | ||||
|               "end": 402, | ||||
|               "raw": "\"Computed property lookup\"", | ||||
|               "start": 382, | ||||
|               "start": 376, | ||||
|               "type": "Literal", | ||||
|               "type": "Literal", | ||||
|               "value": "Computed property lookup" | ||||
|             } | ||||
|           ], | ||||
|           "callee": { | ||||
|             "end": 368, | ||||
|             "end": 362, | ||||
|             "name": "assertGreaterThanOrEq", | ||||
|             "start": 347, | ||||
|             "start": 341, | ||||
|             "type": "Identifier" | ||||
|           }, | ||||
|           "end": 409, | ||||
|           "end": 403, | ||||
|           "optional": false, | ||||
|           "start": 347, | ||||
|           "start": 341, | ||||
|           "type": "CallExpression", | ||||
|           "type": "CallExpression" | ||||
|         }, | ||||
|         "start": 347, | ||||
|         "start": 341, | ||||
|         "type": "ExpressionStatement", | ||||
|         "type": "ExpressionStatement" | ||||
|       } | ||||
|     ], | ||||
|     "end": 410, | ||||
|     "end": 404, | ||||
|     "nonCodeMeta": { | ||||
|       "nonCodeNodes": { | ||||
|         "0": [ | ||||
|           { | ||||
|             "end": 80, | ||||
|             "start": 55, | ||||
|             "end": 78, | ||||
|             "start": 53, | ||||
|             "type": "NonCodeNode", | ||||
|             "value": { | ||||
|               "type": "newLineBlockComment", | ||||
| @ -391,8 +391,8 @@ snapshot_kind: text | ||||
|             } | ||||
|           }, | ||||
|           { | ||||
|             "end": 83, | ||||
|             "start": 80, | ||||
|             "end": 81, | ||||
|             "start": 78, | ||||
|             "type": "NonCodeNode", | ||||
|             "value": { | ||||
|               "type": "newLine" | ||||
| @ -401,8 +401,8 @@ snapshot_kind: text | ||||
|         ], | ||||
|         "1": [ | ||||
|           { | ||||
|             "end": 103, | ||||
|             "start": 101, | ||||
|             "end": 99, | ||||
|             "start": 97, | ||||
|             "type": "NonCodeNode", | ||||
|             "value": { | ||||
|               "type": "newLine" | ||||
| @ -411,8 +411,8 @@ snapshot_kind: text | ||||
|         ], | ||||
|         "3": [ | ||||
|           { | ||||
|             "end": 249, | ||||
|             "start": 223, | ||||
|             "end": 245, | ||||
|             "start": 219, | ||||
|             "type": "NonCodeNode", | ||||
|             "value": { | ||||
|               "type": "newLineBlockComment", | ||||
| @ -421,8 +421,8 @@ snapshot_kind: text | ||||
|             } | ||||
|           }, | ||||
|           { | ||||
|             "end": 252, | ||||
|             "start": 249, | ||||
|             "end": 248, | ||||
|             "start": 245, | ||||
|             "type": "NonCodeNode", | ||||
|             "value": { | ||||
|               "type": "newLine" | ||||
| @ -431,8 +431,8 @@ snapshot_kind: text | ||||
|         ], | ||||
|         "5": [ | ||||
|           { | ||||
|             "end": 287, | ||||
|             "start": 285, | ||||
|             "end": 281, | ||||
|             "start": 279, | ||||
|             "type": "NonCodeNode", | ||||
|             "value": { | ||||
|               "type": "newLine" | ||||
|  | ||||
| @ -1,12 +1,12 @@ | ||||
| // This tests indexing an array. | ||||
|  | ||||
|  | ||||
| array = [90, 91, 92] | ||||
| arr = [90, 91, 92] | ||||
|  | ||||
| // Test: literal index. | ||||
|  | ||||
|  | ||||
| result0 = array[1] | ||||
| result0 = arr[1] | ||||
|  | ||||
| assertLessThanOrEq(result0, 91, "Literal property lookup") | ||||
| assertGreaterThanOrEq(result0, 91, "Literal property lookup") | ||||
| @ -15,7 +15,7 @@ assertGreaterThanOrEq(result0, 91, "Literal property lookup") | ||||
|  | ||||
|  | ||||
| i = int(1 + 0) | ||||
| result1 = array[i] | ||||
| result1 = arr[i] | ||||
|  | ||||
| assertLessThanOrEq(result1, 91, "Computed property lookup") | ||||
| assertGreaterThanOrEq(result1, 91, "Computed property lookup") | ||||
|  | ||||
| @ -27,7 +27,7 @@ snapshot_kind: text | ||||
|           "value": 0.0, | ||||
|           "__meta": [] | ||||
|         }, | ||||
|         "array": { | ||||
|         "arr": { | ||||
|           "type": "Array", | ||||
|           "value": [ | ||||
|             { | ||||
| @ -36,8 +36,8 @@ snapshot_kind: text | ||||
|               "__meta": [ | ||||
|                 { | ||||
|                   "sourceRange": [ | ||||
|                     42, | ||||
|                     44, | ||||
|                     46, | ||||
|                     0 | ||||
|                   ] | ||||
|                 } | ||||
| @ -49,8 +49,8 @@ snapshot_kind: text | ||||
|               "__meta": [ | ||||
|                 { | ||||
|                   "sourceRange": [ | ||||
|                     46, | ||||
|                     48, | ||||
|                     50, | ||||
|                     0 | ||||
|                   ] | ||||
|                 } | ||||
| @ -62,8 +62,8 @@ snapshot_kind: text | ||||
|               "__meta": [ | ||||
|                 { | ||||
|                   "sourceRange": [ | ||||
|                     50, | ||||
|                     52, | ||||
|                     54, | ||||
|                     0 | ||||
|                   ] | ||||
|                 } | ||||
| @ -73,8 +73,8 @@ snapshot_kind: text | ||||
|           "__meta": [ | ||||
|             { | ||||
|               "sourceRange": [ | ||||
|                 43, | ||||
|                 55, | ||||
|                 41, | ||||
|                 53, | ||||
|                 0 | ||||
|               ] | ||||
|             } | ||||
| @ -86,8 +86,8 @@ snapshot_kind: text | ||||
|           "__meta": [ | ||||
|             { | ||||
|               "sourceRange": [ | ||||
|                 256, | ||||
|                 266, | ||||
|                 252, | ||||
|                 262, | ||||
|                 0 | ||||
|               ] | ||||
|             } | ||||
| @ -99,8 +99,8 @@ snapshot_kind: text | ||||
|           "__meta": [ | ||||
|             { | ||||
|               "sourceRange": [ | ||||
|                 46, | ||||
|                 48, | ||||
|                 50, | ||||
|                 0 | ||||
|               ] | ||||
|             } | ||||
| @ -112,8 +112,8 @@ snapshot_kind: text | ||||
|           "__meta": [ | ||||
|             { | ||||
|               "sourceRange": [ | ||||
|                 46, | ||||
|                 48, | ||||
|                 50, | ||||
|                 0 | ||||
|               ] | ||||
|             } | ||||
|  | ||||
| @ -20,8 +20,20 @@ snapshot_kind: text | ||||
|     { | ||||
|       "type": "word", | ||||
|       "start": 35, | ||||
|       "end": 38, | ||||
|       "value": "arr" | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 38, | ||||
|       "end": 39, | ||||
|       "value": " " | ||||
|     }, | ||||
|     { | ||||
|       "type": "operator", | ||||
|       "start": 39, | ||||
|       "end": 40, | ||||
|       "value": "array" | ||||
|       "value": "=" | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
| @ -30,161 +42,167 @@ snapshot_kind: text | ||||
|       "value": " " | ||||
|     }, | ||||
|     { | ||||
|       "type": "operator", | ||||
|       "type": "brace", | ||||
|       "start": 41, | ||||
|       "end": 42, | ||||
|       "value": "=" | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 42, | ||||
|       "end": 43, | ||||
|       "value": " " | ||||
|     }, | ||||
|     { | ||||
|       "type": "brace", | ||||
|       "start": 43, | ||||
|       "end": 44, | ||||
|       "value": "[" | ||||
|     }, | ||||
|     { | ||||
|       "type": "number", | ||||
|       "start": 44, | ||||
|       "end": 46, | ||||
|       "start": 42, | ||||
|       "end": 44, | ||||
|       "value": "90" | ||||
|     }, | ||||
|     { | ||||
|       "type": "comma", | ||||
|       "start": 46, | ||||
|       "end": 47, | ||||
|       "start": 44, | ||||
|       "end": 45, | ||||
|       "value": "," | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 47, | ||||
|       "end": 48, | ||||
|       "start": 45, | ||||
|       "end": 46, | ||||
|       "value": " " | ||||
|     }, | ||||
|     { | ||||
|       "type": "number", | ||||
|       "start": 48, | ||||
|       "end": 50, | ||||
|       "start": 46, | ||||
|       "end": 48, | ||||
|       "value": "91" | ||||
|     }, | ||||
|     { | ||||
|       "type": "comma", | ||||
|       "start": 50, | ||||
|       "end": 51, | ||||
|       "start": 48, | ||||
|       "end": 49, | ||||
|       "value": "," | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 51, | ||||
|       "end": 52, | ||||
|       "start": 49, | ||||
|       "end": 50, | ||||
|       "value": " " | ||||
|     }, | ||||
|     { | ||||
|       "type": "number", | ||||
|       "start": 52, | ||||
|       "end": 54, | ||||
|       "start": 50, | ||||
|       "end": 52, | ||||
|       "value": "92" | ||||
|     }, | ||||
|     { | ||||
|       "type": "brace", | ||||
|       "start": 54, | ||||
|       "end": 55, | ||||
|       "start": 52, | ||||
|       "end": 53, | ||||
|       "value": "]" | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 55, | ||||
|       "end": 57, | ||||
|       "start": 53, | ||||
|       "end": 55, | ||||
|       "value": "\n\n" | ||||
|     }, | ||||
|     { | ||||
|       "type": "lineComment", | ||||
|       "start": 57, | ||||
|       "end": 80, | ||||
|       "start": 55, | ||||
|       "end": 78, | ||||
|       "value": "// Test: literal index." | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 80, | ||||
|       "end": 83, | ||||
|       "start": 78, | ||||
|       "end": 81, | ||||
|       "value": "\n\n\n" | ||||
|     }, | ||||
|     { | ||||
|       "type": "word", | ||||
|       "start": 83, | ||||
|       "end": 90, | ||||
|       "start": 81, | ||||
|       "end": 88, | ||||
|       "value": "result0" | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 88, | ||||
|       "end": 89, | ||||
|       "value": " " | ||||
|     }, | ||||
|     { | ||||
|       "type": "operator", | ||||
|       "start": 89, | ||||
|       "end": 90, | ||||
|       "value": "=" | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 90, | ||||
|       "end": 91, | ||||
|       "value": " " | ||||
|     }, | ||||
|     { | ||||
|       "type": "operator", | ||||
|       "start": 91, | ||||
|       "end": 92, | ||||
|       "value": "=" | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 92, | ||||
|       "end": 93, | ||||
|       "value": " " | ||||
|     }, | ||||
|     { | ||||
|       "type": "word", | ||||
|       "start": 93, | ||||
|       "end": 98, | ||||
|       "value": "array" | ||||
|       "start": 91, | ||||
|       "end": 94, | ||||
|       "value": "arr" | ||||
|     }, | ||||
|     { | ||||
|       "type": "brace", | ||||
|       "start": 98, | ||||
|       "end": 99, | ||||
|       "start": 94, | ||||
|       "end": 95, | ||||
|       "value": "[" | ||||
|     }, | ||||
|     { | ||||
|       "type": "number", | ||||
|       "start": 99, | ||||
|       "end": 100, | ||||
|       "start": 95, | ||||
|       "end": 96, | ||||
|       "value": "1" | ||||
|     }, | ||||
|     { | ||||
|       "type": "brace", | ||||
|       "start": 100, | ||||
|       "end": 101, | ||||
|       "start": 96, | ||||
|       "end": 97, | ||||
|       "value": "]" | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 101, | ||||
|       "end": 103, | ||||
|       "start": 97, | ||||
|       "end": 99, | ||||
|       "value": "\n\n" | ||||
|     }, | ||||
|     { | ||||
|       "type": "word", | ||||
|       "start": 103, | ||||
|       "end": 121, | ||||
|       "start": 99, | ||||
|       "end": 117, | ||||
|       "value": "assertLessThanOrEq" | ||||
|     }, | ||||
|     { | ||||
|       "type": "brace", | ||||
|       "start": 121, | ||||
|       "end": 122, | ||||
|       "start": 117, | ||||
|       "end": 118, | ||||
|       "value": "(" | ||||
|     }, | ||||
|     { | ||||
|       "type": "word", | ||||
|       "start": 122, | ||||
|       "end": 129, | ||||
|       "start": 118, | ||||
|       "end": 125, | ||||
|       "value": "result0" | ||||
|     }, | ||||
|     { | ||||
|       "type": "comma", | ||||
|       "start": 125, | ||||
|       "end": 126, | ||||
|       "value": "," | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 126, | ||||
|       "end": 127, | ||||
|       "value": " " | ||||
|     }, | ||||
|     { | ||||
|       "type": "number", | ||||
|       "start": 127, | ||||
|       "end": 129, | ||||
|       "value": "91" | ||||
|     }, | ||||
|     { | ||||
|       "type": "comma", | ||||
|       "start": 129, | ||||
| @ -197,60 +215,60 @@ snapshot_kind: text | ||||
|       "end": 131, | ||||
|       "value": " " | ||||
|     }, | ||||
|     { | ||||
|       "type": "number", | ||||
|       "start": 131, | ||||
|       "end": 133, | ||||
|       "value": "91" | ||||
|     }, | ||||
|     { | ||||
|       "type": "comma", | ||||
|       "start": 133, | ||||
|       "end": 134, | ||||
|       "value": "," | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 134, | ||||
|       "end": 135, | ||||
|       "value": " " | ||||
|     }, | ||||
|     { | ||||
|       "type": "string", | ||||
|       "start": 135, | ||||
|       "end": 160, | ||||
|       "start": 131, | ||||
|       "end": 156, | ||||
|       "value": "\"Literal property lookup\"" | ||||
|     }, | ||||
|     { | ||||
|       "type": "brace", | ||||
|       "start": 160, | ||||
|       "end": 161, | ||||
|       "start": 156, | ||||
|       "end": 157, | ||||
|       "value": ")" | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 161, | ||||
|       "end": 162, | ||||
|       "start": 157, | ||||
|       "end": 158, | ||||
|       "value": "\n" | ||||
|     }, | ||||
|     { | ||||
|       "type": "word", | ||||
|       "start": 162, | ||||
|       "end": 183, | ||||
|       "start": 158, | ||||
|       "end": 179, | ||||
|       "value": "assertGreaterThanOrEq" | ||||
|     }, | ||||
|     { | ||||
|       "type": "brace", | ||||
|       "start": 183, | ||||
|       "end": 184, | ||||
|       "start": 179, | ||||
|       "end": 180, | ||||
|       "value": "(" | ||||
|     }, | ||||
|     { | ||||
|       "type": "word", | ||||
|       "start": 184, | ||||
|       "end": 191, | ||||
|       "start": 180, | ||||
|       "end": 187, | ||||
|       "value": "result0" | ||||
|     }, | ||||
|     { | ||||
|       "type": "comma", | ||||
|       "start": 187, | ||||
|       "end": 188, | ||||
|       "value": "," | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 188, | ||||
|       "end": 189, | ||||
|       "value": " " | ||||
|     }, | ||||
|     { | ||||
|       "type": "number", | ||||
|       "start": 189, | ||||
|       "end": 191, | ||||
|       "value": "91" | ||||
|     }, | ||||
|     { | ||||
|       "type": "comma", | ||||
|       "start": 191, | ||||
| @ -263,316 +281,298 @@ snapshot_kind: text | ||||
|       "end": 193, | ||||
|       "value": " " | ||||
|     }, | ||||
|     { | ||||
|       "type": "number", | ||||
|       "start": 193, | ||||
|       "end": 195, | ||||
|       "value": "91" | ||||
|     }, | ||||
|     { | ||||
|       "type": "comma", | ||||
|       "start": 195, | ||||
|       "end": 196, | ||||
|       "value": "," | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 196, | ||||
|       "end": 197, | ||||
|       "value": " " | ||||
|     }, | ||||
|     { | ||||
|       "type": "string", | ||||
|       "start": 197, | ||||
|       "end": 222, | ||||
|       "start": 193, | ||||
|       "end": 218, | ||||
|       "value": "\"Literal property lookup\"" | ||||
|     }, | ||||
|     { | ||||
|       "type": "brace", | ||||
|       "start": 222, | ||||
|       "end": 223, | ||||
|       "start": 218, | ||||
|       "end": 219, | ||||
|       "value": ")" | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 223, | ||||
|       "end": 225, | ||||
|       "start": 219, | ||||
|       "end": 221, | ||||
|       "value": "\n\n" | ||||
|     }, | ||||
|     { | ||||
|       "type": "lineComment", | ||||
|       "start": 225, | ||||
|       "end": 249, | ||||
|       "start": 221, | ||||
|       "end": 245, | ||||
|       "value": "// Test: computed index." | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 249, | ||||
|       "end": 252, | ||||
|       "start": 245, | ||||
|       "end": 248, | ||||
|       "value": "\n\n\n" | ||||
|     }, | ||||
|     { | ||||
|       "type": "word", | ||||
|       "start": 252, | ||||
|       "end": 253, | ||||
|       "start": 248, | ||||
|       "end": 249, | ||||
|       "value": "i" | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 253, | ||||
|       "end": 254, | ||||
|       "start": 249, | ||||
|       "end": 250, | ||||
|       "value": " " | ||||
|     }, | ||||
|     { | ||||
|       "type": "operator", | ||||
|       "start": 254, | ||||
|       "end": 255, | ||||
|       "start": 250, | ||||
|       "end": 251, | ||||
|       "value": "=" | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 255, | ||||
|       "end": 256, | ||||
|       "start": 251, | ||||
|       "end": 252, | ||||
|       "value": " " | ||||
|     }, | ||||
|     { | ||||
|       "type": "word", | ||||
|       "start": 256, | ||||
|       "end": 259, | ||||
|       "start": 252, | ||||
|       "end": 255, | ||||
|       "value": "int" | ||||
|     }, | ||||
|     { | ||||
|       "type": "brace", | ||||
|       "start": 255, | ||||
|       "end": 256, | ||||
|       "value": "(" | ||||
|     }, | ||||
|     { | ||||
|       "type": "number", | ||||
|       "start": 256, | ||||
|       "end": 257, | ||||
|       "value": "1" | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 257, | ||||
|       "end": 258, | ||||
|       "value": " " | ||||
|     }, | ||||
|     { | ||||
|       "type": "operator", | ||||
|       "start": 258, | ||||
|       "end": 259, | ||||
|       "value": "+" | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 259, | ||||
|       "end": 260, | ||||
|       "value": "(" | ||||
|       "value": " " | ||||
|     }, | ||||
|     { | ||||
|       "type": "number", | ||||
|       "start": 260, | ||||
|       "end": 261, | ||||
|       "value": "1" | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 261, | ||||
|       "end": 262, | ||||
|       "value": " " | ||||
|     }, | ||||
|     { | ||||
|       "type": "operator", | ||||
|       "start": 262, | ||||
|       "end": 263, | ||||
|       "value": "+" | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 263, | ||||
|       "end": 264, | ||||
|       "value": " " | ||||
|     }, | ||||
|     { | ||||
|       "type": "number", | ||||
|       "start": 264, | ||||
|       "end": 265, | ||||
|       "value": "0" | ||||
|     }, | ||||
|     { | ||||
|       "type": "brace", | ||||
|       "start": 265, | ||||
|       "end": 266, | ||||
|       "start": 261, | ||||
|       "end": 262, | ||||
|       "value": ")" | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 266, | ||||
|       "end": 267, | ||||
|       "start": 262, | ||||
|       "end": 263, | ||||
|       "value": "\n" | ||||
|     }, | ||||
|     { | ||||
|       "type": "word", | ||||
|       "start": 267, | ||||
|       "end": 274, | ||||
|       "start": 263, | ||||
|       "end": 270, | ||||
|       "value": "result1" | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 274, | ||||
|       "end": 275, | ||||
|       "start": 270, | ||||
|       "end": 271, | ||||
|       "value": " " | ||||
|     }, | ||||
|     { | ||||
|       "type": "operator", | ||||
|       "start": 275, | ||||
|       "end": 276, | ||||
|       "start": 271, | ||||
|       "end": 272, | ||||
|       "value": "=" | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 276, | ||||
|       "end": 277, | ||||
|       "start": 272, | ||||
|       "end": 273, | ||||
|       "value": " " | ||||
|     }, | ||||
|     { | ||||
|       "type": "word", | ||||
|       "start": 277, | ||||
|       "end": 282, | ||||
|       "value": "array" | ||||
|       "start": 273, | ||||
|       "end": 276, | ||||
|       "value": "arr" | ||||
|     }, | ||||
|     { | ||||
|       "type": "brace", | ||||
|       "start": 282, | ||||
|       "end": 283, | ||||
|       "start": 276, | ||||
|       "end": 277, | ||||
|       "value": "[" | ||||
|     }, | ||||
|     { | ||||
|       "type": "word", | ||||
|       "start": 283, | ||||
|       "end": 284, | ||||
|       "start": 277, | ||||
|       "end": 278, | ||||
|       "value": "i" | ||||
|     }, | ||||
|     { | ||||
|       "type": "brace", | ||||
|       "start": 284, | ||||
|       "end": 285, | ||||
|       "start": 278, | ||||
|       "end": 279, | ||||
|       "value": "]" | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 285, | ||||
|       "end": 287, | ||||
|       "start": 279, | ||||
|       "end": 281, | ||||
|       "value": "\n\n" | ||||
|     }, | ||||
|     { | ||||
|       "type": "word", | ||||
|       "start": 287, | ||||
|       "end": 305, | ||||
|       "start": 281, | ||||
|       "end": 299, | ||||
|       "value": "assertLessThanOrEq" | ||||
|     }, | ||||
|     { | ||||
|       "type": "brace", | ||||
|       "start": 305, | ||||
|       "end": 306, | ||||
|       "start": 299, | ||||
|       "end": 300, | ||||
|       "value": "(" | ||||
|     }, | ||||
|     { | ||||
|       "type": "word", | ||||
|       "start": 306, | ||||
|       "end": 313, | ||||
|       "start": 300, | ||||
|       "end": 307, | ||||
|       "value": "result1" | ||||
|     }, | ||||
|     { | ||||
|       "type": "comma", | ||||
|       "start": 313, | ||||
|       "end": 314, | ||||
|       "start": 307, | ||||
|       "end": 308, | ||||
|       "value": "," | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 314, | ||||
|       "end": 315, | ||||
|       "start": 308, | ||||
|       "end": 309, | ||||
|       "value": " " | ||||
|     }, | ||||
|     { | ||||
|       "type": "number", | ||||
|       "start": 315, | ||||
|       "end": 317, | ||||
|       "start": 309, | ||||
|       "end": 311, | ||||
|       "value": "91" | ||||
|     }, | ||||
|     { | ||||
|       "type": "comma", | ||||
|       "start": 317, | ||||
|       "end": 318, | ||||
|       "start": 311, | ||||
|       "end": 312, | ||||
|       "value": "," | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 318, | ||||
|       "end": 319, | ||||
|       "start": 312, | ||||
|       "end": 313, | ||||
|       "value": " " | ||||
|     }, | ||||
|     { | ||||
|       "type": "string", | ||||
|       "start": 319, | ||||
|       "end": 345, | ||||
|       "start": 313, | ||||
|       "end": 339, | ||||
|       "value": "\"Computed property lookup\"" | ||||
|     }, | ||||
|     { | ||||
|       "type": "brace", | ||||
|       "start": 345, | ||||
|       "end": 346, | ||||
|       "start": 339, | ||||
|       "end": 340, | ||||
|       "value": ")" | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 346, | ||||
|       "end": 347, | ||||
|       "start": 340, | ||||
|       "end": 341, | ||||
|       "value": "\n" | ||||
|     }, | ||||
|     { | ||||
|       "type": "word", | ||||
|       "start": 347, | ||||
|       "end": 368, | ||||
|       "start": 341, | ||||
|       "end": 362, | ||||
|       "value": "assertGreaterThanOrEq" | ||||
|     }, | ||||
|     { | ||||
|       "type": "brace", | ||||
|       "start": 368, | ||||
|       "end": 369, | ||||
|       "start": 362, | ||||
|       "end": 363, | ||||
|       "value": "(" | ||||
|     }, | ||||
|     { | ||||
|       "type": "word", | ||||
|       "start": 369, | ||||
|       "end": 376, | ||||
|       "start": 363, | ||||
|       "end": 370, | ||||
|       "value": "result1" | ||||
|     }, | ||||
|     { | ||||
|       "type": "comma", | ||||
|       "start": 376, | ||||
|       "end": 377, | ||||
|       "start": 370, | ||||
|       "end": 371, | ||||
|       "value": "," | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 377, | ||||
|       "end": 378, | ||||
|       "start": 371, | ||||
|       "end": 372, | ||||
|       "value": " " | ||||
|     }, | ||||
|     { | ||||
|       "type": "number", | ||||
|       "start": 378, | ||||
|       "end": 380, | ||||
|       "start": 372, | ||||
|       "end": 374, | ||||
|       "value": "91" | ||||
|     }, | ||||
|     { | ||||
|       "type": "comma", | ||||
|       "start": 380, | ||||
|       "end": 381, | ||||
|       "start": 374, | ||||
|       "end": 375, | ||||
|       "value": "," | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 381, | ||||
|       "end": 382, | ||||
|       "start": 375, | ||||
|       "end": 376, | ||||
|       "value": " " | ||||
|     }, | ||||
|     { | ||||
|       "type": "string", | ||||
|       "start": 382, | ||||
|       "end": 408, | ||||
|       "start": 376, | ||||
|       "end": 402, | ||||
|       "value": "\"Computed property lookup\"" | ||||
|     }, | ||||
|     { | ||||
|       "type": "brace", | ||||
|       "start": 408, | ||||
|       "end": 409, | ||||
|       "start": 402, | ||||
|       "end": 403, | ||||
|       "value": ")" | ||||
|     }, | ||||
|     { | ||||
|       "type": "whitespace", | ||||
|       "start": 409, | ||||
|       "end": 410, | ||||
|       "start": 403, | ||||
|       "end": 404, | ||||
|       "value": "\n" | ||||
|     } | ||||
|   ] | ||||
|  | ||||
| @ -27,7 +27,7 @@ fn Gte = (a, b) => { return Not(Lt(a, b)) } | ||||
|  | ||||
| deg = pi()*2 / 360 | ||||
|  | ||||
| fn setSketch = (state, _) => { | ||||
| fn setSketch = (state, _q) => { | ||||
|   return { | ||||
|     depthMax: state.depthMax, | ||||
|     depth: state.depth + 1, | ||||
| @ -35,43 +35,43 @@ fn setSketch = (state, _) => { | ||||
|     factor: state.factor, | ||||
|     currentAngle: state.currentAngle, | ||||
|     angle: state.angle, | ||||
|     _: _ | ||||
|     _q: _q | ||||
|   } | ||||
| } | ||||
|  | ||||
| fn setDepth = (state, _) => { | ||||
| fn setDepth = (state, _q) => { | ||||
|   return { | ||||
|     depthMax: state.depthMax, | ||||
|     depth: _, | ||||
|     depth: _q, | ||||
|     currentLength: state.currentLength, | ||||
|     factor: state.factor, | ||||
|     currentAngle: state.currentAngle, | ||||
|     angle: state.angle, | ||||
|     _:  state._ | ||||
|     _q:  state._q | ||||
|   } | ||||
| } | ||||
|  | ||||
| fn setAngle = (state, _) => { | ||||
| fn setAngle = (state, _q) => { | ||||
|   return { | ||||
|     depthMax: state.depthMax, | ||||
|     depth: state.depth, | ||||
|     currentLength: state.currentLength, | ||||
|     factor: state.factor, | ||||
|     currentAngle: _, | ||||
|     currentAngle: _q, | ||||
|     angle: state.angle, | ||||
|     _:  state._ | ||||
|     _q:  state._q | ||||
|   } | ||||
| } | ||||
|  | ||||
| fn setLength = (state, _) => { | ||||
| fn setLength = (state, _q) => { | ||||
|   return { | ||||
|     depthMax: state.depthMax, | ||||
|     depth: state.depth, | ||||
|     currentLength: _, | ||||
|     currentLength: _q, | ||||
|     factor: state.factor, | ||||
|     currentAngle: state.currentAngle, | ||||
|     angle: state.angle, | ||||
|     _:  state._ | ||||
|     _q:  state._q | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -95,7 +95,7 @@ fn F = (state, F) => { | ||||
|  | ||||
|   } else { | ||||
|     // Pass onto the next instruction | ||||
|     state |> setSketch(%, angledLine({ angle: state.currentAngle, length: state.currentLength }, state._)) | ||||
|     state |> setSketch(%, angledLine({ angle: state.currentAngle, length: state.currentLength }, state._q)) | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -107,7 +107,7 @@ fn LSystem = (args, axioms) => { | ||||
|     factor: args.factor, | ||||
|     currentAngle: 0, | ||||
|     angle: args.angle, | ||||
|     _: startSketchAt([0, 0]), | ||||
|     _q: startSketchAt([0, 0]), | ||||
|   }) | ||||
| } | ||||
|  | ||||
| @ -115,7 +115,7 @@ LSystem({ | ||||
|   iterations: 1, | ||||
|   factor: 1.36, | ||||
|   angle: 60, | ||||
| }, (_) => { | ||||
|   result = _ |> F(%, F) |> Add(%) |> Add(%) |> F(%, F) |> Add(%) |> Add(%) |> F(%, F)  | ||||
|   return result._ | ||||
| }, (_q) => { | ||||
|   result = _q |> F(%, F) |> Add(%) |> Add(%) |> F(%, F) |> Add(%) |> Add(%) |> F(%, F)  | ||||
|   return result._q | ||||
| }) | ||||
|  | ||||
							
								
								
									
										
											BIN
										
									
								
								src/wasm-lib/tests/executor/outputs/lsystem.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/wasm-lib/tests/executor/outputs/lsystem.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 37 KiB | 
		Reference in New Issue
	
	Block a user