From 90b57ec2025285fc4ebbde78a6f0cc2e4297f752 Mon Sep 17 00:00:00 2001 From: 49fl Date: Tue, 29 Oct 2024 21:40:31 -0400 Subject: [PATCH 01/13] Add lsystem.kcl to tests (#4146) * Add lsystem.kcl to tests * Reduce iterations * Fix the user settings flake shit (NOTE TO ALL FUTURE PEOPLE MODELING-APP DOES NOT WAIT FOR I/O IN SOME CASES BEFORE ROUTER NAVIGATION) --- e2e/playwright/projects.spec.ts | 1 + e2e/playwright/testing-settings.spec.ts | 21 ++- .../benches/compiler_benchmark_criterion.rs | 2 + .../kcl/benches/compiler_benchmark_iai.rs | 9 ++ src/wasm-lib/kcl/benches/digest_benchmark.rs | 2 + .../benches/executor_benchmark_criterion.rs | 2 + ...lsp_semantic_tokens_benchmark_criterion.rs | 2 + .../tests/executor/inputs/lsystem.kcl | 121 ++++++++++++++++++ src/wasm-lib/tests/executor/main.rs | 8 ++ 9 files changed, 163 insertions(+), 5 deletions(-) create mode 100644 src/wasm-lib/tests/executor/inputs/lsystem.kcl diff --git a/e2e/playwright/projects.spec.ts b/e2e/playwright/projects.spec.ts index 279775b59..a280996c0 100644 --- a/e2e/playwright/projects.spec.ts +++ b/e2e/playwright/projects.spec.ts @@ -1497,6 +1497,7 @@ test( 'i_shape.kcl', 'kittycad_svg.kcl', 'lego.kcl', + 'lsystem.kcl', 'math.kcl', 'member_expression_sketch.kcl', 'mike_stress_test.kcl', diff --git a/e2e/playwright/testing-settings.spec.ts b/e2e/playwright/testing-settings.spec.ts index ab876677d..ccf8837f7 100644 --- a/e2e/playwright/testing-settings.spec.ts +++ b/e2e/playwright/testing-settings.spec.ts @@ -286,11 +286,12 @@ test.describe('Testing settings', () => { await page.setViewportSize({ width: 1200, height: 500 }) // Selectors and constants - const tempSettingsFilePath = join( + const tempProjectSettingsFilePath = join( projectDirName, projectName, PROJECT_SETTINGS_FILE_NAME ) + const tempUserSettingsFilePath = join(projectDirName, SETTINGS_FILE_NAME) const userThemeColor = '120' const projectThemeColor = '50' const settingsOpenButton = page.getByRole('link', { @@ -311,6 +312,12 @@ test.describe('Testing settings', () => { await themeColorSetting.fill(userThemeColor) await expect(logoLink).toHaveCSS('--primary-hue', userThemeColor) await settingsCloseButton.click() + await expect + .poll(async () => fsp.readFile(tempUserSettingsFilePath, 'utf-8'), { + message: 'Setting should now be written to the file', + timeout: 5_000, + }) + .toContain(`themeColor = "${userThemeColor}"`) }) await test.step('Set project theme color', async () => { @@ -324,10 +331,13 @@ test.describe('Testing settings', () => { await settingsCloseButton.click() // Make sure that the project settings file has been written to before continuing await expect - .poll(async () => fsp.readFile(tempSettingsFilePath, 'utf-8'), { - message: 'Setting should now be written to the file', - timeout: 5_000, - }) + .poll( + async () => fsp.readFile(tempProjectSettingsFilePath, 'utf-8'), + { + message: 'Setting should now be written to the file', + timeout: 5_000, + } + ) .toContain(`themeColor = "${projectThemeColor}"`) }) @@ -341,6 +351,7 @@ test.describe('Testing settings', () => { await test.step(`Navigate back to the home view and see user setting applied`, async () => { await logoLink.click() + await page.screenshot({ path: 'out.png' }) await expect(logoLink).toHaveCSS('--primary-hue', userThemeColor) }) diff --git a/src/wasm-lib/kcl/benches/compiler_benchmark_criterion.rs b/src/wasm-lib/kcl/benches/compiler_benchmark_criterion.rs index 534bb262d..f913a2665 100644 --- a/src/wasm-lib/kcl/benches/compiler_benchmark_criterion.rs +++ b/src/wasm-lib/kcl/benches/compiler_benchmark_criterion.rs @@ -13,6 +13,7 @@ pub fn bench_parse(c: &mut Criterion) { ("cube", CUBE_PROGRAM), ("math", MATH_PROGRAM), ("mike_stress_test", MIKE_STRESS_TEST_PROGRAM), + ("koch snowflake", LSYSTEM_KOCH_SNOWFLAKE_PROGRAM), ] { let tokens = kcl_lib::token::lexer(file).unwrap(); c.bench_function(&format!("parse_{name}"), move |b| { @@ -37,3 +38,4 @@ const PIPES_PROGRAM: &str = include_str!("../../tests/executor/inputs/pipes_on_p const CUBE_PROGRAM: &str = include_str!("../../tests/executor/inputs/cube.kcl"); const MATH_PROGRAM: &str = include_str!("../../tests/executor/inputs/math.kcl"); const MIKE_STRESS_TEST_PROGRAM: &str = include_str!("../../tests/executor/inputs/mike_stress_test.kcl"); +const LSYSTEM_KOCH_SNOWFLAKE_PROGRAM: &str = include_str!("../../tests/executor/inputs/lsystem.kcl"); diff --git a/src/wasm-lib/kcl/benches/compiler_benchmark_iai.rs b/src/wasm-lib/kcl/benches/compiler_benchmark_iai.rs index bdaf5d0c3..c1d27c8d4 100644 --- a/src/wasm-lib/kcl/benches/compiler_benchmark_iai.rs +++ b/src/wasm-lib/kcl/benches/compiler_benchmark_iai.rs @@ -19,6 +19,9 @@ fn lex_cube() { fn lex_math() { black_box(kcl_lib::token::lexer(MATH_PROGRAM).unwrap()); } +fn lex_lsystem() { + black_box(kcl_lib::token::lexer(LSYSTEM_PROGRAM).unwrap()); +} fn parse_kitt() { parse(KITT_PROGRAM) @@ -32,19 +35,25 @@ fn parse_cube() { fn parse_math() { parse(MATH_PROGRAM) } +fn parse_lsystem() { + parse(LSYSTEM_PROGRAM) +} iai::main! { lex_kitt, lex_pipes, lex_cube, lex_math, + lex_lsystem, parse_kitt, parse_pipes, parse_cube, parse_math, + parse_lsystem, } const KITT_PROGRAM: &str = include_str!("../../tests/executor/inputs/kittycad_svg.kcl"); const PIPES_PROGRAM: &str = include_str!("../../tests/executor/inputs/pipes_on_pipes.kcl"); const CUBE_PROGRAM: &str = include_str!("../../tests/executor/inputs/cube.kcl"); const MATH_PROGRAM: &str = include_str!("../../tests/executor/inputs/math.kcl"); +const LSYSTEM_PROGRAM: &str = include_str!("../../tests/executor/inputs/lsystem.kcl"); diff --git a/src/wasm-lib/kcl/benches/digest_benchmark.rs b/src/wasm-lib/kcl/benches/digest_benchmark.rs index 65e60de4d..91b8e949c 100644 --- a/src/wasm-lib/kcl/benches/digest_benchmark.rs +++ b/src/wasm-lib/kcl/benches/digest_benchmark.rs @@ -7,6 +7,7 @@ pub fn bench_digest(c: &mut Criterion) { ("cube", CUBE_PROGRAM), ("math", MATH_PROGRAM), ("mike_stress_test", MIKE_STRESS_TEST_PROGRAM), + ("lsystem", LSYSTEM_PROGRAM), ] { let tokens = kcl_lib::token::lexer(file).unwrap(); let prog = kcl_lib::parser::Parser::new(tokens).ast().unwrap(); @@ -29,3 +30,4 @@ const PIPES_PROGRAM: &str = include_str!("../../tests/executor/inputs/pipes_on_p const CUBE_PROGRAM: &str = include_str!("../../tests/executor/inputs/cube.kcl"); const MATH_PROGRAM: &str = include_str!("../../tests/executor/inputs/math.kcl"); const MIKE_STRESS_TEST_PROGRAM: &str = include_str!("../../tests/executor/inputs/mike_stress_test.kcl"); +const LSYSTEM_PROGRAM: &str = include_str!("../../tests/executor/inputs/lsystem.kcl"); diff --git a/src/wasm-lib/kcl/benches/executor_benchmark_criterion.rs b/src/wasm-lib/kcl/benches/executor_benchmark_criterion.rs index 613c16436..d2a48a114 100644 --- a/src/wasm-lib/kcl/benches/executor_benchmark_criterion.rs +++ b/src/wasm-lib/kcl/benches/executor_benchmark_criterion.rs @@ -8,6 +8,7 @@ pub fn bench_execute(c: &mut Criterion) { ("cube", CUBE_PROGRAM), ("server_rack_lite", SERVER_RACK_LITE_PROGRAM), ("server_rack_heavy", SERVER_RACK_HEAVY_PROGRAM), + ("lsystem", LSYSTEM_PROGRAM), ] { let mut group = c.benchmark_group("executor"); // Configure Criterion.rs to detect smaller differences and increase sample size to improve @@ -52,3 +53,4 @@ const CUBE_PROGRAM: &str = include_str!("../../tests/executor/inputs/cube.kcl"); const SERVER_RACK_HEAVY_PROGRAM: &str = include_str!("../../tests/executor/inputs/server-rack-heavy.kcl"); const SERVER_RACK_LITE_PROGRAM: &str = include_str!("../../tests/executor/inputs/server-rack-lite.kcl"); const LEGO_PROGRAM: &str = include_str!("../../tests/executor/inputs/slow_lego.kcl.tmpl"); +const LSYSTEM_PROGRAM: &str = include_str!("../../tests/executor/inputs/lsystem.kcl"); diff --git a/src/wasm-lib/kcl/benches/lsp_semantic_tokens_benchmark_criterion.rs b/src/wasm-lib/kcl/benches/lsp_semantic_tokens_benchmark_criterion.rs index 22dba2d18..d74b95c05 100644 --- a/src/wasm-lib/kcl/benches/lsp_semantic_tokens_benchmark_criterion.rs +++ b/src/wasm-lib/kcl/benches/lsp_semantic_tokens_benchmark_criterion.rs @@ -42,6 +42,7 @@ fn bench_kcl_lsp_semantic_tokens(c: &mut Criterion) { ("math", MATH_PROGRAM), ("mike_stress_test", MIKE_STRESS_TEST_PROGRAM), ("global_tags", GLOBAL_TAGS_FILE), + ("lsystem", LSYSTEM_PROGRAM), ] { c.bench_with_input(BenchmarkId::new("semantic_tokens_", name), &code, |b, &s| { let rt = Runtime::new().unwrap(); @@ -63,3 +64,4 @@ const CUBE_PROGRAM: &str = include_str!("../../tests/executor/inputs/cube.kcl"); const MATH_PROGRAM: &str = include_str!("../../tests/executor/inputs/math.kcl"); const MIKE_STRESS_TEST_PROGRAM: &str = include_str!("../../tests/executor/inputs/mike_stress_test.kcl"); const GLOBAL_TAGS_FILE: &str = include_str!("../../tests/executor/inputs/global-tags.kcl"); +const LSYSTEM_PROGRAM: &str = include_str!("../../tests/executor/inputs/lsystem.kcl"); diff --git a/src/wasm-lib/tests/executor/inputs/lsystem.kcl b/src/wasm-lib/tests/executor/inputs/lsystem.kcl new file mode 100644 index 000000000..51b4fe861 --- /dev/null +++ b/src/wasm-lib/tests/executor/inputs/lsystem.kcl @@ -0,0 +1,121 @@ +// L-System KCL +// Zoo Corporation ⓒ 2024 + +// Comparators + +fn cond = (bools) => { + return (a, b) => { + x = int(min(max(-1, a-b), 1) + 1) + return bools[x] + } +} + +fn Not = (b) => { return if b { false } else { true } } +fn And = (a, b) => { return if a { if b { true } else { false } } else { false }} +fn Or = (a, b) => { return if a { true } else { if b { true } else { false }}} + +Eq = cond([false, true, false]) +Lt = cond([true, false, false]) +Gt = cond([false, false, true]) + +fn Lte = (a, b) => { return Not(Gt(a, b)) } +fn Gte = (a, b) => { return Not(Lt(a, b)) } + +// L-system +// Note: it was most concise to encode productions directly in axioms. +// Change them as you need. + +deg = pi()*2 / 360 + +fn setSketch = (state, _) => { + return { + depthMax: state.depthMax, + depth: state.depth + 1, + currentLength: state.currentLength, + factor: state.factor, + currentAngle: state.currentAngle, + angle: state.angle, + _: _ + } +} + +fn setDepth = (state, _) => { + return { + depthMax: state.depthMax, + depth: _, + currentLength: state.currentLength, + factor: state.factor, + currentAngle: state.currentAngle, + angle: state.angle, + _: state._ + } +} + +fn setAngle = (state, _) => { + return { + depthMax: state.depthMax, + depth: state.depth, + currentLength: state.currentLength, + factor: state.factor, + currentAngle: _, + angle: state.angle, + _: state._ + } +} + +fn setLength = (state, _) => { + return { + depthMax: state.depthMax, + depth: state.depth, + currentLength: _, + factor: state.factor, + currentAngle: state.currentAngle, + angle: state.angle, + _: state._ + } +} + +fn Gt2 = (state) => { return setLength(state, state.currentLength * state.factor) } +fn Lt2 = (state) => { return setLength(state, state.currentLength / state.factor) } +fn Add = (state) => { return setAngle(state, rem(int(state.currentAngle - state.angle), 360)) } +fn Sub = (state) => { return setAngle(state, rem(int(state.currentAngle + state.angle), 360)) } + +// Only necessary to get around recursion limitations... +fn F = (state, F) => { + return if Lt(state.depth, state.depthMax) { + stateNext = state |> setDepth(%, state.depth + 1) + + // Produce + // Note:if you need [ and ], just save state to a variable. + stateNext + |> F(%, F) |> Sub(%) |> F(%, F) + |> Add(%) |> Add(%) + |> F(%, F) |> Sub(%) |> F(%, F) + |> setDepth(%, stateNext.depth - 1) + + } else { + // Pass onto the next instruction + state |> setSketch(%, angledLine({ angle: state.currentAngle, length: state.currentLength }, state._)) + } +} + +fn LSystem = (args, axioms) => { + return axioms({ + depthMax: args.iterations, + depth: 0, + currentLength: 1.0, + factor: args.factor, + currentAngle: 0, + angle: args.angle, + _: startSketchAt([0, 0]), + }) +} + +LSystem({ + iterations: 1, + factor: 1.36, + angle: 60, +}, (_) => { + result = _ |> F(%, F) |> Add(%) |> Add(%) |> F(%, F) |> Add(%) |> Add(%) |> F(%, F) + return result._ +}) diff --git a/src/wasm-lib/tests/executor/main.rs b/src/wasm-lib/tests/executor/main.rs index 1131a97dd..986fc8e09 100644 --- a/src/wasm-lib/tests/executor/main.rs +++ b/src/wasm-lib/tests/executor/main.rs @@ -121,6 +121,14 @@ async fn kcl_test_execute_kittycad_svg() { assert_out("kittycad_svg", &result); } +#[tokio::test(flavor = "multi_thread")] +async fn kcl_test_execute_lsystem() { + let code = kcl_input!("lsystem"); + + let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + assert_out("lsystem", &result); +} + #[tokio::test(flavor = "multi_thread")] async fn kcl_test_member_expression_sketch() { let code = kcl_input!("member_expression_sketch"); From 99db31a6a4db77a03d3b628553310eb7a763e39b Mon Sep 17 00:00:00 2001 From: Frank Noirot Date: Tue, 29 Oct 2024 18:42:53 -0700 Subject: [PATCH 02/13] Tests: remove all timeouts and pasting into editor from file name collision PW test (#4352) remove all timeouts and pasting into editor from file name collision PW test --- e2e/playwright/file-tree.spec.ts | 97 ++++++++++++++++++-------------- e2e/playwright/test-utils.ts | 3 + 2 files changed, 58 insertions(+), 42 deletions(-) diff --git a/e2e/playwright/file-tree.spec.ts b/e2e/playwright/file-tree.spec.ts index 8fbdb0a15..96252bd9e 100644 --- a/e2e/playwright/file-tree.spec.ts +++ b/e2e/playwright/file-tree.spec.ts @@ -193,61 +193,74 @@ test.describe('when using the file tree to', () => { test( 'create a new file with the same name as an existing file cancels the operation', { tag: '@electron' }, - async ({ browser: _, tronApp }, testInfo) => { - await tronApp.initialise() + async ( + { browser: _, tronApp, homePage, scene, editor, toolbar }, + testInfo + ) => { + const projectName = 'cube' + const mainFile = 'main.kcl' + const secondFile = 'cylinder.kcl' + const kclCube = await fsp.readFile(executorInputPath('cube.kcl'), 'utf-8') + const kclCylinder = await fsp.readFile( + executorInputPath('cylinder.kcl'), + 'utf-8' + ) + await tronApp.initialise({ + fixtures: { homePage, scene, editor, toolbar }, + folderSetupFn: async (dir) => { + const cubeDir = join(dir, projectName) + await fsp.mkdir(cubeDir, { recursive: true }) + await fsp.copyFile( + executorInputPath('cube.kcl'), + join(cubeDir, mainFile) + ) + await fsp.copyFile( + executorInputPath('cylinder.kcl'), + join(cubeDir, secondFile) + ) + }, + }) const { - openKclCodePanel, openFilePanel, - pasteCodeInEditor, - createNewFileAndSelect, renameFile, selectFile, editorTextMatches, + waitForPageLoad, } = await getUtils(tronApp.page, _test) - await tronApp.page.setViewportSize({ width: 1200, height: 500 }) - tronApp.page.on('console', console.log) + await test.step(`Setup: Open project and navigate to ${secondFile}`, async () => { + await homePage.expectState({ + projectCards: [ + { + title: projectName, + fileCount: 2, + folderCount: 2, // TODO: This is a pre-existing bug, there are no folders within the project + }, + ], + sortBy: 'last-modified-desc', + }) + await homePage.openProject(projectName) + await waitForPageLoad() + await openFilePanel() + await selectFile(secondFile) + }) - await createProject({ name: 'project-000', page: tronApp.page }) - await openKclCodePanel() - await openFilePanel() - // File the main.kcl with contents - const kclCube = await fsp.readFile( - 'src/wasm-lib/tests/executor/inputs/cube.kcl', - 'utf-8' - ) - await pasteCodeInEditor(kclCube) + await test.step(`Attempt to rename ${secondFile} to ${mainFile}`, async () => { + await renameFile(secondFile, mainFile) + }) - // TODO: We have a timeout of 1s between edits to write to disk. If you reload the page too quickly it won't write to disk. - await tronApp.page.waitForTimeout(2000) - - const kcl1 = 'main.kcl' - const kcl2 = '2.kcl' - await createNewFileAndSelect(kcl2) - const kclCylinder = await fsp.readFile( - 'src/wasm-lib/tests/executor/inputs/cylinder.kcl', - 'utf-8' - ) - await pasteCodeInEditor(kclCylinder) - - // TODO: We have a timeout of 1s between edits to write to disk. If you reload the page too quickly it won't write to disk. - await tronApp.page.waitForTimeout(2000) - - await renameFile(kcl2, kcl1) - - await test.step(`Postcondition: ${kcl1} still has the original content`, async () => { - await selectFile(kcl1) + await test.step(`Postcondition: ${mainFile} still has the original content`, async () => { + await selectFile(mainFile) await editorTextMatches(kclCube) }) - await tronApp.page.waitForTimeout(500) - await test.step(`Postcondition: ${kcl2} still exists with the original content`, async () => { - await selectFile(kcl2) + await test.step(`Postcondition: ${secondFile} still exists with the original content`, async () => { + await selectFile(secondFile) await editorTextMatches(kclCylinder) }) - await tronApp?.close?.() + await tronApp.close() } ) @@ -273,11 +286,11 @@ test.describe('when using the file tree to', () => { ) await pasteCodeInEditor(kclCube) - const kcl1 = 'main.kcl' + const mainFile = 'main.kcl' - await deleteFile(kcl1) + await deleteFile(mainFile) - await test.step(`Postcondition: ${kcl1} is recreated but has no content`, async () => { + await test.step(`Postcondition: ${mainFile} is recreated but has no content`, async () => { await editorTextMatches('') }) diff --git a/e2e/playwright/test-utils.ts b/e2e/playwright/test-utils.ts index e74f4c192..839fa9dba 100644 --- a/e2e/playwright/test-utils.ts +++ b/e2e/playwright/test-utils.ts @@ -506,6 +506,9 @@ export async function getUtils(page: Page, test_?: typeof test) { .locator('[data-testid="file-pane-scroll-container"] button') .filter({ hasText: name }) .click() + await expect(page.getByTestId('project-sidebar-toggle')).toContainText( + name + ) }) }, From 4804eedf3eaeff9ba7a7ea37b9bb494fd20a0541 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Oct 2024 22:17:19 -0400 Subject: [PATCH 03/13] Bump react-router-dom from 6.26.1 to 6.27.0 (#4286) Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.26.1 to 6.27.0. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/react-router-dom@6.27.0/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.27.0/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 30 +++++++++++++++--------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index 5a6e061d1..05e10ea69 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "react-json-view": "^1.21.3", "react-modal": "^3.16.1", "react-modal-promise": "^1.0.2", - "react-router-dom": "^6.26.1", + "react-router-dom": "^6.27.0", "sketch-helpers": "^0.0.4", "three": "^0.166.1", "ua-parser-js": "^1.0.37", diff --git a/yarn.lock b/yarn.lock index 53c24c078..297a868ca 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2214,10 +2214,10 @@ "@react-hook/latest" "^1.0.2" "@react-hook/passive-layout-effect" "^1.2.0" -"@remix-run/router@1.19.1": - version "1.19.1" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.19.1.tgz#984771bfd1de2715f42394c87fb716c1349e014f" - integrity sha512-S45oynt/WH19bHbIXjtli6QmwNYvaz+vtnubvNpNDvUOoA/OWh6j1OikIP3G+v5GHdxyC6EXoChG3HgYGEUfcg== +"@remix-run/router@1.20.0": + version "1.20.0" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.20.0.tgz#03554155b45d8b529adf635b2f6ad1165d70d8b4" + integrity sha512-mUnk8rPJBI9loFDZ+YzPGdeniYK+FTmRD1TMCz7ev2SNIozyKKpnGgsxO34u6Z4z/t0ITuu7voi/AshfsGsgFg== "@replit/codemirror-interact@^6.3.1": version "6.3.1" @@ -8066,20 +8066,20 @@ react-refresh@^0.14.2: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== -react-router-dom@^6.26.1: - version "6.26.1" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.26.1.tgz#a408892b41767a49dc94b3564b0e7d8e3959f623" - integrity sha512-veut7m41S1fLql4pLhxeSW3jlqs+4MtjRLj0xvuCEXsxusJCbs6I8yn9BxzzDX2XDgafrccY6hwjmd/bL54tFw== +react-router-dom@^6.27.0: + version "6.27.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.27.0.tgz#8d7972a425fd75f91c1e1ff67e47240c5752dc3f" + integrity sha512-+bvtFWMC0DgAFrfKXKG9Fc+BcXWRUO1aJIihbB79xaeq0v5UzfvnM5houGUm1Y461WVRcgAQ+Clh5rdb1eCx4g== dependencies: - "@remix-run/router" "1.19.1" - react-router "6.26.1" + "@remix-run/router" "1.20.0" + react-router "6.27.0" -react-router@6.26.1: - version "6.26.1" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.26.1.tgz#88c64837e05ffab6899a49df2a1484a22471e4ce" - integrity sha512-kIwJveZNwp7teQRI5QmwWo39A5bXRyqpH0COKKmPnyD2vBvDwgFXSqDUYtt1h+FEyfnE8eXr7oe0MxRzVwCcvQ== +react-router@6.27.0: + version "6.27.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.27.0.tgz#db292474926c814c996c0ff3ef0162d1f9f60ed4" + integrity sha512-YA+HGZXz4jaAkVoYBE98VQl+nVzI+cVI2Oj/06F5ZM+0u3TgedN9Y9kmMRo2mnkSK2nCpNQn0DVob4HCsY/WLw== dependencies: - "@remix-run/router" "1.19.1" + "@remix-run/router" "1.20.0" react-textarea-autosize@^8.3.2: version "8.5.3" From c161f578fd71a913d2339796a0a8a0cd4ef89266 Mon Sep 17 00:00:00 2001 From: Adam Chalmers Date: Tue, 29 Oct 2024 21:17:48 -0500 Subject: [PATCH 04/13] KCL test for subset of poop chute (#4343) This would have caught the regression in https://github.com/KittyCAD/modeling-app/pull/4333 which had to be reverted in https://github.com/KittyCAD/modeling-app/pull/4339 --- .../tests/executor/inputs/poop_chute.kcl | 58 ++++++++++++++++++ .../tests/executor/outputs/poop_chute.png | Bin 0 -> 75067 bytes src/wasm-lib/tests/executor/visuals.rs | 1 + 3 files changed, 59 insertions(+) create mode 100644 src/wasm-lib/tests/executor/inputs/poop_chute.kcl create mode 100644 src/wasm-lib/tests/executor/outputs/poop_chute.png diff --git a/src/wasm-lib/tests/executor/inputs/poop_chute.kcl b/src/wasm-lib/tests/executor/inputs/poop_chute.kcl new file mode 100644 index 000000000..cd6c79a11 --- /dev/null +++ b/src/wasm-lib/tests/executor/inputs/poop_chute.kcl @@ -0,0 +1,58 @@ +wall_thickness = 0.125 +back_walls_width = 2 +front_walls_width = 2.5 +height = 5.5 +filletRadius = 0.050 +back_length = 7 +exit_height = 1 +front_length = 6 +Fx = 0.5 +Fy = 0.5 + +sketch001 = startSketchOn('-YZ') + |> startProfileAt([back_walls_width / 2, 0], %) + |> xLine(wall_thickness / 2, %) + |> angledLineToX({ angle: 45, to: back_walls_width }, %, $seg01) + |> yLineTo(height, %) + |> xLine(-wall_thickness, %) + |> yLineTo(segEndY(seg01), %) + |> angledLineToX({ + angle: 45, + to: back_walls_width / 2 + wall_thickness / 2 + }, %) + |> xLine(-wall_thickness, %) + |> angledLineToX({ angle: 180 - 45, to: wall_thickness }, %) + |> yLineTo(height, %) + |> xLineTo(0, %) + |> yLineTo(segEndY(seg01), %) + |> angledLineToY({ angle: 180 - 45, to: 0 }, %) + |> close(%) +part001 = revolve({ + angle: 90, + axis: { + custom: { + axis: [1.0, 0.0], + origin: [0.0, height + .0000001] + } + } +}, sketch001) + +sketch002 = startSketchOn('-YZ') + |> startProfileAt([back_walls_width / 2, 0], %) + |> xLine(wall_thickness / 2, %) + |> angledLineToX({ angle: 45, to: back_walls_width }, %, $seg02) + |> yLineTo(height, %) + |> xLine(-wall_thickness, %) + |> yLineTo(segEndY(seg01), %) + |> angledLineToX({ + angle: 45, + to: back_walls_width / 2 + wall_thickness / 2 + }, %) + |> xLine(-wall_thickness, %) + |> angledLineToX({ angle: 180 - 45, to: wall_thickness }, %) + |> yLineTo(height, %) + |> xLineTo(0, %) + |> yLineTo(segEndY(seg02), %) + |> angledLineToY({ angle: 180 - 45, to: 0 }, %) + |> close(%) + |> extrude(back_length - height, %) \ No newline at end of file diff --git a/src/wasm-lib/tests/executor/outputs/poop_chute.png b/src/wasm-lib/tests/executor/outputs/poop_chute.png new file mode 100644 index 0000000000000000000000000000000000000000..63f3ec192a130b402ea1c48ede88e68848efd6d4 GIT binary patch literal 75067 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 z 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 literal 0 HcmV?d00001 diff --git a/src/wasm-lib/tests/executor/visuals.rs b/src/wasm-lib/tests/executor/visuals.rs index 735330a7d..df4664957 100644 --- a/src/wasm-lib/tests/executor/visuals.rs +++ b/src/wasm-lib/tests/executor/visuals.rs @@ -19,6 +19,7 @@ macro_rules! kcl_test { } kcl_test!("sketch_on_face", kcl_test_sketch_on_face); +kcl_test!("poop_chute", kcl_test_poop_chute); kcl_test!("neg_xz_plane", kcl_test_neg_xz_plane); kcl_test!("xz_plane", kcl_test_xz_plane); kcl_test!( From 9ff51de301b52ce771b9ee9e47101ee7700f0c5e Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Tue, 29 Oct 2024 19:24:24 -0700 Subject: [PATCH 05/13] fix auth test in engine (#4354) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix auth test in engine Signed-off-by: Jess Frazelle * A snapshot a day keeps the bugs away! 📷🐛 (OS: windows-latest) * emoty * A snapshot a day keeps the bugs away! 📷🐛 (OS: windows-latest) --------- Signed-off-by: Jess Frazelle Co-authored-by: github-actions[bot] --- ...uld-be-stable-XY-1-Google-Chrome-win32.png | Bin 39517 -> 39520 bytes src/wasm-lib/kcl/src/test_server.rs | 15 +++++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable-XY-1-Google-Chrome-win32.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/extrude-on-default-planes-should-be-stable-XY-1-Google-Chrome-win32.png index d84a8b2729e310c2de219946580bf02c28842fc2..25fe227d79db59a3b425f3b6fee7e2d3be92e5f9 100644 GIT binary patch delta 1823 zcmXX_c|6+*7SC8Us+3V}RaG5Taeqqcs-wDft@{c^D`?45x3sp7INL5k2bH?wGon>P z5;juC6{%}Riix;|kdbCbN*oCyH2c%p_xJa`_kG{@{Vugjth7tChGl)XP7Kfbs)#(L z3n`}@&|ScHwH2M#G}JSBC=q7rTM-kTCT%zk&>wL*J$!sHxEe(F=(pC%D3mYVbR zZ57N*)5_)le$+0uRS&U*cKW*A6N7x3%he7`B+?ShIR2J~?Sf|`BEfshV?mln>LBMR zlg#67tqw$!x>{P?aL`~J^p~AGOGq-3{O(;O47RejvB+k#bJQ7K2v;nvC5W`X0Xx^7 zlaqts&Qy*?qN(SZqeA@(@mAS=bdZs#r;q=MFDLMS#55Fn{A8pmQxfPT5^H4A1hCYt zPym5UV!;;U@qH=1A^hIY!N!Lk!5!C(Mx-A{S8 z=?7jI|Foln#E1wi{ZA!_HX_ltwBfuy^vzhLWzb_rXIpzapYcob($W%%L|RQqg~Q?5 zNDu`MnVFhGhV-P~P?DLRo(7JWla)mk72Py9Z)|87T$UP!Ln_3x{r&yFmFdtYCskBb z+JkWEj}jj-oTrF{VUqFL3$2LWb|9T91p{2llldQ6|XBvuf6z$sCXBu?vZD!lA;8yqip-HaE*QAqEr=;X1jQ^N?jT` z-xbe09>Um>LiRevMC}Po3+0gynq9Fov^{2Mq3CZt_Ko!E*;%`1 z{P#E=lxdlS@=Blh&tn^W|VP?)tikvTV#u z%a3+ZQBhPpDQGf*|EiZ`B^sPO=X#Im-*FAA#ay_gx!C;PxRz1)LF2S>K!dq zp>vMlve2uHo`0EEK`cy7O_>2a+XV@L>TONyj6=xHo20jIwRLq}kZ*mi*k$$*i9|Bl z&S=Q+LSYaNkHaClmqwkOP{qYEIjtF@C;87SwprV$vQh)w0JGSIhSpWX3uj+ou~;qp ze|jlMiv9Zc=8TYdM&M6llhMTX*Ux2yqv#AVih5sZXHnm_&Qoa!%+ykl{tg7nlK=SW zlbfq6mBC=puujP8>T1B~)6D^Y_%l`$I+r#D+*vBufpa;+torH30%BuT|lN?5sVZ*LzH!>u%pVhNmqkE;|#a%XT z`6Kv=ZG~Fl1h+bUmBhC$h-cqcS4c!nN83F45?GETC@RVP%zt()aaI0A9X}}H!SOiP z#l=O(qXw+2d!y3r0l_@HmO`OOS}%#b{QMxcwtZm(&yPj>-68n3wY4u_zUT+w`2qoZ zZEbF2Pnk>oo=(=R^NKgATsyaZvDQ*YpJkUVG<0p>u%^@Lg#`uWBjso`;ePkbYC;MU zfp9Q@lY%(ZJjpu%0d?=sXY$Sn#^mw{Yiu^)_wn)Zf_jV45vuZ~qG6yeo5v0I-P-2L z;E1Wp2|9c%}*ENj2l17XVLm^_8gq(i4Qz<(KpL}JMf3Cbx|i@hfqstak^oL|D3Unz z<}?smExhcY_=ZdA^A|62DKNg>X{lUjGa@=#uZp623osK16sqysnb>p&gZ6!;qrX^*F5}B%B52PI*Z_Z#ZzuQXL~fyh0-v!J*A8+Otn@k z8Nt%vCMG76lam#O!4;*YniCp8jLA%6mr^D#6n-!A#JM2Yzr*EE?f@BhfBO|Eu>M>6 zL9KUx_&-4NF9j4Gz8#XKU2t3aq`_6`FIg+V--G}Lh^1KB*6u5IXKP|l04@$5cky>% GIsXIeHIq#M delta 1820 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 anyhow::R } async fn new_context(units: UnitLength, with_auth: bool) -> anyhow::Result { - let ctx = ExecutorContext::new_with_client( + let mut client = new_zoo_client(if with_auth { None } else { Some("bad_token".to_string()) }, None)?; + if !with_auth { + // Use prod, don't override based on env vars. + // We do this so even in the engine repo, tests that need to run with + // no auth can fail in the same way as they would in prod. + client.set_base_url("https://api.zoo.dev".to_string()); + } + + let ctx = ExecutorContext::new( + &client, ExecutorSettings { units, highlight_edges: true, @@ -51,8 +60,6 @@ async fn new_context(units: UnitLength, with_auth: bool) -> anyhow::Result Date: Tue, 29 Oct 2024 23:01:31 -0400 Subject: [PATCH 06/13] Bump handlebars from 6.1.0 to 6.2.0 in /src/wasm-lib (#4330) Bumps [handlebars](https://github.com/sunng87/handlebars-rust) from 6.1.0 to 6.2.0. - [Release notes](https://github.com/sunng87/handlebars-rust/releases) - [Changelog](https://github.com/sunng87/handlebars-rust/blob/master/CHANGELOG.md) - [Commits](https://github.com/sunng87/handlebars-rust/compare/v6.1.0...v6.2.0) --- updated-dependencies: - dependency-name: handlebars dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: 49fl --- src/wasm-lib/Cargo.lock | 20 ++++++++++++++++++-- src/wasm-lib/kcl/Cargo.toml | 2 +- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/wasm-lib/Cargo.lock b/src/wasm-lib/Cargo.lock index ce887a7e8..7f6ff18f0 100644 --- a/src/wasm-lib/Cargo.lock +++ b/src/wasm-lib/Cargo.lock @@ -1130,11 +1130,12 @@ dependencies = [ [[package]] name = "handlebars" -version = "6.1.0" +version = "6.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce25b617d1375ef96eeb920ae717e3da34a02fc979fe632c75128350f9e1f74a" +checksum = "fd4ccde012831f9a071a637b0d4e31df31c0f6c525784b35ae76a9ac6bc1e315" dependencies = [ "log", + "num-order", "pest", "pest_derive", "serde", @@ -1937,6 +1938,21 @@ dependencies = [ "num-traits 0.2.19", ] +[[package]] +name = "num-modular" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17bb261bf36fa7d83f4c294f834e91256769097b3cb505d44831e0a179ac647f" + +[[package]] +name = "num-order" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "537b596b97c40fcf8056d153049eb22f481c17ebce72a513ec9286e4986d1bb6" +dependencies = [ + "num-modular", +] + [[package]] name = "num-traits" version = "0.1.43" diff --git a/src/wasm-lib/kcl/Cargo.toml b/src/wasm-lib/kcl/Cargo.toml index d8d4b8ede..4f63afde6 100644 --- a/src/wasm-lib/kcl/Cargo.toml +++ b/src/wasm-lib/kcl/Cargo.toml @@ -91,7 +91,7 @@ debug = true # Flamegraphs of benchmarks require accurate debug symbols base64 = "0.22.1" criterion = { version = "0.5.1", features = ["async_tokio"] } expectorate = "1.1.0" -handlebars = "6.1.0" +handlebars = "6.2.0" iai = "0.1" image = { version = "0.25.3", default-features = false, features = ["png"] } insta = { version = "1.40.0", features = ["json"] } From 0d52851da29e859cbb20357219b5285c71df0022 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Oct 2024 23:12:44 -0400 Subject: [PATCH 07/13] Bump serde from 1.0.213 to 1.0.214 in /src/wasm-lib (#4345) Bumps [serde](https://github.com/serde-rs/serde) from 1.0.213 to 1.0.214. - [Release notes](https://github.com/serde-rs/serde/releases) - [Commits](https://github.com/serde-rs/serde/compare/v1.0.213...v1.0.214) --- updated-dependencies: - dependency-name: serde dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: 49fl --- src/wasm-lib/Cargo.lock | 8 ++++---- src/wasm-lib/derive-docs/Cargo.toml | 2 +- src/wasm-lib/kcl-test-server/Cargo.toml | 2 +- src/wasm-lib/kcl/Cargo.toml | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/wasm-lib/Cargo.lock b/src/wasm-lib/Cargo.lock index 7f6ff18f0..cf7d925f6 100644 --- a/src/wasm-lib/Cargo.lock +++ b/src/wasm-lib/Cargo.lock @@ -2981,9 +2981,9 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.213" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ea7893ff5e2466df8d720bb615088341b295f849602c6956047f8f80f0e9bc1" +checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" dependencies = [ "serde_derive", ] @@ -2999,9 +2999,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.213" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" +checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" dependencies = [ "proc-macro2", "quote", diff --git a/src/wasm-lib/derive-docs/Cargo.toml b/src/wasm-lib/derive-docs/Cargo.toml index c84f4bf37..6fb91240b 100644 --- a/src/wasm-lib/derive-docs/Cargo.toml +++ b/src/wasm-lib/derive-docs/Cargo.toml @@ -18,7 +18,7 @@ once_cell = "1.20.2" proc-macro2 = "1" quote = "1" regex = "1.11" -serde = { version = "1.0.213", features = ["derive"] } +serde = { version = "1.0.214", features = ["derive"] } serde_tokenstream = "0.2" syn = { version = "2.0.85", features = ["full"] } diff --git a/src/wasm-lib/kcl-test-server/Cargo.toml b/src/wasm-lib/kcl-test-server/Cargo.toml index 8f58ba267..0809a7de8 100644 --- a/src/wasm-lib/kcl-test-server/Cargo.toml +++ b/src/wasm-lib/kcl-test-server/Cargo.toml @@ -10,6 +10,6 @@ anyhow = "1.0.91" hyper = { version = "0.14.29", features = ["http1", "server", "tcp"] } kcl-lib = { version = "0.2", path = "../kcl" } pico-args = "0.5.0" -serde = { version = "1.0.213", features = ["derive"] } +serde = { version = "1.0.214", features = ["derive"] } serde_json = "1.0.128" tokio = { version = "1.40.0", features = ["macros", "rt-multi-thread"] } diff --git a/src/wasm-lib/kcl/Cargo.toml b/src/wasm-lib/kcl/Cargo.toml index 4f63afde6..6b9be258f 100644 --- a/src/wasm-lib/kcl/Cargo.toml +++ b/src/wasm-lib/kcl/Cargo.toml @@ -38,7 +38,7 @@ pyo3 = { version = "0.22.5", optional = true } reqwest = { version = "0.12", default-features = false, features = ["stream", "rustls-tls"] } ropey = "1.6.1" schemars = { version = "0.8.17", features = ["impl_json_schema", "url", "uuid1", "preserve_order"] } -serde = { version = "1.0.213", features = ["derive"] } +serde = { version = "1.0.214", features = ["derive"] } serde_json = "1.0.128" sha2 = "0.10.8" tabled = { version = "0.15.0", optional = true } From 0c6c646fe77beb24fe12942ec4ef2784e33a5590 Mon Sep 17 00:00:00 2001 From: Adam Chalmers Date: Wed, 30 Oct 2024 12:14:17 -0500 Subject: [PATCH 08/13] KCL: New simulation test pipeline (#4351) The idea behind this is to test all the various stages of executing KCL separately, i.e. - Start with a program - Tokenize it - Parse those tokens into an AST - Recast the AST - Execute the AST, outputting - a PNG of the rendered model - serialized program memory Each of these steps reads some input and writes some output to disk. The output of one step becomes the input to the next step. These intermediate artifacts are also snapshotted (like expectorate or 2020) to ensure we're aware of any changes to how KCL works. A change could be a bug, or it could be harmless, or deliberate, but keeping it checked into the repo means we can easily track changes. Note: UUIDs sent back by the engine are currently nondeterministic, so they would break all the snapshot tests. So, the snapshots use a regex filter and replace anything that looks like a uuid with [uuid] when writing program memory to a snapshot. In the future I hope our UUIDs will be seedable and easy to make deterministic. At that point, we can stop filtering the UUIDs. We run this pipeline on many different KCL programs. Each keeps its inputs (KCL programs), outputs (PNG, program memory snapshot) and intermediate artifacts (AST, token lists, etc) in that directory. I also added a new `just` command to easily generate these tests. You can run `just new-sim-test gear $(cat gear.kcl)` to set up a new gear test directory and generate all the intermediate artifacts for the first time. This doesn't need any macros, it just appends some new lines of normal Rust source code to `tests.rs`, so it's easy to see exactly what the code is doing. This uses `cargo insta` for convenient snapshot testing of artifacts as JSON, and `twenty-twenty` for snapshotting PNGs. This was heavily inspired by Predrag Gruevski's talk at EuroRust 2024 about deterministic simulation testing, and how it can both reduce bugs and also reduce testing/CI time. Very grateful to him for chatting with me about this over the last couple of weeks. --- src/wasm-lib/.config/insta.yaml | 2 + src/wasm-lib/Cargo.lock | 5 +- src/wasm-lib/Cargo.toml | 4 + src/wasm-lib/justfile | 23 +- src/wasm-lib/kcl/Cargo.toml | 10 +- src/wasm-lib/kcl/src/executor.rs | 16 +- src/wasm-lib/kcl/src/lib.rs | 2 + src/wasm-lib/kcl/src/parser/parser_impl.rs | 1 - src/wasm-lib/kcl/src/simulation_tests.rs | 130 ++ .../kcl_lib__tests__tokenize_cube.snap | 969 +++++++++++++ src/wasm-lib/kcl/src/test_server.rs | 36 +- src/wasm-lib/kcl/tests/cube/ast.snap | 795 +++++++++++ .../kcl/tests/cube/execution_error.snap.new | 7 + src/wasm-lib/kcl/tests/cube/input.kcl | 19 + .../kcl/tests/cube/program_memory.snap | 976 +++++++++++++ .../kcl/tests/cube/rendered_model.png | Bin 0 -> 92950 bytes src/wasm-lib/kcl/tests/cube/tokens.snap | 1257 +++++++++++++++++ src/wasm-lib/kcl/tests/simtest.tmpl | 27 + 18 files changed, 4253 insertions(+), 26 deletions(-) create mode 100644 src/wasm-lib/.config/insta.yaml create mode 100644 src/wasm-lib/kcl/src/simulation_tests.rs create mode 100644 src/wasm-lib/kcl/src/snapshots/kcl_lib__tests__tokenize_cube.snap create mode 100644 src/wasm-lib/kcl/tests/cube/ast.snap create mode 100644 src/wasm-lib/kcl/tests/cube/execution_error.snap.new create mode 100644 src/wasm-lib/kcl/tests/cube/input.kcl create mode 100644 src/wasm-lib/kcl/tests/cube/program_memory.snap create mode 100644 src/wasm-lib/kcl/tests/cube/rendered_model.png create mode 100644 src/wasm-lib/kcl/tests/cube/tokens.snap create mode 100644 src/wasm-lib/kcl/tests/simtest.tmpl diff --git a/src/wasm-lib/.config/insta.yaml b/src/wasm-lib/.config/insta.yaml new file mode 100644 index 000000000..24d8c60c6 --- /dev/null +++ b/src/wasm-lib/.config/insta.yaml @@ -0,0 +1,2 @@ +test: + runner: nextest diff --git a/src/wasm-lib/Cargo.lock b/src/wasm-lib/Cargo.lock index cf7d925f6..3bce8606b 100644 --- a/src/wasm-lib/Cargo.lock +++ b/src/wasm-lib/Cargo.lock @@ -1453,13 +1453,14 @@ checksum = "a257582fdcde896fd96463bf2d40eefea0580021c0712a0e2b028b60b47a837a" [[package]] name = "insta" -version = "1.40.0" +version = "1.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6593a41c7a73841868772495db7dc1e8ecab43bb5c0b6da2059246c4b506ab60" +checksum = "a1f72d3e19488cf7d8ea52d2fc0f8754fc933398b337cd3cbdb28aaeb35159ef" dependencies = [ "console", "lazy_static", "linked-hash-map", + "regex", "serde", "similar", ] diff --git a/src/wasm-lib/Cargo.toml b/src/wasm-lib/Cargo.toml index dff8ef70e..d0579c67b 100644 --- a/src/wasm-lib/Cargo.toml +++ b/src/wasm-lib/Cargo.toml @@ -57,6 +57,10 @@ debug = true [profile.dev] debug = 0 +[profile.dev.package] +insta.opt-level = 3 +similar.opt-level = 3 + [profile.test] debug = "line-tables-only" diff --git a/src/wasm-lib/justfile b/src/wasm-lib/justfile index 953527c77..752959131 100644 --- a/src/wasm-lib/justfile +++ b/src/wasm-lib/justfile @@ -1,10 +1,29 @@ +cnr := "cargo nextest run" +cita := "cargo insta test --accept" + # Create a new KCL snapshot test from `tests/inputs/my-test.kcl`. new-test name: echo "kcl_test!(\"{{name}}\", {{name}});" >> tests/executor/visuals.rs - TWENTY_TWENTY=overwrite cargo nextest run --test executor -E 'test(=visuals::{{name}})' + TWENTY_TWENTY=overwrite {{cnr}} --test executor -E 'test(=visuals::{{name}})' lint: cargo clippy --workspace --all-targets -- -D warnings redo-kcl-stdlib-docs: - EXPECTORATE=overwrite cargo nextest run -p kcl-lib docs::gen_std_tests::test_generate_stdlib + EXPECTORATE=overwrite {{cnr}} -p kcl-lib docs::gen_std_tests::test_generate_stdlib + +# Create a new KCL deterministic simulation test case. +new-sim-test test_name kcl_program: + # Each test file gets its own directory. This will contain the KCL program, and its + # snapshotted artifacts (e.g. serialized tokens, serialized ASTs, program memory, + # PNG snapshots, etc). + mkdir kcl/tests/{{test_name}} + echo "{{kcl_program}}" > kcl/tests/{{test_name}}/input.kcl + # Add the various tests for this new test case. + cat kcl/tests/simtest.tmpl | sed "s/TEST_NAME_HERE/{{test_name}}/" >> kcl/src/tests.rs + # Run all the tests for the first time, in the right order. + {{cita}} -p kcl-lib -- tests::{{test_name}}::tokenize + {{cita}} -p kcl-lib -- tests::{{test_name}}::parse + {{cita}} -p kcl-lib -- tests::{{test_name}}::unparse + TWENTY_TWENTY=overwrite {{cita}} -p kcl-lib -- tests::{{test_name}}::kcl_test_execute + diff --git a/src/wasm-lib/kcl/Cargo.toml b/src/wasm-lib/kcl/Cargo.toml index 6b9be258f..afaa62f52 100644 --- a/src/wasm-lib/kcl/Cargo.toml +++ b/src/wasm-lib/kcl/Cargo.toml @@ -77,16 +77,8 @@ engine = [] pyo3 = ["dep:pyo3"] # Helper functions also used in benchmarks. lsp-test-util = [] - tabled = ["dep:tabled"] -[profile.release] -panic = "abort" -debug = true - -[profile.bench] -debug = true # Flamegraphs of benchmarks require accurate debug symbols - [dev-dependencies] base64 = "0.22.1" criterion = { version = "0.5.1", features = ["async_tokio"] } @@ -94,7 +86,7 @@ expectorate = "1.1.0" handlebars = "6.2.0" iai = "0.1" image = { version = "0.25.3", default-features = false, features = ["png"] } -insta = { version = "1.40.0", features = ["json"] } +insta = { version = "1.41.0", features = ["json", "filters"] } itertools = "0.13.0" pretty_assertions = "1.4.1" tokio = { version = "1.40.0", features = ["rt-multi-thread", "macros", "time"] } diff --git a/src/wasm-lib/kcl/src/executor.rs b/src/wasm-lib/kcl/src/executor.rs index bb7fb7bc0..36f8563f4 100644 --- a/src/wasm-lib/kcl/src/executor.rs +++ b/src/wasm-lib/kcl/src/executor.rs @@ -2454,7 +2454,19 @@ impl ExecutorContext { id_generator: IdGenerator, project_directory: Option, ) -> Result { - let _ = self.run(program, None, id_generator, project_directory).await?; + self.execute_and_prepare(program, id_generator, project_directory) + .await + .map(|(_state, snap)| snap) + } + + /// Execute the program, return the interpreter and outputs. + pub async fn execute_and_prepare( + &self, + program: &Program, + id_generator: IdGenerator, + project_directory: Option, + ) -> Result<(ExecState, TakeSnapshot)> { + let state = self.run(program, None, id_generator, project_directory).await?; // Zoom to fit. self.engine @@ -2487,7 +2499,7 @@ impl ExecutorContext { else { anyhow::bail!("Unexpected response from engine: {:?}", resp); }; - Ok(contents) + Ok((state, contents)) } } diff --git a/src/wasm-lib/kcl/src/lib.rs b/src/wasm-lib/kcl/src/lib.rs index f0ef19f43..b239d7387 100644 --- a/src/wasm-lib/kcl/src/lib.rs +++ b/src/wasm-lib/kcl/src/lib.rs @@ -25,6 +25,8 @@ pub mod lint; pub mod lsp; pub mod parser; pub mod settings; +#[cfg(test)] +mod simulation_tests; pub mod std; #[cfg(not(target_arch = "wasm32"))] pub mod test_server; diff --git a/src/wasm-lib/kcl/src/parser/parser_impl.rs b/src/wasm-lib/kcl/src/parser/parser_impl.rs index f7f15dc7b..6b86e7f07 100644 --- a/src/wasm-lib/kcl/src/parser/parser_impl.rs +++ b/src/wasm-lib/kcl/src/parser/parser_impl.rs @@ -3043,7 +3043,6 @@ e let parser = crate::parser::Parser::new(tokens); let result = parser.ast(); assert!(result.is_err()); - dbg!(&result); assert!(result .err() .unwrap() diff --git a/src/wasm-lib/kcl/src/simulation_tests.rs b/src/wasm-lib/kcl/src/simulation_tests.rs new file mode 100644 index 000000000..bcbcdf7cf --- /dev/null +++ b/src/wasm-lib/kcl/src/simulation_tests.rs @@ -0,0 +1,130 @@ +use crate::{ast::types::Program, errors::KclError, parser::Parser, token::Token}; + +/// Deserialize the data from a snapshot. +fn get(snapshot: &str) -> T { + let mut parts = snapshot.split("---"); + let _empty = parts.next().unwrap(); + let _header = parts.next().unwrap(); + let snapshot_data = parts.next().unwrap(); + serde_json::from_str(snapshot_data) + .and_then(serde_json::from_value) + .unwrap() +} + +fn assert_snapshot(test_name: &str, operation: &str, f: F) +where + F: FnOnce() -> R, +{ + let mut settings = insta::Settings::clone_current(); + // These make the snapshots more readable and match our dir structure. + settings.set_omit_expression(true); + settings.set_snapshot_path(format!("../tests/{test_name}")); + settings.set_prepend_module_to_snapshot(false); + settings.set_description(format!("{operation} {test_name}.kcl")); + // Sorting maps makes them easier to diff. + settings.set_sort_maps(true); + // Replace UUIDs with the string "[uuid]", because otherwise the tests would constantly + // be changing the UUID. This is a stopgap measure until we make the engine more deterministic. + settings.add_filter( + r"\b[[:xdigit:]]{8}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{12}\b", + "[uuid]", + ); + // Run `f` (the closure that was passed in) with these settings. + settings.bind(f); +} + +fn read(filename: &'static str, test_name: &str) -> String { + std::fs::read_to_string(format!("tests/{test_name}/{filename}")).unwrap() +} + +fn tokenize(test_name: &str) { + let input = read("input.kcl", test_name); + let token_res = crate::token::lexer(&input); + + assert_snapshot(test_name, "Result of tokenizing", || { + insta::assert_json_snapshot!("tokens", token_res); + }); +} + +fn parse(test_name: &str) { + let input = read("tokens.snap", test_name); + let tokens: Result, KclError> = get(&input); + let Ok(tokens) = tokens else { + return; + }; + + // Parse the tokens into an AST. + let parse_res = Parser::new(tokens).ast(); + assert_snapshot(test_name, "Result of parsing", || { + insta::assert_json_snapshot!("ast", parse_res); + }); +} + +fn unparse(test_name: &str) { + let input = read("ast.snap", test_name); + let ast_res: Result = get(&input); + let Ok(ast) = ast_res else { + return; + }; + // Check recasting the AST produces the original string. + let actual = ast.recast(&Default::default(), 0); + let expected = read("input.kcl", test_name); + pretty_assertions::assert_eq!( + actual, + expected, + "Parse then unparse didn't recreate the original KCL file" + ); +} + +async fn execute(test_name: &str) { + // Read the AST from disk. + let input = read("ast.snap", test_name); + let ast_res: Result = get(&input); + let Ok(ast) = ast_res else { + return; + }; + + // Run the program. + let exec_res = crate::test_server::execute_and_snapshot_ast(ast, crate::settings::types::UnitLength::Mm).await; + match exec_res { + Ok((program_memory, png)) => { + twenty_twenty::assert_image(format!("tests/{test_name}/rendered_model.png"), &png, 0.99); + assert_snapshot(test_name, "Program memory after executing", || { + insta::assert_json_snapshot!("program_memory", program_memory); + }); + } + Err(e) => { + assert_snapshot(test_name, "Error from executing", || { + insta::assert_snapshot!("execution_error", e); + }); + } + } +} + +mod cube { + const TEST_NAME: &str = "cube"; + + /// Test tokenizing KCL. + #[test] + fn tokenize() { + super::tokenize(TEST_NAME) + } + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME).await + } +} diff --git a/src/wasm-lib/kcl/src/snapshots/kcl_lib__tests__tokenize_cube.snap b/src/wasm-lib/kcl/src/snapshots/kcl_lib__tests__tokenize_cube.snap new file mode 100644 index 000000000..73a6d1acc --- /dev/null +++ b/src/wasm-lib/kcl/src/snapshots/kcl_lib__tests__tokenize_cube.snap @@ -0,0 +1,969 @@ +--- +source: kcl/src/tests.rs +expression: tokens +--- +Ok: + - type: keyword + start: 0 + end: 2 + value: fn + - type: whitespace + start: 2 + end: 3 + value: " " + - type: word + start: 3 + end: 9 + value: square + - type: whitespace + start: 9 + end: 10 + value: " " + - type: operator + start: 10 + end: 11 + value: "=" + - type: whitespace + start: 11 + end: 12 + value: " " + - type: brace + start: 12 + end: 13 + value: ( + - type: word + start: 13 + end: 19 + value: length + - type: comma + start: 19 + end: 20 + value: "," + - type: whitespace + start: 20 + end: 21 + value: " " + - type: word + start: 21 + end: 27 + value: center + - type: brace + start: 27 + end: 28 + value: ) + - type: whitespace + start: 28 + end: 29 + value: " " + - type: operator + start: 29 + end: 31 + value: "=>" + - type: whitespace + start: 31 + end: 32 + value: " " + - type: brace + start: 32 + end: 33 + value: "{" + - type: whitespace + start: 33 + end: 36 + value: "\n " + - type: word + start: 36 + end: 37 + value: l + - type: whitespace + start: 37 + end: 38 + value: " " + - type: operator + start: 38 + end: 39 + value: "=" + - type: whitespace + start: 39 + end: 40 + value: " " + - type: word + start: 40 + end: 46 + value: length + - type: whitespace + start: 46 + end: 47 + value: " " + - type: operator + start: 47 + end: 48 + value: / + - type: whitespace + start: 48 + end: 49 + value: " " + - type: number + start: 49 + end: 50 + value: "2" + - type: whitespace + start: 50 + end: 53 + value: "\n " + - type: word + start: 53 + end: 54 + value: x + - type: whitespace + start: 54 + end: 55 + value: " " + - type: operator + start: 55 + end: 56 + value: "=" + - type: whitespace + start: 56 + end: 57 + value: " " + - type: word + start: 57 + end: 63 + value: center + - type: brace + start: 63 + end: 64 + value: "[" + - type: number + start: 64 + end: 65 + value: "0" + - type: brace + start: 65 + end: 66 + value: "]" + - type: whitespace + start: 66 + end: 69 + value: "\n " + - type: word + start: 69 + end: 70 + value: y + - type: whitespace + start: 70 + end: 71 + value: " " + - type: operator + start: 71 + end: 72 + value: "=" + - type: whitespace + start: 72 + end: 73 + value: " " + - type: word + start: 73 + end: 79 + value: center + - type: brace + start: 79 + end: 80 + value: "[" + - type: number + start: 80 + end: 81 + value: "1" + - type: brace + start: 81 + end: 82 + value: "]" + - type: whitespace + start: 82 + end: 85 + value: "\n " + - type: word + start: 85 + end: 87 + value: p0 + - type: whitespace + start: 87 + end: 88 + value: " " + - type: operator + start: 88 + end: 89 + value: "=" + - type: whitespace + start: 89 + end: 90 + value: " " + - type: brace + start: 90 + end: 91 + value: "[" + - type: operator + start: 91 + end: 92 + value: "-" + - type: word + start: 92 + end: 93 + value: l + - type: whitespace + start: 93 + end: 94 + value: " " + - type: operator + start: 94 + end: 95 + value: + + - type: whitespace + start: 95 + end: 96 + value: " " + - type: word + start: 96 + end: 97 + value: x + - type: comma + start: 97 + end: 98 + value: "," + - type: whitespace + start: 98 + end: 99 + value: " " + - type: operator + start: 99 + end: 100 + value: "-" + - type: word + start: 100 + end: 101 + value: l + - type: whitespace + start: 101 + end: 102 + value: " " + - type: operator + start: 102 + end: 103 + value: + + - type: whitespace + start: 103 + end: 104 + value: " " + - type: word + start: 104 + end: 105 + value: y + - type: brace + start: 105 + end: 106 + value: "]" + - type: whitespace + start: 106 + end: 109 + value: "\n " + - type: word + start: 109 + end: 111 + value: p1 + - type: whitespace + start: 111 + end: 112 + value: " " + - type: operator + start: 112 + end: 113 + value: "=" + - type: whitespace + start: 113 + end: 114 + value: " " + - type: brace + start: 114 + end: 115 + value: "[" + - type: operator + start: 115 + end: 116 + value: "-" + - type: word + start: 116 + end: 117 + value: l + - type: whitespace + start: 117 + end: 118 + value: " " + - type: operator + start: 118 + end: 119 + value: + + - type: whitespace + start: 119 + end: 120 + value: " " + - type: word + start: 120 + end: 121 + value: x + - type: comma + start: 121 + end: 122 + value: "," + - type: whitespace + start: 122 + end: 124 + value: " " + - type: word + start: 124 + end: 125 + value: l + - type: whitespace + start: 125 + end: 126 + value: " " + - type: operator + start: 126 + end: 127 + value: + + - type: whitespace + start: 127 + end: 128 + value: " " + - type: word + start: 128 + end: 129 + value: y + - type: brace + start: 129 + end: 130 + value: "]" + - type: whitespace + start: 130 + end: 133 + value: "\n " + - type: word + start: 133 + end: 135 + value: p2 + - type: whitespace + start: 135 + end: 136 + value: " " + - type: operator + start: 136 + end: 137 + value: "=" + - type: whitespace + start: 137 + end: 138 + value: " " + - type: brace + start: 138 + end: 139 + value: "[" + - type: whitespace + start: 139 + end: 140 + value: " " + - type: word + start: 140 + end: 141 + value: l + - type: whitespace + start: 141 + end: 142 + value: " " + - type: operator + start: 142 + end: 143 + value: + + - type: whitespace + start: 143 + end: 144 + value: " " + - type: word + start: 144 + end: 145 + value: x + - type: comma + start: 145 + end: 146 + value: "," + - type: whitespace + start: 146 + end: 148 + value: " " + - type: word + start: 148 + end: 149 + value: l + - type: whitespace + start: 149 + end: 150 + value: " " + - type: operator + start: 150 + end: 151 + value: + + - type: whitespace + start: 151 + end: 152 + value: " " + - type: word + start: 152 + end: 153 + value: y + - type: brace + start: 153 + end: 154 + value: "]" + - type: whitespace + start: 154 + end: 157 + value: "\n " + - type: word + start: 157 + end: 159 + value: p3 + - type: whitespace + start: 159 + end: 160 + value: " " + - type: operator + start: 160 + end: 161 + value: "=" + - type: whitespace + start: 161 + end: 162 + value: " " + - type: brace + start: 162 + end: 163 + value: "[" + - type: whitespace + start: 163 + end: 164 + value: " " + - type: word + start: 164 + end: 165 + value: l + - type: whitespace + start: 165 + end: 166 + value: " " + - type: operator + start: 166 + end: 167 + value: + + - type: whitespace + start: 167 + end: 168 + value: " " + - type: word + start: 168 + end: 169 + value: x + - type: comma + start: 169 + end: 170 + value: "," + - type: whitespace + start: 170 + end: 171 + value: " " + - type: operator + start: 171 + end: 172 + value: "-" + - type: word + start: 172 + end: 173 + value: l + - type: whitespace + start: 173 + end: 174 + value: " " + - type: operator + start: 174 + end: 175 + value: + + - type: whitespace + start: 175 + end: 176 + value: " " + - type: word + start: 176 + end: 177 + value: y + - type: brace + start: 177 + end: 178 + value: "]" + - type: whitespace + start: 178 + end: 181 + value: "\n " + - type: keyword + start: 181 + end: 187 + value: return + - type: whitespace + start: 187 + end: 188 + value: " " + - type: word + start: 188 + end: 201 + value: startSketchAt + - type: brace + start: 201 + end: 202 + value: ( + - type: word + start: 202 + end: 204 + value: p0 + - type: brace + start: 204 + end: 205 + value: ) + - type: whitespace + start: 205 + end: 210 + value: "\n " + - type: operator + start: 210 + end: 212 + value: "|>" + - type: whitespace + start: 212 + end: 213 + value: " " + - type: word + start: 213 + end: 219 + value: lineTo + - type: brace + start: 219 + end: 220 + value: ( + - type: word + start: 220 + end: 222 + value: p1 + - type: comma + start: 222 + end: 223 + value: "," + - type: whitespace + start: 223 + end: 224 + value: " " + - type: operator + start: 224 + end: 225 + value: "%" + - type: brace + start: 225 + end: 226 + value: ) + - type: whitespace + start: 226 + end: 231 + value: "\n " + - type: operator + start: 231 + end: 233 + value: "|>" + - type: whitespace + start: 233 + end: 234 + value: " " + - type: word + start: 234 + end: 240 + value: lineTo + - type: brace + start: 240 + end: 241 + value: ( + - type: word + start: 241 + end: 243 + value: p2 + - type: comma + start: 243 + end: 244 + value: "," + - type: whitespace + start: 244 + end: 245 + value: " " + - type: operator + start: 245 + end: 246 + value: "%" + - type: brace + start: 246 + end: 247 + value: ) + - type: whitespace + start: 247 + end: 252 + value: "\n " + - type: operator + start: 252 + end: 254 + value: "|>" + - type: whitespace + start: 254 + end: 255 + value: " " + - type: word + start: 255 + end: 261 + value: lineTo + - type: brace + start: 261 + end: 262 + value: ( + - type: word + start: 262 + end: 264 + value: p3 + - type: comma + start: 264 + end: 265 + value: "," + - type: whitespace + start: 265 + end: 266 + value: " " + - type: operator + start: 266 + end: 267 + value: "%" + - type: brace + start: 267 + end: 268 + value: ) + - type: whitespace + start: 268 + end: 273 + value: "\n " + - type: operator + start: 273 + end: 275 + value: "|>" + - type: whitespace + start: 275 + end: 276 + value: " " + - type: word + start: 276 + end: 282 + value: lineTo + - type: brace + start: 282 + end: 283 + value: ( + - type: word + start: 283 + end: 285 + value: p0 + - type: comma + start: 285 + end: 286 + value: "," + - type: whitespace + start: 286 + end: 287 + value: " " + - type: operator + start: 287 + end: 288 + value: "%" + - type: brace + start: 288 + end: 289 + value: ) + - type: whitespace + start: 289 + end: 294 + value: "\n " + - type: operator + start: 294 + end: 296 + value: "|>" + - type: whitespace + start: 296 + end: 297 + value: " " + - type: word + start: 297 + end: 302 + value: close + - type: brace + start: 302 + end: 303 + value: ( + - type: operator + start: 303 + end: 304 + value: "%" + - type: brace + start: 304 + end: 305 + value: ) + - type: whitespace + start: 305 + end: 306 + value: "\n" + - type: brace + start: 306 + end: 307 + value: "}" + - type: whitespace + start: 307 + end: 309 + value: "\n\n" + - type: keyword + start: 309 + end: 311 + value: fn + - type: whitespace + start: 311 + end: 312 + value: " " + - type: word + start: 312 + end: 316 + value: cube + - type: whitespace + start: 316 + end: 317 + value: " " + - type: operator + start: 317 + end: 318 + value: "=" + - type: whitespace + start: 318 + end: 319 + value: " " + - type: brace + start: 319 + end: 320 + value: ( + - type: word + start: 320 + end: 326 + value: length + - type: comma + start: 326 + end: 327 + value: "," + - type: whitespace + start: 327 + end: 328 + value: " " + - type: word + start: 328 + end: 334 + value: center + - type: brace + start: 334 + end: 335 + value: ) + - type: whitespace + start: 335 + end: 336 + value: " " + - type: operator + start: 336 + end: 338 + value: "=>" + - type: whitespace + start: 338 + end: 339 + value: " " + - type: brace + start: 339 + end: 340 + value: "{" + - type: whitespace + start: 340 + end: 343 + value: "\n " + - type: keyword + start: 343 + end: 349 + value: return + - type: whitespace + start: 349 + end: 350 + value: " " + - type: word + start: 350 + end: 356 + value: square + - type: brace + start: 356 + end: 357 + value: ( + - type: word + start: 357 + end: 363 + value: length + - type: comma + start: 363 + end: 364 + value: "," + - type: whitespace + start: 364 + end: 365 + value: " " + - type: word + start: 365 + end: 371 + value: center + - type: brace + start: 371 + end: 372 + value: ) + - type: whitespace + start: 372 + end: 377 + value: "\n " + - type: operator + start: 377 + end: 379 + value: "|>" + - type: whitespace + start: 379 + end: 380 + value: " " + - type: word + start: 380 + end: 387 + value: extrude + - type: brace + start: 387 + end: 388 + value: ( + - type: word + start: 388 + end: 394 + value: length + - type: comma + start: 394 + end: 395 + value: "," + - type: whitespace + start: 395 + end: 396 + value: " " + - type: operator + start: 396 + end: 397 + value: "%" + - type: brace + start: 397 + end: 398 + value: ) + - type: whitespace + start: 398 + end: 399 + value: "\n" + - type: brace + start: 399 + end: 400 + value: "}" + - type: whitespace + start: 400 + end: 402 + value: "\n\n" + - type: word + start: 402 + end: 407 + value: width + - type: whitespace + start: 407 + end: 408 + value: " " + - type: operator + start: 408 + end: 409 + value: "=" + - type: whitespace + start: 409 + end: 410 + value: " " + - type: number + start: 410 + end: 412 + value: "20" + - type: whitespace + start: 412 + end: 413 + value: "\n" + - type: word + start: 413 + end: 417 + value: cube + - type: brace + start: 417 + end: 418 + value: ( + - type: word + start: 418 + end: 423 + value: width + - type: comma + start: 423 + end: 424 + value: "," + - type: whitespace + start: 424 + end: 425 + value: " " + - type: brace + start: 425 + end: 426 + value: "[" + - type: number + start: 426 + end: 428 + value: "20" + - type: comma + start: 428 + end: 429 + value: "," + - type: whitespace + start: 429 + end: 430 + value: " " + - type: number + start: 430 + end: 431 + value: "0" + - type: brace + start: 431 + end: 432 + value: "]" + - type: brace + start: 432 + end: 433 + value: ) + - type: whitespace + start: 433 + end: 434 + value: "\n" diff --git a/src/wasm-lib/kcl/src/test_server.rs b/src/wasm-lib/kcl/src/test_server.rs index 2b59954a2..42415d42c 100644 --- a/src/wasm-lib/kcl/src/test_server.rs +++ b/src/wasm-lib/kcl/src/test_server.rs @@ -1,7 +1,8 @@ //! Types used to send data to the test server. use crate::{ - executor::{new_zoo_client, ExecutorContext, ExecutorSettings, IdGenerator}, + ast::types::Program, + executor::{new_zoo_client, ExecutorContext, ExecutorSettings, IdGenerator, ProgramMemory}, settings::types::UnitLength, }; @@ -16,22 +17,37 @@ pub struct RequestBody { /// This returns the bytes of the snapshot. pub async fn execute_and_snapshot(code: &str, units: UnitLength) -> anyhow::Result { let ctx = new_context(units, true).await?; - do_execute_and_snapshot(&ctx, code).await + let tokens = crate::token::lexer(code)?; + let parser = crate::parser::Parser::new(tokens); + let program = parser.ast()?; + do_execute_and_snapshot(&ctx, program).await.map(|(_state, snap)| snap) +} + +/// Executes a kcl program and takes a snapshot of the result. +/// This returns the bytes of the snapshot. +pub async fn execute_and_snapshot_ast( + ast: Program, + units: UnitLength, +) -> anyhow::Result<(ProgramMemory, image::DynamicImage)> { + let ctx = new_context(units, true).await?; + do_execute_and_snapshot(&ctx, ast) + .await + .map(|(state, snap)| (state.memory, snap)) } pub async fn execute_and_snapshot_no_auth(code: &str, units: UnitLength) -> anyhow::Result { let ctx = new_context(units, false).await?; - do_execute_and_snapshot(&ctx, code).await -} - -async fn do_execute_and_snapshot(ctx: &ExecutorContext, code: &str) -> anyhow::Result { let tokens = crate::token::lexer(code)?; let parser = crate::parser::Parser::new(tokens); let program = parser.ast()?; + do_execute_and_snapshot(&ctx, program).await.map(|(_state, snap)| snap) +} - let snapshot = ctx - .execute_and_prepare_snapshot(&program, IdGenerator::default(), None) - .await?; +async fn do_execute_and_snapshot( + ctx: &ExecutorContext, + program: Program, +) -> anyhow::Result<(crate::executor::ExecState, image::DynamicImage)> { + let (exec_state, snapshot) = ctx.execute_and_prepare(&program, IdGenerator::default(), None).await?; // Create a temporary file to write the output to. let output_file = std::env::temp_dir().join(format!("kcl_output_{}.png", uuid::Uuid::new_v4())); @@ -39,7 +55,7 @@ async fn do_execute_and_snapshot(ctx: &ExecutorContext, code: &str) -> anyhow::R std::fs::write(&output_file, snapshot.contents.0)?; // Decode the snapshot, return it. let img = image::ImageReader::open(output_file).unwrap().decode()?; - Ok(img) + Ok((exec_state, img)) } async fn new_context(units: UnitLength, with_auth: bool) -> anyhow::Result { diff --git a/src/wasm-lib/kcl/tests/cube/ast.snap b/src/wasm-lib/kcl/tests/cube/ast.snap new file mode 100644 index 000000000..e07632995 --- /dev/null +++ b/src/wasm-lib/kcl/tests/cube/ast.snap @@ -0,0 +1,795 @@ +--- +source: kcl/src/tests.rs +description: Result of parsing cube.kcl +snapshot_kind: text +--- +{ + "Ok": { + "start": 0, + "end": 344, + "body": [ + { + "type": "VariableDeclaration", + "type": "VariableDeclaration", + "start": 0, + "end": 316, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 3, + "end": 316, + "id": { + "type": "Identifier", + "start": 3, + "end": 7, + "name": "cube" + }, + "init": { + "type": "FunctionExpression", + "type": "FunctionExpression", + "start": 10, + "end": 316, + "params": [ + { + "type": "Parameter", + "identifier": { + "type": "Identifier", + "start": 11, + "end": 17, + "name": "length" + }, + "optional": false + }, + { + "type": "Parameter", + "identifier": { + "type": "Identifier", + "start": 19, + "end": 25, + "name": "center" + }, + "optional": false + } + ], + "body": { + "start": 30, + "end": 316, + "body": [ + { + "type": "VariableDeclaration", + "type": "VariableDeclaration", + "start": 34, + "end": 48, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 34, + "end": 48, + "id": { + "type": "Identifier", + "start": 34, + "end": 35, + "name": "l" + }, + "init": { + "type": "BinaryExpression", + "type": "BinaryExpression", + "start": 38, + "end": 48, + "operator": "/", + "left": { + "type": "Identifier", + "type": "Identifier", + "start": 38, + "end": 44, + "name": "length" + }, + "right": { + "type": "Literal", + "type": "Literal", + "start": 47, + "end": 48, + "value": 2, + "raw": "2" + } + } + } + ], + "kind": "const" + }, + { + "type": "VariableDeclaration", + "type": "VariableDeclaration", + "start": 51, + "end": 64, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 51, + "end": 64, + "id": { + "type": "Identifier", + "start": 51, + "end": 52, + "name": "x" + }, + "init": { + "type": "MemberExpression", + "type": "MemberExpression", + "start": 55, + "end": 64, + "object": { + "type": "Identifier", + "type": "Identifier", + "start": 55, + "end": 61, + "name": "center" + }, + "property": { + "type": "Literal", + "type": "Literal", + "start": 62, + "end": 63, + "value": 0, + "raw": "0" + }, + "computed": false + } + } + ], + "kind": "const" + }, + { + "type": "VariableDeclaration", + "type": "VariableDeclaration", + "start": 67, + "end": 80, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 67, + "end": 80, + "id": { + "type": "Identifier", + "start": 67, + "end": 68, + "name": "y" + }, + "init": { + "type": "MemberExpression", + "type": "MemberExpression", + "start": 71, + "end": 80, + "object": { + "type": "Identifier", + "type": "Identifier", + "start": 71, + "end": 77, + "name": "center" + }, + "property": { + "type": "Literal", + "type": "Literal", + "start": 78, + "end": 79, + "value": 1, + "raw": "1" + }, + "computed": false + } + } + ], + "kind": "const" + }, + { + "type": "VariableDeclaration", + "type": "VariableDeclaration", + "start": 83, + "end": 104, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 83, + "end": 104, + "id": { + "type": "Identifier", + "start": 83, + "end": 85, + "name": "p0" + }, + "init": { + "type": "ArrayExpression", + "type": "ArrayExpression", + "start": 88, + "end": 104, + "elements": [ + { + "type": "BinaryExpression", + "type": "BinaryExpression", + "start": 89, + "end": 95, + "operator": "+", + "left": { + "type": "UnaryExpression", + "type": "UnaryExpression", + "start": 89, + "end": 91, + "operator": "-", + "argument": { + "type": "Identifier", + "type": "Identifier", + "start": 90, + "end": 91, + "name": "l" + } + }, + "right": { + "type": "Identifier", + "type": "Identifier", + "start": 94, + "end": 95, + "name": "x" + } + }, + { + "type": "BinaryExpression", + "type": "BinaryExpression", + "start": 97, + "end": 103, + "operator": "+", + "left": { + "type": "UnaryExpression", + "type": "UnaryExpression", + "start": 97, + "end": 99, + "operator": "-", + "argument": { + "type": "Identifier", + "type": "Identifier", + "start": 98, + "end": 99, + "name": "l" + } + }, + "right": { + "type": "Identifier", + "type": "Identifier", + "start": 102, + "end": 103, + "name": "y" + } + } + ] + } + } + ], + "kind": "const" + }, + { + "type": "VariableDeclaration", + "type": "VariableDeclaration", + "start": 107, + "end": 127, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 107, + "end": 127, + "id": { + "type": "Identifier", + "start": 107, + "end": 109, + "name": "p1" + }, + "init": { + "type": "ArrayExpression", + "type": "ArrayExpression", + "start": 112, + "end": 127, + "elements": [ + { + "type": "BinaryExpression", + "type": "BinaryExpression", + "start": 113, + "end": 119, + "operator": "+", + "left": { + "type": "UnaryExpression", + "type": "UnaryExpression", + "start": 113, + "end": 115, + "operator": "-", + "argument": { + "type": "Identifier", + "type": "Identifier", + "start": 114, + "end": 115, + "name": "l" + } + }, + "right": { + "type": "Identifier", + "type": "Identifier", + "start": 118, + "end": 119, + "name": "x" + } + }, + { + "type": "BinaryExpression", + "type": "BinaryExpression", + "start": 121, + "end": 126, + "operator": "+", + "left": { + "type": "Identifier", + "type": "Identifier", + "start": 121, + "end": 122, + "name": "l" + }, + "right": { + "type": "Identifier", + "type": "Identifier", + "start": 125, + "end": 126, + "name": "y" + } + } + ] + } + } + ], + "kind": "const" + }, + { + "type": "VariableDeclaration", + "type": "VariableDeclaration", + "start": 130, + "end": 149, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 130, + "end": 149, + "id": { + "type": "Identifier", + "start": 130, + "end": 132, + "name": "p2" + }, + "init": { + "type": "ArrayExpression", + "type": "ArrayExpression", + "start": 135, + "end": 149, + "elements": [ + { + "type": "BinaryExpression", + "type": "BinaryExpression", + "start": 136, + "end": 141, + "operator": "+", + "left": { + "type": "Identifier", + "type": "Identifier", + "start": 136, + "end": 137, + "name": "l" + }, + "right": { + "type": "Identifier", + "type": "Identifier", + "start": 140, + "end": 141, + "name": "x" + } + }, + { + "type": "BinaryExpression", + "type": "BinaryExpression", + "start": 143, + "end": 148, + "operator": "+", + "left": { + "type": "Identifier", + "type": "Identifier", + "start": 143, + "end": 144, + "name": "l" + }, + "right": { + "type": "Identifier", + "type": "Identifier", + "start": 147, + "end": 148, + "name": "y" + } + } + ] + } + } + ], + "kind": "const" + }, + { + "type": "VariableDeclaration", + "type": "VariableDeclaration", + "start": 152, + "end": 172, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 152, + "end": 172, + "id": { + "type": "Identifier", + "start": 152, + "end": 154, + "name": "p3" + }, + "init": { + "type": "ArrayExpression", + "type": "ArrayExpression", + "start": 157, + "end": 172, + "elements": [ + { + "type": "BinaryExpression", + "type": "BinaryExpression", + "start": 158, + "end": 163, + "operator": "+", + "left": { + "type": "Identifier", + "type": "Identifier", + "start": 158, + "end": 159, + "name": "l" + }, + "right": { + "type": "Identifier", + "type": "Identifier", + "start": 162, + "end": 163, + "name": "x" + } + }, + { + "type": "BinaryExpression", + "type": "BinaryExpression", + "start": 165, + "end": 171, + "operator": "+", + "left": { + "type": "UnaryExpression", + "type": "UnaryExpression", + "start": 165, + "end": 167, + "operator": "-", + "argument": { + "type": "Identifier", + "type": "Identifier", + "start": 166, + "end": 167, + "name": "l" + } + }, + "right": { + "type": "Identifier", + "type": "Identifier", + "start": 170, + "end": 171, + "name": "y" + } + } + ] + } + } + ], + "kind": "const" + }, + { + "type": "ReturnStatement", + "type": "ReturnStatement", + "start": 176, + "end": 314, + "argument": { + "type": "PipeExpression", + "type": "PipeExpression", + "start": 183, + "end": 314, + "body": [ + { + "type": "CallExpression", + "type": "CallExpression", + "start": 183, + "end": 200, + "callee": { + "type": "Identifier", + "start": 183, + "end": 196, + "name": "startSketchAt" + }, + "arguments": [ + { + "type": "Identifier", + "type": "Identifier", + "start": 197, + "end": 199, + "name": "p0" + } + ], + "optional": false + }, + { + "type": "CallExpression", + "type": "CallExpression", + "start": 206, + "end": 219, + "callee": { + "type": "Identifier", + "start": 206, + "end": 212, + "name": "lineTo" + }, + "arguments": [ + { + "type": "Identifier", + "type": "Identifier", + "start": 213, + "end": 215, + "name": "p1" + }, + { + "type": "PipeSubstitution", + "type": "PipeSubstitution", + "start": 217, + "end": 218 + } + ], + "optional": false + }, + { + "type": "CallExpression", + "type": "CallExpression", + "start": 225, + "end": 238, + "callee": { + "type": "Identifier", + "start": 225, + "end": 231, + "name": "lineTo" + }, + "arguments": [ + { + "type": "Identifier", + "type": "Identifier", + "start": 232, + "end": 234, + "name": "p2" + }, + { + "type": "PipeSubstitution", + "type": "PipeSubstitution", + "start": 236, + "end": 237 + } + ], + "optional": false + }, + { + "type": "CallExpression", + "type": "CallExpression", + "start": 244, + "end": 257, + "callee": { + "type": "Identifier", + "start": 244, + "end": 250, + "name": "lineTo" + }, + "arguments": [ + { + "type": "Identifier", + "type": "Identifier", + "start": 251, + "end": 253, + "name": "p3" + }, + { + "type": "PipeSubstitution", + "type": "PipeSubstitution", + "start": 255, + "end": 256 + } + ], + "optional": false + }, + { + "type": "CallExpression", + "type": "CallExpression", + "start": 263, + "end": 276, + "callee": { + "type": "Identifier", + "start": 263, + "end": 269, + "name": "lineTo" + }, + "arguments": [ + { + "type": "Identifier", + "type": "Identifier", + "start": 270, + "end": 272, + "name": "p0" + }, + { + "type": "PipeSubstitution", + "type": "PipeSubstitution", + "start": 274, + "end": 275 + } + ], + "optional": false + }, + { + "type": "CallExpression", + "type": "CallExpression", + "start": 282, + "end": 290, + "callee": { + "type": "Identifier", + "start": 282, + "end": 287, + "name": "close" + }, + "arguments": [ + { + "type": "PipeSubstitution", + "type": "PipeSubstitution", + "start": 288, + "end": 289 + } + ], + "optional": false + }, + { + "type": "CallExpression", + "type": "CallExpression", + "start": 296, + "end": 314, + "callee": { + "type": "Identifier", + "start": 296, + "end": 303, + "name": "extrude" + }, + "arguments": [ + { + "type": "Identifier", + "type": "Identifier", + "start": 304, + "end": 310, + "name": "length" + }, + { + "type": "PipeSubstitution", + "type": "PipeSubstitution", + "start": 312, + "end": 313 + } + ], + "optional": false + } + ] + } + } + ], + "nonCodeMeta": { + "nonCodeNodes": { + "6": [ + { + "type": "NonCodeNode", + "start": 172, + "end": 176, + "value": { + "type": "newLine" + } + } + ] + }, + "start": [] + } + } + } + } + ], + "kind": "fn" + }, + { + "type": "VariableDeclaration", + "type": "VariableDeclaration", + "start": 318, + "end": 343, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 318, + "end": 343, + "id": { + "type": "Identifier", + "start": 318, + "end": 324, + "name": "myCube" + }, + "init": { + "type": "CallExpression", + "type": "CallExpression", + "start": 327, + "end": 343, + "callee": { + "type": "Identifier", + "start": 327, + "end": 331, + "name": "cube" + }, + "arguments": [ + { + "type": "Literal", + "type": "Literal", + "start": 332, + "end": 334, + "value": 40, + "raw": "40" + }, + { + "type": "ArrayExpression", + "type": "ArrayExpression", + "start": 336, + "end": 342, + "elements": [ + { + "type": "Literal", + "type": "Literal", + "start": 337, + "end": 338, + "value": 0, + "raw": "0" + }, + { + "type": "Literal", + "type": "Literal", + "start": 340, + "end": 341, + "value": 0, + "raw": "0" + } + ] + } + ], + "optional": false + } + } + ], + "kind": "const" + } + ], + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "type": "NonCodeNode", + "start": 316, + "end": 318, + "value": { + "type": "newLine" + } + } + ] + }, + "start": [] + } + } +} diff --git a/src/wasm-lib/kcl/tests/cube/execution_error.snap.new b/src/wasm-lib/kcl/tests/cube/execution_error.snap.new new file mode 100644 index 000000000..3765efbd1 --- /dev/null +++ b/src/wasm-lib/kcl/tests/cube/execution_error.snap.new @@ -0,0 +1,7 @@ +--- +source: kcl/src/simulation_tests.rs +assertion_line: 98 +description: Error from executing cube.kcl +snapshot_kind: text +--- +No API token found in environment variables. Use KITTYCAD_API_TOKEN or ZOO_API_TOKEN diff --git a/src/wasm-lib/kcl/tests/cube/input.kcl b/src/wasm-lib/kcl/tests/cube/input.kcl new file mode 100644 index 000000000..3bc04fd10 --- /dev/null +++ b/src/wasm-lib/kcl/tests/cube/input.kcl @@ -0,0 +1,19 @@ +fn cube = (length, center) => { + l = length / 2 + x = center[0] + y = center[1] + p0 = [-l + x, -l + y] + p1 = [-l + x, l + y] + p2 = [l + x, l + y] + p3 = [l + x, -l + y] + + return startSketchAt(p0) + |> lineTo(p1, %) + |> lineTo(p2, %) + |> lineTo(p3, %) + |> lineTo(p0, %) + |> close(%) + |> extrude(length, %) +} + +myCube = cube(40, [0, 0]) diff --git a/src/wasm-lib/kcl/tests/cube/program_memory.snap b/src/wasm-lib/kcl/tests/cube/program_memory.snap new file mode 100644 index 000000000..625b6b9a6 --- /dev/null +++ b/src/wasm-lib/kcl/tests/cube/program_memory.snap @@ -0,0 +1,976 @@ +--- +source: kcl/src/tests.rs +description: Program memory after executing cube.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "UserVal", + "type": "UserVal", + "value": 180, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "UserVal", + "type": "UserVal", + "value": 90, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "UserVal", + "type": "UserVal", + "value": 270, + "__meta": [] + }, + "ZERO": { + "type": "UserVal", + "type": "UserVal", + "value": 0, + "__meta": [] + }, + "cube": { + "type": "Function", + "expression": { + "type": "FunctionExpression", + "start": 10, + "end": 316, + "params": [ + { + "type": "Parameter", + "identifier": { + "type": "Identifier", + "start": 11, + "end": 17, + "name": "length" + }, + "optional": false + }, + { + "type": "Parameter", + "identifier": { + "type": "Identifier", + "start": 19, + "end": 25, + "name": "center" + }, + "optional": false + } + ], + "body": { + "start": 30, + "end": 316, + "body": [ + { + "type": "VariableDeclaration", + "type": "VariableDeclaration", + "start": 34, + "end": 48, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 34, + "end": 48, + "id": { + "type": "Identifier", + "start": 34, + "end": 35, + "name": "l" + }, + "init": { + "type": "BinaryExpression", + "type": "BinaryExpression", + "start": 38, + "end": 48, + "operator": "/", + "left": { + "type": "Identifier", + "type": "Identifier", + "start": 38, + "end": 44, + "name": "length" + }, + "right": { + "type": "Literal", + "type": "Literal", + "start": 47, + "end": 48, + "value": 2, + "raw": "2" + } + } + } + ], + "kind": "const" + }, + { + "type": "VariableDeclaration", + "type": "VariableDeclaration", + "start": 51, + "end": 64, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 51, + "end": 64, + "id": { + "type": "Identifier", + "start": 51, + "end": 52, + "name": "x" + }, + "init": { + "type": "MemberExpression", + "type": "MemberExpression", + "start": 55, + "end": 64, + "object": { + "type": "Identifier", + "type": "Identifier", + "start": 55, + "end": 61, + "name": "center" + }, + "property": { + "type": "Literal", + "type": "Literal", + "start": 62, + "end": 63, + "value": 0, + "raw": "0" + }, + "computed": false + } + } + ], + "kind": "const" + }, + { + "type": "VariableDeclaration", + "type": "VariableDeclaration", + "start": 67, + "end": 80, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 67, + "end": 80, + "id": { + "type": "Identifier", + "start": 67, + "end": 68, + "name": "y" + }, + "init": { + "type": "MemberExpression", + "type": "MemberExpression", + "start": 71, + "end": 80, + "object": { + "type": "Identifier", + "type": "Identifier", + "start": 71, + "end": 77, + "name": "center" + }, + "property": { + "type": "Literal", + "type": "Literal", + "start": 78, + "end": 79, + "value": 1, + "raw": "1" + }, + "computed": false + } + } + ], + "kind": "const" + }, + { + "type": "VariableDeclaration", + "type": "VariableDeclaration", + "start": 83, + "end": 104, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 83, + "end": 104, + "id": { + "type": "Identifier", + "start": 83, + "end": 85, + "name": "p0" + }, + "init": { + "type": "ArrayExpression", + "type": "ArrayExpression", + "start": 88, + "end": 104, + "elements": [ + { + "type": "BinaryExpression", + "type": "BinaryExpression", + "start": 89, + "end": 95, + "operator": "+", + "left": { + "type": "UnaryExpression", + "type": "UnaryExpression", + "start": 89, + "end": 91, + "operator": "-", + "argument": { + "type": "Identifier", + "type": "Identifier", + "start": 90, + "end": 91, + "name": "l" + } + }, + "right": { + "type": "Identifier", + "type": "Identifier", + "start": 94, + "end": 95, + "name": "x" + } + }, + { + "type": "BinaryExpression", + "type": "BinaryExpression", + "start": 97, + "end": 103, + "operator": "+", + "left": { + "type": "UnaryExpression", + "type": "UnaryExpression", + "start": 97, + "end": 99, + "operator": "-", + "argument": { + "type": "Identifier", + "type": "Identifier", + "start": 98, + "end": 99, + "name": "l" + } + }, + "right": { + "type": "Identifier", + "type": "Identifier", + "start": 102, + "end": 103, + "name": "y" + } + } + ] + } + } + ], + "kind": "const" + }, + { + "type": "VariableDeclaration", + "type": "VariableDeclaration", + "start": 107, + "end": 127, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 107, + "end": 127, + "id": { + "type": "Identifier", + "start": 107, + "end": 109, + "name": "p1" + }, + "init": { + "type": "ArrayExpression", + "type": "ArrayExpression", + "start": 112, + "end": 127, + "elements": [ + { + "type": "BinaryExpression", + "type": "BinaryExpression", + "start": 113, + "end": 119, + "operator": "+", + "left": { + "type": "UnaryExpression", + "type": "UnaryExpression", + "start": 113, + "end": 115, + "operator": "-", + "argument": { + "type": "Identifier", + "type": "Identifier", + "start": 114, + "end": 115, + "name": "l" + } + }, + "right": { + "type": "Identifier", + "type": "Identifier", + "start": 118, + "end": 119, + "name": "x" + } + }, + { + "type": "BinaryExpression", + "type": "BinaryExpression", + "start": 121, + "end": 126, + "operator": "+", + "left": { + "type": "Identifier", + "type": "Identifier", + "start": 121, + "end": 122, + "name": "l" + }, + "right": { + "type": "Identifier", + "type": "Identifier", + "start": 125, + "end": 126, + "name": "y" + } + } + ] + } + } + ], + "kind": "const" + }, + { + "type": "VariableDeclaration", + "type": "VariableDeclaration", + "start": 130, + "end": 149, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 130, + "end": 149, + "id": { + "type": "Identifier", + "start": 130, + "end": 132, + "name": "p2" + }, + "init": { + "type": "ArrayExpression", + "type": "ArrayExpression", + "start": 135, + "end": 149, + "elements": [ + { + "type": "BinaryExpression", + "type": "BinaryExpression", + "start": 136, + "end": 141, + "operator": "+", + "left": { + "type": "Identifier", + "type": "Identifier", + "start": 136, + "end": 137, + "name": "l" + }, + "right": { + "type": "Identifier", + "type": "Identifier", + "start": 140, + "end": 141, + "name": "x" + } + }, + { + "type": "BinaryExpression", + "type": "BinaryExpression", + "start": 143, + "end": 148, + "operator": "+", + "left": { + "type": "Identifier", + "type": "Identifier", + "start": 143, + "end": 144, + "name": "l" + }, + "right": { + "type": "Identifier", + "type": "Identifier", + "start": 147, + "end": 148, + "name": "y" + } + } + ] + } + } + ], + "kind": "const" + }, + { + "type": "VariableDeclaration", + "type": "VariableDeclaration", + "start": 152, + "end": 172, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 152, + "end": 172, + "id": { + "type": "Identifier", + "start": 152, + "end": 154, + "name": "p3" + }, + "init": { + "type": "ArrayExpression", + "type": "ArrayExpression", + "start": 157, + "end": 172, + "elements": [ + { + "type": "BinaryExpression", + "type": "BinaryExpression", + "start": 158, + "end": 163, + "operator": "+", + "left": { + "type": "Identifier", + "type": "Identifier", + "start": 158, + "end": 159, + "name": "l" + }, + "right": { + "type": "Identifier", + "type": "Identifier", + "start": 162, + "end": 163, + "name": "x" + } + }, + { + "type": "BinaryExpression", + "type": "BinaryExpression", + "start": 165, + "end": 171, + "operator": "+", + "left": { + "type": "UnaryExpression", + "type": "UnaryExpression", + "start": 165, + "end": 167, + "operator": "-", + "argument": { + "type": "Identifier", + "type": "Identifier", + "start": 166, + "end": 167, + "name": "l" + } + }, + "right": { + "type": "Identifier", + "type": "Identifier", + "start": 170, + "end": 171, + "name": "y" + } + } + ] + } + } + ], + "kind": "const" + }, + { + "type": "ReturnStatement", + "type": "ReturnStatement", + "start": 176, + "end": 314, + "argument": { + "type": "PipeExpression", + "type": "PipeExpression", + "start": 183, + "end": 314, + "body": [ + { + "type": "CallExpression", + "type": "CallExpression", + "start": 183, + "end": 200, + "callee": { + "type": "Identifier", + "start": 183, + "end": 196, + "name": "startSketchAt" + }, + "arguments": [ + { + "type": "Identifier", + "type": "Identifier", + "start": 197, + "end": 199, + "name": "p0" + } + ], + "optional": false + }, + { + "type": "CallExpression", + "type": "CallExpression", + "start": 206, + "end": 219, + "callee": { + "type": "Identifier", + "start": 206, + "end": 212, + "name": "lineTo" + }, + "arguments": [ + { + "type": "Identifier", + "type": "Identifier", + "start": 213, + "end": 215, + "name": "p1" + }, + { + "type": "PipeSubstitution", + "type": "PipeSubstitution", + "start": 217, + "end": 218 + } + ], + "optional": false + }, + { + "type": "CallExpression", + "type": "CallExpression", + "start": 225, + "end": 238, + "callee": { + "type": "Identifier", + "start": 225, + "end": 231, + "name": "lineTo" + }, + "arguments": [ + { + "type": "Identifier", + "type": "Identifier", + "start": 232, + "end": 234, + "name": "p2" + }, + { + "type": "PipeSubstitution", + "type": "PipeSubstitution", + "start": 236, + "end": 237 + } + ], + "optional": false + }, + { + "type": "CallExpression", + "type": "CallExpression", + "start": 244, + "end": 257, + "callee": { + "type": "Identifier", + "start": 244, + "end": 250, + "name": "lineTo" + }, + "arguments": [ + { + "type": "Identifier", + "type": "Identifier", + "start": 251, + "end": 253, + "name": "p3" + }, + { + "type": "PipeSubstitution", + "type": "PipeSubstitution", + "start": 255, + "end": 256 + } + ], + "optional": false + }, + { + "type": "CallExpression", + "type": "CallExpression", + "start": 263, + "end": 276, + "callee": { + "type": "Identifier", + "start": 263, + "end": 269, + "name": "lineTo" + }, + "arguments": [ + { + "type": "Identifier", + "type": "Identifier", + "start": 270, + "end": 272, + "name": "p0" + }, + { + "type": "PipeSubstitution", + "type": "PipeSubstitution", + "start": 274, + "end": 275 + } + ], + "optional": false + }, + { + "type": "CallExpression", + "type": "CallExpression", + "start": 282, + "end": 290, + "callee": { + "type": "Identifier", + "start": 282, + "end": 287, + "name": "close" + }, + "arguments": [ + { + "type": "PipeSubstitution", + "type": "PipeSubstitution", + "start": 288, + "end": 289 + } + ], + "optional": false + }, + { + "type": "CallExpression", + "type": "CallExpression", + "start": 296, + "end": 314, + "callee": { + "type": "Identifier", + "start": 296, + "end": 303, + "name": "extrude" + }, + "arguments": [ + { + "type": "Identifier", + "type": "Identifier", + "start": 304, + "end": 310, + "name": "length" + }, + { + "type": "PipeSubstitution", + "type": "PipeSubstitution", + "start": 312, + "end": 313 + } + ], + "optional": false + } + ] + } + } + ], + "nonCodeMeta": { + "nonCodeNodes": { + "6": [ + { + "type": "NonCodeNode", + "start": 172, + "end": 176, + "value": { + "type": "newLine" + } + } + ] + }, + "start": [] + } + } + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "UserVal", + "type": "UserVal", + "value": 180, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "UserVal", + "type": "UserVal", + "value": 90, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "UserVal", + "type": "UserVal", + "value": 270, + "__meta": [] + }, + "ZERO": { + "type": "UserVal", + "type": "UserVal", + "value": 0, + "__meta": [] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 10, + 316 + ] + } + ] + }, + "myCube": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 206, + 219 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 225, + 238 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 244, + 257 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 263, + 276 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 206, + 219 + ] + }, + "from": [ + -20.0, + -20.0 + ], + "tag": null, + "to": [ + -20.0, + 20.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 225, + 238 + ] + }, + "from": [ + -20.0, + 20.0 + ], + "tag": null, + "to": [ + 20.0, + 20.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 244, + 257 + ] + }, + "from": [ + 20.0, + 20.0 + ], + "tag": null, + "to": [ + 20.0, + -20.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 263, + 276 + ] + }, + "from": [ + 20.0, + -20.0 + ], + "tag": null, + "to": [ + -20.0, + -20.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 282, + 290 + ] + }, + "from": [ + -20.0, + -20.0 + ], + "tag": null, + "to": [ + -20.0, + -20.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + -20.0, + -20.0 + ], + "to": [ + -20.0, + -20.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 183, + 200 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 183, + 200 + ] + } + ] + }, + "height": 40.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 183, + 200 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/cube/rendered_model.png b/src/wasm-lib/kcl/tests/cube/rendered_model.png new file mode 100644 index 0000000000000000000000000000000000000000..1a74f37b419cb10d89f16f4d29a3a8b6844aaa0b GIT binary patch literal 92950 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 w@iW?JC z6|buU8rfM5@y$cM4O3@Ka+W)aSc#9hm)yr%+WsXSV2D;G6<3g z2D@hV&xH^JUyotckUJca>n`^yD(?=mjZ^NpqNfSRTFC923=Tyf%M34zl}o@!aQv)Y zTCi%`0@h1EY&%UH>IxmlLsW<%Yt$lg2=-9Yns;sUf`R-_b7kDi=iLCoBV&&^jvtKeLhNE9)8Qk!aKtG}Kn7yO$qa_%|j-5<~M z?EUUHpGqC_E;U0N)BsL!0+Cr}4d7#=aPIpOz(WeGome1Xo*KAP61uL)4j(CJS$AS2+(0{|OSZ@dTjF(9T&0Q{DO1Qe^$mREf~~A%68^1E zn{WBFSz_OS$9Ibbz1y(K&DOvrNaXCh%OW#l<(a4Px|pZe10ZaZm?`+tDS?YzEjxHY z89LzZdQ1t47{4S6(gE{SU)2wI&PoP-x{G-snm!N5cb4a>j}OJb;8;q=Q+akp(f4`GK408}sF;a!UE z@02(jtZAzK_1NeX?3Me1zi{Gp>8GXP@zPAuvc0n^!C)k`QhTy8J`azQm9DZ`6oZ+p z936ij_SIm%yMJ5Zv-Txa%LnFoc^flT&;l+&FFLEr-^z-@-ugd_p%&qdZIZB6EG$QL zhWl%>u)JBmn#NWeNk>F3R*>|vb9k$YZpf*4ilfJl2`o%2Hd49|xXk&qtvhw5Ard7YK_aAqs%NfQtt!$s>Lu7C+YNR-2J^)@999zUR*x1 zm>7}$jr@PaQ>#70%FJKmJaqXpI3F!Mv8GqG7fPhQoL8$B?UaWYRmLX64BE-t(5Lvc zo|MQ!4T5=R>J zTjX7Q(Z~MKcVrCAW-APQ0Grh0gXUL|K}LlX@wa$=_w`%b+U%^b!E#@Y8SXRc6v?PF zRke6pgqbdh0l;h=NrZlCNYe8FEC85W@JtZQjS)^^pw*GkP98txP5oRco(-Wxtrj+B zqDrIv67+>a6_F|9AqLk$(*P@QCJ0MJR5?Xa)tdUK$i;2qd>FJNg8Fv~jRoNW6m9;U zj!Nb#w!%FzY|tn$2=n5s-&}R{j}slH!Bs9YHs8s-Od(M*HJk@%7cia33(1%FkCwnC zH@?3)r~=>sox4;sGu|MH7SqJ*SLRnxPI#R~HX!_gN#YL}``Nuy9e1c^rbn$#Mr+j? z#x(KV4Dj@KVYCmzS|Q^!Ya2|BGFUhth-A?V(WUpC^+pnCopKAb@adF-XOz7a!N z0x{{&S0+*I(IjT_9}YQ5000Rqd10XbHeusV9~|#<{_9%Lrt+Z;-w2?u@OnpyFnpj6axvGH8+{ zWuJDFfFlIBxxyrvVciSUaWbUq2rFg#wl3P8z&ZYzgW*xK5Hs1YYs(_X7txO9$h}Fo zhPrmP2hVU`LI&t`vxRdTbbKGI2So?teFh$@hy=9Ch>B%?5yh1f@GnTZ5auEFJ9^US zIsI_&aL!tahlt;;k8oL*P9UjPX|LgE1d2)W?LAq%5G?(Gh+5srg1ZLZWESH>zUom66hZU%7Ku>E zH<>`x0$|4#fI*1~&Vz?N>*>(ItT9J<$7oT^(OZMv%0O}~*wjLPgviUhO(=%{8~M_< zZ2q%Pj6A#9^hp%Pp=#pGVq{azJ1|(ZBaCI{Z9S8tmOC)pRunseY4QWjM$8Zn(*dZ! zdF!8BwEMB;`?N109Ok3ngD@iQl|+0)aICXy1vph~vXer_ef+tWDH3^iNeegVn*m2FpVHqk8i*fO95YI#|-rr6>mh?4W z&R-+Ssc{3%(F)3|RK~1iF%KYgHgcyi1Hw0y7hCbl<3o?5#`Q>|ve0|<=nL)bN_Z71 zdL{&?ds*uka|c1Qxv{g?C`d+OL2cBbj561i8s08B`runz7h%pXL!lzK#U`+smL2x^ zd#@tiuxB+eZ2D+vN`;318N{;~_M5xp-TV7G67BZkHm~1xx$uucsLl-~wu{-f7{>+K zjWDl{>M$J%)VP)DV&#Ai#rA`C8{>WRR*kp;6|`e8o{HxCR1~=vnJ7Yxkj(B`q@u~( z77AQmfeNLeTHYd`BhOEKg-^LhqnU`U%r@U*KdweEhpDleckt(t1>nbMEc5ZM55u8s zSj%Ht$@m7>+WpvsqUiakEx8pQzx{nAvV(539tf!x`zb>`n#J3(BI5239pVrYMYGk=NW~Zx5 zrY;$b1nCiK91t;d{orD@-+>pBJTag^m!m?1fK9pJ7I_u1DnjS=PF5dgtH?xBe8JcW zBvDyuf-8|Dhpx8^z(s?r@bpf*cKv|6vX-3OEsK5`%~xrYG0vbx2zqqf*_lpXvT4c> zW9X;^VZ;_c?O~gT;s2%vH4W<|9B*Lebi!yI{p19OZ@Gk1VWv7rvgN^@WG7njwib!{ ziwOb!$mR))+;XNhk0gcTY_fILbX5-=>FlJfQwFuQgUm&)gp>N6F#9orF|bA`L&L^c zhOPkde)uc744c^C@srUeftwvoIhR)+a^RjlQ<9OUKa$U6NB`Xq;4N=7?HB-$@NeX2 zriM!C(hOfk-7t&T`H{j*WIMvljW9`*B0D0NQ~`;JQcGtb7Bpu=aX`{w&f9xfUM3b; zsQ>(YVh$^*PiZUSqU% z1mkN9w*OFO(hzS);UO6|`^YyJ<4aa)iC`bR2ENXT)8<9&@=Drz?Wu$8_yBC)Y#0R? zPRmm zQSdy9xZ`i?GB?%3t=hTTk_j zW%4S;4bz~60Y2jw1fRdIK^BHc4*AAo6ROUO*L7>$fkuO6{bswwhd-TndRKbjTC=?y zMF*@g){n+CTx0oE@*7~aO3%L8^!7F}PfUS}-2e5_gg9ET)NJg-h8(uwBpaJ6k+fn) z`PsX4%6O0BH19ypZg!#iLNec_9tmv=0|oYK=jGf%=yxcKOG^kzF3fNvYAdm!vYGQ- z1gX%evdbU{k!{epJLJI?Qz8^|FFOu9=;{tJLjez9rH#ALnNjHdI!&#_)S@V!3!R~{ zn-XExb`DV%^p?Yq^G{l%F#(jrUX2l{H9`Ck<3o<}2HR1xV$YQJMD1n2XCZ4fPdizh z3`|W3dhmX>44t^EFT}Exqe4J66#s`MUINTKGEvsbTxbUz43^n#(6Ax(A5%HyfFsFT z%?e!j?0XVVY8;*aiW0iVC-L`zLzcg8Jy41>^80fQ_LR~C>STCVPB6IM*-SXY_C~RW zsv9gei5LR88Mv?xsi6p~3YGNR%Dw))GJF5j*eSiBXOXR8whx)=0ProVc~=U4fXGPv z02xg21KQ>T1eP>B)`0DSfVF|X*gK(Bc%uqIB&+sxu;7KS(nv_GTO8bFx63xSr{Wuk}@yWn3cmV~j={gv+x)T}dNjx`BJ*z`XWCse+RRK%({HshV zPOq@+B%QkV!&{IKY#|do4t@iZrksXcjdMp@a;HF&INcNTQWwAt1w*-P(CEvSTWvPj zWw!i*0$XsankZ04I7}=(Y8amrdRuK3fg?}EzznIi^%SWf3=~TLFZ!hLmJ$twXQ9=I zrGz?$96O7K+1A)wq(jCnm}i4WEIj@Z!}_duLr)Qlu9G__rDXCEi|&7NJiSkVgF`=K zeC%4qLhA_Xg9uMPFB<^x8v>y%_pz!OKuc*yTr}Z!G8)Fnr4zEs6p!>)vG+(o61I=> zel$IM#)NK5#vXlU1oVtP1)r+FnL9j~=CaXDYD9%>4`^h3vraI@2}d=ihK0I@w)oJn zR5RHSrLKrs)Jkbt2=MEdZu@Xdf=B(GqiPwc6b=*dKznLouNyBLU z+aQ-!lYMfKb2)+!>MBUdHi=ZYqbqW<>+zNcm_%T~+ACyOIOq_YNd%p<$pPJvY&n2i zvXQiRB>{t)oV##j^-Fa1wGS10JX8u^_(w=dtnzU6k>n8eSxiqIqg%(Zo8O2QG)iH_ zS4Y63554*PcQ{H69**o_uqN&}z#UJcSct3_B74B^0f;C$+v-uNx6oN4o=D?f3gX^( zp8VR0lmb^11fjrS0}%GmVVW6BEZcg9Au(acaW8KFLgf5q{v|l+>y(>(9d;lwzD6aG z5`o-odaZ;FwEVYhxvv2W1UlidbGD=E1vS%C>w8Jo{-G8F^- zH^NciL>j~-rwC|C&|s@h>1t}QqQvUyRy)mllwZl?Gk!T__qtT^4uLB`;&>KVDj^0+ z2nsRa$E=)ga+X%If;CbpFS^uI>{3syht1g5Npq_fFy5<8W8)kc2PZT!^;tYIwqtD; zIWu|`S~$`9S;iE2@De$*m!_esxl|Qio+Lsvz5;7lEr~`18X%f6e86~rXRohxG!g!f z9YU)^5tN_}35MFPZtOc|n&wvn|^Krm{)CX$&asJ5^clWpqsvn!e79XH2KCmKC3(cf|9hpiZ)%m9V%p1NbCYWT6mJ5xe z#?wDJO@Dd=+e)7Wn_dS*K1-wb%RrQS8Yg}-DOvyfmJ=hhN2q#@KKRplOW%{a0P;(n z+&`m$jlh7^)AODx4vRi7Iy0a6&KQiyvLKMf36=}Uw$&2P1b&K9r9jgUGf#;T!mAKL zFj0=v_*U)%Y!u*(P%Xf@s~fj(M0(ez-|I#Cal+Vo1@}n*ugU6V+9hraiyWp`1BvDz z5dC0!Pk5E%S|8(YP|f`Gi9192huZNedA#M}Xpa+yR6x&;hJyv@~XioCXPgK7(O2*mCA z+y9YAAJL5w%J~NMj8^0eX*Y#_y@li#esQT>H=HPcZ!=|(a>%h(TZ1kTLOq3s;mqU_ zYbO2B%?evdG(|_9qa!SLe_$&Ks9lJO;FkF<^R7B_P3bv_0!*(v7a&)v%vZN_fa7Az z0msS0qA*E_>tXO@>ZANb_KIf)U3wnL4tk5}7A9Sm5Z-~oDgLez!a=9qGh_FL{E#NY z52^((+F;=V=@fZVx7^qzrBZ5xmLUm?Av30{QgVQR}o+93J2D+M|oh(Ipfm}<0aHw zrmgX)YY|psY=vAChuWZ_SB_eGS&F+8k5~q9i_0u!&c17v)bNo_W&u=z@Cw#tbY0n( zk_D7$)vJe$N*lOFVbBFG!h(L8YL&?HtR-p1{=^QJGNRF?W1*nXuH`6sQAm> z8QtNf+DzXM3J|xHd&U$sGjq}oxFxZVk(>TY9x{Vyfce#!|08E91u*Z~Dm?86u$*{q zg7``zmW;M9{k+z4Bi{rEze=(dUE`q@*(2XO%!8hI% zS|@@4!t7y5Xn$vXhs>ateP|1ZK}Za?}ABaqIuD7fPstHa}@8 zW8VU>9=9tIGhpAz+^f@osif@-!YNdyQrZ`RTCfgs;}VgJbg1^+#l zwh^ow;E)${aaKw@g`#Y;AHhzE8P(h%oQ2g&Nu`GBiFAsgZ&=@f6l_D$NDi!UE# zBEruP?OspvdyXad^Y8OE}nknEjKo$+tReLo5JupN(vM z(@R7B#^6#f0GK^CG)agFG@&^f@}{d6jgfY!ok5Cv2POm+m=JXJ@y66hE}B2pE7Db! z`oL@q-&xvlImWE&TQib3G)7I64RTrgwlV)WjCa z3s|eWU|K}11i?eX*SRj(n*uvxrJuq1-^CGui$(I-jEVC^92E7b$NaNcTueFZ^vrOV>8BRF zVQYUbWYH0=^_#bf&P=Ug`j?4vjEPM!^l`?}wY{=`-TxF|3Bec(&2X}q>^DWZpRx^b zXzpqx7_o$Q;5)n)y6)%#u3O?=w@>@aj`OQ%0|-recgRpStfK4taoqQfkkjm79n5%iU<3>YT|&~T+F+rj=7oLV~i~W zHNX{*0KDwV7Envp!u|2(0;{R8YoqI!OPi7l zQl6}+n#q6sf@@&)%F-KLmrRi_dNpf(Kro~=t-L@C)bLsS9#{~XX&uOZD;bM^{g~2* zGJa>k-YEADLQtS3ro0TmL#n zoWiTTH9V*BiowPZx($k|D>z<hT@%^Q19ps~vgvI<)>2V2SnK8fF+hnXZ;dyQFQKHjUM z;!#fkbgq=`oh=w!gJ4po*=Y7{PS&aMvX0rk7xfpEv+zhwI$Z_{4XJ@AUa@=&e6ouE z5+@(^jzun>JE%1i$t38i<*hh%3{O#M z9U&5ub9MPfJP^1pUo+=jcQ(7XpLXY04VKou|C{05He)1WRJ1W#yO-k`FNa~KfF-aF zY^s`BFF+#RxtsQHAk|}f7(w~1_64Nez-06o#TRxbwL{J2$XSDqcYDLW*@_c6hJoZwQvblU#`S-qq+j_z{;A0gY+f1Mg+y>fX-{evqogakIiL|I?hvEW!3t_IJiX;t1VUGMq}v_f1Yd6)8d!uXATt{OuA-PF~I}l-n~7aSDvUD3j8L`~gN$_+h=IO&I{1~@AI=!~MTQHz3NP_XOnK3ut~na?f|q!S zcnLqe%O|%hg#1HdrO-Xv0`PXgk#eLU_S6dOj34Zr9_MlADc#d?{9tkVDZp&1@bSwvhgU8<{0c5r^R(sW%_>EI7Hbx6Uh7&2O7$s= zeq{e3^})>GlbPwm@jti#Y_b%E0v9ZzpU$KovDaI$(sWwdG!%@sn#Fb#SlwTSlRZx` z0L}h+Snbv^`JG{ldv%FFst)J6_u{_9{CTd`d4st#ccX(fPMuFa-I>gzXCExGY-d+2 zX2fSrF=87iBA)fJXxKR$Jfd#{+5Bv{kGjkM&){)l-80#H$9(kZ1)mJT|8Bhgrt7x+ I)vZ7HU!@?zuK)l5 literal 0 HcmV?d00001 diff --git a/src/wasm-lib/kcl/tests/cube/tokens.snap b/src/wasm-lib/kcl/tests/cube/tokens.snap new file mode 100644 index 000000000..6136c0486 --- /dev/null +++ b/src/wasm-lib/kcl/tests/cube/tokens.snap @@ -0,0 +1,1257 @@ +--- +source: kcl/src/tests.rs +description: Result of tokenizing cube.kcl +snapshot_kind: text +--- +{ + "Ok": [ + { + "type": "keyword", + "start": 0, + "end": 2, + "value": "fn" + }, + { + "type": "whitespace", + "start": 2, + "end": 3, + "value": " " + }, + { + "type": "word", + "start": 3, + "end": 7, + "value": "cube" + }, + { + "type": "whitespace", + "start": 7, + "end": 8, + "value": " " + }, + { + "type": "operator", + "start": 8, + "end": 9, + "value": "=" + }, + { + "type": "whitespace", + "start": 9, + "end": 10, + "value": " " + }, + { + "type": "brace", + "start": 10, + "end": 11, + "value": "(" + }, + { + "type": "word", + "start": 11, + "end": 17, + "value": "length" + }, + { + "type": "comma", + "start": 17, + "end": 18, + "value": "," + }, + { + "type": "whitespace", + "start": 18, + "end": 19, + "value": " " + }, + { + "type": "word", + "start": 19, + "end": 25, + "value": "center" + }, + { + "type": "brace", + "start": 25, + "end": 26, + "value": ")" + }, + { + "type": "whitespace", + "start": 26, + "end": 27, + "value": " " + }, + { + "type": "operator", + "start": 27, + "end": 29, + "value": "=>" + }, + { + "type": "whitespace", + "start": 29, + "end": 30, + "value": " " + }, + { + "type": "brace", + "start": 30, + "end": 31, + "value": "{" + }, + { + "type": "whitespace", + "start": 31, + "end": 34, + "value": "\n " + }, + { + "type": "word", + "start": 34, + "end": 35, + "value": "l" + }, + { + "type": "whitespace", + "start": 35, + "end": 36, + "value": " " + }, + { + "type": "operator", + "start": 36, + "end": 37, + "value": "=" + }, + { + "type": "whitespace", + "start": 37, + "end": 38, + "value": " " + }, + { + "type": "word", + "start": 38, + "end": 44, + "value": "length" + }, + { + "type": "whitespace", + "start": 44, + "end": 45, + "value": " " + }, + { + "type": "operator", + "start": 45, + "end": 46, + "value": "/" + }, + { + "type": "whitespace", + "start": 46, + "end": 47, + "value": " " + }, + { + "type": "number", + "start": 47, + "end": 48, + "value": "2" + }, + { + "type": "whitespace", + "start": 48, + "end": 51, + "value": "\n " + }, + { + "type": "word", + "start": 51, + "end": 52, + "value": "x" + }, + { + "type": "whitespace", + "start": 52, + "end": 53, + "value": " " + }, + { + "type": "operator", + "start": 53, + "end": 54, + "value": "=" + }, + { + "type": "whitespace", + "start": 54, + "end": 55, + "value": " " + }, + { + "type": "word", + "start": 55, + "end": 61, + "value": "center" + }, + { + "type": "brace", + "start": 61, + "end": 62, + "value": "[" + }, + { + "type": "number", + "start": 62, + "end": 63, + "value": "0" + }, + { + "type": "brace", + "start": 63, + "end": 64, + "value": "]" + }, + { + "type": "whitespace", + "start": 64, + "end": 67, + "value": "\n " + }, + { + "type": "word", + "start": 67, + "end": 68, + "value": "y" + }, + { + "type": "whitespace", + "start": 68, + "end": 69, + "value": " " + }, + { + "type": "operator", + "start": 69, + "end": 70, + "value": "=" + }, + { + "type": "whitespace", + "start": 70, + "end": 71, + "value": " " + }, + { + "type": "word", + "start": 71, + "end": 77, + "value": "center" + }, + { + "type": "brace", + "start": 77, + "end": 78, + "value": "[" + }, + { + "type": "number", + "start": 78, + "end": 79, + "value": "1" + }, + { + "type": "brace", + "start": 79, + "end": 80, + "value": "]" + }, + { + "type": "whitespace", + "start": 80, + "end": 83, + "value": "\n " + }, + { + "type": "word", + "start": 83, + "end": 85, + "value": "p0" + }, + { + "type": "whitespace", + "start": 85, + "end": 86, + "value": " " + }, + { + "type": "operator", + "start": 86, + "end": 87, + "value": "=" + }, + { + "type": "whitespace", + "start": 87, + "end": 88, + "value": " " + }, + { + "type": "brace", + "start": 88, + "end": 89, + "value": "[" + }, + { + "type": "operator", + "start": 89, + "end": 90, + "value": "-" + }, + { + "type": "word", + "start": 90, + "end": 91, + "value": "l" + }, + { + "type": "whitespace", + "start": 91, + "end": 92, + "value": " " + }, + { + "type": "operator", + "start": 92, + "end": 93, + "value": "+" + }, + { + "type": "whitespace", + "start": 93, + "end": 94, + "value": " " + }, + { + "type": "word", + "start": 94, + "end": 95, + "value": "x" + }, + { + "type": "comma", + "start": 95, + "end": 96, + "value": "," + }, + { + "type": "whitespace", + "start": 96, + "end": 97, + "value": " " + }, + { + "type": "operator", + "start": 97, + "end": 98, + "value": "-" + }, + { + "type": "word", + "start": 98, + "end": 99, + "value": "l" + }, + { + "type": "whitespace", + "start": 99, + "end": 100, + "value": " " + }, + { + "type": "operator", + "start": 100, + "end": 101, + "value": "+" + }, + { + "type": "whitespace", + "start": 101, + "end": 102, + "value": " " + }, + { + "type": "word", + "start": 102, + "end": 103, + "value": "y" + }, + { + "type": "brace", + "start": 103, + "end": 104, + "value": "]" + }, + { + "type": "whitespace", + "start": 104, + "end": 107, + "value": "\n " + }, + { + "type": "word", + "start": 107, + "end": 109, + "value": "p1" + }, + { + "type": "whitespace", + "start": 109, + "end": 110, + "value": " " + }, + { + "type": "operator", + "start": 110, + "end": 111, + "value": "=" + }, + { + "type": "whitespace", + "start": 111, + "end": 112, + "value": " " + }, + { + "type": "brace", + "start": 112, + "end": 113, + "value": "[" + }, + { + "type": "operator", + "start": 113, + "end": 114, + "value": "-" + }, + { + "type": "word", + "start": 114, + "end": 115, + "value": "l" + }, + { + "type": "whitespace", + "start": 115, + "end": 116, + "value": " " + }, + { + "type": "operator", + "start": 116, + "end": 117, + "value": "+" + }, + { + "type": "whitespace", + "start": 117, + "end": 118, + "value": " " + }, + { + "type": "word", + "start": 118, + "end": 119, + "value": "x" + }, + { + "type": "comma", + "start": 119, + "end": 120, + "value": "," + }, + { + "type": "whitespace", + "start": 120, + "end": 121, + "value": " " + }, + { + "type": "word", + "start": 121, + "end": 122, + "value": "l" + }, + { + "type": "whitespace", + "start": 122, + "end": 123, + "value": " " + }, + { + "type": "operator", + "start": 123, + "end": 124, + "value": "+" + }, + { + "type": "whitespace", + "start": 124, + "end": 125, + "value": " " + }, + { + "type": "word", + "start": 125, + "end": 126, + "value": "y" + }, + { + "type": "brace", + "start": 126, + "end": 127, + "value": "]" + }, + { + "type": "whitespace", + "start": 127, + "end": 130, + "value": "\n " + }, + { + "type": "word", + "start": 130, + "end": 132, + "value": "p2" + }, + { + "type": "whitespace", + "start": 132, + "end": 133, + "value": " " + }, + { + "type": "operator", + "start": 133, + "end": 134, + "value": "=" + }, + { + "type": "whitespace", + "start": 134, + "end": 135, + "value": " " + }, + { + "type": "brace", + "start": 135, + "end": 136, + "value": "[" + }, + { + "type": "word", + "start": 136, + "end": 137, + "value": "l" + }, + { + "type": "whitespace", + "start": 137, + "end": 138, + "value": " " + }, + { + "type": "operator", + "start": 138, + "end": 139, + "value": "+" + }, + { + "type": "whitespace", + "start": 139, + "end": 140, + "value": " " + }, + { + "type": "word", + "start": 140, + "end": 141, + "value": "x" + }, + { + "type": "comma", + "start": 141, + "end": 142, + "value": "," + }, + { + "type": "whitespace", + "start": 142, + "end": 143, + "value": " " + }, + { + "type": "word", + "start": 143, + "end": 144, + "value": "l" + }, + { + "type": "whitespace", + "start": 144, + "end": 145, + "value": " " + }, + { + "type": "operator", + "start": 145, + "end": 146, + "value": "+" + }, + { + "type": "whitespace", + "start": 146, + "end": 147, + "value": " " + }, + { + "type": "word", + "start": 147, + "end": 148, + "value": "y" + }, + { + "type": "brace", + "start": 148, + "end": 149, + "value": "]" + }, + { + "type": "whitespace", + "start": 149, + "end": 152, + "value": "\n " + }, + { + "type": "word", + "start": 152, + "end": 154, + "value": "p3" + }, + { + "type": "whitespace", + "start": 154, + "end": 155, + "value": " " + }, + { + "type": "operator", + "start": 155, + "end": 156, + "value": "=" + }, + { + "type": "whitespace", + "start": 156, + "end": 157, + "value": " " + }, + { + "type": "brace", + "start": 157, + "end": 158, + "value": "[" + }, + { + "type": "word", + "start": 158, + "end": 159, + "value": "l" + }, + { + "type": "whitespace", + "start": 159, + "end": 160, + "value": " " + }, + { + "type": "operator", + "start": 160, + "end": 161, + "value": "+" + }, + { + "type": "whitespace", + "start": 161, + "end": 162, + "value": " " + }, + { + "type": "word", + "start": 162, + "end": 163, + "value": "x" + }, + { + "type": "comma", + "start": 163, + "end": 164, + "value": "," + }, + { + "type": "whitespace", + "start": 164, + "end": 165, + "value": " " + }, + { + "type": "operator", + "start": 165, + "end": 166, + "value": "-" + }, + { + "type": "word", + "start": 166, + "end": 167, + "value": "l" + }, + { + "type": "whitespace", + "start": 167, + "end": 168, + "value": " " + }, + { + "type": "operator", + "start": 168, + "end": 169, + "value": "+" + }, + { + "type": "whitespace", + "start": 169, + "end": 170, + "value": " " + }, + { + "type": "word", + "start": 170, + "end": 171, + "value": "y" + }, + { + "type": "brace", + "start": 171, + "end": 172, + "value": "]" + }, + { + "type": "whitespace", + "start": 172, + "end": 176, + "value": "\n\n " + }, + { + "type": "keyword", + "start": 176, + "end": 182, + "value": "return" + }, + { + "type": "whitespace", + "start": 182, + "end": 183, + "value": " " + }, + { + "type": "word", + "start": 183, + "end": 196, + "value": "startSketchAt" + }, + { + "type": "brace", + "start": 196, + "end": 197, + "value": "(" + }, + { + "type": "word", + "start": 197, + "end": 199, + "value": "p0" + }, + { + "type": "brace", + "start": 199, + "end": 200, + "value": ")" + }, + { + "type": "whitespace", + "start": 200, + "end": 203, + "value": "\n " + }, + { + "type": "operator", + "start": 203, + "end": 205, + "value": "|>" + }, + { + "type": "whitespace", + "start": 205, + "end": 206, + "value": " " + }, + { + "type": "word", + "start": 206, + "end": 212, + "value": "lineTo" + }, + { + "type": "brace", + "start": 212, + "end": 213, + "value": "(" + }, + { + "type": "word", + "start": 213, + "end": 215, + "value": "p1" + }, + { + "type": "comma", + "start": 215, + "end": 216, + "value": "," + }, + { + "type": "whitespace", + "start": 216, + "end": 217, + "value": " " + }, + { + "type": "operator", + "start": 217, + "end": 218, + "value": "%" + }, + { + "type": "brace", + "start": 218, + "end": 219, + "value": ")" + }, + { + "type": "whitespace", + "start": 219, + "end": 222, + "value": "\n " + }, + { + "type": "operator", + "start": 222, + "end": 224, + "value": "|>" + }, + { + "type": "whitespace", + "start": 224, + "end": 225, + "value": " " + }, + { + "type": "word", + "start": 225, + "end": 231, + "value": "lineTo" + }, + { + "type": "brace", + "start": 231, + "end": 232, + "value": "(" + }, + { + "type": "word", + "start": 232, + "end": 234, + "value": "p2" + }, + { + "type": "comma", + "start": 234, + "end": 235, + "value": "," + }, + { + "type": "whitespace", + "start": 235, + "end": 236, + "value": " " + }, + { + "type": "operator", + "start": 236, + "end": 237, + "value": "%" + }, + { + "type": "brace", + "start": 237, + "end": 238, + "value": ")" + }, + { + "type": "whitespace", + "start": 238, + "end": 241, + "value": "\n " + }, + { + "type": "operator", + "start": 241, + "end": 243, + "value": "|>" + }, + { + "type": "whitespace", + "start": 243, + "end": 244, + "value": " " + }, + { + "type": "word", + "start": 244, + "end": 250, + "value": "lineTo" + }, + { + "type": "brace", + "start": 250, + "end": 251, + "value": "(" + }, + { + "type": "word", + "start": 251, + "end": 253, + "value": "p3" + }, + { + "type": "comma", + "start": 253, + "end": 254, + "value": "," + }, + { + "type": "whitespace", + "start": 254, + "end": 255, + "value": " " + }, + { + "type": "operator", + "start": 255, + "end": 256, + "value": "%" + }, + { + "type": "brace", + "start": 256, + "end": 257, + "value": ")" + }, + { + "type": "whitespace", + "start": 257, + "end": 260, + "value": "\n " + }, + { + "type": "operator", + "start": 260, + "end": 262, + "value": "|>" + }, + { + "type": "whitespace", + "start": 262, + "end": 263, + "value": " " + }, + { + "type": "word", + "start": 263, + "end": 269, + "value": "lineTo" + }, + { + "type": "brace", + "start": 269, + "end": 270, + "value": "(" + }, + { + "type": "word", + "start": 270, + "end": 272, + "value": "p0" + }, + { + "type": "comma", + "start": 272, + "end": 273, + "value": "," + }, + { + "type": "whitespace", + "start": 273, + "end": 274, + "value": " " + }, + { + "type": "operator", + "start": 274, + "end": 275, + "value": "%" + }, + { + "type": "brace", + "start": 275, + "end": 276, + "value": ")" + }, + { + "type": "whitespace", + "start": 276, + "end": 279, + "value": "\n " + }, + { + "type": "operator", + "start": 279, + "end": 281, + "value": "|>" + }, + { + "type": "whitespace", + "start": 281, + "end": 282, + "value": " " + }, + { + "type": "word", + "start": 282, + "end": 287, + "value": "close" + }, + { + "type": "brace", + "start": 287, + "end": 288, + "value": "(" + }, + { + "type": "operator", + "start": 288, + "end": 289, + "value": "%" + }, + { + "type": "brace", + "start": 289, + "end": 290, + "value": ")" + }, + { + "type": "whitespace", + "start": 290, + "end": 293, + "value": "\n " + }, + { + "type": "operator", + "start": 293, + "end": 295, + "value": "|>" + }, + { + "type": "whitespace", + "start": 295, + "end": 296, + "value": " " + }, + { + "type": "word", + "start": 296, + "end": 303, + "value": "extrude" + }, + { + "type": "brace", + "start": 303, + "end": 304, + "value": "(" + }, + { + "type": "word", + "start": 304, + "end": 310, + "value": "length" + }, + { + "type": "comma", + "start": 310, + "end": 311, + "value": "," + }, + { + "type": "whitespace", + "start": 311, + "end": 312, + "value": " " + }, + { + "type": "operator", + "start": 312, + "end": 313, + "value": "%" + }, + { + "type": "brace", + "start": 313, + "end": 314, + "value": ")" + }, + { + "type": "whitespace", + "start": 314, + "end": 315, + "value": "\n" + }, + { + "type": "brace", + "start": 315, + "end": 316, + "value": "}" + }, + { + "type": "whitespace", + "start": 316, + "end": 318, + "value": "\n\n" + }, + { + "type": "word", + "start": 318, + "end": 324, + "value": "myCube" + }, + { + "type": "whitespace", + "start": 324, + "end": 325, + "value": " " + }, + { + "type": "operator", + "start": 325, + "end": 326, + "value": "=" + }, + { + "type": "whitespace", + "start": 326, + "end": 327, + "value": " " + }, + { + "type": "word", + "start": 327, + "end": 331, + "value": "cube" + }, + { + "type": "brace", + "start": 331, + "end": 332, + "value": "(" + }, + { + "type": "number", + "start": 332, + "end": 334, + "value": "40" + }, + { + "type": "comma", + "start": 334, + "end": 335, + "value": "," + }, + { + "type": "whitespace", + "start": 335, + "end": 336, + "value": " " + }, + { + "type": "brace", + "start": 336, + "end": 337, + "value": "[" + }, + { + "type": "number", + "start": 337, + "end": 338, + "value": "0" + }, + { + "type": "comma", + "start": 338, + "end": 339, + "value": "," + }, + { + "type": "whitespace", + "start": 339, + "end": 340, + "value": " " + }, + { + "type": "number", + "start": 340, + "end": 341, + "value": "0" + }, + { + "type": "brace", + "start": 341, + "end": 342, + "value": "]" + }, + { + "type": "brace", + "start": 342, + "end": 343, + "value": ")" + }, + { + "type": "whitespace", + "start": 343, + "end": 344, + "value": "\n" + } + ] +} diff --git a/src/wasm-lib/kcl/tests/simtest.tmpl b/src/wasm-lib/kcl/tests/simtest.tmpl new file mode 100644 index 000000000..785cba1d7 --- /dev/null +++ b/src/wasm-lib/kcl/tests/simtest.tmpl @@ -0,0 +1,27 @@ +mod TEST_NAME_HERE { + const TEST_NAME: &str = "TEST_NAME_HERE"; + + /// Test tokenizing KCL. + #[test] + fn tokenize() { + super::tokenize(TEST_NAME) + } + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME).await + } +} From 43bec115c01e1327437fff092ae272eda5f616f8 Mon Sep 17 00:00:00 2001 From: Jonathan Tran Date: Wed, 30 Oct 2024 16:52:17 -0400 Subject: [PATCH 09/13] Refactor source ranges into a generic node type (#4350) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * WIP Signed-off-by: Nick Cameron * Fix formatting * Fix yarn build:wasm * Fix ts_rs bindings * Fix tsc errors * Fix wasm TS types * Add minimal failing test * Rename field to avoid name collisions * Remove node wrapper around NonCodeMeta Trying to fix TS unit test errors deserializing JSON AST in Rust. * Rename Node to BoxNode * Fix lints * Fix lint by boxing literals * Rename UnboxedNode to Node * Look at this (photo)Graph *in the voice of Nickelback* * Update docs * Update snapshots * initial trait Signed-off-by: Jess Frazelle * update docs Signed-off-by: Jess Frazelle * updates Signed-off-by: Jess Frazelle * gross hack for TagNode Signed-off-by: Jess Frazelle * extend gross hack Signed-off-by: Jess Frazelle * fix EnvRef bullshit Signed-off-by: Jess Frazelle * Fix to fail parsing when a tag declarator matches a stdlib function name * Fix test errors after merging main * A snapshot a day keeps the bugs away! 📷🐛 (OS: ubuntu-latest) * Confirm * Change to use simpler map_err * Add comment --------- Signed-off-by: Nick Cameron Signed-off-by: Jess Frazelle Co-authored-by: Nick Cameron Co-authored-by: github-actions[bot] Co-authored-by: Jess Frazelle --- docs/kcl/std.json | 14664 +++++++--------- docs/kcl/types/BinaryPart.md | 28 +- docs/kcl/types/BodyItem.md | 16 +- docs/kcl/types/ElseIf.md | 4 +- docs/kcl/types/Environment.md | 2 +- docs/kcl/types/Expr.md | 60 +- docs/kcl/types/FunctionExpression.md | 4 +- docs/kcl/types/Identifier.md | 4 +- docs/kcl/types/ImportItem.md | 4 +- docs/kcl/types/KclValue.md | 4 +- docs/kcl/types/LiteralIdentifier.md | 8 +- docs/kcl/types/MemberObject.md | 8 +- docs/kcl/types/NonCodeMeta.md | 2 +- docs/kcl/types/NonCodeNode.md | 4 +- docs/kcl/types/ObjectProperty.md | 4 +- docs/kcl/types/Program.md | 4 +- docs/kcl/types/ProgramMemory.md | 2 +- docs/kcl/types/VariableDeclarator.md | 4 +- public/kcl-samples-manifest-fallback.json | 12 +- src/clientSideScene/ClientSideSceneComp.tsx | 5 +- src/clientSideScene/sceneEntities.ts | 29 +- src/components/ModelingMachineProvider.tsx | 5 +- src/components/Toolbar/EqualLength.tsx | 3 +- src/components/Toolbar/HorzVert.tsx | 5 +- src/components/Toolbar/Intersect.tsx | 3 +- .../Toolbar/RemoveConstrainingValues.tsx | 3 +- src/components/Toolbar/SetAbsDistance.tsx | 3 +- .../Toolbar/SetHorzVertDistance.tsx | 3 +- src/lang/KclSingleton.ts | 23 +- src/lang/langHelpers.ts | 3 +- src/lang/modifyAst.test.ts | 5 +- src/lang/modifyAst.ts | 75 +- src/lang/modifyAst/addFillet.ts | 19 +- src/lang/queryAst.ts | 23 +- src/lang/std/sketch.test.ts | 7 +- src/lang/std/sketch.ts | 45 +- src/lang/std/sketchcombos.ts | 22 +- src/lang/std/stdTypes.ts | 19 +- src/lang/wasm.test.ts | 13 + src/lang/wasm.ts | 15 +- src/lib/commandTypes.ts | 5 +- src/lib/selections.ts | 5 +- src/lib/testHelpers.ts | 5 +- src/wasm-lib/kcl-macros/tests/macro_test.rs | 66 +- src/wasm-lib/kcl/src/ast/modify.rs | 6 +- src/wasm-lib/kcl/src/ast/types.rs | 1286 +- src/wasm-lib/kcl/src/ast/types/condition.rs | 71 +- src/wasm-lib/kcl/src/ast/types/execute.rs | 34 +- .../kcl/src/ast/types/literal_value.rs | 6 +- src/wasm-lib/kcl/src/docs/gen_std_tests.rs | 7 +- src/wasm-lib/kcl/src/docs/mod.rs | 2 +- src/wasm-lib/kcl/src/executor.rs | 109 +- src/wasm-lib/kcl/src/function_param.rs | 2 +- .../kcl/src/lint/checks/std_lib_args.rs | 7 +- .../kcl/src/lsp/kcl/custom_notifications.rs | 4 +- src/wasm-lib/kcl/src/lsp/kcl/mod.rs | 6 +- src/wasm-lib/kcl/src/lsp/tests.rs | 53 +- src/wasm-lib/kcl/src/parser.rs | 10 +- src/wasm-lib/kcl/src/parser/math.rs | 61 +- src/wasm-lib/kcl/src/parser/parser_impl.rs | 1093 +- ...__parser_impl__snapshot_math_tests__a.snap | 18 +- ...__parser_impl__snapshot_math_tests__b.snap | 18 +- ...__parser_impl__snapshot_math_tests__c.snap | 18 +- ...__parser_impl__snapshot_math_tests__d.snap | 30 +- ...__parser_impl__snapshot_math_tests__e.snap | 30 +- ...__parser_impl__snapshot_math_tests__f.snap | 42 +- ...__parser_impl__snapshot_math_tests__g.snap | 42 +- ...__parser_impl__snapshot_math_tests__h.snap | 54 +- ...__parser_impl__snapshot_math_tests__i.snap | 30 +- ...__parser_impl__snapshot_math_tests__j.snap | 56 +- ...__parser_impl__snapshot_math_tests__k.snap | 18 +- ...arser__parser_impl__snapshot_tests__a.snap | 326 +- ...rser__parser_impl__snapshot_tests__aa.snap | 48 +- ...rser__parser_impl__snapshot_tests__ab.snap | 96 +- ...rser__parser_impl__snapshot_tests__ac.snap | 62 +- ...rser__parser_impl__snapshot_tests__ad.snap | 96 +- ...rser__parser_impl__snapshot_tests__ae.snap | 120 +- ...rser__parser_impl__snapshot_tests__af.snap | 304 +- ...rser__parser_impl__snapshot_tests__ag.snap | 176 +- ...rser__parser_impl__snapshot_tests__ah.snap | 58 +- ...rser__parser_impl__snapshot_tests__ai.snap | 108 +- ...rser__parser_impl__snapshot_tests__aj.snap | 124 +- ...rser__parser_impl__snapshot_tests__ak.snap | 84 +- ...rser__parser_impl__snapshot_tests__al.snap | 124 +- ...rser__parser_impl__snapshot_tests__am.snap | 84 +- ...rser__parser_impl__snapshot_tests__an.snap | 124 +- ...rser__parser_impl__snapshot_tests__ao.snap | 124 +- ...rser__parser_impl__snapshot_tests__ap.snap | 80 +- ...rser__parser_impl__snapshot_tests__aq.snap | 64 +- ...rser__parser_impl__snapshot_tests__ar.snap | 44 +- ...rser__parser_impl__snapshot_tests__at.snap | 70 +- ...rser__parser_impl__snapshot_tests__au.snap | 204 +- ...rser__parser_impl__snapshot_tests__av.snap | 124 +- ...rser__parser_impl__snapshot_tests__aw.snap | 68 +- ...rser__parser_impl__snapshot_tests__ax.snap | 68 +- ...rser__parser_impl__snapshot_tests__ay.snap | 122 +- ...rser__parser_impl__snapshot_tests__az.snap | 122 +- ...arser__parser_impl__snapshot_tests__b.snap | 114 +- ...rser__parser_impl__snapshot_tests__ba.snap | 116 +- ...rser__parser_impl__snapshot_tests__bb.snap | 138 +- ...rser__parser_impl__snapshot_tests__bc.snap | 112 +- ...rser__parser_impl__snapshot_tests__bd.snap | 174 +- ...rser__parser_impl__snapshot_tests__be.snap | 58 +- ...rser__parser_impl__snapshot_tests__bf.snap | 58 +- ...rser__parser_impl__snapshot_tests__bg.snap | 38 +- ...rser__parser_impl__snapshot_tests__bh.snap | 96 +- ...arser__parser_impl__snapshot_tests__c.snap | 114 +- ...arser__parser_impl__snapshot_tests__d.snap | 106 +- ...rser__parser_impl__snapshot_tests__d2.snap | 66 +- ...arser__parser_impl__snapshot_tests__e.snap | 78 +- ...arser__parser_impl__snapshot_tests__f.snap | 44 +- ...arser__parser_impl__snapshot_tests__g.snap | 82 +- ...arser__parser_impl__snapshot_tests__h.snap | 142 +- ...arser__parser_impl__snapshot_tests__i.snap | 144 +- ...arser__parser_impl__snapshot_tests__j.snap | 144 +- ...arser__parser_impl__snapshot_tests__k.snap | 164 +- ...arser__parser_impl__snapshot_tests__l.snap | 164 +- ...arser__parser_impl__snapshot_tests__m.snap | 164 +- ...arser__parser_impl__snapshot_tests__n.snap | 72 +- ...arser__parser_impl__snapshot_tests__o.snap | 78 +- ...arser__parser_impl__snapshot_tests__p.snap | 78 +- ...arser__parser_impl__snapshot_tests__q.snap | 74 +- ...arser__parser_impl__snapshot_tests__r.snap | 124 +- ...arser__parser_impl__snapshot_tests__s.snap | 70 +- ...arser__parser_impl__snapshot_tests__t.snap | 52 +- ...arser__parser_impl__snapshot_tests__u.snap | 100 +- ...arser__parser_impl__snapshot_tests__v.snap | 54 +- ...arser__parser_impl__snapshot_tests__w.snap | 54 +- ...arser__parser_impl__snapshot_tests__x.snap | 52 +- ...arser__parser_impl__snapshot_tests__y.snap | 58 +- ...arser__parser_impl__snapshot_tests__z.snap | 136 +- src/wasm-lib/kcl/src/simulation_tests.rs | 9 +- src/wasm-lib/kcl/src/std/args.rs | 20 +- src/wasm-lib/kcl/src/std/chamfer.rs | 6 +- src/wasm-lib/kcl/src/std/fillet.rs | 6 +- src/wasm-lib/kcl/src/std/kcl_stdlib.rs | 4 +- src/wasm-lib/kcl/src/std/mod.rs | 2 +- src/wasm-lib/kcl/src/std/shapes.rs | 10 +- src/wasm-lib/kcl/src/std/sketch.rs | 78 +- src/wasm-lib/kcl/src/test_server.rs | 6 +- src/wasm-lib/kcl/src/unparser.rs | 8 +- src/wasm-lib/kcl/src/walk/ast_node.rs | 102 +- src/wasm-lib/kcl/src/walk/ast_walk.rs | 18 +- src/wasm-lib/kcl/tests/cube/ast.snap | 1012 +- .../kcl/tests/cube/program_memory.snap | 852 +- src/wasm-lib/src/wasm.rs | 13 +- src/wasm-lib/tests/executor/no_visuals.rs | 4 +- src/wasm-lib/tests/modify/main.rs | 7 +- 148 files changed, 12935 insertions(+), 13924 deletions(-) create mode 100644 src/lang/wasm.test.ts diff --git a/docs/kcl/std.json b/docs/kcl/std.json index f26541e27..2a49b6a5f 100644 --- a/docs/kcl/std.json +++ b/docs/kcl/std.json @@ -685,21 +685,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -713,6 +701,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -1539,21 +1537,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -1567,6 +1553,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -2444,21 +2440,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -2472,6 +2456,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -3806,21 +3800,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -3834,6 +3816,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -4660,21 +4652,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -4688,6 +4668,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -5565,21 +5555,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -5593,6 +5571,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -6960,21 +6948,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -6988,6 +6964,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -7732,7 +7718,7 @@ }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -8280,21 +8266,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -8308,6 +8282,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -9648,21 +9632,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -9676,6 +9648,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -11069,21 +11051,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -11097,6 +11067,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -11841,7 +11821,7 @@ }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -12389,21 +12369,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -12417,6 +12385,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -13757,21 +13735,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -13785,6 +13751,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -15178,21 +15154,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -15206,6 +15170,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -15950,7 +15924,7 @@ }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -16498,21 +16472,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -16526,6 +16488,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -17866,21 +17838,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -17894,6 +17854,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -19283,21 +19253,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -19311,6 +19269,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -20214,21 +20182,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -20242,6 +20198,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -20922,7 +20888,7 @@ }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -21534,21 +21500,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -21562,6 +21516,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -22838,21 +22802,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -22866,6 +22818,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -24244,21 +24206,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -24272,6 +24222,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -25016,7 +24976,7 @@ }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -25564,21 +25524,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -25592,6 +25540,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -26932,21 +26890,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -26960,6 +26906,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -28338,21 +28294,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -28366,6 +28310,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -29110,7 +29064,7 @@ }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -29658,21 +29612,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -29686,6 +29628,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -31026,21 +30978,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -31054,6 +30994,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -32483,21 +32433,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -32511,6 +32449,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -33255,7 +33203,7 @@ }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -33803,21 +33751,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -33831,6 +33767,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -35171,21 +35117,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -35199,6 +35133,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -37001,21 +36945,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -37029,6 +36961,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -37773,7 +37715,7 @@ }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -38321,21 +38263,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -38349,6 +38279,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -39689,21 +39629,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -39717,6 +39645,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -41154,21 +41092,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -41182,6 +41108,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -42112,21 +42048,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -42140,6 +42064,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -42820,7 +42754,7 @@ }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -43450,21 +43384,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -43478,6 +43400,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -44414,21 +44346,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -44442,6 +44362,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -46057,21 +45987,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -46085,6 +46003,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -46903,7 +46831,7 @@ }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -47377,21 +47305,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -47405,6 +47321,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -48819,21 +48745,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -48847,6 +48761,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -50199,21 +50123,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -50227,6 +50139,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -50971,7 +50893,7 @@ }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -51519,21 +51441,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -51547,6 +51457,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -52887,21 +52807,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -52915,6 +52823,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -54397,21 +54315,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -54425,6 +54331,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -55457,21 +55373,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -55485,6 +55389,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -57242,21 +57156,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -57270,6 +57172,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -58200,21 +58112,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -58228,6 +58128,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -58908,7 +58818,7 @@ }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -59538,21 +59448,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -59566,6 +59464,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -60502,21 +60410,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -60530,6 +60426,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -62302,21 +62208,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -62330,6 +62224,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -63202,21 +63106,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -63230,6 +63122,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -64102,21 +64004,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -64130,6 +64020,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -64691,21 +64591,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -64719,6 +64607,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -66068,21 +65966,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -66096,6 +65982,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -67828,21 +67724,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -67856,6 +67740,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -69195,21 +69089,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -69223,6 +69105,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -70563,21 +70455,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -70591,6 +70471,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -71614,21 +71504,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -71642,6 +71520,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -72991,21 +72879,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -73019,6 +72895,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -75193,21 +75079,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -75221,6 +75095,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -76584,21 +76468,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -76612,6 +76484,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -78135,21 +78017,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -78163,6 +78033,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -78907,7 +78787,7 @@ }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -79455,21 +79335,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -79483,6 +79351,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -80823,21 +80701,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -80851,6 +80717,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -82219,21 +82095,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -82247,6 +82111,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -82991,7 +82865,7 @@ }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -83539,21 +83413,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -83567,6 +83429,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -84907,21 +84779,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -84935,6 +84795,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -86329,21 +86199,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -86357,6 +86215,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -87649,21 +87517,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -87677,6 +87533,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -88656,21 +88522,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -88684,6 +88538,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -90009,8 +89873,6 @@ { "type": "object", "required": [ - "end", - "start", "type", "value" ], @@ -90021,16 +89883,6 @@ "TagDeclarator" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -90044,6 +89896,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -90945,21 +90807,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -90973,6 +90823,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -91650,21 +91510,9 @@ "type": "object", "required": [ "body", - "end", - "params", - "start" + "params" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "params": { "type": "array", "items": { @@ -91684,6 +91532,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -91723,21 +91581,9 @@ "Identifier": { "type": "object", "required": [ - "end", - "name", - "start" + "name" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "name": { "type": "string" }, @@ -91751,18 +91597,7 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - "Program": { - "description": "A KCL program top level, or function body.", - "type": "object", - "required": [ - "body", - "end", - "start" - ], - "properties": { + }, "start": { "type": "integer", "format": "uint", @@ -91772,7 +91607,16 @@ "type": "integer", "format": "uint", "minimum": 0.0 - }, + } + } + }, + "Program": { + "description": "A KCL program top level, or function body.", + "type": "object", + "required": [ + "body" + ], + "properties": { "body": { "type": "array", "items": { @@ -91792,6 +91636,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -91800,11 +91654,9 @@ { "type": "object", "required": [ - "end", "items", "path", "raw_path", - "start", "type" ], "properties": { @@ -91814,16 +91666,6 @@ "ImportStatement" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "items": { "type": "array", "items": { @@ -91846,23 +91688,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "expression", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ExpressionStatement" - ] }, "start": { "type": "integer", @@ -91873,6 +91698,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "expression", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ExpressionStatement" + ] }, "expression": { "$ref": "#/components/schemas/Expr" @@ -91887,24 +91727,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "declarations", - "end", - "kind", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "VariableDeclaration" - ] }, "start": { "type": "integer", @@ -91915,6 +91737,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "declarations", + "kind", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "VariableDeclaration" + ] }, "declarations": { "type": "array", @@ -91938,23 +91776,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ReturnStatement" - ] }, "start": { "type": "integer", @@ -91965,6 +91786,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "argument", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ReturnStatement" + ] }, "argument": { "$ref": "#/components/schemas/Expr" @@ -91979,6 +91815,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -91987,9 +91833,7 @@ "ImportItem": { "type": "object", "required": [ - "end", - "name", - "start" + "name" ], "properties": { "name": { @@ -92009,16 +91853,6 @@ ], "nullable": true }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "digest": { "type": "array", "items": { @@ -92029,6 +91863,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -92038,9 +91882,7 @@ { "type": "object", "required": [ - "end", "raw", - "start", "type", "value" ], @@ -92051,16 +91893,6 @@ "Literal" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "$ref": "#/components/schemas/LiteralValue" }, @@ -92077,23 +91909,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] }, "start": { "type": "integer", @@ -92104,6 +91919,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Identifier" + ] }, "name": { "type": "string" @@ -92118,23 +91948,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TagDeclarator" - ] }, "start": { "type": "integer", @@ -92145,6 +91958,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagDeclarator" + ] }, "value": { "type": "string" @@ -92159,25 +91987,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] }, "start": { "type": "integer", @@ -92188,6 +91997,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "left", + "operator", + "right", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "BinaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/BinaryOperator" @@ -92208,24 +92034,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "params", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "FunctionExpression" - ] }, "start": { "type": "integer", @@ -92236,6 +92044,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "body", + "params", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "FunctionExpression" + ] }, "params": { "type": "array", @@ -92256,25 +92080,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] }, "start": { "type": "integer", @@ -92285,6 +92090,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "arguments", + "callee", + "optional", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "CallExpression" + ] }, "callee": { "$ref": "#/components/schemas/Identifier" @@ -92308,23 +92130,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeExpression" - ] }, "start": { "type": "integer", @@ -92335,6 +92140,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "body", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "PipeExpression" + ] }, "body": { "type": "array", @@ -92355,22 +92175,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeSubstitution" - ] }, "start": { "type": "integer", @@ -92381,6 +92185,20 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "PipeSubstitution" + ] }, "digest": { "type": "array", @@ -92392,23 +92210,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "elements", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayExpression" - ] }, "start": { "type": "integer", @@ -92419,6 +92220,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "elements", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ArrayExpression" + ] }, "elements": { "type": "array", @@ -92439,25 +92255,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "endElement", - "endInclusive", - "start", - "startElement", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayRangeExpression" - ] }, "start": { "type": "integer", @@ -92468,6 +92265,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "endElement", + "endInclusive", + "startElement", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ArrayRangeExpression" + ] }, "startElement": { "$ref": "#/components/schemas/Expr" @@ -92489,23 +92303,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "properties", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ObjectExpression" - ] }, "start": { "type": "integer", @@ -92516,6 +92313,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "properties", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ObjectExpression" + ] }, "properties": { "type": "array", @@ -92536,25 +92348,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] }, "start": { "type": "integer", @@ -92565,6 +92358,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "computed", + "object", + "property", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "MemberExpression" + ] }, "object": { "$ref": "#/components/schemas/MemberObject" @@ -92585,24 +92395,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] }, "start": { "type": "integer", @@ -92613,6 +92405,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "argument", + "operator", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "UnaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/UnaryOperator" @@ -92630,26 +92438,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] }, "start": { "type": "integer", @@ -92660,6 +92448,24 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "cond", + "else_ifs", + "final_else", + "then_val", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "IfExpression" + ] }, "cond": { "$ref": "#/components/schemas/Expr" @@ -92686,6 +92492,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -92829,9 +92645,7 @@ { "type": "object", "required": [ - "end", "raw", - "start", "type", "value" ], @@ -92842,16 +92656,6 @@ "Literal" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "$ref": "#/components/schemas/LiteralValue" }, @@ -92868,23 +92672,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] }, "start": { "type": "integer", @@ -92895,6 +92682,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Identifier" + ] }, "name": { "type": "string" @@ -92909,25 +92711,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] }, "start": { "type": "integer", @@ -92938,6 +92721,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "left", + "operator", + "right", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "BinaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/BinaryOperator" @@ -92958,25 +92758,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] }, "start": { "type": "integer", @@ -92987,6 +92768,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "arguments", + "callee", + "optional", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "CallExpression" + ] }, "callee": { "$ref": "#/components/schemas/Identifier" @@ -93010,24 +92808,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] }, "start": { "type": "integer", @@ -93038,6 +92818,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "argument", + "operator", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "UnaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/UnaryOperator" @@ -93055,25 +92851,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] }, "start": { "type": "integer", @@ -93084,6 +92861,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "computed", + "object", + "property", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "MemberExpression" + ] }, "object": { "$ref": "#/components/schemas/MemberObject" @@ -93104,26 +92898,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] }, "start": { "type": "integer", @@ -93134,6 +92908,24 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "cond", + "else_ifs", + "final_else", + "then_val", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "IfExpression" + ] }, "cond": { "$ref": "#/components/schemas/Expr" @@ -93160,6 +92952,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -93189,10 +92991,8 @@ "type": "object", "required": [ "computed", - "end", "object", "property", - "start", "type" ], "properties": { @@ -93202,16 +93002,6 @@ "MemberExpression" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "object": { "$ref": "#/components/schemas/MemberObject" }, @@ -93231,23 +93021,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] }, "start": { "type": "integer", @@ -93258,6 +93031,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Identifier" + ] }, "name": { "type": "string" @@ -93272,6 +93060,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -93282,9 +93080,7 @@ { "type": "object", "required": [ - "end", "name", - "start", "type" ], "properties": { @@ -93294,16 +93090,6 @@ "Identifier" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "name": { "type": "string" }, @@ -93317,24 +93103,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "raw", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Literal" - ] }, "start": { "type": "integer", @@ -93345,6 +93113,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "raw", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Literal" + ] }, "value": { "$ref": "#/components/schemas/LiteralValue" @@ -93362,6 +93146,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -93371,21 +93165,9 @@ "type": "object", "required": [ "cond", - "end", - "start", "then_val" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "cond": { "$ref": "#/components/schemas/Expr" }, @@ -93402,6 +93184,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -93409,7 +93201,7 @@ "type": "object", "required": [ "nonCodeNodes", - "start" + "startNodes" ], "properties": { "nonCodeNodes": { @@ -93421,7 +93213,7 @@ } } }, - "start": { + "startNodes": { "type": "array", "items": { "$ref": "#/components/schemas/NonCodeNode" @@ -93443,21 +93235,9 @@ "NonCodeNode": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "$ref": "#/components/schemas/NonCodeValue" }, @@ -93471,6 +93251,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -93601,22 +93391,10 @@ "ObjectProperty": { "type": "object", "required": [ - "end", "key", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "key": { "$ref": "#/components/schemas/Identifier" }, @@ -93633,18 +93411,7 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - "VariableDeclarator": { - "type": "object", - "required": [ - "end", - "id", - "init", - "start" - ], - "properties": { + }, "start": { "type": "integer", "format": "uint", @@ -93654,7 +93421,16 @@ "type": "integer", "format": "uint", "minimum": 0.0 - }, + } + } + }, + "VariableDeclarator": { + "type": "object", + "required": [ + "id", + "init" + ], + "properties": { "id": { "description": "The identifier of the variable.", "allOf": [ @@ -93681,6 +93457,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -93723,7 +93509,9 @@ } }, "currentEnv": { - "$ref": "#/components/schemas/EnvironmentRef" + "type": "integer", + "format": "uint", + "minimum": 0.0 }, "return": { "allOf": [ @@ -93748,20 +93536,12 @@ } }, "parent": { - "allOf": [ - { - "$ref": "#/components/schemas/EnvironmentRef" - } - ], + "type": "integer", + "format": "uint", + "minimum": 0.0, "nullable": true } } - }, - "EnvironmentRef": { - "description": "An index pointing to an environment.", - "type": "integer", - "format": "uint", - "minimum": 0.0 } } }, @@ -93837,8 +93617,6 @@ { "type": "object", "required": [ - "end", - "start", "type", "value" ], @@ -93849,16 +93627,6 @@ "TagDeclarator" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -93872,6 +93640,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -94773,21 +94551,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -94801,6 +94567,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -95478,21 +95254,9 @@ "type": "object", "required": [ "body", - "end", - "params", - "start" + "params" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "params": { "type": "array", "items": { @@ -95512,6 +95276,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -95551,21 +95325,9 @@ "Identifier": { "type": "object", "required": [ - "end", - "name", - "start" + "name" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "name": { "type": "string" }, @@ -95579,18 +95341,7 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - "Program": { - "description": "A KCL program top level, or function body.", - "type": "object", - "required": [ - "body", - "end", - "start" - ], - "properties": { + }, "start": { "type": "integer", "format": "uint", @@ -95600,7 +95351,16 @@ "type": "integer", "format": "uint", "minimum": 0.0 - }, + } + } + }, + "Program": { + "description": "A KCL program top level, or function body.", + "type": "object", + "required": [ + "body" + ], + "properties": { "body": { "type": "array", "items": { @@ -95620,6 +95380,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -95628,11 +95398,9 @@ { "type": "object", "required": [ - "end", "items", "path", "raw_path", - "start", "type" ], "properties": { @@ -95642,16 +95410,6 @@ "ImportStatement" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "items": { "type": "array", "items": { @@ -95674,23 +95432,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "expression", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ExpressionStatement" - ] }, "start": { "type": "integer", @@ -95701,6 +95442,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "expression", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ExpressionStatement" + ] }, "expression": { "$ref": "#/components/schemas/Expr" @@ -95715,24 +95471,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "declarations", - "end", - "kind", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "VariableDeclaration" - ] }, "start": { "type": "integer", @@ -95743,6 +95481,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "declarations", + "kind", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "VariableDeclaration" + ] }, "declarations": { "type": "array", @@ -95766,23 +95520,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ReturnStatement" - ] }, "start": { "type": "integer", @@ -95793,6 +95530,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "argument", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ReturnStatement" + ] }, "argument": { "$ref": "#/components/schemas/Expr" @@ -95807,6 +95559,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -95815,9 +95577,7 @@ "ImportItem": { "type": "object", "required": [ - "end", - "name", - "start" + "name" ], "properties": { "name": { @@ -95837,16 +95597,6 @@ ], "nullable": true }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "digest": { "type": "array", "items": { @@ -95857,6 +95607,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -95866,9 +95626,7 @@ { "type": "object", "required": [ - "end", "raw", - "start", "type", "value" ], @@ -95879,16 +95637,6 @@ "Literal" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "$ref": "#/components/schemas/LiteralValue" }, @@ -95905,23 +95653,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] }, "start": { "type": "integer", @@ -95932,6 +95663,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Identifier" + ] }, "name": { "type": "string" @@ -95946,23 +95692,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TagDeclarator" - ] }, "start": { "type": "integer", @@ -95973,6 +95702,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagDeclarator" + ] }, "value": { "type": "string" @@ -95987,25 +95731,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] }, "start": { "type": "integer", @@ -96016,6 +95741,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "left", + "operator", + "right", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "BinaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/BinaryOperator" @@ -96036,24 +95778,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "params", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "FunctionExpression" - ] }, "start": { "type": "integer", @@ -96064,6 +95788,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "body", + "params", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "FunctionExpression" + ] }, "params": { "type": "array", @@ -96084,25 +95824,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] }, "start": { "type": "integer", @@ -96113,6 +95834,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "arguments", + "callee", + "optional", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "CallExpression" + ] }, "callee": { "$ref": "#/components/schemas/Identifier" @@ -96136,23 +95874,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeExpression" - ] }, "start": { "type": "integer", @@ -96163,6 +95884,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "body", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "PipeExpression" + ] }, "body": { "type": "array", @@ -96183,22 +95919,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeSubstitution" - ] }, "start": { "type": "integer", @@ -96209,6 +95929,20 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "PipeSubstitution" + ] }, "digest": { "type": "array", @@ -96220,23 +95954,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "elements", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayExpression" - ] }, "start": { "type": "integer", @@ -96247,6 +95964,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "elements", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ArrayExpression" + ] }, "elements": { "type": "array", @@ -96267,25 +95999,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "endElement", - "endInclusive", - "start", - "startElement", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayRangeExpression" - ] }, "start": { "type": "integer", @@ -96296,6 +96009,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "endElement", + "endInclusive", + "startElement", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ArrayRangeExpression" + ] }, "startElement": { "$ref": "#/components/schemas/Expr" @@ -96317,23 +96047,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "properties", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ObjectExpression" - ] }, "start": { "type": "integer", @@ -96344,6 +96057,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "properties", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ObjectExpression" + ] }, "properties": { "type": "array", @@ -96364,25 +96092,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] }, "start": { "type": "integer", @@ -96393,6 +96102,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "computed", + "object", + "property", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "MemberExpression" + ] }, "object": { "$ref": "#/components/schemas/MemberObject" @@ -96413,24 +96139,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] }, "start": { "type": "integer", @@ -96441,6 +96149,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "argument", + "operator", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "UnaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/UnaryOperator" @@ -96458,26 +96182,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] }, "start": { "type": "integer", @@ -96488,6 +96192,24 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "cond", + "else_ifs", + "final_else", + "then_val", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "IfExpression" + ] }, "cond": { "$ref": "#/components/schemas/Expr" @@ -96514,6 +96236,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -96657,9 +96389,7 @@ { "type": "object", "required": [ - "end", "raw", - "start", "type", "value" ], @@ -96670,16 +96400,6 @@ "Literal" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "$ref": "#/components/schemas/LiteralValue" }, @@ -96696,23 +96416,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] }, "start": { "type": "integer", @@ -96723,6 +96426,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Identifier" + ] }, "name": { "type": "string" @@ -96737,25 +96455,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] }, "start": { "type": "integer", @@ -96766,6 +96465,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "left", + "operator", + "right", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "BinaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/BinaryOperator" @@ -96786,25 +96502,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] }, "start": { "type": "integer", @@ -96815,6 +96512,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "arguments", + "callee", + "optional", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "CallExpression" + ] }, "callee": { "$ref": "#/components/schemas/Identifier" @@ -96838,24 +96552,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] }, "start": { "type": "integer", @@ -96866,6 +96562,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "argument", + "operator", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "UnaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/UnaryOperator" @@ -96883,25 +96595,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] }, "start": { "type": "integer", @@ -96912,6 +96605,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "computed", + "object", + "property", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "MemberExpression" + ] }, "object": { "$ref": "#/components/schemas/MemberObject" @@ -96932,26 +96642,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] }, "start": { "type": "integer", @@ -96962,6 +96652,24 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "cond", + "else_ifs", + "final_else", + "then_val", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "IfExpression" + ] }, "cond": { "$ref": "#/components/schemas/Expr" @@ -96988,6 +96696,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -97017,10 +96735,8 @@ "type": "object", "required": [ "computed", - "end", "object", "property", - "start", "type" ], "properties": { @@ -97030,16 +96746,6 @@ "MemberExpression" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "object": { "$ref": "#/components/schemas/MemberObject" }, @@ -97059,23 +96765,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] }, "start": { "type": "integer", @@ -97086,6 +96775,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Identifier" + ] }, "name": { "type": "string" @@ -97100,6 +96804,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -97110,9 +96824,7 @@ { "type": "object", "required": [ - "end", "name", - "start", "type" ], "properties": { @@ -97122,16 +96834,6 @@ "Identifier" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "name": { "type": "string" }, @@ -97145,24 +96847,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "raw", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Literal" - ] }, "start": { "type": "integer", @@ -97173,6 +96857,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "raw", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Literal" + ] }, "value": { "$ref": "#/components/schemas/LiteralValue" @@ -97190,6 +96890,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -97199,21 +96909,9 @@ "type": "object", "required": [ "cond", - "end", - "start", "then_val" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "cond": { "$ref": "#/components/schemas/Expr" }, @@ -97230,6 +96928,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -97237,7 +96945,7 @@ "type": "object", "required": [ "nonCodeNodes", - "start" + "startNodes" ], "properties": { "nonCodeNodes": { @@ -97249,7 +96957,7 @@ } } }, - "start": { + "startNodes": { "type": "array", "items": { "$ref": "#/components/schemas/NonCodeNode" @@ -97271,21 +96979,9 @@ "NonCodeNode": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "$ref": "#/components/schemas/NonCodeValue" }, @@ -97299,6 +96995,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -97429,22 +97135,10 @@ "ObjectProperty": { "type": "object", "required": [ - "end", "key", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "key": { "$ref": "#/components/schemas/Identifier" }, @@ -97461,18 +97155,7 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - "VariableDeclarator": { - "type": "object", - "required": [ - "end", - "id", - "init", - "start" - ], - "properties": { + }, "start": { "type": "integer", "format": "uint", @@ -97482,7 +97165,16 @@ "type": "integer", "format": "uint", "minimum": 0.0 - }, + } + } + }, + "VariableDeclarator": { + "type": "object", + "required": [ + "id", + "init" + ], + "properties": { "id": { "description": "The identifier of the variable.", "allOf": [ @@ -97509,6 +97201,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -97551,7 +97253,9 @@ } }, "currentEnv": { - "$ref": "#/components/schemas/EnvironmentRef" + "type": "integer", + "format": "uint", + "minimum": 0.0 }, "return": { "allOf": [ @@ -97576,20 +97280,12 @@ } }, "parent": { - "allOf": [ - { - "$ref": "#/components/schemas/EnvironmentRef" - } - ], + "type": "integer", + "format": "uint", + "minimum": 0.0, "nullable": true } } - }, - "EnvironmentRef": { - "description": "An index pointing to an environment.", - "type": "integer", - "format": "uint", - "minimum": 0.0 } } }, @@ -97669,8 +97365,6 @@ { "type": "object", "required": [ - "end", - "start", "type", "value" ], @@ -97681,16 +97375,6 @@ "TagDeclarator" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -97704,6 +97388,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -98605,21 +98299,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -98633,6 +98315,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -99310,21 +99002,9 @@ "type": "object", "required": [ "body", - "end", - "params", - "start" + "params" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "params": { "type": "array", "items": { @@ -99344,6 +99024,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -99383,21 +99073,9 @@ "Identifier": { "type": "object", "required": [ - "end", - "name", - "start" + "name" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "name": { "type": "string" }, @@ -99411,18 +99089,7 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - "Program": { - "description": "A KCL program top level, or function body.", - "type": "object", - "required": [ - "body", - "end", - "start" - ], - "properties": { + }, "start": { "type": "integer", "format": "uint", @@ -99432,7 +99099,16 @@ "type": "integer", "format": "uint", "minimum": 0.0 - }, + } + } + }, + "Program": { + "description": "A KCL program top level, or function body.", + "type": "object", + "required": [ + "body" + ], + "properties": { "body": { "type": "array", "items": { @@ -99452,6 +99128,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -99460,11 +99146,9 @@ { "type": "object", "required": [ - "end", "items", "path", "raw_path", - "start", "type" ], "properties": { @@ -99474,16 +99158,6 @@ "ImportStatement" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "items": { "type": "array", "items": { @@ -99506,23 +99180,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "expression", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ExpressionStatement" - ] }, "start": { "type": "integer", @@ -99533,6 +99190,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "expression", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ExpressionStatement" + ] }, "expression": { "$ref": "#/components/schemas/Expr" @@ -99547,24 +99219,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "declarations", - "end", - "kind", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "VariableDeclaration" - ] }, "start": { "type": "integer", @@ -99575,6 +99229,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "declarations", + "kind", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "VariableDeclaration" + ] }, "declarations": { "type": "array", @@ -99598,23 +99268,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ReturnStatement" - ] }, "start": { "type": "integer", @@ -99625,6 +99278,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "argument", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ReturnStatement" + ] }, "argument": { "$ref": "#/components/schemas/Expr" @@ -99639,6 +99307,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -99647,9 +99325,7 @@ "ImportItem": { "type": "object", "required": [ - "end", - "name", - "start" + "name" ], "properties": { "name": { @@ -99669,16 +99345,6 @@ ], "nullable": true }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "digest": { "type": "array", "items": { @@ -99689,6 +99355,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -99698,9 +99374,7 @@ { "type": "object", "required": [ - "end", "raw", - "start", "type", "value" ], @@ -99711,16 +99385,6 @@ "Literal" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "$ref": "#/components/schemas/LiteralValue" }, @@ -99737,23 +99401,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] }, "start": { "type": "integer", @@ -99764,6 +99411,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Identifier" + ] }, "name": { "type": "string" @@ -99778,23 +99440,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TagDeclarator" - ] }, "start": { "type": "integer", @@ -99805,6 +99450,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagDeclarator" + ] }, "value": { "type": "string" @@ -99819,25 +99479,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] }, "start": { "type": "integer", @@ -99848,6 +99489,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "left", + "operator", + "right", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "BinaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/BinaryOperator" @@ -99868,24 +99526,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "params", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "FunctionExpression" - ] }, "start": { "type": "integer", @@ -99896,6 +99536,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "body", + "params", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "FunctionExpression" + ] }, "params": { "type": "array", @@ -99916,25 +99572,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] }, "start": { "type": "integer", @@ -99945,6 +99582,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "arguments", + "callee", + "optional", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "CallExpression" + ] }, "callee": { "$ref": "#/components/schemas/Identifier" @@ -99968,23 +99622,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeExpression" - ] }, "start": { "type": "integer", @@ -99995,6 +99632,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "body", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "PipeExpression" + ] }, "body": { "type": "array", @@ -100015,22 +99667,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeSubstitution" - ] }, "start": { "type": "integer", @@ -100041,6 +99677,20 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "PipeSubstitution" + ] }, "digest": { "type": "array", @@ -100052,23 +99702,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "elements", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayExpression" - ] }, "start": { "type": "integer", @@ -100079,6 +99712,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "elements", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ArrayExpression" + ] }, "elements": { "type": "array", @@ -100099,25 +99747,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "endElement", - "endInclusive", - "start", - "startElement", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayRangeExpression" - ] }, "start": { "type": "integer", @@ -100128,6 +99757,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "endElement", + "endInclusive", + "startElement", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ArrayRangeExpression" + ] }, "startElement": { "$ref": "#/components/schemas/Expr" @@ -100149,23 +99795,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "properties", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ObjectExpression" - ] }, "start": { "type": "integer", @@ -100176,6 +99805,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "properties", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ObjectExpression" + ] }, "properties": { "type": "array", @@ -100196,25 +99840,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] }, "start": { "type": "integer", @@ -100225,6 +99850,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "computed", + "object", + "property", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "MemberExpression" + ] }, "object": { "$ref": "#/components/schemas/MemberObject" @@ -100245,24 +99887,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] }, "start": { "type": "integer", @@ -100273,6 +99897,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "argument", + "operator", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "UnaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/UnaryOperator" @@ -100290,26 +99930,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] }, "start": { "type": "integer", @@ -100320,6 +99940,24 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "cond", + "else_ifs", + "final_else", + "then_val", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "IfExpression" + ] }, "cond": { "$ref": "#/components/schemas/Expr" @@ -100346,6 +99984,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -100489,9 +100137,7 @@ { "type": "object", "required": [ - "end", "raw", - "start", "type", "value" ], @@ -100502,16 +100148,6 @@ "Literal" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "$ref": "#/components/schemas/LiteralValue" }, @@ -100528,23 +100164,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] }, "start": { "type": "integer", @@ -100555,6 +100174,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Identifier" + ] }, "name": { "type": "string" @@ -100569,25 +100203,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] }, "start": { "type": "integer", @@ -100598,6 +100213,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "left", + "operator", + "right", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "BinaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/BinaryOperator" @@ -100618,25 +100250,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] }, "start": { "type": "integer", @@ -100647,6 +100260,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "arguments", + "callee", + "optional", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "CallExpression" + ] }, "callee": { "$ref": "#/components/schemas/Identifier" @@ -100670,24 +100300,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] }, "start": { "type": "integer", @@ -100698,6 +100310,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "argument", + "operator", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "UnaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/UnaryOperator" @@ -100715,25 +100343,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] }, "start": { "type": "integer", @@ -100744,6 +100353,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "computed", + "object", + "property", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "MemberExpression" + ] }, "object": { "$ref": "#/components/schemas/MemberObject" @@ -100764,26 +100390,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] }, "start": { "type": "integer", @@ -100794,6 +100400,24 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "cond", + "else_ifs", + "final_else", + "then_val", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "IfExpression" + ] }, "cond": { "$ref": "#/components/schemas/Expr" @@ -100820,6 +100444,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -100849,10 +100483,8 @@ "type": "object", "required": [ "computed", - "end", "object", "property", - "start", "type" ], "properties": { @@ -100862,16 +100494,6 @@ "MemberExpression" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "object": { "$ref": "#/components/schemas/MemberObject" }, @@ -100891,23 +100513,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] }, "start": { "type": "integer", @@ -100918,6 +100523,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Identifier" + ] }, "name": { "type": "string" @@ -100932,6 +100552,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -100942,9 +100572,7 @@ { "type": "object", "required": [ - "end", "name", - "start", "type" ], "properties": { @@ -100954,16 +100582,6 @@ "Identifier" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "name": { "type": "string" }, @@ -100977,24 +100595,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "raw", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Literal" - ] }, "start": { "type": "integer", @@ -101005,6 +100605,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "raw", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Literal" + ] }, "value": { "$ref": "#/components/schemas/LiteralValue" @@ -101022,6 +100638,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -101031,21 +100657,9 @@ "type": "object", "required": [ "cond", - "end", - "start", "then_val" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "cond": { "$ref": "#/components/schemas/Expr" }, @@ -101062,6 +100676,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -101069,7 +100693,7 @@ "type": "object", "required": [ "nonCodeNodes", - "start" + "startNodes" ], "properties": { "nonCodeNodes": { @@ -101081,7 +100705,7 @@ } } }, - "start": { + "startNodes": { "type": "array", "items": { "$ref": "#/components/schemas/NonCodeNode" @@ -101103,21 +100727,9 @@ "NonCodeNode": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "$ref": "#/components/schemas/NonCodeValue" }, @@ -101131,6 +100743,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -101261,22 +100883,10 @@ "ObjectProperty": { "type": "object", "required": [ - "end", "key", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "key": { "$ref": "#/components/schemas/Identifier" }, @@ -101293,18 +100903,7 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - "VariableDeclarator": { - "type": "object", - "required": [ - "end", - "id", - "init", - "start" - ], - "properties": { + }, "start": { "type": "integer", "format": "uint", @@ -101314,7 +100913,16 @@ "type": "integer", "format": "uint", "minimum": 0.0 - }, + } + } + }, + "VariableDeclarator": { + "type": "object", + "required": [ + "id", + "init" + ], + "properties": { "id": { "description": "The identifier of the variable.", "allOf": [ @@ -101341,6 +100949,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -101383,7 +101001,9 @@ } }, "currentEnv": { - "$ref": "#/components/schemas/EnvironmentRef" + "type": "integer", + "format": "uint", + "minimum": 0.0 }, "return": { "allOf": [ @@ -101408,20 +101028,12 @@ } }, "parent": { - "allOf": [ - { - "$ref": "#/components/schemas/EnvironmentRef" - } - ], + "type": "integer", + "format": "uint", + "minimum": 0.0, "nullable": true } } - }, - "EnvironmentRef": { - "description": "An index pointing to an environment.", - "type": "integer", - "format": "uint", - "minimum": 0.0 } } }, @@ -102253,21 +101865,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -102281,6 +101881,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -103326,21 +102936,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -103354,6 +102952,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -104636,21 +104244,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -104664,6 +104260,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -106290,21 +105896,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -106318,6 +105912,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -107664,21 +107268,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -107692,6 +107284,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -108749,21 +108351,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -108777,6 +108367,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -110132,21 +109732,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -110160,6 +109748,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -111881,21 +111479,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -111909,6 +111495,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -113255,21 +112851,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -113283,6 +112867,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -114324,21 +113918,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -114352,6 +113934,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -115707,21 +115299,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -115735,6 +115315,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -117085,21 +116675,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -117113,6 +116691,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -118468,21 +118056,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -118496,6 +118072,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -120143,21 +119729,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -120171,6 +119745,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -120989,7 +120573,7 @@ }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -121463,21 +121047,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -121491,6 +121063,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -122905,21 +122487,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -122933,6 +122503,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -124333,21 +123913,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -124361,6 +123929,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -125729,21 +125307,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -125757,6 +125323,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -127120,21 +126696,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -127148,6 +126712,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -127987,8 +127561,6 @@ { "type": "object", "required": [ - "end", - "start", "type", "value" ], @@ -127999,16 +127571,6 @@ "TagDeclarator" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -128022,6 +127584,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -128923,21 +128495,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -128951,6 +128511,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -129628,21 +129198,9 @@ "type": "object", "required": [ "body", - "end", - "params", - "start" + "params" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "params": { "type": "array", "items": { @@ -129662,6 +129220,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -129701,21 +129269,9 @@ "Identifier": { "type": "object", "required": [ - "end", - "name", - "start" + "name" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "name": { "type": "string" }, @@ -129729,18 +129285,7 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - "Program": { - "description": "A KCL program top level, or function body.", - "type": "object", - "required": [ - "body", - "end", - "start" - ], - "properties": { + }, "start": { "type": "integer", "format": "uint", @@ -129750,7 +129295,16 @@ "type": "integer", "format": "uint", "minimum": 0.0 - }, + } + } + }, + "Program": { + "description": "A KCL program top level, or function body.", + "type": "object", + "required": [ + "body" + ], + "properties": { "body": { "type": "array", "items": { @@ -129770,6 +129324,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -129778,11 +129342,9 @@ { "type": "object", "required": [ - "end", "items", "path", "raw_path", - "start", "type" ], "properties": { @@ -129792,16 +129354,6 @@ "ImportStatement" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "items": { "type": "array", "items": { @@ -129824,23 +129376,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "expression", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ExpressionStatement" - ] }, "start": { "type": "integer", @@ -129851,6 +129386,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "expression", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ExpressionStatement" + ] }, "expression": { "$ref": "#/components/schemas/Expr" @@ -129865,24 +129415,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "declarations", - "end", - "kind", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "VariableDeclaration" - ] }, "start": { "type": "integer", @@ -129893,6 +129425,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "declarations", + "kind", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "VariableDeclaration" + ] }, "declarations": { "type": "array", @@ -129916,23 +129464,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ReturnStatement" - ] }, "start": { "type": "integer", @@ -129943,6 +129474,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "argument", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ReturnStatement" + ] }, "argument": { "$ref": "#/components/schemas/Expr" @@ -129957,6 +129503,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -129965,9 +129521,7 @@ "ImportItem": { "type": "object", "required": [ - "end", - "name", - "start" + "name" ], "properties": { "name": { @@ -129987,16 +129541,6 @@ ], "nullable": true }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "digest": { "type": "array", "items": { @@ -130007,6 +129551,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -130016,9 +129570,7 @@ { "type": "object", "required": [ - "end", "raw", - "start", "type", "value" ], @@ -130029,16 +129581,6 @@ "Literal" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "$ref": "#/components/schemas/LiteralValue" }, @@ -130055,23 +129597,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] }, "start": { "type": "integer", @@ -130082,6 +129607,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Identifier" + ] }, "name": { "type": "string" @@ -130096,23 +129636,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TagDeclarator" - ] }, "start": { "type": "integer", @@ -130123,6 +129646,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagDeclarator" + ] }, "value": { "type": "string" @@ -130137,25 +129675,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] }, "start": { "type": "integer", @@ -130166,6 +129685,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "left", + "operator", + "right", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "BinaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/BinaryOperator" @@ -130186,24 +129722,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "params", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "FunctionExpression" - ] }, "start": { "type": "integer", @@ -130214,6 +129732,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "body", + "params", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "FunctionExpression" + ] }, "params": { "type": "array", @@ -130234,25 +129768,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] }, "start": { "type": "integer", @@ -130263,6 +129778,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "arguments", + "callee", + "optional", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "CallExpression" + ] }, "callee": { "$ref": "#/components/schemas/Identifier" @@ -130286,23 +129818,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeExpression" - ] }, "start": { "type": "integer", @@ -130313,6 +129828,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "body", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "PipeExpression" + ] }, "body": { "type": "array", @@ -130333,22 +129863,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeSubstitution" - ] }, "start": { "type": "integer", @@ -130359,6 +129873,20 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "PipeSubstitution" + ] }, "digest": { "type": "array", @@ -130370,23 +129898,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "elements", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayExpression" - ] }, "start": { "type": "integer", @@ -130397,6 +129908,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "elements", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ArrayExpression" + ] }, "elements": { "type": "array", @@ -130417,25 +129943,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "endElement", - "endInclusive", - "start", - "startElement", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayRangeExpression" - ] }, "start": { "type": "integer", @@ -130446,6 +129953,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "endElement", + "endInclusive", + "startElement", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ArrayRangeExpression" + ] }, "startElement": { "$ref": "#/components/schemas/Expr" @@ -130467,23 +129991,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "properties", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ObjectExpression" - ] }, "start": { "type": "integer", @@ -130494,6 +130001,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "properties", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ObjectExpression" + ] }, "properties": { "type": "array", @@ -130514,25 +130036,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] }, "start": { "type": "integer", @@ -130543,6 +130046,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "computed", + "object", + "property", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "MemberExpression" + ] }, "object": { "$ref": "#/components/schemas/MemberObject" @@ -130563,24 +130083,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] }, "start": { "type": "integer", @@ -130591,6 +130093,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "argument", + "operator", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "UnaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/UnaryOperator" @@ -130608,26 +130126,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] }, "start": { "type": "integer", @@ -130638,6 +130136,24 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "cond", + "else_ifs", + "final_else", + "then_val", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "IfExpression" + ] }, "cond": { "$ref": "#/components/schemas/Expr" @@ -130664,6 +130180,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -130807,9 +130333,7 @@ { "type": "object", "required": [ - "end", "raw", - "start", "type", "value" ], @@ -130820,16 +130344,6 @@ "Literal" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "$ref": "#/components/schemas/LiteralValue" }, @@ -130846,23 +130360,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] }, "start": { "type": "integer", @@ -130873,6 +130370,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Identifier" + ] }, "name": { "type": "string" @@ -130887,25 +130399,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] }, "start": { "type": "integer", @@ -130916,6 +130409,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "left", + "operator", + "right", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "BinaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/BinaryOperator" @@ -130936,25 +130446,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] }, "start": { "type": "integer", @@ -130965,6 +130456,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "arguments", + "callee", + "optional", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "CallExpression" + ] }, "callee": { "$ref": "#/components/schemas/Identifier" @@ -130988,24 +130496,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] }, "start": { "type": "integer", @@ -131016,6 +130506,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "argument", + "operator", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "UnaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/UnaryOperator" @@ -131033,25 +130539,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] }, "start": { "type": "integer", @@ -131062,6 +130549,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "computed", + "object", + "property", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "MemberExpression" + ] }, "object": { "$ref": "#/components/schemas/MemberObject" @@ -131082,26 +130586,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] }, "start": { "type": "integer", @@ -131112,6 +130596,24 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "cond", + "else_ifs", + "final_else", + "then_val", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "IfExpression" + ] }, "cond": { "$ref": "#/components/schemas/Expr" @@ -131138,6 +130640,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -131167,10 +130679,8 @@ "type": "object", "required": [ "computed", - "end", "object", "property", - "start", "type" ], "properties": { @@ -131180,16 +130690,6 @@ "MemberExpression" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "object": { "$ref": "#/components/schemas/MemberObject" }, @@ -131209,23 +130709,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] }, "start": { "type": "integer", @@ -131236,6 +130719,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Identifier" + ] }, "name": { "type": "string" @@ -131250,6 +130748,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -131260,9 +130768,7 @@ { "type": "object", "required": [ - "end", "name", - "start", "type" ], "properties": { @@ -131272,16 +130778,6 @@ "Identifier" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "name": { "type": "string" }, @@ -131295,24 +130791,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "raw", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Literal" - ] }, "start": { "type": "integer", @@ -131323,6 +130801,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "raw", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Literal" + ] }, "value": { "$ref": "#/components/schemas/LiteralValue" @@ -131340,6 +130834,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -131349,21 +130853,9 @@ "type": "object", "required": [ "cond", - "end", - "start", "then_val" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "cond": { "$ref": "#/components/schemas/Expr" }, @@ -131380,6 +130872,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -131387,7 +130889,7 @@ "type": "object", "required": [ "nonCodeNodes", - "start" + "startNodes" ], "properties": { "nonCodeNodes": { @@ -131399,7 +130901,7 @@ } } }, - "start": { + "startNodes": { "type": "array", "items": { "$ref": "#/components/schemas/NonCodeNode" @@ -131421,21 +130923,9 @@ "NonCodeNode": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "$ref": "#/components/schemas/NonCodeValue" }, @@ -131449,6 +130939,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -131579,22 +131079,10 @@ "ObjectProperty": { "type": "object", "required": [ - "end", "key", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "key": { "$ref": "#/components/schemas/Identifier" }, @@ -131611,18 +131099,7 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - "VariableDeclarator": { - "type": "object", - "required": [ - "end", - "id", - "init", - "start" - ], - "properties": { + }, "start": { "type": "integer", "format": "uint", @@ -131632,7 +131109,16 @@ "type": "integer", "format": "uint", "minimum": 0.0 - }, + } + } + }, + "VariableDeclarator": { + "type": "object", + "required": [ + "id", + "init" + ], + "properties": { "id": { "description": "The identifier of the variable.", "allOf": [ @@ -131659,6 +131145,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -131701,7 +131197,9 @@ } }, "currentEnv": { - "$ref": "#/components/schemas/EnvironmentRef" + "type": "integer", + "format": "uint", + "minimum": 0.0 }, "return": { "allOf": [ @@ -131726,20 +131224,12 @@ } }, "parent": { - "allOf": [ - { - "$ref": "#/components/schemas/EnvironmentRef" - } - ], + "type": "integer", + "format": "uint", + "minimum": 0.0, "nullable": true } } - }, - "EnvironmentRef": { - "description": "An index pointing to an environment.", - "type": "integer", - "format": "uint", - "minimum": 0.0 } } }, @@ -131812,8 +131302,6 @@ { "type": "object", "required": [ - "end", - "start", "type", "value" ], @@ -131824,16 +131312,6 @@ "TagDeclarator" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -131847,6 +131325,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -132208,8 +131696,6 @@ { "type": "object", "required": [ - "end", - "start", "type", "value" ], @@ -132220,16 +131706,6 @@ "TagDeclarator" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -132243,6 +131719,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -133144,21 +132630,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -133172,6 +132646,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -133849,21 +133333,9 @@ "type": "object", "required": [ "body", - "end", - "params", - "start" + "params" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "params": { "type": "array", "items": { @@ -133883,6 +133355,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -133922,21 +133404,9 @@ "Identifier": { "type": "object", "required": [ - "end", - "name", - "start" + "name" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "name": { "type": "string" }, @@ -133950,18 +133420,7 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - "Program": { - "description": "A KCL program top level, or function body.", - "type": "object", - "required": [ - "body", - "end", - "start" - ], - "properties": { + }, "start": { "type": "integer", "format": "uint", @@ -133971,7 +133430,16 @@ "type": "integer", "format": "uint", "minimum": 0.0 - }, + } + } + }, + "Program": { + "description": "A KCL program top level, or function body.", + "type": "object", + "required": [ + "body" + ], + "properties": { "body": { "type": "array", "items": { @@ -133991,6 +133459,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -133999,11 +133477,9 @@ { "type": "object", "required": [ - "end", "items", "path", "raw_path", - "start", "type" ], "properties": { @@ -134013,16 +133489,6 @@ "ImportStatement" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "items": { "type": "array", "items": { @@ -134045,23 +133511,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "expression", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ExpressionStatement" - ] }, "start": { "type": "integer", @@ -134072,6 +133521,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "expression", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ExpressionStatement" + ] }, "expression": { "$ref": "#/components/schemas/Expr" @@ -134086,24 +133550,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "declarations", - "end", - "kind", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "VariableDeclaration" - ] }, "start": { "type": "integer", @@ -134114,6 +133560,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "declarations", + "kind", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "VariableDeclaration" + ] }, "declarations": { "type": "array", @@ -134137,23 +133599,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ReturnStatement" - ] }, "start": { "type": "integer", @@ -134164,6 +133609,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "argument", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ReturnStatement" + ] }, "argument": { "$ref": "#/components/schemas/Expr" @@ -134178,6 +133638,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -134186,9 +133656,7 @@ "ImportItem": { "type": "object", "required": [ - "end", - "name", - "start" + "name" ], "properties": { "name": { @@ -134208,16 +133676,6 @@ ], "nullable": true }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "digest": { "type": "array", "items": { @@ -134228,6 +133686,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -134237,9 +133705,7 @@ { "type": "object", "required": [ - "end", "raw", - "start", "type", "value" ], @@ -134250,16 +133716,6 @@ "Literal" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "$ref": "#/components/schemas/LiteralValue" }, @@ -134276,23 +133732,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] }, "start": { "type": "integer", @@ -134303,6 +133742,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Identifier" + ] }, "name": { "type": "string" @@ -134317,23 +133771,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TagDeclarator" - ] }, "start": { "type": "integer", @@ -134344,6 +133781,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagDeclarator" + ] }, "value": { "type": "string" @@ -134358,25 +133810,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] }, "start": { "type": "integer", @@ -134387,6 +133820,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "left", + "operator", + "right", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "BinaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/BinaryOperator" @@ -134407,24 +133857,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "params", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "FunctionExpression" - ] }, "start": { "type": "integer", @@ -134435,6 +133867,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "body", + "params", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "FunctionExpression" + ] }, "params": { "type": "array", @@ -134455,25 +133903,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] }, "start": { "type": "integer", @@ -134484,6 +133913,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "arguments", + "callee", + "optional", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "CallExpression" + ] }, "callee": { "$ref": "#/components/schemas/Identifier" @@ -134507,23 +133953,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeExpression" - ] }, "start": { "type": "integer", @@ -134534,6 +133963,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "body", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "PipeExpression" + ] }, "body": { "type": "array", @@ -134554,22 +133998,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeSubstitution" - ] }, "start": { "type": "integer", @@ -134580,6 +134008,20 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "PipeSubstitution" + ] }, "digest": { "type": "array", @@ -134591,23 +134033,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "elements", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayExpression" - ] }, "start": { "type": "integer", @@ -134618,6 +134043,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "elements", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ArrayExpression" + ] }, "elements": { "type": "array", @@ -134638,25 +134078,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "endElement", - "endInclusive", - "start", - "startElement", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayRangeExpression" - ] }, "start": { "type": "integer", @@ -134667,6 +134088,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "endElement", + "endInclusive", + "startElement", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ArrayRangeExpression" + ] }, "startElement": { "$ref": "#/components/schemas/Expr" @@ -134688,23 +134126,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "properties", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ObjectExpression" - ] }, "start": { "type": "integer", @@ -134715,6 +134136,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "properties", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ObjectExpression" + ] }, "properties": { "type": "array", @@ -134735,25 +134171,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] }, "start": { "type": "integer", @@ -134764,6 +134181,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "computed", + "object", + "property", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "MemberExpression" + ] }, "object": { "$ref": "#/components/schemas/MemberObject" @@ -134784,24 +134218,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] }, "start": { "type": "integer", @@ -134812,6 +134228,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "argument", + "operator", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "UnaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/UnaryOperator" @@ -134829,26 +134261,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] }, "start": { "type": "integer", @@ -134859,6 +134271,24 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "cond", + "else_ifs", + "final_else", + "then_val", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "IfExpression" + ] }, "cond": { "$ref": "#/components/schemas/Expr" @@ -134885,6 +134315,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -135028,9 +134468,7 @@ { "type": "object", "required": [ - "end", "raw", - "start", "type", "value" ], @@ -135041,16 +134479,6 @@ "Literal" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "$ref": "#/components/schemas/LiteralValue" }, @@ -135067,23 +134495,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] }, "start": { "type": "integer", @@ -135094,6 +134505,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Identifier" + ] }, "name": { "type": "string" @@ -135108,25 +134534,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] }, "start": { "type": "integer", @@ -135137,6 +134544,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "left", + "operator", + "right", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "BinaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/BinaryOperator" @@ -135157,25 +134581,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] }, "start": { "type": "integer", @@ -135186,6 +134591,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "arguments", + "callee", + "optional", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "CallExpression" + ] }, "callee": { "$ref": "#/components/schemas/Identifier" @@ -135209,24 +134631,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] }, "start": { "type": "integer", @@ -135237,6 +134641,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "argument", + "operator", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "UnaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/UnaryOperator" @@ -135254,25 +134674,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] }, "start": { "type": "integer", @@ -135283,6 +134684,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "computed", + "object", + "property", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "MemberExpression" + ] }, "object": { "$ref": "#/components/schemas/MemberObject" @@ -135303,26 +134721,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] }, "start": { "type": "integer", @@ -135333,6 +134731,24 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "cond", + "else_ifs", + "final_else", + "then_val", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "IfExpression" + ] }, "cond": { "$ref": "#/components/schemas/Expr" @@ -135359,6 +134775,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -135388,10 +134814,8 @@ "type": "object", "required": [ "computed", - "end", "object", "property", - "start", "type" ], "properties": { @@ -135401,16 +134825,6 @@ "MemberExpression" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "object": { "$ref": "#/components/schemas/MemberObject" }, @@ -135430,23 +134844,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] }, "start": { "type": "integer", @@ -135457,6 +134854,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Identifier" + ] }, "name": { "type": "string" @@ -135471,6 +134883,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -135481,9 +134903,7 @@ { "type": "object", "required": [ - "end", "name", - "start", "type" ], "properties": { @@ -135493,16 +134913,6 @@ "Identifier" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "name": { "type": "string" }, @@ -135516,24 +134926,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "raw", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Literal" - ] }, "start": { "type": "integer", @@ -135544,6 +134936,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "raw", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Literal" + ] }, "value": { "$ref": "#/components/schemas/LiteralValue" @@ -135561,6 +134969,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -135570,21 +134988,9 @@ "type": "object", "required": [ "cond", - "end", - "start", "then_val" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "cond": { "$ref": "#/components/schemas/Expr" }, @@ -135601,6 +135007,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -135608,7 +135024,7 @@ "type": "object", "required": [ "nonCodeNodes", - "start" + "startNodes" ], "properties": { "nonCodeNodes": { @@ -135620,7 +135036,7 @@ } } }, - "start": { + "startNodes": { "type": "array", "items": { "$ref": "#/components/schemas/NonCodeNode" @@ -135642,21 +135058,9 @@ "NonCodeNode": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "$ref": "#/components/schemas/NonCodeValue" }, @@ -135670,6 +135074,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -135800,22 +135214,10 @@ "ObjectProperty": { "type": "object", "required": [ - "end", "key", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "key": { "$ref": "#/components/schemas/Identifier" }, @@ -135832,18 +135234,7 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - "VariableDeclarator": { - "type": "object", - "required": [ - "end", - "id", - "init", - "start" - ], - "properties": { + }, "start": { "type": "integer", "format": "uint", @@ -135853,7 +135244,16 @@ "type": "integer", "format": "uint", "minimum": 0.0 - }, + } + } + }, + "VariableDeclarator": { + "type": "object", + "required": [ + "id", + "init" + ], + "properties": { "id": { "description": "The identifier of the variable.", "allOf": [ @@ -135880,6 +135280,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -135922,7 +135332,9 @@ } }, "currentEnv": { - "$ref": "#/components/schemas/EnvironmentRef" + "type": "integer", + "format": "uint", + "minimum": 0.0 }, "return": { "allOf": [ @@ -135947,20 +135359,12 @@ } }, "parent": { - "allOf": [ - { - "$ref": "#/components/schemas/EnvironmentRef" - } - ], + "type": "integer", + "format": "uint", + "minimum": 0.0, "nullable": true } } - }, - "EnvironmentRef": { - "description": "An index pointing to an environment.", - "type": "integer", - "format": "uint", - "minimum": 0.0 } } }, @@ -136034,8 +135438,6 @@ { "type": "object", "required": [ - "end", - "start", "type", "value" ], @@ -136046,16 +135448,6 @@ "TagDeclarator" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -136069,6 +135461,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -136970,21 +136372,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -136998,6 +136388,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -137675,21 +137075,9 @@ "type": "object", "required": [ "body", - "end", - "params", - "start" + "params" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "params": { "type": "array", "items": { @@ -137709,6 +137097,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -137748,21 +137146,9 @@ "Identifier": { "type": "object", "required": [ - "end", - "name", - "start" + "name" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "name": { "type": "string" }, @@ -137776,18 +137162,7 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - "Program": { - "description": "A KCL program top level, or function body.", - "type": "object", - "required": [ - "body", - "end", - "start" - ], - "properties": { + }, "start": { "type": "integer", "format": "uint", @@ -137797,7 +137172,16 @@ "type": "integer", "format": "uint", "minimum": 0.0 - }, + } + } + }, + "Program": { + "description": "A KCL program top level, or function body.", + "type": "object", + "required": [ + "body" + ], + "properties": { "body": { "type": "array", "items": { @@ -137817,6 +137201,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -137825,11 +137219,9 @@ { "type": "object", "required": [ - "end", "items", "path", "raw_path", - "start", "type" ], "properties": { @@ -137839,16 +137231,6 @@ "ImportStatement" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "items": { "type": "array", "items": { @@ -137871,23 +137253,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "expression", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ExpressionStatement" - ] }, "start": { "type": "integer", @@ -137898,6 +137263,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "expression", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ExpressionStatement" + ] }, "expression": { "$ref": "#/components/schemas/Expr" @@ -137912,24 +137292,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "declarations", - "end", - "kind", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "VariableDeclaration" - ] }, "start": { "type": "integer", @@ -137940,6 +137302,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "declarations", + "kind", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "VariableDeclaration" + ] }, "declarations": { "type": "array", @@ -137963,23 +137341,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ReturnStatement" - ] }, "start": { "type": "integer", @@ -137990,6 +137351,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "argument", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ReturnStatement" + ] }, "argument": { "$ref": "#/components/schemas/Expr" @@ -138004,6 +137380,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -138012,9 +137398,7 @@ "ImportItem": { "type": "object", "required": [ - "end", - "name", - "start" + "name" ], "properties": { "name": { @@ -138034,16 +137418,6 @@ ], "nullable": true }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "digest": { "type": "array", "items": { @@ -138054,6 +137428,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -138063,9 +137447,7 @@ { "type": "object", "required": [ - "end", "raw", - "start", "type", "value" ], @@ -138076,16 +137458,6 @@ "Literal" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "$ref": "#/components/schemas/LiteralValue" }, @@ -138102,23 +137474,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] }, "start": { "type": "integer", @@ -138129,6 +137484,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Identifier" + ] }, "name": { "type": "string" @@ -138143,23 +137513,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TagDeclarator" - ] }, "start": { "type": "integer", @@ -138170,6 +137523,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagDeclarator" + ] }, "value": { "type": "string" @@ -138184,25 +137552,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] }, "start": { "type": "integer", @@ -138213,6 +137562,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "left", + "operator", + "right", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "BinaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/BinaryOperator" @@ -138233,24 +137599,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "params", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "FunctionExpression" - ] }, "start": { "type": "integer", @@ -138261,6 +137609,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "body", + "params", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "FunctionExpression" + ] }, "params": { "type": "array", @@ -138281,25 +137645,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] }, "start": { "type": "integer", @@ -138310,6 +137655,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "arguments", + "callee", + "optional", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "CallExpression" + ] }, "callee": { "$ref": "#/components/schemas/Identifier" @@ -138333,23 +137695,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeExpression" - ] }, "start": { "type": "integer", @@ -138360,6 +137705,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "body", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "PipeExpression" + ] }, "body": { "type": "array", @@ -138380,22 +137740,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeSubstitution" - ] }, "start": { "type": "integer", @@ -138406,6 +137750,20 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "PipeSubstitution" + ] }, "digest": { "type": "array", @@ -138417,23 +137775,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "elements", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayExpression" - ] }, "start": { "type": "integer", @@ -138444,6 +137785,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "elements", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ArrayExpression" + ] }, "elements": { "type": "array", @@ -138464,25 +137820,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "endElement", - "endInclusive", - "start", - "startElement", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayRangeExpression" - ] }, "start": { "type": "integer", @@ -138493,6 +137830,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "endElement", + "endInclusive", + "startElement", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ArrayRangeExpression" + ] }, "startElement": { "$ref": "#/components/schemas/Expr" @@ -138514,23 +137868,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "properties", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ObjectExpression" - ] }, "start": { "type": "integer", @@ -138541,6 +137878,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "properties", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ObjectExpression" + ] }, "properties": { "type": "array", @@ -138561,25 +137913,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] }, "start": { "type": "integer", @@ -138590,6 +137923,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "computed", + "object", + "property", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "MemberExpression" + ] }, "object": { "$ref": "#/components/schemas/MemberObject" @@ -138610,24 +137960,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] }, "start": { "type": "integer", @@ -138638,6 +137970,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "argument", + "operator", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "UnaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/UnaryOperator" @@ -138655,26 +138003,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] }, "start": { "type": "integer", @@ -138685,6 +138013,24 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "cond", + "else_ifs", + "final_else", + "then_val", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "IfExpression" + ] }, "cond": { "$ref": "#/components/schemas/Expr" @@ -138711,6 +138057,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -138854,9 +138210,7 @@ { "type": "object", "required": [ - "end", "raw", - "start", "type", "value" ], @@ -138867,16 +138221,6 @@ "Literal" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "$ref": "#/components/schemas/LiteralValue" }, @@ -138893,23 +138237,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] }, "start": { "type": "integer", @@ -138920,6 +138247,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Identifier" + ] }, "name": { "type": "string" @@ -138934,25 +138276,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] }, "start": { "type": "integer", @@ -138963,6 +138286,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "left", + "operator", + "right", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "BinaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/BinaryOperator" @@ -138983,25 +138323,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] }, "start": { "type": "integer", @@ -139012,6 +138333,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "arguments", + "callee", + "optional", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "CallExpression" + ] }, "callee": { "$ref": "#/components/schemas/Identifier" @@ -139035,24 +138373,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] }, "start": { "type": "integer", @@ -139063,6 +138383,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "argument", + "operator", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "UnaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/UnaryOperator" @@ -139080,25 +138416,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] }, "start": { "type": "integer", @@ -139109,6 +138426,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "computed", + "object", + "property", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "MemberExpression" + ] }, "object": { "$ref": "#/components/schemas/MemberObject" @@ -139129,26 +138463,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] }, "start": { "type": "integer", @@ -139159,6 +138473,24 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "cond", + "else_ifs", + "final_else", + "then_val", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "IfExpression" + ] }, "cond": { "$ref": "#/components/schemas/Expr" @@ -139185,6 +138517,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -139214,10 +138556,8 @@ "type": "object", "required": [ "computed", - "end", "object", "property", - "start", "type" ], "properties": { @@ -139227,16 +138567,6 @@ "MemberExpression" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "object": { "$ref": "#/components/schemas/MemberObject" }, @@ -139256,23 +138586,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] }, "start": { "type": "integer", @@ -139283,6 +138596,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Identifier" + ] }, "name": { "type": "string" @@ -139297,6 +138625,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -139307,9 +138645,7 @@ { "type": "object", "required": [ - "end", "name", - "start", "type" ], "properties": { @@ -139319,16 +138655,6 @@ "Identifier" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "name": { "type": "string" }, @@ -139342,24 +138668,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "raw", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Literal" - ] }, "start": { "type": "integer", @@ -139370,6 +138678,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "raw", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Literal" + ] }, "value": { "$ref": "#/components/schemas/LiteralValue" @@ -139387,6 +138711,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -139396,21 +138730,9 @@ "type": "object", "required": [ "cond", - "end", - "start", "then_val" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "cond": { "$ref": "#/components/schemas/Expr" }, @@ -139427,6 +138749,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -139434,7 +138766,7 @@ "type": "object", "required": [ "nonCodeNodes", - "start" + "startNodes" ], "properties": { "nonCodeNodes": { @@ -139446,7 +138778,7 @@ } } }, - "start": { + "startNodes": { "type": "array", "items": { "$ref": "#/components/schemas/NonCodeNode" @@ -139468,21 +138800,9 @@ "NonCodeNode": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "$ref": "#/components/schemas/NonCodeValue" }, @@ -139496,6 +138816,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -139626,22 +138956,10 @@ "ObjectProperty": { "type": "object", "required": [ - "end", "key", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "key": { "$ref": "#/components/schemas/Identifier" }, @@ -139658,18 +138976,7 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - "VariableDeclarator": { - "type": "object", - "required": [ - "end", - "id", - "init", - "start" - ], - "properties": { + }, "start": { "type": "integer", "format": "uint", @@ -139679,7 +138986,16 @@ "type": "integer", "format": "uint", "minimum": 0.0 - }, + } + } + }, + "VariableDeclarator": { + "type": "object", + "required": [ + "id", + "init" + ], + "properties": { "id": { "description": "The identifier of the variable.", "allOf": [ @@ -139706,6 +139022,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -139748,7 +139074,9 @@ } }, "currentEnv": { - "$ref": "#/components/schemas/EnvironmentRef" + "type": "integer", + "format": "uint", + "minimum": 0.0 }, "return": { "allOf": [ @@ -139773,11 +139101,9 @@ } }, "parent": { - "allOf": [ - { - "$ref": "#/components/schemas/EnvironmentRef" - } - ], + "type": "integer", + "format": "uint", + "minimum": 0.0, "nullable": true } } @@ -139844,8 +139170,6 @@ { "type": "object", "required": [ - "end", - "start", "type", "value" ], @@ -139856,16 +139180,6 @@ "TagDeclarator" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -139879,6 +139193,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -140177,12 +139501,6 @@ } } ] - }, - "EnvironmentRef": { - "description": "An index pointing to an environment.", - "type": "integer", - "format": "uint", - "minimum": 0.0 } } }, @@ -140273,8 +139591,6 @@ { "type": "object", "required": [ - "end", - "start", "type", "value" ], @@ -140285,16 +139601,6 @@ "TagDeclarator" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -140308,6 +139614,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -141209,21 +140525,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -141237,6 +140541,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -141914,21 +141228,9 @@ "type": "object", "required": [ "body", - "end", - "params", - "start" + "params" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "params": { "type": "array", "items": { @@ -141948,6 +141250,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -141987,21 +141299,9 @@ "Identifier": { "type": "object", "required": [ - "end", - "name", - "start" + "name" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "name": { "type": "string" }, @@ -142015,18 +141315,7 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - "Program": { - "description": "A KCL program top level, or function body.", - "type": "object", - "required": [ - "body", - "end", - "start" - ], - "properties": { + }, "start": { "type": "integer", "format": "uint", @@ -142036,7 +141325,16 @@ "type": "integer", "format": "uint", "minimum": 0.0 - }, + } + } + }, + "Program": { + "description": "A KCL program top level, or function body.", + "type": "object", + "required": [ + "body" + ], + "properties": { "body": { "type": "array", "items": { @@ -142056,6 +141354,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -142064,11 +141372,9 @@ { "type": "object", "required": [ - "end", "items", "path", "raw_path", - "start", "type" ], "properties": { @@ -142078,16 +141384,6 @@ "ImportStatement" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "items": { "type": "array", "items": { @@ -142110,23 +141406,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "expression", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ExpressionStatement" - ] }, "start": { "type": "integer", @@ -142137,6 +141416,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "expression", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ExpressionStatement" + ] }, "expression": { "$ref": "#/components/schemas/Expr" @@ -142151,24 +141445,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "declarations", - "end", - "kind", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "VariableDeclaration" - ] }, "start": { "type": "integer", @@ -142179,6 +141455,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "declarations", + "kind", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "VariableDeclaration" + ] }, "declarations": { "type": "array", @@ -142202,23 +141494,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ReturnStatement" - ] }, "start": { "type": "integer", @@ -142229,6 +141504,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "argument", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ReturnStatement" + ] }, "argument": { "$ref": "#/components/schemas/Expr" @@ -142243,6 +141533,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -142251,9 +141551,7 @@ "ImportItem": { "type": "object", "required": [ - "end", - "name", - "start" + "name" ], "properties": { "name": { @@ -142273,16 +141571,6 @@ ], "nullable": true }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "digest": { "type": "array", "items": { @@ -142293,6 +141581,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -142302,9 +141600,7 @@ { "type": "object", "required": [ - "end", "raw", - "start", "type", "value" ], @@ -142315,16 +141611,6 @@ "Literal" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "$ref": "#/components/schemas/LiteralValue" }, @@ -142341,23 +141627,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] }, "start": { "type": "integer", @@ -142368,6 +141637,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Identifier" + ] }, "name": { "type": "string" @@ -142382,23 +141666,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TagDeclarator" - ] }, "start": { "type": "integer", @@ -142409,6 +141676,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagDeclarator" + ] }, "value": { "type": "string" @@ -142423,25 +141705,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] }, "start": { "type": "integer", @@ -142452,6 +141715,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "left", + "operator", + "right", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "BinaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/BinaryOperator" @@ -142472,24 +141752,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "params", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "FunctionExpression" - ] }, "start": { "type": "integer", @@ -142500,6 +141762,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "body", + "params", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "FunctionExpression" + ] }, "params": { "type": "array", @@ -142520,25 +141798,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] }, "start": { "type": "integer", @@ -142549,6 +141808,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "arguments", + "callee", + "optional", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "CallExpression" + ] }, "callee": { "$ref": "#/components/schemas/Identifier" @@ -142572,23 +141848,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeExpression" - ] }, "start": { "type": "integer", @@ -142599,6 +141858,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "body", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "PipeExpression" + ] }, "body": { "type": "array", @@ -142619,22 +141893,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeSubstitution" - ] }, "start": { "type": "integer", @@ -142645,6 +141903,20 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "PipeSubstitution" + ] }, "digest": { "type": "array", @@ -142656,23 +141928,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "elements", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayExpression" - ] }, "start": { "type": "integer", @@ -142683,6 +141938,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "elements", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ArrayExpression" + ] }, "elements": { "type": "array", @@ -142703,25 +141973,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "endElement", - "endInclusive", - "start", - "startElement", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayRangeExpression" - ] }, "start": { "type": "integer", @@ -142732,6 +141983,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "endElement", + "endInclusive", + "startElement", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ArrayRangeExpression" + ] }, "startElement": { "$ref": "#/components/schemas/Expr" @@ -142753,23 +142021,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "properties", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ObjectExpression" - ] }, "start": { "type": "integer", @@ -142780,6 +142031,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "properties", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ObjectExpression" + ] }, "properties": { "type": "array", @@ -142800,25 +142066,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] }, "start": { "type": "integer", @@ -142829,6 +142076,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "computed", + "object", + "property", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "MemberExpression" + ] }, "object": { "$ref": "#/components/schemas/MemberObject" @@ -142849,24 +142113,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] }, "start": { "type": "integer", @@ -142877,6 +142123,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "argument", + "operator", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "UnaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/UnaryOperator" @@ -142894,26 +142156,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] }, "start": { "type": "integer", @@ -142924,6 +142166,24 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "cond", + "else_ifs", + "final_else", + "then_val", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "IfExpression" + ] }, "cond": { "$ref": "#/components/schemas/Expr" @@ -142950,6 +142210,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -143093,9 +142363,7 @@ { "type": "object", "required": [ - "end", "raw", - "start", "type", "value" ], @@ -143106,16 +142374,6 @@ "Literal" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "$ref": "#/components/schemas/LiteralValue" }, @@ -143132,23 +142390,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] }, "start": { "type": "integer", @@ -143159,6 +142400,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Identifier" + ] }, "name": { "type": "string" @@ -143173,25 +142429,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] }, "start": { "type": "integer", @@ -143202,6 +142439,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "left", + "operator", + "right", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "BinaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/BinaryOperator" @@ -143222,25 +142476,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] }, "start": { "type": "integer", @@ -143251,6 +142486,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "arguments", + "callee", + "optional", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "CallExpression" + ] }, "callee": { "$ref": "#/components/schemas/Identifier" @@ -143274,24 +142526,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] }, "start": { "type": "integer", @@ -143302,6 +142536,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "argument", + "operator", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "UnaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/UnaryOperator" @@ -143319,25 +142569,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] }, "start": { "type": "integer", @@ -143348,6 +142579,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "computed", + "object", + "property", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "MemberExpression" + ] }, "object": { "$ref": "#/components/schemas/MemberObject" @@ -143368,26 +142616,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] }, "start": { "type": "integer", @@ -143398,6 +142626,24 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "cond", + "else_ifs", + "final_else", + "then_val", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "IfExpression" + ] }, "cond": { "$ref": "#/components/schemas/Expr" @@ -143424,6 +142670,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -143453,10 +142709,8 @@ "type": "object", "required": [ "computed", - "end", "object", "property", - "start", "type" ], "properties": { @@ -143466,16 +142720,6 @@ "MemberExpression" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "object": { "$ref": "#/components/schemas/MemberObject" }, @@ -143495,23 +142739,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] }, "start": { "type": "integer", @@ -143522,6 +142749,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Identifier" + ] }, "name": { "type": "string" @@ -143536,6 +142778,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -143546,9 +142798,7 @@ { "type": "object", "required": [ - "end", "name", - "start", "type" ], "properties": { @@ -143558,16 +142808,6 @@ "Identifier" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "name": { "type": "string" }, @@ -143581,24 +142821,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "raw", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Literal" - ] }, "start": { "type": "integer", @@ -143609,6 +142831,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "raw", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Literal" + ] }, "value": { "$ref": "#/components/schemas/LiteralValue" @@ -143626,6 +142864,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -143635,21 +142883,9 @@ "type": "object", "required": [ "cond", - "end", - "start", "then_val" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "cond": { "$ref": "#/components/schemas/Expr" }, @@ -143666,6 +142902,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -143673,7 +142919,7 @@ "type": "object", "required": [ "nonCodeNodes", - "start" + "startNodes" ], "properties": { "nonCodeNodes": { @@ -143685,7 +142931,7 @@ } } }, - "start": { + "startNodes": { "type": "array", "items": { "$ref": "#/components/schemas/NonCodeNode" @@ -143707,21 +142953,9 @@ "NonCodeNode": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "$ref": "#/components/schemas/NonCodeValue" }, @@ -143735,6 +142969,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -143865,22 +143109,10 @@ "ObjectProperty": { "type": "object", "required": [ - "end", "key", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "key": { "$ref": "#/components/schemas/Identifier" }, @@ -143897,18 +143129,7 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - "VariableDeclarator": { - "type": "object", - "required": [ - "end", - "id", - "init", - "start" - ], - "properties": { + }, "start": { "type": "integer", "format": "uint", @@ -143918,7 +143139,16 @@ "type": "integer", "format": "uint", "minimum": 0.0 - }, + } + } + }, + "VariableDeclarator": { + "type": "object", + "required": [ + "id", + "init" + ], + "properties": { "id": { "description": "The identifier of the variable.", "allOf": [ @@ -143945,6 +143175,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -143987,7 +143227,9 @@ } }, "currentEnv": { - "$ref": "#/components/schemas/EnvironmentRef" + "type": "integer", + "format": "uint", + "minimum": 0.0 }, "return": { "allOf": [ @@ -144012,20 +143254,12 @@ } }, "parent": { - "allOf": [ - { - "$ref": "#/components/schemas/EnvironmentRef" - } - ], + "type": "integer", + "format": "uint", + "minimum": 0.0, "nullable": true } } - }, - "EnvironmentRef": { - "description": "An index pointing to an environment.", - "type": "integer", - "format": "uint", - "minimum": 0.0 } } }, @@ -144098,8 +143332,6 @@ { "type": "object", "required": [ - "end", - "start", "type", "value" ], @@ -144110,16 +143342,6 @@ "TagDeclarator" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -144133,6 +143355,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -144494,8 +143726,6 @@ { "type": "object", "required": [ - "end", - "start", "type", "value" ], @@ -144506,16 +143736,6 @@ "TagDeclarator" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -144529,6 +143749,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -145430,21 +144660,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -145458,6 +144676,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -146135,21 +145363,9 @@ "type": "object", "required": [ "body", - "end", - "params", - "start" + "params" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "params": { "type": "array", "items": { @@ -146169,6 +145385,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -146208,21 +145434,9 @@ "Identifier": { "type": "object", "required": [ - "end", - "name", - "start" + "name" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "name": { "type": "string" }, @@ -146236,18 +145450,7 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - "Program": { - "description": "A KCL program top level, or function body.", - "type": "object", - "required": [ - "body", - "end", - "start" - ], - "properties": { + }, "start": { "type": "integer", "format": "uint", @@ -146257,7 +145460,16 @@ "type": "integer", "format": "uint", "minimum": 0.0 - }, + } + } + }, + "Program": { + "description": "A KCL program top level, or function body.", + "type": "object", + "required": [ + "body" + ], + "properties": { "body": { "type": "array", "items": { @@ -146277,6 +145489,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -146285,11 +145507,9 @@ { "type": "object", "required": [ - "end", "items", "path", "raw_path", - "start", "type" ], "properties": { @@ -146299,16 +145519,6 @@ "ImportStatement" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "items": { "type": "array", "items": { @@ -146331,23 +145541,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "expression", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ExpressionStatement" - ] }, "start": { "type": "integer", @@ -146358,6 +145551,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "expression", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ExpressionStatement" + ] }, "expression": { "$ref": "#/components/schemas/Expr" @@ -146372,24 +145580,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "declarations", - "end", - "kind", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "VariableDeclaration" - ] }, "start": { "type": "integer", @@ -146400,6 +145590,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "declarations", + "kind", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "VariableDeclaration" + ] }, "declarations": { "type": "array", @@ -146423,23 +145629,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ReturnStatement" - ] }, "start": { "type": "integer", @@ -146450,6 +145639,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "argument", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ReturnStatement" + ] }, "argument": { "$ref": "#/components/schemas/Expr" @@ -146464,6 +145668,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -146472,9 +145686,7 @@ "ImportItem": { "type": "object", "required": [ - "end", - "name", - "start" + "name" ], "properties": { "name": { @@ -146494,16 +145706,6 @@ ], "nullable": true }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "digest": { "type": "array", "items": { @@ -146514,6 +145716,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -146523,9 +145735,7 @@ { "type": "object", "required": [ - "end", "raw", - "start", "type", "value" ], @@ -146536,16 +145746,6 @@ "Literal" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "$ref": "#/components/schemas/LiteralValue" }, @@ -146562,23 +145762,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] }, "start": { "type": "integer", @@ -146589,6 +145772,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Identifier" + ] }, "name": { "type": "string" @@ -146603,23 +145801,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TagDeclarator" - ] }, "start": { "type": "integer", @@ -146630,6 +145811,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagDeclarator" + ] }, "value": { "type": "string" @@ -146644,25 +145840,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] }, "start": { "type": "integer", @@ -146673,6 +145850,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "left", + "operator", + "right", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "BinaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/BinaryOperator" @@ -146693,24 +145887,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "params", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "FunctionExpression" - ] }, "start": { "type": "integer", @@ -146721,6 +145897,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "body", + "params", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "FunctionExpression" + ] }, "params": { "type": "array", @@ -146741,25 +145933,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] }, "start": { "type": "integer", @@ -146770,6 +145943,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "arguments", + "callee", + "optional", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "CallExpression" + ] }, "callee": { "$ref": "#/components/schemas/Identifier" @@ -146793,23 +145983,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeExpression" - ] }, "start": { "type": "integer", @@ -146820,6 +145993,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "body", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "PipeExpression" + ] }, "body": { "type": "array", @@ -146840,22 +146028,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeSubstitution" - ] }, "start": { "type": "integer", @@ -146866,6 +146038,20 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "PipeSubstitution" + ] }, "digest": { "type": "array", @@ -146877,23 +146063,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "elements", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayExpression" - ] }, "start": { "type": "integer", @@ -146904,6 +146073,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "elements", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ArrayExpression" + ] }, "elements": { "type": "array", @@ -146924,25 +146108,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "endElement", - "endInclusive", - "start", - "startElement", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayRangeExpression" - ] }, "start": { "type": "integer", @@ -146953,6 +146118,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "endElement", + "endInclusive", + "startElement", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ArrayRangeExpression" + ] }, "startElement": { "$ref": "#/components/schemas/Expr" @@ -146974,23 +146156,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "properties", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ObjectExpression" - ] }, "start": { "type": "integer", @@ -147001,6 +146166,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "properties", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ObjectExpression" + ] }, "properties": { "type": "array", @@ -147021,25 +146201,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] }, "start": { "type": "integer", @@ -147050,6 +146211,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "computed", + "object", + "property", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "MemberExpression" + ] }, "object": { "$ref": "#/components/schemas/MemberObject" @@ -147070,24 +146248,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] }, "start": { "type": "integer", @@ -147098,6 +146258,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "argument", + "operator", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "UnaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/UnaryOperator" @@ -147115,26 +146291,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] }, "start": { "type": "integer", @@ -147145,6 +146301,24 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "cond", + "else_ifs", + "final_else", + "then_val", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "IfExpression" + ] }, "cond": { "$ref": "#/components/schemas/Expr" @@ -147171,6 +146345,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -147314,9 +146498,7 @@ { "type": "object", "required": [ - "end", "raw", - "start", "type", "value" ], @@ -147327,16 +146509,6 @@ "Literal" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "$ref": "#/components/schemas/LiteralValue" }, @@ -147353,23 +146525,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] }, "start": { "type": "integer", @@ -147380,6 +146535,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Identifier" + ] }, "name": { "type": "string" @@ -147394,25 +146564,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] }, "start": { "type": "integer", @@ -147423,6 +146574,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "left", + "operator", + "right", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "BinaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/BinaryOperator" @@ -147443,25 +146611,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] }, "start": { "type": "integer", @@ -147472,6 +146621,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "arguments", + "callee", + "optional", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "CallExpression" + ] }, "callee": { "$ref": "#/components/schemas/Identifier" @@ -147495,24 +146661,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] }, "start": { "type": "integer", @@ -147523,6 +146671,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "argument", + "operator", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "UnaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/UnaryOperator" @@ -147540,25 +146704,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] }, "start": { "type": "integer", @@ -147569,6 +146714,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "computed", + "object", + "property", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "MemberExpression" + ] }, "object": { "$ref": "#/components/schemas/MemberObject" @@ -147589,26 +146751,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] }, "start": { "type": "integer", @@ -147619,6 +146761,24 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "cond", + "else_ifs", + "final_else", + "then_val", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "IfExpression" + ] }, "cond": { "$ref": "#/components/schemas/Expr" @@ -147645,6 +146805,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -147674,10 +146844,8 @@ "type": "object", "required": [ "computed", - "end", "object", "property", - "start", "type" ], "properties": { @@ -147687,16 +146855,6 @@ "MemberExpression" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "object": { "$ref": "#/components/schemas/MemberObject" }, @@ -147716,23 +146874,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] }, "start": { "type": "integer", @@ -147743,6 +146884,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Identifier" + ] }, "name": { "type": "string" @@ -147757,6 +146913,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -147767,9 +146933,7 @@ { "type": "object", "required": [ - "end", "name", - "start", "type" ], "properties": { @@ -147779,16 +146943,6 @@ "Identifier" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "name": { "type": "string" }, @@ -147802,24 +146956,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "raw", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Literal" - ] }, "start": { "type": "integer", @@ -147830,6 +146966,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "raw", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Literal" + ] }, "value": { "$ref": "#/components/schemas/LiteralValue" @@ -147847,6 +146999,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -147856,21 +147018,9 @@ "type": "object", "required": [ "cond", - "end", - "start", "then_val" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "cond": { "$ref": "#/components/schemas/Expr" }, @@ -147887,6 +147037,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -147894,7 +147054,7 @@ "type": "object", "required": [ "nonCodeNodes", - "start" + "startNodes" ], "properties": { "nonCodeNodes": { @@ -147906,7 +147066,7 @@ } } }, - "start": { + "startNodes": { "type": "array", "items": { "$ref": "#/components/schemas/NonCodeNode" @@ -147928,21 +147088,9 @@ "NonCodeNode": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "$ref": "#/components/schemas/NonCodeValue" }, @@ -147956,6 +147104,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -148086,22 +147244,10 @@ "ObjectProperty": { "type": "object", "required": [ - "end", "key", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "key": { "$ref": "#/components/schemas/Identifier" }, @@ -148118,18 +147264,7 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - "VariableDeclarator": { - "type": "object", - "required": [ - "end", - "id", - "init", - "start" - ], - "properties": { + }, "start": { "type": "integer", "format": "uint", @@ -148139,7 +147274,16 @@ "type": "integer", "format": "uint", "minimum": 0.0 - }, + } + } + }, + "VariableDeclarator": { + "type": "object", + "required": [ + "id", + "init" + ], + "properties": { "id": { "description": "The identifier of the variable.", "allOf": [ @@ -148166,6 +147310,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -148208,7 +147362,9 @@ } }, "currentEnv": { - "$ref": "#/components/schemas/EnvironmentRef" + "type": "integer", + "format": "uint", + "minimum": 0.0 }, "return": { "allOf": [ @@ -148233,20 +147389,12 @@ } }, "parent": { - "allOf": [ - { - "$ref": "#/components/schemas/EnvironmentRef" - } - ], + "type": "integer", + "format": "uint", + "minimum": 0.0, "nullable": true } } - }, - "EnvironmentRef": { - "description": "An index pointing to an environment.", - "type": "integer", - "format": "uint", - "minimum": 0.0 } } }, @@ -148322,8 +147470,6 @@ { "type": "object", "required": [ - "end", - "start", "type", "value" ], @@ -148334,16 +147480,6 @@ "TagDeclarator" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -148357,6 +147493,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -149258,21 +148404,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -149286,6 +148420,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -149963,21 +149107,9 @@ "type": "object", "required": [ "body", - "end", - "params", - "start" + "params" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "params": { "type": "array", "items": { @@ -149997,6 +149129,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -150036,21 +149178,9 @@ "Identifier": { "type": "object", "required": [ - "end", - "name", - "start" + "name" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "name": { "type": "string" }, @@ -150064,18 +149194,7 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - "Program": { - "description": "A KCL program top level, or function body.", - "type": "object", - "required": [ - "body", - "end", - "start" - ], - "properties": { + }, "start": { "type": "integer", "format": "uint", @@ -150085,7 +149204,16 @@ "type": "integer", "format": "uint", "minimum": 0.0 - }, + } + } + }, + "Program": { + "description": "A KCL program top level, or function body.", + "type": "object", + "required": [ + "body" + ], + "properties": { "body": { "type": "array", "items": { @@ -150105,6 +149233,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -150113,11 +149251,9 @@ { "type": "object", "required": [ - "end", "items", "path", "raw_path", - "start", "type" ], "properties": { @@ -150127,16 +149263,6 @@ "ImportStatement" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "items": { "type": "array", "items": { @@ -150159,23 +149285,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "expression", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ExpressionStatement" - ] }, "start": { "type": "integer", @@ -150186,6 +149295,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "expression", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ExpressionStatement" + ] }, "expression": { "$ref": "#/components/schemas/Expr" @@ -150200,24 +149324,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "declarations", - "end", - "kind", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "VariableDeclaration" - ] }, "start": { "type": "integer", @@ -150228,6 +149334,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "declarations", + "kind", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "VariableDeclaration" + ] }, "declarations": { "type": "array", @@ -150251,23 +149373,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ReturnStatement" - ] }, "start": { "type": "integer", @@ -150278,6 +149383,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "argument", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ReturnStatement" + ] }, "argument": { "$ref": "#/components/schemas/Expr" @@ -150292,6 +149412,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -150300,9 +149430,7 @@ "ImportItem": { "type": "object", "required": [ - "end", - "name", - "start" + "name" ], "properties": { "name": { @@ -150322,16 +149450,6 @@ ], "nullable": true }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "digest": { "type": "array", "items": { @@ -150342,6 +149460,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -150351,9 +149479,7 @@ { "type": "object", "required": [ - "end", "raw", - "start", "type", "value" ], @@ -150364,16 +149490,6 @@ "Literal" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "$ref": "#/components/schemas/LiteralValue" }, @@ -150390,23 +149506,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] }, "start": { "type": "integer", @@ -150417,6 +149516,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Identifier" + ] }, "name": { "type": "string" @@ -150431,23 +149545,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TagDeclarator" - ] }, "start": { "type": "integer", @@ -150458,6 +149555,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagDeclarator" + ] }, "value": { "type": "string" @@ -150472,25 +149584,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] }, "start": { "type": "integer", @@ -150501,6 +149594,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "left", + "operator", + "right", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "BinaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/BinaryOperator" @@ -150521,24 +149631,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "params", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "FunctionExpression" - ] }, "start": { "type": "integer", @@ -150549,6 +149641,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "body", + "params", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "FunctionExpression" + ] }, "params": { "type": "array", @@ -150569,25 +149677,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] }, "start": { "type": "integer", @@ -150598,6 +149687,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "arguments", + "callee", + "optional", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "CallExpression" + ] }, "callee": { "$ref": "#/components/schemas/Identifier" @@ -150621,23 +149727,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeExpression" - ] }, "start": { "type": "integer", @@ -150648,6 +149737,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "body", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "PipeExpression" + ] }, "body": { "type": "array", @@ -150668,22 +149772,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeSubstitution" - ] }, "start": { "type": "integer", @@ -150694,6 +149782,20 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "PipeSubstitution" + ] }, "digest": { "type": "array", @@ -150705,23 +149807,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "elements", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayExpression" - ] }, "start": { "type": "integer", @@ -150732,6 +149817,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "elements", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ArrayExpression" + ] }, "elements": { "type": "array", @@ -150752,25 +149852,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "endElement", - "endInclusive", - "start", - "startElement", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayRangeExpression" - ] }, "start": { "type": "integer", @@ -150781,6 +149862,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "endElement", + "endInclusive", + "startElement", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ArrayRangeExpression" + ] }, "startElement": { "$ref": "#/components/schemas/Expr" @@ -150802,23 +149900,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "properties", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ObjectExpression" - ] }, "start": { "type": "integer", @@ -150829,6 +149910,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "properties", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ObjectExpression" + ] }, "properties": { "type": "array", @@ -150849,25 +149945,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] }, "start": { "type": "integer", @@ -150878,6 +149955,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "computed", + "object", + "property", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "MemberExpression" + ] }, "object": { "$ref": "#/components/schemas/MemberObject" @@ -150898,24 +149992,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] }, "start": { "type": "integer", @@ -150926,6 +150002,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "argument", + "operator", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "UnaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/UnaryOperator" @@ -150943,26 +150035,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] }, "start": { "type": "integer", @@ -150973,6 +150045,24 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "cond", + "else_ifs", + "final_else", + "then_val", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "IfExpression" + ] }, "cond": { "$ref": "#/components/schemas/Expr" @@ -150999,6 +150089,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -151142,9 +150242,7 @@ { "type": "object", "required": [ - "end", "raw", - "start", "type", "value" ], @@ -151155,16 +150253,6 @@ "Literal" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "$ref": "#/components/schemas/LiteralValue" }, @@ -151181,23 +150269,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] }, "start": { "type": "integer", @@ -151208,6 +150279,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Identifier" + ] }, "name": { "type": "string" @@ -151222,25 +150308,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] }, "start": { "type": "integer", @@ -151251,6 +150318,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "left", + "operator", + "right", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "BinaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/BinaryOperator" @@ -151271,25 +150355,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] }, "start": { "type": "integer", @@ -151300,6 +150365,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "arguments", + "callee", + "optional", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "CallExpression" + ] }, "callee": { "$ref": "#/components/schemas/Identifier" @@ -151323,24 +150405,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] }, "start": { "type": "integer", @@ -151351,6 +150415,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "argument", + "operator", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "UnaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/UnaryOperator" @@ -151368,25 +150448,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] }, "start": { "type": "integer", @@ -151397,6 +150458,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "computed", + "object", + "property", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "MemberExpression" + ] }, "object": { "$ref": "#/components/schemas/MemberObject" @@ -151417,26 +150495,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] }, "start": { "type": "integer", @@ -151447,6 +150505,24 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "cond", + "else_ifs", + "final_else", + "then_val", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "IfExpression" + ] }, "cond": { "$ref": "#/components/schemas/Expr" @@ -151473,6 +150549,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -151502,10 +150588,8 @@ "type": "object", "required": [ "computed", - "end", "object", "property", - "start", "type" ], "properties": { @@ -151515,16 +150599,6 @@ "MemberExpression" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "object": { "$ref": "#/components/schemas/MemberObject" }, @@ -151544,23 +150618,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] }, "start": { "type": "integer", @@ -151571,6 +150628,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Identifier" + ] }, "name": { "type": "string" @@ -151585,6 +150657,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -151595,9 +150677,7 @@ { "type": "object", "required": [ - "end", "name", - "start", "type" ], "properties": { @@ -151607,16 +150687,6 @@ "Identifier" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "name": { "type": "string" }, @@ -151630,24 +150700,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "raw", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Literal" - ] }, "start": { "type": "integer", @@ -151658,6 +150710,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "raw", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Literal" + ] }, "value": { "$ref": "#/components/schemas/LiteralValue" @@ -151675,6 +150743,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -151684,21 +150762,9 @@ "type": "object", "required": [ "cond", - "end", - "start", "then_val" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "cond": { "$ref": "#/components/schemas/Expr" }, @@ -151715,6 +150781,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -151722,7 +150798,7 @@ "type": "object", "required": [ "nonCodeNodes", - "start" + "startNodes" ], "properties": { "nonCodeNodes": { @@ -151734,7 +150810,7 @@ } } }, - "start": { + "startNodes": { "type": "array", "items": { "$ref": "#/components/schemas/NonCodeNode" @@ -151756,21 +150832,9 @@ "NonCodeNode": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "$ref": "#/components/schemas/NonCodeValue" }, @@ -151784,6 +150848,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -151914,22 +150988,10 @@ "ObjectProperty": { "type": "object", "required": [ - "end", "key", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "key": { "$ref": "#/components/schemas/Identifier" }, @@ -151946,18 +151008,7 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - "VariableDeclarator": { - "type": "object", - "required": [ - "end", - "id", - "init", - "start" - ], - "properties": { + }, "start": { "type": "integer", "format": "uint", @@ -151967,7 +151018,16 @@ "type": "integer", "format": "uint", "minimum": 0.0 - }, + } + } + }, + "VariableDeclarator": { + "type": "object", + "required": [ + "id", + "init" + ], + "properties": { "id": { "description": "The identifier of the variable.", "allOf": [ @@ -151994,6 +151054,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -152036,7 +151106,9 @@ } }, "currentEnv": { - "$ref": "#/components/schemas/EnvironmentRef" + "type": "integer", + "format": "uint", + "minimum": 0.0 }, "return": { "allOf": [ @@ -152061,20 +151133,12 @@ } }, "parent": { - "allOf": [ - { - "$ref": "#/components/schemas/EnvironmentRef" - } - ], + "type": "integer", + "format": "uint", + "minimum": 0.0, "nullable": true } } - }, - "EnvironmentRef": { - "description": "An index pointing to an environment.", - "type": "integer", - "format": "uint", - "minimum": 0.0 } } }, @@ -152148,8 +151212,6 @@ { "type": "object", "required": [ - "end", - "start", "type", "value" ], @@ -152160,16 +151222,6 @@ "TagDeclarator" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -152183,6 +151235,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -153084,21 +152146,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -153112,6 +152162,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -153789,21 +152849,9 @@ "type": "object", "required": [ "body", - "end", - "params", - "start" + "params" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "params": { "type": "array", "items": { @@ -153823,6 +152871,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -153862,21 +152920,9 @@ "Identifier": { "type": "object", "required": [ - "end", - "name", - "start" + "name" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "name": { "type": "string" }, @@ -153890,18 +152936,7 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - "Program": { - "description": "A KCL program top level, or function body.", - "type": "object", - "required": [ - "body", - "end", - "start" - ], - "properties": { + }, "start": { "type": "integer", "format": "uint", @@ -153911,7 +152946,16 @@ "type": "integer", "format": "uint", "minimum": 0.0 - }, + } + } + }, + "Program": { + "description": "A KCL program top level, or function body.", + "type": "object", + "required": [ + "body" + ], + "properties": { "body": { "type": "array", "items": { @@ -153931,6 +152975,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -153939,11 +152993,9 @@ { "type": "object", "required": [ - "end", "items", "path", "raw_path", - "start", "type" ], "properties": { @@ -153953,16 +153005,6 @@ "ImportStatement" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "items": { "type": "array", "items": { @@ -153985,23 +153027,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "expression", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ExpressionStatement" - ] }, "start": { "type": "integer", @@ -154012,6 +153037,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "expression", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ExpressionStatement" + ] }, "expression": { "$ref": "#/components/schemas/Expr" @@ -154026,24 +153066,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "declarations", - "end", - "kind", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "VariableDeclaration" - ] }, "start": { "type": "integer", @@ -154054,6 +153076,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "declarations", + "kind", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "VariableDeclaration" + ] }, "declarations": { "type": "array", @@ -154077,23 +153115,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ReturnStatement" - ] }, "start": { "type": "integer", @@ -154104,6 +153125,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "argument", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ReturnStatement" + ] }, "argument": { "$ref": "#/components/schemas/Expr" @@ -154118,6 +153154,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -154126,9 +153172,7 @@ "ImportItem": { "type": "object", "required": [ - "end", - "name", - "start" + "name" ], "properties": { "name": { @@ -154148,16 +153192,6 @@ ], "nullable": true }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "digest": { "type": "array", "items": { @@ -154168,6 +153202,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -154177,9 +153221,7 @@ { "type": "object", "required": [ - "end", "raw", - "start", "type", "value" ], @@ -154190,16 +153232,6 @@ "Literal" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "$ref": "#/components/schemas/LiteralValue" }, @@ -154216,23 +153248,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] }, "start": { "type": "integer", @@ -154243,6 +153258,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Identifier" + ] }, "name": { "type": "string" @@ -154257,23 +153287,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TagDeclarator" - ] }, "start": { "type": "integer", @@ -154284,6 +153297,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TagDeclarator" + ] }, "value": { "type": "string" @@ -154298,25 +153326,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] }, "start": { "type": "integer", @@ -154327,6 +153336,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "left", + "operator", + "right", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "BinaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/BinaryOperator" @@ -154347,24 +153373,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "params", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "FunctionExpression" - ] }, "start": { "type": "integer", @@ -154375,6 +153383,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "body", + "params", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "FunctionExpression" + ] }, "params": { "type": "array", @@ -154395,25 +153419,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] }, "start": { "type": "integer", @@ -154424,6 +153429,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "arguments", + "callee", + "optional", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "CallExpression" + ] }, "callee": { "$ref": "#/components/schemas/Identifier" @@ -154447,23 +153469,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "body", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeExpression" - ] }, "start": { "type": "integer", @@ -154474,6 +153479,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "body", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "PipeExpression" + ] }, "body": { "type": "array", @@ -154494,22 +153514,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "PipeSubstitution" - ] }, "start": { "type": "integer", @@ -154520,6 +153524,20 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "PipeSubstitution" + ] }, "digest": { "type": "array", @@ -154531,23 +153549,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "elements", - "end", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayExpression" - ] }, "start": { "type": "integer", @@ -154558,6 +153559,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "elements", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ArrayExpression" + ] }, "elements": { "type": "array", @@ -154578,25 +153594,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "endElement", - "endInclusive", - "start", - "startElement", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArrayRangeExpression" - ] }, "start": { "type": "integer", @@ -154607,6 +153604,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "endElement", + "endInclusive", + "startElement", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ArrayRangeExpression" + ] }, "startElement": { "$ref": "#/components/schemas/Expr" @@ -154628,23 +153642,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "properties", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ObjectExpression" - ] }, "start": { "type": "integer", @@ -154655,6 +153652,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "properties", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ObjectExpression" + ] }, "properties": { "type": "array", @@ -154675,25 +153687,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] }, "start": { "type": "integer", @@ -154704,6 +153697,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "computed", + "object", + "property", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "MemberExpression" + ] }, "object": { "$ref": "#/components/schemas/MemberObject" @@ -154724,24 +153734,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] }, "start": { "type": "integer", @@ -154752,6 +153744,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "argument", + "operator", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "UnaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/UnaryOperator" @@ -154769,26 +153777,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] }, "start": { "type": "integer", @@ -154799,6 +153787,24 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "cond", + "else_ifs", + "final_else", + "then_val", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "IfExpression" + ] }, "cond": { "$ref": "#/components/schemas/Expr" @@ -154825,6 +153831,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -154968,9 +153984,7 @@ { "type": "object", "required": [ - "end", "raw", - "start", "type", "value" ], @@ -154981,16 +153995,6 @@ "Literal" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "$ref": "#/components/schemas/LiteralValue" }, @@ -155007,23 +154011,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] }, "start": { "type": "integer", @@ -155034,6 +154021,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Identifier" + ] }, "name": { "type": "string" @@ -155048,25 +154050,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "left", - "operator", - "right", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "BinaryExpression" - ] }, "start": { "type": "integer", @@ -155077,6 +154060,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "left", + "operator", + "right", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "BinaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/BinaryOperator" @@ -155097,25 +154097,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "arguments", - "callee", - "end", - "optional", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CallExpression" - ] }, "start": { "type": "integer", @@ -155126,6 +154107,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "arguments", + "callee", + "optional", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "CallExpression" + ] }, "callee": { "$ref": "#/components/schemas/Identifier" @@ -155149,24 +154147,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "argument", - "end", - "operator", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "UnaryExpression" - ] }, "start": { "type": "integer", @@ -155177,6 +154157,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "argument", + "operator", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "UnaryExpression" + ] }, "operator": { "$ref": "#/components/schemas/UnaryOperator" @@ -155194,25 +154190,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "computed", - "end", - "object", - "property", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "MemberExpression" - ] }, "start": { "type": "integer", @@ -155223,6 +154200,23 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "computed", + "object", + "property", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "MemberExpression" + ] }, "object": { "$ref": "#/components/schemas/MemberObject" @@ -155243,26 +154237,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "cond", - "else_ifs", - "end", - "final_else", - "start", - "then_val", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "IfExpression" - ] }, "start": { "type": "integer", @@ -155273,6 +154247,24 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "cond", + "else_ifs", + "final_else", + "then_val", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "IfExpression" + ] }, "cond": { "$ref": "#/components/schemas/Expr" @@ -155299,6 +154291,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -155328,10 +154330,8 @@ "type": "object", "required": [ "computed", - "end", "object", "property", - "start", "type" ], "properties": { @@ -155341,16 +154341,6 @@ "MemberExpression" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "object": { "$ref": "#/components/schemas/MemberObject" }, @@ -155370,23 +154360,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "name", - "start", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Identifier" - ] }, "start": { "type": "integer", @@ -155397,6 +154370,21 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Identifier" + ] }, "name": { "type": "string" @@ -155411,6 +154399,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -155421,9 +154419,7 @@ { "type": "object", "required": [ - "end", "name", - "start", "type" ], "properties": { @@ -155433,16 +154429,6 @@ "Identifier" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "name": { "type": "string" }, @@ -155456,24 +154442,6 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - { - "type": "object", - "required": [ - "end", - "raw", - "start", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Literal" - ] }, "start": { "type": "integer", @@ -155484,6 +154452,22 @@ "type": "integer", "format": "uint", "minimum": 0.0 + } + } + }, + { + "type": "object", + "required": [ + "raw", + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Literal" + ] }, "value": { "$ref": "#/components/schemas/LiteralValue" @@ -155501,6 +154485,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } } @@ -155510,21 +154504,9 @@ "type": "object", "required": [ "cond", - "end", - "start", "then_val" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "cond": { "$ref": "#/components/schemas/Expr" }, @@ -155541,6 +154523,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -155548,7 +154540,7 @@ "type": "object", "required": [ "nonCodeNodes", - "start" + "startNodes" ], "properties": { "nonCodeNodes": { @@ -155560,7 +154552,7 @@ } } }, - "start": { + "startNodes": { "type": "array", "items": { "$ref": "#/components/schemas/NonCodeNode" @@ -155582,21 +154574,9 @@ "NonCodeNode": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "$ref": "#/components/schemas/NonCodeValue" }, @@ -155610,6 +154590,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -155740,22 +154730,10 @@ "ObjectProperty": { "type": "object", "required": [ - "end", "key", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "key": { "$ref": "#/components/schemas/Identifier" }, @@ -155772,18 +154750,7 @@ "maxItems": 32, "minItems": 32, "nullable": true - } - } - }, - "VariableDeclarator": { - "type": "object", - "required": [ - "end", - "id", - "init", - "start" - ], - "properties": { + }, "start": { "type": "integer", "format": "uint", @@ -155793,7 +154760,16 @@ "type": "integer", "format": "uint", "minimum": 0.0 - }, + } + } + }, + "VariableDeclarator": { + "type": "object", + "required": [ + "id", + "init" + ], + "properties": { "id": { "description": "The identifier of the variable.", "allOf": [ @@ -155820,6 +154796,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -155862,7 +154848,9 @@ } }, "currentEnv": { - "$ref": "#/components/schemas/EnvironmentRef" + "type": "integer", + "format": "uint", + "minimum": 0.0 }, "return": { "allOf": [ @@ -155887,11 +154875,9 @@ } }, "parent": { - "allOf": [ - { - "$ref": "#/components/schemas/EnvironmentRef" - } - ], + "type": "integer", + "format": "uint", + "minimum": 0.0, "nullable": true } } @@ -155958,8 +154944,6 @@ { "type": "object", "required": [ - "end", - "start", "type", "value" ], @@ -155970,16 +154954,6 @@ "TagDeclarator" ] }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -155993,6 +154967,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -156291,12 +155275,6 @@ } } ] - }, - "EnvironmentRef": { - "description": "An index pointing to an environment.", - "type": "integer", - "format": "uint", - "minimum": 0.0 } } }, @@ -157113,21 +156091,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -157141,6 +156107,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -158154,21 +157130,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -158182,6 +157146,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -159118,21 +158092,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -159146,6 +158108,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -160862,21 +159834,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -160890,6 +159850,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -161762,21 +160732,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -161790,6 +160748,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -162662,21 +161630,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -162690,6 +161646,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -163562,21 +162528,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -163590,6 +162544,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -164518,21 +163482,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -164546,6 +163498,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -165524,21 +164486,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -165552,6 +164502,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -166520,21 +165480,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -166548,6 +165496,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -168215,21 +167173,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -168243,6 +167189,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -169203,7 +168159,7 @@ }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -169535,21 +168491,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -169563,6 +168507,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -171119,21 +170073,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -171147,6 +170089,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -172517,21 +171469,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -172545,6 +171485,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -173691,21 +172641,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -173719,6 +172657,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -175111,21 +174059,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -175139,6 +174075,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -176647,21 +175593,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -176675,6 +175609,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -178313,21 +177257,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -178341,6 +177273,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -179085,7 +178027,7 @@ }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -179633,21 +178575,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -179661,6 +178591,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -181001,21 +179941,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -181029,6 +179957,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -182396,21 +181334,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -182424,6 +181350,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -183168,7 +182104,7 @@ }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -183716,21 +182652,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -183744,6 +182668,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -185084,21 +184018,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -185112,6 +184034,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -186479,21 +185411,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -186507,6 +185427,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -187251,7 +186181,7 @@ }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -187799,21 +186729,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -187827,6 +186745,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -189167,21 +188095,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -189195,6 +188111,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -190656,21 +189582,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -190684,6 +189598,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -191428,7 +190352,7 @@ }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -191976,21 +190900,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -192004,6 +190916,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -193344,21 +192266,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -193372,6 +192282,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -194734,21 +193654,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -194762,6 +193670,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -195506,7 +194424,7 @@ }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -196054,21 +194972,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -196082,6 +194988,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -197422,21 +196338,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -197450,6 +196354,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -198812,21 +197726,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -198840,6 +197742,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -199584,7 +198496,7 @@ }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -200132,21 +199044,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -200160,6 +199060,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -201500,21 +200410,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -201528,6 +200426,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -202890,21 +201798,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -202918,6 +201814,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -203662,7 +202568,7 @@ }, { "name": "tag", - "type": "TagDeclarator", + "type": "TagNode", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_TagDeclarator", @@ -204210,21 +203116,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -204238,6 +203132,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, @@ -205578,21 +204482,9 @@ "TagDeclarator": { "type": "object", "required": [ - "end", - "start", "value" ], "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, "value": { "type": "string" }, @@ -205606,6 +204498,16 @@ "maxItems": 32, "minItems": 32, "nullable": true + }, + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 } } }, diff --git a/docs/kcl/types/BinaryPart.md b/docs/kcl/types/BinaryPart.md index 87b0b7722..c3c351663 100644 --- a/docs/kcl/types/BinaryPart.md +++ b/docs/kcl/types/BinaryPart.md @@ -23,11 +23,11 @@ layout: manual | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: `Literal`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `value` |[`LiteralValue`](/docs/kcl/types/LiteralValue)| | No | | `raw` |`string`| | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- @@ -43,10 +43,10 @@ layout: manual | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: [`Identifier`](/docs/kcl/types/Identifier)| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `name` |`string`| | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- @@ -62,12 +62,12 @@ layout: manual | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: `BinaryExpression`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `operator` |[`BinaryOperator`](/docs/kcl/types/BinaryOperator)| | No | | `left` |[`BinaryPart`](/docs/kcl/types/BinaryPart)| | No | | `right` |[`BinaryPart`](/docs/kcl/types/BinaryPart)| | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- @@ -83,12 +83,12 @@ layout: manual | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: `CallExpression`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `callee` |[`Identifier`](/docs/kcl/types/Identifier)| | No | | `arguments` |`[` [`Expr`](/docs/kcl/types/Expr) `]`| | No | | `optional` |`boolean`| | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- @@ -104,11 +104,11 @@ layout: manual | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: `UnaryExpression`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `operator` |[`UnaryOperator`](/docs/kcl/types/UnaryOperator)| | No | | `argument` |[`BinaryPart`](/docs/kcl/types/BinaryPart)| | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- @@ -124,12 +124,12 @@ layout: manual | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: `MemberExpression`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `object` |[`MemberObject`](/docs/kcl/types/MemberObject)| | No | | `property` |[`LiteralIdentifier`](/docs/kcl/types/LiteralIdentifier)| | No | | `computed` |`boolean`| | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- @@ -145,13 +145,13 @@ layout: manual | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: `IfExpression`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `cond` |[`Expr`](/docs/kcl/types/Expr)| | No | | `then_val` |[`Program`](/docs/kcl/types/Program)| | No | | `else_ifs` |`[` [`ElseIf`](/docs/kcl/types/ElseIf) `]`| | No | | `final_else` |[`Program`](/docs/kcl/types/Program)| | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- diff --git a/docs/kcl/types/BodyItem.md b/docs/kcl/types/BodyItem.md index 38982b74a..c4ba6365b 100644 --- a/docs/kcl/types/BodyItem.md +++ b/docs/kcl/types/BodyItem.md @@ -23,12 +23,12 @@ layout: manual | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: `ImportStatement`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `items` |`[` [`ImportItem`](/docs/kcl/types/ImportItem) `]`| | No | | `path` |`string`| | No | | `raw_path` |`string`| | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- @@ -44,10 +44,10 @@ layout: manual | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: `ExpressionStatement`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `expression` |[`Expr`](/docs/kcl/types/Expr)| | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- @@ -63,12 +63,12 @@ layout: manual | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: `VariableDeclaration`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `declarations` |`[` [`VariableDeclarator`](/docs/kcl/types/VariableDeclarator) `]`| | No | | `visibility` |[`ItemVisibility`](/docs/kcl/types/ItemVisibility)| | No | | `kind` |[`VariableKind`](/docs/kcl/types/VariableKind)| | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- @@ -84,10 +84,10 @@ layout: manual | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: `ReturnStatement`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `argument` |[`Expr`](/docs/kcl/types/Expr)| | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- diff --git a/docs/kcl/types/ElseIf.md b/docs/kcl/types/ElseIf.md index 20f3f6bbe..edccce20f 100644 --- a/docs/kcl/types/ElseIf.md +++ b/docs/kcl/types/ElseIf.md @@ -15,10 +15,10 @@ layout: manual | Property | Type | Description | Required | |----------|------|-------------|----------| -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `cond` |[`Expr`](/docs/kcl/types/Expr)| | No | | `then_val` |[`Program`](/docs/kcl/types/Program)| | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | diff --git a/docs/kcl/types/Environment.md b/docs/kcl/types/Environment.md index d2ed592d9..0a02b3970 100644 --- a/docs/kcl/types/Environment.md +++ b/docs/kcl/types/Environment.md @@ -16,6 +16,6 @@ layout: manual | Property | Type | Description | Required | |----------|------|-------------|----------| | `bindings` |`object`| | No | -| `parent` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | +| `parent` |`integer`| | No | diff --git a/docs/kcl/types/Expr.md b/docs/kcl/types/Expr.md index 6f708b237..70acbedff 100644 --- a/docs/kcl/types/Expr.md +++ b/docs/kcl/types/Expr.md @@ -24,11 +24,11 @@ An expression can be evaluated to yield a single KCL value. | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: `Literal`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `value` |[`LiteralValue`](/docs/kcl/types/LiteralValue)| An expression can be evaluated to yield a single KCL value. | No | | `raw` |`string`| | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- @@ -44,10 +44,10 @@ An expression can be evaluated to yield a single KCL value. | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: [`Identifier`](/docs/kcl/types/Identifier)| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `name` |`string`| | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- @@ -63,10 +63,10 @@ An expression can be evaluated to yield a single KCL value. | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: [`TagDeclarator`](/docs/kcl/types#tag-declaration)| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `value` |`string`| | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- @@ -82,12 +82,12 @@ An expression can be evaluated to yield a single KCL value. | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: `BinaryExpression`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `operator` |[`BinaryOperator`](/docs/kcl/types/BinaryOperator)| An expression can be evaluated to yield a single KCL value. | No | | `left` |[`BinaryPart`](/docs/kcl/types/BinaryPart)| An expression can be evaluated to yield a single KCL value. | No | | `right` |[`BinaryPart`](/docs/kcl/types/BinaryPart)| An expression can be evaluated to yield a single KCL value. | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- @@ -103,11 +103,11 @@ An expression can be evaluated to yield a single KCL value. | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: [`FunctionExpression`](/docs/kcl/types/FunctionExpression)| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `params` |`[` [`Parameter`](/docs/kcl/types/Parameter) `]`| | No | | `body` |[`Program`](/docs/kcl/types/Program)| An expression can be evaluated to yield a single KCL value. | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- @@ -123,12 +123,12 @@ An expression can be evaluated to yield a single KCL value. | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: `CallExpression`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `callee` |[`Identifier`](/docs/kcl/types/Identifier)| An expression can be evaluated to yield a single KCL value. | No | | `arguments` |`[` [`Expr`](/docs/kcl/types/Expr) `]`| | No | | `optional` |`boolean`| | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- @@ -144,11 +144,11 @@ An expression can be evaluated to yield a single KCL value. | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: `PipeExpression`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `body` |`[` [`Expr`](/docs/kcl/types/Expr) `]`| | No | | `nonCodeMeta` |[`NonCodeMeta`](/docs/kcl/types/NonCodeMeta)| An expression can be evaluated to yield a single KCL value. | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- @@ -164,9 +164,9 @@ An expression can be evaluated to yield a single KCL value. | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: `PipeSubstitution`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- @@ -182,11 +182,11 @@ An expression can be evaluated to yield a single KCL value. | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: `ArrayExpression`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `elements` |`[` [`Expr`](/docs/kcl/types/Expr) `]`| | No | | `nonCodeMeta` |[`NonCodeMeta`](/docs/kcl/types/NonCodeMeta)| An expression can be evaluated to yield a single KCL value. | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- @@ -202,12 +202,12 @@ An expression can be evaluated to yield a single KCL value. | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: `ArrayRangeExpression`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `startElement` |[`Expr`](/docs/kcl/types/Expr)| An expression can be evaluated to yield a single KCL value. | No | | `endElement` |[`Expr`](/docs/kcl/types/Expr)| An expression can be evaluated to yield a single KCL value. | No | | `endInclusive` |`boolean`| Is the `end_element` included in the range? | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- @@ -223,11 +223,11 @@ An expression can be evaluated to yield a single KCL value. | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: `ObjectExpression`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `properties` |`[` [`ObjectProperty`](/docs/kcl/types/ObjectProperty) `]`| | No | | `nonCodeMeta` |[`NonCodeMeta`](/docs/kcl/types/NonCodeMeta)| An expression can be evaluated to yield a single KCL value. | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- @@ -243,12 +243,12 @@ An expression can be evaluated to yield a single KCL value. | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: `MemberExpression`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `object` |[`MemberObject`](/docs/kcl/types/MemberObject)| An expression can be evaluated to yield a single KCL value. | No | | `property` |[`LiteralIdentifier`](/docs/kcl/types/LiteralIdentifier)| An expression can be evaluated to yield a single KCL value. | No | | `computed` |`boolean`| | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- @@ -264,11 +264,11 @@ An expression can be evaluated to yield a single KCL value. | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: `UnaryExpression`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `operator` |[`UnaryOperator`](/docs/kcl/types/UnaryOperator)| An expression can be evaluated to yield a single KCL value. | No | | `argument` |[`BinaryPart`](/docs/kcl/types/BinaryPart)| An expression can be evaluated to yield a single KCL value. | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- @@ -284,13 +284,13 @@ An expression can be evaluated to yield a single KCL value. | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: `IfExpression`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `cond` |[`Expr`](/docs/kcl/types/Expr)| An expression can be evaluated to yield a single KCL value. | No | | `then_val` |[`Program`](/docs/kcl/types/Program)| An expression can be evaluated to yield a single KCL value. | No | | `else_ifs` |`[` [`ElseIf`](/docs/kcl/types/ElseIf) `]`| | No | | `final_else` |[`Program`](/docs/kcl/types/Program)| An expression can be evaluated to yield a single KCL value. | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- @@ -307,8 +307,8 @@ KCL value for an optional parameter which was not given an argument. (remember, | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: `None`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- diff --git a/docs/kcl/types/FunctionExpression.md b/docs/kcl/types/FunctionExpression.md index 5ad84fc1d..e112b4f42 100644 --- a/docs/kcl/types/FunctionExpression.md +++ b/docs/kcl/types/FunctionExpression.md @@ -15,10 +15,10 @@ layout: manual | Property | Type | Description | Required | |----------|------|-------------|----------| -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `params` |`[` [`Parameter`](/docs/kcl/types/Parameter) `]`| | No | | `body` |[`Program`](/docs/kcl/types/Program)| | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | diff --git a/docs/kcl/types/Identifier.md b/docs/kcl/types/Identifier.md index a07e5a9ae..47c039c3f 100644 --- a/docs/kcl/types/Identifier.md +++ b/docs/kcl/types/Identifier.md @@ -15,9 +15,9 @@ layout: manual | Property | Type | Description | Required | |----------|------|-------------|----------| -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `name` |`string`| | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | diff --git a/docs/kcl/types/ImportItem.md b/docs/kcl/types/ImportItem.md index 393fe9fd9..78d21704d 100644 --- a/docs/kcl/types/ImportItem.md +++ b/docs/kcl/types/ImportItem.md @@ -17,8 +17,8 @@ layout: manual |----------|------|-------------|----------| | `name` |[`Identifier`](/docs/kcl/types/Identifier)| Name of the item to import. | No | | `alias` |[`Identifier`](/docs/kcl/types/Identifier)| Rename the item using an identifier after "as". | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | diff --git a/docs/kcl/types/KclValue.md b/docs/kcl/types/KclValue.md index 280a85263..91914ffd4 100644 --- a/docs/kcl/types/KclValue.md +++ b/docs/kcl/types/KclValue.md @@ -59,10 +59,10 @@ Any KCL value. | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: [`TagDeclarator`](/docs/kcl/types#tag-declaration)| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `value` |`string`| | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- diff --git a/docs/kcl/types/LiteralIdentifier.md b/docs/kcl/types/LiteralIdentifier.md index 654d7e501..006877fc9 100644 --- a/docs/kcl/types/LiteralIdentifier.md +++ b/docs/kcl/types/LiteralIdentifier.md @@ -23,10 +23,10 @@ layout: manual | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: [`Identifier`](/docs/kcl/types/Identifier)| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `name` |`string`| | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- @@ -42,11 +42,11 @@ layout: manual | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: `Literal`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `value` |[`LiteralValue`](/docs/kcl/types/LiteralValue)| | No | | `raw` |`string`| | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- diff --git a/docs/kcl/types/MemberObject.md b/docs/kcl/types/MemberObject.md index 568ab0bc2..4d37ff2da 100644 --- a/docs/kcl/types/MemberObject.md +++ b/docs/kcl/types/MemberObject.md @@ -23,12 +23,12 @@ layout: manual | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: `MemberExpression`| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `object` |[`MemberObject`](/docs/kcl/types/MemberObject)| | No | | `property` |[`LiteralIdentifier`](/docs/kcl/types/LiteralIdentifier)| | No | | `computed` |`boolean`| | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- @@ -44,10 +44,10 @@ layout: manual | Property | Type | Description | Required | |----------|------|-------------|----------| | `type` |enum: [`Identifier`](/docs/kcl/types/Identifier)| | No | -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `name` |`string`| | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | ---- diff --git a/docs/kcl/types/NonCodeMeta.md b/docs/kcl/types/NonCodeMeta.md index 14b14d4c8..afa406f7d 100644 --- a/docs/kcl/types/NonCodeMeta.md +++ b/docs/kcl/types/NonCodeMeta.md @@ -16,7 +16,7 @@ layout: manual | Property | Type | Description | Required | |----------|------|-------------|----------| | `nonCodeNodes` |`object`| | No | -| `start` |`[` [`NonCodeNode`](/docs/kcl/types/NonCodeNode) `]`| | No | +| `startNodes` |`[` [`NonCodeNode`](/docs/kcl/types/NonCodeNode) `]`| | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | diff --git a/docs/kcl/types/NonCodeNode.md b/docs/kcl/types/NonCodeNode.md index 2209de97a..6554cf765 100644 --- a/docs/kcl/types/NonCodeNode.md +++ b/docs/kcl/types/NonCodeNode.md @@ -15,9 +15,9 @@ layout: manual | Property | Type | Description | Required | |----------|------|-------------|----------| -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `value` |[`NonCodeValue`](/docs/kcl/types/NonCodeValue)| | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | diff --git a/docs/kcl/types/ObjectProperty.md b/docs/kcl/types/ObjectProperty.md index 57b1ea331..9e7ae87c1 100644 --- a/docs/kcl/types/ObjectProperty.md +++ b/docs/kcl/types/ObjectProperty.md @@ -15,10 +15,10 @@ layout: manual | Property | Type | Description | Required | |----------|------|-------------|----------| -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `key` |[`Identifier`](/docs/kcl/types/Identifier)| | No | | `value` |[`Expr`](/docs/kcl/types/Expr)| | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | diff --git a/docs/kcl/types/Program.md b/docs/kcl/types/Program.md index b33b63e9b..4865c7cf8 100644 --- a/docs/kcl/types/Program.md +++ b/docs/kcl/types/Program.md @@ -16,10 +16,10 @@ A KCL program top level, or function body. | Property | Type | Description | Required | |----------|------|-------------|----------| -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `body` |`[` [`BodyItem`](/docs/kcl/types/BodyItem) `]`| | No | | `nonCodeMeta` |[`NonCodeMeta`](/docs/kcl/types/NonCodeMeta)| A KCL program top level, or function body. | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | diff --git a/docs/kcl/types/ProgramMemory.md b/docs/kcl/types/ProgramMemory.md index b6bd5c095..f69bec185 100644 --- a/docs/kcl/types/ProgramMemory.md +++ b/docs/kcl/types/ProgramMemory.md @@ -16,7 +16,7 @@ layout: manual | Property | Type | Description | Required | |----------|------|-------------|----------| | `environments` |`[` [`Environment`](/docs/kcl/types/Environment) `]`| | No | -| `currentEnv` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | +| `currentEnv` |`integer`| | No | | `return` |[`KclValue`](/docs/kcl/types/KclValue)| | No | diff --git a/docs/kcl/types/VariableDeclarator.md b/docs/kcl/types/VariableDeclarator.md index 5af68d91a..1f7f88a28 100644 --- a/docs/kcl/types/VariableDeclarator.md +++ b/docs/kcl/types/VariableDeclarator.md @@ -15,10 +15,10 @@ layout: manual | Property | Type | Description | Required | |----------|------|-------------|----------| -| `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | -| `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)| | No | | `id` |[`Identifier`](/docs/kcl/types/Identifier)| The identifier of the variable. | No | | `init` |[`Expr`](/docs/kcl/types/Expr)| The value of the variable. | No | | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | +| `start` |`integer`| | No | +| `end` |`integer`| | No | diff --git a/public/kcl-samples-manifest-fallback.json b/public/kcl-samples-manifest-fallback.json index 5731b173b..de6867795 100644 --- a/public/kcl-samples-manifest-fallback.json +++ b/public/kcl-samples-manifest-fallback.json @@ -34,6 +34,11 @@ "title": "Car Wheel Assembly", "description": "A car wheel assembly with a rotor, tire, and lug nuts." }, + { + "file": "dodecahedron.kcl", + "title": "Hollow Dodecahedron", + "description": "A regular dodecahedron or pentagonal dodecahedron is a dodecahedron composed of regular pentagonal faces, three meeting at each vertex. This example shows constructing the individual faces of the dodecahedron and extruding inwards." + }, { "file": "enclosure.kcl", "title": "Enclosure", @@ -54,6 +59,11 @@ "title": "A mounting bracket for the Focusrite Scarlett Solo audio interface", "description": "This is a bracket that holds an audio device underneath a desk or shelf. The audio device has dimensions of 144mm wide, 80mm length and 45mm depth with fillets of 6mm. This mounting bracket is designed to be 3D printed with PLA material" }, + { + "file": "food-service-spatula.kcl", + "title": "Food Service Spatula", + "description": "Use these spatulas for mixing, flipping, and scraping." + }, { "file": "french-press.kcl", "title": "French Press", @@ -61,7 +71,7 @@ }, { "file": "gear.kcl", - "title": "Gear", + "title": "Spur Gear", "description": "A rotating machine part having cut teeth or, in the case of a cogwheel, inserted teeth (called cogs), which mesh with another toothed part to transmit torque. Geared devices can change the speed, torque, and direction of a power source. The two elements that define a gear are its circular shape and the teeth that are integrated into its outer edge, which are designed to fit into the teeth of another gear." }, { diff --git a/src/clientSideScene/ClientSideSceneComp.tsx b/src/clientSideScene/ClientSideSceneComp.tsx index 7a545cce8..a4870decb 100644 --- a/src/clientSideScene/ClientSideSceneComp.tsx +++ b/src/clientSideScene/ClientSideSceneComp.tsx @@ -44,6 +44,7 @@ import { import { ActionButton } from 'components/ActionButton' import { err, reportRejection, trap } from 'lib/trap' import { useCommandsContext } from 'hooks/useCommandsContext' +import { Node } from 'wasm-lib/kcl/bindings/Node' function useShouldHideScene(): { hideClient: boolean; hideServer: boolean } { const [isCamMoving, setIsCamMoving] = useState(false) @@ -201,7 +202,7 @@ const Overlay = ({ let xAlignment = overlay.angle < 0 ? '0%' : '-100%' let yAlignment = overlay.angle < -90 || overlay.angle >= 90 ? '0%' : '-100%' - const _node1 = getNodeFromPath( + const _node1 = getNodeFromPath>( kclManager.ast, overlay.pathToNode, 'CallExpression' @@ -381,7 +382,7 @@ export async function deleteSegment({ pathToNode: PathToNode sketchDetails: SketchDetails | null }) { - let modifiedAst: Program | Error = kclManager.ast + let modifiedAst: Node | Error = kclManager.ast const dependentRanges = findUsesOfTagInPipe(modifiedAst, pathToNode) const shouldContinueSegDelete = dependentRanges.length diff --git a/src/clientSideScene/sceneEntities.ts b/src/clientSideScene/sceneEntities.ts index 0fd371751..788b2fe0f 100644 --- a/src/clientSideScene/sceneEntities.ts +++ b/src/clientSideScene/sceneEntities.ts @@ -92,6 +92,7 @@ import { err, reportRejection, trap } from 'lib/trap' import { CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer' import { Point3d } from 'wasm-lib/kcl/bindings/Point3d' import { SegmentInputs } from 'lang/std/stdTypes' +import { Node } from 'wasm-lib/kcl/bindings/Node' type DraftSegment = 'line' | 'tangentialArcTo' @@ -374,14 +375,14 @@ export class SceneEntities { selectionRanges, }: { sketchPathToNode: PathToNode - maybeModdedAst: Program + maybeModdedAst: Node draftExpressionsIndices?: { start: number; end: number } forward: [number, number, number] up: [number, number, number] position?: [number, number, number] selectionRanges?: Selections }): Promise<{ - truncatedAst: Program + truncatedAst: Node programMemoryOverride: ProgramMemory sketch: Sketch variableDeclarationName: string @@ -566,7 +567,7 @@ export class SceneEntities { } updateAstAndRejigSketch = async ( sketchPathToNode: PathToNode, - modifiedAst: Program | Error, + modifiedAst: Node | Error, forward: [number, number, number], up: [number, number, number], origin: [number, number, number] @@ -1202,7 +1203,7 @@ export class SceneEntities { } prepareTruncatedMemoryAndAst = ( sketchPathToNode: PathToNode, - ast?: Program, + ast?: Node, draftSegment?: DraftSegment ) => prepareTruncatedMemoryAndAst( @@ -1223,7 +1224,7 @@ export class SceneEntities { sketchPathToNode: PathToNode intersects: Intersection>[] draftInfo?: { - truncatedAst: Program + truncatedAst: Node programMemoryOverride: ProgramMemory variableDeclarationName: string } @@ -1259,7 +1260,7 @@ export class SceneEntities { const dragTo: [number, number] = [intersection2d.x, intersection2d.y] let modifiedAst = draftInfo ? draftInfo.truncatedAst : { ...kclManager.ast } - const _node = getNodeFromPath( + const _node = getNodeFromPath>( modifiedAst, pathToNode, 'CallExpression' @@ -1271,7 +1272,7 @@ export class SceneEntities { let modded: | { - modifiedAst: Program + modifiedAst: Node pathToNode: PathToNode } | Error @@ -1566,7 +1567,7 @@ export class SceneEntities { if (parent?.userData?.pathToNode) { const updatedAst = parse(recast(kclManager.ast)) if (trap(updatedAst)) return - const _node = getNodeFromPath( + const _node = getNodeFromPath>( updatedAst, parent.userData.pathToNode, 'CallExpression' @@ -1701,12 +1702,12 @@ export type DefaultPlaneStr = 'XY' | 'XZ' | 'YZ' | '-XY' | '-XZ' | '-YZ' function prepareTruncatedMemoryAndAst( sketchPathToNode: PathToNode, - ast: Program, + ast: Node, programMemory: ProgramMemory, draftSegment?: DraftSegment ): | { - truncatedAst: Program + truncatedAst: Node programMemoryOverride: ProgramMemory variableDeclarationName: string } @@ -1714,7 +1715,7 @@ function prepareTruncatedMemoryAndAst( const bodyIndex = Number(sketchPathToNode?.[1]?.[0]) || 0 const _ast = structuredClone(ast) - const _node = getNodeFromPath( + const _node = getNodeFromPath>( _ast, sketchPathToNode || [], 'VariableDeclaration' @@ -1764,15 +1765,15 @@ function prepareTruncatedMemoryAndAst( ).body.slice(-1)[0].start = lastPipeItem.start _ast.end = lastPipeItem.end - const varDec = _ast.body[bodyIndex] as VariableDeclaration + const varDec = _ast.body[bodyIndex] as Node varDec.end = lastPipeItem.end const declarator = varDec.declarations[0] declarator.end = lastPipeItem.end - const init = declarator.init as PipeExpression + const init = declarator.init as Node init.end = lastPipeItem.end init.body.slice(-1)[0].end = lastPipeItem.end } - const truncatedAst: Program = { + const truncatedAst: Node = { ..._ast, body: [structuredClone(_ast.body[bodyIndex])], } diff --git a/src/components/ModelingMachineProvider.tsx b/src/components/ModelingMachineProvider.tsx index 137ba8bf9..7b6a41898 100644 --- a/src/components/ModelingMachineProvider.tsx +++ b/src/components/ModelingMachineProvider.tsx @@ -91,6 +91,7 @@ import { submitAndAwaitTextToKcl } from 'lib/textToCad' import { useFileContext } from 'hooks/useFileContext' import { uuidv4 } from 'lib/utils' import { IndexLoaderData } from 'lib/types' +import { Node } from 'wasm-lib/kcl/bindings/Node' type MachineContext = { state: StateFrom @@ -971,7 +972,7 @@ export const ModelingMachineProvider = ({ }) let parsed = parse(recast(kclManager.ast)) if (trap(parsed)) return Promise.reject(parsed) - parsed = parsed as Program + parsed = parsed as Node const { modifiedAst: _modifiedAst, pathToReplacedNode } = moveValueIntoNewVariablePath( @@ -982,7 +983,7 @@ export const ModelingMachineProvider = ({ ) parsed = parse(recast(_modifiedAst)) if (trap(parsed)) return Promise.reject(parsed) - parsed = parsed as Program + parsed = parsed as Node if (!pathToReplacedNode) return Promise.reject(new Error('No path to replaced node')) diff --git a/src/components/Toolbar/EqualLength.tsx b/src/components/Toolbar/EqualLength.tsx index 23b27bc79..63c96d448 100644 --- a/src/components/Toolbar/EqualLength.tsx +++ b/src/components/Toolbar/EqualLength.tsx @@ -14,6 +14,7 @@ import { import { TransformInfo } from 'lang/std/stdTypes' import { kclManager } from 'lib/singletons' import { err } from 'lib/trap' +import { Node } from 'wasm-lib/kcl/bindings/Node' export function setEqualLengthInfo({ selectionRanges, @@ -86,7 +87,7 @@ export function applyConstraintEqualLength({ selectionRanges: Selections }): | { - modifiedAst: Program + modifiedAst: Node pathToNodeMap: PathToNodeMap } | Error { diff --git a/src/components/Toolbar/HorzVert.tsx b/src/components/Toolbar/HorzVert.tsx index 797db49a7..967b545ac 100644 --- a/src/components/Toolbar/HorzVert.tsx +++ b/src/components/Toolbar/HorzVert.tsx @@ -13,6 +13,7 @@ import { import { TransformInfo } from 'lang/std/stdTypes' import { kclManager } from 'lib/singletons' import { err } from 'lib/trap' +import { Node } from 'wasm-lib/kcl/bindings/Node' export function horzVertInfo( selectionRanges: Selections, @@ -55,11 +56,11 @@ export function horzVertInfo( export function applyConstraintHorzVert( selectionRanges: Selections, horOrVert: 'vertical' | 'horizontal', - ast: Program, + ast: Node, programMemory: ProgramMemory ): | { - modifiedAst: Program + modifiedAst: Node pathToNodeMap: PathToNodeMap } | Error { diff --git a/src/components/Toolbar/Intersect.tsx b/src/components/Toolbar/Intersect.tsx index c2cd833e8..6d31cb009 100644 --- a/src/components/Toolbar/Intersect.tsx +++ b/src/components/Toolbar/Intersect.tsx @@ -19,6 +19,7 @@ import { createVariableDeclaration } from '../../lang/modifyAst' import { removeDoubleNegatives } from '../AvailableVarsHelpers' import { kclManager } from 'lib/singletons' import { err } from 'lib/trap' +import { Node } from 'wasm-lib/kcl/bindings/Node' const getModalInfo = createInfoModal(GetInfoModal) @@ -136,7 +137,7 @@ export async function applyConstraintIntersect({ }: { selectionRanges: Selections }): Promise<{ - modifiedAst: Program + modifiedAst: Node pathToNodeMap: PathToNodeMap }> { const info = intersectInfo({ diff --git a/src/components/Toolbar/RemoveConstrainingValues.tsx b/src/components/Toolbar/RemoveConstrainingValues.tsx index dd88fad01..2f9e6c5da 100644 --- a/src/components/Toolbar/RemoveConstrainingValues.tsx +++ b/src/components/Toolbar/RemoveConstrainingValues.tsx @@ -13,6 +13,7 @@ import { import { TransformInfo } from 'lang/std/stdTypes' import { kclManager } from 'lib/singletons' import { err } from 'lib/trap' +import { Node } from 'wasm-lib/kcl/bindings/Node' export function removeConstrainingValuesInfo({ selectionRanges, @@ -77,7 +78,7 @@ export function applyRemoveConstrainingValues({ pathToNodes?: Array }): | { - modifiedAst: Program + modifiedAst: Node pathToNodeMap: PathToNodeMap } | Error { diff --git a/src/components/Toolbar/SetAbsDistance.tsx b/src/components/Toolbar/SetAbsDistance.tsx index decae9565..4da63e473 100644 --- a/src/components/Toolbar/SetAbsDistance.tsx +++ b/src/components/Toolbar/SetAbsDistance.tsx @@ -23,6 +23,7 @@ import { import { removeDoubleNegatives } from '../AvailableVarsHelpers' import { kclManager } from 'lib/singletons' import { err } from 'lib/trap' +import { Node } from 'wasm-lib/kcl/bindings/Node' const getModalInfo = createSetAngleLengthModal(SetAngleLengthModal) @@ -161,7 +162,7 @@ export function applyConstraintAxisAlign({ constraint: 'snapToYAxis' | 'snapToXAxis' }): | { - modifiedAst: Program + modifiedAst: Node pathToNodeMap: PathToNodeMap } | Error { diff --git a/src/components/Toolbar/SetHorzVertDistance.tsx b/src/components/Toolbar/SetHorzVertDistance.tsx index 428c680d2..a874fa14c 100644 --- a/src/components/Toolbar/SetHorzVertDistance.tsx +++ b/src/components/Toolbar/SetHorzVertDistance.tsx @@ -18,6 +18,7 @@ import { removeDoubleNegatives } from '../AvailableVarsHelpers' import { kclManager } from 'lib/singletons' import { Selections } from 'lib/selections' import { cleanErrs, err } from 'lib/trap' +import { Node } from 'wasm-lib/kcl/bindings/Node' const getModalInfo = createInfoModal(GetInfoModal) @@ -185,7 +186,7 @@ export function applyConstraintHorzVertAlign({ constraint: 'setHorzDistance' | 'setVertDistance' }): | { - modifiedAst: Program + modifiedAst: Node pathToNodeMap: PathToNodeMap } | Error { diff --git a/src/lang/KclSingleton.ts b/src/lang/KclSingleton.ts index 8fa47120b..4020b3e8d 100644 --- a/src/lang/KclSingleton.ts +++ b/src/lang/KclSingleton.ts @@ -21,9 +21,10 @@ import { import { getNodeFromPath } from './queryAst' import { codeManager, editorManager, sceneInfra } from 'lib/singletons' import { Diagnostic } from '@codemirror/lint' +import { Node } from 'wasm-lib/kcl/bindings/Node' interface ExecuteArgs { - ast?: Program + ast?: Node zoomToFit?: boolean executionId?: number zoomOnRangeAndType?: { @@ -33,13 +34,13 @@ interface ExecuteArgs { } export class KclManager { - private _ast: Program = { + private _ast: Node = { body: [], start: 0, end: 0, nonCodeMeta: { nonCodeNodes: {}, - start: [], + startNodes: [], }, } private _execState: ExecState = emptyExecState() @@ -55,7 +56,7 @@ export class KclManager { engineCommandManager: EngineCommandManager private _isExecutingCallback: (arg: boolean) => void = () => {} - private _astCallBack: (arg: Program) => void = () => {} + private _astCallBack: (arg: Node) => void = () => {} private _programMemoryCallBack: (arg: ProgramMemory) => void = () => {} private _logsCallBack: (arg: string[]) => void = () => {} private _kclErrorsCallBack: (arg: KCLError[]) => void = () => {} @@ -181,7 +182,7 @@ export class KclManager { setWasmInitFailed, }: { setProgramMemory: (arg: ProgramMemory) => void - setAst: (arg: Program) => void + setAst: (arg: Node) => void setLogs: (arg: string[]) => void setKclErrors: (arg: KCLError[]) => void setIsExecuting: (arg: boolean) => void @@ -205,12 +206,12 @@ export class KclManager { end: 0, nonCodeMeta: { nonCodeNodes: {}, - start: [], + startNodes: [], }, } } - safeParse(code: string): Program | null { + safeParse(code: string): Node | null { const ast = parse(code) this.lints = [] this.kclErrors = [] @@ -377,7 +378,7 @@ export class KclManager { Array.from(this.engineCommandManager.artifactGraph).forEach( ([commandId, artifact]) => { if (!('codeRef' in artifact)) return - const _node1 = getNodeFromPath( + const _node1 = getNodeFromPath>( this.ast, artifact.codeRef.pathToNode, 'CallExpression' @@ -441,7 +442,7 @@ export class KclManager { // but should probably have think about which of the function to keep // This always updates the code state and editor and writes to the file system. async updateAst( - ast: Program, + ast: Node, execute: boolean, optionalParams?: { focusPath?: Array @@ -452,7 +453,7 @@ export class KclManager { } } ): Promise<{ - newAst: Program + newAst: Node selections?: Selections }> { const newCode = recast(ast) @@ -588,7 +589,7 @@ export class KclManager { } // Determines if there is no KCL code which means it is executing a blank KCL file - _isAstEmpty(ast: Program) { + _isAstEmpty(ast: Node) { return ast.start === 0 && ast.end === 0 && ast.body.length === 0 } } diff --git a/src/lang/langHelpers.ts b/src/lang/langHelpers.ts index 138b75809..f6eddeaf5 100644 --- a/src/lang/langHelpers.ts +++ b/src/lang/langHelpers.ts @@ -12,6 +12,7 @@ import { EngineCommandManager } from 'lang/std/engineConnection' import { KCLError } from 'lang/errors' import { Diagnostic } from '@codemirror/lint' import { IdGenerator } from 'wasm-lib/kcl/bindings/IdGenerator' +import { Node } from 'wasm-lib/kcl/bindings/Node' export type ToolTip = | 'lineTo' @@ -52,7 +53,7 @@ export async function executeAst({ programMemoryOverride, idGenerator, }: { - ast: Program + ast: Node engineCommandManager: EngineCommandManager useFakeExecutor?: boolean programMemoryOverride?: ProgramMemory diff --git a/src/lang/modifyAst.test.ts b/src/lang/modifyAst.test.ts index 7bc36905f..e57402e5d 100644 --- a/src/lang/modifyAst.test.ts +++ b/src/lang/modifyAst.test.ts @@ -21,6 +21,7 @@ import { enginelessExecutor } from '../lib/testHelpers' import { findUsesOfTagInPipe, getNodePathFromSourceRange } from './queryAst' import { err } from 'lib/trap' import { SimplifiedArgDetails } from './std/stdTypes' +import { Node } from 'wasm-lib/kcl/bindings/Node' beforeAll(async () => { await initPromise @@ -109,7 +110,7 @@ describe('Testing findUniqueName', () => { { type: 'Identifier', name: 'yo07', start: 0, end: 0 }, { type: 'Identifier', name: 'yo08', start: 0, end: 0 }, { type: 'Identifier', name: 'yo09', start: 0, end: 0 }, - ] satisfies Identifier[]), + ] satisfies Node[]), 'yo', 2 ) @@ -123,7 +124,7 @@ describe('Testing addSketchTo', () => { body: [], start: 0, end: 0, - nonCodeMeta: { nonCodeNodes: {}, start: [] }, + nonCodeMeta: { nonCodeNodes: {}, startNodes: [] }, }, 'yz' ) diff --git a/src/lang/modifyAst.ts b/src/lang/modifyAst.ts index 048bdf001..aec67b79c 100644 --- a/src/lang/modifyAst.ts +++ b/src/lang/modifyAst.ts @@ -42,12 +42,13 @@ import { SimplifiedArgDetails } from './std/stdTypes' import { TagDeclarator } from 'wasm-lib/kcl/bindings/TagDeclarator' import { Models } from '@kittycad/lib' import { ExtrudeFacePlane } from 'machines/modelingMachine' +import { Node } from 'wasm-lib/kcl/bindings/Node' export function startSketchOnDefault( - node: Program, + node: Node, axis: DefaultPlaneStr, name = '' -): { modifiedAst: Program; id: string; pathToNode: PathToNode } { +): { modifiedAst: Node; id: string; pathToNode: PathToNode } { const _node = { ...node } const _name = name || findUniqueName(node, KCL_DEFAULT_CONSTANT_PREFIXES.SKETCH) @@ -76,10 +77,10 @@ export function startSketchOnDefault( } export function addStartProfileAt( - node: Program, + node: Node, pathToNode: PathToNode, at: [number, number] -): { modifiedAst: Program; pathToNode: PathToNode } | Error { +): { modifiedAst: Node; pathToNode: PathToNode } | Error { const _node1 = getNodeFromPath( node, pathToNode, @@ -114,7 +115,7 @@ export function addStartProfileAt( } export function addSketchTo( - node: Program, + node: Node, axis: 'xy' | 'xz' | 'yz', name = '' ): { modifiedAst: Program; id: string; pathToNode: PathToNode } { @@ -210,7 +211,7 @@ export function mutateArrExp(node: Expr, updateWith: ArrayExpression): boolean { export function mutateObjExpProp( node: Expr, - updateWith: Literal | ArrayExpression, + updateWith: Node | Node, key: string ): boolean { if (node.type === 'ObjectExpression') { @@ -248,13 +249,13 @@ export function mutateObjExpProp( } export function extrudeSketch( - node: Program, + node: Node, pathToNode: PathToNode, shouldPipe = false, distance: Expr = createLiteral(4) ): | { - modifiedAst: Program + modifiedAst: Node pathToNode: PathToNode pathToExtrudeArg: PathToNode } @@ -343,13 +344,13 @@ export function extrudeSketch( } export function revolveSketch( - node: Program, + node: Node, pathToNode: PathToNode, shouldPipe = false, angle: Expr = createLiteral(4) ): | { - modifiedAst: Program + modifiedAst: Node pathToNode: PathToNode pathToRevolveArg: PathToNode } @@ -439,7 +440,7 @@ export function revolveSketch( } export function sketchOnExtrudedFace( - node: Program, + node: Node, sketchPathToNode: PathToNode, extrudePathToNode: PathToNode, info: ExtrudeFacePlane['faceInfo'] = { type: 'wall' } @@ -571,7 +572,7 @@ export function splitPathAtPipeExpression(pathToNode: PathToNode): { return splitPathAtPipeExpression(pathToNode.slice(0, -1)) } -export function createLiteral(value: string | number): Literal { +export function createLiteral(value: string | number): Node { return { type: 'Literal', start: 0, @@ -581,7 +582,7 @@ export function createLiteral(value: string | number): Literal { } } -export function createTagDeclarator(value: string): TagDeclarator { +export function createTagDeclarator(value: string): Node { return { type: 'TagDeclarator', start: 0, @@ -591,7 +592,7 @@ export function createTagDeclarator(value: string): TagDeclarator { } } -export function createIdentifier(name: string): Identifier { +export function createIdentifier(name: string): Node { return { type: 'Identifier', start: 0, @@ -601,7 +602,7 @@ export function createIdentifier(name: string): Identifier { } } -export function createPipeSubstitution(): PipeSubstitution { +export function createPipeSubstitution(): Node { return { type: 'PipeSubstitution', start: 0, @@ -612,7 +613,7 @@ export function createPipeSubstitution(): PipeSubstitution { export function createCallExpressionStdLib( name: string, args: CallExpression['arguments'] -): CallExpression { +): Node { return { type: 'CallExpression', start: 0, @@ -632,7 +633,7 @@ export function createCallExpressionStdLib( export function createCallExpression( name: string, args: CallExpression['arguments'] -): CallExpression { +): Node { return { type: 'CallExpression', start: 0, @@ -651,7 +652,7 @@ export function createCallExpression( export function createArrayExpression( elements: ArrayExpression['elements'] -): ArrayExpression { +): Node { return { type: 'ArrayExpression', start: 0, @@ -664,7 +665,7 @@ export function createArrayExpression( export function createPipeExpression( body: PipeExpression['body'] -): PipeExpression { +): Node { return { type: 'PipeExpression', start: 0, @@ -680,7 +681,7 @@ export function createVariableDeclaration( init: VariableDeclarator['init'], visibility: VariableDeclaration['visibility'] = 'default', kind: VariableDeclaration['kind'] = 'const' -): VariableDeclaration { +): Node { return { type: 'VariableDeclaration', start: 0, @@ -703,7 +704,7 @@ export function createVariableDeclaration( export function createObjectExpression(properties: { [key: string]: Expr -}): ObjectExpression { +}): Node { return { type: 'ObjectExpression', start: 0, @@ -724,7 +725,7 @@ export function createObjectExpression(properties: { export function createUnaryExpression( argument: UnaryExpression['argument'], operator: UnaryExpression['operator'] = '-' -): UnaryExpression { +): Node { return { type: 'UnaryExpression', start: 0, @@ -739,7 +740,7 @@ export function createBinaryExpression([left, operator, right]: [ BinaryExpression['left'], BinaryExpression['operator'], BinaryExpression['right'] -]): BinaryExpression { +]): Node { return { type: 'BinaryExpression', start: 0, @@ -754,19 +755,19 @@ export function createBinaryExpression([left, operator, right]: [ export function createBinaryExpressionWithUnary([left, right]: [ BinaryExpression['left'], BinaryExpression['right'] -]): BinaryExpression { +]): Node { if (right.type === 'UnaryExpression' && right.operator === '-') return createBinaryExpression([left, '-', right.argument]) return createBinaryExpression([left, '+', right]) } export function giveSketchFnCallTag( - ast: Program, + ast: Node, range: Selection['range'], tag?: string ): | { - modifiedAst: Program + modifiedAst: Node tag: string isTagExisting: boolean pathToNode: PathToNode @@ -801,7 +802,7 @@ export function giveSketchFnCallTag( } export function moveValueIntoNewVariablePath( - ast: Program, + ast: Node, programMemory: ProgramMemory, pathToNode: PathToNode, variableName: string @@ -834,12 +835,12 @@ export function moveValueIntoNewVariablePath( } export function moveValueIntoNewVariable( - ast: Program, + ast: Node, programMemory: ProgramMemory, sourceRange: Selection['range'], variableName: string ): { - modifiedAst: Program + modifiedAst: Node pathToReplacedNode?: PathToNode } { const meta = isNodeSafeToReplace(ast, sourceRange) @@ -872,17 +873,17 @@ export function moveValueIntoNewVariable( */ export function deleteSegmentFromPipeExpression( dependentRanges: SourceRange[], - modifiedAst: Program, + modifiedAst: Node, programMemory: ProgramMemory, code: string, pathToNode: PathToNode -): Program | Error { +): Node | Error { let _modifiedAst = structuredClone(modifiedAst) dependentRanges.forEach((range) => { const path = getNodePathFromSourceRange(_modifiedAst, range) - const callExp = getNodeFromPath( + const callExp = getNodeFromPath>( _modifiedAst, path, 'CallExpression', @@ -928,11 +929,11 @@ export function deleteSegmentFromPipeExpression( export function removeSingleConstraintInfo( pathToCallExp: PathToNode, argDetails: SimplifiedArgDetails, - ast: Program, + ast: Node, programMemory: ProgramMemory ): | { - modifiedAst: Program + modifiedAst: Node pathToNodeMap: PathToNodeMap } | false { @@ -954,12 +955,12 @@ export function removeSingleConstraintInfo( } export async function deleteFromSelection( - ast: Program, + ast: Node, selection: Selection, programMemory: ProgramMemory, getFaceDetails: (id: string) => Promise = () => ({} as any) -): Promise { +): Promise | Error> { const astClone = structuredClone(ast) const range = selection.range const path = getNodePathFromSourceRange(ast, range) @@ -1134,5 +1135,5 @@ export async function deleteFromSelection( } const nonCodeMetaEmpty = () => { - return { nonCodeNodes: {}, start: [] } + return { nonCodeNodes: {}, startNodes: [], start: 0, end: 0 } } diff --git a/src/lang/modifyAst/addFillet.ts b/src/lang/modifyAst/addFillet.ts index 47be3940b..e8a5ec0de 100644 --- a/src/lang/modifyAst/addFillet.ts +++ b/src/lang/modifyAst/addFillet.ts @@ -36,11 +36,12 @@ import { getSweepFromSuspectedPath, } from 'lang/std/artifactGraph' import { kclManager, engineCommandManager, editorManager } from 'lib/singletons' +import { Node } from 'wasm-lib/kcl/bindings/Node' // Apply Fillet To Selection export function applyFilletToSelection( - ast: Program, + ast: Node, selection: Selections, radius: KclCommandValue ): void | Error { @@ -55,10 +56,10 @@ export function applyFilletToSelection( } export function modifyAstCloneWithFilletAndTag( - ast: Program, + ast: Node, selection: Selections, radius: KclCommandValue -): { modifiedAst: Program; pathToFilletNode: Array } | Error { +): { modifiedAst: Node; pathToFilletNode: Array } | Error { let clonedAst = structuredClone(ast) const clonedAstForGetExtrude = structuredClone(ast) @@ -246,7 +247,7 @@ export function getPathToExtrudeForSegmentSelection( } async function updateAstAndFocus( - modifiedAst: Program, + modifiedAst: Node, pathToFilletNode: Array ) { const updatedAst = await kclManager.updateAst(modifiedAst, true, { @@ -258,7 +259,7 @@ async function updateAstAndFocus( } function mutateAstWithTagForSketchSegment( - astClone: Program, + astClone: Node, pathToSegmentNode: PathToNode ): { modifiedAst: Program; tag: string } | Error { const segmentNode = getNodeFromPath( @@ -292,7 +293,7 @@ function mutateAstWithTagForSketchSegment( function getEdgeTagCall( tag: string, selectionType: string -): Identifier | CallExpression { +): Node { let tagCall: Expr = createIdentifier(tag) // Modify the tag based on selectionType @@ -426,7 +427,7 @@ export const hasValidFilletSelection = ({ code, }: { selectionRanges: Selections - ast: Program + ast: Node code: string }) => { // check if there is anything filletable in the scene @@ -454,7 +455,7 @@ export const hasValidFilletSelection = ({ for (const selection of selectionRanges.codeBasedSelections) { // check if all selections are in sketchLineHelperMap const path = getNodePathFromSourceRange(ast, selection.range) - const segmentNode = getNodeFromPath( + const segmentNode = getNodeFromPath>( ast, path, 'CallExpression' @@ -534,7 +535,7 @@ export const isTagUsedInFillet = ({ ast, callExp, }: { - ast: Program + ast: Node callExp: CallExpression }): Array => { const tag = getTagFromCallExpression(callExp) diff --git a/src/lang/queryAst.ts b/src/lang/queryAst.ts index 6b91a76d1..1c0f01423 100644 --- a/src/lang/queryAst.ts +++ b/src/lang/queryAst.ts @@ -29,6 +29,7 @@ import { } from './std/sketchcombos' import { err } from 'lib/trap' import { ImportStatement } from 'wasm-lib/kcl/bindings/ImportStatement' +import { Node } from 'wasm-lib/kcl/bindings/Node' /** * Retrieves a node from a given path within a Program node structure, optionally stopping at a specified node type. @@ -121,12 +122,13 @@ export function getNodeFromPathCurry( } function moreNodePathFromSourceRange( - node: + node: Node< | Expr | ImportStatement | ExpressionStatement | VariableDeclaration - | ReturnStatement, + | ReturnStatement + >, sourceRange: Selection['range'], previousPath: PathToNode = [['body', '']] ): PathToNode { @@ -344,15 +346,16 @@ export function getNodePathFromSourceRange( return path } -type KCLNode = +type KCLNode = Node< | Expr | ExpressionStatement | VariableDeclaration | VariableDeclarator | ReturnStatement +> export function traverse( - node: KCLNode | Program, + node: KCLNode | Node, option: { enter?: (node: KCLNode, pathToNode: PathToNode) => void leave?: (node: KCLNode) => void @@ -512,9 +515,9 @@ export function findAllPreviousVariables( } type ReplacerFn = ( - _ast: Program, + _ast: Node, varName: string -) => { modifiedAst: Program; pathToReplaced: PathToNode } | Error +) => { modifiedAst: Node; pathToReplaced: PathToNode } | Error export function isNodeSafeToReplacePath( ast: Program, @@ -583,12 +586,12 @@ export function isNodeSafeToReplacePath( } export function isNodeSafeToReplace( - ast: Program, + ast: Node, sourceRange: [number, number] ): | { isSafe: boolean - value: Expr + value: Node replacer: ReplacerFn } | Error { @@ -837,7 +840,7 @@ export function findUsesOfTagInPipe( ? String(thirdParam.value) : thirdParam.name - const varDec = getNodeFromPath( + const varDec = getNodeFromPath>( ast, pathToNode, 'VariableDeclaration' @@ -898,7 +901,7 @@ export function hasSketchPipeBeenExtruded(selection: Selection, ast: Program) { } /** File must contain at least one sketch that has not been extruded already */ -export function doesSceneHaveSweepableSketch(ast: Program) { +export function doesSceneHaveSweepableSketch(ast: Node) { const theMap: any = {} traverse(ast as any, { enter(node) { diff --git a/src/lang/std/sketch.test.ts b/src/lang/std/sketch.test.ts index 37ca212c7..09079a9a3 100644 --- a/src/lang/std/sketch.test.ts +++ b/src/lang/std/sketch.test.ts @@ -17,6 +17,7 @@ import { import { getNodeFromPath, getNodePathFromSourceRange } from '../queryAst' import { enginelessExecutor } from '../../lib/testHelpers' import { err } from 'lib/trap' +import { Node } from 'wasm-lib/kcl/bindings/Node' const eachQuad: [number, [number, number]][] = [ [-315, [1, 1]], @@ -687,7 +688,7 @@ describe('testing getConstraintInfo', () => { ] if (err(ast)) return ast const pathToNode = getNodePathFromSourceRange(ast, sourceRange) - const callExp = getNodeFromPath( + const callExp = getNodeFromPath>( ast, pathToNode, 'CallExpression' @@ -841,7 +842,7 @@ describe('testing getConstraintInfo', () => { ] if (err(ast)) return ast const pathToNode = getNodePathFromSourceRange(ast, sourceRange) - const callExp = getNodeFromPath( + const callExp = getNodeFromPath>( ast, pathToNode, 'CallExpression' @@ -1197,7 +1198,7 @@ describe('testing getConstraintInfo', () => { ] if (err(ast)) return ast const pathToNode = getNodePathFromSourceRange(ast, sourceRange) - const callExp = getNodeFromPath( + const callExp = getNodeFromPath>( ast, pathToNode, 'CallExpression' diff --git a/src/lang/std/sketch.ts b/src/lang/std/sketch.ts index f1fb7699d..db64c5e03 100644 --- a/src/lang/std/sketch.ts +++ b/src/lang/std/sketch.ts @@ -55,6 +55,7 @@ import { err } from 'lib/trap' import { perpendicularDistance } from 'sketch-helpers' import { TagDeclarator } from 'wasm-lib/kcl/bindings/TagDeclarator' import { EdgeCutInfo } from 'machines/modelingMachine' +import { Node } from 'wasm-lib/kcl/bindings/Node' const STRAIGHT_SEGMENT_ERR = new Error( 'Invalid input, expected "straight-segment"' @@ -1785,7 +1786,7 @@ export const angledLineThatIntersects: SketchLineHelper = { ) } if (intersectTag !== -1) { - const tag = firstArg.properties[intersectTag]?.value as Identifier + const tag = firstArg.properties[intersectTag]?.value as Node const pathToTagProp: PathToNode = [ ...pathToObjectExp, [intersectTag, 'index'], @@ -1825,7 +1826,9 @@ export const updateStartProfileAtArgs: SketchLineHelper['updateArgs'] = ({ body: [], nonCodeMeta: { - start: [], + start: 0, + end: 0, + startNodes: [], nonCodeNodes: [], }, }, @@ -1865,7 +1868,7 @@ export const sketchLineHelperMap: { [key: string]: SketchLineHelper } = { } as const export function changeSketchArguments( - node: Program, + node: Node, programMemory: ProgramMemory, sourceRangeOrPath: | { @@ -1877,7 +1880,7 @@ export function changeSketchArguments( pathToNode: PathToNode }, input: SegmentInputs -): { modifiedAst: Program; pathToNode: PathToNode } | Error { +): { modifiedAst: Node; pathToNode: PathToNode } | Error { const _node = { ...node } const thePath = sourceRangeOrPath.type === 'sourceRange' @@ -1906,7 +1909,7 @@ export function changeSketchArguments( } export function getConstraintInfo( - callExpression: CallExpression, + callExpression: Node, code: string, pathToNode: PathToNode ): ConstrainInfo[] { @@ -1944,7 +1947,7 @@ export function compareVec2Epsilon2( } interface CreateLineFnCallArgs { - node: Program + node: Node programMemory: ProgramMemory input: SegmentInputs fnName: ToolTip @@ -1961,7 +1964,7 @@ export function addNewSketchLn({ spliceBetween = false, }: CreateLineFnCallArgs): | { - modifiedAst: Program + modifiedAst: Node pathToNode: PathToNode } | Error { @@ -1971,8 +1974,12 @@ export function addNewSketchLn({ return new Error('not a sketch line helper') } - getNodeFromPath(node, pathToNode, 'VariableDeclarator') - getNodeFromPath( + getNodeFromPath>( + node, + pathToNode, + 'VariableDeclarator' + ) + getNodeFromPath>( node, pathToNode, 'PipeExpression' @@ -1991,13 +1998,13 @@ export function addCallExpressionsToPipe({ pathToNode, expressions, }: { - node: Program + node: Node programMemory: ProgramMemory pathToNode: PathToNode - expressions: CallExpression[] + expressions: Node[] }) { const _node = { ...node } - const pipeExpression = getNodeFromPath( + const pipeExpression = getNodeFromPath>( _node, pathToNode, 'PipeExpression' @@ -2046,7 +2053,7 @@ export function replaceSketchLine({ replaceExistingCallback, referencedSegment, }: { - node: Program + node: Node programMemory: ProgramMemory pathToNode: PathToNode fnName: ToolTip @@ -2055,7 +2062,7 @@ export function replaceSketchLine({ referencedSegment?: Path }): | { - modifiedAst: Program + modifiedAst: Node valueUsedInTransform?: number pathToNode: PathToNode } @@ -2107,7 +2114,7 @@ function addTagToChamfer( edgeCutMeta: EdgeCutInfo | null ): | { - modifiedAst: Program + modifiedAst: Node tag: string } | Error { @@ -2234,7 +2241,7 @@ export function addTagForSketchOnFace( edgeCutMeta: EdgeCutInfo | null ): | { - modifiedAst: Program + modifiedAst: Node tag: string } | Error { @@ -2272,12 +2279,14 @@ function isAngleLiteral(lineArugement: Expr): boolean { : false } -type addTagFn = (a: AddTagInfo) => { modifiedAst: Program; tag: string } | Error +type addTagFn = ( + a: AddTagInfo +) => { modifiedAst: Node; tag: string } | Error function addTag(tagIndex = 2): addTagFn { return ({ node, pathToNode }) => { const _node = { ...node } - const callExpr = getNodeFromPath( + const callExpr = getNodeFromPath>( _node, pathToNode, 'CallExpression' diff --git a/src/lang/std/sketchcombos.ts b/src/lang/std/sketchcombos.ts index f9ea371a5..21ec43b78 100644 --- a/src/lang/std/sketchcombos.ts +++ b/src/lang/std/sketchcombos.ts @@ -49,6 +49,7 @@ import { getSketchSegmentFromSourceRange, } from './sketchConstraints' import { getAngle, roundOff, normaliseAngle } from '../../lib/utils' +import { Node } from 'wasm-lib/kcl/bindings/Node' export type LineInputsType = | 'xAbsolute' @@ -325,7 +326,7 @@ const setHorzVertDistanceCreateNode = if (isUndef(refNum) || err(literalArg)) return REF_NUM_ERR const valueUsedInTransform = roundOff(literalArg - refNum, 2) - let finalValue: Expr = createBinaryExpressionWithUnary([ + let finalValue: Node = createBinaryExpressionWithUnary([ createSegEnd(referenceSegName, !index), forceValueUsedInTransform || createLiteral(valueUsedInTransform), ]) @@ -1541,7 +1542,7 @@ export function transformSecondarySketchLinesTagFirst({ forceSegName, forceValueUsedInTransform, }: { - ast: Program + ast: Node selectionRanges: Selections transformInfos: TransformInfo[] programMemory: ProgramMemory @@ -1549,7 +1550,7 @@ export function transformSecondarySketchLinesTagFirst({ forceValueUsedInTransform?: BinaryPart }): | { - modifiedAst: Program + modifiedAst: Node valueUsedInTransform?: number pathToNodeMap: PathToNodeMap tagInfo: { @@ -1620,7 +1621,7 @@ export function transformAstSketchLines({ forceValueUsedInTransform, referencedSegmentRange, }: { - ast: Program + ast: Node selectionRanges: Selections | PathToNode[] transformInfos: TransformInfo[] programMemory: ProgramMemory @@ -1629,7 +1630,7 @@ export function transformAstSketchLines({ referencedSegmentRange?: Selection['range'] }): | { - modifiedAst: Program + modifiedAst: Node valueUsedInTransform?: number pathToNodeMap: PathToNodeMap } @@ -1647,7 +1648,7 @@ export function transformAstSketchLines({ const getNode = getNodeFromPathCurry(node, _pathToNode) - const callExp = getNode('CallExpression') + const callExp = getNode>('CallExpression') if (err(callExp)) return callExp const varDec = getNode('VariableDeclarator') if (err(varDec)) return varDec @@ -1806,13 +1807,16 @@ function createSegAngle(referenceSegName: string): BinaryPart { return createCallExpression('segAng', [createIdentifier(referenceSegName)]) } -function createSegEnd(referenceSegName: string, isX: boolean): CallExpression { +function createSegEnd( + referenceSegName: string, + isX: boolean +): Node { return createCallExpression(isX ? 'segEndX' : 'segEndY', [ createIdentifier(referenceSegName), ]) } -function createLastSeg(isX: boolean): CallExpression { +function createLastSeg(isX: boolean): Node { return createCallExpression(isX ? 'lastSegX' : 'lastSegY', [ createPipeSubstitution(), ]) @@ -1830,7 +1834,7 @@ export function getConstraintLevelFromSourceRange( ast: Program | Error ): Error | { range: [number, number]; level: ConstraintLevel } { if (err(ast)) return ast - const nodeMeta = getNodeFromPath( + const nodeMeta = getNodeFromPath>( ast, getNodePathFromSourceRange(ast, cursorRange), 'CallExpression' diff --git a/src/lang/std/stdTypes.ts b/src/lang/std/stdTypes.ts index fb9dcbb97..add077935 100644 --- a/src/lang/std/stdTypes.ts +++ b/src/lang/std/stdTypes.ts @@ -11,16 +11,17 @@ import { BinaryPart, } from '../wasm' import { LineInputsType } from './sketchcombos' +import { Node } from 'wasm-lib/kcl/bindings/Node' export interface ModifyAstBase { - node: Program + node: Node // TODO #896: Remove ProgramMemory from this interface previousProgramMemory: ProgramMemory pathToNode: PathToNode } export interface AddTagInfo { - node: Program + node: Node pathToNode: PathToNode } @@ -134,7 +135,7 @@ type _InputArg = * Which is why a union type is used that can be type narrowed using the {@link RawArg.type} property * {@link RawArg.expr} is common to all of these types */ -export type InputArg = _InputArg +export type InputArg = _InputArg> /** * {@link RawArg.expr} is the literal equivalent of whatever current expression is @@ -142,7 +143,7 @@ export type InputArg = _InputArg * but of course works for expressions like myVar + someFn() etc too * This is useful in cases where we want to "un-constrain" inputs to segments */ -type RawArg = _InputArg +type RawArg = _InputArg> export type InputArgs = Array @@ -186,7 +187,7 @@ export type CreateStdLibSketchCallExpr = (args: { inputs: InputArgs rawArgs: RawArgs referenceSegName: string - tag?: Expr + tag?: Node forceValueUsedInTransform?: BinaryPart referencedSegment?: Path }) => CreatedSketchExprResult | Error @@ -215,26 +216,26 @@ export interface ConstrainInfo { export interface SketchLineHelper { add: (a: addCall) => | { - modifiedAst: Program + modifiedAst: Node pathToNode: PathToNode valueUsedInTransform?: number } | Error updateArgs: (a: updateArgs) => | { - modifiedAst: Program + modifiedAst: Node pathToNode: PathToNode } | Error getTag: (a: CallExpression) => string | Error addTag: (a: AddTagInfo) => | { - modifiedAst: Program + modifiedAst: Node tag: string } | Error getConstraintInfo: ( - callExp: CallExpression, + callExp: Node, code: string, pathToNode: PathToNode ) => ConstrainInfo[] diff --git a/src/lang/wasm.test.ts b/src/lang/wasm.test.ts new file mode 100644 index 000000000..ea9be578f --- /dev/null +++ b/src/lang/wasm.test.ts @@ -0,0 +1,13 @@ +import { err } from 'lib/trap' +import { parse } from './wasm' +import { enginelessExecutor } from 'lib/testHelpers' + +it('can execute parsed AST', async () => { + const code = `x = 1 +// A comment.` + const ast = parse(code) + expect(err(ast)).toEqual(false) + const execState = await enginelessExecutor(ast) + expect(err(ast)).toEqual(false) + expect(execState.memory.get('x')?.value).toEqual(1) +}) diff --git a/src/lang/wasm.ts b/src/lang/wasm.ts index 705c9c555..adacac41d 100644 --- a/src/lang/wasm.ts +++ b/src/lang/wasm.ts @@ -42,6 +42,7 @@ import { ExecState as RawExecState } from '../wasm-lib/kcl/bindings/ExecState' import { ProgramMemory as RawProgramMemory } from '../wasm-lib/kcl/bindings/ProgramMemory' import { EnvironmentRef } from '../wasm-lib/kcl/bindings/EnvironmentRef' import { Environment } from '../wasm-lib/kcl/bindings/Environment' +import { Node } from 'wasm-lib/kcl/bindings/Node' export type { Program } from '../wasm-lib/kcl/bindings/Program' export type { Expr } from '../wasm-lib/kcl/bindings/Expr' @@ -122,11 +123,11 @@ export const initPromise = initialise() export const rangeTypeFix = (ranges: number[][]): [number, number][] => ranges.map(([start, end]) => [start, end]) -export const parse = (code: string | Error): Program | Error => { +export const parse = (code: string | Error): Node | Error => { if (err(code)) return code try { - const program: Program = parse_wasm(code) + const program: Node = parse_wasm(code) return program } catch (e: any) { // throw e @@ -378,7 +379,7 @@ export function sketchFromKclValue( } export const executor = async ( - node: Program, + node: Node, programMemory: ProgramMemory | Error = ProgramMemory.empty(), idGenerator: IdGenerator = defaultIdGenerator(), engineCommandManager: EngineCommandManager, @@ -402,7 +403,7 @@ export const executor = async ( } export const _executor = async ( - node: Program, + node: Node, programMemory: ProgramMemory | Error = ProgramMemory.empty(), idGenerator: IdGenerator = defaultIdGenerator(), engineCommandManager: EngineCommandManager, @@ -493,13 +494,13 @@ export function lexer(str: string): Token[] | Error { export const modifyAstForSketch = async ( engineCommandManager: EngineCommandManager, - ast: Program, + ast: Node, variableName: string, currentPlane: string, engineId: string -): Promise => { +): Promise> => { try { - const updatedAst: Program = await modify_ast_for_sketch_wasm( + const updatedAst: Node = await modify_ast_for_sketch_wasm( engineCommandManager, JSON.stringify(ast), variableName, diff --git a/src/lib/commandTypes.ts b/src/lib/commandTypes.ts index 72d0ab9b1..9371c7834 100644 --- a/src/lib/commandTypes.ts +++ b/src/lib/commandTypes.ts @@ -6,6 +6,7 @@ import { Identifier, Expr, VariableDeclaration } from 'lang/wasm' import { commandBarMachine } from 'machines/commandBarMachine' import { ReactNode } from 'react' import { MachineManager } from 'components/MachineManagerProvider' +import { Node } from 'wasm-lib/kcl/bindings/Node' type Icon = CustomIconName const PLATFORMS = ['both', 'web', 'desktop'] as const @@ -24,8 +25,8 @@ export interface KclExpression { } export interface KclExpressionWithVariable extends KclExpression { variableName: string - variableDeclarationAst: VariableDeclaration - variableIdentifierAst: Identifier + variableDeclarationAst: Node + variableIdentifierAst: Node insertIndex: number } export type KclCommandValue = KclExpression | KclExpressionWithVariable diff --git a/src/lib/selections.ts b/src/lib/selections.ts index 0e1ff2a15..ca165569a 100644 --- a/src/lib/selections.ts +++ b/src/lib/selections.ts @@ -36,6 +36,7 @@ import { getWallCodeRef, ArtifactId, } from 'lang/std/artifactGraph' +import { Node } from 'wasm-lib/kcl/bindings/Node' export const X_AXIS_UUID = 'ad792545-7fd3-482a-a602-a93924e3055b' export const Y_AXIS_UUID = '680fd157-266f-4b8a-984f-cdf46b8bdf01' @@ -244,7 +245,7 @@ export function getEventForSegmentSelection( const updatedAst = parse(codeManager.code) if (err(updatedAst)) return null - const nodeMeta = getNodeFromPath( + const nodeMeta = getNodeFromPath>( updatedAst, pathToNode, 'CallExpression' @@ -362,7 +363,7 @@ function updateSceneObjectColors(codeBasedSelections: Selection[]) { Object.values(sceneEntitiesManager.activeSegments).forEach((segmentGroup) => { if (!SEGMENT_BODIES_PLUS_PROFILE_START.includes(segmentGroup?.name)) return - const nodeMeta = getNodeFromPath( + const nodeMeta = getNodeFromPath>( updated, segmentGroup.userData.pathToNode, 'CallExpression' diff --git a/src/lib/testHelpers.ts b/src/lib/testHelpers.ts index e93b28a34..3b311a4f0 100644 --- a/src/lib/testHelpers.ts +++ b/src/lib/testHelpers.ts @@ -17,6 +17,7 @@ import { DefaultPlanes } from 'wasm-lib/kcl/bindings/DefaultPlanes' import { err, reportRejection } from 'lib/trap' import { toSync } from './utils' import { IdGenerator } from 'wasm-lib/kcl/bindings/IdGenerator' +import { Node } from 'wasm-lib/kcl/bindings/Node' type WebSocketResponse = Models['WebSocketResponse_type'] @@ -84,7 +85,7 @@ class MockEngineCommandManager { } export async function enginelessExecutor( - ast: Program | Error, + ast: Node | Error, pm: ProgramMemory | Error = ProgramMemory.empty(), idGenerator: IdGenerator = defaultIdGenerator() ): Promise { @@ -109,7 +110,7 @@ export async function enginelessExecutor( } export async function executor( - ast: Program, + ast: Node, pm: ProgramMemory = ProgramMemory.empty(), idGenerator: IdGenerator = defaultIdGenerator() ): Promise { diff --git a/src/wasm-lib/kcl-macros/tests/macro_test.rs b/src/wasm-lib/kcl-macros/tests/macro_test.rs index d4124bcc3..19408eb7e 100644 --- a/src/wasm-lib/kcl-macros/tests/macro_test.rs +++ b/src/wasm-lib/kcl-macros/tests/macro_test.rs @@ -1,6 +1,6 @@ extern crate alloc; use kcl_lib::ast::types::{ - BodyItem, Expr, Identifier, ItemVisibility, Literal, LiteralValue, NonCodeMeta, Program, VariableDeclaration, + BodyItem, Expr, Identifier, ItemVisibility, Literal, LiteralValue, Node, Program, VariableDeclaration, VariableDeclarator, VariableKind, }; use kcl_macros::parse; @@ -9,36 +9,46 @@ use pretty_assertions::assert_eq; #[test] fn basic() { let actual = parse!("const y = 4"); - let expected = Program { - start: 0, - end: 11, - body: vec![BodyItem::VariableDeclaration(Box::new(VariableDeclaration { - start: 0, - end: 11, - declarations: vec![VariableDeclarator { - start: 6, - end: 11, - id: Identifier { - start: 6, - end: 7, - name: "y".to_owned(), + let expected = Node { + inner: Program { + body: vec![BodyItem::VariableDeclaration(Box::new(Node::new( + VariableDeclaration { + declarations: vec![Node::new( + VariableDeclarator { + id: Node::new( + Identifier { + name: "y".to_owned(), + digest: None, + }, + 6, + 7, + ), + init: Expr::Literal(Box::new(Node::new( + Literal { + value: LiteralValue::IInteger(4), + raw: "4".to_owned(), + digest: None, + }, + 10, + 11, + ))), + digest: None, + }, + 6, + 11, + )], + visibility: ItemVisibility::Default, + kind: VariableKind::Const, digest: None, }, - init: Expr::Literal(Box::new(Literal { - start: 10, - end: 11, - value: LiteralValue::IInteger(4), - raw: "4".to_owned(), - digest: None, - })), - digest: None, - }], - visibility: ItemVisibility::Default, - kind: VariableKind::Const, + 0, + 11, + )))], + non_code_meta: Default::default(), digest: None, - }))], - non_code_meta: NonCodeMeta::default(), - digest: None, + }, + start: 0, + end: 11, }; assert_eq!(expected, actual); } diff --git a/src/wasm-lib/kcl/src/ast/modify.rs b/src/wasm-lib/kcl/src/ast/modify.rs index 195296639..432bb8cc6 100644 --- a/src/wasm-lib/kcl/src/ast/modify.rs +++ b/src/wasm-lib/kcl/src/ast/modify.rs @@ -16,6 +16,8 @@ use crate::{ executor::{Point2d, SourceRange}, }; +use super::types::Node; + type Point3d = kcmc::shared::Point3d; #[derive(Debug)] @@ -35,7 +37,7 @@ const EPSILON: f64 = 0.015625; // or 2^-6 /// a move or a new line. pub async fn modify_ast_for_sketch( engine: &Arc>, - program: &mut Program, + program: &mut Node, // The name of the sketch. sketch_name: &str, // The type of plane the sketch is on. `XY` or `XZ`, etc @@ -195,7 +197,7 @@ fn create_start_sketch_on( end: [f64; 2], plane: crate::executor::PlaneType, additional_lines: Vec<[f64; 2]>, -) -> Result { +) -> Result, KclError> { let start_sketch_on = CallExpression::new("startSketchOn", vec![Literal::new(plane.to_string().into()).into()])?; let start_profile_at = CallExpression::new( "startProfileAt", diff --git a/src/wasm-lib/kcl/src/ast/types.rs b/src/wasm-lib/kcl/src/ast/types.rs index 0f30dfca0..e197f149d 100644 --- a/src/wasm-lib/kcl/src/ast/types.rs +++ b/src/wasm-lib/kcl/src/ast/types.rs @@ -2,7 +2,8 @@ use std::{ collections::HashMap, - ops::RangeInclusive, + fmt, + ops::{Deref, DerefMut, RangeInclusive}, sync::{Arc, Mutex}, }; @@ -41,17 +42,111 @@ use digest::Digest; pub enum Definition<'a> { Variable(&'a VariableDeclarator), - Import(&'a ImportStatement), + Import(NodeRef<'a, ImportStatement>), } +#[derive(Debug, Default, Clone, Deserialize, Serialize, PartialEq, Eq, ts_rs::TS, Bake)] +#[databake(path = kcl_lib::ast::types)] +#[ts(export)] +pub struct Node { + #[serde(flatten)] + pub inner: T, + pub start: usize, + pub end: usize, +} + +impl schemars::JsonSchema for Node { + fn schema_name() -> String { + T::schema_name() + } + + fn json_schema(gen: &mut schemars::gen::SchemaGenerator) -> schemars::schema::Schema { + let mut child = T::json_schema(gen).into_object(); + // We want to add the start and end fields to the schema. + // Ideally we would add _any_ extra fields from the Node type automatically + // but this is a bit hard since this isn't a macro. + let Some(ref mut object) = &mut child.object else { + // This should never happen. But it will panic at compile time of docs if it does. + // Which is better than runtime. + panic!("Expected object schema for {}", T::schema_name()); + }; + object.properties.insert("start".to_string(), usize::json_schema(gen)); + object.properties.insert("end".to_string(), usize::json_schema(gen)); + + schemars::schema::Schema::Object(child.clone()) + } +} + +impl Node { + pub fn new(inner: T, start: usize, end: usize) -> Self { + Self { inner, start, end } + } + + pub fn no_src(inner: T) -> Self { + Self { + inner, + start: 0, + end: 0, + } + } + + pub fn boxed(inner: T, start: usize, end: usize) -> BoxNode { + Box::new(Node { inner, start, end }) + } + + pub fn as_source_ranges(&self) -> Vec { + vec![SourceRange([self.start, self.end])] + } +} + +impl Deref for Node { + type Target = T; + + fn deref(&self) -> &Self::Target { + &self.inner + } +} + +impl DerefMut for Node { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.inner + } +} + +impl fmt::Display for Node { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.inner.fmt(f) + } +} + +impl From> for crate::executor::SourceRange { + fn from(v: Node) -> Self { + Self([v.start, v.end]) + } +} + +impl From<&Node> for crate::executor::SourceRange { + fn from(v: &Node) -> Self { + Self([v.start, v.end]) + } +} + +impl From<&BoxNode> for crate::executor::SourceRange { + fn from(v: &BoxNode) -> Self { + Self([v.start, v.end]) + } +} + +pub type BoxNode = Box>; +pub type NodeList = Vec>; +pub type NodeRef<'a, T> = &'a Node; + /// A KCL program top level, or function body. #[derive(Debug, Default, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] #[databake(path = kcl_lib::ast::types)] #[ts(export)] #[serde(rename_all = "camelCase")] pub struct Program { - pub start: usize, - pub end: usize, pub body: Vec, #[serde(default, skip_serializing_if = "NonCodeMeta::is_empty")] pub non_code_meta: NonCodeMeta, @@ -61,35 +156,45 @@ pub struct Program { pub digest: Option, } -impl Program { - /// Is the last body item an expression? - pub fn ends_with_expr(&self) -> bool { - let Some(ref last) = self.body.last() else { - return false; - }; - matches!(last, BodyItem::ExpressionStatement(_)) +impl Node { + /// Walk the ast and get all the variables and tags as completion items. + pub fn completion_items<'a>(&'a self) -> Result> { + let completions = Arc::new(Mutex::new(vec![])); + crate::walk::walk(self, &|node: crate::walk::Node<'a>| { + let mut findings = completions.lock().map_err(|_| anyhow::anyhow!("mutex"))?; + match node { + crate::walk::Node::TagDeclarator(tag) => { + findings.push(tag.into()); + } + crate::walk::Node::VariableDeclaration(variable) => { + findings.extend::>(variable.into()); + } + _ => {} + } + Ok(true) + })?; + let x = completions.lock().unwrap(); + Ok(x.clone()) } - pub fn get_hover_value_for_position(&self, pos: usize, code: &str) -> Option { - // Check if we are in the non code meta. - if let Some(meta) = self.get_non_code_meta_for_position(pos) { - for node in &meta.start { - if node.contains(pos) { - // We only care about the shebang. - if let NonCodeValue::Shebang { value: _ } = &node.value { - let source_range: SourceRange = node.into(); - return Some(Hover::Comment { - value: r#"The `#!` at the start of a script, known as a shebang, specifies the path to the interpreter that should execute the script. This line is not necessary for your `kcl` to run in the modeling-app. You can safely delete it. If you wish to learn more about what you _can_ do with a shebang, read this doc: [zoo.dev/docs/faq/shebang](https://zoo.dev/docs/faq/shebang)."#.to_string(), - range: source_range.to_lsp_range(code), - }); - } + /// Returns all the lsp symbols in the program. + pub fn get_lsp_symbols<'a>(&'a self, code: &str) -> Result> { + let symbols = Arc::new(Mutex::new(vec![])); + crate::walk::walk(self, &|node: crate::walk::Node<'a>| { + let mut findings = symbols.lock().map_err(|_| anyhow::anyhow!("mutex"))?; + match node { + crate::walk::Node::TagDeclarator(tag) => { + findings.extend::>(tag.get_lsp_symbols(code)); } + crate::walk::Node::VariableDeclaration(variable) => { + findings.extend::>(variable.get_lsp_symbols(code)); + } + _ => {} } - } - - let value = self.get_expr_for_position(pos)?; - - value.get_hover_value_for_position(pos, code) + Ok(true) + })?; + let x = symbols.lock().unwrap(); + Ok(x.clone()) } /// Check the provided Program for any lint findings. @@ -120,25 +225,37 @@ impl Program { } Ok(findings) } +} - /// Walk the ast and get all the variables and tags as completion items. - pub fn completion_items<'a>(&'a self) -> Result> { - let completions = Arc::new(Mutex::new(vec![])); - crate::walk::walk(self, &|node: crate::walk::Node<'a>| { - let mut findings = completions.lock().map_err(|_| anyhow::anyhow!("mutex"))?; - match node { - crate::walk::Node::TagDeclarator(tag) => { - findings.push(tag.into()); +impl Program { + /// Is the last body item an expression? + pub fn ends_with_expr(&self) -> bool { + let Some(ref last) = self.body.last() else { + return false; + }; + matches!(last, BodyItem::ExpressionStatement(_)) + } + + pub fn get_hover_value_for_position(&self, pos: usize, code: &str) -> Option { + // Check if we are in the non code meta. + if let Some(meta) = self.get_non_code_meta_for_position(pos) { + for node in &meta.start_nodes { + if node.contains(pos) { + // We only care about the shebang. + if let NonCodeValue::Shebang { value: _ } = &node.value { + let source_range: SourceRange = node.into(); + return Some(Hover::Comment { + value: r#"The `#!` at the start of a script, known as a shebang, specifies the path to the interpreter that should execute the script. This line is not necessary for your `kcl` to run in the modeling-app. You can safely delete it. If you wish to learn more about what you _can_ do with a shebang, read this doc: [zoo.dev/docs/faq/shebang](https://zoo.dev/docs/faq/shebang)."#.to_string(), + range: source_range.to_lsp_range(code), + }); + } } - crate::walk::Node::VariableDeclaration(variable) => { - findings.extend::>(variable.into()); - } - _ => {} } - Ok(true) - })?; - let x = completions.lock().unwrap(); - Ok(x.clone()) + } + + let value = self.get_expr_for_position(pos)?; + + value.get_hover_value_for_position(pos, code) } /// Returns the body item that includes the given character position. @@ -207,26 +324,6 @@ impl Program { None } - /// Returns all the lsp symbols in the program. - pub fn get_lsp_symbols<'a>(&'a self, code: &str) -> Result> { - let symbols = Arc::new(Mutex::new(vec![])); - crate::walk::walk(self, &|node: crate::walk::Node<'a>| { - let mut findings = symbols.lock().map_err(|_| anyhow::anyhow!("mutex"))?; - match node { - crate::walk::Node::TagDeclarator(tag) => { - findings.extend::>(tag.get_lsp_symbols(code)); - } - crate::walk::Node::VariableDeclaration(variable) => { - findings.extend::>(variable.get_lsp_symbols(code)); - } - _ => {} - } - Ok(true) - })?; - let x = symbols.lock().unwrap(); - Ok(x.clone()) - } - // Return all the lsp folding ranges in the program. pub fn get_lsp_folding_ranges(&self) -> Vec { let mut ranges = vec![]; @@ -338,7 +435,7 @@ impl Program { } /// Replace a variable declaration with the given name with a new one. - pub fn replace_variable(&mut self, name: &str, declarator: VariableDeclarator) { + pub fn replace_variable(&mut self, name: &str, declarator: Node) { for item in &mut self.body { match item { BodyItem::ImportStatement(_) => { @@ -407,73 +504,33 @@ impl Program { } } -pub trait ValueMeta { - fn start(&self) -> usize; - - fn end(&self) -> usize; -} - -macro_rules! impl_value_meta { - {$name:ident} => { - impl crate::ast::types::ValueMeta for $name { - fn start(&self) -> usize { - self.start - } - - fn end(&self) -> usize { - self.end - } - } - - impl From<$name> for crate::executor::SourceRange { - fn from(v: $name) -> Self { - Self([v.start, v.end]) - } - } - - impl From<&$name> for crate::executor::SourceRange { - fn from(v: &$name) -> Self { - Self([v.start, v.end]) - } - } - - impl From<&Box<$name>> for crate::executor::SourceRange { - fn from(v: &Box<$name>) -> Self { - Self([v.start, v.end]) - } - } - }; -} - -pub(crate) use impl_value_meta; - #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] #[databake(path = kcl_lib::ast::types)] #[ts(export)] #[serde(tag = "type")] pub enum BodyItem { - ImportStatement(Box), - ExpressionStatement(ExpressionStatement), - VariableDeclaration(Box), - ReturnStatement(ReturnStatement), + ImportStatement(BoxNode), + ExpressionStatement(Node), + VariableDeclaration(BoxNode), + ReturnStatement(Node), } impl BodyItem { pub fn start(&self) -> usize { match self { - BodyItem::ImportStatement(stmt) => stmt.start(), - BodyItem::ExpressionStatement(expression_statement) => expression_statement.start(), - BodyItem::VariableDeclaration(variable_declaration) => variable_declaration.start(), - BodyItem::ReturnStatement(return_statement) => return_statement.start(), + BodyItem::ImportStatement(stmt) => stmt.start, + BodyItem::ExpressionStatement(expression_statement) => expression_statement.start, + BodyItem::VariableDeclaration(variable_declaration) => variable_declaration.start, + BodyItem::ReturnStatement(return_statement) => return_statement.start, } } pub fn end(&self) -> usize { match self { - BodyItem::ImportStatement(stmt) => stmt.end(), - BodyItem::ExpressionStatement(expression_statement) => expression_statement.end(), - BodyItem::VariableDeclaration(variable_declaration) => variable_declaration.end(), - BodyItem::ReturnStatement(return_statement) => return_statement.end(), + BodyItem::ImportStatement(stmt) => stmt.end, + BodyItem::ExpressionStatement(expression_statement) => expression_statement.end, + BodyItem::VariableDeclaration(variable_declaration) => variable_declaration.end, + BodyItem::ReturnStatement(return_statement) => return_statement.end, } } } @@ -496,20 +553,20 @@ impl From<&BodyItem> for SourceRange { #[ts(export)] #[serde(tag = "type")] pub enum Expr { - Literal(Box), - Identifier(Box), - TagDeclarator(Box), - BinaryExpression(Box), - FunctionExpression(Box), - CallExpression(Box), - PipeExpression(Box), - PipeSubstitution(Box), - ArrayExpression(Box), - ArrayRangeExpression(Box), - ObjectExpression(Box), - MemberExpression(Box), - UnaryExpression(Box), - IfExpression(Box), + Literal(BoxNode), + Identifier(BoxNode), + TagDeclarator(BoxNode), + BinaryExpression(BoxNode), + FunctionExpression(BoxNode), + CallExpression(BoxNode), + PipeExpression(BoxNode), + PipeSubstitution(BoxNode), + ArrayExpression(BoxNode), + ArrayRangeExpression(BoxNode), + ObjectExpression(BoxNode), + MemberExpression(BoxNode), + UnaryExpression(BoxNode), + IfExpression(BoxNode), None(KclNone), } @@ -582,40 +639,40 @@ impl Expr { pub fn start(&self) -> usize { match self { - Expr::Literal(literal) => literal.start(), - Expr::Identifier(identifier) => identifier.start(), - Expr::TagDeclarator(tag) => tag.start(), - Expr::BinaryExpression(binary_expression) => binary_expression.start(), - Expr::FunctionExpression(function_expression) => function_expression.start(), - Expr::CallExpression(call_expression) => call_expression.start(), - Expr::PipeExpression(pipe_expression) => pipe_expression.start(), - Expr::PipeSubstitution(pipe_substitution) => pipe_substitution.start(), - Expr::ArrayExpression(array_expression) => array_expression.start(), - Expr::ArrayRangeExpression(array_range) => array_range.start(), - Expr::ObjectExpression(object_expression) => object_expression.start(), - Expr::MemberExpression(member_expression) => member_expression.start(), - Expr::UnaryExpression(unary_expression) => unary_expression.start(), - Expr::IfExpression(expr) => expr.start(), + Expr::Literal(literal) => literal.start, + Expr::Identifier(identifier) => identifier.start, + Expr::TagDeclarator(tag) => tag.start, + Expr::BinaryExpression(binary_expression) => binary_expression.start, + Expr::FunctionExpression(function_expression) => function_expression.start, + Expr::CallExpression(call_expression) => call_expression.start, + Expr::PipeExpression(pipe_expression) => pipe_expression.start, + Expr::PipeSubstitution(pipe_substitution) => pipe_substitution.start, + Expr::ArrayExpression(array_expression) => array_expression.start, + Expr::ArrayRangeExpression(array_range) => array_range.start, + Expr::ObjectExpression(object_expression) => object_expression.start, + Expr::MemberExpression(member_expression) => member_expression.start, + Expr::UnaryExpression(unary_expression) => unary_expression.start, + Expr::IfExpression(expr) => expr.start, Expr::None(none) => none.start, } } pub fn end(&self) -> usize { match self { - Expr::Literal(literal) => literal.end(), - Expr::Identifier(identifier) => identifier.end(), - Expr::TagDeclarator(tag) => tag.end(), - Expr::BinaryExpression(binary_expression) => binary_expression.end(), - Expr::FunctionExpression(function_expression) => function_expression.end(), - Expr::CallExpression(call_expression) => call_expression.end(), - Expr::PipeExpression(pipe_expression) => pipe_expression.end(), - Expr::PipeSubstitution(pipe_substitution) => pipe_substitution.end(), - Expr::ArrayExpression(array_expression) => array_expression.end(), - Expr::ArrayRangeExpression(array_range) => array_range.end(), - Expr::ObjectExpression(object_expression) => object_expression.end(), - Expr::MemberExpression(member_expression) => member_expression.end(), - Expr::UnaryExpression(unary_expression) => unary_expression.end(), - Expr::IfExpression(expr) => expr.end(), + Expr::Literal(literal) => literal.end, + Expr::Identifier(identifier) => identifier.end, + Expr::TagDeclarator(tag) => tag.end, + Expr::BinaryExpression(binary_expression) => binary_expression.end, + Expr::FunctionExpression(function_expression) => function_expression.end, + Expr::CallExpression(call_expression) => call_expression.end, + Expr::PipeExpression(pipe_expression) => pipe_expression.end, + Expr::PipeSubstitution(pipe_substitution) => pipe_substitution.end, + Expr::ArrayExpression(array_expression) => array_expression.end, + Expr::ArrayRangeExpression(array_range) => array_range.end, + Expr::ObjectExpression(object_expression) => object_expression.end, + Expr::MemberExpression(member_expression) => member_expression.end, + Expr::UnaryExpression(unary_expression) => unary_expression.end, + Expr::IfExpression(expr) => expr.end, Expr::None(none) => none.end, } } @@ -715,13 +772,13 @@ impl From<&Expr> for SourceRange { #[ts(export)] #[serde(tag = "type")] pub enum BinaryPart { - Literal(Box), - Identifier(Box), - BinaryExpression(Box), - CallExpression(Box), - UnaryExpression(Box), - MemberExpression(Box), - IfExpression(Box), + Literal(BoxNode), + Identifier(BoxNode), + BinaryExpression(BoxNode), + CallExpression(BoxNode), + UnaryExpression(BoxNode), + MemberExpression(BoxNode), + IfExpression(BoxNode), } impl From for SourceRange { @@ -770,25 +827,25 @@ impl BinaryPart { pub fn start(&self) -> usize { match self { - BinaryPart::Literal(literal) => literal.start(), - BinaryPart::Identifier(identifier) => identifier.start(), - BinaryPart::BinaryExpression(binary_expression) => binary_expression.start(), - BinaryPart::CallExpression(call_expression) => call_expression.start(), - BinaryPart::UnaryExpression(unary_expression) => unary_expression.start(), - BinaryPart::MemberExpression(member_expression) => member_expression.start(), - BinaryPart::IfExpression(e) => e.start(), + BinaryPart::Literal(literal) => literal.start, + BinaryPart::Identifier(identifier) => identifier.start, + BinaryPart::BinaryExpression(binary_expression) => binary_expression.start, + BinaryPart::CallExpression(call_expression) => call_expression.start, + BinaryPart::UnaryExpression(unary_expression) => unary_expression.start, + BinaryPart::MemberExpression(member_expression) => member_expression.start, + BinaryPart::IfExpression(e) => e.start, } } pub fn end(&self) -> usize { match self { - BinaryPart::Literal(literal) => literal.end(), - BinaryPart::Identifier(identifier) => identifier.end(), - BinaryPart::BinaryExpression(binary_expression) => binary_expression.end(), - BinaryPart::CallExpression(call_expression) => call_expression.end(), - BinaryPart::UnaryExpression(unary_expression) => unary_expression.end(), - BinaryPart::MemberExpression(member_expression) => member_expression.end(), - BinaryPart::IfExpression(e) => e.end(), + BinaryPart::Literal(literal) => literal.end, + BinaryPart::Identifier(identifier) => identifier.end, + BinaryPart::BinaryExpression(binary_expression) => binary_expression.end, + BinaryPart::CallExpression(call_expression) => call_expression.end, + BinaryPart::UnaryExpression(unary_expression) => unary_expression.end, + BinaryPart::MemberExpression(member_expression) => member_expression.end, + BinaryPart::IfExpression(e) => e.end, } } @@ -836,8 +893,6 @@ impl BinaryPart { #[ts(export)] #[serde(tag = "type")] pub struct NonCodeNode { - pub start: usize, - pub end: usize, pub value: NonCodeValue, #[serde(default, skip_serializing_if = "Option::is_none")] @@ -845,33 +900,11 @@ pub struct NonCodeNode { pub digest: Option, } -impl From for SourceRange { - fn from(value: NonCodeNode) -> Self { - Self([value.start, value.end]) - } -} - -impl From<&NonCodeNode> for SourceRange { - fn from(value: &NonCodeNode) -> Self { - Self([value.start, value.end]) - } -} - -impl NonCodeNode { +impl Node { pub fn contains(&self, pos: usize) -> bool { self.start <= pos && pos <= self.end } - pub fn value(&self) -> String { - match &self.value { - NonCodeValue::Shebang { value } => value.clone(), - NonCodeValue::InlineComment { value, style: _ } => value.clone(), - NonCodeValue::BlockComment { value, style: _ } => value.clone(), - NonCodeValue::NewLineBlockComment { value, style: _ } => value.clone(), - NonCodeValue::NewLine => "\n\n".to_string(), - } - } - pub fn format(&self, indentation: &str) -> String { match &self.value { NonCodeValue::Shebang { value } => format!("{}\n\n", value), @@ -911,6 +944,18 @@ impl NonCodeNode { } } +impl NonCodeNode { + pub fn value(&self) -> String { + match &self.value { + NonCodeValue::Shebang { value } => value.clone(), + NonCodeValue::InlineComment { value, style: _ } => value.clone(), + NonCodeValue::BlockComment { value, style: _ } => value.clone(), + NonCodeValue::NewLineBlockComment { value, style: _ } => value.clone(), + NonCodeValue::NewLine => "\n\n".to_string(), + } + } +} + #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] #[databake(path = kcl_lib::ast::types)] #[ts(export)] @@ -983,8 +1028,8 @@ pub enum NonCodeValue { #[ts(export)] #[serde(rename_all = "camelCase")] pub struct NonCodeMeta { - pub non_code_nodes: HashMap>, - pub start: Vec, + pub non_code_nodes: HashMap>, + pub start_nodes: NodeList, #[serde(default, skip_serializing_if = "Option::is_none")] #[ts(optional)] @@ -994,7 +1039,7 @@ pub struct NonCodeMeta { impl NonCodeMeta { /// Does this contain anything? pub fn is_empty(&self) -> bool { - self.non_code_nodes.is_empty() && self.start.is_empty() + self.non_code_nodes.is_empty() && self.start_nodes.is_empty() } /// How many non-code values does this have? @@ -1013,8 +1058,8 @@ impl<'de> Deserialize<'de> for NonCodeMeta { #[derive(Deserialize)] #[serde(rename_all = "camelCase")] struct NonCodeMetaHelper { - non_code_nodes: HashMap>, - start: Vec, + non_code_nodes: HashMap>, + start_nodes: NodeList, } let helper = NonCodeMetaHelper::deserialize(deserializer)?; @@ -1025,19 +1070,19 @@ impl<'de> Deserialize<'de> for NonCodeMeta { .collect::, _>>()?; Ok(NonCodeMeta { non_code_nodes, - start: helper.start, + start_nodes: helper.start_nodes, digest: None, }) } } impl NonCodeMeta { - pub fn insert(&mut self, i: usize, new: NonCodeNode) { + pub fn insert(&mut self, i: usize, new: Node) { self.non_code_nodes.entry(i).or_default().push(new); } pub fn contains(&self, pos: usize) -> bool { - if self.start.iter().any(|node| node.contains(pos)) { + if self.start_nodes.iter().any(|node| node.contains(pos)) { return true; } @@ -1053,28 +1098,16 @@ impl NonCodeMeta { #[serde(tag = "type")] pub struct ImportItem { /// Name of the item to import. - pub name: Identifier, + pub name: Node, /// Rename the item using an identifier after "as". - pub alias: Option, - - pub start: usize, - pub end: usize, + pub alias: Option>, #[serde(default, skip_serializing_if = "Option::is_none")] #[ts(optional)] pub digest: Option, } -impl_value_meta!(ImportItem); - -impl ImportItem { - pub fn identifier(&self) -> &str { - match &self.alias { - Some(alias) => &alias.name, - None => &self.name.name, - } - } - +impl Node { pub fn rename_symbol(&mut self, new_name: &str, pos: usize) -> Option { match &mut self.alias { Some(alias) => { @@ -1095,6 +1128,15 @@ impl ImportItem { } } } +} + +impl ImportItem { + pub fn identifier(&self) -> &str { + match &self.alias { + Some(alias) => &alias.name, + None => &self.name.name, + } + } pub fn rename_identifiers(&mut self, old_name: &str, new_name: &str) { if let Some(alias) = &mut self.alias { @@ -1108,9 +1150,7 @@ impl ImportItem { #[ts(export)] #[serde(tag = "type")] pub struct ImportStatement { - pub start: usize, - pub end: usize, - pub items: Vec, + pub items: NodeList, pub path: String, pub raw_path: String, @@ -1119,9 +1159,7 @@ pub struct ImportStatement { pub digest: Option, } -impl_value_meta!(ImportStatement); - -impl ImportStatement { +impl Node { pub fn get_constraint_level(&self) -> ConstraintLevel { ConstraintLevel::Full { source_ranges: vec![self.into()], @@ -1140,7 +1178,9 @@ impl ImportStatement { } None } +} +impl ImportStatement { pub fn rename_identifiers(&mut self, old_name: &str, new_name: &str) { for item in &mut self.items { item.rename_identifiers(old_name, new_name); @@ -1153,8 +1193,6 @@ impl ImportStatement { #[ts(export)] #[serde(tag = "type")] pub struct ExpressionStatement { - pub start: usize, - pub end: usize, pub expression: Expr, #[serde(default, skip_serializing_if = "Option::is_none")] @@ -1162,16 +1200,12 @@ pub struct ExpressionStatement { pub digest: Option, } -impl_value_meta!(ExpressionStatement); - #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] #[databake(path = kcl_lib::ast::types)] #[ts(export)] #[serde(tag = "type")] pub struct CallExpression { - pub start: usize, - pub end: usize, - pub callee: Identifier, + pub callee: Node, pub arguments: Vec, pub optional: bool, @@ -1180,24 +1214,39 @@ pub struct CallExpression { pub digest: Option, } -impl_value_meta!(CallExpression); - -impl From for Expr { - fn from(call_expression: CallExpression) -> Self { +impl From> for Expr { + fn from(call_expression: Node) -> Self { Expr::CallExpression(Box::new(call_expression)) } } +impl Node { + /// Return the constraint level for this call expression. + pub fn get_constraint_level(&self) -> ConstraintLevel { + if self.arguments.is_empty() { + return ConstraintLevel::Ignore { + source_ranges: vec![self.into()], + }; + } + + // Iterate over the arguments and get the constraint level for each one. + let mut constraint_levels = ConstraintLevels::new(); + for arg in &self.arguments { + constraint_levels.push(arg.get_constraint_level()); + } + + constraint_levels.get_constraint_level(self.into()) + } +} + impl CallExpression { - pub fn new(name: &str, arguments: Vec) -> Result { - Ok(Self { - start: 0, - end: 0, + pub fn new(name: &str, arguments: Vec) -> Result, KclError> { + Ok(Node::no_src(Self { callee: Identifier::new(name), arguments, optional: false, digest: None, - }) + })) } /// Is at least one argument the '%' i.e. the substitution operator? @@ -1207,10 +1256,6 @@ impl CallExpression { .any(|arg| matches!(arg, Expr::PipeSubstitution(_))) } - pub fn as_source_ranges(&self) -> Vec { - vec![SourceRange([self.start, self.end])] - } - pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { for arg in &mut self.arguments { arg.replace_value(source_range, new_value.clone()); @@ -1249,23 +1294,6 @@ impl CallExpression { arg.rename_identifiers(old_name, new_name); } } - - /// Return the constraint level for this call expression. - pub fn get_constraint_level(&self) -> ConstraintLevel { - if self.arguments.is_empty() { - return ConstraintLevel::Ignore { - source_ranges: vec![self.into()], - }; - } - - // Iterate over the arguments and get the constraint level for each one. - let mut constraint_levels = ConstraintLevels::new(); - for arg in &self.arguments { - constraint_levels.push(arg.get_constraint_level()); - } - - constraint_levels.get_constraint_level(self.into()) - } } /// A function declaration. @@ -1329,9 +1357,7 @@ impl ItemVisibility { #[ts(export)] #[serde(tag = "type")] pub struct VariableDeclaration { - pub start: usize, - pub end: usize, - pub declarations: Vec, + pub declarations: NodeList, #[serde(default, skip_serializing_if = "ItemVisibility::is_default")] pub visibility: ItemVisibility, pub kind: VariableKind, // Change to enum if there are specific values @@ -1341,18 +1367,18 @@ pub struct VariableDeclaration { pub digest: Option, } -impl From<&VariableDeclaration> for Vec { - fn from(declaration: &VariableDeclaration) -> Self { +impl From<&Node> for Vec { + fn from(declaration: &Node) -> Self { let mut completions = vec![]; for variable in &declaration.declarations { completions.push(CompletionItem { label: variable.id.name.to_string(), label_details: None, - kind: Some(match declaration.kind { + kind: Some(match declaration.inner.kind { VariableKind::Const => CompletionItemKind::CONSTANT, VariableKind::Fn => CompletionItemKind::FUNCTION, }), - detail: Some(declaration.kind.to_string()), + detail: Some(declaration.inner.kind.to_string()), documentation: None, deprecated: None, preselect: None, @@ -1373,19 +1399,7 @@ impl From<&VariableDeclaration> for Vec { } } -impl_value_meta!(VariableDeclaration); - -impl VariableDeclaration { - pub fn new(declarations: Vec, visibility: ItemVisibility, kind: VariableKind) -> Self { - Self { - start: 0, - end: 0, - declarations, - visibility, - kind, - digest: None, - } - } +impl Node { pub fn get_lsp_folding_range(&self) -> Option { let recasted = self.recast(&FormatOptions::default(), 0); // If the recasted value only has one line, don't fold it. @@ -1397,15 +1411,47 @@ impl VariableDeclaration { let first_line = recasted.lines().next().unwrap().to_string(); Some(FoldingRange { - start_line: (self.start() + first_line.len()) as u32, + start_line: (self.start + first_line.len()) as u32, start_character: None, - end_line: self.end() as u32, + end_line: self.end as u32, end_character: None, kind: Some(FoldingRangeKind::Region), collapsed_text: Some(first_line), }) } + /// Rename the variable declaration at the given position. + /// This returns the old name of the variable, if it found one. + pub fn rename_symbol(&mut self, new_name: &str, pos: usize) -> Option { + // The position must be within the variable declaration. + let source_range: SourceRange = self.clone().into(); + if !source_range.contains(pos) { + return None; + } + + for declaration in &mut self.declarations { + let declaration_source_range: SourceRange = declaration.id.clone().into(); + if declaration_source_range.contains(pos) { + let old_name = declaration.id.name.clone(); + declaration.id.name = new_name.to_string(); + return Some(old_name); + } + } + + None + } +} + +impl VariableDeclaration { + pub fn new(declarations: NodeList, visibility: ItemVisibility, kind: VariableKind) -> Self { + Self { + declarations, + visibility, + kind, + digest: None, + } + } + pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { for declaration in &mut self.declarations { declaration.init.replace_value(source_range, new_value.clone()); @@ -1436,27 +1482,6 @@ impl VariableDeclaration { None } - /// Rename the variable declaration at the given position. - /// This returns the old name of the variable, if it found one. - pub fn rename_symbol(&mut self, new_name: &str, pos: usize) -> Option { - // The position must be within the variable declaration. - let source_range: SourceRange = self.clone().into(); - if !source_range.contains(pos) { - return None; - } - - for declaration in &mut self.declarations { - let declaration_source_range: SourceRange = declaration.id.clone().into(); - if declaration_source_range.contains(pos) { - let old_name = declaration.id.name.clone(); - declaration.id.name = new_name.to_string(); - return Some(old_name); - } - } - - None - } - pub fn rename_identifiers(&mut self, old_name: &str, new_name: &str) { for declaration in &mut self.declarations { // Skip the init for the variable with the new name since it is the one we are renaming. @@ -1585,10 +1610,8 @@ impl VariableKind { #[ts(export)] #[serde(tag = "type")] pub struct VariableDeclarator { - pub start: usize, - pub end: usize, /// The identifier of the variable. - pub id: Identifier, + pub id: Node, /// The value of the variable. pub init: Expr, @@ -1597,17 +1620,13 @@ pub struct VariableDeclarator { pub digest: Option, } -impl_value_meta!(VariableDeclarator); - impl VariableDeclarator { - pub fn new(name: &str, init: Expr) -> Self { - Self { - start: 0, - end: 0, + pub fn new(name: &str, init: Expr) -> Node { + Node::no_src(Self { id: Identifier::new(name), init, digest: None, - } + }) } pub fn get_constraint_level(&self) -> ConstraintLevel { @@ -1620,8 +1639,6 @@ impl VariableDeclarator { #[ts(export)] #[serde(tag = "type")] pub struct Literal { - pub start: usize, - pub end: usize, pub value: LiteralValue, pub raw: String, @@ -1630,19 +1647,7 @@ pub struct Literal { pub digest: Option, } -impl_value_meta!(Literal); - -impl Literal { - pub fn new(value: LiteralValue) -> Self { - Self { - start: 0, - end: 0, - raw: JValue::from(value.clone()).to_string(), - value, - digest: None, - } - } - +impl Node { /// Get the constraint level for this literal. /// Literals are always not constrained. pub fn get_constraint_level(&self) -> ConstraintLevel { @@ -1652,8 +1657,18 @@ impl Literal { } } -impl From for KclValue { - fn from(literal: Literal) -> Self { +impl Literal { + pub fn new(value: LiteralValue) -> Node { + Node::no_src(Self { + raw: JValue::from(value.clone()).to_string(), + value, + digest: None, + }) + } +} + +impl From> for KclValue { + fn from(literal: Node) -> Self { KclValue::UserVal(UserVal { value: JValue::from(literal.value.clone()), meta: vec![Metadata { @@ -1663,8 +1678,19 @@ impl From for KclValue { } } -impl From<&Box> for KclValue { - fn from(literal: &Box) -> Self { +impl From<&Node> for KclValue { + fn from(literal: &Node) -> Self { + KclValue::UserVal(UserVal { + value: JValue::from(literal.value.clone()), + meta: vec![Metadata { + source_range: literal.into(), + }], + }) + } +} + +impl From<&BoxNode> for KclValue { + fn from(literal: &BoxNode) -> Self { KclValue::UserVal(UserVal { value: JValue::from(literal.value.clone()), meta: vec![Metadata { @@ -1679,8 +1705,6 @@ impl From<&Box> for KclValue { #[ts(export)] #[serde(tag = "type")] pub struct Identifier { - pub start: usize, - pub end: usize, pub name: String, #[serde(default, skip_serializing_if = "Option::is_none")] @@ -1688,18 +1712,7 @@ pub struct Identifier { pub digest: Option, } -impl_value_meta!(Identifier); - -impl Identifier { - pub fn new(name: &str) -> Self { - Self { - start: 0, - end: 0, - name: name.to_string(), - digest: None, - } - } - +impl Node { /// Get the constraint level for this identifier. /// Identifier are always fully constrained. pub fn get_constraint_level(&self) -> ConstraintLevel { @@ -1707,6 +1720,15 @@ impl Identifier { source_ranges: vec![self.into()], } } +} + +impl Identifier { + pub fn new(name: &str) -> Node { + Node::no_src(Self { + name: name.to_string(), + digest: None, + }) + } /// Rename all identifiers that have the old name to the new given name. fn rename(&mut self, old_name: &str, new_name: &str) { @@ -1721,8 +1743,6 @@ impl Identifier { #[ts(export)] #[serde(tag = "type")] pub struct TagDeclarator { - pub start: usize, - pub end: usize, #[serde(rename = "value")] pub name: String, @@ -1731,34 +1751,22 @@ pub struct TagDeclarator { pub digest: Option, } -impl_value_meta!(TagDeclarator); +pub type TagNode = Node; -impl From> for SourceRange { - fn from(tag: Box) -> Self { - Self([tag.start, tag.end]) - } -} - -impl From> for Vec { - fn from(tag: Box) -> Self { - vec![tag.into()] - } -} - -impl From<&Box> for KclValue { - fn from(tag: &Box) -> Self { +impl From<&BoxNode> for KclValue { + fn from(tag: &BoxNode) -> Self { KclValue::TagDeclarator(tag.clone()) } } -impl From<&TagDeclarator> for KclValue { - fn from(tag: &TagDeclarator) -> Self { +impl From<&Node> for KclValue { + fn from(tag: &Node) -> Self { KclValue::TagDeclarator(Box::new(tag.clone())) } } -impl From<&TagDeclarator> for TagIdentifier { - fn from(tag: &TagDeclarator) -> Self { +impl From<&Node> for TagIdentifier { + fn from(tag: &Node) -> Self { TagIdentifier { value: tag.name.clone(), info: None, @@ -1769,8 +1777,8 @@ impl From<&TagDeclarator> for TagIdentifier { } } -impl From<&TagDeclarator> for CompletionItem { - fn from(tag: &TagDeclarator) -> Self { +impl From<&Node> for CompletionItem { + fn from(tag: &Node) -> Self { CompletionItem { label: tag.name.to_string(), label_details: None, @@ -1794,16 +1802,7 @@ impl From<&TagDeclarator> for CompletionItem { } } -impl TagDeclarator { - pub fn new(name: &str) -> Self { - Self { - start: 0, - end: 0, - name: name.to_string(), - digest: None, - } - } - +impl Node { /// Get the constraint level for this identifier. /// TagDeclarator are always fully constrained. pub fn get_constraint_level(&self) -> ConstraintLevel { @@ -1812,13 +1811,6 @@ impl TagDeclarator { } } - /// Rename all identifiers that have the old name to the new given name. - fn rename(&mut self, old_name: &str, new_name: &str) { - if self.name == old_name { - self.name = new_name.to_string(); - } - } - pub fn get_lsp_symbols(&self, code: &str) -> Vec { let source_range: SourceRange = self.into(); @@ -1838,39 +1830,40 @@ impl TagDeclarator { } } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] +impl TagDeclarator { + pub fn new(name: &str) -> Node { + Node::no_src(Self { + name: name.to_string(), + digest: None, + }) + } + + /// Rename all identifiers that have the old name to the new given name. + fn rename(&mut self, old_name: &str, new_name: &str) { + if self.name == old_name { + self.name = new_name.to_string(); + } + } +} + +#[derive(Debug, Default, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] #[databake(path = kcl_lib::ast::types)] #[ts(export)] #[serde(tag = "type")] pub struct PipeSubstitution { - pub start: usize, - pub end: usize, - #[serde(default, skip_serializing_if = "Option::is_none")] #[ts(optional)] pub digest: Option, } -impl_value_meta!(PipeSubstitution); - impl PipeSubstitution { - pub fn new() -> Self { - Self { - start: 0, - end: 0, - digest: None, - } + pub fn new() -> Node { + Node::no_src(Self { digest: None }) } } -impl Default for PipeSubstitution { - fn default() -> Self { - Self::new() - } -} - -impl From for Expr { - fn from(pipe_substitution: PipeSubstitution) -> Self { +impl From> for Expr { + fn from(pipe_substitution: Node) -> Self { Expr::PipeSubstitution(Box::new(pipe_substitution)) } } @@ -1880,8 +1873,6 @@ impl From for Expr { #[ts(export)] #[serde(rename_all = "camelCase", tag = "type")] pub struct ArrayExpression { - pub start: usize, - pub end: usize, pub elements: Vec, #[serde(default, skip_serializing_if = "NonCodeMeta::is_empty")] pub non_code_meta: NonCodeMeta, @@ -1891,31 +1882,13 @@ pub struct ArrayExpression { pub digest: Option, } -impl_value_meta!(ArrayExpression); - -impl From for Expr { - fn from(array_expression: ArrayExpression) -> Self { +impl From> for Expr { + fn from(array_expression: Node) -> Self { Expr::ArrayExpression(Box::new(array_expression)) } } -impl ArrayExpression { - pub fn new(elements: Vec) -> Self { - Self { - start: 0, - end: 0, - elements, - non_code_meta: Default::default(), - digest: None, - } - } - - pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { - for element in &mut self.elements { - element.replace_value(source_range, new_value.clone()); - } - } - +impl Node { pub fn get_constraint_level(&self) -> ConstraintLevel { if self.elements.is_empty() { return ConstraintLevel::Ignore { @@ -1930,6 +1903,22 @@ impl ArrayExpression { constraint_levels.get_constraint_level(self.into()) } +} + +impl ArrayExpression { + pub fn new(elements: Vec) -> Node { + Node::no_src(Self { + elements, + non_code_meta: Default::default(), + digest: None, + }) + } + + pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { + for element in &mut self.elements { + element.replace_value(source_range, new_value.clone()); + } + } /// Returns a hover value that includes the given character position. pub fn get_hover_value_for_position(&self, pos: usize, code: &str) -> Option { @@ -1956,10 +1945,8 @@ impl ArrayExpression { #[ts(export)] #[serde(rename_all = "camelCase", tag = "type")] pub struct ArrayRangeExpression { - pub start: usize, - pub end: usize, - pub start_element: Box, - pub end_element: Box, + pub start_element: Expr, + pub end_element: Expr, /// Is the `end_element` included in the range? pub end_inclusive: bool, // TODO (maybe) comments on range components? @@ -1968,31 +1955,13 @@ pub struct ArrayRangeExpression { pub digest: Option, } -impl_value_meta!(ArrayRangeExpression); - -impl From for Expr { - fn from(array_expression: ArrayRangeExpression) -> Self { +impl From> for Expr { + fn from(array_expression: Node) -> Self { Expr::ArrayRangeExpression(Box::new(array_expression)) } } -impl ArrayRangeExpression { - pub fn new(start_element: Box, end_element: Box) -> Self { - Self { - start: 0, - end: 0, - start_element, - end_element, - end_inclusive: true, - digest: None, - } - } - - pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { - self.start_element.replace_value(source_range, new_value.clone()); - self.end_element.replace_value(source_range, new_value.clone()); - } - +impl Node { pub fn get_constraint_level(&self) -> ConstraintLevel { let mut constraint_levels = ConstraintLevels::new(); constraint_levels.push(self.start_element.get_constraint_level()); @@ -2000,10 +1969,26 @@ impl ArrayRangeExpression { constraint_levels.get_constraint_level(self.into()) } +} + +impl ArrayRangeExpression { + pub fn new(start_element: Expr, end_element: Expr) -> Node { + Node::no_src(Self { + start_element, + end_element, + end_inclusive: true, + digest: None, + }) + } + + pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { + self.start_element.replace_value(source_range, new_value.clone()); + self.end_element.replace_value(source_range, new_value.clone()); + } /// Returns a hover value that includes the given character position. pub fn get_hover_value_for_position(&self, pos: usize, code: &str) -> Option { - for element in [&*self.start_element, &*self.end_element] { + for element in [&self.start_element, &self.end_element] { let element_source_range: SourceRange = element.into(); if element_source_range.contains(pos) { return element.get_hover_value_for_position(pos, code); @@ -2025,9 +2010,7 @@ impl ArrayRangeExpression { #[ts(export)] #[serde(rename_all = "camelCase", tag = "type")] pub struct ObjectExpression { - pub start: usize, - pub end: usize, - pub properties: Vec, + pub properties: NodeList, #[serde(default, skip_serializing_if = "NonCodeMeta::is_empty")] pub non_code_meta: NonCodeMeta, @@ -2036,23 +2019,7 @@ pub struct ObjectExpression { pub digest: Option, } -impl ObjectExpression { - pub fn new(properties: Vec) -> Self { - Self { - start: 0, - end: 0, - properties, - non_code_meta: Default::default(), - digest: None, - } - } - - pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { - for property in &mut self.properties { - property.value.replace_value(source_range, new_value.clone()); - } - } - +impl Node { pub fn get_constraint_level(&self) -> ConstraintLevel { if self.properties.is_empty() { return ConstraintLevel::Ignore { @@ -2067,6 +2034,22 @@ impl ObjectExpression { constraint_levels.get_constraint_level(self.into()) } +} + +impl ObjectExpression { + pub fn new(properties: NodeList) -> Node { + Node::no_src(Self { + properties, + non_code_meta: Default::default(), + digest: None, + }) + } + + pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { + for property in &mut self.properties { + property.value.replace_value(source_range, new_value.clone()); + } + } /// Returns a hover value that includes the given character position. pub fn get_hover_value_for_position(&self, pos: usize, code: &str) -> Option { @@ -2088,16 +2071,12 @@ impl ObjectExpression { } } -impl_value_meta!(ObjectExpression); - #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] #[databake(path = kcl_lib::ast::types)] #[ts(export)] #[serde(tag = "type")] pub struct ObjectProperty { - pub start: usize, - pub end: usize, - pub key: Identifier, + pub key: Node, pub value: Expr, #[serde(default, skip_serializing_if = "Option::is_none")] @@ -2105,9 +2084,7 @@ pub struct ObjectProperty { pub digest: Option, } -impl_value_meta!(ObjectProperty); - -impl ObjectProperty { +impl Node { pub fn get_lsp_symbols(&self, code: &str) -> Vec { let source_range: SourceRange = self.clone().into(); let inner_source_range: SourceRange = self.key.clone().into(); @@ -2125,7 +2102,9 @@ impl ObjectProperty { }, ] } +} +impl ObjectProperty { /// Returns a hover value that includes the given character position. pub fn get_hover_value_for_position(&self, pos: usize, code: &str) -> Option { let value_source_range: SourceRange = self.value.clone().into(); @@ -2142,8 +2121,8 @@ impl ObjectProperty { #[ts(export)] #[serde(tag = "type")] pub enum MemberObject { - MemberExpression(Box), - Identifier(Box), + MemberExpression(BoxNode), + Identifier(BoxNode), } impl MemberObject { @@ -2189,8 +2168,8 @@ impl From<&MemberObject> for SourceRange { #[ts(export)] #[serde(tag = "type")] pub enum LiteralIdentifier { - Identifier(Box), - Literal(Box), + Identifier(BoxNode), + Literal(BoxNode), } impl LiteralIdentifier { @@ -2226,8 +2205,6 @@ impl From<&LiteralIdentifier> for SourceRange { #[ts(export)] #[serde(tag = "type")] pub struct MemberExpression { - pub start: usize, - pub end: usize, pub object: MemberObject, pub property: LiteralIdentifier, pub computed: bool, @@ -2237,9 +2214,7 @@ pub struct MemberExpression { pub digest: Option, } -impl_value_meta!(MemberExpression); - -impl MemberExpression { +impl Node { /// Get the constraint level for a member expression. /// This is always fully constrained. pub fn get_constraint_level(&self) -> ConstraintLevel { @@ -2247,7 +2222,9 @@ impl MemberExpression { source_ranges: vec![self.into()], } } +} +impl MemberExpression { /// Returns a hover value that includes the given character position. pub fn get_hover_value_for_position(&self, pos: usize, code: &str) -> Option { let object_source_range: SourceRange = self.object.clone().into(); @@ -2287,8 +2264,6 @@ pub struct ObjectKeyInfo { #[ts(export)] #[serde(tag = "type")] pub struct BinaryExpression { - pub start: usize, - pub end: usize, pub operator: BinaryOperator, pub left: BinaryPart, pub right: BinaryPart, @@ -2298,25 +2273,7 @@ pub struct BinaryExpression { pub digest: Option, } -impl_value_meta!(BinaryExpression); - -impl BinaryExpression { - pub fn new(operator: BinaryOperator, left: BinaryPart, right: BinaryPart) -> Self { - Self { - start: left.start(), - end: right.end(), - operator, - left, - right, - digest: None, - } - } - - pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { - self.left.replace_value(source_range, new_value.clone()); - self.right.replace_value(source_range, new_value); - } - +impl Node { pub fn get_constraint_level(&self) -> ConstraintLevel { let left_constraint_level = self.left.get_constraint_level(); let right_constraint_level = self.right.get_constraint_level(); @@ -2326,6 +2283,22 @@ impl BinaryExpression { constraint_levels.push(right_constraint_level); constraint_levels.get_constraint_level(self.into()) } +} + +impl BinaryExpression { + pub fn new(operator: BinaryOperator, left: BinaryPart, right: BinaryPart) -> Node { + Node::no_src(Self { + operator, + left, + right, + digest: None, + }) + } + + pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { + self.left.replace_value(source_range, new_value.clone()); + self.right.replace_value(source_range, new_value); + } pub fn precedence(&self) -> u8 { self.operator.precedence() @@ -2472,8 +2445,6 @@ impl BinaryOperator { #[ts(export)] #[serde(tag = "type")] pub struct UnaryExpression { - pub start: usize, - pub end: usize, pub operator: UnaryOperator, pub argument: BinaryPart, @@ -2482,17 +2453,13 @@ pub struct UnaryExpression { pub digest: Option, } -impl_value_meta!(UnaryExpression); - impl UnaryExpression { - pub fn new(operator: UnaryOperator, argument: BinaryPart) -> Self { - Self { - start: 0, - end: argument.end(), + pub fn new(operator: UnaryOperator, argument: BinaryPart) -> Node { + Node::no_src(Self { operator, argument, digest: None, - } + }) } pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { @@ -2549,8 +2516,6 @@ impl UnaryOperator { #[ts(export)] #[serde(rename_all = "camelCase", tag = "type")] pub struct PipeExpression { - pub start: usize, - pub end: usize, // TODO: Only the first body expression can be any Value. // The rest will be CallExpression, and the AST type should reflect this. pub body: Vec, @@ -2562,31 +2527,13 @@ pub struct PipeExpression { pub digest: Option, } -impl_value_meta!(PipeExpression); - -impl From for Expr { - fn from(pipe_expression: PipeExpression) -> Self { +impl From> for Expr { + fn from(pipe_expression: Node) -> Self { Expr::PipeExpression(Box::new(pipe_expression)) } } -impl PipeExpression { - pub fn new(body: Vec) -> Self { - Self { - start: 0, - end: 0, - body, - non_code_meta: Default::default(), - digest: None, - } - } - - pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { - for value in &mut self.body { - value.replace_value(source_range, new_value.clone()); - } - } - +impl Node { pub fn get_constraint_level(&self) -> ConstraintLevel { if self.body.is_empty() { return ConstraintLevel::Ignore { @@ -2603,6 +2550,27 @@ impl PipeExpression { constraint_levels.get_constraint_level(self.into()) } + #[async_recursion] + pub async fn get_result(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result { + execute_pipe_body(exec_state, &self.body, self.into(), ctx).await + } +} + +impl PipeExpression { + pub fn new(body: Vec) -> Node { + Node::no_src(Self { + body, + non_code_meta: Default::default(), + digest: None, + }) + } + + pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { + for value in &mut self.body { + value.replace_value(source_range, new_value.clone()); + } + } + /// Returns a hover value that includes the given character position. pub fn get_hover_value_for_position(&self, pos: usize, code: &str) -> Option { for b in &self.body { @@ -2615,11 +2583,6 @@ impl PipeExpression { None } - #[async_recursion] - pub async fn get_result(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result { - execute_pipe_body(exec_state, &self.body, self.into(), ctx).await - } - /// Rename all identifiers that have the old name to the new given name. fn rename_identifiers(&mut self, old_name: &str, new_name: &str) { for statement in &mut self.body { @@ -2686,7 +2649,7 @@ pub enum FnArgType { #[serde(tag = "type")] pub struct Parameter { /// The parameter's label or name. - pub identifier: Identifier, + pub identifier: Node, /// The type of the parameter. /// This is optional if the user defines a type. #[serde(skip)] @@ -2704,10 +2667,8 @@ pub struct Parameter { #[ts(export)] #[serde(tag = "type")] pub struct FunctionExpression { - pub start: usize, - pub end: usize, pub params: Vec, - pub body: Program, + pub body: Node, #[serde(skip)] pub return_type: Option, @@ -2716,8 +2677,6 @@ pub struct FunctionExpression { pub digest: Option, } -impl_value_meta!(FunctionExpression); - #[derive(Debug, PartialEq, Clone)] pub struct RequiredParamAfterOptionalParam(pub Box); @@ -2727,20 +2686,20 @@ impl std::fmt::Display for RequiredParamAfterOptionalParam { } } -impl FunctionExpression { +impl Node { /// Function expressions don't really apply. pub fn get_constraint_level(&self) -> ConstraintLevel { ConstraintLevel::Ignore { source_ranges: vec![self.into()], } } +} +impl FunctionExpression { pub fn required_and_optional_params( &self, ) -> Result<(&[Parameter], &[Parameter]), RequiredParamAfterOptionalParam> { let Self { - start: _, - end: _, params, body: _, digest: _, @@ -2795,8 +2754,6 @@ impl FunctionExpression { #[ts(export)] #[serde(tag = "type")] pub struct ReturnStatement { - pub start: usize, - pub end: usize, pub argument: Expr, #[serde(default, skip_serializing_if = "Option::is_none")] @@ -2804,8 +2761,6 @@ pub struct ReturnStatement { pub digest: Option, } -impl_value_meta!(ReturnStatement); - /// Describes information about a hover. #[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] #[serde(rename_all = "camelCase")] @@ -3244,34 +3199,40 @@ const cylinder = startSketchOn('-XZ') Some(FnArgType::Object { properties: vec![ Parameter { - identifier: Identifier { - start: 35, - end: 40, - name: "thing".to_owned(), - digest: None, - }, + identifier: Node::new( + Identifier { + name: "thing".to_owned(), + digest: None, + }, + 35, + 40, + ), type_: Some(FnArgType::Primitive(FnArgPrimitive::Number)), optional: false, digest: None }, Parameter { - identifier: Identifier { - start: 50, - end: 56, - name: "things".to_owned(), - digest: None, - }, + identifier: Node::new( + Identifier { + name: "things".to_owned(), + digest: None, + }, + 50, + 56, + ), type_: Some(FnArgType::Array(FnArgPrimitive::String)), optional: false, digest: None }, Parameter { - identifier: Identifier { - start: 68, - end: 72, - name: "more".to_owned(), - digest: None - }, + identifier: Node::new( + Identifier { + name: "more".to_owned(), + digest: None + }, + 68, + 72, + ), type_: Some(FnArgType::Primitive(FnArgPrimitive::String)), optional: true, digest: None @@ -3306,34 +3267,40 @@ const cylinder = startSketchOn('-XZ') Some(FnArgType::Object { properties: vec![ Parameter { - identifier: Identifier { - start: 18, - end: 23, - name: "thing".to_owned(), - digest: None - }, + identifier: Node::new( + Identifier { + name: "thing".to_owned(), + digest: None + }, + 18, + 23, + ), type_: Some(FnArgType::Primitive(FnArgPrimitive::Number)), optional: false, digest: None }, Parameter { - identifier: Identifier { - start: 33, - end: 39, - name: "things".to_owned(), - digest: None - }, + identifier: Node::new( + Identifier { + name: "things".to_owned(), + digest: None + }, + 33, + 39, + ), type_: Some(FnArgType::Array(FnArgPrimitive::String)), optional: false, digest: None }, Parameter { - identifier: Identifier { - start: 51, - end: 55, - name: "more".to_owned(), - digest: None - }, + identifier: Node::new( + Identifier { + name: "more".to_owned(), + digest: None + }, + 51, + 55, + ), type_: Some(FnArgType::Primitive(FnArgPrimitive::String)), optional: true, digest: None @@ -3349,117 +3316,105 @@ const cylinder = startSketchOn('-XZ') ( "no params", (0..=0), - FunctionExpression { - start: 0, - end: 0, + Node::no_src(FunctionExpression { params: vec![], - body: Program { - start: 0, - end: 0, + body: Node::no_src(Program { body: Vec::new(), non_code_meta: Default::default(), digest: None, - }, + }), return_type: None, digest: None, - }, + }), ), ( "all required params", (1..=1), - FunctionExpression { - start: 0, - end: 0, + Node::no_src(FunctionExpression { params: vec![Parameter { - identifier: Identifier { - start: 0, - end: 0, + identifier: Node::no_src(Identifier { name: "foo".to_owned(), digest: None, - }, + }), type_: None, optional: false, digest: None, }], - body: Program { + body: Node { + inner: Program { + body: Vec::new(), + non_code_meta: Default::default(), + digest: None, + }, start: 0, end: 0, - body: Vec::new(), - non_code_meta: Default::default(), - digest: None, }, return_type: None, digest: None, - }, + }), ), ( "all optional params", (0..=1), - FunctionExpression { - start: 0, - end: 0, + Node::no_src(FunctionExpression { params: vec![Parameter { - identifier: Identifier { - start: 0, - end: 0, + identifier: Node::no_src(Identifier { name: "foo".to_owned(), digest: None, - }, + }), type_: None, optional: true, digest: None, }], - body: Program { + body: Node { + inner: Program { + body: Vec::new(), + non_code_meta: Default::default(), + digest: None, + }, start: 0, end: 0, - body: Vec::new(), - non_code_meta: Default::default(), - digest: None, }, return_type: None, digest: None, - }, + }), ), ( "mixed params", (1..=2), - FunctionExpression { - start: 0, - end: 0, + Node::no_src(FunctionExpression { params: vec![ Parameter { - identifier: Identifier { - start: 0, - end: 0, + identifier: Node::no_src(Identifier { name: "foo".to_owned(), digest: None, - }, + }), type_: None, optional: false, digest: None, }, Parameter { - identifier: Identifier { - start: 0, - end: 0, + identifier: Node::no_src(Identifier { name: "bar".to_owned(), digest: None, - }, + }), type_: None, optional: true, digest: None, }, ], - body: Program { + body: Node { + inner: Program { + body: Vec::new(), + non_code_meta: Default::default(), + digest: None, + }, start: 0, end: 0, - body: Vec::new(), - non_code_meta: Default::default(), - digest: None, }, return_type: None, digest: None, - }, + }), ), ] .into_iter() @@ -3479,11 +3434,14 @@ const cylinder = startSketchOn('-XZ') // We want to get the bool and verify it is a bool. - let BodyItem::ExpressionStatement(ExpressionStatement { - expression, - start: _, - end: _, - digest: None, + let BodyItem::ExpressionStatement(Node { + inner: + ExpressionStatement { + expression, + digest: None, + .. + }, + .. }) = program.body.first().unwrap() else { panic!("expected a function!"); diff --git a/src/wasm-lib/kcl/src/ast/types/condition.rs b/src/wasm-lib/kcl/src/ast/types/condition.rs index 341d217a4..9244a4130 100644 --- a/src/wasm-lib/kcl/src/ast/types/condition.rs +++ b/src/wasm-lib/kcl/src/ast/types/condition.rs @@ -1,9 +1,10 @@ -use crate::executor::Metadata; use crate::executor::SourceRange; -use super::impl_value_meta; +use super::BoxNode; use super::ConstraintLevel; use super::Hover; +use super::Node; +use super::NodeList; use super::{Digest, Expr}; use databake::*; use schemars::JsonSchema; @@ -19,12 +20,10 @@ type IfBlock = crate::ast::types::Program; #[ts(export)] #[serde(tag = "type")] pub struct IfExpression { - pub start: usize, - pub end: usize, pub cond: Box, - pub then_val: Box, - pub else_ifs: Vec, - pub final_else: Box, + pub then_val: BoxNode, + pub else_ifs: NodeList, + pub final_else: BoxNode, pub digest: Option, } @@ -34,57 +33,21 @@ pub struct IfExpression { #[ts(export)] #[serde(tag = "type")] pub struct ElseIf { - pub start: usize, - pub end: usize, pub cond: Expr, - pub then_val: Box, + pub then_val: BoxNode, pub digest: Option, } // Source code metadata -impl_value_meta!(IfExpression); -impl_value_meta!(ElseIf); - -impl IfExpression { +impl Node { fn source_ranges(&self) -> Vec { vec![SourceRange::from(self)] } } -impl From for Metadata { - fn from(value: IfExpression) -> Self { - Self { - source_range: value.into(), - } - } -} - -impl From for Metadata { - fn from(value: ElseIf) -> Self { - Self { - source_range: value.into(), - } - } -} -impl From<&IfExpression> for Metadata { - fn from(value: &IfExpression) -> Self { - Self { - source_range: value.into(), - } - } -} - -impl From<&ElseIf> for Metadata { - fn from(value: &ElseIf) -> Self { - Self { - source_range: value.into(), - } - } -} - -impl ElseIf { +impl Node { #[allow(dead_code)] fn source_ranges(&self) -> Vec { vec![SourceRange([self.start, self.end])] @@ -93,6 +56,15 @@ impl ElseIf { // IDE support and refactors +impl Node { + /// Get the constraint level. + pub fn get_constraint_level(&self) -> ConstraintLevel { + ConstraintLevel::Full { + source_ranges: self.source_ranges(), + } + } +} + impl IfExpression { pub fn get_hover_value_for_position(&self, pos: usize, code: &str) -> Option { self.cond @@ -115,12 +87,7 @@ impl IfExpression { } self.final_else.rename_identifiers(old_name, new_name); } - /// Get the constraint level. - pub fn get_constraint_level(&self) -> ConstraintLevel { - ConstraintLevel::Full { - source_ranges: self.source_ranges(), - } - } + pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { self.cond.replace_value(source_range, new_value.clone()); for else_if in &mut self.else_ifs { diff --git a/src/wasm-lib/kcl/src/ast/types/execute.rs b/src/wasm-lib/kcl/src/ast/types/execute.rs index 8d981c96c..d2934305d 100644 --- a/src/wasm-lib/kcl/src/ast/types/execute.rs +++ b/src/wasm-lib/kcl/src/ast/types/execute.rs @@ -1,6 +1,6 @@ use super::{ human_friendly_type, ArrayExpression, ArrayRangeExpression, BinaryExpression, BinaryOperator, BinaryPart, - CallExpression, Expr, IfExpression, LiteralIdentifier, LiteralValue, MemberExpression, MemberObject, + CallExpression, Expr, IfExpression, LiteralIdentifier, LiteralValue, MemberExpression, MemberObject, Node, ObjectExpression, TagDeclarator, UnaryExpression, UnaryOperator, }; use crate::{ @@ -32,7 +32,7 @@ impl BinaryPart { } } -impl MemberExpression { +impl Node { pub fn get_result_array(&self, exec_state: &mut ExecState, index: usize) -> Result { let array = match &self.object { MemberObject::MemberExpression(member_expr) => member_expr.get_result(exec_state)?, @@ -137,7 +137,7 @@ impl MemberExpression { } } -impl BinaryExpression { +impl Node { #[async_recursion] pub async fn get_result(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result { let left_json_value = self.left.get_result(exec_state, ctx).await?.get_json_value()?; @@ -186,7 +186,7 @@ impl BinaryExpression { } } -impl UnaryExpression { +impl Node { pub async fn get_result(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result { if self.operator == UnaryOperator::Not { let value = self.argument.get_result(exec_state, ctx).await?.get_json_value()?; @@ -297,7 +297,7 @@ async fn inner_execute_pipe_body( Ok(final_output) } -impl CallExpression { +impl Node { #[async_recursion] pub async fn execute(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result { let fn_name = &self.callee.name; @@ -502,7 +502,7 @@ impl CallExpression { } } -impl TagDeclarator { +impl Node { pub async fn execute(&self, exec_state: &mut ExecState) -> Result { let memory_item = KclValue::TagIdentifier(Box::new(TagIdentifier { value: self.name.clone(), @@ -518,7 +518,7 @@ impl TagDeclarator { } } -impl ArrayExpression { +impl Node { #[async_recursion] pub async fn execute(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result { let mut results = Vec::with_capacity(self.elements.len()); @@ -543,21 +543,21 @@ impl ArrayExpression { } } -impl ArrayRangeExpression { +impl Node { #[async_recursion] pub async fn execute(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result { - let metadata = Metadata::from(&*self.start_element); + let metadata = Metadata::from(&self.start_element); let start = ctx .execute_expr(&self.start_element, exec_state, &metadata, StatementKind::Expression) .await? .get_json_value()?; - let start = parse_json_number_as_i64(&start, (&*self.start_element).into())?; - let metadata = Metadata::from(&*self.end_element); + let start = parse_json_number_as_i64(&start, (&self.start_element).into())?; + let metadata = Metadata::from(&self.end_element); let end = ctx .execute_expr(&self.end_element, exec_state, &metadata, StatementKind::Expression) .await? .get_json_value()?; - let end = parse_json_number_as_i64(&end, (&*self.end_element).into())?; + let end = parse_json_number_as_i64(&end, (&self.end_element).into())?; if end < start { return Err(KclError::Semantic(KclErrorDetails { @@ -581,7 +581,7 @@ impl ArrayRangeExpression { } } -impl ObjectExpression { +impl Node { #[async_recursion] pub async fn execute(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result { let mut object = serde_json::Map::new(); @@ -655,7 +655,7 @@ pub fn json_as_bool(j: &serde_json::Value) -> Option { } } -impl IfExpression { +impl Node { #[async_recursion] pub async fn get_result(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result { // Check the `if` branch. @@ -717,13 +717,13 @@ impl Property { let property_src: SourceRange = value.clone().into(); match value { LiteralIdentifier::Identifier(identifier) => { - let name = identifier.name; + let name = &identifier.name; if !computed { // Treat the property as a literal Ok(Property::String(name.to_string())) } else { // Actually evaluate memory to compute the property. - let prop = exec_state.memory.get(&name, property_src)?; + let prop = exec_state.memory.get(name, property_src)?; let KclValue::UserVal(prop) = prop else { return Err(KclError::Semantic(KclErrorDetails { source_ranges: property_sr, @@ -732,7 +732,7 @@ impl Property { ), })); }; - jvalue_to_prop(&prop.value, property_sr, &name) + jvalue_to_prop(&prop.value, property_sr, name) } } LiteralIdentifier::Literal(literal) => { diff --git a/src/wasm-lib/kcl/src/ast/types/literal_value.rs b/src/wasm-lib/kcl/src/ast/types/literal_value.rs index dc6fb1296..f723154fa 100644 --- a/src/wasm-lib/kcl/src/ast/types/literal_value.rs +++ b/src/wasm-lib/kcl/src/ast/types/literal_value.rs @@ -5,6 +5,8 @@ use serde_json::Value as JValue; use crate::ast::types::{Expr, Literal}; +use super::Node; + #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] #[databake(path = kcl_lib::ast::types)] #[ts(export)] @@ -33,8 +35,8 @@ impl LiteralValue { } } -impl From for Expr { - fn from(literal: Literal) -> Self { +impl From> for Expr { + fn from(literal: Node) -> Self { Expr::Literal(Box::new(literal)) } } diff --git a/src/wasm-lib/kcl/src/docs/gen_std_tests.rs b/src/wasm-lib/kcl/src/docs/gen_std_tests.rs index 34c015076..4b6eba5fd 100644 --- a/src/wasm-lib/kcl/src/docs/gen_std_tests.rs +++ b/src/wasm-lib/kcl/src/docs/gen_std_tests.rs @@ -396,6 +396,9 @@ fn generate_function(internal_fn: Box) -> Result String { let mut cleaned_output = output.to_string(); // Fix the links to the types. + // Gross hack for the stupid alias types. + cleaned_output = cleaned_output.replace("TagNode", "TagDeclarator"); + let link = format!("[`{}`](/docs/kcl/types#tag-declaration)", "TagDeclarator"); cleaned_output = cleaned_output.replace("`TagDeclarator`", &link); let link = format!("[`{}`](/docs/kcl/types#tag-identifier)", "TagIdentifier"); @@ -409,7 +412,7 @@ fn cleanup_type_links(output: &str, types: Vec) -> String { let mut cleaned_output = output.to_string(); // Fix the links to the types. for type_name in types { - if type_name == "TagDeclarator" || type_name == "TagIdentifier" { + if type_name == "TagDeclarator" || type_name == "TagIdentifier" || type_name == "TagNode" { continue; } else { let link = format!("(/docs/kcl/types/{})", type_name); @@ -486,7 +489,7 @@ fn generate_type( } // Skip over TagDeclarator and TagIdentifier since they have custom docs. - if name == "TagDeclarator" || name == "TagIdentifier" { + if name == "TagDeclarator" || name == "TagIdentifier" || name == "TagNode" { return Ok(()); } diff --git a/src/wasm-lib/kcl/src/docs/mod.rs b/src/wasm-lib/kcl/src/docs/mod.rs index eb2bc3d6e..a7dc91db9 100644 --- a/src/wasm-lib/kcl/src/docs/mod.rs +++ b/src/wasm-lib/kcl/src/docs/mod.rs @@ -76,7 +76,7 @@ impl StdLibFnArg { || self.type_ == "SketchOrSurface" { return Ok(Some((index, format!("${{{}:{}}}", index, "%")))); - } else if self.type_ == "TagDeclarator" && self.required { + } else if (self.type_ == "TagDeclarator" || self.type_ == "TagNode") && self.required { return Ok(Some((index, format!("${{{}:{}}}", index, "$myTag")))); } else if self.type_ == "TagIdentifier" && self.required { // TODO: actually use the ast to populate this. diff --git a/src/wasm-lib/kcl/src/executor.rs b/src/wasm-lib/kcl/src/executor.rs index 36f8563f4..3e817d445 100644 --- a/src/wasm-lib/kcl/src/executor.rs +++ b/src/wasm-lib/kcl/src/executor.rs @@ -26,8 +26,8 @@ type Point3D = kcmc::shared::Point3d; use crate::{ ast::types::{ - human_friendly_type, BodyItem, Expr, ExpressionStatement, FunctionExpression, ImportStatement, ItemVisibility, - KclNone, Program, ReturnStatement, TagDeclarator, + human_friendly_type, BodyItem, Expr, FunctionExpression, ItemVisibility, KclNone, Node, NodeRef, Program, + TagDeclarator, TagNode, }, engine::{EngineManager, ExecutionKind}, errors::{KclError, KclErrorDetails}, @@ -155,6 +155,7 @@ impl Default for ProgramMemory { /// An index pointing to an environment. #[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] +#[schemars(transparent)] pub struct EnvironmentRef(usize); impl EnvironmentRef { @@ -339,7 +340,7 @@ impl IdGenerator { pub enum KclValue { UserVal(UserVal), TagIdentifier(Box), - TagDeclarator(Box), + TagDeclarator(crate::ast::types::BoxNode), Plane(Box), Face(Box), @@ -352,7 +353,7 @@ pub enum KclValue { Function { #[serde(skip)] func: Option, - expression: Box, + expression: crate::ast::types::BoxNode, memory: Box, #[serde(rename = "__meta")] meta: Vec, @@ -890,7 +891,7 @@ pub type MemoryFunction = fn( s: Vec, memory: ProgramMemory, - expression: Box, + expression: crate::ast::types::BoxNode, metadata: Vec, exec_state: &ExecState, ctx: ExecutorContext, @@ -900,7 +901,7 @@ impl From for Vec { fn from(item: KclValue) -> Self { match item { KclValue::UserVal(u) => u.meta.iter().map(|m| m.source_range).collect(), - KclValue::TagDeclarator(t) => t.into(), + KclValue::TagDeclarator(t) => vec![(&t).into()], KclValue::TagIdentifier(t) => t.meta.iter().map(|m| m.source_range).collect(), KclValue::Solid(e) => e.meta.iter().map(|m| m.source_range).collect(), KclValue::Solids { value } => value @@ -1043,9 +1044,9 @@ impl KclValue { } /// Get a tag declarator from a memory item. - pub fn get_tag_declarator(&self) -> Result { + pub fn get_tag_declarator(&self) -> Result { match self { - KclValue::TagDeclarator(t) => Ok(*t.clone()), + KclValue::TagDeclarator(t) => Ok((**t).clone()), _ => Err(KclError::Semantic(KclErrorDetails { message: format!("Not a tag declarator: {:?}", self), source_ranges: self.clone().into(), @@ -1054,9 +1055,9 @@ impl KclValue { } /// Get an optional tag from a memory item. - pub fn get_tag_declarator_opt(&self) -> Result, KclError> { + pub fn get_tag_declarator_opt(&self) -> Result, KclError> { match self { - KclValue::TagDeclarator(t) => Ok(Some(*t.clone())), + KclValue::TagDeclarator(t) => Ok(Some((**t).clone())), _ => Err(KclError::Semantic(KclErrorDetails { message: format!("Not a tag declarator: {:?}", self), source_ranges: self.clone().into(), @@ -1200,7 +1201,7 @@ pub struct GetTangentialInfoFromPathsResult { } impl Sketch { - pub(crate) fn add_tag(&mut self, tag: &TagDeclarator, current_path: &Path) { + pub(crate) fn add_tag(&mut self, tag: NodeRef<'_, TagDeclarator>, current_path: &Path) { let mut tag_identifier: TagIdentifier = tag.into(); let base = current_path.get_base(); tag_identifier.info = Some(TagEngineInfo { @@ -1326,7 +1327,7 @@ pub enum EdgeCut { /// The engine id of the edge to fillet. #[serde(rename = "edgeId")] edge_id: uuid::Uuid, - tag: Box>, + tag: Box>, }, /// A chamfer. Chamfer { @@ -1336,7 +1337,7 @@ pub enum EdgeCut { /// The engine id of the edge to chamfer. #[serde(rename = "edgeId")] edge_id: uuid::Uuid, - tag: Box>, + tag: Box>, }, } @@ -1355,7 +1356,7 @@ impl EdgeCut { } } - pub fn tag(&self) -> Option { + pub fn tag(&self) -> Option { match self { EdgeCut::Fillet { tag, .. } => *tag.clone(), EdgeCut::Chamfer { tag, .. } => *tag.clone(), @@ -1529,26 +1530,10 @@ impl From for Metadata { } } -impl From<&ImportStatement> for Metadata { - fn from(stmt: &ImportStatement) -> Self { +impl From> for Metadata { + fn from(node: NodeRef<'_, T>) -> Self { Self { - source_range: SourceRange::new(stmt.start, stmt.end), - } - } -} - -impl From<&ExpressionStatement> for Metadata { - fn from(exp_statement: &ExpressionStatement) -> Self { - Self { - source_range: SourceRange::new(exp_statement.start, exp_statement.end), - } - } -} - -impl From<&ReturnStatement> for Metadata { - fn from(return_statement: &ReturnStatement) -> Self { - Self { - source_range: SourceRange::new(return_statement.start, return_statement.end), + source_range: SourceRange::new(node.start, node.end), } } } @@ -1573,7 +1558,7 @@ pub struct BasePath { #[ts(type = "[number, number]")] pub to: [f64; 2], /// The tag of the path. - pub tag: Option, + pub tag: Option, /// Metadata. #[serde(rename = "__geoMeta")] pub geo_meta: GeoMeta, @@ -1709,7 +1694,7 @@ impl Path { } } - pub fn get_tag(&self) -> Option { + pub fn get_tag(&self) -> Option { match self { Path::ToPoint { base } => base.tag.clone(), Path::Horizontal { base, .. } => base.tag.clone(), @@ -1820,7 +1805,7 @@ pub struct ChamferSurface { /// The id for the chamfer surface. pub face_id: uuid::Uuid, /// The tag. - pub tag: Option, + pub tag: Option>, /// Metadata. #[serde(flatten)] pub geo_meta: GeoMeta, @@ -1834,7 +1819,7 @@ pub struct FilletSurface { /// The id for the fillet surface. pub face_id: uuid::Uuid, /// The tag. - pub tag: Option, + pub tag: Option>, /// Metadata. #[serde(flatten)] pub geo_meta: GeoMeta, @@ -1848,7 +1833,7 @@ pub struct ExtrudePlane { /// The face id for the extrude plane. pub face_id: uuid::Uuid, /// The tag. - pub tag: Option, + pub tag: Option>, /// Metadata. #[serde(flatten)] pub geo_meta: GeoMeta, @@ -1862,7 +1847,7 @@ pub struct ExtrudeArc { /// The face id for the extrude plane. pub face_id: uuid::Uuid, /// The tag. - pub tag: Option, + pub tag: Option>, /// Metadata. #[serde(flatten)] pub geo_meta: GeoMeta, @@ -1878,7 +1863,7 @@ impl ExtrudeSurface { } } - pub fn get_tag(&self) -> Option { + pub fn get_tag(&self) -> Option> { match self { ExtrudeSurface::ExtrudePlane(ep) => ep.tag.clone(), ExtrudeSurface::ExtrudeArc(ea) => ea.tag.clone(), @@ -2156,7 +2141,7 @@ impl ExecutorContext { /// Kurt uses this for partial execution. pub async fn run( &self, - program: &crate::ast::types::Program, + program: NodeRef<'_, crate::ast::types::Program>, memory: Option, id_generator: IdGenerator, project_directory: Option, @@ -2170,7 +2155,7 @@ impl ExecutorContext { /// Kurt uses this for partial execution. pub async fn run_with_session_data( &self, - program: &crate::ast::types::Program, + program: NodeRef<'_, crate::ast::types::Program>, memory: Option, id_generator: IdGenerator, project_directory: Option, @@ -2212,9 +2197,9 @@ impl ExecutorContext { /// Execute an AST's program. #[async_recursion] - pub(crate) async fn inner_execute( - &self, - program: &crate::ast::types::Program, + pub(crate) async fn inner_execute<'a>( + &'a self, + program: NodeRef<'a, crate::ast::types::Program>, exec_state: &mut ExecState, body_type: BodyType, ) -> Result, KclError> { @@ -2450,7 +2435,7 @@ impl ExecutorContext { /// Execute the program, then get a PNG screenshot. pub async fn execute_and_prepare_snapshot( &self, - program: &Program, + program: NodeRef<'_, Program>, id_generator: IdGenerator, project_directory: Option, ) -> Result { @@ -2462,7 +2447,7 @@ impl ExecutorContext { /// Execute the program, return the interpreter and outputs. pub async fn execute_and_prepare( &self, - program: &Program, + program: NodeRef<'_, Program>, id_generator: IdGenerator, project_directory: Option, ) -> Result<(ExecState, TakeSnapshot)> { @@ -2507,7 +2492,7 @@ impl ExecutorContext { /// assign it to a parameter of the function, in the given block of function memory. /// Returns Err if too few/too many arguments were given for the function. fn assign_args_to_params( - function_expression: &FunctionExpression, + function_expression: NodeRef<'_, FunctionExpression>, args: Vec, mut fn_memory: ProgramMemory, ) -> Result { @@ -2559,7 +2544,7 @@ fn assign_args_to_params( pub(crate) async fn call_user_defined_function( args: Vec, memory: &ProgramMemory, - function_expression: &FunctionExpression, + function_expression: NodeRef<'_, FunctionExpression>, exec_state: &mut ExecState, ctx: &ExecutorContext, ) -> Result, KclError> { @@ -2598,7 +2583,7 @@ mod tests { use pretty_assertions::assert_eq; use super::*; - use crate::ast::types::{Identifier, Parameter}; + use crate::ast::types::{Identifier, Node, Parameter}; pub async fn parse_execute(code: &str) -> Result { let tokens = crate::token::lexer(code)?; @@ -3570,13 +3555,11 @@ let w = f() + f() meta: Default::default(), }) } - fn ident(s: &'static str) -> Identifier { - Identifier { - start: 0, - end: 0, + fn ident(s: &'static str) -> Node { + Node::no_src(Identifier { name: s.to_owned(), digest: None, - } + }) } fn opt_param(s: &'static str) -> Parameter { Parameter { @@ -3668,20 +3651,20 @@ let w = f() + f() ), ] { // Run each test. - let func_expr = &FunctionExpression { - start: 0, - end: 0, + let func_expr = &Node::no_src(FunctionExpression { params, - body: crate::ast::types::Program { + body: Node { + inner: crate::ast::types::Program { + body: Vec::new(), + non_code_meta: Default::default(), + digest: None, + }, start: 0, end: 0, - body: Vec::new(), - non_code_meta: Default::default(), - digest: None, }, return_type: None, digest: None, - }; + }); let actual = assign_args_to_params(func_expr, args, ProgramMemory::new()); assert_eq!( actual, expected, diff --git a/src/wasm-lib/kcl/src/function_param.rs b/src/wasm-lib/kcl/src/function_param.rs index 63437e23b..190cbd266 100644 --- a/src/wasm-lib/kcl/src/function_param.rs +++ b/src/wasm-lib/kcl/src/function_param.rs @@ -13,7 +13,7 @@ use crate::{ pub struct FunctionParam<'a> { pub inner: Option<&'a MemoryFunction>, pub memory: ProgramMemory, - pub fn_expr: Box, + pub fn_expr: crate::ast::types::BoxNode, pub meta: Vec, pub ctx: ExecutorContext, } diff --git a/src/wasm-lib/kcl/src/lint/checks/std_lib_args.rs b/src/wasm-lib/kcl/src/lint/checks/std_lib_args.rs index 649959fca..6b12626f2 100644 --- a/src/wasm-lib/kcl/src/lint/checks/std_lib_args.rs +++ b/src/wasm-lib/kcl/src/lint/checks/std_lib_args.rs @@ -3,7 +3,7 @@ use std::sync::Arc; use anyhow::Result; use crate::{ - ast::types::CallExpression, + ast::types::{CallExpression, NodeRef}, docs::StdLibFn, executor::SourceRange, lint::rule::{def_finding, Discovered, Finding}, @@ -18,7 +18,10 @@ def_finding!( Previously, we have not been failing when too many arguments are passed to a stdlib function. This is a problem because it can lead to unexpected behavior. We will in the future fail when too many arguments are passed to a function. So fix your code now." ); -fn lint_too_many_args_std_lib_function(f: Box, exp: &CallExpression) -> Result> { +fn lint_too_many_args_std_lib_function( + f: Box, + exp: NodeRef<'_, CallExpression>, +) -> Result> { let mut findings = vec![]; if f.name() == "pow" { diff --git a/src/wasm-lib/kcl/src/lsp/kcl/custom_notifications.rs b/src/wasm-lib/kcl/src/lsp/kcl/custom_notifications.rs index 4d57b561f..a6d35527e 100644 --- a/src/wasm-lib/kcl/src/lsp/kcl/custom_notifications.rs +++ b/src/wasm-lib/kcl/src/lsp/kcl/custom_notifications.rs @@ -3,14 +3,14 @@ use serde::{Deserialize, Serialize}; use tower_lsp::lsp_types::notification::Notification; -use crate::settings::types::UnitLength; +use crate::{ast::types::Node, settings::types::UnitLength}; /// A notification that the AST has changed. #[derive(Debug)] pub enum AstUpdated {} impl Notification for AstUpdated { - type Params = crate::ast::types::Program; + type Params = Node; const METHOD: &'static str = "kcl/astUpdated"; } diff --git a/src/wasm-lib/kcl/src/lsp/kcl/mod.rs b/src/wasm-lib/kcl/src/lsp/kcl/mod.rs index 0d3d8aa41..3d3948e15 100644 --- a/src/wasm-lib/kcl/src/lsp/kcl/mod.rs +++ b/src/wasm-lib/kcl/src/lsp/kcl/mod.rs @@ -40,7 +40,7 @@ use tower_lsp::{ }; use crate::{ - ast::types::{Expr, VariableKind}, + ast::types::{Expr, Node, NodeRef, VariableKind}, executor::{IdGenerator, SourceRange}, lsp::{backend::Backend as _, util::IntoDiagnostic}, parser::PIPE_OPERATOR, @@ -99,7 +99,7 @@ pub struct Backend { /// Token maps. pub token_map: DashMap>, /// AST maps. - pub ast_map: DashMap, + pub ast_map: DashMap>, /// Memory maps. pub memory_map: DashMap, /// Current code. @@ -571,7 +571,7 @@ impl Backend { self.client.publish_diagnostics(params.uri.clone(), items, None).await; } - async fn execute(&self, params: &TextDocumentItem, ast: &crate::ast::types::Program) -> Result<()> { + async fn execute(&self, params: &TextDocumentItem, ast: NodeRef<'_, crate::ast::types::Program>) -> Result<()> { // Check if we can execute. if !self.can_execute().await { return Ok(()); diff --git a/src/wasm-lib/kcl/src/lsp/tests.rs b/src/wasm-lib/kcl/src/lsp/tests.rs index 606ec3370..bb2f8991d 100644 --- a/src/wasm-lib/kcl/src/lsp/tests.rs +++ b/src/wasm-lib/kcl/src/lsp/tests.rs @@ -7,6 +7,7 @@ use tower_lsp::{ }; use crate::{ + ast::types::{Node, Program}, executor::ProgramMemory, lsp::test_util::{copilot_lsp_server, kcl_lsp_server}, }; @@ -1070,7 +1071,7 @@ fn myFn = (param1) => { // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Send semantic tokens request. let semantic_tokens = server @@ -2396,7 +2397,7 @@ async fn kcl_test_kcl_lsp_full_to_empty_file_updates_ast_and_memory() { // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl").unwrap().clone(); assert!(memory != ProgramMemory::default()); @@ -2416,7 +2417,7 @@ async fn kcl_test_kcl_lsp_full_to_empty_file_updates_ast_and_memory() { }) .await; - let mut default_hashed = crate::ast::types::Program::default(); + let mut default_hashed = Node::::default(); default_hashed.compute_digest(); // Get the ast. @@ -2453,7 +2454,7 @@ async fn kcl_test_kcl_lsp_code_unchanged_but_has_diagnostics_reexecute() { // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl").unwrap().clone(); assert!(memory != ProgramMemory::default()); @@ -2487,9 +2488,9 @@ async fn kcl_test_kcl_lsp_code_unchanged_but_has_diagnostics_reexecute() { // Clear the ast and memory. server .ast_map - .insert("file:///test.kcl".to_string(), crate::ast::types::Program::default()); + .insert("file:///test.kcl".to_string(), Node::::default()); let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert_eq!(ast, crate::ast::types::Program::default()); + assert_eq!(ast, Node::::default()); server .memory_map .insert("file:///test.kcl".to_string(), ProgramMemory::default()); @@ -2513,7 +2514,7 @@ async fn kcl_test_kcl_lsp_code_unchanged_but_has_diagnostics_reexecute() { // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl").unwrap().clone(); assert!(memory != ProgramMemory::default()); @@ -2549,7 +2550,7 @@ async fn kcl_test_kcl_lsp_code_and_ast_unchanged_but_has_diagnostics_reexecute() // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl").unwrap().clone(); assert!(memory != ProgramMemory::default()); @@ -2604,7 +2605,7 @@ async fn kcl_test_kcl_lsp_code_and_ast_unchanged_but_has_diagnostics_reexecute() // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl").unwrap().clone(); assert!(memory != ProgramMemory::default()); @@ -2640,7 +2641,7 @@ async fn kcl_test_kcl_lsp_code_and_ast_units_unchanged_but_has_diagnostics_reexe // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl").unwrap().clone(); assert!(memory != ProgramMemory::default()); @@ -2698,7 +2699,7 @@ async fn kcl_test_kcl_lsp_code_and_ast_units_unchanged_but_has_diagnostics_reexe // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl").unwrap().clone(); assert!(memory != ProgramMemory::default()); @@ -2734,7 +2735,7 @@ async fn kcl_test_kcl_lsp_code_and_ast_units_unchanged_but_has_memory_reexecute_ // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl").unwrap().clone(); assert!(memory != ProgramMemory::default()); @@ -2770,7 +2771,7 @@ async fn kcl_test_kcl_lsp_code_and_ast_units_unchanged_but_has_memory_reexecute_ // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl").unwrap().clone(); assert!(memory != ProgramMemory::default()); @@ -2806,7 +2807,7 @@ async fn kcl_test_kcl_lsp_cant_execute_set() { // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl").unwrap().clone(); assert!(memory != ProgramMemory::default()); @@ -2841,7 +2842,7 @@ async fn kcl_test_kcl_lsp_cant_execute_set() { // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl").unwrap().clone(); assert!(memory != ProgramMemory::default()); @@ -2883,7 +2884,7 @@ async fn kcl_test_kcl_lsp_cant_execute_set() { let units = server.executor_ctx().await.clone().unwrap().settings.units; assert_eq!(units, crate::settings::types::UnitLength::Mm); - let mut default_hashed = crate::ast::types::Program::default(); + let mut default_hashed = Node::::default(); default_hashed.compute_digest(); // Get the ast. @@ -2924,7 +2925,7 @@ async fn kcl_test_kcl_lsp_cant_execute_set() { // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl").unwrap().clone(); // Now it should NOT be the default memory. @@ -3064,7 +3065,7 @@ const part001 = startSketchOn('XY') // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Assure we have one diagnostics. let diagnostics = server.diagnostics_map.get("file:///test.kcl").unwrap().clone(); @@ -3087,7 +3088,7 @@ const part001 = startSketchOn('XY') // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Assure we have one diagnostics. let diagnostics = server.diagnostics_map.get("file:///test.kcl").unwrap().clone(); @@ -3183,7 +3184,7 @@ const part001 = startSketchOn('XY') // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl"); assert!(memory.is_none()); @@ -3205,7 +3206,7 @@ const part001 = startSketchOn('XY') // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl"); assert!(memory.is_none()); @@ -3248,7 +3249,7 @@ const part001 = startSketchOn('XY') // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl"); assert!(memory.is_none()); @@ -3278,7 +3279,7 @@ const NEW_LINT = 1"# // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the memory. let memory = server.memory_map.get("file:///test.kcl"); assert!(memory.is_none()); @@ -3394,7 +3395,7 @@ const part001 = startSketchOn('XY') // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the symbols map. let symbols_map = server.symbols_map.get("file:///test.kcl").unwrap().clone(); @@ -3489,7 +3490,7 @@ const part001 = startSketchOn('XY') // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the symbols map. let symbols_map = server.symbols_map.get("file:///test.kcl").unwrap().clone(); @@ -3532,7 +3533,7 @@ const part001 = startSketchOn('XY') // Get the ast. let ast = server.ast_map.get("file:///test.kcl").unwrap().clone(); - assert!(ast != crate::ast::types::Program::default()); + assert!(ast != Node::::default()); // Get the symbols map. let symbols_map = server.symbols_map.get("file:///test.kcl").unwrap().clone(); diff --git a/src/wasm-lib/kcl/src/parser.rs b/src/wasm-lib/kcl/src/parser.rs index a871ace48..9fa74fcf9 100644 --- a/src/wasm-lib/kcl/src/parser.rs +++ b/src/wasm-lib/kcl/src/parser.rs @@ -1,5 +1,5 @@ use crate::{ - ast::types::Program, + ast::types::{Node, Program}, errors::{KclError, KclErrorDetails}, executor::SourceRange, token::{Token, TokenType}, @@ -13,7 +13,7 @@ pub const PIPE_SUBSTITUTION_OPERATOR: &str = "%"; pub const PIPE_OPERATOR: &str = "|>"; /// Parse the given KCL code into an AST. -pub fn parse(code: &str) -> Result { +pub fn parse(code: &str) -> Result, KclError> { let tokens = crate::token::lexer(code)?; let parser = Parser::new(tokens); parser.ast() @@ -33,7 +33,7 @@ impl Parser { } /// Run the parser - pub fn ast(&self) -> Result { + pub fn ast(&self) -> Result, KclError> { if !self.unknown_tokens.is_empty() { let source_ranges = self.unknown_tokens.iter().map(SourceRange::from).collect(); let token_list = self.unknown_tokens.iter().map(|t| t.value.as_str()).collect::>(); @@ -48,7 +48,7 @@ impl Parser { // Important, to not call this before the unknown tokens check. if self.tokens.is_empty() { // Empty file should just do nothing. - return Ok(Program::default()); + return Ok(Node::::default()); } // Check all the tokens are whitespace or comments. @@ -57,7 +57,7 @@ impl Parser { .iter() .all(|t| t.token_type.is_whitespace() || t.token_type.is_comment()) { - return Ok(Program::default()); + return Ok(Node::::default()); } parser_impl::run_parser(&mut self.tokens.as_slice()) diff --git a/src/wasm-lib/kcl/src/parser/math.rs b/src/wasm-lib/kcl/src/parser/math.rs index 4684bc395..e4744ed3d 100644 --- a/src/wasm-lib/kcl/src/parser/math.rs +++ b/src/wasm-lib/kcl/src/parser/math.rs @@ -1,18 +1,18 @@ use crate::{ - ast::types::{BinaryExpression, BinaryOperator, BinaryPart}, + ast::types::{BinaryExpression, BinaryOperator, BinaryPart, Node}, errors::{KclError, KclErrorDetails}, executor::SourceRange, }; /// Parses a list of tokens (in infix order, i.e. as the user typed them) /// into a binary expression tree. -pub fn parse(infix_tokens: Vec) -> Result { +pub fn parse(infix_tokens: Vec) -> Result, KclError> { let rpn = postfix(infix_tokens); evaluate(rpn) } /// Parses a list of tokens (in postfix order) into a binary expression tree. -fn evaluate(rpn: Vec) -> Result { +fn evaluate(rpn: Vec) -> Result, KclError> { let source_ranges = source_range(&rpn); let mut operand_stack: Vec = Vec::new(); let e = KclError::Internal(KclErrorDetails { @@ -28,14 +28,19 @@ fn evaluate(rpn: Vec) -> Result o, }; @@ -125,13 +130,15 @@ mod tests { fn parse_and_evaluate() { /// Make a literal fn lit(n: u8) -> BinaryPart { - BinaryPart::Literal(Box::new(Literal { - start: 0, - end: 0, - value: n.into(), - raw: n.to_string(), - digest: None, - })) + BinaryPart::Literal(Box::new(Node::new( + Literal { + value: n.into(), + raw: n.to_string(), + digest: None, + }, + 0, + 0, + ))) } let tests: Vec> = vec![ // 3 + 4 × 2 ÷ ( 1 − 5 ) ^ 2 ^ 3 @@ -142,14 +149,16 @@ mod tests { BinaryOperator::Mul.into(), lit(2).into(), BinaryOperator::Div.into(), - BinaryPart::BinaryExpression(Box::new(BinaryExpression { - start: 0, - end: 0, - operator: BinaryOperator::Sub, - left: lit(1), - right: lit(5), - digest: None, - })) + BinaryPart::BinaryExpression(Node::boxed( + BinaryExpression { + operator: BinaryOperator::Sub, + left: lit(1), + right: lit(5), + digest: None, + }, + 0, + 0, + )) .into(), BinaryOperator::Pow.into(), lit(2).into(), diff --git a/src/wasm-lib/kcl/src/parser/parser_impl.rs b/src/wasm-lib/kcl/src/parser/parser_impl.rs index 6b86e7f07..9e63a8f91 100644 --- a/src/wasm-lib/kcl/src/parser/parser_impl.rs +++ b/src/wasm-lib/kcl/src/parser/parser_impl.rs @@ -10,12 +10,12 @@ use winnow::{ use crate::{ ast::types::{ - ArrayExpression, ArrayRangeExpression, BinaryExpression, BinaryOperator, BinaryPart, BodyItem, CallExpression, - CommentStyle, ElseIf, Expr, ExpressionStatement, FnArgPrimitive, FnArgType, FunctionExpression, Identifier, - IfExpression, ImportItem, ImportStatement, ItemVisibility, Literal, LiteralIdentifier, LiteralValue, - MemberExpression, MemberObject, NonCodeMeta, NonCodeNode, NonCodeValue, ObjectExpression, ObjectProperty, - Parameter, PipeExpression, PipeSubstitution, Program, ReturnStatement, TagDeclarator, UnaryExpression, - UnaryOperator, ValueMeta, VariableDeclaration, VariableDeclarator, VariableKind, + ArrayExpression, ArrayRangeExpression, BinaryExpression, BinaryOperator, BinaryPart, BodyItem, BoxNode, + CallExpression, CommentStyle, ElseIf, Expr, ExpressionStatement, FnArgPrimitive, FnArgType, FunctionExpression, + Identifier, IfExpression, ImportItem, ImportStatement, ItemVisibility, Literal, LiteralIdentifier, + LiteralValue, MemberExpression, MemberObject, Node, NonCodeMeta, NonCodeNode, NonCodeValue, ObjectExpression, + ObjectProperty, Parameter, PipeExpression, PipeSubstitution, Program, ReturnStatement, TagDeclarator, + UnaryExpression, UnaryOperator, VariableDeclaration, VariableDeclarator, VariableKind, }, errors::{KclError, KclErrorDetails}, executor::SourceRange, @@ -31,7 +31,7 @@ type PResult = winnow::prelude::PResult; type TokenSlice<'slice, 'input> = &'slice mut &'input [Token]; -pub fn run_parser(i: TokenSlice) -> Result { +pub fn run_parser(i: TokenSlice) -> Result, KclError> { program.parse(i).map_err(KclError::from) } @@ -39,13 +39,13 @@ fn expected(what: &'static str) -> StrContext { StrContext::Expected(StrContextValue::Description(what)) } -fn program(i: TokenSlice) -> PResult { +fn program(i: TokenSlice) -> PResult> { let shebang = opt(shebang).parse_next(i)?; let mut out = function_body.parse_next(i)?; // Add the shebang to the non-code meta. if let Some(shebang) = shebang { - out.non_code_meta.start.insert(0, shebang); + out.non_code_meta.start_nodes.insert(0, shebang); } // Match original parser behaviour, for now. // Once this is merged and stable, consider changing this as I think it's more accurate @@ -70,26 +70,28 @@ fn count_in(target: char, s: &str) -> usize { } /// Matches all four cases of NonCodeValue -fn non_code_node(i: TokenSlice) -> PResult { +fn non_code_node(i: TokenSlice) -> PResult> { /// Matches one case of NonCodeValue /// See docstring on [NonCodeValue::NewLineBlockComment] for why that case is different to the others. - fn non_code_node_leading_whitespace(i: TokenSlice) -> PResult { + fn non_code_node_leading_whitespace(i: TokenSlice) -> PResult> { let leading_whitespace = one_of(TokenType::Whitespace) .context(expected("whitespace, with a newline")) .parse_next(i)?; let has_empty_line = count_in('\n', &leading_whitespace.value) >= 2; non_code_node_no_leading_whitespace - .verify_map(|node: NonCodeNode| match node.value { - NonCodeValue::BlockComment { value, style } => Some(NonCodeNode { - start: leading_whitespace.start, - end: node.end + 1, - value: if has_empty_line { - NonCodeValue::NewLineBlockComment { value, style } - } else { - NonCodeValue::BlockComment { value, style } + .verify_map(|node: Node| match node.inner.value { + NonCodeValue::BlockComment { value, style } => Some(Node::new( + NonCodeNode { + value: if has_empty_line { + NonCodeValue::NewLineBlockComment { value, style } + } else { + NonCodeValue::BlockComment { value, style } + }, + digest: None, }, - digest: None, - }), + leading_whitespace.start, + node.end + 1, + )), _ => None, }) .context(expected("a comment or whitespace")) @@ -100,7 +102,7 @@ fn non_code_node(i: TokenSlice) -> PResult { } // Matches remaining three cases of NonCodeValue -fn non_code_node_no_leading_whitespace(i: TokenSlice) -> PResult { +fn non_code_node_no_leading_whitespace(i: TokenSlice) -> PResult> { any.verify_map(|token: Token| { if token.is_code_token() { None @@ -122,19 +124,14 @@ fn non_code_node_no_leading_whitespace(i: TokenSlice) -> PResult { }, _ => return None, }; - Some(NonCodeNode { - start: token.start, - end: token.end, - value, - digest: None, - }) + Some(Node::new(NonCodeNode { value, digest: None }, token.start, token.end)) } }) .context(expected("Non-code token (comments or whitespace)")) .parse_next(i) } -fn pipe_expression(i: TokenSlice) -> PResult { +fn pipe_expression(i: TokenSlice) -> PResult> { let mut non_code_meta = NonCodeMeta::default(); let (head, noncode): (_, Vec<_>) = terminated( ( @@ -194,16 +191,18 @@ fn pipe_expression(i: TokenSlice) -> PResult { non_code_meta.insert(code_count, nc); } } - Ok(PipeExpression { + Ok(Node { start: values.first().unwrap().start(), end: values.last().unwrap().end().max(max_noncode_end), - body: values, - non_code_meta, - digest: None, + inner: PipeExpression { + body: values, + non_code_meta, + digest: None, + }, }) } -fn bool_value(i: TokenSlice) -> PResult { +fn bool_value(i: TokenSlice) -> PResult> { let (value, token) = any .try_map(|token: Token| match token.token_type { TokenType::Keyword if token.value == "true" => Ok((true, token)), @@ -215,23 +214,26 @@ fn bool_value(i: TokenSlice) -> PResult { }) .context(expected("a boolean literal (either true or false)")) .parse_next(i)?; - Ok(Literal { - start: token.start, - end: token.end, - value: LiteralValue::Bool(value), - raw: value.to_string(), - digest: None, - }) + Ok(Box::new(Node::new( + Literal { + value: LiteralValue::Bool(value), + raw: value.to_string(), + digest: None, + }, + token.start, + token.end, + ))) } -pub fn literal(i: TokenSlice) -> PResult { +pub fn literal(i: TokenSlice) -> PResult> { alt((string_literal, unsigned_number_literal)) + .map(Box::new) .context(expected("a KCL literal, like 'myPart' or 3")) .parse_next(i) } /// Parse a KCL string literal -pub fn string_literal(i: TokenSlice) -> PResult { +pub fn string_literal(i: TokenSlice) -> PResult> { let (value, token) = any .try_map(|token: Token| match token.token_type { TokenType::String => { @@ -245,17 +247,19 @@ pub fn string_literal(i: TokenSlice) -> PResult { }) .context(expected("string literal (like \"myPart\"")) .parse_next(i)?; - Ok(Literal { - start: token.start, - end: token.end, - value, - raw: token.value.clone(), - digest: None, - }) + Ok(Node::new( + Literal { + value, + raw: token.value.clone(), + digest: None, + }, + token.start, + token.end, + )) } /// Parse a KCL literal number, with no - sign. -pub(crate) fn unsigned_number_literal(i: TokenSlice) -> PResult { +pub(crate) fn unsigned_number_literal(i: TokenSlice) -> PResult> { let (value, token) = any .try_map(|token: Token| match token.token_type { TokenType::Number => { @@ -278,13 +282,15 @@ pub(crate) fn unsigned_number_literal(i: TokenSlice) -> PResult { }) .context(expected("an unsigned number literal (e.g. 3 or 12.5)")) .parse_next(i)?; - Ok(Literal { - start: token.start, - end: token.end, - value, - raw: token.value.clone(), - digest: None, - }) + Ok(Node::new( + Literal { + value, + raw: token.value.clone(), + digest: None, + }, + token.start, + token.end, + )) } /// Parse a KCL operator that takes a left- and right-hand side argument. @@ -421,7 +427,7 @@ fn whitespace(i: TokenSlice) -> PResult> { /// A shebang is a line at the start of a file that starts with `#!`. /// If the shebang is present it takes up the whole line. -fn shebang(i: TokenSlice) -> PResult { +fn shebang(i: TokenSlice) -> PResult> { // Parse the hash and the bang. hash.parse_next(i)?; bang.parse_next(i)?; @@ -443,14 +449,16 @@ fn shebang(i: TokenSlice) -> PResult { // Strip all the whitespace after the shebang. opt(whitespace).parse_next(i)?; - Ok(NonCodeNode { - start: 0, - end: tokens.last().unwrap().end, - value: NonCodeValue::Shebang { - value: format!("#!{}", value), + Ok(Node::new( + NonCodeNode { + value: NonCodeValue::Shebang { + value: format!("#!{}", value), + }, + digest: None, }, - digest: None, - }) + 0, + tokens.last().unwrap().end, + )) } /// Parse the = operator. @@ -462,7 +470,7 @@ fn equals(i: TokenSlice) -> PResult { #[allow(clippy::large_enum_variant)] pub enum NonCodeOr { - NonCode(NonCodeNode), + NonCode(Node), Code(T), } @@ -477,17 +485,19 @@ fn array(i: TokenSlice) -> PResult { } /// Match an empty array. -fn array_empty(i: TokenSlice) -> PResult { +fn array_empty(i: TokenSlice) -> PResult> { let start = open_bracket(i)?.start; ignore_whitespace(i); let end = close_bracket(i)?.end; - Ok(ArrayExpression { + Ok(Node::new( + ArrayExpression { + elements: Default::default(), + non_code_meta: Default::default(), + digest: None, + }, start, end, - elements: Default::default(), - non_code_meta: Default::default(), - digest: None, - }) + )) } /// Match something that separates elements of an array. @@ -501,7 +511,7 @@ fn array_separator(i: TokenSlice) -> PResult<()> { .parse_next(i) } -pub(crate) fn array_elem_by_elem(i: TokenSlice) -> PResult { +pub(crate) fn array_elem_by_elem(i: TokenSlice) -> PResult> { let start = open_bracket(i)?.start; ignore_whitespace(i); let elements: Vec<_> = repeat( @@ -533,39 +543,43 @@ pub(crate) fn array_elem_by_elem(i: TokenSlice) -> PResult { ); let non_code_meta = NonCodeMeta { non_code_nodes, - start: Vec::new(), + start_nodes: Vec::new(), digest: None, }; - Ok(ArrayExpression { + Ok(Node::new( + ArrayExpression { + elements, + non_code_meta, + digest: None, + }, start, end, - elements, - non_code_meta, - digest: None, - }) + )) } -fn array_end_start(i: TokenSlice) -> PResult { +fn array_end_start(i: TokenSlice) -> PResult> { let start = open_bracket(i)?.start; ignore_whitespace(i); - let start_element = Box::new(expression.parse_next(i)?); + let start_element = expression.parse_next(i)?; ignore_whitespace(i); double_period.parse_next(i)?; ignore_whitespace(i); - let end_element = Box::new(expression.parse_next(i)?); + let end_element = expression.parse_next(i)?; ignore_whitespace(i); let end = close_bracket(i)?.end; - Ok(ArrayRangeExpression { + Ok(Node::new( + ArrayRangeExpression { + start_element, + end_element, + end_inclusive: true, + digest: None, + }, start, end, - start_element, - end_element, - end_inclusive: true, - digest: None, - }) + )) } -fn object_property(i: TokenSlice) -> PResult { +fn object_property(i: TokenSlice) -> PResult> { let key = identifier.context(expected("the property's key (the name or identifier of the property), e.g. in 'height: 4', 'height' is the property key")).parse_next(i)?; ignore_whitespace(i); colon @@ -579,12 +593,14 @@ fn object_property(i: TokenSlice) -> PResult { "the value which you're setting the property to, e.g. in 'height: 4', the value is 4", )) .parse_next(i)?; - Ok(ObjectProperty { + Ok(Node { start: key.start, end: expr.end(), - key, - value: expr, - digest: None, + inner: ObjectProperty { + key, + value: expr, + digest: None, + }, }) } @@ -600,7 +616,7 @@ fn property_separator(i: TokenSlice) -> PResult<()> { } /// Parse a KCL object value. -pub(crate) fn object(i: TokenSlice) -> PResult { +pub(crate) fn object(i: TokenSlice) -> PResult> { let start = open_brace(i)?.start; ignore_whitespace(i); let properties: Vec<_> = repeat( @@ -637,24 +653,22 @@ pub(crate) fn object(i: TokenSlice) -> PResult { non_code_nodes, ..Default::default() }; - Ok(ObjectExpression { + Ok(Node::new( + ObjectExpression { + properties, + non_code_meta, + digest: None, + }, start, end, - properties, - non_code_meta, - digest: None, - }) + )) } /// Parse the % symbol, used to substitute a curried argument from a |> (pipe). -fn pipe_sub(i: TokenSlice) -> PResult { +fn pipe_sub(i: TokenSlice) -> PResult> { any.try_map(|token: Token| { if matches!(token.token_type, TokenType::Operator) && token.value == PIPE_SUBSTITUTION_OPERATOR { - Ok(PipeSubstitution { - start: token.start, - end: token.end, - digest: None, - }) + Ok(Node::new(PipeSubstitution { digest: None }, token.start, token.end)) } else { Err(KclError::Syntax(KclErrorDetails { source_ranges: token.as_source_ranges(), @@ -669,7 +683,7 @@ fn pipe_sub(i: TokenSlice) -> PResult { .parse_next(i) } -fn else_if(i: TokenSlice) -> PResult { +fn else_if(i: TokenSlice) -> PResult> { let start = any .try_map(|token: Token| { if matches!(token.token_type, TokenType::Keyword) && token.value == "else" { @@ -708,16 +722,18 @@ fn else_if(i: TokenSlice) -> PResult { ignore_whitespace(i); let end = close_brace(i)?.end; ignore_whitespace(i); - Ok(ElseIf { + Ok(Node::new( + ElseIf { + cond, + then_val, + digest: Default::default(), + }, start, end, - cond, - then_val, - digest: Default::default(), - }) + )) } -fn if_expr(i: TokenSlice) -> PResult { +fn if_expr(i: TokenSlice) -> PResult> { let start = any .try_map(|token: Token| { if matches!(token.token_type, TokenType::Keyword) && token.value == "if" { @@ -771,15 +787,17 @@ fn if_expr(i: TokenSlice) -> PResult { .map(Box::new)?; ignore_whitespace(i); let end = close_brace(i)?.end; - Ok(IfExpression { + Ok(Node::boxed( + IfExpression { + cond, + then_val, + else_ifs, + final_else, + digest: Default::default(), + }, start, end, - cond, - then_val, - else_ifs, - final_else, - digest: Default::default(), - }) + )) } // Looks like @@ -787,7 +805,7 @@ fn if_expr(i: TokenSlice) -> PResult { // const x = arg0 + arg1; // return x // } -fn function_expression(i: TokenSlice) -> PResult { +fn function_expression(i: TokenSlice) -> PResult> { let start = open_paren(i)?.start; let params = parameters(i)?; close_paren(i)?; @@ -800,14 +818,16 @@ fn function_expression(i: TokenSlice) -> PResult { open_brace(i)?; let body = function_body(i)?; let end = close_brace(i)?.end; - Ok(FunctionExpression { + Ok(Node::new( + FunctionExpression { + params, + body, + return_type, + digest: None, + }, start, end, - params, - body, - return_type, - digest: None, - }) + )) } /// E.g. `person.name` @@ -827,7 +847,7 @@ fn member_expression_subscript(i: TokenSlice) -> PResult<(LiteralIdentifier, usi let _ = open_bracket.parse_next(i)?; let property = alt(( sketch_keyword.map(Box::new).map(LiteralIdentifier::Identifier), - literal.map(Box::new).map(LiteralIdentifier::Literal), + literal.map(LiteralIdentifier::Literal), identifier.map(Box::new).map(LiteralIdentifier::Identifier), )) .parse_next(i)?; @@ -839,7 +859,7 @@ fn member_expression_subscript(i: TokenSlice) -> PResult<(LiteralIdentifier, usi /// Get a property of an object, or an index of an array, or a member of a collection. /// Can be arbitrarily nested, e.g. `people[i]['adam'].age`. -fn member_expression(i: TokenSlice) -> PResult { +fn member_expression(i: TokenSlice) -> PResult> { // This is an identifier, followed by a sequence of members (aka properties) // First, the identifier. let id = identifier.context(expected("the identifier of the object whose property you're trying to access, e.g. in 'shape.size.width', 'shape' is the identifier")).parse_next(i)?; @@ -854,14 +874,16 @@ fn member_expression(i: TokenSlice) -> PResult { // which is guaranteed to have >=1 elements. let (property, end, computed) = members.remove(0); let start = id.start; - let initial_member_expression = MemberExpression { + let initial_member_expression = Node::new( + MemberExpression { + object: MemberObject::Identifier(Box::new(id)), + computed, + property, + digest: None, + }, start, end, - object: MemberObject::Identifier(Box::new(id)), - computed, - property, - digest: None, - }; + ); // Each remaining member wraps the current member expression inside another member expression. Ok(members @@ -869,20 +891,22 @@ fn member_expression(i: TokenSlice) -> PResult { // Take the accumulated member expression from the previous iteration, // and use it as the `object` of a new, bigger member expression. .fold(initial_member_expression, |accumulated, (property, end, computed)| { - MemberExpression { + Node::new( + MemberExpression { + object: MemberObject::MemberExpression(Box::new(accumulated)), + computed, + property, + digest: None, + }, start, end, - object: MemberObject::MemberExpression(Box::new(accumulated)), - computed, - property, - digest: None, - } + ) })) } /// Find a noncode node which occurs just after a body item, /// such that if the noncode item is a comment, it might be an inline comment. -fn noncode_just_after_code(i: TokenSlice) -> PResult { +fn noncode_just_after_code(i: TokenSlice) -> PResult> { let ws = opt(whitespace).parse_next(i)?; // What is the preceding whitespace like? @@ -901,7 +925,7 @@ fn noncode_just_after_code(i: TokenSlice) -> PResult { if has_empty_line { // There's an empty line between the body item and the comment, // This means the comment is a NewLineBlockComment! - let value = match nc.value { + let value = match nc.inner.value { NonCodeValue::Shebang { value } => NonCodeValue::Shebang { value }, // Change block comments to inline, as discussed above NonCodeValue::BlockComment { value, style } => NonCodeValue::NewLineBlockComment { value, style }, @@ -910,18 +934,14 @@ fn noncode_just_after_code(i: TokenSlice) -> PResult { x @ NonCodeValue::NewLineBlockComment { .. } => x, x @ NonCodeValue::NewLine => x, }; - NonCodeNode { - value, - start: nc.start.saturating_sub(1), - ..nc - } + Node::new(NonCodeNode { value, ..nc.inner }, nc.start.saturating_sub(1), nc.end) } else if has_newline { // Nothing has to change, a single newline does not need preserving. nc } else { // There's no newline between the body item and comment, // so if this is a comment, it must be inline with code. - let value = match nc.value { + let value = match nc.inner.value { NonCodeValue::Shebang { value } => NonCodeValue::Shebang { value }, // Change block comments to inline, as discussed above NonCodeValue::BlockComment { value, style } => NonCodeValue::InlineComment { value, style }, @@ -930,13 +950,10 @@ fn noncode_just_after_code(i: TokenSlice) -> PResult { x @ NonCodeValue::NewLineBlockComment { .. } => x, x @ NonCodeValue::NewLine => x, }; - NonCodeNode { value, ..nc } + Node::new(NonCodeNode { value, ..nc.inner }, nc.start, nc.end) } }) - .map(|nc| NonCodeNode { - start: nc.start.saturating_sub(1), - ..nc - }) + .map(|nc| Node::new(nc.inner, nc.start.saturating_sub(1), nc.end)) .parse_next(i)?; Ok(nc) } @@ -948,8 +965,17 @@ fn noncode_just_after_code(i: TokenSlice) -> PResult { #[derive(Debug)] #[allow(clippy::large_enum_variant)] enum WithinFunction { - BodyItem((BodyItem, Option)), - NonCode(NonCodeNode), + BodyItem((BodyItem, Option>)), + NonCode(Node), +} + +impl WithinFunction { + fn is_newline(&self) -> bool { + match self { + WithinFunction::NonCode(nc) => nc.value == NonCodeValue::NewLine, + _ => false, + } + } } fn body_items_within_function(i: TokenSlice) -> PResult { @@ -983,7 +1009,7 @@ fn body_items_within_function(i: TokenSlice) -> PResult { } /// Parse the body of a user-defined function. -pub fn function_body(i: TokenSlice) -> PResult { +pub fn function_body(i: TokenSlice) -> PResult> { let leading_whitespace_start = alt(( peek(non_code_node).map(|_| None), // Subtract 1 from `t.start` to match behaviour of the old parser. @@ -1014,13 +1040,7 @@ pub fn function_body(i: TokenSlice) -> PResult { // The solution is that this parser should check if the last matched body item was an empty line, // and if so, then ignore the separator parser for the current iteration. loop { - let last_match_was_empty_line = matches!( - things_within_body.last(), - Some(WithinFunction::NonCode(NonCodeNode { - value: NonCodeValue::NewLine, - .. - })) - ); + let last_match_was_empty_line = things_within_body.last().map(|wf| wf.is_newline()).unwrap_or(false); use winnow::stream::Stream; @@ -1034,12 +1054,14 @@ pub fn function_body(i: TokenSlice) -> PResult { // deliberately put an empty line there. We should track this and preserve it. if let Ok(ref ws_token) = found_ws { if ws_token.value.contains("\n\n") { - things_within_body.push(WithinFunction::NonCode(NonCodeNode { - start: ws_token.start, - end: ws_token.end, - value: NonCodeValue::NewLine, - digest: None, - })); + things_within_body.push(WithinFunction::NonCode(Node::new( + NonCodeNode { + value: NonCodeValue::NewLine, + digest: None, + }, + ws_token.start, + ws_token.end, + ))); } } @@ -1096,7 +1118,7 @@ pub fn function_body(i: TokenSlice) -> PResult { } end = nc.end; if body.is_empty() { - non_code_meta.start.push(nc); + non_code_meta.start_nodes.push(nc); } else { non_code_meta.insert(body.len() - 1, nc); } @@ -1115,16 +1137,18 @@ pub fn function_body(i: TokenSlice) -> PResult { end = end.max(end_ws); } end += 1; - Ok(Program { + Ok(Node::new( + Program { + body, + non_code_meta, + digest: None, + }, start, end, - body, - non_code_meta, - digest: None, - }) + )) } -fn import_stmt(i: TokenSlice) -> PResult> { +fn import_stmt(i: TokenSlice) -> PResult> { let import_token = any .try_map(|token: Token| { if matches!(token.token_type, TokenType::Keyword) && token.value == "import" { @@ -1165,8 +1189,8 @@ fn import_stmt(i: TokenSlice) -> PResult> { require_whitespace(i)?; let path = string_literal(i)?; - let end = path.end(); - let path_string = match path.value { + let end = path.end; + let path_string = match path.inner.value { LiteralValue::String(s) => s, _ => unreachable!(), }; @@ -1182,17 +1206,19 @@ fn import_stmt(i: TokenSlice) -> PResult> { .into(), )); } - Ok(Box::new(ImportStatement { - items, - path: path_string, - raw_path: path.raw, + Ok(Node::boxed( + ImportStatement { + items, + path: path_string, + raw_path: path.inner.raw, + digest: None, + }, start, end, - digest: None, - })) + )) } -fn import_item(i: TokenSlice) -> PResult { +fn import_item(i: TokenSlice) -> PResult> { let name = identifier.context(expected("an identifier to import")).parse_next(i)?; let start = name.start; let alias = opt(preceded( @@ -1201,17 +1227,19 @@ fn import_item(i: TokenSlice) -> PResult { )) .parse_next(i)?; let end = if let Some(ref alias) = alias { - alias.end() + alias.end } else { - name.end() + name.end }; - Ok(ImportItem { - name, - alias, + Ok(Node::new( + ImportItem { + name, + alias, + digest: None, + }, start, end, - digest: None, - }) + )) } fn import_as_keyword(i: TokenSlice) -> PResult { @@ -1230,7 +1258,7 @@ fn import_as_keyword(i: TokenSlice) -> PResult { } /// Parse a return statement of a user-defined function, e.g. `return x`. -pub fn return_stmt(i: TokenSlice) -> PResult { +pub fn return_stmt(i: TokenSlice) -> PResult> { let start = any .try_map(|token: Token| { if matches!(token.token_type, TokenType::Keyword) && token.value == "return" { @@ -1248,11 +1276,10 @@ pub fn return_stmt(i: TokenSlice) -> PResult { .parse_next(i)?; require_whitespace(i)?; let argument = expression(i)?; - Ok(ReturnStatement { + Ok(Node { start, end: argument.end(), - argument, - digest: None, + inner: ReturnStatement { argument, digest: None }, }) } @@ -1288,16 +1315,16 @@ fn unnecessarily_bracketed(i: TokenSlice) -> PResult { fn expr_allowed_in_pipe_expr(i: TokenSlice) -> PResult { alt(( member_expression.map(Box::new).map(Expr::MemberExpression), - bool_value.map(Box::new).map(Expr::Literal), + bool_value.map(Expr::Literal), tag.map(Box::new).map(Expr::TagDeclarator), - literal.map(Box::new).map(Expr::Literal), + literal.map(Expr::Literal), fn_call.map(Box::new).map(Expr::CallExpression), identifier.map(Box::new).map(Expr::Identifier), array, object.map(Box::new).map(Expr::ObjectExpression), pipe_sub.map(Box::new).map(Expr::PipeSubstitution), function_expression.map(Box::new).map(Expr::FunctionExpression), - if_expr.map(Box::new).map(Expr::IfExpression), + if_expr.map(Expr::IfExpression), unnecessarily_bracketed, )) .context(expected("a KCL expression (but not a pipe expression)")) @@ -1307,9 +1334,9 @@ fn expr_allowed_in_pipe_expr(i: TokenSlice) -> PResult { fn possible_operands(i: TokenSlice) -> PResult { alt(( unary_expression.map(Box::new).map(Expr::UnaryExpression), - bool_value.map(Box::new).map(Expr::Literal), + bool_value.map(Expr::Literal), member_expression.map(Box::new).map(Expr::MemberExpression), - literal.map(Box::new).map(Expr::Literal), + literal.map(Expr::Literal), fn_call.map(Box::new).map(Expr::CallExpression), identifier.map(Box::new).map(Expr::Identifier), binary_expr_in_parens.map(Box::new).map(Expr::BinaryExpression), @@ -1342,7 +1369,7 @@ fn declaration_keyword(i: TokenSlice) -> PResult<(VariableKind, Token)> { } /// Parse a variable/constant declaration. -fn declaration(i: TokenSlice) -> PResult> { +fn declaration(i: TokenSlice) -> PResult> { let (visibility, visibility_token) = opt(terminated(item_visibility, whitespace)) .parse_next(i)? .map_or((ItemVisibility::Default, None), |pair| (pair.0, Some(pair.1))); @@ -1361,7 +1388,7 @@ fn declaration(i: TokenSlice) -> PResult> { let (kind, mut start, dec_end) = if let Some((kind, token)) = &decl_token { (*kind, token.start, token.end) } else { - (VariableKind::Const, id.start(), id.end()) + (VariableKind::Const, id.start, id.end) }; if let Some(token) = visibility_token { start = token.start; @@ -1404,33 +1431,39 @@ fn declaration(i: TokenSlice) -> PResult> { .map_err(|e| e.cut())?; let end = val.end(); - Ok(Box::new(VariableDeclaration { + Ok(Box::new(Node { + inner: VariableDeclaration { + declarations: vec![Node { + start: id.start, + end, + inner: VariableDeclarator { + id, + init: val, + digest: None, + }, + }], + visibility, + kind, + digest: None, + }, start, end, - declarations: vec![VariableDeclarator { - start: id.start, - end, - id, - init: val, - digest: None, - }], - visibility, - kind, - digest: None, })) } -impl TryFrom for Identifier { +impl TryFrom for Node { type Error = KclError; fn try_from(token: Token) -> Result { if token.token_type == TokenType::Word { - Ok(Identifier { - start: token.start, - end: token.end, - name: token.value, - digest: None, - }) + Ok(Node::new( + Identifier { + name: token.value, + digest: None, + }, + token.start, + token.end, + )) } else { Err(KclError::Syntax(KclErrorDetails { source_ranges: token.as_source_ranges(), @@ -1444,21 +1477,23 @@ impl TryFrom for Identifier { } /// Parse a KCL identifier (name of a constant/variable/function) -fn identifier(i: TokenSlice) -> PResult { - any.try_map(Identifier::try_from) +fn identifier(i: TokenSlice) -> PResult> { + any.try_map(Node::::try_from) .context(expected("an identifier, e.g. 'width' or 'myPart'")) .parse_next(i) } -fn sketch_keyword(i: TokenSlice) -> PResult { +fn sketch_keyword(i: TokenSlice) -> PResult> { any.try_map(|token: Token| { if token.token_type == TokenType::Type && token.value == "sketch" { - Ok(Identifier { - start: token.start, - end: token.end, - name: token.value, - digest: None, - }) + Ok(Node::new( + Identifier { + name: token.value, + digest: None, + }, + token.start, + token.end, + )) } else { Err(KclError::Syntax(KclErrorDetails { source_ranges: token.as_source_ranges(), @@ -1470,18 +1505,20 @@ fn sketch_keyword(i: TokenSlice) -> PResult { .parse_next(i) } -impl TryFrom for TagDeclarator { +impl TryFrom for Node { type Error = KclError; fn try_from(token: Token) -> Result { if token.token_type == TokenType::Word { - Ok(TagDeclarator { - // We subtract 1 from the start because the tag starts with a `$`. - start: token.start - 1, - end: token.end, - name: token.value, - digest: None, - }) + Ok(Node::new( + TagDeclarator { + // We subtract 1 from the start because the tag starts with a `$`. + name: token.value, + digest: None, + }, + token.start - 1, + token.end, + )) } else { Err(KclError::Syntax(KclErrorDetails { source_ranges: token.as_source_ranges(), @@ -1491,7 +1528,7 @@ impl TryFrom for TagDeclarator { } } -impl TagDeclarator { +impl Node { fn into_valid_binding_name(self) -> Result { // Make sure they are not assigning a variable to a stdlib function. if crate::std::name_in_stdlib(&self.name) { @@ -1505,11 +1542,17 @@ impl TagDeclarator { } /// Parse a Kcl tag that starts with a `$`. -fn tag(i: TokenSlice) -> PResult { +fn tag(i: TokenSlice) -> PResult> { dollar.parse_next(i)?; - any.try_map(TagDeclarator::try_from) + let tag_declarator = any + .try_map(Node::::try_from) .context(expected("a tag, e.g. '$seg01' or '$line01'")) - .parse_next(i) + .parse_next(i)?; + // Now that we've parsed a tag declarator, verify that it's not a stdlib + // name. If it is, stop backtracking. + tag_declarator + .into_valid_binding_name() + .map_err(|e| ErrMode::Cut(ContextError::from(e))) } /// Helper function. Matches any number of whitespace tokens and ignores them. @@ -1527,7 +1570,7 @@ fn require_whitespace(i: TokenSlice) -> PResult<()> { repeat(1.., whitespace).parse_next(i) } -fn unary_expression(i: TokenSlice) -> PResult { +fn unary_expression(i: TokenSlice) -> PResult> { const EXPECTED: &str = "expected a unary operator (like '-', the negative-numeric operator),"; let (operator, op_token) = any .try_map(|token: Token| match token.token_type { @@ -1542,12 +1585,14 @@ fn unary_expression(i: TokenSlice) -> PResult { .context(expected("a unary expression, e.g. -x or -3")) .parse_next(i)?; let argument = operand.parse_next(i)?; - Ok(UnaryExpression { + Ok(Node { start: op_token.start, end: argument.end(), - operator, - argument, - digest: None, + inner: UnaryExpression { + operator, + argument, + digest: None, + }, }) } @@ -1574,7 +1619,7 @@ fn binary_expression_tokens(i: TokenSlice) -> PResult } /// Parse an infix binary expression. -fn binary_expression(i: TokenSlice) -> PResult { +fn binary_expression(i: TokenSlice) -> PResult> { // Find the slice of tokens which makes up the binary expression let tokens = binary_expression_tokens.parse_next(i)?; @@ -1584,7 +1629,7 @@ fn binary_expression(i: TokenSlice) -> PResult { Ok(expr) } -fn binary_expr_in_parens(i: TokenSlice) -> PResult { +fn binary_expr_in_parens(i: TokenSlice) -> PResult> { let span_with_brackets = bracketed_section.take().parse_next(i)?; let n = span_with_brackets.len(); let mut span_no_brackets = &span_with_brackets[1..n - 1]; @@ -1615,17 +1660,19 @@ fn bracketed_section(i: TokenSlice) -> PResult { } /// Parse a KCL expression statement. -fn expression_stmt(i: TokenSlice) -> PResult { +fn expression_stmt(i: TokenSlice) -> PResult> { let val = expression .context(expected( "an expression (i.e. a value, or an algorithm for calculating one), e.g. 'x + y' or '3' or 'width * 2'", )) .parse_next(i)?; - Ok(ExpressionStatement { + Ok(Node { start: val.start(), end: val.end(), - expression: val, - digest: None, + inner: ExpressionStatement { + expression: val, + digest: None, + }, }) } @@ -1818,7 +1865,8 @@ fn parameters(i: TokenSlice) -> PResult> { let params: Vec = candidates .into_iter() .map(|(arg_name, type_, optional)| { - let identifier = Identifier::try_from(arg_name).and_then(Identifier::into_valid_binding_name)?; + let identifier = + Node::::try_from(arg_name).and_then(Node::::into_valid_binding_name)?; Ok(Parameter { identifier, @@ -1854,8 +1902,8 @@ fn optional_after_required(params: &[Parameter]) -> Result<(), KclError> { Ok(()) } -impl Identifier { - fn into_valid_binding_name(self) -> Result { +impl Node { + fn into_valid_binding_name(self) -> Result, KclError> { // Make sure they are not assigning a variable to a stdlib function. if crate::std::name_in_stdlib(&self.name) { return Err(KclError::Syntax(KclErrorDetails { @@ -1868,15 +1916,15 @@ impl Identifier { } /// Introduce a new name, which binds some value. -fn binding_name(i: TokenSlice) -> PResult { +fn binding_name(i: TokenSlice) -> PResult> { identifier .context(expected("an identifier, which will be the name of some value")) - .try_map(Identifier::into_valid_binding_name) + .try_map(Node::::into_valid_binding_name) .context(expected("an identifier, which will be the name of some value")) .parse_next(i) } -fn fn_call(i: TokenSlice) -> PResult { +fn fn_call(i: TokenSlice) -> PResult> { let fn_name = identifier(i)?; opt(whitespace).parse_next(i)?; let _ = terminated(open_paren, opt(whitespace)).parse_next(i)?; @@ -1889,11 +1937,12 @@ fn fn_call(i: TokenSlice) -> PResult { continue; }; match spec_arg.type_.as_ref() { - "TagDeclarator" => match &arg { + "TagNode" => match &arg { Expr::Identifier(_) => { // These are fine since we want someone to be able to map a variable to a tag declarator. } Expr::TagDeclarator(tag) => { + // TODO: Remove this check. It should be redundant. tag.clone() .into_valid_binding_name() .map_err(|e| ErrMode::Cut(ContextError::from(e)))?; @@ -1926,13 +1975,15 @@ fn fn_call(i: TokenSlice) -> PResult { } } let end = preceded(opt(whitespace), close_paren).parse_next(i)?.end; - Ok(CallExpression { + Ok(Node { start: fn_name.start, end, - callee: fn_name, - arguments: args, - optional: false, - digest: None, + inner: CallExpression { + callee: fn_name, + arguments: args, + optional: false, + digest: None, + }, }) } @@ -1990,7 +2041,7 @@ mod tests { fn test_vardec_no_keyword() { let tokens = crate::token::lexer("x = 4").unwrap(); let vardec = declaration(&mut tokens.as_slice()).unwrap(); - assert_eq!(vardec.kind, VariableKind::Const); + assert_eq!(vardec.inner.kind, VariableKind::Const); let vardec = vardec.declarations.first().unwrap(); assert_eq!(vardec.id.name, "x"); let Expr::Literal(init_val) = &vardec.init else { @@ -2019,7 +2070,7 @@ mod tests { let mut slice = tokens.as_slice(); let expr = function_expression.parse_next(&mut slice).unwrap(); assert_eq!(expr.params, vec![]); - let comment_start = expr.body.non_code_meta.start.first().unwrap(); + let comment_start = expr.body.non_code_meta.start_nodes.first().unwrap(); let comment0 = &expr.body.non_code_meta.non_code_nodes.get(&0).unwrap()[0]; let comment1 = &expr.body.non_code_meta.non_code_nodes.get(&1).unwrap()[0]; assert_eq!(comment_start.value(), "comment 0"); @@ -2048,7 +2099,7 @@ comment */ const mySk1 = startSketchAt([0, 0])"#; let tokens = crate::token::lexer(test_program).unwrap(); let program = program.parse(&tokens).unwrap(); - let mut starting_comments = program.non_code_meta.start; + let mut starting_comments = program.inner.non_code_meta.start_nodes; assert_eq!(starting_comments.len(), 2); let start0 = starting_comments.remove(0); let start1 = starting_comments.remove(0); @@ -2065,15 +2116,15 @@ const mySk1 = startSketchAt([0, 0])"#; #[test] fn test_comment_in_pipe() { let tokens = crate::token::lexer(r#"const x = y() |> /*hi*/ z(%)"#).unwrap(); - let mut body = program.parse(&tokens).unwrap().body; + let mut body = program.parse(&tokens).unwrap().inner.body; let BodyItem::VariableDeclaration(mut item) = body.remove(0) else { panic!("expected vardec"); }; - let val = item.declarations.remove(0).init; + let val = item.declarations.remove(0).inner.init; let Expr::PipeExpression(pipe) = val else { panic!("expected pipe"); }; - let mut noncode = pipe.non_code_meta; + let mut noncode = pipe.inner.non_code_meta; assert_eq!(noncode.non_code_nodes.len(), 1); let comment = noncode.non_code_nodes.remove(&0).unwrap().pop().unwrap(); assert_eq!( @@ -2107,40 +2158,50 @@ const mySk1 = startSketchAt([0, 0])"#; let expr = function_expression.parse_next(&mut slice).unwrap(); assert_eq!( expr, - FunctionExpression { - start: 0, - end: 47, - params: Default::default(), - body: Program { - start: 7, - end: 47, - body: vec![BodyItem::ReturnStatement(ReturnStatement { - start: 25, - end: 33, - argument: Expr::Literal(Box::new(Literal { - start: 32, - end: 33, - value: 2u32.into(), - raw: "2".to_owned(), + Node::new( + FunctionExpression { + params: Default::default(), + body: Node::new( + Program { + body: vec![BodyItem::ReturnStatement(Node::new( + ReturnStatement { + argument: Expr::Literal(Box::new(Node::new( + Literal { + value: 2u32.into(), + raw: "2".to_owned(), + digest: None, + }, + 32, + 33, + ))), + digest: None, + }, + 25, + 33, + ))], + non_code_meta: NonCodeMeta { + non_code_nodes: Default::default(), + start_nodes: vec![Node::new( + NonCodeNode { + value: NonCodeValue::NewLine, + digest: None + }, + 7, + 25, + )], + digest: None, + }, digest: None, - })), - digest: None, - })], - non_code_meta: NonCodeMeta { - non_code_nodes: Default::default(), - start: vec![NonCodeNode { - start: 7, - end: 25, - value: NonCodeValue::NewLine, - digest: None - }], - digest: None, - }, + }, + 7, + 47, + ), + return_type: None, digest: None, }, - return_type: None, - digest: None, - } + 0, + 47, + ) ); } @@ -2153,8 +2214,11 @@ const mySk1 = startSketchAt([0, 0])"#; let tokens = crate::token::lexer(test_input).unwrap(); let mut slice = tokens.as_slice(); - let PipeExpression { - body, non_code_meta, .. + let Node { + inner: PipeExpression { + body, non_code_meta, .. + }, + .. } = pipe_expression.parse_next(&mut slice).unwrap(); assert_eq!(non_code_meta.non_code_nodes.len(), 1); assert_eq!( @@ -2179,49 +2243,59 @@ const mySk1 = startSketchAt([0, 0])"#; "#; let tokens = crate::token::lexer(test_program).unwrap(); - let Program { non_code_meta, .. } = function_body.parse(&tokens).unwrap(); + let Program { non_code_meta, .. } = function_body.parse(&tokens).unwrap().inner; assert_eq!( - vec![NonCodeNode { - start: 0, - end: 20, - value: NonCodeValue::BlockComment { - value: "this is a comment".to_owned(), - style: CommentStyle::Line - }, - digest: None, - }], - non_code_meta.start, - ); - assert_eq!( - Some(&vec![ + vec![Node::new( NonCodeNode { - start: 60, - end: 82, - value: NonCodeValue::InlineComment { - value: "block\n comment".to_owned(), - style: CommentStyle::Block + value: NonCodeValue::BlockComment { + value: "this is a comment".to_owned(), + style: CommentStyle::Line }, digest: None, }, - NonCodeNode { - start: 82, - end: 86, - value: NonCodeValue::NewLine, - digest: None, - }, + 0, + 20, + )], + non_code_meta.start_nodes, + ); + + assert_eq!( + Some(&vec![ + Node::new( + NonCodeNode { + value: NonCodeValue::InlineComment { + value: "block\n comment".to_owned(), + style: CommentStyle::Block + }, + digest: None, + }, + 60, + 82, + ), + Node::new( + NonCodeNode { + value: NonCodeValue::NewLine, + digest: None, + }, + 82, + 86, + ) ]), non_code_meta.non_code_nodes.get(&0), ); + assert_eq!( - Some(&vec![NonCodeNode { - start: 103, - end: 129, - value: NonCodeValue::BlockComment { - value: "this is also a comment".to_owned(), - style: CommentStyle::Line + Some(&vec![Node::new( + NonCodeNode { + value: NonCodeValue::BlockComment { + value: "this is also a comment".to_owned(), + style: CommentStyle::Line + }, + digest: None, }, - digest: None, - }]), + 103, + 129, + )]), non_code_meta.non_code_nodes.get(&1), ); } @@ -2277,20 +2351,17 @@ const mySk1 = startSketchAt([0, 0])"#; // The RHS should be a binary expression. let actual = binary_expression.parse(&tokens).unwrap(); assert_eq!(actual.operator, BinaryOperator::Mul); - let BinaryPart::BinaryExpression(rhs) = actual.right else { + let BinaryPart::BinaryExpression(rhs) = actual.inner.right else { panic!("Expected RHS to be another binary expression"); }; assert_eq!(rhs.operator, BinaryOperator::Sub); - assert_eq!( - rhs.right, - BinaryPart::Literal(Box::new(Literal { - start: 9, - end: 10, - value: 3u32.into(), - raw: "3".to_owned(), - digest: None, - })) - ); + match &rhs.right { + BinaryPart::Literal(lit) => { + assert!(lit.start == 9 && lit.end == 10); + assert!(lit.value == 3u32.into() && &lit.raw == "3" && lit.digest.is_none()); + } + _ => panic!(), + } } #[test] @@ -2309,7 +2380,7 @@ const mySk1 = startSketchAt([0, 0])"#; Err(e) => panic!("Could not parse test {i}: {e:#?}"), Ok(a) => a, }; - let Expr::BinaryExpression(_expr) = actual.declarations.remove(0).init else { + let Expr::BinaryExpression(_expr) = actual.declarations.remove(0).inner.init else { panic!( "Expected test {i} to be a binary expression but it wasn't, it was {:?}", actual.declarations[0] @@ -2337,12 +2408,12 @@ const mySk1 = startSketchAt([0, 0])"#; // The RHS should be a binary expression. let outer = binary_expression.parse(&tokens).unwrap(); assert_eq!(outer.operator, BinaryOperator::Mul); - let BinaryPart::BinaryExpression(middle) = outer.right else { + let BinaryPart::BinaryExpression(middle) = outer.inner.right else { panic!("Expected RHS to be another binary expression"); }; assert_eq!(middle.operator, BinaryOperator::Div); - let BinaryPart::BinaryExpression(inner) = middle.left else { + let BinaryPart::BinaryExpression(inner) = middle.inner.left else { panic!("expected nested binary expression"); }; assert_eq!(inner.operator, BinaryOperator::Sub); @@ -2355,11 +2426,11 @@ const mySk1 = startSketchAt([0, 0])"#; let tokens = crate::token::lexer(test).unwrap(); let actual = binary_expression.parse(&tokens).unwrap(); assert_eq!(actual.operator, BinaryOperator::Sub); - let BinaryPart::Literal(left) = actual.left else { + let BinaryPart::Literal(left) = actual.inner.left else { panic!("should be expression"); }; assert_eq!(left.value, 1u32.into()); - let BinaryPart::Literal(right) = actual.right else { + let BinaryPart::Literal(right) = actual.inner.right else { panic!("should be expression"); }; assert_eq!(right.value, 2u32.into()); @@ -2415,107 +2486,123 @@ const mySk1 = startSketchAt([0, 0])"#; for (i, (test_program, expected)) in [ ( "//hi", - NonCodeNode { - start: 0, - end: 4, - value: NonCodeValue::BlockComment { - value: "hi".to_owned(), - style: CommentStyle::Line, + Node::new( + NonCodeNode { + value: NonCodeValue::BlockComment { + value: "hi".to_owned(), + style: CommentStyle::Line, + }, + digest: None, }, - digest: None, - }, + 0, + 4, + ), ), ( "/*hello*/", - NonCodeNode { - start: 0, - end: 9, - value: NonCodeValue::BlockComment { - value: "hello".to_owned(), - style: CommentStyle::Block, + Node::new( + NonCodeNode { + value: NonCodeValue::BlockComment { + value: "hello".to_owned(), + style: CommentStyle::Block, + }, + digest: None, }, - digest: None, - }, + 0, + 9, + ), ), ( "/* hello */", - NonCodeNode { - start: 0, - end: 11, - value: NonCodeValue::BlockComment { - value: "hello".to_owned(), - style: CommentStyle::Block, + Node::new( + NonCodeNode { + value: NonCodeValue::BlockComment { + value: "hello".to_owned(), + style: CommentStyle::Block, + }, + digest: None, }, - digest: None, - }, + 0, + 11, + ), ), ( "/* \nhello */", - NonCodeNode { - start: 0, - end: 12, - value: NonCodeValue::BlockComment { - value: "hello".to_owned(), - style: CommentStyle::Block, + Node::new( + NonCodeNode { + value: NonCodeValue::BlockComment { + value: "hello".to_owned(), + style: CommentStyle::Block, + }, + digest: None, }, - digest: None, - }, + 0, + 12, + ), ), ( " /* hello */", - NonCodeNode { - start: 0, - end: 29, - value: NonCodeValue::BlockComment { - value: "hello".to_owned(), - style: CommentStyle::Block, + Node::new( + NonCodeNode { + value: NonCodeValue::BlockComment { + value: "hello".to_owned(), + style: CommentStyle::Block, + }, + digest: None, }, - digest: None, - }, + 0, + 29, + ), ), ( // Empty line with trailing whitespace " /* hello */", - NonCodeNode { - start: 0, - end: 32, - value: NonCodeValue::NewLineBlockComment { - value: "hello".to_owned(), - style: CommentStyle::Block, + Node::new( + NonCodeNode { + value: NonCodeValue::NewLineBlockComment { + value: "hello".to_owned(), + style: CommentStyle::Block, + }, + digest: None, }, - digest: None, - }, + 0, + 32, + ), ), ( // Empty line, no trailing whitespace " /* hello */", - NonCodeNode { - start: 0, - end: 30, - value: NonCodeValue::NewLineBlockComment { - value: "hello".to_owned(), - style: CommentStyle::Block, + Node::new( + NonCodeNode { + value: NonCodeValue::NewLineBlockComment { + value: "hello".to_owned(), + style: CommentStyle::Block, + }, + digest: None, }, - digest: None, - }, + 0, + 30, + ), ), ( r#"/* block comment */"#, - NonCodeNode { - start: 0, - end: 39, - value: NonCodeValue::BlockComment { - value: "block\n comment".to_owned(), - style: CommentStyle::Block, + Node::new( + NonCodeNode { + value: NonCodeValue::BlockComment { + value: "block\n comment".to_owned(), + style: CommentStyle::Block, + }, + digest: None, }, - digest: None, - }, + 0, + 39, + ), ), ] .into_iter() @@ -2599,7 +2686,7 @@ const mySk1 = startSketchAt([0, 0])"#; let tokens = crate::token::lexer(input).unwrap(); let actual = parameters.parse(&tokens); assert!(actual.is_ok(), "could not parse test {i}"); - let actual_ids: Vec<_> = actual.unwrap().into_iter().map(|p| p.identifier.name).collect(); + let actual_ids: Vec<_> = actual.unwrap().into_iter().map(|p| p.identifier.inner.name).collect(); assert_eq!(actual_ids, expected); } } @@ -2621,7 +2708,7 @@ const mySk1 = startSketchAt([0, 0])"#; for test in tests { // Run the original parser let tokens = crate::token::lexer(test).unwrap(); - let mut expected_body = crate::parser::Parser::new(tokens.clone()).ast().unwrap().body; + let mut expected_body = crate::parser::Parser::new(tokens.clone()).ast().unwrap().inner.body; assert_eq!(expected_body.len(), 1); let BodyItem::VariableDeclaration(expected) = expected_body.pop().unwrap() else { panic!("Expected variable declaration"); @@ -2632,12 +2719,12 @@ const mySk1 = startSketchAt([0, 0])"#; assert_eq!(expected, actual); // Inspect its output in more detail. - assert_eq!(actual.kind, VariableKind::Const); + assert_eq!(actual.inner.kind, VariableKind::Const); assert_eq!(actual.start, 0); assert_eq!(actual.declarations.len(), 1); let decl = actual.declarations.pop().unwrap(); assert_eq!(decl.id.name, "myVar"); - let Expr::Literal(value) = decl.init else { + let Expr::Literal(value) = decl.inner.init else { panic!("value should be a literal") }; assert_eq!(value.end, test.len()); @@ -2648,33 +2735,41 @@ const mySk1 = startSketchAt([0, 0])"#; #[test] fn test_math_parse() { let tokens = crate::token::lexer(r#"5 + "a""#).unwrap(); - let actual = crate::parser::Parser::new(tokens).ast().unwrap().body; - let expr = BinaryExpression { - start: 0, - end: 7, - operator: BinaryOperator::Add, - left: BinaryPart::Literal(Box::new(Literal { - start: 0, - end: 1, - value: 5u32.into(), - raw: "5".to_owned(), + let actual = crate::parser::Parser::new(tokens).ast().unwrap().inner.body; + let expr = Node::boxed( + BinaryExpression { + operator: BinaryOperator::Add, + left: BinaryPart::Literal(Box::new(Node::new( + Literal { + value: 5u32.into(), + raw: "5".to_owned(), + digest: None, + }, + 0, + 1, + ))), + right: BinaryPart::Literal(Box::new(Node::new( + Literal { + value: "a".into(), + raw: r#""a""#.to_owned(), + digest: None, + }, + 4, + 7, + ))), digest: None, - })), - right: BinaryPart::Literal(Box::new(Literal { - start: 4, - end: 7, - value: "a".into(), - raw: r#""a""#.to_owned(), + }, + 0, + 7, + ); + let expected = vec![BodyItem::ExpressionStatement(Node::new( + ExpressionStatement { + expression: Expr::BinaryExpression(expr), digest: None, - })), - digest: None, - }; - let expected = vec![BodyItem::ExpressionStatement(ExpressionStatement { - start: 0, - end: 7, - expression: Expr::BinaryExpression(Box::new(expr)), - digest: None, - })]; + }, + 0, + 7, + ))]; assert_eq!(expected, actual); } @@ -2761,37 +2856,47 @@ const mySk1 = startSketchAt([0, 0])"#; let code = "5 +6"; let parser = crate::parser::Parser::new(crate::token::lexer(code).unwrap()); let result = parser.ast().unwrap(); - let expected_result = Program { - start: 0, - end: 4, - body: vec![BodyItem::ExpressionStatement(ExpressionStatement { - start: 0, - end: 4, - expression: Expr::BinaryExpression(Box::new(BinaryExpression { - start: 0, - end: 4, - left: BinaryPart::Literal(Box::new(Literal { - start: 0, - end: 1, - value: 5u32.into(), - raw: "5".to_string(), + let expected_result = Node::new( + Program { + body: vec![BodyItem::ExpressionStatement(Node::new( + ExpressionStatement { + expression: Expr::BinaryExpression(Node::boxed( + BinaryExpression { + left: BinaryPart::Literal(Box::new(Node::new( + Literal { + value: 5u32.into(), + raw: "5".to_string(), + digest: None, + }, + 0, + 1, + ))), + operator: BinaryOperator::Add, + right: BinaryPart::Literal(Box::new(Node::new( + Literal { + value: 6u32.into(), + raw: "6".to_string(), + digest: None, + }, + 3, + 4, + ))), + digest: None, + }, + 0, + 4, + )), digest: None, - })), - operator: BinaryOperator::Add, - right: BinaryPart::Literal(Box::new(Literal { - start: 3, - end: 4, - value: 6u32.into(), - raw: "6".to_string(), - digest: None, - })), - digest: None, - })), + }, + 0, + 4, + ))], + non_code_meta: NonCodeMeta::default(), digest: None, - })], - non_code_meta: NonCodeMeta::default(), - digest: None, - }; + }, + 0, + 4, + ); assert_eq!(result, expected_result); } @@ -3069,12 +3174,10 @@ e for (i, (params, expect_ok)) in [ ( vec![Parameter { - identifier: Identifier { - start: 0, - end: 0, + identifier: Node::no_src(Identifier { name: "a".to_owned(), digest: None, - }, + }), type_: None, optional: true, digest: None, @@ -3083,12 +3186,10 @@ e ), ( vec![Parameter { - identifier: Identifier { - start: 0, - end: 0, + identifier: Node::no_src(Identifier { name: "a".to_owned(), digest: None, - }, + }), type_: None, optional: false, digest: None, @@ -3098,23 +3199,19 @@ e ( vec![ Parameter { - identifier: Identifier { - start: 0, - end: 0, + identifier: Node::no_src(Identifier { name: "a".to_owned(), digest: None, - }, + }), type_: None, optional: false, digest: None, }, Parameter { - identifier: Identifier { - start: 0, - end: 0, + identifier: Node::no_src(Identifier { name: "b".to_owned(), digest: None, - }, + }), type_: None, optional: true, digest: None, @@ -3125,23 +3222,19 @@ e ( vec![ Parameter { - identifier: Identifier { - start: 0, - end: 0, + identifier: Node::no_src(Identifier { name: "a".to_owned(), digest: None, - }, + }), type_: None, optional: true, digest: None, }, Parameter { - identifier: Identifier { - start: 0, - end: 0, + identifier: Node::no_src(Identifier { name: "b".to_owned(), digest: None, - }, + }), type_: None, optional: false, digest: None, diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__a.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__a.snap index f4d3f410b..f30645a1c 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__a.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__a.snap @@ -4,23 +4,23 @@ expression: actual --- { "type": "BinaryExpression", - "start": 0, - "end": 5, "operator": "+", "left": { "type": "Literal", "type": "Literal", - "start": 0, - "end": 1, "value": 1, - "raw": "1" + "raw": "1", + "start": 0, + "end": 1 }, "right": { "type": "Literal", "type": "Literal", - "start": 4, - "end": 5, "value": 2, - "raw": "2" - } + "raw": "2", + "start": 4, + "end": 5 + }, + "start": 0, + "end": 5 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__b.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__b.snap index d76a13faa..bffcf481b 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__b.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__b.snap @@ -4,23 +4,23 @@ expression: actual --- { "type": "BinaryExpression", - "start": 0, - "end": 3, "operator": "+", "left": { "type": "Literal", "type": "Literal", - "start": 0, - "end": 1, "value": 1, - "raw": "1" + "raw": "1", + "start": 0, + "end": 1 }, "right": { "type": "Literal", "type": "Literal", - "start": 2, - "end": 3, "value": 2, - "raw": "2" - } + "raw": "2", + "start": 2, + "end": 3 + }, + "start": 0, + "end": 3 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__c.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__c.snap index 53ae57d2d..9cc43dfca 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__c.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__c.snap @@ -4,23 +4,23 @@ expression: actual --- { "type": "BinaryExpression", - "start": 0, - "end": 4, "operator": "-", "left": { "type": "Literal", "type": "Literal", - "start": 0, - "end": 1, "value": 1, - "raw": "1" + "raw": "1", + "start": 0, + "end": 1 }, "right": { "type": "Literal", "type": "Literal", - "start": 3, - "end": 4, "value": 2, - "raw": "2" - } + "raw": "2", + "start": 3, + "end": 4 + }, + "start": 0, + "end": 4 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__d.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__d.snap index 3421b79f1..283ec78bf 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__d.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__d.snap @@ -4,38 +4,38 @@ expression: actual --- { "type": "BinaryExpression", - "start": 0, - "end": 9, "operator": "+", "left": { "type": "Literal", "type": "Literal", - "start": 0, - "end": 1, "value": 1, - "raw": "1" + "raw": "1", + "start": 0, + "end": 1 }, "right": { "type": "BinaryExpression", "type": "BinaryExpression", - "start": 4, - "end": 9, "operator": "*", "left": { "type": "Literal", "type": "Literal", - "start": 4, - "end": 5, "value": 2, - "raw": "2" + "raw": "2", + "start": 4, + "end": 5 }, "right": { "type": "Literal", "type": "Literal", - "start": 8, - "end": 9, "value": 3, - "raw": "3" - } - } + "raw": "3", + "start": 8, + "end": 9 + }, + "start": 4, + "end": 9 + }, + "start": 0, + "end": 9 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__e.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__e.snap index 52118eaba..c83a2eebe 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__e.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__e.snap @@ -4,38 +4,38 @@ expression: actual --- { "type": "BinaryExpression", - "start": 0, - "end": 11, "operator": "*", "left": { "type": "Literal", "type": "Literal", - "start": 0, - "end": 1, "value": 1, - "raw": "1" + "raw": "1", + "start": 0, + "end": 1 }, "right": { "type": "BinaryExpression", "type": "BinaryExpression", - "start": 6, - "end": 11, "operator": "+", "left": { "type": "Literal", "type": "Literal", - "start": 6, - "end": 7, "value": 2, - "raw": "2" + "raw": "2", + "start": 6, + "end": 7 }, "right": { "type": "Literal", "type": "Literal", - "start": 10, - "end": 11, "value": 3, - "raw": "3" - } - } + "raw": "3", + "start": 10, + "end": 11 + }, + "start": 6, + "end": 11 + }, + "start": 0, + "end": 11 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__f.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__f.snap index 1cc881d04..3baab161c 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__f.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__f.snap @@ -4,53 +4,53 @@ expression: actual --- { "type": "BinaryExpression", - "start": 0, - "end": 17, "operator": "/", "left": { "type": "BinaryExpression", "type": "BinaryExpression", - "start": 0, - "end": 11, "operator": "*", "left": { "type": "Literal", "type": "Literal", - "start": 0, - "end": 1, "value": 1, - "raw": "1" + "raw": "1", + "start": 0, + "end": 1 }, "right": { "type": "BinaryExpression", "type": "BinaryExpression", - "start": 6, - "end": 11, "operator": "+", "left": { "type": "Literal", "type": "Literal", - "start": 6, - "end": 7, "value": 2, - "raw": "2" + "raw": "2", + "start": 6, + "end": 7 }, "right": { "type": "Literal", "type": "Literal", - "start": 10, - "end": 11, "value": 3, - "raw": "3" - } - } + "raw": "3", + "start": 10, + "end": 11 + }, + "start": 6, + "end": 11 + }, + "start": 0, + "end": 11 }, "right": { "type": "Literal", "type": "Literal", - "start": 16, - "end": 17, "value": 4, - "raw": "4" - } + "raw": "4", + "start": 16, + "end": 17 + }, + "start": 0, + "end": 17 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__g.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__g.snap index 1d6cd97be..46150903d 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__g.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__g.snap @@ -4,53 +4,53 @@ expression: actual --- { "type": "BinaryExpression", - "start": 0, - "end": 17, "operator": "+", "left": { "type": "Literal", "type": "Literal", - "start": 0, - "end": 1, "value": 1, - "raw": "1" + "raw": "1", + "start": 0, + "end": 1 }, "right": { "type": "BinaryExpression", "type": "BinaryExpression", - "start": 6, - "end": 17, "operator": "/", "left": { "type": "BinaryExpression", "type": "BinaryExpression", - "start": 6, - "end": 11, "operator": "+", "left": { "type": "Literal", "type": "Literal", - "start": 6, - "end": 7, "value": 2, - "raw": "2" + "raw": "2", + "start": 6, + "end": 7 }, "right": { "type": "Literal", "type": "Literal", - "start": 10, - "end": 11, "value": 3, - "raw": "3" - } + "raw": "3", + "start": 10, + "end": 11 + }, + "start": 6, + "end": 11 }, "right": { "type": "Literal", "type": "Literal", - "start": 16, - "end": 17, "value": 4, - "raw": "4" - } - } + "raw": "4", + "start": 16, + "end": 17 + }, + "start": 6, + "end": 17 + }, + "start": 0, + "end": 17 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__h.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__h.snap index 055108a9b..76742272b 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__h.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__h.snap @@ -4,68 +4,68 @@ expression: actual --- { "type": "BinaryExpression", - "start": 0, - "end": 22, "operator": "*", "left": { "type": "Literal", "type": "Literal", - "start": 0, - "end": 1, "value": 1, - "raw": "1" + "raw": "1", + "start": 0, + "end": 1 }, "right": { "type": "BinaryExpression", "type": "BinaryExpression", - "start": 7, - "end": 22, "operator": "+", "left": { "type": "BinaryExpression", "type": "BinaryExpression", - "start": 7, - "end": 18, "operator": "/", "left": { "type": "BinaryExpression", "type": "BinaryExpression", - "start": 7, - "end": 12, "operator": "+", "left": { "type": "Literal", "type": "Literal", - "start": 7, - "end": 8, "value": 2, - "raw": "2" + "raw": "2", + "start": 7, + "end": 8 }, "right": { "type": "Literal", "type": "Literal", - "start": 11, - "end": 12, "value": 3, - "raw": "3" - } + "raw": "3", + "start": 11, + "end": 12 + }, + "start": 7, + "end": 12 }, "right": { "type": "Literal", "type": "Literal", - "start": 17, - "end": 18, "value": 4, - "raw": "4" - } + "raw": "4", + "start": 17, + "end": 18 + }, + "start": 7, + "end": 18 }, "right": { "type": "Literal", "type": "Literal", - "start": 21, - "end": 22, "value": 5, - "raw": "5" - } - } + "raw": "5", + "start": 21, + "end": 22 + }, + "start": 7, + "end": 22 + }, + "start": 0, + "end": 22 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__i.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__i.snap index 0027ba4fd..42083c553 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__i.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__i.snap @@ -4,38 +4,38 @@ expression: actual --- { "type": "BinaryExpression", - "start": 0, - "end": 13, "operator": "*", "left": { "type": "Literal", "type": "Literal", - "start": 0, - "end": 1, "value": 1, - "raw": "1" + "raw": "1", + "start": 0, + "end": 1 }, "right": { "type": "BinaryExpression", "type": "BinaryExpression", - "start": 8, - "end": 13, "operator": "+", "left": { "type": "Literal", "type": "Literal", - "start": 8, - "end": 9, "value": 2, - "raw": "2" + "raw": "2", + "start": 8, + "end": 9 }, "right": { "type": "Literal", "type": "Literal", - "start": 12, - "end": 13, "value": 3, - "raw": "3" - } - } + "raw": "3", + "start": 12, + "end": 13 + }, + "start": 8, + "end": 13 + }, + "start": 0, + "end": 13 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__j.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__j.snap index a3cbd38bf..4f95eca1e 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__j.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__j.snap @@ -4,78 +4,78 @@ expression: actual --- { "type": "BinaryExpression", - "start": 0, - "end": 44, "operator": "/", "left": { "type": "BinaryExpression", "type": "BinaryExpression", - "start": 0, - "end": 22, "operator": "*", "left": { "type": "BinaryExpression", "type": "BinaryExpression", - "start": 0, - "end": 18, "operator": "*", "left": { "type": "BinaryExpression", "type": "BinaryExpression", - "start": 0, - "end": 12, "operator": "*", "left": { "type": "Identifier", "type": "Identifier", + "name": "distance", "start": 0, - "end": 8, - "name": "distance" + "end": 8 }, "right": { "type": "Identifier", "type": "Identifier", + "name": "p", "start": 11, - "end": 12, - "name": "p" - } + "end": 12 + }, + "start": 0, + "end": 12 }, "right": { "type": "Identifier", "type": "Identifier", + "name": "FOS", "start": 15, - "end": 18, - "name": "FOS" - } + "end": 18 + }, + "start": 0, + "end": 18 }, "right": { "type": "Literal", "type": "Literal", - "start": 21, - "end": 22, "value": 6, - "raw": "6" - } + "raw": "6", + "start": 21, + "end": 22 + }, + "start": 0, + "end": 22 }, "right": { "type": "BinaryExpression", "type": "BinaryExpression", - "start": 26, - "end": 44, "operator": "*", "left": { "type": "Identifier", "type": "Identifier", + "name": "sigmaAllow", "start": 26, - "end": 36, - "name": "sigmaAllow" + "end": 36 }, "right": { "type": "Identifier", "type": "Identifier", + "name": "width", "start": 39, - "end": 44, - "name": "width" - } - } + "end": 44 + }, + "start": 26, + "end": 44 + }, + "start": 0, + "end": 44 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__k.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__k.snap index a9bfe4c77..67132df9b 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__k.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_math_tests__k.snap @@ -4,23 +4,23 @@ expression: actual --- { "type": "BinaryExpression", - "start": 0, - "end": 8, "operator": "+", "left": { "type": "Literal", "type": "Literal", - "start": 0, - "end": 1, "value": 2, - "raw": "2" + "raw": "2", + "start": 0, + "end": 1 }, "right": { "type": "Literal", "type": "Literal", - "start": 7, - "end": 8, "value": 3, - "raw": "3" - } + "raw": "3", + "start": 7, + "end": 8 + }, + "start": 0, + "end": 8 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__a.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__a.snap index b911bab7a..dc9ab6cf0 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__a.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__a.snap @@ -3,253 +3,253 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 144, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 143, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 143, "id": { - "type": "Identifier", - "start": 6, "end": 15, - "name": "boxSketch" + "name": "boxSketch", + "start": 6, + "type": "Identifier" }, "init": { - "type": "PipeExpression", - "type": "PipeExpression", - "start": 18, - "end": 143, "body": [ { - "type": "CallExpression", - "type": "CallExpression", - "start": 18, - "end": 39, - "callee": { - "type": "Identifier", - "start": 18, - "end": 31, - "name": "startSketchAt" - }, "arguments": [ { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 32, - "end": 38, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 33, "end": 34, - "value": 0, - "raw": "0" + "raw": "0", + "start": 33, + "type": "Literal", + "type": "Literal", + "value": 0 }, { - "type": "Literal", - "type": "Literal", - "start": 36, "end": 37, - "value": 0, - "raw": "0" + "raw": "0", + "start": 36, + "type": "Literal", + "type": "Literal", + "value": 0 } - ] + ], + "end": 38, + "start": 32, + "type": "ArrayExpression", + "type": "ArrayExpression" } ], - "optional": false + "callee": { + "end": 31, + "name": "startSketchAt", + "start": 18, + "type": "Identifier" + }, + "end": 39, + "optional": false, + "start": 18, + "type": "CallExpression", + "type": "CallExpression" }, { - "type": "CallExpression", - "type": "CallExpression", - "start": 47, - "end": 63, - "callee": { - "type": "Identifier", - "start": 47, - "end": 51, - "name": "line" - }, "arguments": [ { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 52, - "end": 59, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 53, "end": 54, - "value": 0, - "raw": "0" + "raw": "0", + "start": 53, + "type": "Literal", + "type": "Literal", + "value": 0 }, { - "type": "Literal", - "type": "Literal", - "start": 56, "end": 58, - "value": 10, - "raw": "10" + "raw": "10", + "start": 56, + "type": "Literal", + "type": "Literal", + "value": 10 } - ] + ], + "end": 59, + "start": 52, + "type": "ArrayExpression", + "type": "ArrayExpression" }, { - "type": "PipeSubstitution", - "type": "PipeSubstitution", + "end": 62, "start": 61, - "end": 62 + "type": "PipeSubstitution", + "type": "PipeSubstitution" } ], - "optional": false + "callee": { + "end": 51, + "name": "line", + "start": 47, + "type": "Identifier" + }, + "end": 63, + "optional": false, + "start": 47, + "type": "CallExpression", + "type": "CallExpression" }, { - "type": "CallExpression", - "type": "CallExpression", - "start": 71, - "end": 96, - "callee": { - "type": "Identifier", - "start": 71, - "end": 84, - "name": "tangentialArc" - }, "arguments": [ { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 85, - "end": 92, "elements": [ { - "type": "UnaryExpression", - "type": "UnaryExpression", - "start": 86, + "argument": { + "end": 88, + "raw": "5", + "start": 87, + "type": "Literal", + "type": "Literal", + "value": 5 + }, "end": 88, "operator": "-", - "argument": { - "type": "Literal", - "type": "Literal", - "start": 87, - "end": 88, - "value": 5, - "raw": "5" - } + "start": 86, + "type": "UnaryExpression", + "type": "UnaryExpression" }, { - "type": "Literal", - "type": "Literal", - "start": 90, "end": 91, - "value": 5, - "raw": "5" + "raw": "5", + "start": 90, + "type": "Literal", + "type": "Literal", + "value": 5 } - ] + ], + "end": 92, + "start": 85, + "type": "ArrayExpression", + "type": "ArrayExpression" }, { - "type": "PipeSubstitution", - "type": "PipeSubstitution", + "end": 95, "start": 94, - "end": 95 + "type": "PipeSubstitution", + "type": "PipeSubstitution" } ], - "optional": false + "callee": { + "end": 84, + "name": "tangentialArc", + "start": 71, + "type": "Identifier" + }, + "end": 96, + "optional": false, + "start": 71, + "type": "CallExpression", + "type": "CallExpression" }, { - "type": "CallExpression", - "type": "CallExpression", - "start": 104, - "end": 121, - "callee": { - "type": "Identifier", - "start": 104, - "end": 108, - "name": "line" - }, "arguments": [ { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 109, - "end": 117, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 110, "end": 111, - "value": 5, - "raw": "5" + "raw": "5", + "start": 110, + "type": "Literal", + "type": "Literal", + "value": 5 }, { - "type": "UnaryExpression", - "type": "UnaryExpression", - "start": 113, + "argument": { + "end": 116, + "raw": "15", + "start": 114, + "type": "Literal", + "type": "Literal", + "value": 15 + }, "end": 116, "operator": "-", - "argument": { - "type": "Literal", - "type": "Literal", - "start": 114, - "end": 116, - "value": 15, - "raw": "15" - } + "start": 113, + "type": "UnaryExpression", + "type": "UnaryExpression" } - ] + ], + "end": 117, + "start": 109, + "type": "ArrayExpression", + "type": "ArrayExpression" }, { - "type": "PipeSubstitution", - "type": "PipeSubstitution", + "end": 120, "start": 119, - "end": 120 + "type": "PipeSubstitution", + "type": "PipeSubstitution" } ], - "optional": false + "callee": { + "end": 108, + "name": "line", + "start": 104, + "type": "Identifier" + }, + "end": 121, + "optional": false, + "start": 104, + "type": "CallExpression", + "type": "CallExpression" }, { - "type": "CallExpression", - "type": "CallExpression", - "start": 129, - "end": 143, - "callee": { - "type": "Identifier", - "start": 129, - "end": 136, - "name": "extrude" - }, "arguments": [ { - "type": "Literal", - "type": "Literal", - "start": 137, "end": 139, - "value": 10, - "raw": "10" + "raw": "10", + "start": 137, + "type": "Literal", + "type": "Literal", + "value": 10 }, { - "type": "PipeSubstitution", - "type": "PipeSubstitution", + "end": 142, "start": 141, - "end": 142 + "type": "PipeSubstitution", + "type": "PipeSubstitution" } ], - "optional": false + "callee": { + "end": 136, + "name": "extrude", + "start": 129, + "type": "Identifier" + }, + "end": 143, + "optional": false, + "start": 129, + "type": "CallExpression", + "type": "CallExpression" } - ] - } + ], + "end": 143, + "start": 18, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 143, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 144, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__aa.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__aa.snap index c3a940d8c..834ec6888 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__aa.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__aa.snap @@ -3,42 +3,42 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 17, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 17, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 17, "id": { - "type": "Identifier", - "start": 6, "end": 8, - "name": "sg" + "name": "sg", + "start": 6, + "type": "Identifier" }, "init": { - "type": "UnaryExpression", - "type": "UnaryExpression", - "start": 11, + "argument": { + "end": 17, + "name": "scale", + "start": 12, + "type": "Identifier", + "type": "Identifier" + }, "end": 17, "operator": "-", - "argument": { - "type": "Identifier", - "type": "Identifier", - "start": 12, - "end": 17, - "name": "scale" - } - } + "start": 11, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 17, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 17, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ab.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ab.snap index 545ee7aa6..3f4b17b81 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ab.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ab.snap @@ -3,79 +3,79 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 23, "body": [ { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 0, "end": 23, "expression": { - "type": "CallExpression", - "type": "CallExpression", - "start": 0, - "end": 23, - "callee": { - "type": "Identifier", - "start": 0, - "end": 6, - "name": "lineTo" - }, "arguments": [ { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 7, "end": 22, "properties": [ { - "type": "ObjectProperty", - "start": 9, "end": 20, "key": { - "type": "Identifier", - "start": 9, "end": 11, - "name": "to" + "name": "to", + "start": 9, + "type": "Identifier" }, + "start": 9, + "type": "ObjectProperty", "value": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 13, - "end": 20, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 14, "end": 15, - "value": 0, - "raw": "0" + "raw": "0", + "start": 14, + "type": "Literal", + "type": "Literal", + "value": 0 }, { - "type": "UnaryExpression", - "type": "UnaryExpression", - "start": 17, + "argument": { + "end": 19, + "raw": "1", + "start": 18, + "type": "Literal", + "type": "Literal", + "value": 1 + }, "end": 19, "operator": "-", - "argument": { - "type": "Literal", - "type": "Literal", - "start": 18, - "end": 19, - "value": 1, - "raw": "1" - } + "start": 17, + "type": "UnaryExpression", + "type": "UnaryExpression" } - ] + ], + "end": 20, + "start": 13, + "type": "ArrayExpression", + "type": "ArrayExpression" } } - ] + ], + "start": 7, + "type": "ObjectExpression", + "type": "ObjectExpression" } ], - "optional": false - } + "callee": { + "end": 6, + "name": "lineTo", + "start": 0, + "type": "Identifier" + }, + "end": 23, + "optional": false, + "start": 0, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" } - ] + ], + "end": 23, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ac.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ac.snap index c10a50947..8832057be 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ac.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ac.snap @@ -3,51 +3,51 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 23, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 23, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 23, "id": { - "type": "Identifier", - "start": 6, "end": 13, - "name": "myArray" + "name": "myArray", + "start": 6, + "type": "Identifier" }, "init": { - "type": "ArrayRangeExpression", - "type": "ArrayRangeExpression", - "start": 16, "end": 23, - "startElement": { - "type": "Literal", - "type": "Literal", - "start": 17, - "end": 18, - "value": 0, - "raw": "0" - }, "endElement": { - "type": "Literal", - "type": "Literal", - "start": 20, "end": 22, - "value": 10, - "raw": "10" + "raw": "10", + "start": 20, + "type": "Literal", + "type": "Literal", + "value": 10 }, - "endInclusive": true - } + "endInclusive": true, + "start": 16, + "startElement": { + "end": 18, + "raw": "0", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 0 + }, + "type": "ArrayRangeExpression", + "type": "ArrayRangeExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 23, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 23, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ad.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ad.snap index 00aa97086..e5ad22512 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ad.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ad.snap @@ -3,75 +3,75 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 80, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 5, - "end": 57, "declarations": [ { - "type": "VariableDeclarator", - "start": 8, "end": 57, "id": { - "type": "Identifier", - "start": 8, "end": 24, - "name": "firstPrimeNumber" + "name": "firstPrimeNumber", + "start": 8, + "type": "Identifier" }, "init": { - "type": "FunctionExpression", - "type": "FunctionExpression", - "start": 27, - "end": 57, - "params": [], "body": { - "start": 33, - "end": 57, "body": [ { - "type": "ReturnStatement", - "type": "ReturnStatement", - "start": 43, - "end": 51, "argument": { - "type": "Literal", - "type": "Literal", - "start": 50, "end": 51, - "value": 2, - "raw": "2" - } + "raw": "2", + "start": 50, + "type": "Literal", + "type": "Literal", + "value": 2 + }, + "end": 51, + "start": 43, + "type": "ReturnStatement", + "type": "ReturnStatement" } - ] - } - } + ], + "end": 57, + "start": 33 + }, + "end": 57, + "params": [], + "start": 27, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 8, + "type": "VariableDeclarator" } ], - "kind": "fn" + "end": 57, + "kind": "fn", + "start": 5, + "type": "VariableDeclaration", + "type": "VariableDeclaration" }, { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 62, "end": 80, "expression": { - "type": "CallExpression", - "type": "CallExpression", - "start": 62, - "end": 80, - "callee": { - "type": "Identifier", - "start": 62, - "end": 78, - "name": "firstPrimeNumber" - }, "arguments": [], - "optional": false - } + "callee": { + "end": 78, + "name": "firstPrimeNumber", + "start": 62, + "type": "Identifier" + }, + "end": 80, + "optional": false, + "start": 62, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 62, + "type": "ExpressionStatement", + "type": "ExpressionStatement" } - ] + ], + "end": 80, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ae.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ae.snap index 9f4006f35..0e3165d34 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ae.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ae.snap @@ -3,95 +3,95 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 66, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 49, "declarations": [ { - "type": "VariableDeclarator", - "start": 3, "end": 49, "id": { - "type": "Identifier", - "start": 3, "end": 8, - "name": "thing" + "name": "thing", + "start": 3, + "type": "Identifier" }, "init": { - "type": "FunctionExpression", - "type": "FunctionExpression", - "start": 11, + "body": { + "body": [ + { + "argument": { + "end": 43, + "raw": "true", + "start": 39, + "type": "Literal", + "type": "Literal", + "value": true + }, + "end": 43, + "start": 32, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 49, + "start": 22 + }, "end": 49, "params": [ { "type": "Parameter", "identifier": { - "type": "Identifier", - "start": 12, "end": 17, - "name": "param" + "name": "param", + "start": 12, + "type": "Identifier" }, "optional": false } ], - "body": { - "start": 22, - "end": 49, - "body": [ - { - "type": "ReturnStatement", - "type": "ReturnStatement", - "start": 32, - "end": 43, - "argument": { - "type": "Literal", - "type": "Literal", - "start": 39, - "end": 43, - "value": true, - "raw": "true" - } - } - ] - } - } + "start": 11, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 3, + "type": "VariableDeclarator" } ], - "kind": "fn" + "end": 49, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" }, { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 54, "end": 66, "expression": { - "type": "CallExpression", - "type": "CallExpression", - "start": 54, - "end": 66, - "callee": { - "type": "Identifier", - "start": 54, - "end": 59, - "name": "thing" - }, "arguments": [ { - "type": "Literal", - "type": "Literal", - "start": 60, "end": 65, - "value": false, - "raw": "false" + "raw": "false", + "start": 60, + "type": "Literal", + "type": "Literal", + "value": false } ], - "optional": false - } + "callee": { + "end": 59, + "name": "thing", + "start": 54, + "type": "Identifier" + }, + "end": 66, + "optional": false, + "start": 54, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 54, + "type": "ExpressionStatement", + "type": "ExpressionStatement" } - ] + ], + "end": 66, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__af.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__af.snap index 7d28c8c5d..4273e1a87 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__af.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__af.snap @@ -3,245 +3,245 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 165, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 165, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 165, "id": { - "type": "Identifier", - "start": 6, "end": 14, - "name": "mySketch" + "name": "mySketch", + "start": 6, + "type": "Identifier" }, "init": { - "type": "PipeExpression", - "type": "PipeExpression", - "start": 17, - "end": 165, "body": [ { - "type": "CallExpression", - "type": "CallExpression", - "start": 17, - "end": 37, - "callee": { - "type": "Identifier", - "start": 17, - "end": 30, - "name": "startSketchAt" - }, "arguments": [ { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 31, - "end": 36, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 32, "end": 33, - "value": 0, - "raw": "0" + "raw": "0", + "start": 32, + "type": "Literal", + "type": "Literal", + "value": 0 }, { - "type": "Literal", - "type": "Literal", - "start": 34, "end": 35, - "value": 0, - "raw": "0" + "raw": "0", + "start": 34, + "type": "Literal", + "type": "Literal", + "value": 0 } - ] + ], + "end": 36, + "start": 31, + "type": "ArrayExpression", + "type": "ArrayExpression" } ], - "optional": false + "callee": { + "end": 30, + "name": "startSketchAt", + "start": 17, + "type": "Identifier" + }, + "end": 37, + "optional": false, + "start": 17, + "type": "CallExpression", + "type": "CallExpression" }, { - "type": "CallExpression", - "type": "CallExpression", - "start": 49, - "end": 75, - "callee": { - "type": "Identifier", - "start": 49, - "end": 55, - "name": "lineTo" - }, "arguments": [ { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 56, - "end": 62, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 57, "end": 58, - "value": 0, - "raw": "0" + "raw": "0", + "start": 57, + "type": "Literal", + "type": "Literal", + "value": 0 }, { - "type": "Literal", - "type": "Literal", - "start": 60, "end": 61, - "value": 1, - "raw": "1" + "raw": "1", + "start": 60, + "type": "Literal", + "type": "Literal", + "value": 1 } - ] + ], + "end": 62, + "start": 56, + "type": "ArrayExpression", + "type": "ArrayExpression" }, { - "type": "PipeSubstitution", - "type": "PipeSubstitution", + "end": 65, "start": 64, - "end": 65 + "type": "PipeSubstitution", + "type": "PipeSubstitution" }, { - "type": "TagDeclarator", - "type": "TagDeclarator", - "start": 67, "end": 74, + "start": 67, + "type": "TagDeclarator", + "type": "TagDeclarator", "value": "myPath" } ], - "optional": false + "callee": { + "end": 55, + "name": "lineTo", + "start": 49, + "type": "Identifier" + }, + "end": 75, + "optional": false, + "start": 49, + "type": "CallExpression", + "type": "CallExpression" }, { - "type": "CallExpression", - "type": "CallExpression", - "start": 87, - "end": 104, - "callee": { - "type": "Identifier", - "start": 87, - "end": 93, - "name": "lineTo" - }, "arguments": [ { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 94, - "end": 100, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 95, "end": 96, - "value": 1, - "raw": "1" + "raw": "1", + "start": 95, + "type": "Literal", + "type": "Literal", + "value": 1 }, { - "type": "Literal", - "type": "Literal", - "start": 98, "end": 99, - "value": 1, - "raw": "1" + "raw": "1", + "start": 98, + "type": "Literal", + "type": "Literal", + "value": 1 } - ] + ], + "end": 100, + "start": 94, + "type": "ArrayExpression", + "type": "ArrayExpression" }, { - "type": "PipeSubstitution", - "type": "PipeSubstitution", + "end": 103, "start": 102, - "end": 103 + "type": "PipeSubstitution", + "type": "PipeSubstitution" } ], - "optional": false + "callee": { + "end": 93, + "name": "lineTo", + "start": 87, + "type": "Identifier" + }, + "end": 104, + "optional": false, + "start": 87, + "type": "CallExpression", + "type": "CallExpression" }, { - "type": "CallExpression", - "type": "CallExpression", - "start": 116, - "end": 145, - "callee": { - "type": "Identifier", - "start": 116, - "end": 122, - "name": "lineTo" - }, "arguments": [ { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 123, - "end": 129, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 124, "end": 125, - "value": 1, - "raw": "1" + "raw": "1", + "start": 124, + "type": "Literal", + "type": "Literal", + "value": 1 }, { - "type": "Literal", - "type": "Literal", - "start": 127, "end": 128, - "value": 0, - "raw": "0" + "raw": "0", + "start": 127, + "type": "Literal", + "type": "Literal", + "value": 0 } - ] + ], + "end": 129, + "start": 123, + "type": "ArrayExpression", + "type": "ArrayExpression" }, { - "type": "PipeSubstitution", - "type": "PipeSubstitution", + "end": 132, "start": 131, - "end": 132 + "type": "PipeSubstitution", + "type": "PipeSubstitution" }, { - "type": "TagDeclarator", - "type": "TagDeclarator", - "start": 134, "end": 144, + "start": 134, + "type": "TagDeclarator", + "type": "TagDeclarator", "value": "rightPath" } ], - "optional": false + "callee": { + "end": 122, + "name": "lineTo", + "start": 116, + "type": "Identifier" + }, + "end": 145, + "optional": false, + "start": 116, + "type": "CallExpression", + "type": "CallExpression" }, { - "type": "CallExpression", - "type": "CallExpression", - "start": 157, - "end": 165, - "callee": { - "type": "Identifier", - "start": 157, - "end": 162, - "name": "close" - }, "arguments": [ { - "type": "PipeSubstitution", - "type": "PipeSubstitution", + "end": 164, "start": 163, - "end": 164 + "type": "PipeSubstitution", + "type": "PipeSubstitution" } ], - "optional": false + "callee": { + "end": 162, + "name": "close", + "start": 157, + "type": "Identifier" + }, + "end": 165, + "optional": false, + "start": 157, + "type": "CallExpression", + "type": "CallExpression" } - ] - } + ], + "end": 165, + "start": 17, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 165, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 165, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ag.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ag.snap index 88393ea4a..7ed185722 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ag.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ag.snap @@ -3,141 +3,141 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 70, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 70, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 70, "id": { - "type": "Identifier", - "start": 6, "end": 14, - "name": "mySketch" + "name": "mySketch", + "start": 6, + "type": "Identifier" }, "init": { - "type": "PipeExpression", - "type": "PipeExpression", - "start": 17, - "end": 70, "body": [ { - "type": "CallExpression", - "type": "CallExpression", - "start": 17, - "end": 37, - "callee": { - "type": "Identifier", - "start": 17, - "end": 30, - "name": "startSketchAt" - }, "arguments": [ { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 31, - "end": 36, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 32, "end": 33, - "value": 0, - "raw": "0" + "raw": "0", + "start": 32, + "type": "Literal", + "type": "Literal", + "value": 0 }, { - "type": "Literal", - "type": "Literal", - "start": 34, "end": 35, - "value": 0, - "raw": "0" + "raw": "0", + "start": 34, + "type": "Literal", + "type": "Literal", + "value": 0 } - ] + ], + "end": 36, + "start": 31, + "type": "ArrayExpression", + "type": "ArrayExpression" } ], - "optional": false + "callee": { + "end": 30, + "name": "startSketchAt", + "start": 17, + "type": "Identifier" + }, + "end": 37, + "optional": false, + "start": 17, + "type": "CallExpression", + "type": "CallExpression" }, { - "type": "CallExpression", - "type": "CallExpression", - "start": 41, - "end": 58, - "callee": { - "type": "Identifier", - "start": 41, - "end": 47, - "name": "lineTo" - }, "arguments": [ { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 48, - "end": 54, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 49, "end": 50, - "value": 1, - "raw": "1" + "raw": "1", + "start": 49, + "type": "Literal", + "type": "Literal", + "value": 1 }, { - "type": "Literal", - "type": "Literal", - "start": 52, "end": 53, - "value": 1, - "raw": "1" + "raw": "1", + "start": 52, + "type": "Literal", + "type": "Literal", + "value": 1 } - ] + ], + "end": 54, + "start": 48, + "type": "ArrayExpression", + "type": "ArrayExpression" }, { - "type": "PipeSubstitution", - "type": "PipeSubstitution", + "end": 57, "start": 56, - "end": 57 + "type": "PipeSubstitution", + "type": "PipeSubstitution" } ], - "optional": false + "callee": { + "end": 47, + "name": "lineTo", + "start": 41, + "type": "Identifier" + }, + "end": 58, + "optional": false, + "start": 41, + "type": "CallExpression", + "type": "CallExpression" }, { - "type": "CallExpression", - "type": "CallExpression", - "start": 62, - "end": 70, - "callee": { - "type": "Identifier", - "start": 62, - "end": 67, - "name": "close" - }, "arguments": [ { - "type": "PipeSubstitution", - "type": "PipeSubstitution", + "end": 69, "start": 68, - "end": 69 + "type": "PipeSubstitution", + "type": "PipeSubstitution" } ], - "optional": false + "callee": { + "end": 67, + "name": "close", + "start": 62, + "type": "Identifier" + }, + "end": 70, + "optional": false, + "start": 62, + "type": "CallExpression", + "type": "CallExpression" } - ] - } + ], + "end": 70, + "start": 17, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 70, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 70, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ah.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ah.snap index 75bc946c5..5fa8bf2db 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ah.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ah.snap @@ -3,50 +3,50 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 30, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 30, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 30, "id": { - "type": "Identifier", - "start": 6, "end": 11, - "name": "myBox" + "name": "myBox", + "start": 6, + "type": "Identifier" }, "init": { - "type": "CallExpression", - "type": "CallExpression", - "start": 14, - "end": 30, - "callee": { - "type": "Identifier", - "start": 14, - "end": 27, - "name": "startSketchAt" - }, "arguments": [ { - "type": "Identifier", - "type": "Identifier", - "start": 28, "end": 29, - "name": "p" + "name": "p", + "start": 28, + "type": "Identifier", + "type": "Identifier" } ], - "optional": false - } + "callee": { + "end": 27, + "name": "startSketchAt", + "start": 14, + "type": "Identifier" + }, + "end": 30, + "optional": false, + "start": 14, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 30, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 30, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ai.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ai.snap index 1378bd032..e6ebdbdaf 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ai.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ai.snap @@ -3,88 +3,88 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 29, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 29, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 29, "id": { - "type": "Identifier", - "start": 6, "end": 11, - "name": "myBox" + "name": "myBox", + "start": 6, + "type": "Identifier" }, "init": { - "type": "PipeExpression", - "type": "PipeExpression", - "start": 14, - "end": 29, "body": [ { - "type": "CallExpression", - "type": "CallExpression", - "start": 14, - "end": 18, - "callee": { - "type": "Identifier", - "start": 14, - "end": 15, - "name": "f" - }, "arguments": [ { - "type": "Literal", - "type": "Literal", - "start": 16, "end": 17, - "value": 1, - "raw": "1" + "raw": "1", + "start": 16, + "type": "Literal", + "type": "Literal", + "value": 1 } ], - "optional": false + "callee": { + "end": 15, + "name": "f", + "start": 14, + "type": "Identifier" + }, + "end": 18, + "optional": false, + "start": 14, + "type": "CallExpression", + "type": "CallExpression" }, { - "type": "CallExpression", - "type": "CallExpression", - "start": 22, - "end": 29, - "callee": { - "type": "Identifier", - "start": 22, - "end": 23, - "name": "g" - }, "arguments": [ { - "type": "Literal", - "type": "Literal", - "start": 24, "end": 25, - "value": 2, - "raw": "2" + "raw": "2", + "start": 24, + "type": "Literal", + "type": "Literal", + "value": 2 }, { - "type": "PipeSubstitution", - "type": "PipeSubstitution", + "end": 28, "start": 27, - "end": 28 + "type": "PipeSubstitution", + "type": "PipeSubstitution" } ], - "optional": false + "callee": { + "end": 23, + "name": "g", + "start": 22, + "type": "Identifier" + }, + "end": 29, + "optional": false, + "start": 22, + "type": "CallExpression", + "type": "CallExpression" } - ] - } + ], + "end": 29, + "start": 14, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 29, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 29, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__aj.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__aj.snap index 5e38805db..e8b7a8301 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__aj.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__aj.snap @@ -3,102 +3,102 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 49, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 49, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 49, "id": { - "type": "Identifier", - "start": 6, "end": 11, - "name": "myBox" + "name": "myBox", + "start": 6, + "type": "Identifier" }, "init": { - "type": "PipeExpression", - "type": "PipeExpression", - "start": 14, - "end": 49, "body": [ { - "type": "CallExpression", - "type": "CallExpression", - "start": 14, - "end": 30, - "callee": { - "type": "Identifier", - "start": 14, - "end": 27, - "name": "startSketchAt" - }, "arguments": [ { - "type": "Identifier", - "type": "Identifier", - "start": 28, "end": 29, - "name": "p" + "name": "p", + "start": 28, + "type": "Identifier", + "type": "Identifier" } ], - "optional": false + "callee": { + "end": 27, + "name": "startSketchAt", + "start": 14, + "type": "Identifier" + }, + "end": 30, + "optional": false, + "start": 14, + "type": "CallExpression", + "type": "CallExpression" }, { - "type": "CallExpression", - "type": "CallExpression", - "start": 34, - "end": 49, - "callee": { - "type": "Identifier", - "start": 34, - "end": 38, - "name": "line" - }, "arguments": [ { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 39, - "end": 45, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 40, "end": 41, - "value": 0, - "raw": "0" + "raw": "0", + "start": 40, + "type": "Literal", + "type": "Literal", + "value": 0 }, { - "type": "Identifier", - "type": "Identifier", - "start": 43, "end": 44, - "name": "l" + "name": "l", + "start": 43, + "type": "Identifier", + "type": "Identifier" } - ] + ], + "end": 45, + "start": 39, + "type": "ArrayExpression", + "type": "ArrayExpression" }, { - "type": "PipeSubstitution", - "type": "PipeSubstitution", + "end": 48, "start": 47, - "end": 48 + "type": "PipeSubstitution", + "type": "PipeSubstitution" } ], - "optional": false + "callee": { + "end": 38, + "name": "line", + "start": 34, + "type": "Identifier" + }, + "end": 49, + "optional": false, + "start": 34, + "type": "CallExpression", + "type": "CallExpression" } - ] - } + ], + "end": 49, + "start": 14, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 49, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 49, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ak.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ak.snap index c5137bb08..081fa3c9f 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ak.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ak.snap @@ -3,72 +3,72 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 22, "body": [ { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 0, "end": 22, "expression": { - "type": "CallExpression", - "type": "CallExpression", - "start": 0, - "end": 22, - "callee": { - "type": "Identifier", - "start": 0, - "end": 6, - "name": "lineTo" - }, "arguments": [ { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 7, "end": 21, "properties": [ { - "type": "ObjectProperty", - "start": 9, "end": 19, "key": { - "type": "Identifier", - "start": 9, "end": 11, - "name": "to" + "name": "to", + "start": 9, + "type": "Identifier" }, + "start": 9, + "type": "ObjectProperty", "value": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 13, - "end": 19, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 14, "end": 15, - "value": 0, - "raw": "0" + "raw": "0", + "start": 14, + "type": "Literal", + "type": "Literal", + "value": 0 }, { - "type": "Literal", - "type": "Literal", - "start": 17, "end": 18, - "value": 1, - "raw": "1" + "raw": "1", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 1 } - ] + ], + "end": 19, + "start": 13, + "type": "ArrayExpression", + "type": "ArrayExpression" } } - ] + ], + "start": 7, + "type": "ObjectExpression", + "type": "ObjectExpression" } ], - "optional": false - } + "callee": { + "end": 6, + "name": "lineTo", + "start": 0, + "type": "Identifier" + }, + "end": 22, + "optional": false, + "start": 0, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" } - ] + ], + "end": 22, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__al.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__al.snap index 99870608c..4933fbb4c 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__al.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__al.snap @@ -3,107 +3,107 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 36, "body": [ { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 0, "end": 36, "expression": { - "type": "CallExpression", - "type": "CallExpression", - "start": 0, - "end": 36, - "callee": { - "type": "Identifier", - "start": 0, - "end": 6, - "name": "lineTo" - }, "arguments": [ { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 7, "end": 35, "properties": [ { - "type": "ObjectProperty", - "start": 9, "end": 19, "key": { - "type": "Identifier", - "start": 9, "end": 11, - "name": "to" + "name": "to", + "start": 9, + "type": "Identifier" }, + "start": 9, + "type": "ObjectProperty", "value": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 13, - "end": 19, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 14, "end": 15, - "value": 0, - "raw": "0" + "raw": "0", + "start": 14, + "type": "Literal", + "type": "Literal", + "value": 0 }, { - "type": "Literal", - "type": "Literal", - "start": 17, "end": 18, - "value": 1, - "raw": "1" + "raw": "1", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 1 } - ] + ], + "end": 19, + "start": 13, + "type": "ArrayExpression", + "type": "ArrayExpression" } }, { - "type": "ObjectProperty", - "start": 21, "end": 33, "key": { - "type": "Identifier", - "start": 21, "end": 25, - "name": "from" + "name": "from", + "start": 21, + "type": "Identifier" }, + "start": 21, + "type": "ObjectProperty", "value": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 27, - "end": 33, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 28, "end": 29, - "value": 3, - "raw": "3" + "raw": "3", + "start": 28, + "type": "Literal", + "type": "Literal", + "value": 3 }, { - "type": "Literal", - "type": "Literal", - "start": 31, "end": 32, - "value": 3, - "raw": "3" + "raw": "3", + "start": 31, + "type": "Literal", + "type": "Literal", + "value": 3 } - ] + ], + "end": 33, + "start": 27, + "type": "ArrayExpression", + "type": "ArrayExpression" } } - ] + ], + "start": 7, + "type": "ObjectExpression", + "type": "ObjectExpression" } ], - "optional": false - } + "callee": { + "end": 6, + "name": "lineTo", + "start": 0, + "type": "Identifier" + }, + "end": 36, + "optional": false, + "start": 0, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" } - ] + ], + "end": 36, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__am.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__am.snap index e969ef25e..f7682b4bc 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__am.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__am.snap @@ -3,72 +3,72 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 19, "body": [ { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 0, "end": 19, "expression": { - "type": "CallExpression", - "type": "CallExpression", - "start": 0, - "end": 19, - "callee": { - "type": "Identifier", - "start": 0, - "end": 6, - "name": "lineTo" - }, "arguments": [ { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 7, "end": 18, "properties": [ { - "type": "ObjectProperty", - "start": 8, "end": 17, "key": { - "type": "Identifier", - "start": 8, "end": 10, - "name": "to" + "name": "to", + "start": 8, + "type": "Identifier" }, + "start": 8, + "type": "ObjectProperty", "value": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 11, - "end": 17, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 12, "end": 13, - "value": 0, - "raw": "0" + "raw": "0", + "start": 12, + "type": "Literal", + "type": "Literal", + "value": 0 }, { - "type": "Literal", - "type": "Literal", - "start": 15, "end": 16, - "value": 1, - "raw": "1" + "raw": "1", + "start": 15, + "type": "Literal", + "type": "Literal", + "value": 1 } - ] + ], + "end": 17, + "start": 11, + "type": "ArrayExpression", + "type": "ArrayExpression" } } - ] + ], + "start": 7, + "type": "ObjectExpression", + "type": "ObjectExpression" } ], - "optional": false - } + "callee": { + "end": 6, + "name": "lineTo", + "start": 0, + "type": "Identifier" + }, + "end": 19, + "optional": false, + "start": 0, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" } - ] + ], + "end": 19, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__an.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__an.snap index c066ffd25..9732c22f5 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__an.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__an.snap @@ -3,107 +3,107 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 35, "body": [ { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 0, "end": 35, "expression": { - "type": "CallExpression", - "type": "CallExpression", - "start": 0, - "end": 35, - "callee": { - "type": "Identifier", - "start": 0, - "end": 6, - "name": "lineTo" - }, "arguments": [ { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 7, "end": 34, "properties": [ { - "type": "ObjectProperty", - "start": 9, "end": 19, "key": { - "type": "Identifier", - "start": 9, "end": 11, - "name": "to" + "name": "to", + "start": 9, + "type": "Identifier" }, + "start": 9, + "type": "ObjectProperty", "value": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 13, - "end": 19, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 14, "end": 15, - "value": 0, - "raw": "0" + "raw": "0", + "start": 14, + "type": "Literal", + "type": "Literal", + "value": 0 }, { - "type": "Literal", - "type": "Literal", - "start": 17, "end": 18, - "value": 1, - "raw": "1" + "raw": "1", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 1 } - ] + ], + "end": 19, + "start": 13, + "type": "ArrayExpression", + "type": "ArrayExpression" } }, { - "type": "ObjectProperty", - "start": 21, "end": 33, "key": { - "type": "Identifier", - "start": 21, "end": 25, - "name": "from" + "name": "from", + "start": 21, + "type": "Identifier" }, + "start": 21, + "type": "ObjectProperty", "value": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 27, - "end": 33, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 28, "end": 29, - "value": 3, - "raw": "3" + "raw": "3", + "start": 28, + "type": "Literal", + "type": "Literal", + "value": 3 }, { - "type": "Literal", - "type": "Literal", - "start": 31, "end": 32, - "value": 3, - "raw": "3" + "raw": "3", + "start": 31, + "type": "Literal", + "type": "Literal", + "value": 3 } - ] + ], + "end": 33, + "start": 27, + "type": "ArrayExpression", + "type": "ArrayExpression" } } - ] + ], + "start": 7, + "type": "ObjectExpression", + "type": "ObjectExpression" } ], - "optional": false - } + "callee": { + "end": 6, + "name": "lineTo", + "start": 0, + "type": "Identifier" + }, + "end": 35, + "optional": false, + "start": 0, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" } - ] + ], + "end": 35, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ao.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ao.snap index f41266ac4..d7192b481 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ao.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ao.snap @@ -3,107 +3,107 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 35, "body": [ { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 0, "end": 35, "expression": { - "type": "CallExpression", - "type": "CallExpression", - "start": 0, - "end": 35, - "callee": { - "type": "Identifier", - "start": 0, - "end": 6, - "name": "lineTo" - }, "arguments": [ { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 7, "end": 34, "properties": [ { - "type": "ObjectProperty", - "start": 9, "end": 19, "key": { - "type": "Identifier", - "start": 9, "end": 11, - "name": "to" + "name": "to", + "start": 9, + "type": "Identifier" }, + "start": 9, + "type": "ObjectProperty", "value": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 13, - "end": 19, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 14, "end": 15, - "value": 0, - "raw": "0" + "raw": "0", + "start": 14, + "type": "Literal", + "type": "Literal", + "value": 0 }, { - "type": "Literal", - "type": "Literal", - "start": 17, "end": 18, - "value": 1, - "raw": "1" + "raw": "1", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 1 } - ] + ], + "end": 19, + "start": 13, + "type": "ArrayExpression", + "type": "ArrayExpression" } }, { - "type": "ObjectProperty", - "start": 20, "end": 32, "key": { - "type": "Identifier", - "start": 20, "end": 24, - "name": "from" + "name": "from", + "start": 20, + "type": "Identifier" }, + "start": 20, + "type": "ObjectProperty", "value": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 26, - "end": 32, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 27, "end": 28, - "value": 3, - "raw": "3" + "raw": "3", + "start": 27, + "type": "Literal", + "type": "Literal", + "value": 3 }, { - "type": "Literal", - "type": "Literal", - "start": 30, "end": 31, - "value": 3, - "raw": "3" + "raw": "3", + "start": 30, + "type": "Literal", + "type": "Literal", + "value": 3 } - ] + ], + "end": 32, + "start": 26, + "type": "ArrayExpression", + "type": "ArrayExpression" } } - ] + ], + "start": 7, + "type": "ObjectExpression", + "type": "ObjectExpression" } ], - "optional": false - } + "callee": { + "end": 6, + "name": "lineTo", + "start": 0, + "type": "Identifier" + }, + "end": 35, + "optional": false, + "start": 0, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" } - ] + ], + "end": 35, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ap.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ap.snap index 5f41b2f23..5e99e3f37 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ap.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ap.snap @@ -3,67 +3,67 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 37, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 37, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 37, "id": { - "type": "Identifier", - "start": 6, "end": 14, - "name": "mySketch" + "name": "mySketch", + "start": 6, + "type": "Identifier" }, "init": { - "type": "CallExpression", - "type": "CallExpression", - "start": 17, - "end": 37, - "callee": { - "type": "Identifier", - "start": 17, - "end": 30, - "name": "startSketchAt" - }, "arguments": [ { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 31, - "end": 36, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 32, "end": 33, - "value": 0, - "raw": "0" + "raw": "0", + "start": 32, + "type": "Literal", + "type": "Literal", + "value": 0 }, { - "type": "Literal", - "type": "Literal", - "start": 34, "end": 35, - "value": 0, - "raw": "0" + "raw": "0", + "start": 34, + "type": "Literal", + "type": "Literal", + "value": 0 } - ] + ], + "end": 36, + "start": 31, + "type": "ArrayExpression", + "type": "ArrayExpression" } ], - "optional": false - } + "callee": { + "end": 30, + "name": "startSketchAt", + "start": 17, + "type": "Identifier" + }, + "end": 37, + "optional": false, + "start": 17, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 37, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 37, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__aq.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__aq.snap index b0e4a021c..7ed31b565 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__aq.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__aq.snap @@ -3,52 +3,52 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 28, "body": [ { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 0, "end": 28, "expression": { - "type": "CallExpression", - "type": "CallExpression", - "start": 0, - "end": 28, - "callee": { - "type": "Identifier", - "start": 0, - "end": 3, - "name": "log" - }, "arguments": [ { - "type": "Literal", - "type": "Literal", - "start": 4, "end": 5, - "value": 5, - "raw": "5" + "raw": "5", + "start": 4, + "type": "Literal", + "type": "Literal", + "value": 5 }, { - "type": "Literal", - "type": "Literal", - "start": 7, "end": 14, - "value": "hello", - "raw": "\"hello\"" + "raw": "\"hello\"", + "start": 7, + "type": "Literal", + "type": "Literal", + "value": "hello" }, { - "type": "Identifier", - "type": "Identifier", - "start": 16, "end": 27, - "name": "aIdentifier" + "name": "aIdentifier", + "start": 16, + "type": "Identifier", + "type": "Identifier" } ], - "optional": false - } + "callee": { + "end": 3, + "name": "log", + "start": 0, + "type": "Identifier" + }, + "end": 28, + "optional": false, + "start": 0, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" } - ] + ], + "end": 28, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ar.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ar.snap index 24602b164..0f91fbc8d 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ar.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ar.snap @@ -3,37 +3,37 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 7, "body": [ { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 0, "end": 7, "expression": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 0, "end": 7, - "operator": "+", "left": { - "type": "Literal", - "type": "Literal", - "start": 0, "end": 1, - "value": 5, - "raw": "5" + "raw": "5", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": 5 }, + "operator": "+", "right": { - "type": "Literal", - "type": "Literal", - "start": 4, "end": 7, - "value": "a", - "raw": "\"a\"" - } - } + "raw": "\"a\"", + "start": 4, + "type": "Literal", + "type": "Literal", + "value": "a" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" } - ] + ], + "end": 7, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__at.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__at.snap index 9935614d1..a8fb77a34 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__at.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__at.snap @@ -3,58 +3,58 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 15, "body": [ { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 0, "end": 15, "expression": { - "type": "CallExpression", - "type": "CallExpression", - "start": 0, - "end": 15, - "callee": { - "type": "Identifier", - "start": 0, - "end": 4, - "name": "line" - }, "arguments": [ { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 5, - "end": 11, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 6, "end": 7, - "value": 0, - "raw": "0" + "raw": "0", + "start": 6, + "type": "Literal", + "type": "Literal", + "value": 0 }, { - "type": "Identifier", - "type": "Identifier", - "start": 9, "end": 10, - "name": "l" + "name": "l", + "start": 9, + "type": "Identifier", + "type": "Identifier" } - ] + ], + "end": 11, + "start": 5, + "type": "ArrayExpression", + "type": "ArrayExpression" }, { - "type": "PipeSubstitution", - "type": "PipeSubstitution", + "end": 14, "start": 13, - "end": 14 + "type": "PipeSubstitution", + "type": "PipeSubstitution" } ], - "optional": false - } + "callee": { + "end": 4, + "name": "line", + "start": 0, + "type": "Identifier" + }, + "end": 15, + "optional": false, + "start": 0, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" } - ] + ], + "end": 15, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__au.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__au.snap index 5e5e05a1f..3c08a0bf0 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__au.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__au.snap @@ -3,171 +3,171 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 108, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 107, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 107, "id": { - "type": "Identifier", - "start": 6, "end": 14, - "name": "cylinder" + "name": "cylinder", + "start": 6, + "type": "Identifier" }, "init": { - "type": "PipeExpression", - "type": "PipeExpression", - "start": 17, - "end": 107, "body": [ { - "type": "CallExpression", - "type": "CallExpression", - "start": 17, - "end": 36, - "callee": { - "type": "Identifier", - "start": 17, - "end": 30, - "name": "startSketchOn" - }, "arguments": [ { - "type": "Literal", - "type": "Literal", - "start": 31, "end": 35, - "value": "XY", - "raw": "'XY'" + "raw": "'XY'", + "start": 31, + "type": "Literal", + "type": "Literal", + "value": "XY" } ], - "optional": false + "callee": { + "end": 30, + "name": "startSketchOn", + "start": 17, + "type": "Identifier" + }, + "end": 36, + "optional": false, + "start": 17, + "type": "CallExpression", + "type": "CallExpression" }, { - "type": "CallExpression", - "type": "CallExpression", - "start": 44, - "end": 85, - "callee": { - "type": "Identifier", - "start": 44, - "end": 50, - "name": "circle" - }, "arguments": [ { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 51, "end": 81, "properties": [ { - "type": "ObjectProperty", - "start": 53, "end": 67, "key": { - "type": "Identifier", - "start": 53, "end": 59, - "name": "center" + "name": "center", + "start": 53, + "type": "Identifier" }, + "start": 53, + "type": "ObjectProperty", "value": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 61, - "end": 67, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 62, "end": 63, - "value": 0, - "raw": "0" + "raw": "0", + "start": 62, + "type": "Literal", + "type": "Literal", + "value": 0 }, { - "type": "Literal", - "type": "Literal", - "start": 65, "end": 66, - "value": 0, - "raw": "0" + "raw": "0", + "start": 65, + "type": "Literal", + "type": "Literal", + "value": 0 } - ] + ], + "end": 67, + "start": 61, + "type": "ArrayExpression", + "type": "ArrayExpression" } }, { - "type": "ObjectProperty", - "start": 69, "end": 79, "key": { - "type": "Identifier", - "start": 69, "end": 75, - "name": "radius" + "name": "radius", + "start": 69, + "type": "Identifier" }, + "start": 69, + "type": "ObjectProperty", "value": { - "type": "Literal", - "type": "Literal", - "start": 77, "end": 79, - "value": 22, - "raw": "22" + "raw": "22", + "start": 77, + "type": "Literal", + "type": "Literal", + "value": 22 } } - ] + ], + "start": 51, + "type": "ObjectExpression", + "type": "ObjectExpression" }, { - "type": "PipeSubstitution", - "type": "PipeSubstitution", + "end": 84, "start": 83, - "end": 84 + "type": "PipeSubstitution", + "type": "PipeSubstitution" } ], - "optional": false + "callee": { + "end": 50, + "name": "circle", + "start": 44, + "type": "Identifier" + }, + "end": 85, + "optional": false, + "start": 44, + "type": "CallExpression", + "type": "CallExpression" }, { - "type": "CallExpression", - "type": "CallExpression", - "start": 93, - "end": 107, - "callee": { - "type": "Identifier", - "start": 93, - "end": 100, - "name": "extrude" - }, "arguments": [ { - "type": "Literal", - "type": "Literal", - "start": 101, "end": 103, - "value": 14, - "raw": "14" + "raw": "14", + "start": 101, + "type": "Literal", + "type": "Literal", + "value": 14 }, { - "type": "PipeSubstitution", - "type": "PipeSubstitution", + "end": 106, "start": 105, - "end": 106 + "type": "PipeSubstitution", + "type": "PipeSubstitution" } ], - "optional": false + "callee": { + "end": 100, + "name": "extrude", + "start": 93, + "type": "Identifier" + }, + "end": 107, + "optional": false, + "start": 93, + "type": "CallExpression", + "type": "CallExpression" } - ] - } + ], + "end": 107, + "start": 17, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 107, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 108, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__av.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__av.snap index a2b0b3ace..a631e0954 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__av.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__av.snap @@ -3,88 +3,88 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 49, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 49, "declarations": [ { - "type": "VariableDeclarator", - "start": 3, "end": 49, "id": { - "type": "Identifier", - "start": 3, "end": 4, - "name": "f" + "name": "f", + "start": 3, + "type": "Identifier" }, "init": { - "type": "FunctionExpression", - "type": "FunctionExpression", - "start": 7, + "body": { + "body": [ + { + "argument": { + "arguments": [ + { + "end": 41, + "name": "angle", + "start": 36, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 46, + "raw": "360", + "start": 43, + "type": "Literal", + "type": "Literal", + "value": 360 + } + ], + "callee": { + "end": 35, + "name": "default", + "start": 28, + "type": "Identifier" + }, + "end": 47, + "optional": false, + "start": 28, + "type": "CallExpression", + "type": "CallExpression" + }, + "end": 47, + "start": 21, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 49, + "start": 19 + }, "end": 49, "params": [ { "type": "Parameter", "identifier": { - "type": "Identifier", - "start": 8, "end": 13, - "name": "angle" + "name": "angle", + "start": 8, + "type": "Identifier" }, "optional": true } ], - "body": { - "start": 19, - "end": 49, - "body": [ - { - "type": "ReturnStatement", - "type": "ReturnStatement", - "start": 21, - "end": 47, - "argument": { - "type": "CallExpression", - "type": "CallExpression", - "start": 28, - "end": 47, - "callee": { - "type": "Identifier", - "start": 28, - "end": 35, - "name": "default" - }, - "arguments": [ - { - "type": "Identifier", - "type": "Identifier", - "start": 36, - "end": 41, - "name": "angle" - }, - { - "type": "Literal", - "type": "Literal", - "start": 43, - "end": 46, - "value": 360, - "raw": "360" - } - ], - "optional": false - } - } - ] - } - } + "start": 7, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 3, + "type": "VariableDeclarator" } ], - "kind": "fn" + "end": 49, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 49, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__aw.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__aw.snap index b0136cfce..db78d6395 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__aw.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__aw.snap @@ -3,55 +3,44 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 91, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 91, "declarations": [ { - "type": "VariableDeclarator", - "start": 4, "end": 91, "id": { - "type": "Identifier", - "start": 4, "end": 11, - "name": "numbers" + "name": "numbers", + "start": 4, + "type": "Identifier" }, "init": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 14, - "end": 91, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 28, "end": 29, - "value": 1, - "raw": "1" + "raw": "1", + "start": 28, + "type": "Literal", + "type": "Literal", + "value": 1 }, { - "type": "Literal", - "type": "Literal", - "start": 79, "end": 80, - "value": 3, - "raw": "3" + "raw": "3", + "start": 79, + "type": "Literal", + "type": "Literal", + "value": 3 } ], + "end": 91, "nonCodeMeta": { "nonCodeNodes": { "1": [ { - "type": "NonCodeNode", - "start": 43, "end": 48, + "start": 43, + "type": "NonCodeNode", "value": { "type": "blockComment", "value": "A,", @@ -61,9 +50,9 @@ expression: actual ], "2": [ { - "type": "NonCodeNode", - "start": 61, "end": 66, + "start": 61, + "type": "NonCodeNode", "value": { "type": "blockComment", "value": "B,", @@ -72,12 +61,23 @@ expression: actual } ] }, - "start": [] - } - } + "startNodes": [] + }, + "start": 14, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 4, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 91, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 91, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ax.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ax.snap index f3e1a73c7..5598578f6 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ax.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ax.snap @@ -3,55 +3,44 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 91, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 91, "declarations": [ { - "type": "VariableDeclarator", - "start": 4, "end": 91, "id": { - "type": "Identifier", - "start": 4, "end": 11, - "name": "numbers" + "name": "numbers", + "start": 4, + "type": "Identifier" }, "init": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 14, - "end": 91, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 28, "end": 29, - "value": 1, - "raw": "1" + "raw": "1", + "start": 28, + "type": "Literal", + "type": "Literal", + "value": 1 }, { - "type": "Literal", - "type": "Literal", - "start": 43, "end": 44, - "value": 2, - "raw": "2" + "raw": "2", + "start": 43, + "type": "Literal", + "type": "Literal", + "value": 2 } ], + "end": 91, "nonCodeMeta": { "nonCodeNodes": { "2": [ { - "type": "NonCodeNode", - "start": 58, "end": 63, + "start": 58, + "type": "NonCodeNode", "value": { "type": "blockComment", "value": "A,", @@ -61,9 +50,9 @@ expression: actual ], "3": [ { - "type": "NonCodeNode", - "start": 76, "end": 81, + "start": 76, + "type": "NonCodeNode", "value": { "type": "blockComment", "value": "B,", @@ -72,12 +61,23 @@ expression: actual } ] }, - "start": [] - } - } + "startNodes": [] + }, + "start": 14, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 4, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 91, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 91, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ay.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ay.snap index 5aa896ef5..4599b186d 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ay.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ay.snap @@ -3,77 +3,26 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 80, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 80, "declarations": [ { - "type": "VariableDeclarator", - "start": 4, "end": 80, "id": { - "type": "Identifier", - "start": 4, "end": 9, - "name": "props" + "name": "props", + "start": 4, + "type": "Identifier" }, "init": { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 12, "end": 80, - "properties": [ - { - "type": "ObjectProperty", - "start": 26, - "end": 30, - "key": { - "type": "Identifier", - "start": 26, - "end": 27, - "name": "a" - }, - "value": { - "type": "Literal", - "type": "Literal", - "start": 29, - "end": 30, - "value": 1, - "raw": "1" - } - }, - { - "type": "ObjectProperty", - "start": 65, - "end": 69, - "key": { - "type": "Identifier", - "start": 65, - "end": 66, - "name": "c" - }, - "value": { - "type": "Literal", - "type": "Literal", - "start": 68, - "end": 69, - "value": 3, - "raw": "3" - } - } - ], "nonCodeMeta": { "nonCodeNodes": { "1": [ { - "type": "NonCodeNode", - "start": 44, "end": 52, + "start": 44, + "type": "NonCodeNode", "value": { "type": "blockComment", "value": "b: 2,", @@ -82,12 +31,63 @@ expression: actual } ] }, - "start": [] - } - } + "startNodes": [] + }, + "properties": [ + { + "end": 30, + "key": { + "end": 27, + "name": "a", + "start": 26, + "type": "Identifier" + }, + "start": 26, + "type": "ObjectProperty", + "value": { + "end": 30, + "raw": "1", + "start": 29, + "type": "Literal", + "type": "Literal", + "value": 1 + } + }, + { + "end": 69, + "key": { + "end": 66, + "name": "c", + "start": 65, + "type": "Identifier" + }, + "start": 65, + "type": "ObjectProperty", + "value": { + "end": 69, + "raw": "3", + "start": 68, + "type": "Literal", + "type": "Literal", + "value": 3 + } + } + ], + "start": 12, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + "start": 4, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 80, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 80, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__az.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__az.snap index 28b28fc24..fc06a858d 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__az.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__az.snap @@ -3,77 +3,26 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 79, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 79, "declarations": [ { - "type": "VariableDeclarator", - "start": 4, "end": 79, "id": { - "type": "Identifier", - "start": 4, "end": 9, - "name": "props" + "name": "props", + "start": 4, + "type": "Identifier" }, "init": { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 12, "end": 79, - "properties": [ - { - "type": "ObjectProperty", - "start": 26, - "end": 30, - "key": { - "type": "Identifier", - "start": 26, - "end": 27, - "name": "a" - }, - "value": { - "type": "Literal", - "type": "Literal", - "start": 29, - "end": 30, - "value": 1, - "raw": "1" - } - }, - { - "type": "ObjectProperty", - "start": 65, - "end": 69, - "key": { - "type": "Identifier", - "start": 65, - "end": 66, - "name": "c" - }, - "value": { - "type": "Literal", - "type": "Literal", - "start": 68, - "end": 69, - "value": 3, - "raw": "3" - } - } - ], "nonCodeMeta": { "nonCodeNodes": { "1": [ { - "type": "NonCodeNode", - "start": 44, "end": 52, + "start": 44, + "type": "NonCodeNode", "value": { "type": "blockComment", "value": "b: 2,", @@ -82,12 +31,63 @@ expression: actual } ] }, - "start": [] - } - } + "startNodes": [] + }, + "properties": [ + { + "end": 30, + "key": { + "end": 27, + "name": "a", + "start": 26, + "type": "Identifier" + }, + "start": 26, + "type": "ObjectProperty", + "value": { + "end": 30, + "raw": "1", + "start": 29, + "type": "Literal", + "type": "Literal", + "value": 1 + } + }, + { + "end": 69, + "key": { + "end": 66, + "name": "c", + "start": 65, + "type": "Identifier" + }, + "start": 65, + "type": "ObjectProperty", + "value": { + "end": 69, + "raw": "3", + "start": 68, + "type": "Literal", + "type": "Literal", + "value": 3 + } + } + ], + "start": 12, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + "start": 4, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 79, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 79, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__b.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__b.snap index 8360a7369..e54a3e613 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__b.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__b.snap @@ -3,89 +3,89 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 36, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 36, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 36, "id": { - "type": "Identifier", - "start": 6, "end": 11, - "name": "myVar" + "name": "myVar", + "start": 6, + "type": "Identifier" }, "init": { - "type": "CallExpression", - "type": "CallExpression", - "start": 14, - "end": 36, - "callee": { - "type": "Identifier", - "start": 14, - "end": 17, - "name": "min" - }, "arguments": [ { - "type": "Literal", - "type": "Literal", - "start": 18, "end": 19, - "value": 5, - "raw": "5" + "raw": "5", + "start": 18, + "type": "Literal", + "type": "Literal", + "value": 5 }, { - "type": "UnaryExpression", - "type": "UnaryExpression", - "start": 22, - "end": 35, - "operator": "-", "argument": { - "type": "CallExpression", - "type": "CallExpression", - "start": 23, - "end": 35, - "callee": { - "type": "Identifier", - "start": 23, - "end": 29, - "name": "legLen" - }, "arguments": [ { - "type": "Literal", - "type": "Literal", - "start": 30, "end": 31, - "value": 5, - "raw": "5" + "raw": "5", + "start": 30, + "type": "Literal", + "type": "Literal", + "value": 5 }, { - "type": "Literal", - "type": "Literal", - "start": 33, "end": 34, - "value": 4, - "raw": "4" + "raw": "4", + "start": 33, + "type": "Literal", + "type": "Literal", + "value": 4 } ], - "optional": false - } + "callee": { + "end": 29, + "name": "legLen", + "start": 23, + "type": "Identifier" + }, + "end": 35, + "optional": false, + "start": 23, + "type": "CallExpression", + "type": "CallExpression" + }, + "end": 35, + "operator": "-", + "start": 22, + "type": "UnaryExpression", + "type": "UnaryExpression" } ], - "optional": false - } + "callee": { + "end": 17, + "name": "min", + "start": 14, + "type": "Identifier" + }, + "end": 36, + "optional": false, + "start": 14, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 36, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 36, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ba.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ba.snap index 9b5d26a1b..0a9ac7936 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ba.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__ba.snap @@ -3,83 +3,72 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 133, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 1, - "end": 132, "declarations": [ { - "type": "VariableDeclarator", - "start": 7, "end": 132, "id": { - "type": "Identifier", - "start": 7, "end": 16, - "name": "sketch001" + "name": "sketch001", + "start": 7, + "type": "Identifier" }, "init": { - "type": "PipeExpression", - "type": "PipeExpression", - "start": 19, - "end": 132, "body": [ { - "type": "CallExpression", - "type": "CallExpression", - "start": 19, - "end": 38, - "callee": { - "type": "Identifier", - "start": 19, - "end": 32, - "name": "startSketchOn" - }, "arguments": [ { - "type": "Literal", - "type": "Literal", - "start": 33, "end": 37, - "value": "XY", - "raw": "'XY'" + "raw": "'XY'", + "start": 33, + "type": "Literal", + "type": "Literal", + "value": "XY" } ], - "optional": false + "callee": { + "end": 32, + "name": "startSketchOn", + "start": 19, + "type": "Identifier" + }, + "end": 38, + "optional": false, + "start": 19, + "type": "CallExpression", + "type": "CallExpression" }, { - "type": "CallExpression", - "type": "CallExpression", - "start": 115, - "end": 132, - "callee": { - "type": "Identifier", - "start": 115, - "end": 129, - "name": "startProfileAt" - }, "arguments": [ { - "type": "PipeSubstitution", - "type": "PipeSubstitution", + "end": 131, "start": 130, - "end": 131 + "type": "PipeSubstitution", + "type": "PipeSubstitution" } ], - "optional": false + "callee": { + "end": 129, + "name": "startProfileAt", + "start": 115, + "type": "Identifier" + }, + "end": 132, + "optional": false, + "start": 115, + "type": "CallExpression", + "type": "CallExpression" } ], + "end": 132, "nonCodeMeta": { "nonCodeNodes": { "0": [ { - "type": "NonCodeNode", - "start": 41, "end": 52, + "start": 41, + "type": "NonCodeNode", "value": { "type": "blockComment", "value": "|> arc({", @@ -87,9 +76,9 @@ expression: actual } }, { - "type": "NonCodeNode", - "start": 55, "end": 74, + "start": 55, + "type": "NonCodeNode", "value": { "type": "blockComment", "value": "angleEnd: 270,", @@ -97,9 +86,9 @@ expression: actual } }, { - "type": "NonCodeNode", - "start": 77, "end": 98, + "start": 77, + "type": "NonCodeNode", "value": { "type": "blockComment", "value": "angleStart: 450,", @@ -107,9 +96,9 @@ expression: actual } }, { - "type": "NonCodeNode", - "start": 101, "end": 109, + "start": 101, + "type": "NonCodeNode", "value": { "type": "blockComment", "value": "}, %)", @@ -118,12 +107,23 @@ expression: actual } ] }, - "start": [] - } - } + "startNodes": [] + }, + "start": 19, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 7, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 132, + "kind": "const", + "start": 1, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 133, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bb.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bb.snap index 1bec34927..780dc200d 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bb.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bb.snap @@ -3,96 +3,96 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 32, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 1, - "end": 31, "declarations": [ { - "type": "VariableDeclarator", - "start": 7, "end": 31, "id": { - "type": "Identifier", - "start": 7, "end": 11, - "name": "my14" + "name": "my14", + "start": 7, + "type": "Identifier" }, "init": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 14, "end": 31, - "operator": "-", "left": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 14, "end": 19, - "operator": "^", "left": { - "type": "Literal", - "type": "Literal", - "start": 14, "end": 15, - "value": 4, - "raw": "4" + "raw": "4", + "start": 14, + "type": "Literal", + "type": "Literal", + "value": 4 }, + "operator": "^", "right": { - "type": "Literal", - "type": "Literal", - "start": 18, "end": 19, - "value": 2, - "raw": "2" - } - }, - "right": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 22, - "end": 31, - "operator": "*", - "left": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 22, - "end": 27, - "operator": "^", - "left": { - "type": "Literal", - "type": "Literal", - "start": 22, - "end": 23, - "value": 3, - "raw": "3" - }, - "right": { - "type": "Literal", - "type": "Literal", - "start": 26, - "end": 27, - "value": 2, - "raw": "2" - } + "raw": "2", + "start": 18, + "type": "Literal", + "type": "Literal", + "value": 2 }, + "start": 14, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "-", + "right": { + "end": 31, + "left": { + "end": 27, + "left": { + "end": 23, + "raw": "3", + "start": 22, + "type": "Literal", + "type": "Literal", + "value": 3 + }, + "operator": "^", + "right": { + "end": 27, + "raw": "2", + "start": 26, + "type": "Literal", + "type": "Literal", + "value": 2 + }, + "start": 22, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "*", "right": { - "type": "Literal", - "type": "Literal", - "start": 30, "end": 31, - "value": 2, - "raw": "2" - } - } - } + "raw": "2", + "start": 30, + "type": "Literal", + "type": "Literal", + "value": 2 + }, + "start": 22, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 14, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 7, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 31, + "kind": "const", + "start": 1, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 32, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bc.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bc.snap index 25bea0567..f666a67f3 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bc.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bc.snap @@ -3,84 +3,84 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 74, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 74, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 74, "id": { - "type": "Identifier", - "start": 6, "end": 7, - "name": "x" + "name": "x", + "start": 6, + "type": "Identifier" }, "init": { - "type": "IfExpression", - "type": "IfExpression", - "start": 10, - "end": 74, "cond": { - "type": "Literal", - "type": "Literal", - "start": 13, "end": 17, - "value": true, - "raw": "true" - }, - "then_val": { - "start": 32, - "end": 42, - "body": [ - { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 32, - "end": 33, - "expression": { - "type": "Literal", - "type": "Literal", - "start": 32, - "end": 33, - "value": 3, - "raw": "3" - } - } - ] + "raw": "true", + "start": 13, + "type": "Literal", + "type": "Literal", + "value": true }, + "digest": null, "else_ifs": [], + "end": 74, "final_else": { - "start": 63, - "end": 73, "body": [ { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 63, "end": 64, "expression": { - "type": "Literal", - "type": "Literal", - "start": 63, "end": 64, - "value": 4, - "raw": "4" - } + "raw": "4", + "start": 63, + "type": "Literal", + "type": "Literal", + "value": 4 + }, + "start": 63, + "type": "ExpressionStatement", + "type": "ExpressionStatement" } - ] + ], + "end": 73, + "start": 63 }, - "digest": null - } + "start": 10, + "then_val": { + "body": [ + { + "end": 33, + "expression": { + "end": 33, + "raw": "3", + "start": 32, + "type": "Literal", + "type": "Literal", + "value": 3 + }, + "start": 32, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 42, + "start": 32 + }, + "type": "IfExpression", + "type": "IfExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 74, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 74, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bd.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bd.snap index 42254d3fd..e27be60c5 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bd.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bd.snap @@ -3,133 +3,133 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 121, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 121, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 121, "id": { - "type": "Identifier", - "start": 6, "end": 7, - "name": "x" + "name": "x", + "start": 6, + "type": "Identifier" }, "init": { - "type": "IfExpression", - "type": "IfExpression", - "start": 10, - "end": 121, "cond": { - "type": "Literal", - "type": "Literal", - "start": 13, "end": 17, - "value": true, - "raw": "true" - }, - "then_val": { - "start": 32, - "end": 42, - "body": [ - { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 32, - "end": 33, - "expression": { - "type": "Literal", - "type": "Literal", - "start": 32, - "end": 33, - "value": 3, - "raw": "3" - } - } - ] + "raw": "true", + "start": 13, + "type": "Literal", + "type": "Literal", + "value": true }, + "digest": null, "else_ifs": [ { - "type": "ElseIf", - "start": 44, - "end": 90, "cond": { - "type": "CallExpression", - "type": "CallExpression", - "start": 52, - "end": 64, - "callee": { - "type": "Identifier", - "start": 52, - "end": 56, - "name": "func" - }, "arguments": [ { - "type": "Identifier", - "type": "Identifier", - "start": 57, "end": 63, - "name": "radius" + "name": "radius", + "start": 57, + "type": "Identifier", + "type": "Identifier" } ], - "optional": false + "callee": { + "end": 56, + "name": "func", + "start": 52, + "type": "Identifier" + }, + "end": 64, + "optional": false, + "start": 52, + "type": "CallExpression", + "type": "CallExpression" }, + "digest": null, + "end": 90, + "start": 44, "then_val": { - "start": 65, - "end": 89, "body": [ { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 79, "end": 80, "expression": { - "type": "Literal", - "type": "Literal", - "start": 79, "end": 80, - "value": 4, - "raw": "4" - } + "raw": "4", + "start": 79, + "type": "Literal", + "type": "Literal", + "value": 4 + }, + "start": 79, + "type": "ExpressionStatement", + "type": "ExpressionStatement" } - ] + ], + "end": 89, + "start": 65 }, - "digest": null + "type": "ElseIf" } ], + "end": 121, "final_else": { - "start": 110, - "end": 120, "body": [ { - "type": "ExpressionStatement", - "type": "ExpressionStatement", - "start": 110, "end": 111, "expression": { - "type": "Literal", - "type": "Literal", - "start": 110, "end": 111, - "value": 5, - "raw": "5" - } + "raw": "5", + "start": 110, + "type": "Literal", + "type": "Literal", + "value": 5 + }, + "start": 110, + "type": "ExpressionStatement", + "type": "ExpressionStatement" } - ] + ], + "end": 120, + "start": 110 }, - "digest": null - } + "start": 10, + "then_val": { + "body": [ + { + "end": 33, + "expression": { + "end": 33, + "raw": "3", + "start": 32, + "type": "Literal", + "type": "Literal", + "value": 3 + }, + "start": 32, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + } + ], + "end": 42, + "start": 32 + }, + "type": "IfExpression", + "type": "IfExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 121, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 121, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__be.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__be.snap index 6753e459d..2eaa1e886 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__be.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__be.snap @@ -3,51 +3,51 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 14, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 14, "declarations": [ { - "type": "VariableDeclarator", - "start": 4, "end": 14, "id": { - "type": "Identifier", - "start": 4, "end": 5, - "name": "x" + "name": "x", + "start": 4, + "type": "Identifier" }, "init": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 8, "end": 14, - "operator": "==", "left": { - "type": "Literal", - "type": "Literal", - "start": 8, "end": 9, - "value": 3, - "raw": "3" + "raw": "3", + "start": 8, + "type": "Literal", + "type": "Literal", + "value": 3 }, + "operator": "==", "right": { - "type": "Literal", - "type": "Literal", - "start": 13, "end": 14, - "value": 3, - "raw": "3" - } - } + "raw": "3", + "start": 13, + "type": "Literal", + "type": "Literal", + "value": 3 + }, + "start": 8, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 4, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 14, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 14, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bf.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bf.snap index 3cd6916f6..3ef1d35f1 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bf.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bf.snap @@ -3,51 +3,51 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 14, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 14, "declarations": [ { - "type": "VariableDeclarator", - "start": 4, "end": 14, "id": { - "type": "Identifier", - "start": 4, "end": 5, - "name": "x" + "name": "x", + "start": 4, + "type": "Identifier" }, "init": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 8, "end": 14, - "operator": "!=", "left": { - "type": "Literal", - "type": "Literal", - "start": 8, "end": 9, - "value": 3, - "raw": "3" + "raw": "3", + "start": 8, + "type": "Literal", + "type": "Literal", + "value": 3 }, + "operator": "!=", "right": { - "type": "Literal", - "type": "Literal", - "start": 13, "end": 14, - "value": 3, - "raw": "3" - } - } + "raw": "3", + "start": 13, + "type": "Literal", + "type": "Literal", + "value": 3 + }, + "start": 8, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 4, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 14, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 14, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bg.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bg.snap index 86e134846..c7bd3c4eb 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bg.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bg.snap @@ -3,36 +3,36 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 5, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 5, "declarations": [ { - "type": "VariableDeclarator", - "start": 0, "end": 5, "id": { - "type": "Identifier", - "start": 0, "end": 1, - "name": "x" + "name": "x", + "start": 0, + "type": "Identifier" }, "init": { - "type": "Literal", - "type": "Literal", - "start": 4, "end": 5, - "value": 4, - "raw": "4" - } + "raw": "4", + "start": 4, + "type": "Literal", + "type": "Literal", + "value": 4 + }, + "start": 0, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 5, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 5, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bh.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bh.snap index 3a2670ced..3f909f8cc 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bh.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__bh.snap @@ -3,90 +3,90 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 42, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 42, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 42, "id": { - "type": "Identifier", - "start": 6, "end": 9, - "name": "obj" + "name": "obj", + "start": 6, + "type": "Identifier" }, "init": { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 12, "end": 42, "properties": [ { - "type": "ObjectProperty", - "start": 13, "end": 30, "key": { - "type": "Identifier", - "start": 13, "end": 19, - "name": "center" + "name": "center", + "start": 13, + "type": "Identifier" }, + "start": 13, + "type": "ObjectProperty", "value": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 22, - "end": 30, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 23, "end": 25, - "value": 10, - "raw": "10" + "raw": "10", + "start": 23, + "type": "Literal", + "type": "Literal", + "value": 10 }, { - "type": "Literal", - "type": "Literal", - "start": 27, "end": 29, - "value": 10, - "raw": "10" + "raw": "10", + "start": 27, + "type": "Literal", + "type": "Literal", + "value": 10 } - ] + ], + "end": 30, + "start": 22, + "type": "ArrayExpression", + "type": "ArrayExpression" } }, { - "type": "ObjectProperty", - "start": 32, "end": 41, "key": { - "type": "Identifier", - "start": 32, "end": 38, - "name": "radius" + "name": "radius", + "start": 32, + "type": "Identifier" }, + "start": 32, + "type": "ObjectProperty", "value": { - "type": "Literal", - "type": "Literal", - "start": 40, "end": 41, - "value": 5, - "raw": "5" + "raw": "5", + "start": 40, + "type": "Literal", + "type": "Literal", + "value": 5 } } - ] - } + ], + "start": 12, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 42, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 42, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__c.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__c.snap index 919a7cae5..5a53a6c8d 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__c.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__c.snap @@ -3,89 +3,89 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 35, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 35, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 35, "id": { - "type": "Identifier", - "start": 6, "end": 11, - "name": "myVar" + "name": "myVar", + "start": 6, + "type": "Identifier" }, "init": { - "type": "CallExpression", - "type": "CallExpression", - "start": 14, - "end": 35, - "callee": { - "type": "Identifier", - "start": 14, - "end": 17, - "name": "min" - }, "arguments": [ { - "type": "UnaryExpression", - "type": "UnaryExpression", - "start": 18, - "end": 31, - "operator": "-", "argument": { - "type": "CallExpression", - "type": "CallExpression", - "start": 19, - "end": 31, - "callee": { - "type": "Identifier", - "start": 19, - "end": 25, - "name": "legLen" - }, "arguments": [ { - "type": "Literal", - "type": "Literal", - "start": 26, "end": 27, - "value": 5, - "raw": "5" + "raw": "5", + "start": 26, + "type": "Literal", + "type": "Literal", + "value": 5 }, { - "type": "Literal", - "type": "Literal", - "start": 29, "end": 30, - "value": 4, - "raw": "4" + "raw": "4", + "start": 29, + "type": "Literal", + "type": "Literal", + "value": 4 } ], - "optional": false - } + "callee": { + "end": 25, + "name": "legLen", + "start": 19, + "type": "Identifier" + }, + "end": 31, + "optional": false, + "start": 19, + "type": "CallExpression", + "type": "CallExpression" + }, + "end": 31, + "operator": "-", + "start": 18, + "type": "UnaryExpression", + "type": "UnaryExpression" }, { - "type": "Literal", - "type": "Literal", - "start": 33, "end": 34, - "value": 5, - "raw": "5" + "raw": "5", + "start": 33, + "type": "Literal", + "type": "Literal", + "value": 5 } ], - "optional": false - } + "callee": { + "end": 17, + "name": "min", + "start": 14, + "type": "Identifier" + }, + "end": 35, + "optional": false, + "start": 14, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 35, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 35, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__d.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__d.snap index bf9c494f1..a8de2c89c 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__d.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__d.snap @@ -3,88 +3,88 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 36, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 36, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 36, "id": { - "type": "Identifier", - "start": 6, "end": 11, - "name": "myVar" + "name": "myVar", + "start": 6, + "type": "Identifier" }, "init": { - "type": "PipeExpression", - "type": "PipeExpression", - "start": 14, - "end": 36, "body": [ { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 14, "end": 19, - "operator": "+", "left": { - "type": "Literal", - "type": "Literal", - "start": 14, "end": 15, - "value": 5, - "raw": "5" + "raw": "5", + "start": 14, + "type": "Literal", + "type": "Literal", + "value": 5 }, + "operator": "+", "right": { - "type": "Literal", - "type": "Literal", - "start": 18, "end": 19, - "value": 6, - "raw": "6" - } + "raw": "6", + "start": 18, + "type": "Literal", + "type": "Literal", + "value": 6 + }, + "start": 14, + "type": "BinaryExpression", + "type": "BinaryExpression" }, { - "type": "CallExpression", - "type": "CallExpression", - "start": 23, - "end": 36, - "callee": { - "type": "Identifier", - "start": 23, - "end": 29, - "name": "myFunc" - }, "arguments": [ { - "type": "Literal", - "type": "Literal", - "start": 30, "end": 32, - "value": 45, - "raw": "45" + "raw": "45", + "start": 30, + "type": "Literal", + "type": "Literal", + "value": 45 }, { - "type": "PipeSubstitution", - "type": "PipeSubstitution", + "end": 35, "start": 34, - "end": 35 + "type": "PipeSubstitution", + "type": "PipeSubstitution" } ], - "optional": false + "callee": { + "end": 29, + "name": "myFunc", + "start": 23, + "type": "Identifier" + }, + "end": 36, + "optional": false, + "start": 23, + "type": "CallExpression", + "type": "CallExpression" } - ] - } + ], + "end": 36, + "start": 14, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 36, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 36, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__d2.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__d2.snap index 6491695a4..afd750d99 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__d2.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__d2.snap @@ -3,56 +3,56 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 27, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 27, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 27, "id": { - "type": "Identifier", - "start": 6, "end": 7, - "name": "x" + "name": "x", + "start": 6, + "type": "Identifier" }, "init": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 10, "end": 27, - "operator": "+", "left": { - "type": "UnaryExpression", - "type": "UnaryExpression", - "start": 10, + "argument": { + "end": 15, + "name": "leg2", + "start": 11, + "type": "Identifier", + "type": "Identifier" + }, "end": 15, "operator": "-", - "argument": { - "type": "Identifier", - "type": "Identifier", - "start": 11, - "end": 15, - "name": "leg2" - } + "start": 10, + "type": "UnaryExpression", + "type": "UnaryExpression" }, + "operator": "+", "right": { - "type": "Identifier", - "type": "Identifier", - "start": 18, "end": 27, - "name": "thickness" - } - } + "name": "thickness", + "start": 18, + "type": "Identifier", + "type": "Identifier" + }, + "start": 10, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 27, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 27, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__e.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__e.snap index 112a03ee6..b11920a86 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__e.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__e.snap @@ -3,66 +3,66 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 18, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 18, "declarations": [ { - "type": "VariableDeclarator", - "start": 4, "end": 18, "id": { - "type": "Identifier", - "start": 4, "end": 5, - "name": "x" + "name": "x", + "start": 4, + "type": "Identifier" }, "init": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 8, "end": 18, - "operator": "*", "left": { - "type": "Literal", - "type": "Literal", - "start": 8, "end": 9, - "value": 1, - "raw": "1" + "raw": "1", + "start": 8, + "type": "Literal", + "type": "Literal", + "value": 1 }, + "operator": "*", "right": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 13, "end": 18, - "operator": "-", "left": { - "type": "Literal", - "type": "Literal", - "start": 13, "end": 14, - "value": 3, - "raw": "3" + "raw": "3", + "start": 13, + "type": "Literal", + "type": "Literal", + "value": 3 }, + "operator": "-", "right": { - "type": "Literal", - "type": "Literal", - "start": 17, "end": 18, - "value": 4, - "raw": "4" - } - } - } + "raw": "4", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 4 + }, + "start": 13, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 8, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 4, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 18, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 18, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__f.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__f.snap index 89ef278bb..e9608c3f7 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__f.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__f.snap @@ -3,45 +3,44 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 40, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 11, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 11, "id": { - "type": "Identifier", - "start": 6, "end": 7, - "name": "x" + "name": "x", + "start": 6, + "type": "Identifier" }, "init": { - "type": "Literal", - "type": "Literal", - "start": 10, "end": 11, - "value": 1, - "raw": "1" - } + "raw": "1", + "start": 10, + "type": "Literal", + "type": "Literal", + "value": 1 + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 11, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } ], + "end": 40, "nonCodeMeta": { "nonCodeNodes": { "0": [ { - "type": "NonCodeNode", - "start": 11, "end": 40, + "start": 11, + "type": "NonCodeNode", "value": { "type": "inlineComment", "value": "this is an inline comment", @@ -50,6 +49,7 @@ expression: actual } ] }, - "start": [] - } + "startNodes": [] + }, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__g.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__g.snap index 6cd8f1424..2a7269487 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__g.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__g.snap @@ -3,67 +3,67 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 58, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 58, "declarations": [ { - "type": "VariableDeclarator", - "start": 3, "end": 58, "id": { - "type": "Identifier", - "start": 3, "end": 4, - "name": "x" + "name": "x", + "start": 3, + "type": "Identifier" }, "init": { - "type": "FunctionExpression", - "type": "FunctionExpression", - "start": 7, - "end": 58, - "params": [], "body": { - "start": 13, - "end": 58, "body": [ { - "type": "ReturnStatement", - "type": "ReturnStatement", - "start": 23, - "end": 32, "argument": { - "type": "Identifier", - "type": "Identifier", - "start": 30, "end": 32, - "name": "sg" - } + "name": "sg", + "start": 30, + "type": "Identifier", + "type": "Identifier" + }, + "end": 32, + "start": 23, + "type": "ReturnStatement", + "type": "ReturnStatement" }, { - "type": "ReturnStatement", - "type": "ReturnStatement", - "start": 41, - "end": 50, "argument": { - "type": "Identifier", - "type": "Identifier", - "start": 48, "end": 50, - "name": "sg" - } + "name": "sg", + "start": 48, + "type": "Identifier", + "type": "Identifier" + }, + "end": 50, + "start": 41, + "type": "ReturnStatement", + "type": "ReturnStatement" } - ] - } - } + ], + "end": 58, + "start": 13 + }, + "end": 58, + "params": [], + "start": 7, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 3, + "type": "VariableDeclarator" } ], - "kind": "fn" + "end": 58, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 58, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__h.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__h.snap index 53266e6f6..909221053 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__h.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__h.snap @@ -3,130 +3,130 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 55, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 26, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 26, "id": { - "type": "Identifier", - "start": 6, "end": 9, - "name": "obj" + "name": "obj", + "start": 6, + "type": "Identifier" }, "init": { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 12, "end": 26, "properties": [ { - "type": "ObjectProperty", - "start": 14, "end": 18, "key": { - "type": "Identifier", - "start": 14, "end": 15, - "name": "a" + "name": "a", + "start": 14, + "type": "Identifier" }, + "start": 14, + "type": "ObjectProperty", "value": { - "type": "Literal", - "type": "Literal", - "start": 17, "end": 18, - "value": 1, - "raw": "1" + "raw": "1", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 1 } }, { - "type": "ObjectProperty", - "start": 20, "end": 24, "key": { - "type": "Identifier", - "start": 20, "end": 21, - "name": "b" + "name": "b", + "start": 20, + "type": "Identifier" }, + "start": 20, + "type": "ObjectProperty", "value": { - "type": "Literal", - "type": "Literal", - "start": 23, "end": 24, - "value": 2, - "raw": "2" + "raw": "2", + "start": 23, + "type": "Literal", + "type": "Literal", + "value": 2 } } - ] - } + ], + "start": 12, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 26, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" }, { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 31, - "end": 55, "declarations": [ { - "type": "VariableDeclarator", - "start": 37, "end": 55, "id": { - "type": "Identifier", - "start": 37, "end": 43, - "name": "height" + "name": "height", + "start": 37, + "type": "Identifier" }, "init": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 46, "end": 55, - "operator": "-", "left": { - "type": "Literal", - "type": "Literal", - "start": 46, "end": 47, - "value": 1, - "raw": "1" + "raw": "1", + "start": 46, + "type": "Literal", + "type": "Literal", + "value": 1 }, + "operator": "-", "right": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 50, + "computed": false, "end": 55, "object": { - "type": "Identifier", - "type": "Identifier", - "start": 50, "end": 53, - "name": "obj" + "name": "obj", + "start": 50, + "type": "Identifier", + "type": "Identifier" }, "property": { - "type": "Identifier", - "type": "Identifier", - "start": 54, "end": 55, - "name": "a" + "name": "a", + "start": 54, + "type": "Identifier", + "type": "Identifier" }, - "computed": false - } - } + "start": 50, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 46, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 37, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 55, + "kind": "const", + "start": 31, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 55, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__i.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__i.snap index 1941a0f05..e348e7d25 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__i.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__i.snap @@ -3,131 +3,131 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 59, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 26, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 26, "id": { - "type": "Identifier", - "start": 6, "end": 9, - "name": "obj" + "name": "obj", + "start": 6, + "type": "Identifier" }, "init": { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 12, "end": 26, "properties": [ { - "type": "ObjectProperty", - "start": 14, "end": 18, "key": { - "type": "Identifier", - "start": 14, "end": 15, - "name": "a" + "name": "a", + "start": 14, + "type": "Identifier" }, + "start": 14, + "type": "ObjectProperty", "value": { - "type": "Literal", - "type": "Literal", - "start": 17, "end": 18, - "value": 1, - "raw": "1" + "raw": "1", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 1 } }, { - "type": "ObjectProperty", - "start": 20, "end": 24, "key": { - "type": "Identifier", - "start": 20, "end": 21, - "name": "b" + "name": "b", + "start": 20, + "type": "Identifier" }, + "start": 20, + "type": "ObjectProperty", "value": { - "type": "Literal", - "type": "Literal", - "start": 23, "end": 24, - "value": 2, - "raw": "2" + "raw": "2", + "start": 23, + "type": "Literal", + "type": "Literal", + "value": 2 } } - ] - } + ], + "start": 12, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 26, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" }, { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 32, - "end": 59, "declarations": [ { - "type": "VariableDeclarator", - "start": 38, "end": 59, "id": { - "type": "Identifier", - "start": 38, "end": 44, - "name": "height" + "name": "height", + "start": 38, + "type": "Identifier" }, "init": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 47, "end": 59, - "operator": "-", "left": { - "type": "Literal", - "type": "Literal", - "start": 47, "end": 48, - "value": 1, - "raw": "1" + "raw": "1", + "start": 47, + "type": "Literal", + "type": "Literal", + "value": 1 }, + "operator": "-", "right": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 51, + "computed": false, "end": 59, "object": { - "type": "Identifier", - "type": "Identifier", - "start": 51, "end": 54, - "name": "obj" + "name": "obj", + "start": 51, + "type": "Identifier", + "type": "Identifier" }, "property": { - "type": "Literal", - "type": "Literal", - "start": 55, "end": 58, - "value": "a", - "raw": "\"a\"" + "raw": "\"a\"", + "start": 55, + "type": "Literal", + "type": "Literal", + "value": "a" }, - "computed": false - } - } + "start": 51, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 47, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 38, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 59, + "kind": "const", + "start": 32, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 59, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__j.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__j.snap index 33f2471c5..70ec94c42 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__j.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__j.snap @@ -3,131 +3,131 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 58, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 26, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 26, "id": { - "type": "Identifier", - "start": 6, "end": 9, - "name": "obj" + "name": "obj", + "start": 6, + "type": "Identifier" }, "init": { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 12, "end": 26, "properties": [ { - "type": "ObjectProperty", - "start": 14, "end": 18, "key": { - "type": "Identifier", - "start": 14, "end": 15, - "name": "a" + "name": "a", + "start": 14, + "type": "Identifier" }, + "start": 14, + "type": "ObjectProperty", "value": { - "type": "Literal", - "type": "Literal", - "start": 17, "end": 18, - "value": 1, - "raw": "1" + "raw": "1", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 1 } }, { - "type": "ObjectProperty", - "start": 20, "end": 24, "key": { - "type": "Identifier", - "start": 20, "end": 21, - "name": "b" + "name": "b", + "start": 20, + "type": "Identifier" }, + "start": 20, + "type": "ObjectProperty", "value": { - "type": "Literal", - "type": "Literal", - "start": 23, "end": 24, - "value": 2, - "raw": "2" + "raw": "2", + "start": 23, + "type": "Literal", + "type": "Literal", + "value": 2 } } - ] - } + ], + "start": 12, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 26, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" }, { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 31, - "end": 58, "declarations": [ { - "type": "VariableDeclarator", - "start": 37, "end": 58, "id": { - "type": "Identifier", - "start": 37, "end": 43, - "name": "height" + "name": "height", + "start": 37, + "type": "Identifier" }, "init": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 46, "end": 58, - "operator": "-", "left": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 46, + "computed": false, "end": 54, "object": { - "type": "Identifier", - "type": "Identifier", - "start": 46, "end": 49, - "name": "obj" + "name": "obj", + "start": 46, + "type": "Identifier", + "type": "Identifier" }, "property": { - "type": "Literal", - "type": "Literal", - "start": 50, "end": 53, - "value": "a", - "raw": "\"a\"" + "raw": "\"a\"", + "start": 50, + "type": "Literal", + "type": "Literal", + "value": "a" }, - "computed": false + "start": 46, + "type": "MemberExpression", + "type": "MemberExpression" }, + "operator": "-", "right": { - "type": "Literal", - "type": "Literal", - "start": 57, "end": 58, - "value": 1, - "raw": "1" - } - } + "raw": "1", + "start": 57, + "type": "Literal", + "type": "Literal", + "value": 1 + }, + "start": 46, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 37, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 58, + "kind": "const", + "start": 31, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 58, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__k.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__k.snap index 8b121009b..a5b9e8f5a 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__k.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__k.snap @@ -3,147 +3,147 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 63, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 26, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 26, "id": { - "type": "Identifier", - "start": 6, "end": 9, - "name": "obj" + "name": "obj", + "start": 6, + "type": "Identifier" }, "init": { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 12, "end": 26, "properties": [ { - "type": "ObjectProperty", - "start": 14, "end": 18, "key": { - "type": "Identifier", - "start": 14, "end": 15, - "name": "a" + "name": "a", + "start": 14, + "type": "Identifier" }, + "start": 14, + "type": "ObjectProperty", "value": { - "type": "Literal", - "type": "Literal", - "start": 17, "end": 18, - "value": 1, - "raw": "1" + "raw": "1", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 1 } }, { - "type": "ObjectProperty", - "start": 20, "end": 24, "key": { - "type": "Identifier", - "start": 20, "end": 21, - "name": "b" + "name": "b", + "start": 20, + "type": "Identifier" }, + "start": 20, + "type": "ObjectProperty", "value": { - "type": "Literal", - "type": "Literal", - "start": 23, "end": 24, - "value": 2, - "raw": "2" + "raw": "2", + "start": 23, + "type": "Literal", + "type": "Literal", + "value": 2 } } - ] - } + ], + "start": 12, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 26, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" }, { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 31, - "end": 63, "declarations": [ { - "type": "VariableDeclarator", - "start": 37, "end": 63, "id": { - "type": "Identifier", - "start": 37, "end": 43, - "name": "height" + "name": "height", + "start": 37, + "type": "Identifier" }, "init": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 46, - "end": 63, "elements": [ { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 47, "end": 59, - "operator": "-", "left": { - "type": "Literal", - "type": "Literal", - "start": 47, "end": 48, - "value": 1, - "raw": "1" + "raw": "1", + "start": 47, + "type": "Literal", + "type": "Literal", + "value": 1 }, + "operator": "-", "right": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 51, + "computed": false, "end": 59, "object": { - "type": "Identifier", - "type": "Identifier", - "start": 51, "end": 54, - "name": "obj" + "name": "obj", + "start": 51, + "type": "Identifier", + "type": "Identifier" }, "property": { - "type": "Literal", - "type": "Literal", - "start": 55, "end": 58, - "value": "a", - "raw": "\"a\"" + "raw": "\"a\"", + "start": 55, + "type": "Literal", + "type": "Literal", + "value": "a" }, - "computed": false - } + "start": 51, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 47, + "type": "BinaryExpression", + "type": "BinaryExpression" }, { - "type": "Literal", - "type": "Literal", - "start": 61, "end": 62, - "value": 0, - "raw": "0" + "raw": "0", + "start": 61, + "type": "Literal", + "type": "Literal", + "value": 0 } - ] - } + ], + "end": 63, + "start": 46, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 37, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 63, + "kind": "const", + "start": 31, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 63, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__l.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__l.snap index 025500972..6781f3e4d 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__l.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__l.snap @@ -3,147 +3,147 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 63, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 26, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 26, "id": { - "type": "Identifier", - "start": 6, "end": 9, - "name": "obj" + "name": "obj", + "start": 6, + "type": "Identifier" }, "init": { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 12, "end": 26, "properties": [ { - "type": "ObjectProperty", - "start": 14, "end": 18, "key": { - "type": "Identifier", - "start": 14, "end": 15, - "name": "a" + "name": "a", + "start": 14, + "type": "Identifier" }, + "start": 14, + "type": "ObjectProperty", "value": { - "type": "Literal", - "type": "Literal", - "start": 17, "end": 18, - "value": 1, - "raw": "1" + "raw": "1", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 1 } }, { - "type": "ObjectProperty", - "start": 20, "end": 24, "key": { - "type": "Identifier", - "start": 20, "end": 21, - "name": "b" + "name": "b", + "start": 20, + "type": "Identifier" }, + "start": 20, + "type": "ObjectProperty", "value": { - "type": "Literal", - "type": "Literal", - "start": 23, "end": 24, - "value": 2, - "raw": "2" + "raw": "2", + "start": 23, + "type": "Literal", + "type": "Literal", + "value": 2 } } - ] - } + ], + "start": 12, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 26, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" }, { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 31, - "end": 63, "declarations": [ { - "type": "VariableDeclarator", - "start": 37, "end": 63, "id": { - "type": "Identifier", - "start": 37, "end": 43, - "name": "height" + "name": "height", + "start": 37, + "type": "Identifier" }, "init": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 46, - "end": 63, "elements": [ { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 47, "end": 59, - "operator": "-", "left": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 47, + "computed": false, "end": 55, "object": { - "type": "Identifier", - "type": "Identifier", - "start": 47, "end": 50, - "name": "obj" + "name": "obj", + "start": 47, + "type": "Identifier", + "type": "Identifier" }, "property": { - "type": "Literal", - "type": "Literal", - "start": 51, "end": 54, - "value": "a", - "raw": "\"a\"" + "raw": "\"a\"", + "start": 51, + "type": "Literal", + "type": "Literal", + "value": "a" }, - "computed": false + "start": 47, + "type": "MemberExpression", + "type": "MemberExpression" }, + "operator": "-", "right": { - "type": "Literal", - "type": "Literal", - "start": 58, "end": 59, - "value": 1, - "raw": "1" - } + "raw": "1", + "start": 58, + "type": "Literal", + "type": "Literal", + "value": 1 + }, + "start": 47, + "type": "BinaryExpression", + "type": "BinaryExpression" }, { - "type": "Literal", - "type": "Literal", - "start": 61, "end": 62, - "value": 0, - "raw": "0" + "raw": "0", + "start": 61, + "type": "Literal", + "type": "Literal", + "value": 0 } - ] - } + ], + "end": 63, + "start": 46, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 37, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 63, + "kind": "const", + "start": 31, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 63, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__m.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__m.snap index ae0c54f37..df9258851 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__m.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__m.snap @@ -3,147 +3,147 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 62, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 26, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 26, "id": { - "type": "Identifier", - "start": 6, "end": 9, - "name": "obj" + "name": "obj", + "start": 6, + "type": "Identifier" }, "init": { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 12, "end": 26, "properties": [ { - "type": "ObjectProperty", - "start": 14, "end": 18, "key": { - "type": "Identifier", - "start": 14, "end": 15, - "name": "a" + "name": "a", + "start": 14, + "type": "Identifier" }, + "start": 14, + "type": "ObjectProperty", "value": { - "type": "Literal", - "type": "Literal", - "start": 17, "end": 18, - "value": 1, - "raw": "1" + "raw": "1", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 1 } }, { - "type": "ObjectProperty", - "start": 20, "end": 24, "key": { - "type": "Identifier", - "start": 20, "end": 21, - "name": "b" + "name": "b", + "start": 20, + "type": "Identifier" }, + "start": 20, + "type": "ObjectProperty", "value": { - "type": "Literal", - "type": "Literal", - "start": 23, "end": 24, - "value": 2, - "raw": "2" + "raw": "2", + "start": 23, + "type": "Literal", + "type": "Literal", + "value": 2 } } - ] - } + ], + "start": 12, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 26, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" }, { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 31, - "end": 62, "declarations": [ { - "type": "VariableDeclarator", - "start": 37, "end": 62, "id": { - "type": "Identifier", - "start": 37, "end": 43, - "name": "height" + "name": "height", + "start": 37, + "type": "Identifier" }, "init": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 46, - "end": 62, "elements": [ { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 47, "end": 58, - "operator": "-", "left": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 47, + "computed": false, "end": 55, "object": { - "type": "Identifier", - "type": "Identifier", - "start": 47, "end": 50, - "name": "obj" + "name": "obj", + "start": 47, + "type": "Identifier", + "type": "Identifier" }, "property": { - "type": "Literal", - "type": "Literal", - "start": 51, "end": 54, - "value": "a", - "raw": "\"a\"" + "raw": "\"a\"", + "start": 51, + "type": "Literal", + "type": "Literal", + "value": "a" }, - "computed": false + "start": 47, + "type": "MemberExpression", + "type": "MemberExpression" }, + "operator": "-", "right": { - "type": "Literal", - "type": "Literal", - "start": 57, "end": 58, - "value": 1, - "raw": "1" - } + "raw": "1", + "start": 57, + "type": "Literal", + "type": "Literal", + "value": 1 + }, + "start": 47, + "type": "BinaryExpression", + "type": "BinaryExpression" }, { - "type": "Literal", - "type": "Literal", - "start": 60, "end": 61, - "value": 0, - "raw": "0" + "raw": "0", + "start": 60, + "type": "Literal", + "type": "Literal", + "value": 0 } - ] - } + ], + "end": 62, + "start": 46, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 37, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 62, + "kind": "const", + "start": 31, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 62, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__n.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__n.snap index 950ea3821..2e194c1f8 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__n.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__n.snap @@ -3,64 +3,64 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 24, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 24, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 24, "id": { - "type": "Identifier", - "start": 6, "end": 12, - "name": "height" + "name": "height", + "start": 6, + "type": "Identifier" }, "init": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 15, "end": 24, - "operator": "-", "left": { - "type": "Literal", - "type": "Literal", - "start": 15, "end": 16, - "value": 1, - "raw": "1" + "raw": "1", + "start": 15, + "type": "Literal", + "type": "Literal", + "value": 1 }, + "operator": "-", "right": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 19, + "computed": false, "end": 24, "object": { - "type": "Identifier", - "type": "Identifier", - "start": 19, "end": 22, - "name": "obj" + "name": "obj", + "start": 19, + "type": "Identifier", + "type": "Identifier" }, "property": { - "type": "Identifier", - "type": "Identifier", - "start": 23, "end": 24, - "name": "a" + "name": "a", + "start": 23, + "type": "Identifier", + "type": "Identifier" }, - "computed": false - } - } + "start": 19, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 15, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 24, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 24, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__o.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__o.snap index 6f8d4ecd2..47c66b9cc 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__o.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__o.snap @@ -3,66 +3,66 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 21, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 21, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 21, "id": { - "type": "Identifier", - "start": 6, "end": 9, - "name": "six" + "name": "six", + "start": 6, + "type": "Identifier" }, "init": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 12, "end": 21, - "operator": "+", "left": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 12, "end": 17, - "operator": "+", "left": { - "type": "Literal", - "type": "Literal", - "start": 12, "end": 13, - "value": 1, - "raw": "1" + "raw": "1", + "start": 12, + "type": "Literal", + "type": "Literal", + "value": 1 }, + "operator": "+", "right": { - "type": "Literal", - "type": "Literal", - "start": 16, "end": 17, - "value": 2, - "raw": "2" - } + "raw": "2", + "start": 16, + "type": "Literal", + "type": "Literal", + "value": 2 + }, + "start": 12, + "type": "BinaryExpression", + "type": "BinaryExpression" }, + "operator": "+", "right": { - "type": "Literal", - "type": "Literal", - "start": 20, "end": 21, - "value": 3, - "raw": "3" - } - } + "raw": "3", + "start": 20, + "type": "Literal", + "type": "Literal", + "value": 3 + }, + "start": 12, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 21, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 21, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__p.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__p.snap index fe39368e2..6802bdc53 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__p.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__p.snap @@ -3,66 +3,66 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 22, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 22, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 22, "id": { - "type": "Identifier", - "start": 6, "end": 10, - "name": "five" + "name": "five", + "start": 6, + "type": "Identifier" }, "init": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 13, "end": 22, - "operator": "+", "left": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 13, "end": 18, - "operator": "*", "left": { - "type": "Literal", - "type": "Literal", - "start": 13, "end": 14, - "value": 3, - "raw": "3" + "raw": "3", + "start": 13, + "type": "Literal", + "type": "Literal", + "value": 3 }, + "operator": "*", "right": { - "type": "Literal", - "type": "Literal", - "start": 17, "end": 18, - "value": 1, - "raw": "1" - } + "raw": "1", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 1 + }, + "start": 13, + "type": "BinaryExpression", + "type": "BinaryExpression" }, + "operator": "+", "right": { - "type": "Literal", - "type": "Literal", - "start": 21, "end": 22, - "value": 2, - "raw": "2" - } - } + "raw": "2", + "start": 21, + "type": "Literal", + "type": "Literal", + "value": 2 + }, + "start": 13, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 22, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 22, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__q.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__q.snap index 988bd42e8..1951dcf4d 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__q.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__q.snap @@ -3,66 +3,66 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 30, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 30, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 30, "id": { - "type": "Identifier", - "start": 6, "end": 12, - "name": "height" + "name": "height", + "start": 6, + "type": "Identifier" }, "init": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 15, - "end": 30, "elements": [ { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 17, + "computed": false, "end": 25, "object": { - "type": "Identifier", - "type": "Identifier", - "start": 17, "end": 20, - "name": "obj" + "name": "obj", + "start": 17, + "type": "Identifier", + "type": "Identifier" }, "property": { - "type": "Literal", - "type": "Literal", - "start": 21, "end": 24, - "value": "a", - "raw": "\"a\"" + "raw": "\"a\"", + "start": 21, + "type": "Literal", + "type": "Literal", + "value": "a" }, - "computed": false + "start": 17, + "type": "MemberExpression", + "type": "MemberExpression" }, { - "type": "Literal", - "type": "Literal", - "start": 27, "end": 28, - "value": 0, - "raw": "0" + "raw": "0", + "start": 27, + "type": "Literal", + "type": "Literal", + "value": 0 } - ] - } + ], + "end": 30, + "start": 15, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 30, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 30, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__r.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__r.snap index dcd81fc02..c6ab62448 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__r.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__r.snap @@ -3,116 +3,116 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 54, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 26, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 26, "id": { - "type": "Identifier", - "start": 6, "end": 9, - "name": "obj" + "name": "obj", + "start": 6, + "type": "Identifier" }, "init": { - "type": "ObjectExpression", - "type": "ObjectExpression", - "start": 12, "end": 26, "properties": [ { - "type": "ObjectProperty", - "start": 14, "end": 18, "key": { - "type": "Identifier", - "start": 14, "end": 15, - "name": "a" + "name": "a", + "start": 14, + "type": "Identifier" }, + "start": 14, + "type": "ObjectProperty", "value": { - "type": "Literal", - "type": "Literal", - "start": 17, "end": 18, - "value": 1, - "raw": "1" + "raw": "1", + "start": 17, + "type": "Literal", + "type": "Literal", + "value": 1 } }, { - "type": "ObjectProperty", - "start": 20, "end": 24, "key": { - "type": "Identifier", - "start": 20, "end": 21, - "name": "b" + "name": "b", + "start": 20, + "type": "Identifier" }, + "start": 20, + "type": "ObjectProperty", "value": { - "type": "Literal", - "type": "Literal", - "start": 23, "end": 24, - "value": 2, - "raw": "2" + "raw": "2", + "start": 23, + "type": "Literal", + "type": "Literal", + "value": 2 } } - ] - } + ], + "start": 12, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 26, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" }, { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 31, - "end": 54, "declarations": [ { - "type": "VariableDeclarator", - "start": 37, "end": 54, "id": { - "type": "Identifier", - "start": 37, "end": 43, - "name": "height" + "name": "height", + "start": 37, + "type": "Identifier" }, "init": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 46, + "computed": false, "end": 54, "object": { - "type": "Identifier", - "type": "Identifier", - "start": 46, "end": 49, - "name": "obj" + "name": "obj", + "start": 46, + "type": "Identifier", + "type": "Identifier" }, "property": { - "type": "Literal", - "type": "Literal", - "start": 50, "end": 53, - "value": "a", - "raw": "\"a\"" + "raw": "\"a\"", + "start": 50, + "type": "Literal", + "type": "Literal", + "value": "a" }, - "computed": false - } + "start": 46, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 37, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 54, + "kind": "const", + "start": 31, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 54, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__s.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__s.snap index b1fcf4172..935901238 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__s.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__s.snap @@ -3,64 +3,64 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 27, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 27, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 27, "id": { - "type": "Identifier", - "start": 6, "end": 10, - "name": "prop" + "name": "prop", + "start": 6, + "type": "Identifier" }, "init": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 13, + "computed": true, "end": 27, "object": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 13, + "computed": false, "end": 22, "object": { - "type": "Identifier", - "type": "Identifier", - "start": 13, "end": 15, - "name": "yo" + "name": "yo", + "start": 13, + "type": "Identifier", + "type": "Identifier" }, "property": { - "type": "Literal", - "type": "Literal", - "start": 16, "end": 21, - "value": "one", - "raw": "\"one\"" + "raw": "\"one\"", + "start": 16, + "type": "Literal", + "type": "Literal", + "value": "one" }, - "computed": false + "start": 13, + "type": "MemberExpression", + "type": "MemberExpression" }, "property": { - "type": "Identifier", - "type": "Identifier", - "start": 23, "end": 26, - "name": "two" + "name": "two", + "start": 23, + "type": "Identifier", + "type": "Identifier" }, - "computed": true - } + "start": 13, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 27, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 27, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__t.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__t.snap index 5ca0946c4..a45fae8a8 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__t.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__t.snap @@ -3,49 +3,49 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 17, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 17, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 17, "id": { - "type": "Identifier", - "start": 6, "end": 9, - "name": "pt1" + "name": "pt1", + "start": 6, + "type": "Identifier" }, "init": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 12, + "computed": true, "end": 17, "object": { - "type": "Identifier", - "type": "Identifier", - "start": 12, "end": 14, - "name": "b1" + "name": "b1", + "start": 12, + "type": "Identifier", + "type": "Identifier" }, "property": { - "type": "Identifier", - "type": "Identifier", - "start": 15, "end": 16, - "name": "x" + "name": "x", + "start": 15, + "type": "Identifier", + "type": "Identifier" }, - "computed": true - } + "start": 12, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 17, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 17, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__u.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__u.snap index 298647b2c..7ace17471 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__u.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__u.snap @@ -3,91 +3,91 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 34, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 34, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 34, "id": { - "type": "Identifier", - "start": 6, "end": 10, - "name": "prop" + "name": "prop", + "start": 6, + "type": "Identifier" }, "init": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 13, + "computed": false, "end": 34, "object": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 13, + "computed": false, "end": 29, "object": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 13, + "computed": false, "end": 23, "object": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 13, + "computed": false, "end": 19, "object": { - "type": "Identifier", - "type": "Identifier", - "start": 13, "end": 15, - "name": "yo" + "name": "yo", + "start": 13, + "type": "Identifier", + "type": "Identifier" }, "property": { - "type": "Identifier", - "type": "Identifier", - "start": 16, "end": 19, - "name": "one" + "name": "one", + "start": 16, + "type": "Identifier", + "type": "Identifier" }, - "computed": false + "start": 13, + "type": "MemberExpression", + "type": "MemberExpression" }, "property": { - "type": "Identifier", - "type": "Identifier", - "start": 20, "end": 23, - "name": "two" + "name": "two", + "start": 20, + "type": "Identifier", + "type": "Identifier" }, - "computed": false + "start": 13, + "type": "MemberExpression", + "type": "MemberExpression" }, "property": { - "type": "Identifier", - "type": "Identifier", - "start": 24, "end": 29, - "name": "three" + "name": "three", + "start": 24, + "type": "Identifier", + "type": "Identifier" }, - "computed": false + "start": 13, + "type": "MemberExpression", + "type": "MemberExpression" }, "property": { - "type": "Identifier", - "type": "Identifier", - "start": 30, "end": 34, - "name": "four" + "name": "four", + "start": 30, + "type": "Identifier", + "type": "Identifier" }, - "computed": false - } + "start": 13, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 34, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 34, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__v.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__v.snap index 8fe980817..d654143f3 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__v.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__v.snap @@ -3,50 +3,50 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 17, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 17, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 17, "id": { - "type": "Identifier", - "start": 6, "end": 9, - "name": "pt1" + "name": "pt1", + "start": 6, + "type": "Identifier" }, "init": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 12, + "computed": false, "end": 17, "object": { - "type": "Identifier", - "type": "Identifier", - "start": 12, "end": 14, - "name": "b1" + "name": "b1", + "start": 12, + "type": "Identifier", + "type": "Identifier" }, "property": { - "type": "Literal", - "type": "Literal", - "start": 15, "end": 16, - "value": 0, - "raw": "0" + "raw": "0", + "start": 15, + "type": "Literal", + "type": "Literal", + "value": 0 }, - "computed": false - } + "start": 12, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 17, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 17, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__w.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__w.snap index 4a14cc34a..5e3e22268 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__w.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__w.snap @@ -3,50 +3,50 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 22, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 22, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 22, "id": { - "type": "Identifier", - "start": 6, "end": 9, - "name": "pt1" + "name": "pt1", + "start": 6, + "type": "Identifier" }, "init": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 12, + "computed": false, "end": 22, "object": { - "type": "Identifier", - "type": "Identifier", - "start": 12, "end": 14, - "name": "b1" + "name": "b1", + "start": 12, + "type": "Identifier", + "type": "Identifier" }, "property": { - "type": "Literal", - "type": "Literal", - "start": 15, "end": 21, - "value": "zero", - "raw": "'zero'" + "raw": "'zero'", + "start": 15, + "type": "Literal", + "type": "Literal", + "value": "zero" }, - "computed": false - } + "start": 12, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 22, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 22, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__x.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__x.snap index dfa0afcc5..12f97d688 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__x.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__x.snap @@ -3,49 +3,49 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 19, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 19, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 19, "id": { - "type": "Identifier", - "start": 6, "end": 9, - "name": "pt1" + "name": "pt1", + "start": 6, + "type": "Identifier" }, "init": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 12, + "computed": false, "end": 19, "object": { - "type": "Identifier", - "type": "Identifier", - "start": 12, "end": 14, - "name": "b1" + "name": "b1", + "start": 12, + "type": "Identifier", + "type": "Identifier" }, "property": { - "type": "Identifier", - "type": "Identifier", - "start": 15, "end": 19, - "name": "zero" + "name": "zero", + "start": 15, + "type": "Identifier", + "type": "Identifier" }, - "computed": false - } + "start": 12, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 19, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 19, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__y.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__y.snap index 8d7b37232..d9e1e0f3a 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__y.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__y.snap @@ -3,50 +3,50 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 29, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 29, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 29, "id": { - "type": "Identifier", - "start": 6, "end": 8, - "name": "sg" + "name": "sg", + "start": 6, + "type": "Identifier" }, "init": { - "type": "CallExpression", - "type": "CallExpression", - "start": 11, - "end": 29, - "callee": { - "type": "Identifier", - "start": 11, - "end": 24, - "name": "startSketchAt" - }, "arguments": [ { - "type": "Identifier", - "type": "Identifier", - "start": 25, "end": 28, - "name": "pos" + "name": "pos", + "start": 25, + "type": "Identifier", + "type": "Identifier" } ], - "optional": false - } + "callee": { + "end": 24, + "name": "startSketchAt", + "start": 11, + "type": "Identifier" + }, + "end": 29, + "optional": false, + "start": 11, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 29, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 29, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__z.snap b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__z.snap index 1e0f9e490..f13e29ef2 100644 --- a/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__z.snap +++ b/src/wasm-lib/kcl/src/parser/snapshots/kcl_lib__parser__parser_impl__snapshot_tests__z.snap @@ -3,109 +3,109 @@ source: kcl/src/parser/parser_impl.rs expression: actual --- { - "start": 0, - "end": 53, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 53, "declarations": [ { - "type": "VariableDeclarator", - "start": 6, "end": 53, "id": { - "type": "Identifier", - "start": 6, "end": 8, - "name": "sg" + "name": "sg", + "start": 6, + "type": "Identifier" }, "init": { - "type": "PipeExpression", - "type": "PipeExpression", - "start": 11, - "end": 53, "body": [ { - "type": "CallExpression", - "type": "CallExpression", - "start": 11, - "end": 29, - "callee": { - "type": "Identifier", - "start": 11, - "end": 24, - "name": "startSketchAt" - }, "arguments": [ { - "type": "Identifier", - "type": "Identifier", - "start": 25, "end": 28, - "name": "pos" + "name": "pos", + "start": 25, + "type": "Identifier", + "type": "Identifier" } ], - "optional": false + "callee": { + "end": 24, + "name": "startSketchAt", + "start": 11, + "type": "Identifier" + }, + "end": 29, + "optional": false, + "start": 11, + "type": "CallExpression", + "type": "CallExpression" }, { - "type": "CallExpression", - "type": "CallExpression", - "start": 33, - "end": 53, - "callee": { - "type": "Identifier", - "start": 33, - "end": 37, - "name": "line" - }, "arguments": [ { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 38, - "end": 49, "elements": [ { - "type": "Literal", - "type": "Literal", - "start": 39, "end": 40, - "value": 0, - "raw": "0" + "raw": "0", + "start": 39, + "type": "Literal", + "type": "Literal", + "value": 0 }, { - "type": "UnaryExpression", - "type": "UnaryExpression", - "start": 42, + "argument": { + "end": 48, + "name": "scale", + "start": 43, + "type": "Identifier", + "type": "Identifier" + }, "end": 48, "operator": "-", - "argument": { - "type": "Identifier", - "type": "Identifier", - "start": 43, - "end": 48, - "name": "scale" - } + "start": 42, + "type": "UnaryExpression", + "type": "UnaryExpression" } - ] + ], + "end": 49, + "start": 38, + "type": "ArrayExpression", + "type": "ArrayExpression" }, { - "type": "PipeSubstitution", - "type": "PipeSubstitution", + "end": 52, "start": 51, - "end": 52 + "type": "PipeSubstitution", + "type": "PipeSubstitution" } ], - "optional": false + "callee": { + "end": 37, + "name": "line", + "start": 33, + "type": "Identifier" + }, + "end": 53, + "optional": false, + "start": 33, + "type": "CallExpression", + "type": "CallExpression" } - ] - } + ], + "end": 53, + "start": 11, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 6, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 53, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } - ] + ], + "end": 53, + "start": 0 } diff --git a/src/wasm-lib/kcl/src/simulation_tests.rs b/src/wasm-lib/kcl/src/simulation_tests.rs index bcbcdf7cf..9a4116937 100644 --- a/src/wasm-lib/kcl/src/simulation_tests.rs +++ b/src/wasm-lib/kcl/src/simulation_tests.rs @@ -1,4 +1,9 @@ -use crate::{ast::types::Program, errors::KclError, parser::Parser, token::Token}; +use crate::{ + ast::types::{Node, Program}, + errors::KclError, + parser::Parser, + token::Token, +}; /// Deserialize the data from a snapshot. fn get(snapshot: &str) -> T { @@ -79,7 +84,7 @@ fn unparse(test_name: &str) { async fn execute(test_name: &str) { // Read the AST from disk. let input = read("ast.snap", test_name); - let ast_res: Result = get(&input); + let ast_res: Result, KclError> = get(&input); let Ok(ast) = ast_res else { return; }; diff --git a/src/wasm-lib/kcl/src/std/args.rs b/src/wasm-lib/kcl/src/std/args.rs index 95bf3a78a..b3ef1c442 100644 --- a/src/wasm-lib/kcl/src/std/args.rs +++ b/src/wasm-lib/kcl/src/std/args.rs @@ -7,7 +7,7 @@ use serde::de::DeserializeOwned; use serde_json::Value as JValue; use crate::{ - ast::types::{execute::parse_json_number_as_f64, TagDeclarator}, + ast::types::{execute::parse_json_number_as_f64, TagNode}, errors::{KclError, KclErrorDetails}, executor::{ ExecState, ExecutorContext, ExtrudeSurface, KclValue, Metadata, Sketch, SketchSet, SketchSurface, Solid, @@ -260,7 +260,7 @@ impl Args { ( crate::std::shapes::CircleData, crate::std::shapes::SketchOrSurface, - Option, + Option, ), KclError, > { @@ -286,7 +286,7 @@ impl Args { FromArgs::from_args(self, 0) } - pub(crate) fn get_sketch_and_optional_tag(&self) -> Result<(Sketch, Option), KclError> { + pub(crate) fn get_sketch_and_optional_tag(&self) -> Result<(Sketch, Option), KclError> { FromArgs::from_args(self, 0) } @@ -318,16 +318,14 @@ impl Args { FromArgs::from_args(self, 0) } - pub(crate) fn get_data_and_sketch_and_tag<'a, T>(&'a self) -> Result<(T, Sketch, Option), KclError> + pub(crate) fn get_data_and_sketch_and_tag<'a, T>(&'a self) -> Result<(T, Sketch, Option), KclError> where T: serde::de::DeserializeOwned + FromKclValue<'a> + Sized, { FromArgs::from_args(self, 0) } - pub(crate) fn get_data_and_sketch_surface<'a, T>( - &'a self, - ) -> Result<(T, SketchSurface, Option), KclError> + pub(crate) fn get_data_and_sketch_surface<'a, T>(&'a self) -> Result<(T, SketchSurface, Option), KclError> where T: serde::de::DeserializeOwned + FromKclValue<'a> + Sized, { @@ -348,9 +346,7 @@ impl Args { FromArgs::from_args(self, 0) } - pub(crate) fn get_data_and_solid_and_tag<'a, T>( - &'a self, - ) -> Result<(T, Box, Option), KclError> + pub(crate) fn get_data_and_solid_and_tag<'a, T>(&'a self) -> Result<(T, Box, Option), KclError> where T: serde::de::DeserializeOwned + FromKclValue<'a> + Sized, { @@ -466,7 +462,7 @@ impl Args { ( crate::std::shapes::PolygonData, crate::std::shapes::SketchOrSurface, - Option, + Option, ), KclError, > { @@ -603,7 +599,7 @@ impl<'a> FromKclValue<'a> for Vec { } } -impl<'a> FromKclValue<'a> for TagDeclarator { +impl<'a> FromKclValue<'a> for TagNode { fn from_mem_item(arg: &'a KclValue) -> Option { arg.get_tag_declarator().ok() } diff --git a/src/wasm-lib/kcl/src/std/chamfer.rs b/src/wasm-lib/kcl/src/std/chamfer.rs index e3deb4250..e3b9cfcc4 100644 --- a/src/wasm-lib/kcl/src/std/chamfer.rs +++ b/src/wasm-lib/kcl/src/std/chamfer.rs @@ -8,7 +8,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use crate::{ - ast::types::TagDeclarator, + ast::types::TagNode, errors::{KclError, KclErrorDetails}, executor::{ChamferSurface, EdgeCut, ExecState, ExtrudeSurface, GeoMeta, KclValue, Solid}, std::{fillet::EdgeReference, Args}, @@ -29,7 +29,7 @@ pub struct ChamferData { /// Create chamfers on tagged paths. pub async fn chamfer(exec_state: &mut ExecState, args: Args) -> Result { - let (data, solid, tag): (ChamferData, Box, Option) = args.get_data_and_solid_and_tag()?; + let (data, solid, tag): (ChamferData, Box, Option) = args.get_data_and_solid_and_tag()?; let solid = inner_chamfer(data, solid, tag, exec_state, args).await?; Ok(KclValue::Solid(solid)) @@ -102,7 +102,7 @@ pub async fn chamfer(exec_state: &mut ExecState, args: Args) -> Result, - tag: Option, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result, KclError> { diff --git a/src/wasm-lib/kcl/src/std/fillet.rs b/src/wasm-lib/kcl/src/std/fillet.rs index 8e0f0fdc9..758bcbad4 100644 --- a/src/wasm-lib/kcl/src/std/fillet.rs +++ b/src/wasm-lib/kcl/src/std/fillet.rs @@ -12,7 +12,7 @@ use serde::{Deserialize, Serialize}; use uuid::Uuid; use crate::{ - ast::types::TagDeclarator, + ast::types::TagNode, errors::{KclError, KclErrorDetails}, executor::{EdgeCut, ExecState, ExtrudeSurface, FilletSurface, GeoMeta, KclValue, Solid, TagIdentifier, UserVal}, settings::types::UnitLength, @@ -55,7 +55,7 @@ impl EdgeReference { /// Create fillets on tagged paths. pub async fn fillet(exec_state: &mut ExecState, args: Args) -> Result { - let (data, solid, tag): (FilletData, Box, Option) = args.get_data_and_solid_and_tag()?; + let (data, solid, tag): (FilletData, Box, Option) = args.get_data_and_solid_and_tag()?; let solid = inner_fillet(data, solid, tag, exec_state, args).await?; Ok(KclValue::Solid(solid)) @@ -123,7 +123,7 @@ pub async fn fillet(exec_state: &mut ExecState, args: Args) -> Result, - tag: Option, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result, KclError> { diff --git a/src/wasm-lib/kcl/src/std/kcl_stdlib.rs b/src/wasm-lib/kcl/src/std/kcl_stdlib.rs index 13146bd57..e724a4697 100644 --- a/src/wasm-lib/kcl/src/std/kcl_stdlib.rs +++ b/src/wasm-lib/kcl/src/std/kcl_stdlib.rs @@ -4,7 +4,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use crate::{ - ast::types::{BodyItem, Expr, FunctionExpression, Program}, + ast::types::{BodyItem, Expr, FunctionExpression, Node, Program}, docs::{StdLibFn, StdLibFnData}, token::lexer, }; @@ -82,7 +82,7 @@ impl Serialize for Box { /// Parse a KCL program. Expect it to have a single body item, which is a function. /// Return the program and its single function. /// Return None if those expectations aren't met. -pub fn extract_function(source: &str) -> Option<(Program, Box)> { +pub fn extract_function(source: &str) -> Option<(Node, crate::ast::types::BoxNode)> { let tokens = lexer(source).unwrap(); let src = crate::parser::Parser::new(tokens).ast().ok()?; assert_eq!(src.body.len(), 1); diff --git a/src/wasm-lib/kcl/src/std/mod.rs b/src/wasm-lib/kcl/src/std/mod.rs index d8e52ff68..ba69aef88 100644 --- a/src/wasm-lib/kcl/src/std/mod.rs +++ b/src/wasm-lib/kcl/src/std/mod.rs @@ -314,6 +314,6 @@ pub enum Primitive { /// A closure used as an argument to a stdlib function. pub struct FnAsArg<'a> { pub func: Option<&'a crate::executor::MemoryFunction>, - pub expr: Box, + pub expr: crate::ast::types::BoxNode, pub memory: Box, } diff --git a/src/wasm-lib/kcl/src/std/shapes.rs b/src/wasm-lib/kcl/src/std/shapes.rs index 4a1d11822..43a28df69 100644 --- a/src/wasm-lib/kcl/src/std/shapes.rs +++ b/src/wasm-lib/kcl/src/std/shapes.rs @@ -14,7 +14,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use crate::{ - ast::types::TagDeclarator, + ast::types::TagNode, errors::{KclError, KclErrorDetails}, executor::{BasePath, ExecState, GeoMeta, KclValue, Path, Sketch, SketchSurface}, std::Args, @@ -44,7 +44,7 @@ pub struct CircleData { /// Sketch a circle. pub async fn circle(exec_state: &mut ExecState, args: Args) -> Result { - let (data, sketch_surface_or_group, tag): (CircleData, SketchOrSurface, Option) = + let (data, sketch_surface_or_group, tag): (CircleData, SketchOrSurface, Option) = args.get_circle_args()?; let sketch = inner_circle(data, sketch_surface_or_group, tag, exec_state, args).await?; @@ -78,7 +78,7 @@ pub async fn circle(exec_state: &mut ExecState, args: Args) -> Result, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -178,7 +178,7 @@ fn default_inscribed() -> bool { /// Create a regular polygon with the specified number of sides and radius. pub async fn polygon(exec_state: &mut ExecState, args: Args) -> Result { - let (data, sketch_surface_or_group, tag): (PolygonData, SketchOrSurface, Option) = + let (data, sketch_surface_or_group, tag): (PolygonData, SketchOrSurface, Option) = args.get_polygon_args()?; let sketch = inner_polygon(data, sketch_surface_or_group, tag, exec_state, args).await?; @@ -217,7 +217,7 @@ pub async fn polygon(exec_state: &mut ExecState, args: Args) -> Result, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { diff --git a/src/wasm-lib/kcl/src/std/sketch.rs b/src/wasm-lib/kcl/src/std/sketch.rs index 8deb9cb2d..cd30f09da 100644 --- a/src/wasm-lib/kcl/src/std/sketch.rs +++ b/src/wasm-lib/kcl/src/std/sketch.rs @@ -12,8 +12,8 @@ use parse_display::{Display, FromStr}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; +use crate::ast::types::TagNode; use crate::{ - ast::types::TagDeclarator, errors::{KclError, KclErrorDetails}, executor::{ BasePath, ExecState, Face, GeoMeta, KclValue, Path, Plane, Point2d, Point3d, Sketch, SketchSet, SketchSurface, @@ -94,7 +94,7 @@ pub enum StartOrEnd { /// Draw a line to a point. pub async fn line_to(exec_state: &mut ExecState, args: Args) -> Result { - let (to, sketch, tag): ([f64; 2], Sketch, Option) = args.get_data_and_sketch_and_tag()?; + let (to, sketch, tag): ([f64; 2], Sketch, Option) = args.get_data_and_sketch_and_tag()?; let new_sketch = inner_line_to(to, sketch, tag, exec_state, args).await?; Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) @@ -118,7 +118,7 @@ pub async fn line_to(exec_state: &mut ExecState, args: Args) -> Result, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -161,7 +161,7 @@ async fn inner_line_to( /// Draw a line to a point on the x-axis. pub async fn x_line_to(exec_state: &mut ExecState, args: Args) -> Result { - let (to, sketch, tag): (f64, Sketch, Option) = args.get_data_and_sketch_and_tag()?; + let (to, sketch, tag): (f64, Sketch, Option) = args.get_data_and_sketch_and_tag()?; let new_sketch = inner_x_line_to(to, sketch, tag, exec_state, args).await?; Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) @@ -196,7 +196,7 @@ pub async fn x_line_to(exec_state: &mut ExecState, args: Args) -> Result, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -209,7 +209,7 @@ async fn inner_x_line_to( /// Draw a line to a point on the y-axis. pub async fn y_line_to(exec_state: &mut ExecState, args: Args) -> Result { - let (to, sketch, tag): (f64, Sketch, Option) = args.get_data_and_sketch_and_tag()?; + let (to, sketch, tag): (f64, Sketch, Option) = args.get_data_and_sketch_and_tag()?; let new_sketch = inner_y_line_to(to, sketch, tag, exec_state, args).await?; Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) @@ -237,7 +237,7 @@ pub async fn y_line_to(exec_state: &mut ExecState, args: Args) -> Result, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -249,7 +249,7 @@ async fn inner_y_line_to( /// Draw a line. pub async fn line(exec_state: &mut ExecState, args: Args) -> Result { - let (delta, sketch, tag): ([f64; 2], Sketch, Option) = args.get_data_and_sketch_and_tag()?; + let (delta, sketch, tag): ([f64; 2], Sketch, Option) = args.get_data_and_sketch_and_tag()?; let new_sketch = inner_line(delta, sketch, tag, exec_state, args).await?; Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) @@ -285,7 +285,7 @@ pub async fn line(exec_state: &mut ExecState, args: Args) -> Result, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -330,7 +330,7 @@ async fn inner_line( /// Draw a line on the x-axis. pub async fn x_line(exec_state: &mut ExecState, args: Args) -> Result { - let (length, sketch, tag): (f64, Sketch, Option) = args.get_data_and_sketch_and_tag()?; + let (length, sketch, tag): (f64, Sketch, Option) = args.get_data_and_sketch_and_tag()?; let new_sketch = inner_x_line(length, sketch, tag, exec_state, args).await?; Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) @@ -364,7 +364,7 @@ pub async fn x_line(exec_state: &mut ExecState, args: Args) -> Result, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -373,7 +373,7 @@ async fn inner_x_line( /// Draw a line on the y-axis. pub async fn y_line(exec_state: &mut ExecState, args: Args) -> Result { - let (length, sketch, tag): (f64, Sketch, Option) = args.get_data_and_sketch_and_tag()?; + let (length, sketch, tag): (f64, Sketch, Option) = args.get_data_and_sketch_and_tag()?; let new_sketch = inner_y_line(length, sketch, tag, exec_state, args).await?; Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) @@ -402,7 +402,7 @@ pub async fn y_line(exec_state: &mut ExecState, args: Args) -> Result, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -427,7 +427,7 @@ pub enum AngledLineData { /// Draw an angled line. pub async fn angled_line(exec_state: &mut ExecState, args: Args) -> Result { - let (data, sketch, tag): (AngledLineData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; + let (data, sketch, tag): (AngledLineData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; let new_sketch = inner_angled_line(data, sketch, tag, exec_state, args).await?; Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) @@ -456,7 +456,7 @@ pub async fn angled_line(exec_state: &mut ExecState, args: Args) -> Result, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -512,7 +512,7 @@ async fn inner_angled_line( /// Draw an angled line of a given x length. pub async fn angled_line_of_x_length(exec_state: &mut ExecState, args: Args) -> Result { - let (data, sketch, tag): (AngledLineData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; + let (data, sketch, tag): (AngledLineData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; let new_sketch = inner_angled_line_of_x_length(data, sketch, tag, exec_state, args).await?; Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) @@ -537,7 +537,7 @@ pub async fn angled_line_of_x_length(exec_state: &mut ExecState, args: Args) -> async fn inner_angled_line_of_x_length( data: AngledLineData, sketch: Sketch, - tag: Option, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -580,7 +580,7 @@ pub struct AngledLineToData { /// Draw an angled line to a given x coordinate. pub async fn angled_line_to_x(exec_state: &mut ExecState, args: Args) -> Result { - let (data, sketch, tag): (AngledLineToData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; + let (data, sketch, tag): (AngledLineToData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; let new_sketch = inner_angled_line_to_x(data, sketch, tag, exec_state, args).await?; Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) @@ -606,7 +606,7 @@ pub async fn angled_line_to_x(exec_state: &mut ExecState, args: Args) -> Result< async fn inner_angled_line_to_x( data: AngledLineToData, sketch: Sketch, - tag: Option, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -637,7 +637,7 @@ async fn inner_angled_line_to_x( /// Draw an angled line of a given y length. pub async fn angled_line_of_y_length(exec_state: &mut ExecState, args: Args) -> Result { - let (data, sketch, tag): (AngledLineData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; + let (data, sketch, tag): (AngledLineData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; let new_sketch = inner_angled_line_of_y_length(data, sketch, tag, exec_state, args).await?; @@ -665,7 +665,7 @@ pub async fn angled_line_of_y_length(exec_state: &mut ExecState, args: Args) -> async fn inner_angled_line_of_y_length( data: AngledLineData, sketch: Sketch, - tag: Option, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -697,7 +697,7 @@ async fn inner_angled_line_of_y_length( /// Draw an angled line to a given y coordinate. pub async fn angled_line_to_y(exec_state: &mut ExecState, args: Args) -> Result { - let (data, sketch, tag): (AngledLineToData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; + let (data, sketch, tag): (AngledLineToData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; let new_sketch = inner_angled_line_to_y(data, sketch, tag, exec_state, args).await?; Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) @@ -723,7 +723,7 @@ pub async fn angled_line_to_y(exec_state: &mut ExecState, args: Args) -> Result< async fn inner_angled_line_to_y( data: AngledLineToData, sketch: Sketch, - tag: Option, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -768,7 +768,7 @@ pub struct AngledLineThatIntersectsData { /// Draw an angled line that intersects with a given line. pub async fn angled_line_that_intersects(exec_state: &mut ExecState, args: Args) -> Result { - let (data, sketch, tag): (AngledLineThatIntersectsData, Sketch, Option) = + let (data, sketch, tag): (AngledLineThatIntersectsData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; let new_sketch = inner_angled_line_that_intersects(data, sketch, tag, exec_state, args).await?; Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) @@ -799,7 +799,7 @@ pub async fn angled_line_that_intersects(exec_state: &mut ExecState, args: Args) async fn inner_angled_line_that_intersects( data: AngledLineThatIntersectsData, sketch: Sketch, - tag: Option, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -1131,7 +1131,7 @@ async fn start_sketch_on_plane( /// Start a new profile at a given point. pub async fn start_profile_at(exec_state: &mut ExecState, args: Args) -> Result { - let (start, sketch_surface, tag): ([f64; 2], SketchSurface, Option) = + let (start, sketch_surface, tag): ([f64; 2], SketchSurface, Option) = args.get_data_and_sketch_surface()?; let sketch = inner_start_profile_at(start, sketch_surface, tag, exec_state, args).await?; @@ -1178,7 +1178,7 @@ pub async fn start_profile_at(exec_state: &mut ExecState, args: Args) -> Result< pub(crate) async fn inner_start_profile_at( to: [f64; 2], sketch_surface: SketchSurface, - tag: Option, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -1341,7 +1341,7 @@ pub(crate) fn inner_profile_start(sketch: Sketch) -> Result<[f64; 2], KclError> /// Close the current sketch. pub async fn close(exec_state: &mut ExecState, args: Args) -> Result { - let (sketch, tag): (Sketch, Option) = args.get_sketch_and_optional_tag()?; + let (sketch, tag): (Sketch, Option) = args.get_sketch_and_optional_tag()?; let new_sketch = inner_close(sketch, tag, exec_state, args).await?; @@ -1374,7 +1374,7 @@ pub async fn close(exec_state: &mut ExecState, args: Args) -> Result, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -1449,7 +1449,7 @@ pub enum ArcData { /// Draw an arc. pub async fn arc(exec_state: &mut ExecState, args: Args) -> Result { - let (data, sketch, tag): (ArcData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; + let (data, sketch, tag): (ArcData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; let new_sketch = inner_arc(data, sketch, tag, exec_state, args).await?; Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) @@ -1483,7 +1483,7 @@ pub async fn arc(exec_state: &mut ExecState, args: Args) -> Result, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -1570,7 +1570,7 @@ pub enum TangentialArcData { /// Draw a tangential arc. pub async fn tangential_arc(exec_state: &mut ExecState, args: Args) -> Result { - let (data, sketch, tag): (TangentialArcData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; + let (data, sketch, tag): (TangentialArcData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; let new_sketch = inner_tangential_arc(data, sketch, tag, exec_state, args).await?; Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) @@ -1605,7 +1605,7 @@ pub async fn tangential_arc(exec_state: &mut ExecState, args: Args) -> Result, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -1698,7 +1698,7 @@ fn tan_arc_to(sketch: &Sketch, to: &[f64; 2]) -> ModelingCmd { /// Draw a tangential arc to a specific point. pub async fn tangential_arc_to(exec_state: &mut ExecState, args: Args) -> Result { - let (to, sketch, tag): ([f64; 2], Sketch, Option) = super::args::FromArgs::from_args(&args, 0)?; + let (to, sketch, tag): ([f64; 2], Sketch, Option) = super::args::FromArgs::from_args(&args, 0)?; let new_sketch = inner_tangential_arc_to(to, sketch, tag, exec_state, args).await?; Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) @@ -1706,7 +1706,7 @@ pub async fn tangential_arc_to(exec_state: &mut ExecState, args: Args) -> Result /// Draw a tangential arc to point some distance away.. pub async fn tangential_arc_to_relative(exec_state: &mut ExecState, args: Args) -> Result { - let (delta, sketch, tag): ([f64; 2], Sketch, Option) = super::args::FromArgs::from_args(&args, 0)?; + let (delta, sketch, tag): ([f64; 2], Sketch, Option) = super::args::FromArgs::from_args(&args, 0)?; let new_sketch = inner_tangential_arc_to_relative(delta, sketch, tag, exec_state, args).await?; Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) @@ -1735,7 +1735,7 @@ pub async fn tangential_arc_to_relative(exec_state: &mut ExecState, args: Args) async fn inner_tangential_arc_to( to: [f64; 2], sketch: Sketch, - tag: Option, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -1805,7 +1805,7 @@ async fn inner_tangential_arc_to( async fn inner_tangential_arc_to_relative( delta: [f64; 2], sketch: Sketch, - tag: Option, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { @@ -1882,7 +1882,7 @@ pub struct BezierData { /// Draw a bezier curve. pub async fn bezier_curve(exec_state: &mut ExecState, args: Args) -> Result { - let (data, sketch, tag): (BezierData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; + let (data, sketch, tag): (BezierData, Sketch, Option) = args.get_data_and_sketch_and_tag()?; let new_sketch = inner_bezier_curve(data, sketch, tag, exec_state, args).await?; Ok(KclValue::new_user_val(new_sketch.meta.clone(), new_sketch)) @@ -1912,7 +1912,7 @@ pub async fn bezier_curve(exec_state: &mut ExecState, args: Args) -> Result, + tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { diff --git a/src/wasm-lib/kcl/src/test_server.rs b/src/wasm-lib/kcl/src/test_server.rs index 42415d42c..d54bc511e 100644 --- a/src/wasm-lib/kcl/src/test_server.rs +++ b/src/wasm-lib/kcl/src/test_server.rs @@ -1,7 +1,7 @@ //! Types used to send data to the test server. use crate::{ - ast::types::Program, + ast::types::{Node, Program}, executor::{new_zoo_client, ExecutorContext, ExecutorSettings, IdGenerator, ProgramMemory}, settings::types::UnitLength, }; @@ -26,7 +26,7 @@ pub async fn execute_and_snapshot(code: &str, units: UnitLength) -> anyhow::Resu /// Executes a kcl program and takes a snapshot of the result. /// This returns the bytes of the snapshot. pub async fn execute_and_snapshot_ast( - ast: Program, + ast: Node, units: UnitLength, ) -> anyhow::Result<(ProgramMemory, image::DynamicImage)> { let ctx = new_context(units, true).await?; @@ -45,7 +45,7 @@ pub async fn execute_and_snapshot_no_auth(code: &str, units: UnitLength) -> anyh async fn do_execute_and_snapshot( ctx: &ExecutorContext, - program: Program, + program: Node, ) -> anyhow::Result<(crate::executor::ExecState, image::DynamicImage)> { let (exec_state, snapshot) = ctx.execute_and_prepare(&program, IdGenerator::default(), None).await?; diff --git a/src/wasm-lib/kcl/src/unparser.rs b/src/wasm-lib/kcl/src/unparser.rs index 5bc1e7d48..4ada1b8c3 100644 --- a/src/wasm-lib/kcl/src/unparser.rs +++ b/src/wasm-lib/kcl/src/unparser.rs @@ -4,7 +4,7 @@ use crate::{ ast::types::{ ArrayExpression, ArrayRangeExpression, BinaryExpression, BinaryOperator, BinaryPart, BodyItem, CallExpression, Expr, FormatOptions, FunctionExpression, IfExpression, ImportStatement, ItemVisibility, Literal, - LiteralIdentifier, LiteralValue, MemberExpression, MemberObject, NonCodeValue, ObjectExpression, + LiteralIdentifier, LiteralValue, MemberExpression, MemberObject, Node, NonCodeValue, ObjectExpression, PipeExpression, Program, TagDeclarator, UnaryExpression, VariableDeclaration, VariableKind, }, parser::PIPE_OPERATOR, @@ -38,11 +38,11 @@ impl Program { .fold(String::new(), |mut output, (index, recast_str)| { let start_string = if index == 0 { // We need to indent. - if self.non_code_meta.start.is_empty() { + if self.non_code_meta.start_nodes.is_empty() { indentation.to_string() } else { self.non_code_meta - .start + .start_nodes .iter() .map(|start| start.format(&indentation)) .collect() @@ -511,7 +511,7 @@ impl IfExpression { } } -impl PipeExpression { +impl Node { fn recast(&self, options: &FormatOptions, indentation_level: usize) -> String { let pipe = self .body diff --git a/src/wasm-lib/kcl/src/walk/ast_node.rs b/src/wasm-lib/kcl/src/walk/ast_node.rs index 337ebf49c..4b76f2686 100644 --- a/src/wasm-lib/kcl/src/walk/ast_node.rs +++ b/src/wasm-lib/kcl/src/walk/ast_node.rs @@ -1,5 +1,5 @@ use crate::{ - ast::{types, types::ValueMeta}, + ast::types::{self, NodeRef}, executor::SourceRange, }; @@ -7,33 +7,33 @@ use crate::{ /// file. Tokens we walk through will be one of these. #[derive(Clone, Debug)] pub enum Node<'a> { - Program(&'a types::Program), + Program(NodeRef<'a, types::Program>), - ImportStatement(&'a types::ImportStatement), - ExpressionStatement(&'a types::ExpressionStatement), - VariableDeclaration(&'a types::VariableDeclaration), - ReturnStatement(&'a types::ReturnStatement), + ImportStatement(NodeRef<'a, types::ImportStatement>), + ExpressionStatement(NodeRef<'a, types::ExpressionStatement>), + VariableDeclaration(NodeRef<'a, types::VariableDeclaration>), + ReturnStatement(NodeRef<'a, types::ReturnStatement>), - VariableDeclarator(&'a types::VariableDeclarator), + VariableDeclarator(NodeRef<'a, types::VariableDeclarator>), - Literal(&'a types::Literal), - TagDeclarator(&'a types::TagDeclarator), - Identifier(&'a types::Identifier), - BinaryExpression(&'a types::BinaryExpression), - FunctionExpression(&'a types::FunctionExpression), - CallExpression(&'a types::CallExpression), - PipeExpression(&'a types::PipeExpression), - PipeSubstitution(&'a types::PipeSubstitution), - ArrayExpression(&'a types::ArrayExpression), - ArrayRangeExpression(&'a types::ArrayRangeExpression), - ObjectExpression(&'a types::ObjectExpression), - MemberExpression(&'a types::MemberExpression), - UnaryExpression(&'a types::UnaryExpression), - IfExpression(&'a types::IfExpression), + Literal(NodeRef<'a, types::Literal>), + TagDeclarator(NodeRef<'a, types::TagDeclarator>), + Identifier(NodeRef<'a, types::Identifier>), + BinaryExpression(NodeRef<'a, types::BinaryExpression>), + FunctionExpression(NodeRef<'a, types::FunctionExpression>), + CallExpression(NodeRef<'a, types::CallExpression>), + PipeExpression(NodeRef<'a, types::PipeExpression>), + PipeSubstitution(NodeRef<'a, types::PipeSubstitution>), + ArrayExpression(NodeRef<'a, types::ArrayExpression>), + ArrayRangeExpression(NodeRef<'a, types::ArrayRangeExpression>), + ObjectExpression(NodeRef<'a, types::ObjectExpression>), + MemberExpression(NodeRef<'a, types::MemberExpression>), + UnaryExpression(NodeRef<'a, types::UnaryExpression>), + IfExpression(NodeRef<'a, types::IfExpression>), Parameter(&'a types::Parameter), - ObjectProperty(&'a types::ObjectProperty), + ObjectProperty(NodeRef<'a, types::ObjectProperty>), MemberObject(&'a types::MemberObject), LiteralIdentifier(&'a types::LiteralIdentifier), @@ -43,34 +43,44 @@ impl From<&Node<'_>> for SourceRange { fn from(node: &Node) -> Self { match node { Node::Program(p) => SourceRange([p.start, p.end]), - Node::ImportStatement(e) => SourceRange([e.start(), e.end()]), - Node::ExpressionStatement(e) => SourceRange([e.start(), e.end()]), - Node::VariableDeclaration(v) => SourceRange([v.start(), v.end()]), - Node::ReturnStatement(r) => SourceRange([r.start(), r.end()]), - Node::VariableDeclarator(v) => SourceRange([v.start(), v.end()]), - Node::Literal(l) => SourceRange([l.start(), l.end()]), - Node::TagDeclarator(t) => SourceRange([t.start(), t.end()]), - Node::Identifier(i) => SourceRange([i.start(), i.end()]), - Node::BinaryExpression(b) => SourceRange([b.start(), b.end()]), - Node::FunctionExpression(f) => SourceRange([f.start(), f.end()]), - Node::CallExpression(c) => SourceRange([c.start(), c.end()]), - Node::PipeExpression(p) => SourceRange([p.start(), p.end()]), - Node::PipeSubstitution(p) => SourceRange([p.start(), p.end()]), - Node::ArrayExpression(a) => SourceRange([a.start(), a.end()]), - Node::ArrayRangeExpression(a) => SourceRange([a.start(), a.end()]), - Node::ObjectExpression(o) => SourceRange([o.start(), o.end()]), - Node::MemberExpression(m) => SourceRange([m.start(), m.end()]), - Node::UnaryExpression(u) => SourceRange([u.start(), u.end()]), - Node::Parameter(p) => SourceRange([p.identifier.start(), p.identifier.end()]), - Node::ObjectProperty(o) => SourceRange([o.start(), o.end()]), + Node::ImportStatement(e) => SourceRange([e.start, e.end]), + Node::ExpressionStatement(e) => SourceRange([e.start, e.end]), + Node::VariableDeclaration(v) => SourceRange([v.start, v.end]), + Node::ReturnStatement(r) => SourceRange([r.start, r.end]), + Node::VariableDeclarator(v) => SourceRange([v.start, v.end]), + Node::Literal(l) => SourceRange([l.start, l.end]), + Node::TagDeclarator(t) => SourceRange([t.start, t.end]), + Node::Identifier(i) => SourceRange([i.start, i.end]), + Node::BinaryExpression(b) => SourceRange([b.start, b.end]), + Node::FunctionExpression(f) => SourceRange([f.start, f.end]), + Node::CallExpression(c) => SourceRange([c.start, c.end]), + Node::PipeExpression(p) => SourceRange([p.start, p.end]), + Node::PipeSubstitution(p) => SourceRange([p.start, p.end]), + Node::ArrayExpression(a) => SourceRange([a.start, a.end]), + Node::ArrayRangeExpression(a) => SourceRange([a.start, a.end]), + Node::ObjectExpression(o) => SourceRange([o.start, o.end]), + Node::MemberExpression(m) => SourceRange([m.start, m.end]), + Node::UnaryExpression(u) => SourceRange([u.start, u.end]), + Node::Parameter(p) => SourceRange([p.identifier.start, p.identifier.end]), + Node::ObjectProperty(o) => SourceRange([o.start, o.end]), Node::MemberObject(m) => SourceRange([m.start(), m.end()]), - Node::IfExpression(m) => SourceRange([m.start(), m.end()]), + Node::IfExpression(m) => SourceRange([m.start, m.end]), Node::LiteralIdentifier(l) => SourceRange([l.start(), l.end()]), } } } macro_rules! impl_from { + ($node:ident, $t: ident) => { + impl<'a> From> for Node<'a> { + fn from(v: NodeRef<'a, types::$t>) -> Self { + Node::$t(v) + } + } + }; +} + +macro_rules! impl_from_ref { ($node:ident, $t: ident) => { impl<'a> From<&'a types::$t> for Node<'a> { fn from(v: &'a types::$t) -> Self { @@ -99,8 +109,8 @@ impl_from!(Node, ArrayRangeExpression); impl_from!(Node, ObjectExpression); impl_from!(Node, MemberExpression); impl_from!(Node, UnaryExpression); -impl_from!(Node, Parameter); impl_from!(Node, ObjectProperty); -impl_from!(Node, MemberObject); +impl_from_ref!(Node, Parameter); +impl_from_ref!(Node, MemberObject); impl_from!(Node, IfExpression); -impl_from!(Node, LiteralIdentifier); +impl_from_ref!(Node, LiteralIdentifier); diff --git a/src/wasm-lib/kcl/src/walk/ast_walk.rs b/src/wasm-lib/kcl/src/walk/ast_walk.rs index 03d872446..f5836b94e 100644 --- a/src/wasm-lib/kcl/src/walk/ast_walk.rs +++ b/src/wasm-lib/kcl/src/walk/ast_walk.rs @@ -2,8 +2,8 @@ use anyhow::Result; use crate::{ ast::types::{ - BinaryPart, BodyItem, Expr, IfExpression, LiteralIdentifier, MemberExpression, MemberObject, ObjectExpression, - ObjectProperty, Parameter, Program, UnaryExpression, VariableDeclarator, + BinaryPart, BodyItem, Expr, IfExpression, LiteralIdentifier, MemberExpression, MemberObject, NodeRef, + ObjectExpression, ObjectProperty, Parameter, Program, UnaryExpression, VariableDeclarator, }, walk::Node, }; @@ -26,7 +26,7 @@ where } /// Run the Walker against all [Node]s in a [Program]. -pub fn walk<'a, WalkT>(prog: &'a Program, f: &WalkT) -> Result +pub fn walk<'a, WalkT>(prog: NodeRef<'a, Program>, f: &WalkT) -> Result where WalkT: Walker<'a>, { @@ -42,7 +42,7 @@ where Ok(true) } -fn walk_variable_declarator<'a, WalkT>(node: &'a VariableDeclarator, f: &WalkT) -> Result +fn walk_variable_declarator<'a, WalkT>(node: NodeRef<'a, VariableDeclarator>, f: &WalkT) -> Result where WalkT: Walker<'a>, { @@ -79,7 +79,7 @@ where f.walk(node.into()) } -fn walk_member_expression<'a, WalkT>(node: &'a MemberExpression, f: &WalkT) -> Result +fn walk_member_expression<'a, WalkT>(node: NodeRef<'a, MemberExpression>, f: &WalkT) -> Result where WalkT: Walker<'a>, { @@ -204,7 +204,7 @@ where } /// Walk through an [ObjectProperty]. -fn walk_object_property<'a, WalkT>(node: &'a ObjectProperty, f: &WalkT) -> Result +fn walk_object_property<'a, WalkT>(node: NodeRef<'a, ObjectProperty>, f: &WalkT) -> Result where WalkT: Walker<'a>, { @@ -215,7 +215,7 @@ where } /// Walk through an [ObjectExpression]. -fn walk_object_expression<'a, WalkT>(node: &'a ObjectExpression, f: &WalkT) -> Result +fn walk_object_expression<'a, WalkT>(node: NodeRef<'a, ObjectExpression>, f: &WalkT) -> Result where WalkT: Walker<'a>, { @@ -232,7 +232,7 @@ where } /// Walk through an [IfExpression]. -fn walk_if_expression<'a, WalkT>(node: &'a IfExpression, f: &WalkT) -> Result +fn walk_if_expression<'a, WalkT>(node: NodeRef<'a, IfExpression>, f: &WalkT) -> Result where WalkT: Walker<'a>, { @@ -259,7 +259,7 @@ where } /// walk through an [UnaryExpression]. -fn walk_unary_expression<'a, WalkT>(node: &'a UnaryExpression, f: &WalkT) -> Result +fn walk_unary_expression<'a, WalkT>(node: NodeRef<'a, UnaryExpression>, f: &WalkT) -> Result where WalkT: Walker<'a>, { diff --git a/src/wasm-lib/kcl/tests/cube/ast.snap b/src/wasm-lib/kcl/tests/cube/ast.snap index e07632995..88234fe25 100644 --- a/src/wasm-lib/kcl/tests/cube/ast.snap +++ b/src/wasm-lib/kcl/tests/cube/ast.snap @@ -1,795 +1,795 @@ --- -source: kcl/src/tests.rs +source: kcl/src/simulation_tests.rs description: Result of parsing cube.kcl snapshot_kind: text --- { "Ok": { - "start": 0, - "end": 344, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 0, - "end": 316, "declarations": [ { - "type": "VariableDeclarator", - "start": 3, "end": 316, "id": { - "type": "Identifier", - "start": 3, "end": 7, - "name": "cube" + "name": "cube", + "start": 3, + "type": "Identifier" }, "init": { - "type": "FunctionExpression", - "type": "FunctionExpression", - "start": 10, - "end": 316, - "params": [ - { - "type": "Parameter", - "identifier": { - "type": "Identifier", - "start": 11, - "end": 17, - "name": "length" - }, - "optional": false - }, - { - "type": "Parameter", - "identifier": { - "type": "Identifier", - "start": 19, - "end": 25, - "name": "center" - }, - "optional": false - } - ], "body": { - "start": 30, - "end": 316, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 34, - "end": 48, "declarations": [ { - "type": "VariableDeclarator", - "start": 34, "end": 48, "id": { - "type": "Identifier", - "start": 34, "end": 35, - "name": "l" + "name": "l", + "start": 34, + "type": "Identifier" }, "init": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 38, "end": 48, - "operator": "/", "left": { - "type": "Identifier", - "type": "Identifier", - "start": 38, "end": 44, - "name": "length" + "name": "length", + "start": 38, + "type": "Identifier", + "type": "Identifier" }, + "operator": "/", "right": { - "type": "Literal", - "type": "Literal", - "start": 47, "end": 48, - "value": 2, - "raw": "2" - } - } + "raw": "2", + "start": 47, + "type": "Literal", + "type": "Literal", + "value": 2 + }, + "start": 38, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 34, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 48, + "kind": "const", + "start": 34, + "type": "VariableDeclaration", + "type": "VariableDeclaration" }, { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 51, - "end": 64, "declarations": [ { - "type": "VariableDeclarator", - "start": 51, "end": 64, "id": { - "type": "Identifier", - "start": 51, "end": 52, - "name": "x" + "name": "x", + "start": 51, + "type": "Identifier" }, "init": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 55, + "computed": false, "end": 64, "object": { - "type": "Identifier", - "type": "Identifier", - "start": 55, "end": 61, - "name": "center" + "name": "center", + "start": 55, + "type": "Identifier", + "type": "Identifier" }, "property": { - "type": "Literal", - "type": "Literal", - "start": 62, "end": 63, - "value": 0, - "raw": "0" + "raw": "0", + "start": 62, + "type": "Literal", + "type": "Literal", + "value": 0 }, - "computed": false - } + "start": 55, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 51, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 64, + "kind": "const", + "start": 51, + "type": "VariableDeclaration", + "type": "VariableDeclaration" }, { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 67, - "end": 80, "declarations": [ { - "type": "VariableDeclarator", - "start": 67, "end": 80, "id": { - "type": "Identifier", - "start": 67, "end": 68, - "name": "y" + "name": "y", + "start": 67, + "type": "Identifier" }, "init": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 71, + "computed": false, "end": 80, "object": { - "type": "Identifier", - "type": "Identifier", - "start": 71, "end": 77, - "name": "center" + "name": "center", + "start": 71, + "type": "Identifier", + "type": "Identifier" }, "property": { - "type": "Literal", - "type": "Literal", - "start": 78, "end": 79, - "value": 1, - "raw": "1" + "raw": "1", + "start": 78, + "type": "Literal", + "type": "Literal", + "value": 1 }, - "computed": false - } + "start": 71, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 67, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 80, + "kind": "const", + "start": 67, + "type": "VariableDeclaration", + "type": "VariableDeclaration" }, { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 83, - "end": 104, "declarations": [ { - "type": "VariableDeclarator", - "start": 83, "end": 104, "id": { - "type": "Identifier", - "start": 83, "end": 85, - "name": "p0" + "name": "p0", + "start": 83, + "type": "Identifier" }, "init": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 88, - "end": 104, "elements": [ { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 89, "end": 95, - "operator": "+", "left": { - "type": "UnaryExpression", - "type": "UnaryExpression", - "start": 89, + "argument": { + "end": 91, + "name": "l", + "start": 90, + "type": "Identifier", + "type": "Identifier" + }, "end": 91, "operator": "-", - "argument": { - "type": "Identifier", - "type": "Identifier", - "start": 90, - "end": 91, - "name": "l" - } + "start": 89, + "type": "UnaryExpression", + "type": "UnaryExpression" }, + "operator": "+", "right": { - "type": "Identifier", - "type": "Identifier", - "start": 94, "end": 95, - "name": "x" - } + "name": "x", + "start": 94, + "type": "Identifier", + "type": "Identifier" + }, + "start": 89, + "type": "BinaryExpression", + "type": "BinaryExpression" }, { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 97, "end": 103, - "operator": "+", "left": { - "type": "UnaryExpression", - "type": "UnaryExpression", - "start": 97, + "argument": { + "end": 99, + "name": "l", + "start": 98, + "type": "Identifier", + "type": "Identifier" + }, "end": 99, "operator": "-", - "argument": { - "type": "Identifier", - "type": "Identifier", - "start": 98, - "end": 99, - "name": "l" - } + "start": 97, + "type": "UnaryExpression", + "type": "UnaryExpression" }, + "operator": "+", "right": { - "type": "Identifier", - "type": "Identifier", - "start": 102, "end": 103, - "name": "y" - } + "name": "y", + "start": 102, + "type": "Identifier", + "type": "Identifier" + }, + "start": 97, + "type": "BinaryExpression", + "type": "BinaryExpression" } - ] - } + ], + "end": 104, + "start": 88, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 83, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 104, + "kind": "const", + "start": 83, + "type": "VariableDeclaration", + "type": "VariableDeclaration" }, { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 107, - "end": 127, "declarations": [ { - "type": "VariableDeclarator", - "start": 107, "end": 127, "id": { - "type": "Identifier", - "start": 107, "end": 109, - "name": "p1" + "name": "p1", + "start": 107, + "type": "Identifier" }, "init": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 112, - "end": 127, "elements": [ { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 113, "end": 119, - "operator": "+", "left": { - "type": "UnaryExpression", - "type": "UnaryExpression", - "start": 113, + "argument": { + "end": 115, + "name": "l", + "start": 114, + "type": "Identifier", + "type": "Identifier" + }, "end": 115, "operator": "-", - "argument": { - "type": "Identifier", - "type": "Identifier", - "start": 114, - "end": 115, - "name": "l" - } + "start": 113, + "type": "UnaryExpression", + "type": "UnaryExpression" }, + "operator": "+", "right": { - "type": "Identifier", - "type": "Identifier", - "start": 118, "end": 119, - "name": "x" - } + "name": "x", + "start": 118, + "type": "Identifier", + "type": "Identifier" + }, + "start": 113, + "type": "BinaryExpression", + "type": "BinaryExpression" }, { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 121, "end": 126, - "operator": "+", "left": { - "type": "Identifier", - "type": "Identifier", - "start": 121, "end": 122, - "name": "l" + "name": "l", + "start": 121, + "type": "Identifier", + "type": "Identifier" }, + "operator": "+", "right": { - "type": "Identifier", - "type": "Identifier", - "start": 125, "end": 126, - "name": "y" - } + "name": "y", + "start": 125, + "type": "Identifier", + "type": "Identifier" + }, + "start": 121, + "type": "BinaryExpression", + "type": "BinaryExpression" } - ] - } + ], + "end": 127, + "start": 112, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 107, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 127, + "kind": "const", + "start": 107, + "type": "VariableDeclaration", + "type": "VariableDeclaration" }, { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 130, - "end": 149, "declarations": [ { - "type": "VariableDeclarator", - "start": 130, "end": 149, "id": { - "type": "Identifier", - "start": 130, "end": 132, - "name": "p2" + "name": "p2", + "start": 130, + "type": "Identifier" }, "init": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 135, - "end": 149, "elements": [ { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 136, "end": 141, - "operator": "+", "left": { - "type": "Identifier", - "type": "Identifier", - "start": 136, "end": 137, - "name": "l" + "name": "l", + "start": 136, + "type": "Identifier", + "type": "Identifier" }, + "operator": "+", "right": { - "type": "Identifier", - "type": "Identifier", - "start": 140, "end": 141, - "name": "x" - } + "name": "x", + "start": 140, + "type": "Identifier", + "type": "Identifier" + }, + "start": 136, + "type": "BinaryExpression", + "type": "BinaryExpression" }, { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 143, "end": 148, - "operator": "+", "left": { - "type": "Identifier", - "type": "Identifier", - "start": 143, "end": 144, - "name": "l" + "name": "l", + "start": 143, + "type": "Identifier", + "type": "Identifier" }, + "operator": "+", "right": { - "type": "Identifier", - "type": "Identifier", - "start": 147, "end": 148, - "name": "y" - } + "name": "y", + "start": 147, + "type": "Identifier", + "type": "Identifier" + }, + "start": 143, + "type": "BinaryExpression", + "type": "BinaryExpression" } - ] - } + ], + "end": 149, + "start": 135, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 130, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 149, + "kind": "const", + "start": 130, + "type": "VariableDeclaration", + "type": "VariableDeclaration" }, { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 152, - "end": 172, "declarations": [ { - "type": "VariableDeclarator", - "start": 152, "end": 172, "id": { - "type": "Identifier", - "start": 152, "end": 154, - "name": "p3" + "name": "p3", + "start": 152, + "type": "Identifier" }, "init": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 157, - "end": 172, "elements": [ { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 158, "end": 163, - "operator": "+", "left": { - "type": "Identifier", - "type": "Identifier", - "start": 158, "end": 159, - "name": "l" + "name": "l", + "start": 158, + "type": "Identifier", + "type": "Identifier" }, + "operator": "+", "right": { - "type": "Identifier", - "type": "Identifier", - "start": 162, "end": 163, - "name": "x" - } + "name": "x", + "start": 162, + "type": "Identifier", + "type": "Identifier" + }, + "start": 158, + "type": "BinaryExpression", + "type": "BinaryExpression" }, { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 165, "end": 171, - "operator": "+", "left": { - "type": "UnaryExpression", - "type": "UnaryExpression", - "start": 165, + "argument": { + "end": 167, + "name": "l", + "start": 166, + "type": "Identifier", + "type": "Identifier" + }, "end": 167, "operator": "-", - "argument": { - "type": "Identifier", - "type": "Identifier", - "start": 166, - "end": 167, - "name": "l" - } + "start": 165, + "type": "UnaryExpression", + "type": "UnaryExpression" }, + "operator": "+", "right": { - "type": "Identifier", - "type": "Identifier", - "start": 170, "end": 171, - "name": "y" - } + "name": "y", + "start": 170, + "type": "Identifier", + "type": "Identifier" + }, + "start": 165, + "type": "BinaryExpression", + "type": "BinaryExpression" } - ] - } + ], + "end": 172, + "start": 157, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 152, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 172, + "kind": "const", + "start": 152, + "type": "VariableDeclaration", + "type": "VariableDeclaration" }, { - "type": "ReturnStatement", - "type": "ReturnStatement", - "start": 176, - "end": 314, "argument": { - "type": "PipeExpression", - "type": "PipeExpression", - "start": 183, - "end": 314, "body": [ { - "type": "CallExpression", - "type": "CallExpression", - "start": 183, - "end": 200, - "callee": { - "type": "Identifier", - "start": 183, - "end": 196, - "name": "startSketchAt" - }, "arguments": [ { - "type": "Identifier", - "type": "Identifier", - "start": 197, "end": 199, - "name": "p0" + "name": "p0", + "start": 197, + "type": "Identifier", + "type": "Identifier" } ], - "optional": false + "callee": { + "end": 196, + "name": "startSketchAt", + "start": 183, + "type": "Identifier" + }, + "end": 200, + "optional": false, + "start": 183, + "type": "CallExpression", + "type": "CallExpression" }, { - "type": "CallExpression", - "type": "CallExpression", - "start": 206, - "end": 219, - "callee": { - "type": "Identifier", - "start": 206, - "end": 212, - "name": "lineTo" - }, "arguments": [ { - "type": "Identifier", - "type": "Identifier", - "start": 213, "end": 215, - "name": "p1" + "name": "p1", + "start": 213, + "type": "Identifier", + "type": "Identifier" }, { - "type": "PipeSubstitution", - "type": "PipeSubstitution", + "end": 218, "start": 217, - "end": 218 + "type": "PipeSubstitution", + "type": "PipeSubstitution" } ], - "optional": false + "callee": { + "end": 212, + "name": "lineTo", + "start": 206, + "type": "Identifier" + }, + "end": 219, + "optional": false, + "start": 206, + "type": "CallExpression", + "type": "CallExpression" }, { - "type": "CallExpression", - "type": "CallExpression", - "start": 225, - "end": 238, - "callee": { - "type": "Identifier", - "start": 225, - "end": 231, - "name": "lineTo" - }, "arguments": [ { - "type": "Identifier", - "type": "Identifier", - "start": 232, "end": 234, - "name": "p2" + "name": "p2", + "start": 232, + "type": "Identifier", + "type": "Identifier" }, { - "type": "PipeSubstitution", - "type": "PipeSubstitution", + "end": 237, "start": 236, - "end": 237 + "type": "PipeSubstitution", + "type": "PipeSubstitution" } ], - "optional": false + "callee": { + "end": 231, + "name": "lineTo", + "start": 225, + "type": "Identifier" + }, + "end": 238, + "optional": false, + "start": 225, + "type": "CallExpression", + "type": "CallExpression" }, { - "type": "CallExpression", - "type": "CallExpression", - "start": 244, - "end": 257, - "callee": { - "type": "Identifier", - "start": 244, - "end": 250, - "name": "lineTo" - }, "arguments": [ { - "type": "Identifier", - "type": "Identifier", - "start": 251, "end": 253, - "name": "p3" + "name": "p3", + "start": 251, + "type": "Identifier", + "type": "Identifier" }, { - "type": "PipeSubstitution", - "type": "PipeSubstitution", + "end": 256, "start": 255, - "end": 256 + "type": "PipeSubstitution", + "type": "PipeSubstitution" } ], - "optional": false + "callee": { + "end": 250, + "name": "lineTo", + "start": 244, + "type": "Identifier" + }, + "end": 257, + "optional": false, + "start": 244, + "type": "CallExpression", + "type": "CallExpression" }, { - "type": "CallExpression", - "type": "CallExpression", - "start": 263, - "end": 276, - "callee": { - "type": "Identifier", - "start": 263, - "end": 269, - "name": "lineTo" - }, "arguments": [ { - "type": "Identifier", - "type": "Identifier", - "start": 270, "end": 272, - "name": "p0" + "name": "p0", + "start": 270, + "type": "Identifier", + "type": "Identifier" }, { - "type": "PipeSubstitution", - "type": "PipeSubstitution", + "end": 275, "start": 274, - "end": 275 + "type": "PipeSubstitution", + "type": "PipeSubstitution" } ], - "optional": false + "callee": { + "end": 269, + "name": "lineTo", + "start": 263, + "type": "Identifier" + }, + "end": 276, + "optional": false, + "start": 263, + "type": "CallExpression", + "type": "CallExpression" }, { - "type": "CallExpression", - "type": "CallExpression", - "start": 282, - "end": 290, - "callee": { - "type": "Identifier", - "start": 282, - "end": 287, - "name": "close" - }, "arguments": [ { - "type": "PipeSubstitution", - "type": "PipeSubstitution", + "end": 289, "start": 288, - "end": 289 + "type": "PipeSubstitution", + "type": "PipeSubstitution" } ], - "optional": false + "callee": { + "end": 287, + "name": "close", + "start": 282, + "type": "Identifier" + }, + "end": 290, + "optional": false, + "start": 282, + "type": "CallExpression", + "type": "CallExpression" }, { - "type": "CallExpression", - "type": "CallExpression", - "start": 296, - "end": 314, - "callee": { - "type": "Identifier", - "start": 296, - "end": 303, - "name": "extrude" - }, "arguments": [ { - "type": "Identifier", - "type": "Identifier", - "start": 304, "end": 310, - "name": "length" + "name": "length", + "start": 304, + "type": "Identifier", + "type": "Identifier" }, { - "type": "PipeSubstitution", - "type": "PipeSubstitution", + "end": 313, "start": 312, - "end": 313 + "type": "PipeSubstitution", + "type": "PipeSubstitution" } ], - "optional": false + "callee": { + "end": 303, + "name": "extrude", + "start": 296, + "type": "Identifier" + }, + "end": 314, + "optional": false, + "start": 296, + "type": "CallExpression", + "type": "CallExpression" } - ] - } + ], + "end": 314, + "start": 183, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "end": 314, + "start": 176, + "type": "ReturnStatement", + "type": "ReturnStatement" } ], + "end": 316, "nonCodeMeta": { "nonCodeNodes": { "6": [ { - "type": "NonCodeNode", - "start": 172, "end": 176, + "start": 172, + "type": "NonCodeNode", "value": { "type": "newLine" } } ] }, - "start": [] - } - } - } - } - ], - "kind": "fn" - }, - { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 318, - "end": 343, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 318, - "end": 343, - "id": { - "type": "Identifier", - "start": 318, - "end": 324, - "name": "myCube" - }, - "init": { - "type": "CallExpression", - "type": "CallExpression", - "start": 327, - "end": 343, - "callee": { - "type": "Identifier", - "start": 327, - "end": 331, - "name": "cube" + "startNodes": [] + }, + "start": 30 }, - "arguments": [ + "end": 316, + "params": [ { - "type": "Literal", - "type": "Literal", - "start": 332, - "end": 334, - "value": 40, - "raw": "40" + "type": "Parameter", + "identifier": { + "end": 17, + "name": "length", + "start": 11, + "type": "Identifier" + }, + "optional": false }, { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 336, - "end": 342, - "elements": [ - { - "type": "Literal", - "type": "Literal", - "start": 337, - "end": 338, - "value": 0, - "raw": "0" - }, - { - "type": "Literal", - "type": "Literal", - "start": 340, - "end": 341, - "value": 0, - "raw": "0" - } - ] + "type": "Parameter", + "identifier": { + "end": 25, + "name": "center", + "start": 19, + "type": "Identifier" + }, + "optional": false } ], - "optional": false - } + "start": 10, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 3, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 316, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declarations": [ + { + "end": 343, + "id": { + "end": 324, + "name": "myCube", + "start": 318, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 334, + "raw": "40", + "start": 332, + "type": "Literal", + "type": "Literal", + "value": 40 + }, + { + "elements": [ + { + "end": 338, + "raw": "0", + "start": 337, + "type": "Literal", + "type": "Literal", + "value": 0 + }, + { + "end": 341, + "raw": "0", + "start": 340, + "type": "Literal", + "type": "Literal", + "value": 0 + } + ], + "end": 342, + "start": 336, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + ], + "callee": { + "end": 331, + "name": "cube", + "start": 327, + "type": "Identifier" + }, + "end": 343, + "optional": false, + "start": 327, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 318, + "type": "VariableDeclarator" + } + ], + "end": 343, + "kind": "const", + "start": 318, + "type": "VariableDeclaration", + "type": "VariableDeclaration" } ], + "end": 344, "nonCodeMeta": { "nonCodeNodes": { "0": [ { - "type": "NonCodeNode", - "start": 316, "end": 318, + "start": 316, + "type": "NonCodeNode", "value": { "type": "newLine" } } ] }, - "start": [] - } + "startNodes": [] + }, + "start": 0 } } diff --git a/src/wasm-lib/kcl/tests/cube/program_memory.snap b/src/wasm-lib/kcl/tests/cube/program_memory.snap index 625b6b9a6..6e8b18ae9 100644 --- a/src/wasm-lib/kcl/tests/cube/program_memory.snap +++ b/src/wasm-lib/kcl/tests/cube/program_memory.snap @@ -1,5 +1,5 @@ --- -source: kcl/src/tests.rs +source: kcl/src/simulation_tests.rs description: Program memory after executing cube.kcl snapshot_kind: text --- @@ -34,683 +34,683 @@ snapshot_kind: text "cube": { "type": "Function", "expression": { - "type": "FunctionExpression", - "start": 10, - "end": 316, - "params": [ - { - "type": "Parameter", - "identifier": { - "type": "Identifier", - "start": 11, - "end": 17, - "name": "length" - }, - "optional": false - }, - { - "type": "Parameter", - "identifier": { - "type": "Identifier", - "start": 19, - "end": 25, - "name": "center" - }, - "optional": false - } - ], "body": { - "start": 30, - "end": 316, "body": [ { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 34, - "end": 48, "declarations": [ { - "type": "VariableDeclarator", - "start": 34, "end": 48, "id": { - "type": "Identifier", - "start": 34, "end": 35, - "name": "l" + "name": "l", + "start": 34, + "type": "Identifier" }, "init": { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 38, "end": 48, - "operator": "/", "left": { - "type": "Identifier", - "type": "Identifier", - "start": 38, "end": 44, - "name": "length" + "name": "length", + "start": 38, + "type": "Identifier", + "type": "Identifier" }, + "operator": "/", "right": { - "type": "Literal", - "type": "Literal", - "start": 47, "end": 48, - "value": 2, - "raw": "2" - } - } + "raw": "2", + "start": 47, + "type": "Literal", + "type": "Literal", + "value": 2 + }, + "start": 38, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 34, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 48, + "kind": "const", + "start": 34, + "type": "VariableDeclaration", + "type": "VariableDeclaration" }, { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 51, - "end": 64, "declarations": [ { - "type": "VariableDeclarator", - "start": 51, "end": 64, "id": { - "type": "Identifier", - "start": 51, "end": 52, - "name": "x" + "name": "x", + "start": 51, + "type": "Identifier" }, "init": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 55, + "computed": false, "end": 64, "object": { - "type": "Identifier", - "type": "Identifier", - "start": 55, "end": 61, - "name": "center" + "name": "center", + "start": 55, + "type": "Identifier", + "type": "Identifier" }, "property": { - "type": "Literal", - "type": "Literal", - "start": 62, "end": 63, - "value": 0, - "raw": "0" + "raw": "0", + "start": 62, + "type": "Literal", + "type": "Literal", + "value": 0 }, - "computed": false - } + "start": 55, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 51, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 64, + "kind": "const", + "start": 51, + "type": "VariableDeclaration", + "type": "VariableDeclaration" }, { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 67, - "end": 80, "declarations": [ { - "type": "VariableDeclarator", - "start": 67, "end": 80, "id": { - "type": "Identifier", - "start": 67, "end": 68, - "name": "y" + "name": "y", + "start": 67, + "type": "Identifier" }, "init": { - "type": "MemberExpression", - "type": "MemberExpression", - "start": 71, + "computed": false, "end": 80, "object": { - "type": "Identifier", - "type": "Identifier", - "start": 71, "end": 77, - "name": "center" + "name": "center", + "start": 71, + "type": "Identifier", + "type": "Identifier" }, "property": { - "type": "Literal", - "type": "Literal", - "start": 78, "end": 79, - "value": 1, - "raw": "1" + "raw": "1", + "start": 78, + "type": "Literal", + "type": "Literal", + "value": 1 }, - "computed": false - } + "start": 71, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 67, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 80, + "kind": "const", + "start": 67, + "type": "VariableDeclaration", + "type": "VariableDeclaration" }, { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 83, - "end": 104, "declarations": [ { - "type": "VariableDeclarator", - "start": 83, "end": 104, "id": { - "type": "Identifier", - "start": 83, "end": 85, - "name": "p0" + "name": "p0", + "start": 83, + "type": "Identifier" }, "init": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 88, - "end": 104, "elements": [ { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 89, "end": 95, - "operator": "+", "left": { - "type": "UnaryExpression", - "type": "UnaryExpression", - "start": 89, + "argument": { + "end": 91, + "name": "l", + "start": 90, + "type": "Identifier", + "type": "Identifier" + }, "end": 91, "operator": "-", - "argument": { - "type": "Identifier", - "type": "Identifier", - "start": 90, - "end": 91, - "name": "l" - } + "start": 89, + "type": "UnaryExpression", + "type": "UnaryExpression" }, + "operator": "+", "right": { - "type": "Identifier", - "type": "Identifier", - "start": 94, "end": 95, - "name": "x" - } + "name": "x", + "start": 94, + "type": "Identifier", + "type": "Identifier" + }, + "start": 89, + "type": "BinaryExpression", + "type": "BinaryExpression" }, { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 97, "end": 103, - "operator": "+", "left": { - "type": "UnaryExpression", - "type": "UnaryExpression", - "start": 97, + "argument": { + "end": 99, + "name": "l", + "start": 98, + "type": "Identifier", + "type": "Identifier" + }, "end": 99, "operator": "-", - "argument": { - "type": "Identifier", - "type": "Identifier", - "start": 98, - "end": 99, - "name": "l" - } + "start": 97, + "type": "UnaryExpression", + "type": "UnaryExpression" }, + "operator": "+", "right": { - "type": "Identifier", - "type": "Identifier", - "start": 102, "end": 103, - "name": "y" - } + "name": "y", + "start": 102, + "type": "Identifier", + "type": "Identifier" + }, + "start": 97, + "type": "BinaryExpression", + "type": "BinaryExpression" } - ] - } + ], + "end": 104, + "start": 88, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 83, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 104, + "kind": "const", + "start": 83, + "type": "VariableDeclaration", + "type": "VariableDeclaration" }, { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 107, - "end": 127, "declarations": [ { - "type": "VariableDeclarator", - "start": 107, "end": 127, "id": { - "type": "Identifier", - "start": 107, "end": 109, - "name": "p1" + "name": "p1", + "start": 107, + "type": "Identifier" }, "init": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 112, - "end": 127, "elements": [ { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 113, "end": 119, - "operator": "+", "left": { - "type": "UnaryExpression", - "type": "UnaryExpression", - "start": 113, + "argument": { + "end": 115, + "name": "l", + "start": 114, + "type": "Identifier", + "type": "Identifier" + }, "end": 115, "operator": "-", - "argument": { - "type": "Identifier", - "type": "Identifier", - "start": 114, - "end": 115, - "name": "l" - } + "start": 113, + "type": "UnaryExpression", + "type": "UnaryExpression" }, + "operator": "+", "right": { - "type": "Identifier", - "type": "Identifier", - "start": 118, "end": 119, - "name": "x" - } + "name": "x", + "start": 118, + "type": "Identifier", + "type": "Identifier" + }, + "start": 113, + "type": "BinaryExpression", + "type": "BinaryExpression" }, { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 121, "end": 126, - "operator": "+", "left": { - "type": "Identifier", - "type": "Identifier", - "start": 121, "end": 122, - "name": "l" + "name": "l", + "start": 121, + "type": "Identifier", + "type": "Identifier" }, + "operator": "+", "right": { - "type": "Identifier", - "type": "Identifier", - "start": 125, "end": 126, - "name": "y" - } + "name": "y", + "start": 125, + "type": "Identifier", + "type": "Identifier" + }, + "start": 121, + "type": "BinaryExpression", + "type": "BinaryExpression" } - ] - } + ], + "end": 127, + "start": 112, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 107, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 127, + "kind": "const", + "start": 107, + "type": "VariableDeclaration", + "type": "VariableDeclaration" }, { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 130, - "end": 149, "declarations": [ { - "type": "VariableDeclarator", - "start": 130, "end": 149, "id": { - "type": "Identifier", - "start": 130, "end": 132, - "name": "p2" + "name": "p2", + "start": 130, + "type": "Identifier" }, "init": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 135, - "end": 149, "elements": [ { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 136, "end": 141, - "operator": "+", "left": { - "type": "Identifier", - "type": "Identifier", - "start": 136, "end": 137, - "name": "l" + "name": "l", + "start": 136, + "type": "Identifier", + "type": "Identifier" }, + "operator": "+", "right": { - "type": "Identifier", - "type": "Identifier", - "start": 140, "end": 141, - "name": "x" - } + "name": "x", + "start": 140, + "type": "Identifier", + "type": "Identifier" + }, + "start": 136, + "type": "BinaryExpression", + "type": "BinaryExpression" }, { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 143, "end": 148, - "operator": "+", "left": { - "type": "Identifier", - "type": "Identifier", - "start": 143, "end": 144, - "name": "l" + "name": "l", + "start": 143, + "type": "Identifier", + "type": "Identifier" }, + "operator": "+", "right": { - "type": "Identifier", - "type": "Identifier", - "start": 147, "end": 148, - "name": "y" - } + "name": "y", + "start": 147, + "type": "Identifier", + "type": "Identifier" + }, + "start": 143, + "type": "BinaryExpression", + "type": "BinaryExpression" } - ] - } + ], + "end": 149, + "start": 135, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 130, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 149, + "kind": "const", + "start": 130, + "type": "VariableDeclaration", + "type": "VariableDeclaration" }, { - "type": "VariableDeclaration", - "type": "VariableDeclaration", - "start": 152, - "end": 172, "declarations": [ { - "type": "VariableDeclarator", - "start": 152, "end": 172, "id": { - "type": "Identifier", - "start": 152, "end": 154, - "name": "p3" + "name": "p3", + "start": 152, + "type": "Identifier" }, "init": { - "type": "ArrayExpression", - "type": "ArrayExpression", - "start": 157, - "end": 172, "elements": [ { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 158, "end": 163, - "operator": "+", "left": { - "type": "Identifier", - "type": "Identifier", - "start": 158, "end": 159, - "name": "l" + "name": "l", + "start": 158, + "type": "Identifier", + "type": "Identifier" }, + "operator": "+", "right": { - "type": "Identifier", - "type": "Identifier", - "start": 162, "end": 163, - "name": "x" - } + "name": "x", + "start": 162, + "type": "Identifier", + "type": "Identifier" + }, + "start": 158, + "type": "BinaryExpression", + "type": "BinaryExpression" }, { - "type": "BinaryExpression", - "type": "BinaryExpression", - "start": 165, "end": 171, - "operator": "+", "left": { - "type": "UnaryExpression", - "type": "UnaryExpression", - "start": 165, + "argument": { + "end": 167, + "name": "l", + "start": 166, + "type": "Identifier", + "type": "Identifier" + }, "end": 167, "operator": "-", - "argument": { - "type": "Identifier", - "type": "Identifier", - "start": 166, - "end": 167, - "name": "l" - } + "start": 165, + "type": "UnaryExpression", + "type": "UnaryExpression" }, + "operator": "+", "right": { - "type": "Identifier", - "type": "Identifier", - "start": 170, "end": 171, - "name": "y" - } + "name": "y", + "start": 170, + "type": "Identifier", + "type": "Identifier" + }, + "start": 165, + "type": "BinaryExpression", + "type": "BinaryExpression" } - ] - } + ], + "end": 172, + "start": 157, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 152, + "type": "VariableDeclarator" } ], - "kind": "const" + "end": 172, + "kind": "const", + "start": 152, + "type": "VariableDeclaration", + "type": "VariableDeclaration" }, { - "type": "ReturnStatement", - "type": "ReturnStatement", - "start": 176, - "end": 314, "argument": { - "type": "PipeExpression", - "type": "PipeExpression", - "start": 183, - "end": 314, "body": [ { - "type": "CallExpression", - "type": "CallExpression", - "start": 183, - "end": 200, - "callee": { - "type": "Identifier", - "start": 183, - "end": 196, - "name": "startSketchAt" - }, "arguments": [ { - "type": "Identifier", - "type": "Identifier", - "start": 197, "end": 199, - "name": "p0" + "name": "p0", + "start": 197, + "type": "Identifier", + "type": "Identifier" } ], - "optional": false + "callee": { + "end": 196, + "name": "startSketchAt", + "start": 183, + "type": "Identifier" + }, + "end": 200, + "optional": false, + "start": 183, + "type": "CallExpression", + "type": "CallExpression" }, { - "type": "CallExpression", - "type": "CallExpression", - "start": 206, - "end": 219, - "callee": { - "type": "Identifier", - "start": 206, - "end": 212, - "name": "lineTo" - }, "arguments": [ { - "type": "Identifier", - "type": "Identifier", - "start": 213, "end": 215, - "name": "p1" + "name": "p1", + "start": 213, + "type": "Identifier", + "type": "Identifier" }, { - "type": "PipeSubstitution", - "type": "PipeSubstitution", + "end": 218, "start": 217, - "end": 218 + "type": "PipeSubstitution", + "type": "PipeSubstitution" } ], - "optional": false + "callee": { + "end": 212, + "name": "lineTo", + "start": 206, + "type": "Identifier" + }, + "end": 219, + "optional": false, + "start": 206, + "type": "CallExpression", + "type": "CallExpression" }, { - "type": "CallExpression", - "type": "CallExpression", - "start": 225, - "end": 238, - "callee": { - "type": "Identifier", - "start": 225, - "end": 231, - "name": "lineTo" - }, "arguments": [ { - "type": "Identifier", - "type": "Identifier", - "start": 232, "end": 234, - "name": "p2" + "name": "p2", + "start": 232, + "type": "Identifier", + "type": "Identifier" }, { - "type": "PipeSubstitution", - "type": "PipeSubstitution", + "end": 237, "start": 236, - "end": 237 + "type": "PipeSubstitution", + "type": "PipeSubstitution" } ], - "optional": false + "callee": { + "end": 231, + "name": "lineTo", + "start": 225, + "type": "Identifier" + }, + "end": 238, + "optional": false, + "start": 225, + "type": "CallExpression", + "type": "CallExpression" }, { - "type": "CallExpression", - "type": "CallExpression", - "start": 244, - "end": 257, - "callee": { - "type": "Identifier", - "start": 244, - "end": 250, - "name": "lineTo" - }, "arguments": [ { - "type": "Identifier", - "type": "Identifier", - "start": 251, "end": 253, - "name": "p3" + "name": "p3", + "start": 251, + "type": "Identifier", + "type": "Identifier" }, { - "type": "PipeSubstitution", - "type": "PipeSubstitution", + "end": 256, "start": 255, - "end": 256 + "type": "PipeSubstitution", + "type": "PipeSubstitution" } ], - "optional": false + "callee": { + "end": 250, + "name": "lineTo", + "start": 244, + "type": "Identifier" + }, + "end": 257, + "optional": false, + "start": 244, + "type": "CallExpression", + "type": "CallExpression" }, { - "type": "CallExpression", - "type": "CallExpression", - "start": 263, - "end": 276, - "callee": { - "type": "Identifier", - "start": 263, - "end": 269, - "name": "lineTo" - }, "arguments": [ { - "type": "Identifier", - "type": "Identifier", - "start": 270, "end": 272, - "name": "p0" + "name": "p0", + "start": 270, + "type": "Identifier", + "type": "Identifier" }, { - "type": "PipeSubstitution", - "type": "PipeSubstitution", + "end": 275, "start": 274, - "end": 275 + "type": "PipeSubstitution", + "type": "PipeSubstitution" } ], - "optional": false + "callee": { + "end": 269, + "name": "lineTo", + "start": 263, + "type": "Identifier" + }, + "end": 276, + "optional": false, + "start": 263, + "type": "CallExpression", + "type": "CallExpression" }, { - "type": "CallExpression", - "type": "CallExpression", - "start": 282, - "end": 290, - "callee": { - "type": "Identifier", - "start": 282, - "end": 287, - "name": "close" - }, "arguments": [ { - "type": "PipeSubstitution", - "type": "PipeSubstitution", + "end": 289, "start": 288, - "end": 289 + "type": "PipeSubstitution", + "type": "PipeSubstitution" } ], - "optional": false + "callee": { + "end": 287, + "name": "close", + "start": 282, + "type": "Identifier" + }, + "end": 290, + "optional": false, + "start": 282, + "type": "CallExpression", + "type": "CallExpression" }, { - "type": "CallExpression", - "type": "CallExpression", - "start": 296, - "end": 314, - "callee": { - "type": "Identifier", - "start": 296, - "end": 303, - "name": "extrude" - }, "arguments": [ { - "type": "Identifier", - "type": "Identifier", - "start": 304, "end": 310, - "name": "length" + "name": "length", + "start": 304, + "type": "Identifier", + "type": "Identifier" }, { - "type": "PipeSubstitution", - "type": "PipeSubstitution", + "end": 313, "start": 312, - "end": 313 + "type": "PipeSubstitution", + "type": "PipeSubstitution" } ], - "optional": false + "callee": { + "end": 303, + "name": "extrude", + "start": 296, + "type": "Identifier" + }, + "end": 314, + "optional": false, + "start": 296, + "type": "CallExpression", + "type": "CallExpression" } - ] - } + ], + "end": 314, + "start": 183, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "end": 314, + "start": 176, + "type": "ReturnStatement", + "type": "ReturnStatement" } ], + "end": 316, "nonCodeMeta": { "nonCodeNodes": { "6": [ { - "type": "NonCodeNode", - "start": 172, "end": 176, + "start": 172, + "type": "NonCodeNode", "value": { "type": "newLine" } } ] }, - "start": [] + "startNodes": [] + }, + "start": 30 + }, + "end": 316, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 17, + "name": "length", + "start": 11, + "type": "Identifier" + }, + "optional": false + }, + { + "type": "Parameter", + "identifier": { + "end": 25, + "name": "center", + "start": 19, + "type": "Identifier" + }, + "optional": false } - } + ], + "start": 10, + "type": "FunctionExpression" }, "memory": { "environments": [ diff --git a/src/wasm-lib/src/wasm.rs b/src/wasm-lib/src/wasm.rs index 143f6fa7a..5d5393182 100644 --- a/src/wasm-lib/src/wasm.rs +++ b/src/wasm-lib/src/wasm.rs @@ -7,7 +7,12 @@ use std::{ use futures::stream::TryStreamExt; use gloo_utils::format::JsValueSerdeExt; -use kcl_lib::{coredump::CoreDump, engine::EngineManager, executor::ExecutorSettings}; +use kcl_lib::{ + ast::types::{Node, Program}, + coredump::CoreDump, + engine::EngineManager, + executor::ExecutorSettings, +}; use tower_lsp::{LspService, Server}; use wasm_bindgen::prelude::*; @@ -26,7 +31,7 @@ pub async fn execute_wasm( console_error_panic_hook::set_once(); // deserialize the ast from a stringified json - let program: kcl_lib::ast::types::Program = serde_json::from_str(program_str).map_err(|e| e.to_string())?; + let program: Node = serde_json::from_str(program_str).map_err(|e| e.to_string())?; let memory: kcl_lib::executor::ProgramMemory = serde_json::from_str(memory_str).map_err(|e| e.to_string())?; let id_generator: kcl_lib::executor::IdGenerator = serde_json::from_str(id_generator_str).map_err(|e| e.to_string())?; @@ -79,7 +84,7 @@ pub async fn execute_wasm( pub async fn kcl_lint(program_str: &str) -> Result { console_error_panic_hook::set_once(); - let program: kcl_lib::ast::types::Program = serde_json::from_str(program_str).map_err(|e| e.to_string())?; + let program: Node = serde_json::from_str(program_str).map_err(|e| e.to_string())?; let mut findings = vec![]; for discovered_finding in program.lint_all().into_iter().flatten() { findings.push(discovered_finding); @@ -138,7 +143,7 @@ pub async fn modify_ast_for_sketch_wasm( console_error_panic_hook::set_once(); // deserialize the ast from a stringified json - let mut program: kcl_lib::ast::types::Program = serde_json::from_str(program_str).map_err(|e| e.to_string())?; + let mut program: Node = serde_json::from_str(program_str).map_err(|e| e.to_string())?; let plane: kcl_lib::executor::PlaneType = serde_json::from_str(plane_type).map_err(|e| e.to_string())?; diff --git a/src/wasm-lib/tests/executor/no_visuals.rs b/src/wasm-lib/tests/executor/no_visuals.rs index b5be2cad6..6bd6fc1b0 100644 --- a/src/wasm-lib/tests/executor/no_visuals.rs +++ b/src/wasm-lib/tests/executor/no_visuals.rs @@ -1,5 +1,5 @@ use kcl_lib::{ - ast::types::Program, + ast::types::{Node, Program}, errors::KclError, executor::{ExecutorContext, IdGenerator}, parser, @@ -58,7 +58,7 @@ async fn run(code: &str) { } } -async fn setup(program: &str) -> (ExecutorContext, Program, IdGenerator) { +async fn setup(program: &str) -> (ExecutorContext, Node, IdGenerator) { let tokens = kcl_lib::token::lexer(program).unwrap(); let parser = kcl_lib::parser::Parser::new(tokens); let program = parser.ast().unwrap(); diff --git a/src/wasm-lib/tests/modify/main.rs b/src/wasm-lib/tests/modify/main.rs index 43032153a..bf8f20bab 100644 --- a/src/wasm-lib/tests/modify/main.rs +++ b/src/wasm-lib/tests/modify/main.rs @@ -1,13 +1,16 @@ use anyhow::Result; use kcl_lib::{ - ast::{modify::modify_ast_for_sketch, types::Program}, + ast::{ + modify::modify_ast_for_sketch, + types::{Node, Program}, + }, executor::{ExecutorContext, IdGenerator, KclValue, PlaneType, Sketch, SourceRange}, }; use kittycad_modeling_cmds::{each_cmd as mcmd, length_unit::LengthUnit, shared::Point3d, ModelingCmd}; use pretty_assertions::assert_eq; /// Setup the engine and parse code for an ast. -async fn setup(code: &str, name: &str) -> Result<(ExecutorContext, Program, uuid::Uuid)> { +async fn setup(code: &str, name: &str) -> Result<(ExecutorContext, Node, uuid::Uuid)> { let tokens = kcl_lib::token::lexer(code)?; let parser = kcl_lib::parser::Parser::new(tokens); let program = parser.ast()?; From a8b816a3e2115b90e68091c470d1eaa1923533d1 Mon Sep 17 00:00:00 2001 From: Arnav Gupta Date: Wed, 30 Oct 2024 19:04:26 -0400 Subject: [PATCH 10/13] Added test to ensure array push is immutable (#4361) added test to ensure array push is immutable --- .../tests/executor/inputs/no_visuals/array_elem_push_fail.kcl | 3 +++ src/wasm-lib/tests/executor/no_visuals.rs | 4 ++++ 2 files changed, 7 insertions(+) create mode 100644 src/wasm-lib/tests/executor/inputs/no_visuals/array_elem_push_fail.kcl diff --git a/src/wasm-lib/tests/executor/inputs/no_visuals/array_elem_push_fail.kcl b/src/wasm-lib/tests/executor/inputs/no_visuals/array_elem_push_fail.kcl new file mode 100644 index 000000000..733c22e95 --- /dev/null +++ b/src/wasm-lib/tests/executor/inputs/no_visuals/array_elem_push_fail.kcl @@ -0,0 +1,3 @@ +arr = [1, 2, 3] +pushedArr = push(arr, 4) +fail = arr[3] diff --git a/src/wasm-lib/tests/executor/no_visuals.rs b/src/wasm-lib/tests/executor/no_visuals.rs index 6bd6fc1b0..1a5bb6056 100644 --- a/src/wasm-lib/tests/executor/no_visuals.rs +++ b/src/wasm-lib/tests/executor/no_visuals.rs @@ -174,3 +174,7 @@ gen_test_parse_fail!( gen_test!(add_lots); gen_test!(double_map); gen_test!(array_elem_push); +gen_test_fail!( + array_elem_push_fail, + "undefined value: The array doesn't have any item at index 3" +); From 26e995dc3f8e596d95aedaf884a9ba4b64d0b493 Mon Sep 17 00:00:00 2001 From: Frank Noirot Date: Thu, 31 Oct 2024 07:04:38 -0700 Subject: [PATCH 11/13] Snap to origin and axis behavior for profile starts and segments (#4344) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Visualize draft point when near axes (only works on XY rn due to quaternion rotation issue) * Slightly better quaternion rotation * Actually snap new profiles to the X and Y axis * Add snapping behavior while dragging * Fix flickering on non-XY planes * Add some fixture additions to support click-and-drag tests * Add new test to verify snapping behavior * Make the editor test fixture auto-open and close as needed * All feedback except absolute lines * Use `lineTo` for lines that have snapped * Get other existing tests passing after switching to `lineTo` when snapping * A snapshot a day keeps the bugs away! 📷🐛 (OS: ubuntu-latest) * Re-run CI --------- Co-authored-by: github-actions[bot] --- e2e/playwright/basic-sketch.spec.ts | 2 +- e2e/playwright/fixtures/editorFixture.ts | 44 ++++- e2e/playwright/fixtures/fixtureSetup.ts | 3 +- e2e/playwright/fixtures/sceneFixture.ts | 58 +++++- e2e/playwright/fixtures/toolbarFixture.ts | 2 + e2e/playwright/point-click.spec.ts | 100 ++++++++++ e2e/playwright/sketch-tests.spec.ts | 12 +- ...test-network-and-connection-issues.spec.ts | 2 +- e2e/playwright/test-utils.ts | 33 +++- e2e/playwright/testing-selections.spec.ts | 10 +- src/clientSideScene/sceneEntities.ts | 186 +++++++++++++++--- src/clientSideScene/sceneInfra.ts | 47 ++++- src/clientSideScene/segments.ts | 17 +- src/lang/std/sketchcombos.ts | 8 + 14 files changed, 453 insertions(+), 71 deletions(-) diff --git a/e2e/playwright/basic-sketch.spec.ts b/e2e/playwright/basic-sketch.spec.ts index 09c1d3a7d..b3e3ff5b7 100644 --- a/e2e/playwright/basic-sketch.spec.ts +++ b/e2e/playwright/basic-sketch.spec.ts @@ -86,7 +86,7 @@ async function doBasicSketch(page: Page, openPanes: string[]) { |> startProfileAt(${commonPoints.startAt}, %) |> line([${commonPoints.num1}, 0], %) |> line([0, ${commonPoints.num1 + 0.01}], %) - |> line([-${commonPoints.num2}, 0], %)`) + |> lineTo([0, ${commonPoints.num3}], %)`) } // deselect line tool diff --git a/e2e/playwright/fixtures/editorFixture.ts b/e2e/playwright/fixtures/editorFixture.ts index be23d0af6..73718e251 100644 --- a/e2e/playwright/fixtures/editorFixture.ts +++ b/e2e/playwright/fixtures/editorFixture.ts @@ -1,6 +1,11 @@ import type { Page, Locator } from '@playwright/test' import { expect } from '@playwright/test' -import { sansWhitespace } from '../test-utils' +import { + closePane, + checkIfPaneIsOpen, + openPane, + sansWhitespace, +} from '../test-utils' interface EditorState { activeLines: Array @@ -11,6 +16,7 @@ interface EditorState { export class EditorFixture { public page: Page + private paneButtonTestId = 'code-pane-button' private diagnosticsTooltip!: Locator private diagnosticsGutterIcon!: Locator private codeContent!: Locator @@ -31,19 +37,32 @@ export class EditorFixture { private _expectEditorToContain = (not = false) => - ( + async ( code: string, { shouldNormalise = false, timeout = 5_000, }: { shouldNormalise?: boolean; timeout?: number } = {} ) => { + const wasPaneOpen = await this.checkIfPaneIsOpen() + if (!wasPaneOpen) { + await this.openPane() + } + const resetPane = async () => { + if (!wasPaneOpen) { + await this.closePane() + } + } if (!shouldNormalise) { const expectStart = expect(this.codeContent) if (not) { - return expectStart.not.toContainText(code, { timeout }) + const result = await expectStart.not.toContainText(code, { timeout }) + await resetPane() + return result } - return expectStart.toContainText(code, { timeout }) + const result = await expectStart.toContainText(code, { timeout }) + await resetPane() + return result } const normalisedCode = code.replaceAll(/\s+/g, '').trim() const expectStart = expect.poll( @@ -56,9 +75,13 @@ export class EditorFixture { } ) if (not) { - return expectStart.not.toContain(normalisedCode) + const result = await expectStart.not.toContain(normalisedCode) + await resetPane() + return result } - return expectStart.toContain(normalisedCode) + const result = await expectStart.toContain(normalisedCode) + await resetPane() + return result } expectEditor = { toContain: this._expectEditorToContain(), @@ -115,4 +138,13 @@ export class EditorFixture { code = code.replace(findCode, replaceCode) await this.codeContent.fill(code) } + checkIfPaneIsOpen() { + return checkIfPaneIsOpen(this.page, this.paneButtonTestId) + } + closePane() { + return closePane(this.page, this.paneButtonTestId) + } + openPane() { + return openPane(this.page, this.paneButtonTestId) + } } diff --git a/e2e/playwright/fixtures/fixtureSetup.ts b/e2e/playwright/fixtures/fixtureSetup.ts index 494115c53..8ccbd1a44 100644 --- a/e2e/playwright/fixtures/fixtureSetup.ts +++ b/e2e/playwright/fixtures/fixtureSetup.ts @@ -20,6 +20,7 @@ export class AuthenticatedApp { public readonly page: Page public readonly context: BrowserContext public readonly testInfo: TestInfo + public readonly viewPortSize = { width: 1000, height: 500 } constructor(context: BrowserContext, page: Page, testInfo: TestInfo) { this.page = page @@ -36,7 +37,7 @@ export class AuthenticatedApp { ;(window as any).playwrightSkipFilePicker = true }, code) - await this.page.setViewportSize({ width: 1000, height: 500 }) + await this.page.setViewportSize(this.viewPortSize) await u.waitForAuthSkipAppStart() } diff --git a/e2e/playwright/fixtures/sceneFixture.ts b/e2e/playwright/fixtures/sceneFixture.ts index 8772dffe9..3baee5dc8 100644 --- a/e2e/playwright/fixtures/sceneFixture.ts +++ b/e2e/playwright/fixtures/sceneFixture.ts @@ -10,7 +10,13 @@ import { } from '../test-utils' type mouseParams = { - pixelDiff: number + pixelDiff?: number +} +type mouseDragToParams = mouseParams & { + fromPoint: { x: number; y: number } +} +type mouseDragFromParams = mouseParams & { + toPoint: { x: number; y: number } } type SceneSerialised = { @@ -20,6 +26,13 @@ type SceneSerialised = { } } +type ClickHandler = (clickParams?: mouseParams) => Promise +type MoveHandler = (moveParams?: mouseParams) => Promise +type DragToHandler = (dragParams: mouseDragToParams) => Promise +type DragFromHandler = ( + dragParams: mouseDragFromParams +) => Promise + export class SceneFixture { public page: Page @@ -55,7 +68,7 @@ export class SceneFixture { x: number, y: number, { steps }: { steps: number } = { steps: 20 } - ) => + ): [ClickHandler, MoveHandler] => [ (clickParams?: mouseParams) => { if (clickParams?.pixelDiff) { @@ -78,6 +91,47 @@ export class SceneFixture { return this.page.mouse.move(x, y, { steps }) }, ] as const + makeDragHelpers = ( + x: number, + y: number, + { steps }: { steps: number } = { steps: 20 } + ): [DragToHandler, DragFromHandler] => + [ + (dragToParams: mouseDragToParams) => { + if (dragToParams?.pixelDiff) { + return doAndWaitForImageDiff( + this.page, + () => + this.page.dragAndDrop('#stream', '#stream', { + sourcePosition: dragToParams.fromPoint, + targetPosition: { x, y }, + }), + dragToParams.pixelDiff + ) + } + return this.page.dragAndDrop('#stream', '#stream', { + sourcePosition: dragToParams.fromPoint, + targetPosition: { x, y }, + }) + }, + (dragFromParams: mouseDragFromParams) => { + if (dragFromParams?.pixelDiff) { + return doAndWaitForImageDiff( + this.page, + () => + this.page.dragAndDrop('#stream', '#stream', { + sourcePosition: { x, y }, + targetPosition: dragFromParams.toPoint, + }), + dragFromParams.pixelDiff + ) + } + return this.page.dragAndDrop('#stream', '#stream', { + sourcePosition: { x, y }, + targetPosition: dragFromParams.toPoint, + }) + }, + ] as const /** Likely no where, there's a chance it will click something in the scene, depending what you have in the scene. * diff --git a/e2e/playwright/fixtures/toolbarFixture.ts b/e2e/playwright/fixtures/toolbarFixture.ts index c2092b1e9..fb8a908ad 100644 --- a/e2e/playwright/fixtures/toolbarFixture.ts +++ b/e2e/playwright/fixtures/toolbarFixture.ts @@ -7,6 +7,7 @@ export class ToolbarFixture { extrudeButton!: Locator startSketchBtn!: Locator + lineBtn!: Locator rectangleBtn!: Locator exitSketchBtn!: Locator editSketchBtn!: Locator @@ -24,6 +25,7 @@ export class ToolbarFixture { this.page = page this.extrudeButton = page.getByTestId('extrude') this.startSketchBtn = page.getByTestId('sketch') + this.lineBtn = page.getByTestId('line') this.rectangleBtn = page.getByTestId('corner-rectangle') this.exitSketchBtn = page.getByTestId('sketch-exit') this.editSketchBtn = page.getByText('Edit Sketch') diff --git a/e2e/playwright/point-click.spec.ts b/e2e/playwright/point-click.spec.ts index 0e0e559e8..fd8b6911f 100644 --- a/e2e/playwright/point-click.spec.ts +++ b/e2e/playwright/point-click.spec.ts @@ -451,3 +451,103 @@ sketch002 = startSketchOn(extrude001, seg03) } ) }) + +test(`Verify axis and origin snapping`, async ({ + app, + editor, + toolbar, + scene, +}) => { + // Constants and locators + // These are mappings from screenspace to KCL coordinates, + // until we merge in our coordinate system helpers + const xzPlane = [ + app.viewPortSize.width * 0.65, + app.viewPortSize.height * 0.3, + ] as const + const originSloppy = { + screen: [ + app.viewPortSize.width / 2 + 3, // 3px off the center of the screen + app.viewPortSize.height / 2, + ], + kcl: [0, 0], + } as const + const xAxisSloppy = { + screen: [ + app.viewPortSize.width * 0.75, + app.viewPortSize.height / 2 - 3, // 3px off the X-axis + ], + kcl: [16.95, 0], + } as const + const offYAxis = { + screen: [ + app.viewPortSize.width * 0.6, // Well off the Y-axis, out of snapping range + app.viewPortSize.height * 0.3, + ], + kcl: [6.78, 6.78], + } as const + const yAxisSloppy = { + screen: [ + app.viewPortSize.width / 2 + 5, // 5px off the Y-axis + app.viewPortSize.height * 0.3, + ], + kcl: [0, 6.78], + } as const + const [clickOnXzPlane, moveToXzPlane] = scene.makeMouseHelpers(...xzPlane) + const [clickOriginSloppy] = scene.makeMouseHelpers(...originSloppy.screen) + const [clickXAxisSloppy, moveXAxisSloppy] = scene.makeMouseHelpers( + ...xAxisSloppy.screen + ) + const [dragToOffYAxis, dragFromOffAxis] = scene.makeDragHelpers( + ...offYAxis.screen + ) + + const expectedCodeSnippets = { + sketchOnXzPlane: `sketch001 = startSketchOn('XZ')`, + pointAtOrigin: `startProfileAt([${originSloppy.kcl[0]}, ${originSloppy.kcl[1]}], %)`, + segmentOnXAxis: `lineTo([${xAxisSloppy.kcl[0]}, ${xAxisSloppy.kcl[1]}], %)`, + afterSegmentDraggedOffYAxis: `startProfileAt([${offYAxis.kcl[0]}, ${offYAxis.kcl[1]}], %)`, + afterSegmentDraggedOnYAxis: `startProfileAt([${yAxisSloppy.kcl[0]}, ${yAxisSloppy.kcl[1]}], %)`, + } + + await app.initialise() + + await test.step(`Start a sketch on the XZ plane`, async () => { + await editor.closePane() + await toolbar.startSketchPlaneSelection() + await moveToXzPlane() + await clickOnXzPlane() + // timeout wait for engine animation is unavoidable + await app.page.waitForTimeout(600) + await editor.expectEditor.toContain(expectedCodeSnippets.sketchOnXzPlane) + }) + await test.step(`Place a point a few pixels off the middle, verify it still snaps to 0,0`, async () => { + await clickOriginSloppy() + await editor.expectEditor.toContain(expectedCodeSnippets.pointAtOrigin) + }) + await test.step(`Add a segment on x-axis after moving the mouse a bit, verify it snaps`, async () => { + await moveXAxisSloppy() + await clickXAxisSloppy() + await editor.expectEditor.toContain(expectedCodeSnippets.segmentOnXAxis) + }) + await test.step(`Unequip line tool`, async () => { + await toolbar.lineBtn.click() + await expect(toolbar.lineBtn).not.toHaveAttribute('aria-pressed', 'true') + }) + await test.step(`Drag the origin point up and to the right, verify it's past snapping`, async () => { + await dragToOffYAxis({ + fromPoint: { x: originSloppy.screen[0], y: originSloppy.screen[1] }, + }) + await editor.expectEditor.toContain( + expectedCodeSnippets.afterSegmentDraggedOffYAxis + ) + }) + await test.step(`Drag the origin point left to the y-axis, verify it snaps back`, async () => { + await dragFromOffAxis({ + toPoint: { x: yAxisSloppy.screen[0], y: yAxisSloppy.screen[1] }, + }) + await editor.expectEditor.toContain( + expectedCodeSnippets.afterSegmentDraggedOnYAxis + ) + }) +}) diff --git a/e2e/playwright/sketch-tests.spec.ts b/e2e/playwright/sketch-tests.spec.ts index 3d66a92c9..b441c7cc2 100644 --- a/e2e/playwright/sketch-tests.spec.ts +++ b/e2e/playwright/sketch-tests.spec.ts @@ -637,7 +637,6 @@ test.describe('Sketch tests', () => { |> revolve({ axis: "X" }, %)`) }) test('Can add multiple sketches', async ({ page }) => { - test.skip(process.platform === 'darwin', 'Can add multiple sketches') const u = await getUtils(page) const viewportSize = { width: 1200, height: 500 } await page.setViewportSize(viewportSize) @@ -675,15 +674,16 @@ test.describe('Sketch tests', () => { await click00r(50, 0) await page.waitForTimeout(100) - codeStr += ` |> line(${toSU([50, 0])}, %)` + codeStr += ` |> lineTo(${toSU([50, 0])}, %)` await expect(u.codeLocator).toHaveText(codeStr) await click00r(0, 50) codeStr += ` |> line(${toSU([0, 50])}, %)` await expect(u.codeLocator).toHaveText(codeStr) - await click00r(-50, 0) - codeStr += ` |> line(${toSU([-50, 0])}, %)` + let clickCoords = await click00r(-50, 0) + expect(clickCoords).not.toBeUndefined() + codeStr += ` |> lineTo(${toSU(clickCoords!)}, %)` await expect(u.codeLocator).toHaveText(codeStr) // exit the sketch, reset relative clicker @@ -709,8 +709,10 @@ test.describe('Sketch tests', () => { codeStr += ` |> startProfileAt([2.03, 0], %)` await expect(u.codeLocator).toHaveText(codeStr) + // TODO: I couldn't use `toSU` here because of some rounding error causing + // it to be off by 0.01 await click00r(30, 0) - codeStr += ` |> line([2.04, 0], %)` + codeStr += ` |> lineTo([4.07, 0], %)` await expect(u.codeLocator).toHaveText(codeStr) await click00r(0, 30) diff --git a/e2e/playwright/test-network-and-connection-issues.spec.ts b/e2e/playwright/test-network-and-connection-issues.spec.ts index 583a7f954..d09571446 100644 --- a/e2e/playwright/test-network-and-connection-issues.spec.ts +++ b/e2e/playwright/test-network-and-connection-issues.spec.ts @@ -219,7 +219,7 @@ test.describe('Test network and connection issues', () => { |> startProfileAt([12.34, -12.34], %) |> line([12.34, 0], %) |> line([-12.34, 12.34], %) - |> line([-12.34, 0], %) + |> lineTo([0, -12.34], %) `) diff --git a/e2e/playwright/test-utils.ts b/e2e/playwright/test-utils.ts index 839fa9dba..8412e1db3 100644 --- a/e2e/playwright/test-utils.ts +++ b/e2e/playwright/test-utils.ts @@ -45,7 +45,9 @@ export const commonPoints = { startAt: '[7.19, -9.7]', num1: 7.25, num2: 14.44, -} + /** The Y-value of a common lineTo move we perform in tests */ + num3: -2.44, +} as const /** A semi-reliable color to check the default XZ plane on * in dark mode in the default camera position @@ -118,15 +120,32 @@ async function waitForDefaultPlanesToBeVisible(page: Page) { ) } -async function openPane(page: Page, testId: string) { - const locator = page.getByTestId(testId) - await expect(locator).toBeVisible() - const isOpen = (await locator?.getAttribute('aria-pressed')) === 'true' +export async function checkIfPaneIsOpen(page: Page, testId: string) { + const paneButtonLocator = page.getByTestId(testId) + await expect(paneButtonLocator).toBeVisible() + return (await paneButtonLocator?.getAttribute('aria-pressed')) === 'true' +} + +export async function openPane(page: Page, testId: string) { + const paneButtonLocator = page.getByTestId(testId) + await expect(paneButtonLocator).toBeVisible() + const isOpen = await checkIfPaneIsOpen(page, testId) if (!isOpen) { - await locator.click() - await expect(locator).toHaveAttribute('aria-pressed', 'true') + await paneButtonLocator.click() } + await expect(paneButtonLocator).toHaveAttribute('aria-pressed', 'true') +} + +export async function closePane(page: Page, testId: string) { + const paneButtonLocator = page.getByTestId(testId) + await expect(paneButtonLocator).toBeVisible() + const isOpen = await checkIfPaneIsOpen(page, testId) + + if (isOpen) { + await paneButtonLocator.click() + } + await expect(paneButtonLocator).toHaveAttribute('aria-pressed', 'false') } async function openKclCodePanel(page: Page) { diff --git a/e2e/playwright/testing-selections.spec.ts b/e2e/playwright/testing-selections.spec.ts index c162f910f..986fcb775 100644 --- a/e2e/playwright/testing-selections.spec.ts +++ b/e2e/playwright/testing-selections.spec.ts @@ -96,7 +96,7 @@ test.describe('Testing selections', () => { |> startProfileAt(${commonPoints.startAt}, %) |> line([${commonPoints.num1}, 0], %) |> line([0, ${commonPoints.num1 + 0.01}], %) - |> line([-${commonPoints.num2}, 0], %)`) + |> lineTo([0, ${commonPoints.num3}], %)`) // deselect line tool await page.getByRole('button', { name: 'line Line', exact: true }).click() @@ -157,7 +157,9 @@ test.describe('Testing selections', () => { await emptySpaceClick() // check the same selection again by putting cursor in code first then selecting axis - await page.getByText(` |> line([-${commonPoints.num2}, 0], %)`).click() + await page + .getByText(` |> lineTo([0, ${commonPoints.num3}], %)`) + .click() await page.keyboard.down('Shift') await constrainButton.click() await expect(absYButton).toBeDisabled() @@ -180,7 +182,9 @@ test.describe('Testing selections', () => { process.platform === 'linux' ? 'Control' : 'Meta' ) await page.waitForTimeout(100) - await page.getByText(` |> line([-${commonPoints.num2}, 0], %)`).click() + await page + .getByText(` |> lineTo([0, ${commonPoints.num3}], %)`) + .click() await expect(page.locator('.cm-cursor')).toHaveCount(2) await page.waitForTimeout(500) diff --git a/src/clientSideScene/sceneEntities.ts b/src/clientSideScene/sceneEntities.ts index 788b2fe0f..17225d083 100644 --- a/src/clientSideScene/sceneEntities.ts +++ b/src/clientSideScene/sceneEntities.ts @@ -19,6 +19,8 @@ import { import { ARROWHEAD, AXIS_GROUP, + DRAFT_POINT, + DRAFT_POINT_GROUP, getSceneScale, INTERSECTION_PLANE_LAYER, OnClickCallbackArgs, @@ -53,7 +55,7 @@ import { editorManager, } from 'lib/singletons' import { getNodeFromPath, getNodePathFromSourceRange } from 'lang/queryAst' -import { executeAst } from 'lang/langHelpers' +import { executeAst, ToolTip } from 'lang/langHelpers' import { createProfileStartHandle, SegmentUtils, @@ -314,6 +316,27 @@ export class SceneEntities { const intersectionPlane = this.scene.getObjectByName(RAYCASTABLE_PLANE) if (intersectionPlane) this.scene.remove(intersectionPlane) } + getDraftPoint() { + return this.scene.getObjectByName(DRAFT_POINT) + } + createDraftPoint({ point, group }: { point: Vector2; group: Group }) { + const dummy = new Mesh() + dummy.position.set(0, 0, 0) + const scale = sceneInfra.getClientSceneScaleFactor(dummy) + + const draftPoint = createProfileStartHandle({ + isDraft: true, + from: [point.x, point.y], + scale, + theme: sceneInfra._theme, + }) + draftPoint.layers.set(SKETCH_LAYER) + group.add(draftPoint) + } + removeDraftPoint() { + const draftPoint = this.getDraftPoint() + if (draftPoint) draftPoint.removeFromParent() + } setupNoPointsListener({ sketchDetails, @@ -322,22 +345,78 @@ export class SceneEntities { sketchDetails: SketchDetails afterClick: (args: OnClickCallbackArgs) => void }) { - // Create a THREEjs plane to raycast clicks onto + // TODO: Consolidate shared logic between this and setupSketch + // Which should just fire when the sketch mode is entered, + // instead of in these two separate XState states. this.createIntersectionPlane() + const draftPointGroup = new Group() + draftPointGroup.name = DRAFT_POINT_GROUP + sketchDetails.origin && + draftPointGroup.position.set(...sketchDetails.origin) + if (!(sketchDetails.yAxis && sketchDetails)) { + console.error('No sketch quaternion or sketch details found') + return + } + this.currentSketchQuaternion = quaternionFromUpNForward( + new Vector3(...sketchDetails.yAxis), + new Vector3(...sketchDetails.zAxis) + ) + draftPointGroup.setRotationFromQuaternion(this.currentSketchQuaternion) + this.scene.add(draftPointGroup) + const quaternion = quaternionFromUpNForward( new Vector3(...sketchDetails.yAxis), new Vector3(...sketchDetails.zAxis) ) // Position the click raycast plane - if (this.intersectionPlane) { - this.intersectionPlane.setRotationFromQuaternion(quaternion) - this.intersectionPlane.position.copy( - new Vector3(...(sketchDetails?.origin || [0, 0, 0])) - ) - } + this.intersectionPlane!.setRotationFromQuaternion(quaternion) + this.intersectionPlane!.position.copy( + new Vector3(...(sketchDetails?.origin || [0, 0, 0])) + ) sceneInfra.setCallbacks({ + onMove: (args) => { + if (!args.intersects.length) return + const axisIntersection = args.intersects.find( + (sceneObject) => + sceneObject.object.name === X_AXIS || + sceneObject.object.name === Y_AXIS + ) + if (!axisIntersection) return + const { intersectionPoint } = args + // We're hovering over an axis, so we should show a draft point + const snappedPoint = intersectionPoint.twoD.clone() + if (axisIntersection.object.name === X_AXIS) { + snappedPoint.setComponent(1, 0) + } else { + snappedPoint.setComponent(0, 0) + } + // Either create a new one or update the existing one + const draftPoint = this.getDraftPoint() + + if (!draftPoint) { + this.createDraftPoint({ + point: snappedPoint, + group: draftPointGroup, + }) + } else { + // Ignore if there are huge jumps in the mouse position, + // that is likely a strange behavior + if ( + draftPoint.position.distanceTo( + new Vector3(snappedPoint.x, snappedPoint.y, 0) + ) > 100 + ) { + return + } + draftPoint.position.set(snappedPoint.x, snappedPoint.y, 0) + } + }, + onMouseLeave: () => { + this.removeDraftPoint() + }, onClick: async (args) => { + this.removeDraftPoint() if (!args) return // If there is a valid camera interaction that matches, do that instead const interaction = sceneInfra.camControls.getInteractionType( @@ -347,10 +426,25 @@ export class SceneEntities { if (args.mouseEvent.which !== 1) return const { intersectionPoint } = args if (!intersectionPoint?.twoD || !sketchDetails?.sketchPathToNode) return + + // Snap to either or both axes + // if the click intersects their meshes + const yAxisIntersection = args.intersects.find( + (sceneObject) => sceneObject.object.name === Y_AXIS + ) + const xAxisIntersection = args.intersects.find( + (sceneObject) => sceneObject.object.name === X_AXIS + ) + + const snappedClickPoint = { + x: yAxisIntersection ? 0 : intersectionPoint.twoD.x, + y: xAxisIntersection ? 0 : intersectionPoint.twoD.y, + } + const addStartProfileAtRes = addStartProfileAt( kclManager.ast, sketchDetails.sketchPathToNode, - [intersectionPoint.twoD.x, intersectionPoint.twoD.y] + [snappedClickPoint.x, snappedClickPoint.y] ) if (trap(addStartProfileAtRes)) return @@ -358,6 +452,7 @@ export class SceneEntities { await kclManager.updateAst(modifiedAst, false) this.removeIntersectionPlane() + this.scene.remove(draftPointGroup) // Now perform the caller-specified action afterClick(args) @@ -430,12 +525,7 @@ export class SceneEntities { const dummy = new Mesh() // TODO: When we actually have sketch positions and rotations we can use them here. dummy.position.set(0, 0, 0) - const orthoFactor = orthoScale(sceneInfra.camControls.camera) - const factor = - (sceneInfra.camControls.camera instanceof OrthographicCamera - ? orthoFactor - : perspScale(sceneInfra.camControls.camera, dummy)) / - sceneInfra._baseUnitMultiplier + const scale = sceneInfra.getClientSceneScaleFactor(dummy) const segPathToNode = getNodePathFromSourceRange( maybeModdedAst, @@ -446,8 +536,9 @@ export class SceneEntities { from: sketch.start.from, id: sketch.start.__geoMeta.id, pathToNode: segPathToNode, - scale: factor, + scale, theme: sceneInfra._theme, + isDraft: false, }) _profileStart.layers.set(SKETCH_LAYER) _profileStart.traverse((child) => { @@ -523,7 +614,7 @@ export class SceneEntities { id: segment.__geoMeta.id, pathToNode: segPathToNode, isDraftSegment, - scale: factor, + scale, texture: sceneInfra.extraSegmentTexture, theme: sceneInfra._theme, isSelected, @@ -660,12 +751,14 @@ export class SceneEntities { const { intersectionPoint } = args let intersection2d = intersectionPoint?.twoD - const profileStart = args.intersects + const intersectsProfileStart = args.intersects .map(({ object }) => getParentGroup(object, [PROFILE_START])) .find((a) => a?.name === PROFILE_START) let modifiedAst - if (profileStart) { + + // Snapping logic for the profile start handle + if (intersectsProfileStart) { const lastSegment = sketch.paths.slice(-1)[0] modifiedAst = addCallExpressionsToPipe({ node: kclManager.ast, @@ -698,19 +791,39 @@ export class SceneEntities { }) if (trap(modifiedAst)) return Promise.reject(modifiedAst) } else if (intersection2d) { + const intersectsYAxis = args.intersects.find( + (sceneObject) => sceneObject.object.name === Y_AXIS + ) + const intersectsXAxis = args.intersects.find( + (sceneObject) => sceneObject.object.name === X_AXIS + ) + const lastSegment = sketch.paths.slice(-1)[0] + const snappedPoint = { + x: intersectsYAxis ? 0 : intersection2d.x, + y: intersectsXAxis ? 0 : intersection2d.y, + } + + let resolvedFunctionName: ToolTip = 'line' + + // This might need to become its own function if we want more + // case-based logic for different segment types + if (lastSegment.type === 'TangentialArcTo') { + resolvedFunctionName = 'tangentialArcTo' + } else if (snappedPoint.x === 0 || snappedPoint.y === 0) { + // We consider a point placed on axes or origin to be absolute + resolvedFunctionName = 'lineTo' + } + const tmp = addNewSketchLn({ node: kclManager.ast, programMemory: kclManager.programMemory, input: { type: 'straight-segment', from: [lastSegment.to[0], lastSegment.to[1]], - to: [intersection2d.x, intersection2d.y], + to: [snappedPoint.x, snappedPoint.y], }, - fnName: - lastSegment.type === 'TangentialArcTo' - ? 'tangentialArcTo' - : 'line', + fnName: resolvedFunctionName, pathToNode: sketchPathToNode, }) if (trap(tmp)) return Promise.reject(tmp) @@ -722,7 +835,7 @@ export class SceneEntities { } await kclManager.executeAstMock(modifiedAst) - if (profileStart) { + if (intersectsProfileStart) { sceneInfra.modelingSend({ type: 'CancelSketch' }) } else { await this.setUpDraftSegment( @@ -1229,15 +1342,30 @@ export class SceneEntities { variableDeclarationName: string } }) { - const profileStart = + const intersectsProfileStart = draftInfo && intersects .map(({ object }) => getParentGroup(object, [PROFILE_START])) .find((a) => a?.name === PROFILE_START) - const intersection2d = profileStart - ? new Vector2(profileStart.position.x, profileStart.position.y) + const intersection2d = intersectsProfileStart + ? new Vector2( + intersectsProfileStart.position.x, + intersectsProfileStart.position.y + ) : _intersection2d + const intersectsYAxis = intersects.find( + (sceneObject) => sceneObject.object.name === Y_AXIS + ) + const intersectsXAxis = intersects.find( + (sceneObject) => sceneObject.object.name === X_AXIS + ) + + const snappedPoint = new Vector2( + intersectsYAxis ? 0 : intersection2d.x, + intersectsXAxis ? 0 : intersection2d.y + ) + const group = getParentGroup(object, SEGMENT_BODIES_PLUS_PROFILE_START) const subGroup = getParentGroup(object, [ARROWHEAD, CIRCLE_CENTER_HANDLE]) if (!group) return @@ -1257,7 +1385,7 @@ export class SceneEntities { group.userData.from[0], group.userData.from[1], ] - const dragTo: [number, number] = [intersection2d.x, intersection2d.y] + const dragTo: [number, number] = [snappedPoint.x, snappedPoint.y] let modifiedAst = draftInfo ? draftInfo.truncatedAst : { ...kclManager.ast } const _node = getNodeFromPath>( diff --git a/src/clientSideScene/sceneInfra.ts b/src/clientSideScene/sceneInfra.ts index 5614ab77c..3959d239b 100644 --- a/src/clientSideScene/sceneInfra.ts +++ b/src/clientSideScene/sceneInfra.ts @@ -30,6 +30,7 @@ import { MouseState, SegmentOverlayPayload } from 'machines/modelingMachine' import { getAngle, throttle } from 'lib/utils' import { Themes } from 'lib/theme' import { CSS2DRenderer } from 'three/examples/jsm/renderers/CSS2DRenderer' +import { orthoScale, perspScale } from './helpers' type SendType = ReturnType['send'] @@ -49,6 +50,10 @@ export const RAYCASTABLE_PLANE = 'raycastable-plane' export const X_AXIS = 'xAxis' export const Y_AXIS = 'yAxis' +/** the THREEjs representation of the group surrounding a "snapped" point that is not yet placed */ +export const DRAFT_POINT_GROUP = 'draft-point-group' +/** the THREEjs representation of a "snapped" point that is not yet placed */ +export const DRAFT_POINT = 'draft-point' export const AXIS_GROUP = 'axisGroup' export const SKETCH_GROUP_SEGMENTS = 'sketch-group-segments' export const ARROWHEAD = 'arrowhead' @@ -60,6 +65,11 @@ export interface OnMouseEnterLeaveArgs { selected: Object3D dragSelected?: Object3D mouseEvent: MouseEvent + /** The intersection of the mouse with the THREEjs raycast plane */ + intersectionPoint?: { + twoD?: Vector2 + threeD?: Vector3 + } } interface OnDragCallbackArgs extends OnMouseEnterLeaveArgs { @@ -348,29 +358,42 @@ export class SceneInfra { window.removeEventListener('resize', this.onWindowResize) // Dispose of any other resources like geometries, materials, textures } + getClientSceneScaleFactor(meshOrGroup: Mesh | Group) { + const orthoFactor = orthoScale(this.camControls.camera) + const factor = + (this.camControls.camera instanceof OrthographicCamera + ? orthoFactor + : perspScale(this.camControls.camera, meshOrGroup)) / + this._baseUnitMultiplier + return factor + } getPlaneIntersectPoint = (): { twoD?: Vector2 threeD?: Vector3 intersection: Intersection> } | null => { + // Get the orientations from the camera and mouse position this.planeRaycaster.setFromCamera( this.currentMouseVector, this.camControls.camera ) + // Get the intersection of the ray with the default planes const planeIntersects = this.planeRaycaster.intersectObjects( this.scene.children, true ) - const recastablePlaneIntersect = planeIntersects.find( + if (!planeIntersects.length) return null + + // Find the intersection with the raycastable (or sketch) plane + const raycastablePlaneIntersection = planeIntersects.find( (intersect) => intersect.object.name === RAYCASTABLE_PLANE ) - if (!planeIntersects.length) return null - if (!recastablePlaneIntersect) return { intersection: planeIntersects[0] } - const planePosition = planeIntersects[0].object.position - const inversePlaneQuaternion = planeIntersects[0].object.quaternion - .clone() - .invert() - const intersectPoint = planeIntersects[0].point + if (!raycastablePlaneIntersection) + return { intersection: planeIntersects[0] } + const planePosition = raycastablePlaneIntersection.object.position + const inversePlaneQuaternion = + raycastablePlaneIntersection.object.quaternion.clone().invert() + const intersectPoint = raycastablePlaneIntersection.point let transformedPoint = intersectPoint.clone() if (transformedPoint) { transformedPoint.applyQuaternion(inversePlaneQuaternion) @@ -447,18 +470,26 @@ export class SceneInfra { if (intersects[0]) { const firstIntersectObject = intersects[0].object + const planeIntersectPoint = this.getPlaneIntersectPoint() + const intersectionPoint = { + twoD: planeIntersectPoint?.twoD, + threeD: planeIntersectPoint?.threeD, + } + if (this.hoveredObject !== firstIntersectObject) { const hoveredObj = this.hoveredObject this.hoveredObject = null await this.onMouseLeave({ selected: hoveredObj, mouseEvent: mouseEvent, + intersectionPoint, }) this.hoveredObject = firstIntersectObject await this.onMouseEnter({ selected: this.hoveredObject, dragSelected: this.selected?.object, mouseEvent: mouseEvent, + intersectionPoint, }) if (!this.selected) this.updateMouseState({ diff --git a/src/clientSideScene/segments.ts b/src/clientSideScene/segments.ts index 0758de58e..f2e47e09a 100644 --- a/src/clientSideScene/segments.ts +++ b/src/clientSideScene/segments.ts @@ -45,6 +45,7 @@ import { import { getTangentPointFromPreviousArc } from 'lib/utils2d' import { ARROWHEAD, + DRAFT_POINT, SceneInfra, SEGMENT_LENGTH_LABEL, SEGMENT_LENGTH_LABEL_OFFSET_PX, @@ -686,19 +687,20 @@ class CircleSegment implements SegmentUtils { export function createProfileStartHandle({ from, - id, - pathToNode, + isDraft = false, scale = 1, theme, isSelected, + ...rest }: { from: Coords2d - id: string - pathToNode: PathToNode scale?: number theme: Themes isSelected?: boolean -}) { +} & ( + | { isDraft: true } + | { isDraft: false; id: string; pathToNode: PathToNode } +)) { const group = new Group() const geometry = new BoxGeometry(12, 12, 12) // in pixels scaled later @@ -711,13 +713,12 @@ export function createProfileStartHandle({ group.userData = { type: PROFILE_START, - id, from, - pathToNode, isSelected, baseColor, + ...rest, } - group.name = PROFILE_START + group.name = isDraft ? DRAFT_POINT : PROFILE_START group.position.set(from[0], from[1], 0) group.scale.set(scale, scale, scale) return group diff --git a/src/lang/std/sketchcombos.ts b/src/lang/std/sketchcombos.ts index 21ec43b78..3486502a1 100644 --- a/src/lang/std/sketchcombos.ts +++ b/src/lang/std/sketchcombos.ts @@ -684,6 +684,14 @@ const transformMap: TransformMap = { tag ), }, + xAbs: { + tooltip: 'lineTo', + createNode: setAbsDistanceCreateNode('x'), + }, + yAbs: { + tooltip: 'lineTo', + createNode: setAbsDistanceCreateNode('y'), + }, }, xAbsolute: { equalLength: { From 26951364cfcc8a1a8ca48db19ce1d9e851c0810c Mon Sep 17 00:00:00 2001 From: Adam Chalmers Date: Thu, 31 Oct 2024 11:43:14 -0500 Subject: [PATCH 12/13] KCL: More simulation tests (#4359) Demonstrate simulation tests where we don't care about visuals, e.g. the double-map test. The `just new-sim-test` now accepts an optional argument, `render_to_png` which can be either "true" or "false" (defaults to "true"). Tests like double_map that don't render anything can use false, rather than rendering an empty PNG with nothing in it. This means the [tests under `no_visuals/`](https://github.com/KittyCAD/modeling-app/tree/v0.26.2/src/wasm-lib/tests/executor/inputs/no_visuals) can be entirely replaced by simulation tests. This is much better! For example, I moved `double_map.kcl` from a no_visuals test to a simulation test. Here's the file: ``` fn increment = (i) => { return i + 1 } xs = [0..2] ys = xs |> map(%, increment) |> map(%, increment) ``` Previously the `no_visuals` test just checked that the program ran successfully without panicking. Now the simulation test lets you see the value of `xs` and `ys` and immediately see they're correct. If our map logic changes (for example, we have an off-by-one error and don't apply the `map` to the last element) it'll show up in the program memory snapshot. --- e2e/playwright/projects.spec.ts | 1 - src/wasm-lib/justfile | 4 +- src/wasm-lib/kcl/src/simulation_tests.rs | 62 ++- .../kcl/tests/cube/execution_error.snap.new | 7 - src/wasm-lib/kcl/tests/double_map_fn/ast.snap | 234 +++++++++ .../kcl/tests/double_map_fn/input.kcl | 8 + .../tests/double_map_fn/program_memory.snap | 171 +++++++ .../kcl/tests/double_map_fn/tokens.snap | 369 ++++++++++++++ src/wasm-lib/kcl/tests/helix_ccw/ast.snap | 262 ++++++++++ src/wasm-lib/kcl/tests/helix_ccw/input.kcl | 8 + .../kcl/tests/helix_ccw/program_memory.snap | 151 ++++++ .../kcl/tests/helix_ccw/rendered_model.png | Bin 0 -> 125082 bytes src/wasm-lib/kcl/tests/helix_ccw/tokens.snap | 465 ++++++++++++++++++ src/wasm-lib/kcl/tests/simtest.tmpl | 2 +- .../tests/executor/inputs/helix_ccw.kcl | 4 - .../executor/inputs/no_visuals/double_map.kcl | 6 - src/wasm-lib/tests/executor/main.rs | 8 - src/wasm-lib/tests/executor/no_visuals.rs | 1 - 18 files changed, 1730 insertions(+), 33 deletions(-) delete mode 100644 src/wasm-lib/kcl/tests/cube/execution_error.snap.new create mode 100644 src/wasm-lib/kcl/tests/double_map_fn/ast.snap create mode 100644 src/wasm-lib/kcl/tests/double_map_fn/input.kcl create mode 100644 src/wasm-lib/kcl/tests/double_map_fn/program_memory.snap create mode 100644 src/wasm-lib/kcl/tests/double_map_fn/tokens.snap create mode 100644 src/wasm-lib/kcl/tests/helix_ccw/ast.snap create mode 100644 src/wasm-lib/kcl/tests/helix_ccw/input.kcl create mode 100644 src/wasm-lib/kcl/tests/helix_ccw/program_memory.snap create mode 100644 src/wasm-lib/kcl/tests/helix_ccw/rendered_model.png create mode 100644 src/wasm-lib/kcl/tests/helix_ccw/tokens.snap delete mode 100644 src/wasm-lib/tests/executor/inputs/helix_ccw.kcl delete mode 100644 src/wasm-lib/tests/executor/inputs/no_visuals/double_map.kcl diff --git a/e2e/playwright/projects.spec.ts b/e2e/playwright/projects.spec.ts index a280996c0..e45c173b7 100644 --- a/e2e/playwright/projects.spec.ts +++ b/e2e/playwright/projects.spec.ts @@ -1490,7 +1490,6 @@ test( 'function_sketch.kcl', 'function_sketch_with_position.kcl', 'global-tags.kcl', - 'helix_ccw.kcl', 'helix_defaults.kcl', 'helix_defaults_negative_extrude.kcl', 'helix_with_length.kcl', diff --git a/src/wasm-lib/justfile b/src/wasm-lib/justfile index 752959131..58c6815a3 100644 --- a/src/wasm-lib/justfile +++ b/src/wasm-lib/justfile @@ -13,14 +13,14 @@ redo-kcl-stdlib-docs: EXPECTORATE=overwrite {{cnr}} -p kcl-lib docs::gen_std_tests::test_generate_stdlib # Create a new KCL deterministic simulation test case. -new-sim-test test_name kcl_program: +new-sim-test test_name kcl_program render_to_png="true": # Each test file gets its own directory. This will contain the KCL program, and its # snapshotted artifacts (e.g. serialized tokens, serialized ASTs, program memory, # PNG snapshots, etc). mkdir kcl/tests/{{test_name}} echo "{{kcl_program}}" > kcl/tests/{{test_name}}/input.kcl # Add the various tests for this new test case. - cat kcl/tests/simtest.tmpl | sed "s/TEST_NAME_HERE/{{test_name}}/" >> kcl/src/tests.rs + cat kcl/tests/simtest.tmpl | sed "s/TEST_NAME_HERE/{{test_name}}/" | sed "s/RENDER_TO_PNG/{{render_to_png}}/" >> kcl/src/simulation_tests.rs # Run all the tests for the first time, in the right order. {{cita}} -p kcl-lib -- tests::{{test_name}}::tokenize {{cita}} -p kcl-lib -- tests::{{test_name}}::parse diff --git a/src/wasm-lib/kcl/src/simulation_tests.rs b/src/wasm-lib/kcl/src/simulation_tests.rs index 9a4116937..f9d84f948 100644 --- a/src/wasm-lib/kcl/src/simulation_tests.rs +++ b/src/wasm-lib/kcl/src/simulation_tests.rs @@ -81,7 +81,7 @@ fn unparse(test_name: &str) { ); } -async fn execute(test_name: &str) { +async fn execute(test_name: &str, render_to_png: bool) { // Read the AST from disk. let input = read("ast.snap", test_name); let ast_res: Result, KclError> = get(&input); @@ -93,7 +93,9 @@ async fn execute(test_name: &str) { let exec_res = crate::test_server::execute_and_snapshot_ast(ast, crate::settings::types::UnitLength::Mm).await; match exec_res { Ok((program_memory, png)) => { - twenty_twenty::assert_image(format!("tests/{test_name}/rendered_model.png"), &png, 0.99); + if render_to_png { + twenty_twenty::assert_image(format!("tests/{test_name}/rendered_model.png"), &png, 0.99); + } assert_snapshot(test_name, "Program memory after executing", || { insta::assert_json_snapshot!("program_memory", program_memory); }); @@ -130,6 +132,60 @@ mod cube { /// Test that KCL is executed correctly. #[tokio::test(flavor = "multi_thread")] async fn kcl_test_execute() { - super::execute(TEST_NAME).await + super::execute(TEST_NAME, true).await + } +} +mod helix_ccw { + const TEST_NAME: &str = "helix_ccw"; + + /// Test tokenizing KCL. + #[test] + fn tokenize() { + super::tokenize(TEST_NAME) + } + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod double_map_fn { + const TEST_NAME: &str = "double_map_fn"; + + /// Test tokenizing KCL. + #[test] + fn tokenize() { + super::tokenize(TEST_NAME) + } + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await } } diff --git a/src/wasm-lib/kcl/tests/cube/execution_error.snap.new b/src/wasm-lib/kcl/tests/cube/execution_error.snap.new deleted file mode 100644 index 3765efbd1..000000000 --- a/src/wasm-lib/kcl/tests/cube/execution_error.snap.new +++ /dev/null @@ -1,7 +0,0 @@ ---- -source: kcl/src/simulation_tests.rs -assertion_line: 98 -description: Error from executing cube.kcl -snapshot_kind: text ---- -No API token found in environment variables. Use KITTYCAD_API_TOKEN or ZOO_API_TOKEN diff --git a/src/wasm-lib/kcl/tests/double_map_fn/ast.snap b/src/wasm-lib/kcl/tests/double_map_fn/ast.snap new file mode 100644 index 000000000..b628c8491 --- /dev/null +++ b/src/wasm-lib/kcl/tests/double_map_fn/ast.snap @@ -0,0 +1,234 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing double_map_fn.kcl +snapshot_kind: text +--- +{ + "Ok": { + "body": [ + { + "declarations": [ + { + "end": 40, + "id": { + "end": 12, + "name": "increment", + "start": 3, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "argument": { + "end": 38, + "left": { + "end": 34, + "name": "i", + "start": 33, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 38, + "raw": "1", + "start": 37, + "type": "Literal", + "type": "Literal", + "value": 1 + }, + "start": 33, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 38, + "start": 26, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 40, + "start": 22 + }, + "end": 40, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 17, + "name": "i", + "start": 16, + "type": "Identifier" + }, + "optional": false + } + ], + "start": 15, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 3, + "type": "VariableDeclarator" + } + ], + "end": 40, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declarations": [ + { + "end": 53, + "id": { + "end": 44, + "name": "xs", + "start": 42, + "type": "Identifier" + }, + "init": { + "end": 53, + "endElement": { + "end": 52, + "raw": "2", + "start": 51, + "type": "Literal", + "type": "Literal", + "value": 2 + }, + "endInclusive": true, + "start": 47, + "startElement": { + "end": 49, + "raw": "0", + "start": 48, + "type": "Literal", + "type": "Literal", + "value": 0 + }, + "type": "ArrayRangeExpression", + "type": "ArrayRangeExpression" + }, + "start": 42, + "type": "VariableDeclarator" + } + ], + "end": 53, + "kind": "const", + "start": 42, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declarations": [ + { + "end": 107, + "id": { + "end": 56, + "name": "ys", + "start": 54, + "type": "Identifier" + }, + "init": { + "body": [ + { + "end": 61, + "name": "xs", + "start": 59, + "type": "Identifier", + "type": "Identifier" + }, + { + "arguments": [ + { + "end": 72, + "start": 71, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 83, + "name": "increment", + "start": 74, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 70, + "name": "map", + "start": 67, + "type": "Identifier" + }, + "end": 84, + "optional": false, + "start": 67, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 95, + "start": 94, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 106, + "name": "increment", + "start": 97, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 93, + "name": "map", + "start": 90, + "type": "Identifier" + }, + "end": 107, + "optional": false, + "start": 90, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 107, + "start": 59, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 54, + "type": "VariableDeclarator" + } + ], + "end": 107, + "kind": "const", + "start": 54, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 108, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 42, + "start": 40, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/double_map_fn/input.kcl b/src/wasm-lib/kcl/tests/double_map_fn/input.kcl new file mode 100644 index 000000000..4179c641d --- /dev/null +++ b/src/wasm-lib/kcl/tests/double_map_fn/input.kcl @@ -0,0 +1,8 @@ +fn increment = (i) => { + return i + 1 +} + +xs = [0..2] +ys = xs + |> map(%, increment) + |> map(%, increment) diff --git a/src/wasm-lib/kcl/tests/double_map_fn/program_memory.snap b/src/wasm-lib/kcl/tests/double_map_fn/program_memory.snap new file mode 100644 index 000000000..3e588ea41 --- /dev/null +++ b/src/wasm-lib/kcl/tests/double_map_fn/program_memory.snap @@ -0,0 +1,171 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing double_map_fn.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "UserVal", + "type": "UserVal", + "value": 180, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "UserVal", + "type": "UserVal", + "value": 90, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "UserVal", + "type": "UserVal", + "value": 270, + "__meta": [] + }, + "ZERO": { + "type": "UserVal", + "type": "UserVal", + "value": 0, + "__meta": [] + }, + "increment": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "argument": { + "end": 38, + "left": { + "end": 34, + "name": "i", + "start": 33, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 38, + "raw": "1", + "start": 37, + "type": "Literal", + "type": "Literal", + "value": 1 + }, + "start": 33, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 38, + "start": 26, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 40, + "start": 22 + }, + "end": 40, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 17, + "name": "i", + "start": 16, + "type": "Identifier" + }, + "optional": false + } + ], + "start": 15, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "UserVal", + "type": "UserVal", + "value": 180, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "UserVal", + "type": "UserVal", + "value": 90, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "UserVal", + "type": "UserVal", + "value": 270, + "__meta": [] + }, + "ZERO": { + "type": "UserVal", + "type": "UserVal", + "value": 0, + "__meta": [] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 15, + 40 + ] + } + ] + }, + "xs": { + "type": "UserVal", + "type": "UserVal", + "value": [ + 0, + 1, + 2 + ], + "__meta": [ + { + "sourceRange": [ + 47, + 53 + ] + } + ] + }, + "ys": { + "type": "UserVal", + "type": "UserVal", + "value": [ + 2.0, + 3.0, + 4.0 + ], + "__meta": [ + { + "sourceRange": [ + 90, + 107 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/double_map_fn/tokens.snap b/src/wasm-lib/kcl/tests/double_map_fn/tokens.snap new file mode 100644 index 000000000..fba06a175 --- /dev/null +++ b/src/wasm-lib/kcl/tests/double_map_fn/tokens.snap @@ -0,0 +1,369 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of tokenizing double_map_fn.kcl +snapshot_kind: text +--- +{ + "Ok": [ + { + "type": "keyword", + "start": 0, + "end": 2, + "value": "fn" + }, + { + "type": "whitespace", + "start": 2, + "end": 3, + "value": " " + }, + { + "type": "word", + "start": 3, + "end": 12, + "value": "increment" + }, + { + "type": "whitespace", + "start": 12, + "end": 13, + "value": " " + }, + { + "type": "operator", + "start": 13, + "end": 14, + "value": "=" + }, + { + "type": "whitespace", + "start": 14, + "end": 15, + "value": " " + }, + { + "type": "brace", + "start": 15, + "end": 16, + "value": "(" + }, + { + "type": "word", + "start": 16, + "end": 17, + "value": "i" + }, + { + "type": "brace", + "start": 17, + "end": 18, + "value": ")" + }, + { + "type": "whitespace", + "start": 18, + "end": 19, + "value": " " + }, + { + "type": "operator", + "start": 19, + "end": 21, + "value": "=>" + }, + { + "type": "whitespace", + "start": 21, + "end": 22, + "value": " " + }, + { + "type": "brace", + "start": 22, + "end": 23, + "value": "{" + }, + { + "type": "whitespace", + "start": 23, + "end": 26, + "value": "\n " + }, + { + "type": "keyword", + "start": 26, + "end": 32, + "value": "return" + }, + { + "type": "whitespace", + "start": 32, + "end": 33, + "value": " " + }, + { + "type": "word", + "start": 33, + "end": 34, + "value": "i" + }, + { + "type": "whitespace", + "start": 34, + "end": 35, + "value": " " + }, + { + "type": "operator", + "start": 35, + "end": 36, + "value": "+" + }, + { + "type": "whitespace", + "start": 36, + "end": 37, + "value": " " + }, + { + "type": "number", + "start": 37, + "end": 38, + "value": "1" + }, + { + "type": "whitespace", + "start": 38, + "end": 39, + "value": "\n" + }, + { + "type": "brace", + "start": 39, + "end": 40, + "value": "}" + }, + { + "type": "whitespace", + "start": 40, + "end": 42, + "value": "\n\n" + }, + { + "type": "word", + "start": 42, + "end": 44, + "value": "xs" + }, + { + "type": "whitespace", + "start": 44, + "end": 45, + "value": " " + }, + { + "type": "operator", + "start": 45, + "end": 46, + "value": "=" + }, + { + "type": "whitespace", + "start": 46, + "end": 47, + "value": " " + }, + { + "type": "brace", + "start": 47, + "end": 48, + "value": "[" + }, + { + "type": "number", + "start": 48, + "end": 49, + "value": "0" + }, + { + "type": "doublePeriod", + "start": 49, + "end": 51, + "value": ".." + }, + { + "type": "number", + "start": 51, + "end": 52, + "value": "2" + }, + { + "type": "brace", + "start": 52, + "end": 53, + "value": "]" + }, + { + "type": "whitespace", + "start": 53, + "end": 54, + "value": "\n" + }, + { + "type": "word", + "start": 54, + "end": 56, + "value": "ys" + }, + { + "type": "whitespace", + "start": 56, + "end": 57, + "value": " " + }, + { + "type": "operator", + "start": 57, + "end": 58, + "value": "=" + }, + { + "type": "whitespace", + "start": 58, + "end": 59, + "value": " " + }, + { + "type": "word", + "start": 59, + "end": 61, + "value": "xs" + }, + { + "type": "whitespace", + "start": 61, + "end": 64, + "value": "\n " + }, + { + "type": "operator", + "start": 64, + "end": 66, + "value": "|>" + }, + { + "type": "whitespace", + "start": 66, + "end": 67, + "value": " " + }, + { + "type": "word", + "start": 67, + "end": 70, + "value": "map" + }, + { + "type": "brace", + "start": 70, + "end": 71, + "value": "(" + }, + { + "type": "operator", + "start": 71, + "end": 72, + "value": "%" + }, + { + "type": "comma", + "start": 72, + "end": 73, + "value": "," + }, + { + "type": "whitespace", + "start": 73, + "end": 74, + "value": " " + }, + { + "type": "word", + "start": 74, + "end": 83, + "value": "increment" + }, + { + "type": "brace", + "start": 83, + "end": 84, + "value": ")" + }, + { + "type": "whitespace", + "start": 84, + "end": 87, + "value": "\n " + }, + { + "type": "operator", + "start": 87, + "end": 89, + "value": "|>" + }, + { + "type": "whitespace", + "start": 89, + "end": 90, + "value": " " + }, + { + "type": "word", + "start": 90, + "end": 93, + "value": "map" + }, + { + "type": "brace", + "start": 93, + "end": 94, + "value": "(" + }, + { + "type": "operator", + "start": 94, + "end": 95, + "value": "%" + }, + { + "type": "comma", + "start": 95, + "end": 96, + "value": "," + }, + { + "type": "whitespace", + "start": 96, + "end": 97, + "value": " " + }, + { + "type": "word", + "start": 97, + "end": 106, + "value": "increment" + }, + { + "type": "brace", + "start": 106, + "end": 107, + "value": ")" + }, + { + "type": "whitespace", + "start": 107, + "end": 108, + "value": "\n" + } + ] +} diff --git a/src/wasm-lib/kcl/tests/helix_ccw/ast.snap b/src/wasm-lib/kcl/tests/helix_ccw/ast.snap new file mode 100644 index 000000000..b54c1d1e6 --- /dev/null +++ b/src/wasm-lib/kcl/tests/helix_ccw/ast.snap @@ -0,0 +1,262 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing helix_ccw.kcl +snapshot_kind: text +--- +{ + "Ok": { + "body": [ + { + "declarations": [ + { + "end": 183, + "id": { + "end": 7, + "name": "part001", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 28, + "raw": "'XY'", + "start": 24, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 23, + "name": "startSketchOn", + "start": 10, + "type": "Identifier" + }, + "end": 29, + "optional": false, + "start": 10, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 72, + "properties": [ + { + "end": 58, + "key": { + "end": 50, + "name": "center", + "start": 44, + "type": "Identifier" + }, + "start": 44, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 54, + "raw": "5", + "start": 53, + "type": "Literal", + "type": "Literal", + "value": 5 + }, + { + "end": 57, + "raw": "5", + "start": 56, + "type": "Literal", + "type": "Literal", + "value": 5 + } + ], + "end": 58, + "start": 52, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "end": 70, + "key": { + "end": 66, + "name": "radius", + "start": 60, + "type": "Identifier" + }, + "start": 60, + "type": "ObjectProperty", + "value": { + "end": 70, + "raw": "10", + "start": 68, + "type": "Literal", + "type": "Literal", + "value": 10 + } + } + ], + "start": 42, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 75, + "start": 74, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 41, + "name": "circle", + "start": 35, + "type": "Identifier" + }, + "end": 76, + "optional": false, + "start": 35, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 92, + "raw": "10", + "start": 90, + "type": "Literal", + "type": "Literal", + "value": 10 + }, + { + "end": 95, + "start": 94, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 89, + "name": "extrude", + "start": 82, + "type": "Identifier" + }, + "end": 96, + "optional": false, + "start": 82, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 179, + "properties": [ + { + "end": 132, + "key": { + "end": 128, + "name": "revolutions", + "start": 117, + "type": "Identifier" + }, + "start": 117, + "type": "ObjectProperty", + "value": { + "end": 132, + "raw": "16", + "start": 130, + "type": "Literal", + "type": "Literal", + "value": 16 + } + }, + { + "end": 154, + "key": { + "end": 151, + "name": "angleStart", + "start": 141, + "type": "Identifier" + }, + "start": 141, + "type": "ObjectProperty", + "value": { + "end": 154, + "raw": "0", + "start": 153, + "type": "Literal", + "type": "Literal", + "value": 0 + } + }, + { + "end": 172, + "key": { + "end": 166, + "name": "ccw", + "start": 163, + "type": "Identifier" + }, + "start": 163, + "type": "ObjectProperty", + "value": { + "end": 172, + "raw": "true", + "start": 168, + "type": "Literal", + "type": "Literal", + "value": true + } + } + ], + "start": 108, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 182, + "start": 181, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 107, + "name": "helix", + "start": 102, + "type": "Identifier" + }, + "end": 183, + "optional": false, + "start": 102, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 183, + "start": 10, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + } + ], + "end": 183, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 184, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/helix_ccw/input.kcl b/src/wasm-lib/kcl/tests/helix_ccw/input.kcl new file mode 100644 index 000000000..2c6a03c31 --- /dev/null +++ b/src/wasm-lib/kcl/tests/helix_ccw/input.kcl @@ -0,0 +1,8 @@ +part001 = startSketchOn('XY') + |> circle({ center: [5, 5], radius: 10 }, %) + |> extrude(10, %) + |> helix({ + revolutions: 16, + angleStart: 0, + ccw: true + }, %) diff --git a/src/wasm-lib/kcl/tests/helix_ccw/program_memory.snap b/src/wasm-lib/kcl/tests/helix_ccw/program_memory.snap new file mode 100644 index 000000000..3d55ba52a --- /dev/null +++ b/src/wasm-lib/kcl/tests/helix_ccw/program_memory.snap @@ -0,0 +1,151 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing helix_ccw.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "UserVal", + "type": "UserVal", + "value": 180, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "UserVal", + "type": "UserVal", + "value": 90, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "UserVal", + "type": "UserVal", + "value": 270, + "__meta": [] + }, + "ZERO": { + "type": "UserVal", + "type": "UserVal", + "value": 0, + "__meta": [] + }, + "part001": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 35, + 76 + ], + "tag": null, + "type": "extrudeArc" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35, + 76 + ] + }, + "ccw": true, + "center": [ + 5.0, + 5.0 + ], + "from": [ + 5.0, + 5.0 + ], + "radius": 10.0, + "tag": null, + "to": [ + 5.0, + 5.0 + ], + "type": "Circle" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 15.0, + 5.0 + ], + "to": [ + 15.0, + 5.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35, + 76 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 35, + 76 + ] + } + ] + }, + "height": 10.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 35, + 76 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/helix_ccw/rendered_model.png b/src/wasm-lib/kcl/tests/helix_ccw/rendered_model.png new file mode 100644 index 0000000000000000000000000000000000000000..10e6d789ebe9e748d5c0af37c408257ace56ab2c GIT binary patch literal 125082 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 P!cSSr^TiztRy6$!h1RjO literal 0 HcmV?d00001 diff --git a/src/wasm-lib/kcl/tests/helix_ccw/tokens.snap b/src/wasm-lib/kcl/tests/helix_ccw/tokens.snap new file mode 100644 index 000000000..e5568a45c --- /dev/null +++ b/src/wasm-lib/kcl/tests/helix_ccw/tokens.snap @@ -0,0 +1,465 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of tokenizing helix_ccw.kcl +snapshot_kind: text +--- +{ + "Ok": [ + { + "type": "word", + "start": 0, + "end": 7, + "value": "part001" + }, + { + "type": "whitespace", + "start": 7, + "end": 8, + "value": " " + }, + { + "type": "operator", + "start": 8, + "end": 9, + "value": "=" + }, + { + "type": "whitespace", + "start": 9, + "end": 10, + "value": " " + }, + { + "type": "word", + "start": 10, + "end": 23, + "value": "startSketchOn" + }, + { + "type": "brace", + "start": 23, + "end": 24, + "value": "(" + }, + { + "type": "string", + "start": 24, + "end": 28, + "value": "'XY'" + }, + { + "type": "brace", + "start": 28, + "end": 29, + "value": ")" + }, + { + "type": "whitespace", + "start": 29, + "end": 32, + "value": "\n " + }, + { + "type": "operator", + "start": 32, + "end": 34, + "value": "|>" + }, + { + "type": "whitespace", + "start": 34, + "end": 35, + "value": " " + }, + { + "type": "word", + "start": 35, + "end": 41, + "value": "circle" + }, + { + "type": "brace", + "start": 41, + "end": 42, + "value": "(" + }, + { + "type": "brace", + "start": 42, + "end": 43, + "value": "{" + }, + { + "type": "whitespace", + "start": 43, + "end": 44, + "value": " " + }, + { + "type": "word", + "start": 44, + "end": 50, + "value": "center" + }, + { + "type": "colon", + "start": 50, + "end": 51, + "value": ":" + }, + { + "type": "whitespace", + "start": 51, + "end": 52, + "value": " " + }, + { + "type": "brace", + "start": 52, + "end": 53, + "value": "[" + }, + { + "type": "number", + "start": 53, + "end": 54, + "value": "5" + }, + { + "type": "comma", + "start": 54, + "end": 55, + "value": "," + }, + { + "type": "whitespace", + "start": 55, + "end": 56, + "value": " " + }, + { + "type": "number", + "start": 56, + "end": 57, + "value": "5" + }, + { + "type": "brace", + "start": 57, + "end": 58, + "value": "]" + }, + { + "type": "comma", + "start": 58, + "end": 59, + "value": "," + }, + { + "type": "whitespace", + "start": 59, + "end": 60, + "value": " " + }, + { + "type": "word", + "start": 60, + "end": 66, + "value": "radius" + }, + { + "type": "colon", + "start": 66, + "end": 67, + "value": ":" + }, + { + "type": "whitespace", + "start": 67, + "end": 68, + "value": " " + }, + { + "type": "number", + "start": 68, + "end": 70, + "value": "10" + }, + { + "type": "whitespace", + "start": 70, + "end": 71, + "value": " " + }, + { + "type": "brace", + "start": 71, + "end": 72, + "value": "}" + }, + { + "type": "comma", + "start": 72, + "end": 73, + "value": "," + }, + { + "type": "whitespace", + "start": 73, + "end": 74, + "value": " " + }, + { + "type": "operator", + "start": 74, + "end": 75, + "value": "%" + }, + { + "type": "brace", + "start": 75, + "end": 76, + "value": ")" + }, + { + "type": "whitespace", + "start": 76, + "end": 79, + "value": "\n " + }, + { + "type": "operator", + "start": 79, + "end": 81, + "value": "|>" + }, + { + "type": "whitespace", + "start": 81, + "end": 82, + "value": " " + }, + { + "type": "word", + "start": 82, + "end": 89, + "value": "extrude" + }, + { + "type": "brace", + "start": 89, + "end": 90, + "value": "(" + }, + { + "type": "number", + "start": 90, + "end": 92, + "value": "10" + }, + { + "type": "comma", + "start": 92, + "end": 93, + "value": "," + }, + { + "type": "whitespace", + "start": 93, + "end": 94, + "value": " " + }, + { + "type": "operator", + "start": 94, + "end": 95, + "value": "%" + }, + { + "type": "brace", + "start": 95, + "end": 96, + "value": ")" + }, + { + "type": "whitespace", + "start": 96, + "end": 99, + "value": "\n " + }, + { + "type": "operator", + "start": 99, + "end": 101, + "value": "|>" + }, + { + "type": "whitespace", + "start": 101, + "end": 102, + "value": " " + }, + { + "type": "word", + "start": 102, + "end": 107, + "value": "helix" + }, + { + "type": "brace", + "start": 107, + "end": 108, + "value": "(" + }, + { + "type": "brace", + "start": 108, + "end": 109, + "value": "{" + }, + { + "type": "whitespace", + "start": 109, + "end": 117, + "value": "\n " + }, + { + "type": "word", + "start": 117, + "end": 128, + "value": "revolutions" + }, + { + "type": "colon", + "start": 128, + "end": 129, + "value": ":" + }, + { + "type": "whitespace", + "start": 129, + "end": 130, + "value": " " + }, + { + "type": "number", + "start": 130, + "end": 132, + "value": "16" + }, + { + "type": "comma", + "start": 132, + "end": 133, + "value": "," + }, + { + "type": "whitespace", + "start": 133, + "end": 141, + "value": "\n " + }, + { + "type": "word", + "start": 141, + "end": 151, + "value": "angleStart" + }, + { + "type": "colon", + "start": 151, + "end": 152, + "value": ":" + }, + { + "type": "whitespace", + "start": 152, + "end": 153, + "value": " " + }, + { + "type": "number", + "start": 153, + "end": 154, + "value": "0" + }, + { + "type": "comma", + "start": 154, + "end": 155, + "value": "," + }, + { + "type": "whitespace", + "start": 155, + "end": 163, + "value": "\n " + }, + { + "type": "word", + "start": 163, + "end": 166, + "value": "ccw" + }, + { + "type": "colon", + "start": 166, + "end": 167, + "value": ":" + }, + { + "type": "whitespace", + "start": 167, + "end": 168, + "value": " " + }, + { + "type": "keyword", + "start": 168, + "end": 172, + "value": "true" + }, + { + "type": "whitespace", + "start": 172, + "end": 178, + "value": "\n " + }, + { + "type": "brace", + "start": 178, + "end": 179, + "value": "}" + }, + { + "type": "comma", + "start": 179, + "end": 180, + "value": "," + }, + { + "type": "whitespace", + "start": 180, + "end": 181, + "value": " " + }, + { + "type": "operator", + "start": 181, + "end": 182, + "value": "%" + }, + { + "type": "brace", + "start": 182, + "end": 183, + "value": ")" + }, + { + "type": "whitespace", + "start": 183, + "end": 184, + "value": "\n" + } + ] +} diff --git a/src/wasm-lib/kcl/tests/simtest.tmpl b/src/wasm-lib/kcl/tests/simtest.tmpl index 785cba1d7..a47690b98 100644 --- a/src/wasm-lib/kcl/tests/simtest.tmpl +++ b/src/wasm-lib/kcl/tests/simtest.tmpl @@ -22,6 +22,6 @@ mod TEST_NAME_HERE { /// Test that KCL is executed correctly. #[tokio::test(flavor = "multi_thread")] async fn kcl_test_execute() { - super::execute(TEST_NAME).await + super::execute(TEST_NAME, RENDER_TO_PNG).await } } diff --git a/src/wasm-lib/tests/executor/inputs/helix_ccw.kcl b/src/wasm-lib/tests/executor/inputs/helix_ccw.kcl deleted file mode 100644 index 76f31c6df..000000000 --- a/src/wasm-lib/tests/executor/inputs/helix_ccw.kcl +++ /dev/null @@ -1,4 +0,0 @@ -const part001 = startSketchOn('XY') - |> circle({ center: [5, 5], radius: 10 }, %) - |> extrude(10, %) - |> helix({revolutions: 16, angle_start: 0, ccw: true}, %) diff --git a/src/wasm-lib/tests/executor/inputs/no_visuals/double_map.kcl b/src/wasm-lib/tests/executor/inputs/no_visuals/double_map.kcl deleted file mode 100644 index 93f9d7711..000000000 --- a/src/wasm-lib/tests/executor/inputs/no_visuals/double_map.kcl +++ /dev/null @@ -1,6 +0,0 @@ -fn increment = (i) => { return i + 1 } - -xs = [0..2] -ys = xs -|> map(%, increment) -|> map(%, increment) diff --git a/src/wasm-lib/tests/executor/main.rs b/src/wasm-lib/tests/executor/main.rs index 986fc8e09..5e46ce084 100644 --- a/src/wasm-lib/tests/executor/main.rs +++ b/src/wasm-lib/tests/executor/main.rs @@ -153,14 +153,6 @@ async fn kcl_test_helix_defaults_negative_extrude() { assert_out("helix_defaults_negative_extrude", &result); } -#[tokio::test(flavor = "multi_thread")] -async fn kcl_test_helix_ccw() { - let code = kcl_input!("helix_ccw"); - - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); - assert_out("helix_ccw", &result); -} - #[tokio::test(flavor = "multi_thread")] async fn kcl_test_helix_with_length() { let code = kcl_input!("helix_with_length"); diff --git a/src/wasm-lib/tests/executor/no_visuals.rs b/src/wasm-lib/tests/executor/no_visuals.rs index 1a5bb6056..034bc6032 100644 --- a/src/wasm-lib/tests/executor/no_visuals.rs +++ b/src/wasm-lib/tests/executor/no_visuals.rs @@ -172,7 +172,6 @@ gen_test_parse_fail!( // "syntax: Can import only import at the top level" // ); gen_test!(add_lots); -gen_test!(double_map); gen_test!(array_elem_push); gen_test_fail!( array_elem_push_fail, From ad1cd56891bc78c4554129350416e092b8c452c8 Mon Sep 17 00:00:00 2001 From: 49fl Date: Thu, 31 Oct 2024 21:42:52 -0400 Subject: [PATCH 13/13] Deflake project settings override on desktop (#4370) --- e2e/playwright/testing-settings.spec.ts | 4 +-- src/components/FileTree.tsx | 33 ++++++++++++++----------- src/components/SettingsAuthProvider.tsx | 12 ++++++--- src/editor/plugins/lsp/kcl/index.ts | 6 ++--- src/hooks/useRefreshSettings.ts | 1 + src/lang/KclSingleton.ts | 8 ++---- src/lang/codeManager.ts | 18 ++++++++++---- src/lib/settings/settingsUtils.ts | 1 + 8 files changed, 49 insertions(+), 34 deletions(-) diff --git a/e2e/playwright/testing-settings.spec.ts b/e2e/playwright/testing-settings.spec.ts index ccf8837f7..40c0fa6f3 100644 --- a/e2e/playwright/testing-settings.spec.ts +++ b/e2e/playwright/testing-settings.spec.ts @@ -318,6 +318,7 @@ test.describe('Testing settings', () => { timeout: 5_000, }) .toContain(`themeColor = "${userThemeColor}"`) + // Only close the button after we've confirmed }) await test.step('Set project theme color', async () => { @@ -344,14 +345,13 @@ test.describe('Testing settings', () => { await test.step('Refresh the application and see project setting applied', async () => { // Make sure we're done navigating before we reload await expect(settingsCloseButton).not.toBeVisible() - await page.reload({ waitUntil: 'domcontentloaded' }) + await page.reload({ waitUntil: 'domcontentloaded' }) await expect(logoLink).toHaveCSS('--primary-hue', projectThemeColor) }) await test.step(`Navigate back to the home view and see user setting applied`, async () => { await logoLink.click() - await page.screenshot({ path: 'out.png' }) await expect(logoLink).toHaveCSS('--primary-hue', userThemeColor) }) diff --git a/src/components/FileTree.tsx b/src/components/FileTree.tsx index 1e534bdb6..70610549e 100644 --- a/src/components/FileTree.tsx +++ b/src/components/FileTree.tsx @@ -138,15 +138,15 @@ const FileTreeItem = ({ // the ReactNodes are destroyed, so is this listener :) useFileSystemWatcher( async (eventType, path) => { + // Prevents a cyclic read / write causing editor problems such as + // misplaced cursor positions. + if (codeManager.writeCausedByAppCheckedInFileTreeFileSystemWatcher) { + codeManager.writeCausedByAppCheckedInFileTreeFileSystemWatcher = false + return + } + // Don't try to read a file that was removed. if (isCurrentFile && eventType !== 'unlink') { - // Prevents a cyclic read / write causing editor problems such as - // misplaced cursor positions. - if (codeManager.writeCausedByAppCheckedInFileTreeFileSystemWatcher) { - codeManager.writeCausedByAppCheckedInFileTreeFileSystemWatcher = false - return - } - let code = await window.electron.readFile(path, { encoding: 'utf-8' }) code = normalizeLineEndings(code) codeManager.updateCodeStateEditor(code) @@ -194,11 +194,11 @@ const FileTreeItem = ({ // Show the renaming form addCurrentItemToRenaming() } else if (e.code === 'Space') { - handleClick() + void handleClick() } } - function handleClick() { + async function handleClick() { if (fileOrDir.children !== null) return // Don't open directories if (fileOrDir.name?.endsWith(FILE_EXT) === false && project?.path) { @@ -208,12 +208,10 @@ const FileTreeItem = ({ `import("${fileOrDir.path.replace(project.path, '.')}")\n` + codeManager.code ) - // eslint-disable-next-line @typescript-eslint/no-floating-promises - codeManager.writeToFile() + await codeManager.writeToFile() // Prevent seeing the model built one piece at a time when changing files - // eslint-disable-next-line @typescript-eslint/no-floating-promises - kclManager.executeCode(true) + await kclManager.executeCode(true) } else { // Let the lsp servers know we closed a file. onFileClose(currentFile?.path || null, project?.path || null) @@ -242,7 +240,7 @@ const FileTreeItem = ({ style={{ paddingInlineStart: getIndentationCSS(level) }} onClick={(e) => { e.currentTarget.focus() - handleClick() + void handleClick() }} onKeyUp={handleKeyUp} > @@ -501,6 +499,13 @@ export const FileTreeInner = ({ const isCurrentFile = loaderData.file?.path === path const hasChanged = eventType === 'change' if (isCurrentFile && hasChanged) return + + // If it's a settings file we wrote to already from the app ignore it. + if (codeManager.writeCausedByAppCheckedInFileTreeFileSystemWatcher) { + codeManager.writeCausedByAppCheckedInFileTreeFileSystemWatcher = false + return + } + fileSend({ type: 'Refresh' }) }, [loaderData?.project?.path, fileContext.selectedDirectory.path].filter( diff --git a/src/components/SettingsAuthProvider.tsx b/src/components/SettingsAuthProvider.tsx index 95727f496..b26d0dfee 100644 --- a/src/components/SettingsAuthProvider.tsx +++ b/src/components/SettingsAuthProvider.tsx @@ -41,6 +41,7 @@ import { reportRejection } from 'lib/trap' import { getAppSettingsFilePath } from 'lib/desktop' import { isDesktop } from 'lib/isDesktop' import { useFileSystemWatcher } from 'hooks/useFileSystemWatcher' +import { codeManager } from 'lib/singletons' type MachineContext = { state: StateFrom @@ -200,13 +201,13 @@ export const SettingsAuthProviderBase = ({ console.error('Error executing AST after settings change', e) } }, - persistSettings: ({ context, event }) => { + async persistSettings({ context, event }) { // Without this, when a user changes the file, it'd // create a detection loop with the file-system watcher. if (event.doNotPersist) return - // eslint-disable-next-line @typescript-eslint/no-floating-promises - saveSettings(context, loadedProject?.project?.path) + codeManager.writeCausedByAppCheckedInFileTreeFileSystemWatcher = true + return saveSettings(context, loadedProject?.project?.path) }, }, }), @@ -220,7 +221,7 @@ export const SettingsAuthProviderBase = ({ }, []) useFileSystemWatcher( - async () => { + async (eventType: string) => { // If there is a projectPath but it no longer exists it means // it was exterally removed. If we let the code past this condition // execute it will recreate the directory due to code in @@ -234,6 +235,9 @@ export const SettingsAuthProviderBase = ({ } } + // Only reload if there are changes. Ignore everything else. + if (eventType !== 'change') return + const data = await loadAndValidateSettings(loadedProject?.project?.path) settingsSend({ type: 'Set all settings', diff --git a/src/editor/plugins/lsp/kcl/index.ts b/src/editor/plugins/lsp/kcl/index.ts index 42de1a5b2..205397b79 100644 --- a/src/editor/plugins/lsp/kcl/index.ts +++ b/src/editor/plugins/lsp/kcl/index.ts @@ -96,10 +96,10 @@ export class KclPlugin implements PluginValue { const newCode = viewUpdate.state.doc.toString() codeManager.code = newCode - // eslint-disable-next-line @typescript-eslint/no-floating-promises - codeManager.writeToFile() - this.scheduleUpdateDoc() + void codeManager.writeToFile().then(() => { + this.scheduleUpdateDoc() + }) } scheduleUpdateDoc() { diff --git a/src/hooks/useRefreshSettings.ts b/src/hooks/useRefreshSettings.ts index 6c1447b7b..da7c440d2 100644 --- a/src/hooks/useRefreshSettings.ts +++ b/src/hooks/useRefreshSettings.ts @@ -26,6 +26,7 @@ export function useRefreshSettings(routeId: string = PATHS.INDEX) { ctx.settings.send({ type: 'Set all settings', settings: routeData, + doNotPersist: true, }) }, []) } diff --git a/src/lang/KclSingleton.ts b/src/lang/KclSingleton.ts index 4020b3e8d..ccde51f88 100644 --- a/src/lang/KclSingleton.ts +++ b/src/lang/KclSingleton.ts @@ -429,13 +429,9 @@ export class KclManager { // Update the code state and the editor. codeManager.updateCodeStateEditor(code) - // Write back to the file system. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - codeManager.writeToFile() - // execute the code. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.executeCode() + // Write back to the file system. + void codeManager.writeToFile().then(() => this.executeCode()) } // There's overlapping responsibility between updateAst and executeAst. // updateAst was added as it was used a lot before xState migration so makes the port easier. diff --git a/src/lang/codeManager.ts b/src/lang/codeManager.ts index 5fdb72b32..476c5ba36 100644 --- a/src/lang/codeManager.ts +++ b/src/lang/codeManager.ts @@ -121,20 +121,28 @@ export default class CodeManager { // Only write our buffer contents to file once per second. Any faster // and file-system watchers which read, will receive empty data during // writes. + clearTimeout(this.timeoutWriter) this.writeCausedByAppCheckedInFileTreeFileSystemWatcher = true - this.timeoutWriter = setTimeout(() => { - // Wait one event loop to give a chance for params to be set - // Save the file to disk - this._currentFilePath && + + return new Promise((resolve, reject) => { + this.timeoutWriter = setTimeout(() => { + if (!this._currentFilePath) + return reject(new Error('currentFilePath not set')) + + // Wait one event loop to give a chance for params to be set + // Save the file to disk window.electron .writeFile(this._currentFilePath, this.code ?? '') + .then(resolve) .catch((err: Error) => { // TODO: add tracing per GH issue #254 (https://github.com/KittyCAD/modeling-app/issues/254) console.error('error saving file', err) toast.error('Error saving file, please check file permissions') + reject(err) }) - }, 1000) + }, 1000) + }) } else { safeLSSetItem(PERSIST_CODE_KEY, this.code) } diff --git a/src/lib/settings/settingsUtils.ts b/src/lib/settings/settingsUtils.ts index 283301ace..f9ab5ad32 100644 --- a/src/lib/settings/settingsUtils.ts +++ b/src/lib/settings/settingsUtils.ts @@ -178,6 +178,7 @@ export async function loadAndValidateSettings( if (err(appSettingsPayload)) return Promise.reject(appSettingsPayload) let settingsNext = createSettings() + // Because getting the default directory is async, we need to set it after if (onDesktop) { settings.app.projectDirectory.default = await getInitialDefaultDir()