From df808b3e5876abcfa938a1770ec34af3e417b9b6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Jun 2025 13:33:09 -0400 Subject: [PATCH 1/8] Bump google-github-actions/auth from 2.1.8 to 2.1.10 in the patch group across 1 directory (#6566) Bump google-github-actions/auth in the patch group across 1 directory Bumps the patch group with 1 update in the / directory: [google-github-actions/auth](https://github.com/google-github-actions/auth). Updates `google-github-actions/auth` from 2.1.8 to 2.1.10 - [Release notes](https://github.com/google-github-actions/auth/releases) - [Changelog](https://github.com/google-github-actions/auth/blob/main/CHANGELOG.md) - [Commits](https://github.com/google-github-actions/auth/compare/v2.1.8...v2.1.10) --- updated-dependencies: - dependency-name: google-github-actions/auth dependency-version: 2.1.10 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Pierre Jacquier --- .github/workflows/build-apps.yml | 2 +- .github/workflows/kcl-language-server.yml | 2 +- .github/workflows/publish-apps-release.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-apps.yml b/.github/workflows/build-apps.yml index f9f1a82f2..839ec313f 100644 --- a/.github/workflows/build-apps.yml +++ b/.github/workflows/build-apps.yml @@ -362,7 +362,7 @@ jobs: - name: Authenticate to Google Cloud if: ${{ env.IS_STAGING == 'true' }} - uses: 'google-github-actions/auth@v2.1.8' + uses: 'google-github-actions/auth@v2.1.10' with: credentials_json: '${{ secrets.GOOGLE_CLOUD_DL_SA }}' diff --git a/.github/workflows/kcl-language-server.yml b/.github/workflows/kcl-language-server.yml index 43d48f3fa..90b7ae2a9 100644 --- a/.github/workflows/kcl-language-server.yml +++ b/.github/workflows/kcl-language-server.yml @@ -328,7 +328,7 @@ jobs: mkdir -p releases/language-server/${{ env.TAG }} cp -r build/* releases/language-server/${{ env.TAG }} - name: "Authenticate to Google Cloud" - uses: "google-github-actions/auth@v2.1.8" + uses: "google-github-actions/auth@v2.1.10" with: credentials_json: "${{ secrets.GOOGLE_CLOUD_DL_SA }}" - name: Set up Cloud SDK diff --git a/.github/workflows/publish-apps-release.yml b/.github/workflows/publish-apps-release.yml index 8c6ec1e81..e75144b7d 100644 --- a/.github/workflows/publish-apps-release.yml +++ b/.github/workflows/publish-apps-release.yml @@ -108,7 +108,7 @@ jobs: run: npm run files:set-notes - name: Authenticate to Google Cloud - uses: 'google-github-actions/auth@v2.1.8' + uses: 'google-github-actions/auth@v2.1.10' with: credentials_json: '${{ secrets.GOOGLE_CLOUD_DL_SA }}' From 344fb6f84dec40584961d1aac3a7ffbcc04a73fa Mon Sep 17 00:00:00 2001 From: Pierre Jacquier Date: Thu, 26 Jun 2025 14:12:36 -0400 Subject: [PATCH 2/8] Hide Helix arguments that should have been hidden, plus other flow fixes (#7606) * Make sure mode-related args are hidden in point-and-click commands after option args change Fixes #7589 * WIP improving helix flows and fixing tests * Fix 2 more tests * Add test step for opt arg * Fix last helix test * Clean up tests, hope to fix CI --- e2e/playwright/point-click.spec.ts | 484 ++++++++++-------- src/lang/modifyAst.ts | 7 +- .../modelingCommandConfig.ts | 43 +- 3 files changed, 287 insertions(+), 247 deletions(-) diff --git a/e2e/playwright/point-click.spec.ts b/e2e/playwright/point-click.spec.ts index 9841ce3bf..780269cd6 100644 --- a/e2e/playwright/point-click.spec.ts +++ b/e2e/playwright/point-click.spec.ts @@ -7,6 +7,7 @@ import type { SceneFixture } from '@e2e/playwright/fixtures/sceneFixture' import type { ToolbarFixture } from '@e2e/playwright/fixtures/toolbarFixture' import { expect, test } from '@e2e/playwright/zoo-test' import { bracket } from '@e2e/playwright/fixtures/bracket' +import type { CmdBarSerialised } from '@e2e/playwright/fixtures/cmdBarFixture' // test file is for testing point an click code gen functionality that's not sketch mode related @@ -1141,6 +1142,20 @@ openSketch = startSketchOn(XY) }) }) + const initialCmdBarStateHelix: CmdBarSerialised = { + stage: 'arguments', + currentArgKey: 'mode', + currentArgValue: '', + headerArguments: { + Mode: '', + AngleStart: '', + Revolutions: '', + Radius: '', + }, + highlightedHeaderArg: 'mode', + commandName: 'Helix', + } + test('Helix point-and-click on default axis', async ({ context, page, @@ -1150,30 +1165,14 @@ openSketch = startSketchOn(XY) toolbar, cmdBar, }) => { - // One dumb hardcoded screen pixel value - const testPoint = { x: 620, y: 257 } - const expectedOutput = `helix001 = helix( axis = X, radius = 5, length = 5, revolutions = 1, angleStart = 270, ccw = false,)` + const expectedOutput = `helix001 = helix( axis = X, radius = 5, length = 5, revolutions = 1, angleStart = 270,)` const expectedLine = `axis=X,` - await homePage.goToModelingScene() await scene.connectionEstablished() await test.step(`Go through the command bar flow`, async () => { await toolbar.helixButton.click() - await cmdBar.expectState({ - stage: 'arguments', - currentArgKey: 'mode', - currentArgValue: '', - headerArguments: { - Mode: '', - AngleStart: '', - Revolutions: '', - Radius: '', - CounterClockWise: '', - }, - highlightedHeaderArg: 'mode', - commandName: 'Helix', - }) + await cmdBar.expectState(initialCmdBarStateHelix) await cmdBar.progressCmdBar() await expect.poll(() => page.getByText('Axis').count()).toBe(6) await cmdBar.progressCmdBar() @@ -1190,7 +1189,6 @@ openSketch = startSketchOn(XY) AngleStart: '', Length: '', Radius: '', - CounterClockWise: '', }, commandName: 'Helix', }) @@ -1207,11 +1205,10 @@ openSketch = startSketchOn(XY) Revolutions: '1', Length: '5', Radius: '5', - CounterClockWise: '', }, commandName: 'Helix', }) - await cmdBar.progressCmdBar() + await cmdBar.submit() }) await test.step(`Confirm code is added to the editor, scene has changed`, async () => { @@ -1221,8 +1218,6 @@ openSketch = startSketchOn(XY) activeLines: [expectedLine], highlightedCode: '', }) - // Red plane is now gone, white helix is there - await scene.expectPixelColor([250, 250, 250], testPoint, 15) }) await test.step(`Edit helix through the feature tree`, async () => { @@ -1234,21 +1229,18 @@ openSketch = startSketchOn(XY) await cmdBar.expectState({ commandName: 'Helix', stage: 'arguments', - currentArgKey: 'CounterClockWise', - currentArgValue: '', + currentArgKey: 'length', + currentArgValue: '5', headerArguments: { Axis: 'X', AngleStart: '270', Revolutions: '1', Radius: '5', Length: initialInput, - CounterClockWise: '', }, - highlightedHeaderArg: 'CounterClockWise', + highlightedHeaderArg: 'length', }) - await page.keyboard.press('Shift+Backspace') - await expect(cmdBar.currentArgumentInput).toBeVisible() - await cmdBar.currentArgumentInput.locator('.cm-content').fill(newInput) + await page.keyboard.insertText(newInput) await cmdBar.progressCmdBar() await cmdBar.expectState({ stage: 'review', @@ -1258,11 +1250,10 @@ openSketch = startSketchOn(XY) Revolutions: '1', Radius: '5', Length: newInput, - CounterClockWise: '', }, commandName: 'Helix', }) - await cmdBar.progressCmdBar() + await cmdBar.submit() await toolbar.closeFeatureTreePane() await editor.openPane() await editor.expectEditor.toContain('length = ' + newInput) @@ -1273,174 +1264,238 @@ openSketch = startSketchOn(XY) const operationButton = await toolbar.getFeatureTreeOperation('Helix', 0) await operationButton.click({ button: 'left' }) await page.keyboard.press('Delete') - // Red plane is back - await scene.expectPixelColor([96, 52, 52], testPoint, 15) + await scene.settled(cmdBar) + await editor.expectEditor.not.toContain('helix') + await expect( + await toolbar.getFeatureTreeOperation('Helix', 0) + ).not.toBeVisible() }) }) - const helixCases = [ - { - selectionType: 'segment', - testPoint: { x: 513, y: 221 }, - expectedOutput: `helix001 = helix( axis = seg01, radius = 1, revolutions = 20, angleStart = 0, ccw = false,)`, - expectedEditedOutput: `helix001 = helix( axis = seg01, radius = 5, revolutions = 20, angleStart = 0, ccw = false,)`, - }, - { - selectionType: 'sweepEdge', - testPoint: { x: 564, y: 364 }, - expectedOutput: `helix001 = helix( axis = getOppositeEdge(seg01), radius = 1, revolutions = 20, angleStart = 0, ccw = false,)`, - expectedEditedOutput: `helix001 = helix( axis = getOppositeEdge(seg01), radius = 5, revolutions = 20, angleStart = 0, ccw = false,)`, - }, - ] - helixCases.map( - ({ selectionType, testPoint, expectedOutput, expectedEditedOutput }) => { - test(`Helix point-and-click around ${selectionType}`, async ({ - context, - page, - homePage, - scene, - editor, - toolbar, - cmdBar, - }) => { - page.on('console', console.log) - const initialCode = `sketch001 = startSketchOn(XZ) - profile001 = startProfile(sketch001, at = [0, 0]) - |> yLine(length = 100) - |> line(endAbsolute = [100, 0]) - |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) - |> close() - extrude001 = extrude(profile001, length = 100)` + test(`Helix point-and-click around segment`, async ({ + context, + page, + homePage, + scene, + editor, + toolbar, + cmdBar, + }) => { + const initialCode = `sketch001 = startSketchOn(XZ) +profile001 = startProfile(sketch001, at = [0, 0]) +|> yLine(length = 100) +|> line(endAbsolute = [100, 0]) +|> line(endAbsolute = [profileStartX(%), profileStartY(%)]) +|> close()` + await context.addInitScript((initialCode) => { + localStorage.setItem('persistCode', initialCode) + }, initialCode) + await page.setBodyDimensions({ width: 1000, height: 500 }) + await homePage.goToModelingScene() + await scene.settled(cmdBar) - // One dumb hardcoded screen pixel value - const [clickOnEdge] = scene.makeMouseHelpers(testPoint.x, testPoint.y) - - await context.addInitScript((initialCode) => { - localStorage.setItem('persistCode', initialCode) - }, initialCode) - await page.setBodyDimensions({ width: 1000, height: 500 }) - await homePage.goToModelingScene() - await scene.settled(cmdBar) - - await test.step(`Go through the command bar flow`, async () => { - await toolbar.closePane('code') - await toolbar.helixButton.click() - await cmdBar.expectState({ - stage: 'arguments', - currentArgKey: 'mode', - currentArgValue: '', - headerArguments: { - AngleStart: '', - Mode: '', - CounterClockWise: '', - Radius: '', - Revolutions: '', - }, - highlightedHeaderArg: 'mode', - commandName: 'Helix', - }) - await cmdBar.selectOption({ name: 'Edge' }).click() - await expect - .poll(() => page.getByText('Please select one').count()) - .toBe(1) - await clickOnEdge() - await page.waitForTimeout(1000) - await cmdBar.progressCmdBar() - await page.waitForTimeout(1000) - await cmdBar.argumentInput.focus() - await page.waitForTimeout(1000) - await page.keyboard.insertText('20') - await cmdBar.progressCmdBar() - await page.keyboard.insertText('0') - await cmdBar.progressCmdBar() - await page.keyboard.insertText('1') - await cmdBar.progressCmdBar() - await page.keyboard.insertText('100') - await cmdBar.expectState({ - stage: 'review', - headerArguments: { - Mode: 'Edge', - Edge: `1 ${selectionType}`, - AngleStart: '0', - Revolutions: '20', - Radius: '1', - CounterClockWise: '', - }, - commandName: 'Helix', - }) - await cmdBar.progressCmdBar() - await page.waitForTimeout(1000) - }) - - await test.step(`Confirm code is added to the editor, scene has changed`, async () => { - await toolbar.openPane('code') - await editor.expectEditor.toContain(expectedOutput) - await toolbar.closePane('code') - }) - - await test.step(`Edit helix through the feature tree`, async () => { - await toolbar.openPane('feature-tree') - const operationButton = await toolbar.getFeatureTreeOperation( - 'Helix', - 0 - ) - await operationButton.dblclick() - const initialInput = '1' - const newInput = '5' - await cmdBar.expectState({ - commandName: 'Helix', - stage: 'arguments', - currentArgKey: 'CounterClockWise', - currentArgValue: '', - headerArguments: { - AngleStart: '0', - Revolutions: '20', - Radius: initialInput, - CounterClockWise: '', - }, - highlightedHeaderArg: 'CounterClockWise', - }) - await page - .getByRole('button', { name: 'radius', exact: false }) - .click() - await expect(cmdBar.currentArgumentInput).toBeVisible() - await cmdBar.currentArgumentInput - .locator('.cm-content') - .fill(newInput) - await cmdBar.progressCmdBar() - await cmdBar.expectState({ - stage: 'review', - headerArguments: { - AngleStart: '0', - Revolutions: '20', - Radius: newInput, - CounterClockWise: '', - }, - commandName: 'Helix', - }) - await cmdBar.progressCmdBar() - await toolbar.closePane('feature-tree') - await toolbar.openPane('code') - await editor.expectEditor.toContain(expectedEditedOutput) - await toolbar.closePane('code') - }) - - await test.step('Delete helix via feature tree selection', async () => { - await toolbar.openPane('feature-tree') - const operationButton = await toolbar.getFeatureTreeOperation( - 'Helix', - 0 - ) - await operationButton.click({ button: 'left' }) - await page.keyboard.press('Delete') - await editor.expectEditor.not.toContain(expectedEditedOutput) - await expect( - await toolbar.getFeatureTreeOperation('Helix', 0) - ).not.toBeVisible() - }) + await test.step(`Go through the command bar flow`, async () => { + await toolbar.closePane('code') + await toolbar.helixButton.click() + await cmdBar.expectState(initialCmdBarStateHelix) + await cmdBar.selectOption({ name: 'Edge' }).click() + await editor.selectText('yLine(length = 100)') + await cmdBar.progressCmdBar() + await page.keyboard.insertText('1') + await cmdBar.progressCmdBar() + await page.keyboard.insertText('2') + await cmdBar.progressCmdBar() + await page.keyboard.insertText('3') + await cmdBar.progressCmdBar() + await cmdBar.expectState({ + stage: 'review', + headerArguments: { + Mode: 'Edge', + Edge: `1 segment`, + AngleStart: '2', + Revolutions: '1', + Radius: '3', + }, + commandName: 'Helix', }) - } - ) + await cmdBar.submit() + await scene.settled(cmdBar) + }) + + await test.step(`Confirm code is added to the editor, scene has changed`, async () => { + await toolbar.openPane('code') + await editor.expectEditor.toContain( + ` + helix001 = helix( + axis = seg01, + radius = 3, + revolutions = 1, + angleStart = 2, + )`, + { shouldNormalise: true } + ) + await toolbar.closePane('code') + }) + }) + + test(`Helix point-and-click around sweepEdge with edit and delete flows`, async ({ + context, + page, + homePage, + scene, + editor, + toolbar, + cmdBar, + }) => { + const initialCode = `sketch001 = startSketchOn(XZ) +profile001 = startProfile(sketch001, at = [0, 0]) +|> yLine(length = 100) +|> line(endAbsolute = [100, 0]) +|> line(endAbsolute = [profileStartX(%), profileStartY(%)]) +|> close() +extrude001 = extrude(profile001, length = 100)` + + // One dumb hardcoded screen pixel value to click on the sweepEdge, can't think of another way? + const testPoint = { x: 564, y: 364 } + const [clickOnEdge] = scene.makeMouseHelpers(testPoint.x, testPoint.y) + + await context.addInitScript((initialCode) => { + localStorage.setItem('persistCode', initialCode) + }, initialCode) + await page.setBodyDimensions({ width: 1000, height: 500 }) + await homePage.goToModelingScene() + await scene.settled(cmdBar) + + await test.step(`Go through the command bar flow`, async () => { + await toolbar.closePane('code') + await toolbar.helixButton.click() + await cmdBar.expectState(initialCmdBarStateHelix) + await cmdBar.selectOption({ name: 'Edge' }).click() + await expect + .poll(() => page.getByText('Please select one').count()) + .toBe(1) + await clickOnEdge() + await cmdBar.progressCmdBar() + await cmdBar.argumentInput.focus() + await page.keyboard.insertText('20') + await cmdBar.progressCmdBar() + await page.keyboard.insertText('0') + await cmdBar.progressCmdBar() + await page.keyboard.insertText('1') + await cmdBar.progressCmdBar() + await page.keyboard.insertText('100') + await cmdBar.expectState({ + stage: 'review', + headerArguments: { + Mode: 'Edge', + Edge: `1 sweepEdge`, + AngleStart: '0', + Revolutions: '20', + Radius: '1', + }, + commandName: 'Helix', + }) + await cmdBar.submit() + await scene.settled(cmdBar) + }) + + await test.step(`Confirm code is added to the editor, scene has changed`, async () => { + await toolbar.openPane('code') + await editor.expectEditor.toContain( + ` + helix001 = helix( + axis = getOppositeEdge(seg01), + radius = 1, + revolutions = 20, + angleStart = 0, + )`, + { shouldNormalise: true } + ) + await toolbar.closePane('code') + }) + + await test.step(`Edit helix through the feature tree`, async () => { + await toolbar.openPane('feature-tree') + const operationButton = await toolbar.getFeatureTreeOperation('Helix', 0) + await operationButton.dblclick() + const initialInput = '1' + const newInput = '5' + await cmdBar.expectState({ + commandName: 'Helix', + stage: 'arguments', + currentArgKey: 'radius', + currentArgValue: initialInput, + headerArguments: { + AngleStart: '0', + Revolutions: '20', + Radius: initialInput, + }, + highlightedHeaderArg: 'radius', + }) + await page.keyboard.insertText(newInput) + await cmdBar.progressCmdBar() + await cmdBar.expectState({ + stage: 'review', + headerArguments: { + AngleStart: '0', + Revolutions: '20', + Radius: newInput, + }, + commandName: 'Helix', + }) + await cmdBar.clickOptionalArgument('ccw') + await cmdBar.expectState({ + commandName: 'Helix', + stage: 'arguments', + currentArgKey: 'CounterClockWise', + currentArgValue: '', + headerArguments: { + AngleStart: '0', + Revolutions: '20', + Radius: newInput, + CounterClockWise: '', + }, + highlightedHeaderArg: 'CounterClockWise', + }) + await cmdBar.selectOption({ name: 'True' }).click() + await cmdBar.expectState({ + stage: 'review', + headerArguments: { + AngleStart: '0', + Revolutions: '20', + Radius: newInput, + CounterClockWise: '', + }, + commandName: 'Helix', + }) + await cmdBar.submit() + await toolbar.closePane('feature-tree') + await toolbar.openPane('code') + await editor.expectEditor.toContain( + ` + helix001 = helix( + axis = getOppositeEdge(seg01), + radius = 5, + revolutions = 20, + angleStart = 0, + ccw = true, + )`, + { shouldNormalise: true } + ) + await toolbar.closePane('code') + }) + + await test.step('Delete helix via feature tree selection', async () => { + await toolbar.openPane('feature-tree') + const operationButton = await toolbar.getFeatureTreeOperation('Helix', 0) + await operationButton.click({ button: 'left' }) + await page.keyboard.press('Delete') + await editor.expectEditor.not.toContain('helix') + await expect( + await toolbar.getFeatureTreeOperation('Helix', 0) + ).not.toBeVisible() + }) + }) test('Helix point-and-click on cylinder', async ({ context, @@ -1470,26 +1525,12 @@ extrude001 = extrude(profile001, length = 100) // One dumb hardcoded screen pixel value const testPoint = { x: 620, y: 257 } const [clickOnWall] = scene.makeMouseHelpers(testPoint.x, testPoint.y) - const expectedOutput = `helix001 = helix( cylinder = extrude001, revolutions = 1, angleStart = 360, ccw = false,)` - const expectedLine = `cylinder = extrude001,` - const expectedEditedOutput = `helix001 = helix( cylinder = extrude001, revolutions = 1, angleStart = 360, ccw = true,)` + const expectedOutput = `helix001 = helix(cylinder = extrude001, revolutions = 1, angleStart = 360)` + const expectedEditedOutput = `helix001 = helix(cylinder = extrude001, revolutions = 1, angleStart = 10)` await test.step(`Go through the command bar flow`, async () => { await toolbar.helixButton.click() - await cmdBar.expectState({ - stage: 'arguments', - currentArgKey: 'mode', - currentArgValue: '', - headerArguments: { - Mode: '', - AngleStart: '', - Revolutions: '', - Radius: '', - CounterClockWise: '', - }, - highlightedHeaderArg: 'mode', - commandName: 'Helix', - }) + await cmdBar.expectState(initialCmdBarStateHelix) await cmdBar.selectOption({ name: 'Cylinder' }).click() await cmdBar.expectState({ stage: 'arguments', @@ -1500,7 +1541,6 @@ extrude001 = extrude(profile001, length = 100) Cylinder: '', AngleStart: '', Revolutions: '', - CounterClockWise: '', }, highlightedHeaderArg: 'cylinder', commandName: 'Helix', @@ -1516,18 +1556,17 @@ extrude001 = extrude(profile001, length = 100) Cylinder: '1 face', AngleStart: '360', Revolutions: '1', - CounterClockWise: '', }, commandName: 'Helix', }) - await cmdBar.progressCmdBar() + await cmdBar.submit() }) await test.step(`Confirm code is added to the editor, scene has changed`, async () => { await editor.expectEditor.toContain(expectedOutput) await editor.expectState({ diagnostics: [], - activeLines: [expectedLine], + activeLines: [expectedOutput], highlightedCode: '', }) }) @@ -1539,22 +1578,21 @@ extrude001 = extrude(profile001, length = 100) await cmdBar.expectState({ commandName: 'Helix', stage: 'arguments', - currentArgKey: 'CounterClockWise', - currentArgValue: '', + currentArgKey: 'angleStart', + currentArgValue: '360', headerArguments: { AngleStart: '360', Revolutions: '1', - CounterClockWise: '', }, - highlightedHeaderArg: 'CounterClockWise', + highlightedHeaderArg: 'angleStart', }) - await cmdBar.selectOption({ name: 'True' }).click() + await page.keyboard.insertText('10') + await cmdBar.progressCmdBar() await cmdBar.expectState({ stage: 'review', headerArguments: { - AngleStart: '360', + AngleStart: '10', Revolutions: '1', - CounterClockWise: 'true', }, commandName: 'Helix', }) diff --git a/src/lang/modifyAst.ts b/src/lang/modifyAst.ts index 13d4b7825..2665e009d 100644 --- a/src/lang/modifyAst.ts +++ b/src/lang/modifyAst.ts @@ -590,7 +590,7 @@ export function addHelix({ angleStart: Expr radius?: Expr length?: Expr - ccw: boolean + ccw?: boolean insertIndex?: number variableName?: string }): { modifiedAst: Node; pathToNode: PathToNode } { @@ -610,6 +610,9 @@ export function addHelix({ ) } + // Extra labeled args expressions + const ccwExpr = ccw ? [createLabeledArg('ccw', createLiteral(ccw))] : [] + const variable = createVariableDeclaration( name, createCallExpressionStdLibKw( @@ -619,7 +622,7 @@ export function addHelix({ ...modeArgs, createLabeledArg('revolutions', revolutions), createLabeledArg('angleStart', angleStart), - createLabeledArg('ccw', createLiteral(ccw)), + ...ccwExpr, ] ) ) diff --git a/src/lib/commandBarConfigs/modelingCommandConfig.ts b/src/lib/commandBarConfigs/modelingCommandConfig.ts index 58e73f515..78a21a6bb 100644 --- a/src/lib/commandBarConfigs/modelingCommandConfig.ts +++ b/src/lib/commandBarConfigs/modelingCommandConfig.ts @@ -690,32 +690,35 @@ export const modelingMachineCommandConfig: StateMachineCommandSetConfig< }, axis: { inputType: 'options', - required: (commandContext) => - ['Axis'].includes(commandContext.argumentsToSubmit.mode as string), options: [ { name: 'X Axis', value: 'X' }, { name: 'Y Axis', value: 'Y' }, { name: 'Z Axis', value: 'Z' }, ], - hidden: false, // for consistency here, we can actually edit here since it's not a selection + required: (context) => + ['Axis'].includes(context.argumentsToSubmit.mode as string), + hidden: (context) => + !['Axis'].includes(context.argumentsToSubmit.mode as string), }, edge: { - required: (commandContext) => - ['Edge'].includes(commandContext.argumentsToSubmit.mode as string), inputType: 'selection', selectionTypes: ['segment', 'sweepEdge'], multiple: false, - hidden: (context) => Boolean(context.argumentsToSubmit.nodeToEdit), + required: (context) => + ['Edge'].includes(context.argumentsToSubmit.mode as string), + hidden: (context) => + Boolean(context.argumentsToSubmit.nodeToEdit) || + !['Edge'].includes(context.argumentsToSubmit.mode as string), }, cylinder: { - required: (commandContext) => - ['Cylinder'].includes( - commandContext.argumentsToSubmit.mode as string - ), inputType: 'selection', selectionTypes: ['wall'], multiple: false, - hidden: (context) => Boolean(context.argumentsToSubmit.nodeToEdit), + required: (context) => + ['Cylinder'].includes(context.argumentsToSubmit.mode as string), + hidden: (context) => + Boolean(context.argumentsToSubmit.nodeToEdit) || + !['Cylinder'].includes(context.argumentsToSubmit.mode as string), }, revolutions: { inputType: 'kcl', @@ -730,34 +733,30 @@ export const modelingMachineCommandConfig: StateMachineCommandSetConfig< radius: { inputType: 'kcl', defaultValue: KCL_DEFAULT_LENGTH, - required: (commandContext) => - !['Cylinder'].includes( - commandContext.argumentsToSubmit.mode as string - ), + required: (context) => + !['Cylinder'].includes(context.argumentsToSubmit.mode as string), + hidden: (context) => + ['Cylinder'].includes(context.argumentsToSubmit.mode as string), }, length: { inputType: 'kcl', defaultValue: KCL_DEFAULT_LENGTH, required: (commandContext) => ['Axis'].includes(commandContext.argumentsToSubmit.mode as string), + // No need for hidden here, as it works with all modes }, ccw: { inputType: 'options', - skip: true, - required: true, - defaultValue: false, - valueSummary: (value) => String(value), + required: false, displayName: 'CounterClockWise', - options: (commandContext) => [ + options: [ { name: 'False', value: false, - isCurrent: !Boolean(commandContext.argumentsToSubmit.ccw), }, { name: 'True', value: true, - isCurrent: Boolean(commandContext.argumentsToSubmit.ccw), }, ], }, From 7de27c648f9d4e7a15e2ae3de314e89c1bd4ae0b Mon Sep 17 00:00:00 2001 From: Max Ammann Date: Thu, 26 Jun 2025 21:24:16 +0200 Subject: [PATCH 3/8] Revoke token when logging out (#7493) * Revoke token when logging out * extract OAUTH2_DEVICE_CLIENT_ID * Update snapshots * Update snapshots * try fix * try fix * Move client id to `@src/lib/constants` --------- Co-authored-by: Jonathan Tran Co-authored-by: github-actions[bot] Co-authored-by: Pierre Jacquier Co-authored-by: Pierre Jacquier --- ...hould-look-right-3-Google-Chrome-linux.png | Bin 53666 -> 53587 bytes ...hould-look-right-4-Google-Chrome-linux.png | Bin 59424 -> 59341 bytes src/lib/constants.ts | 3 ++ src/machines/authMachine.ts | 30 ++++++++++++++++-- src/main.ts | 7 ++-- 5 files changed, 35 insertions(+), 5 deletions(-) diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-segments-should-look-right-3-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-segments-should-look-right-3-Google-Chrome-linux.png index 06a2716a3aca4f3ed03cbf6a92a243cca164f711..26956ddbc539dfaa7eebcbaf73bd4972cecadab2 100644 GIT binary patch literal 53587 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 literal 59424 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

UO%G2A#q@7z~j zGj(<^P%&xRt$lrB=j9m9jvy{?p;{RN$Z^(U_Xn&mO~Ee&P-UGLu(ojY_Bps8dRkk_ zva)}gWrI(=?wyZT z^tvIIP{pm0Z9adH$z&X}3-syF-AGQ~2FkIsx%noxW*8qt1cI=y5xiMfZY6RP8QSJZ zMl%7~QsT*Wm1GjA?d&!z=H;1wSlu)|iQM6_PwuY@p!h9?jgwlMnr>i}6i{JsaIn4I zEW>NlN&iKymW8K!ahU7BL|XP%L!x@VO0M1IThTWc5w%2hl~Dpft}hpUf+ zS>ux1mC~eOQNza+6hwE<2&siXdHC!*`NIkO_oPSgMw)HV^aFYJ^bPo<^&f>`^8@<*%V`Y@JiU-*Q$rfJpFVG6ZEY}pUYtG?nU2FG$yXNB`i7v0@fWKg(od zd7W}+#a1psqKB<~$n(9qkx`n-F}Qx-i%xLYN+s~L;o9&TR5Ui5ExY0Hb?QmBaC&+g zvv;%pile;Mfh&Zpn>ldKpY$)KBkPqAt zlocM^KMBQ{$5v=tp&d?P=(tL}!jC;4?^l79C(vTsH;2By_4>qvK-gFCWBWL { // We can hardcode the client ID. // This value is safe to be embedded in version control. // This is the client ID of the KittyCAD app. - client_id: '2af127fb-e14e-400a-9c57-a9ed08d1a5b7', + client_id: OAUTH2_DEVICE_CLIENT_ID, token_endpoint_auth_method: 'none', }) From f49cf8281cae6c8a501f50f3fc6e909a397d8608 Mon Sep 17 00:00:00 2001 From: Pierre Jacquier Date: Thu, 26 Jun 2025 16:43:53 -0400 Subject: [PATCH 4/8] Allow point-and-click Substract to take in multiple solids and tools (#7614) * Allow point-and-click Substract to take in multiple tools Fixes #7612 * Change target to solids for consistency and make it support multi select too * Improve err message * Update src/lang/modifyAst/boolean.ts Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com> * Update src/lang/modifyAst/boolean.ts Co-authored-by: Kurt Hutten * Good bot * Reduce array to single value if len 1 * Remove console.log --------- Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com> Co-authored-by: Kurt Hutten --- e2e/playwright/boolean.spec.ts | 8 +- src/lang/modifyAst/boolean.ts | 126 ++++++++---------- .../modelingCommandConfig.ts | 14 +- src/machines/modelingMachine.ts | 38 ++++-- 4 files changed, 92 insertions(+), 94 deletions(-) diff --git a/e2e/playwright/boolean.spec.ts b/e2e/playwright/boolean.spec.ts index 2a1379f95..b4509ecd0 100644 --- a/e2e/playwright/boolean.spec.ts +++ b/e2e/playwright/boolean.spec.ts @@ -12,7 +12,7 @@ test.describe('Point and click for boolean workflows', () => { }, { name: 'subtract', - code: 'subtract([extrude001], tools = [extrude006])', + code: 'subtract(extrude001, tools = extrude006)', }, { name: 'intersect', @@ -81,6 +81,8 @@ test.describe('Point and click for boolean workflows', () => { if (operationName !== 'subtract') { // should down shift key to select multiple objects await page.keyboard.down('Shift') + } else { + await cmdBar.progressCmdBar() } // Select second object @@ -103,8 +105,8 @@ test.describe('Point and click for boolean workflows', () => { await cmdBar.expectState({ stage: 'review', headerArguments: { - Tool: '1 path', - Target: '1 path', + Solids: '1 path', + Tools: '1 path', }, commandName, }) diff --git a/src/lang/modifyAst/boolean.ts b/src/lang/modifyAst/boolean.ts index 1f5b38a4d..54f48d1b2 100644 --- a/src/lang/modifyAst/boolean.ts +++ b/src/lang/modifyAst/boolean.ts @@ -23,13 +23,13 @@ import type { VariableDeclaration, } from '@src/lang/wasm' import { EXECUTION_TYPE_REAL } from '@src/lib/constants' -import type { Selection, Selections } from '@src/lib/selections' +import type { Selections } from '@src/lib/selections' import { err } from '@src/lib/trap' import { isArray } from '@src/lib/utils' export async function applySubtractFromTargetOperatorSelections( - target: Selection, - tool: Selection, + solids: Selections, + tools: Selections, dependencies: { kclManager: KclManager engineCommandManager: EngineCommandManager @@ -38,28 +38,28 @@ export async function applySubtractFromTargetOperatorSelections( } ): Promise { const ast = dependencies.kclManager.ast - if (!target.artifact || !tool.artifact) { - return new Error('No artifact found') - } - const orderedChildrenTarget = findAllChildrenAndOrderByPlaceInCode( - target.artifact, + const lastSolidsVars = getLastVariableDeclarationsFromSelections( + solids, + ast, dependencies.kclManager.artifactGraph ) - const orderedChildrenTool = findAllChildrenAndOrderByPlaceInCode( - tool.artifact, + if (err(lastSolidsVars) || lastSolidsVars.length < 1) { + return new Error('Not enough or invalid solids variables found') + } + + const lastToolsVars = getLastVariableDeclarationsFromSelections( + tools, + ast, dependencies.kclManager.artifactGraph ) - - const lastVarTarget = getLastVariable(orderedChildrenTarget, ast) - const lastVarTool = getLastVariable(orderedChildrenTool, ast) - - if (!lastVarTarget || !lastVarTool) { - return new Error('No variable found') + if (err(lastToolsVars) || lastToolsVars.length < 1) { + return new Error('Not enough or invalid tools variables found') } + const modifiedAst = booleanSubtractAstMod({ ast, - targets: [lastVarTarget?.variableDeclaration?.node], - tools: [lastVarTool?.variableDeclaration.node], + solids: lastSolidsVars, + tools: lastToolsVars, }) await updateModelingState(modifiedAst, EXECUTION_TYPE_REAL, dependencies) @@ -75,34 +75,13 @@ export async function applyUnionFromTargetOperatorSelections( } ): Promise { const ast = dependencies.kclManager.ast - - const artifacts: Artifact[] = [] - for (const selection of solids.graphSelections) { - if (selection.artifact) { - artifacts.push(selection.artifact) - } - } - - if (artifacts.length < 2) { - return new Error('Not enough artifacts selected') - } - - const orderedChildrenEach = artifacts.map((artifact) => - findAllChildrenAndOrderByPlaceInCode( - artifact, - dependencies.kclManager.artifactGraph - ) + const lastVars = getLastVariableDeclarationsFromSelections( + solids, + ast, + dependencies.kclManager.artifactGraph ) - - const lastVars: VariableDeclaration[] = [] - for (const orderedArtifactLeaves of orderedChildrenEach) { - const lastVar = getLastVariable(orderedArtifactLeaves, ast) - if (!lastVar) continue - lastVars.push(lastVar.variableDeclaration.node) - } - - if (lastVars.length < 2) { - return new Error('Not enough variables found') + if (err(lastVars) || lastVars.length < 2) { + return new Error('Not enough or invalid solids variables found') } const modifiedAst = booleanUnionAstMod({ @@ -122,23 +101,36 @@ export async function applyIntersectFromTargetOperatorSelections( } ): Promise { const ast = dependencies.kclManager.ast + const lastVars = getLastVariableDeclarationsFromSelections( + solids, + ast, + dependencies.kclManager.artifactGraph + ) + if (err(lastVars) || lastVars.length < 2) { + return new Error('Not enough or invalid solids variables found') + } + const modifiedAst = booleanIntersectAstMod({ + ast, + solids: lastVars, + }) + await updateModelingState(modifiedAst, EXECUTION_TYPE_REAL, dependencies) +} + +function getLastVariableDeclarationsFromSelections( + selections: Selections, + ast: Node, + artifactGraph: ArtifactGraph +): Error | VariableDeclaration[] { const artifacts: Artifact[] = [] - for (const selection of solids.graphSelections) { + for (const selection of selections.graphSelections) { if (selection.artifact) { artifacts.push(selection.artifact) } } - if (artifacts.length < 2) { - return new Error('Not enough artifacts selected') - } - const orderedChildrenEach = artifacts.map((artifact) => - findAllChildrenAndOrderByPlaceInCode( - artifact, - dependencies.kclManager.artifactGraph - ) + findAllChildrenAndOrderByPlaceInCode(artifact, artifactGraph) ) const lastVars: VariableDeclaration[] = [] @@ -148,15 +140,7 @@ export async function applyIntersectFromTargetOperatorSelections( lastVars.push(lastVar.variableDeclaration.node) } - if (lastVars.length < 2) { - return new Error('Not enough variables found') - } - - const modifiedAst = booleanIntersectAstMod({ - ast, - solids: lastVars, - }) - await updateModelingState(modifiedAst, EXECUTION_TYPE_REAL, dependencies) + return lastVars } /** returns all children of a given artifact, and sorts them DESC by start sourceRange @@ -271,25 +255,27 @@ export function getLastVariable( export function booleanSubtractAstMod({ ast, - targets, + solids, tools, }: { ast: Node - targets: VariableDeclaration[] + solids: VariableDeclaration[] tools: VariableDeclaration[] }): Node { const newAst = structuredClone(ast) const newVarName = findUniqueName(newAst, 'solid') - const createArrExpr = (varDecs: VariableDeclaration[]) => - createArrayExpression( - varDecs.map((varDec) => createLocalName(varDec.declaration.id.name)) + const createArrExpr = (varDecs: VariableDeclaration[]) => { + const names = varDecs.map((varDec) => + createLocalName(varDec.declaration.id.name) ) - const targetsArrayExpression = createArrExpr(targets) + return names.length === 1 ? names[0] : createArrayExpression(names) + } + const solidsArrayExpression = createArrExpr(solids) const toolsArrayExpression = createArrExpr(tools) const newVarDec = createVariableDeclaration( newVarName, - createCallExpressionStdLibKw('subtract', targetsArrayExpression, [ + createCallExpressionStdLibKw('subtract', solidsArrayExpression, [ createLabeledArg('tools', toolsArrayExpression), ]) ) diff --git a/src/lib/commandBarConfigs/modelingCommandConfig.ts b/src/lib/commandBarConfigs/modelingCommandConfig.ts index 78a21a6bb..3d0814506 100644 --- a/src/lib/commandBarConfigs/modelingCommandConfig.ts +++ b/src/lib/commandBarConfigs/modelingCommandConfig.ts @@ -204,8 +204,8 @@ export type ModelingCommandSchema = { variableName: string } 'Boolean Subtract': { - target: Selections - tool: Selections + solids: Selections + tools: Selections } 'Boolean Union': { solids: Selections @@ -595,23 +595,21 @@ export const modelingMachineCommandConfig: StateMachineCommandSetConfig< icon: 'booleanSubtract', needsReview: true, args: { - target: { + solids: { inputType: 'selection', selectionTypes: ['path'], selectionFilter: ['object'], - multiple: false, + multiple: true, required: true, - skip: true, hidden: (context) => Boolean(context.argumentsToSubmit.nodeToEdit), }, - tool: { + tools: { clearSelectionFirst: true, inputType: 'selection', selectionTypes: ['path'], selectionFilter: ['object'], - multiple: false, + multiple: true, required: true, - skip: false, hidden: (context) => Boolean(context.argumentsToSubmit.nodeToEdit), }, }, diff --git a/src/machines/modelingMachine.ts b/src/machines/modelingMachine.ts index d409b5d75..ad8183302 100644 --- a/src/machines/modelingMachine.ts +++ b/src/machines/modelingMachine.ts @@ -3570,17 +3570,17 @@ export const modelingMachine = setup({ return Promise.reject(new Error(NO_INPUT_PROVIDED_MESSAGE)) } - const { target, tool } = input + const { solids, tools } = input if ( - !target.graphSelections[0].artifact || - !tool.graphSelections[0].artifact + !solids.graphSelections.some((selection) => selection.artifact) || + !tools.graphSelections.some((selection) => selection.artifact) ) { return Promise.reject(new Error('No artifact in selections found')) } - await applySubtractFromTargetOperatorSelections( - target.graphSelections[0], - tool.graphSelections[0], + const result = await applySubtractFromTargetOperatorSelections( + solids, + tools, { kclManager, codeManager, @@ -3588,6 +3588,9 @@ export const modelingMachine = setup({ editorManager, } ) + if (err(result)) { + return Promise.reject(result) + } } ), boolUnionAstMod: fromPromise( @@ -3605,12 +3608,15 @@ export const modelingMachine = setup({ return Promise.reject(new Error('No artifact in selections found')) } - await applyUnionFromTargetOperatorSelections(solids, { + const result = await applyUnionFromTargetOperatorSelections(solids, { kclManager, codeManager, engineCommandManager, editorManager, }) + if (err(result)) { + return Promise.reject(result) + } } ), boolIntersectAstMod: fromPromise( @@ -3628,12 +3634,18 @@ export const modelingMachine = setup({ return Promise.reject(new Error('No artifact in selections found')) } - await applyIntersectFromTargetOperatorSelections(solids, { - kclManager, - codeManager, - engineCommandManager, - editorManager, - }) + const result = await applyIntersectFromTargetOperatorSelections( + solids, + { + kclManager, + codeManager, + engineCommandManager, + editorManager, + } + ) + if (err(result)) { + return Promise.reject(result) + } } ), From 6a2027cd5127c1b3f069e39f32ec3c8c64ebac10 Mon Sep 17 00:00:00 2001 From: Pierre Jacquier Date: Thu, 26 Jun 2025 17:36:05 -0400 Subject: [PATCH 5/8] Keep subtract solids selection to one until engine supports multiple (#7617) Follow up to #7614 --- src/lib/commandBarConfigs/modelingCommandConfig.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/lib/commandBarConfigs/modelingCommandConfig.ts b/src/lib/commandBarConfigs/modelingCommandConfig.ts index 3d0814506..8e5dbc9ed 100644 --- a/src/lib/commandBarConfigs/modelingCommandConfig.ts +++ b/src/lib/commandBarConfigs/modelingCommandConfig.ts @@ -599,7 +599,9 @@ export const modelingMachineCommandConfig: StateMachineCommandSetConfig< inputType: 'selection', selectionTypes: ['path'], selectionFilter: ['object'], - multiple: true, + // TODO: turn back to true once engine supports it, the codemod and KCL are ready + // Issue link: https://github.com/KittyCAD/engine/issues/3435 + multiple: false, required: true, hidden: (context) => Boolean(context.argumentsToSubmit.nodeToEdit), }, From 4356885aa273d3934670735929d56a241bb3d86c Mon Sep 17 00:00:00 2001 From: Adam Chalmers Date: Thu, 26 Jun 2025 17:02:54 -0500 Subject: [PATCH 6/8] Bump cargo to 1.88; 2024 edition for kcl-lib (#7618) This is a big one because the edition changes a fair number of things. --- flake.lock | 18 +- rust/kcl-language-server-release/src/build.rs | 7 +- rust/kcl-language-server-release/src/main.rs | 6 +- rust/kcl-language-server/src/main.rs | 8 +- rust/kcl-lib/Cargo.toml | 4 +- rust/kcl-lib/benches/benchmark_kcl_samples.rs | 10 +- .../benches/compiler_benchmark_criterion.rs | 2 +- rust/kcl-lib/benches/digest_benchmark.rs | 2 +- ...lsp_semantic_tokens_benchmark_criterion.rs | 2 +- rust/kcl-lib/e2e/executor/cache.rs | 15 +- rust/kcl-lib/e2e/executor/main.rs | 31 ++- rust/kcl-lib/src/coredump/mod.rs | 2 +- rust/kcl-lib/src/docs/gen_std_tests.rs | 10 +- rust/kcl-lib/src/docs/kcl_doc.rs | 33 ++- .../src/engine/async_tasks/tasks_wasm.rs | 4 +- rust/kcl-lib/src/engine/conn.rs | 16 +- rust/kcl-lib/src/engine/conn_mock.rs | 4 +- rust/kcl-lib/src/engine/conn_wasm.rs | 2 +- rust/kcl-lib/src/engine/mod.rs | 28 +- rust/kcl-lib/src/errors.rs | 2 +- rust/kcl-lib/src/execution/annotations.rs | 4 +- rust/kcl-lib/src/execution/artifact.rs | 17 +- .../src/execution/artifact/mermaid_tests.rs | 16 +- rust/kcl-lib/src/execution/cache.rs | 11 +- rust/kcl-lib/src/execution/cad_op.rs | 6 +- rust/kcl-lib/src/execution/exec_ast.rs | 86 +++--- rust/kcl-lib/src/execution/fn_call.rs | 33 ++- rust/kcl-lib/src/execution/geometry.rs | 18 +- rust/kcl-lib/src/execution/import.rs | 18 +- rust/kcl-lib/src/execution/import_graph.rs | 14 +- rust/kcl-lib/src/execution/kcl_value.rs | 16 +- rust/kcl-lib/src/execution/memory.rs | 8 +- rust/kcl-lib/src/execution/mod.rs | 24 +- rust/kcl-lib/src/execution/modeling.rs | 2 +- rust/kcl-lib/src/execution/state.rs | 7 +- rust/kcl-lib/src/execution/typed_path.rs | 4 +- rust/kcl-lib/src/execution/types.rs | 28 +- rust/kcl-lib/src/fs/local.rs | 2 +- rust/kcl-lib/src/fs/mod.rs | 2 +- rust/kcl-lib/src/fs/wasm.rs | 2 +- rust/kcl-lib/src/lib.rs | 41 +-- rust/kcl-lib/src/lint/checks/camel_case.rs | 12 +- rust/kcl-lib/src/lint/checks/default_plane.rs | 11 +- rust/kcl-lib/src/lint/checks/mod.rs | 6 +- rust/kcl-lib/src/lint/checks/offset_plane.rs | 23 +- rust/kcl-lib/src/lint/rule.rs | 14 +- rust/kcl-lib/src/lsp/backend.rs | 16 +- rust/kcl-lib/src/lsp/copilot/mod.rs | 16 +- rust/kcl-lib/src/lsp/copilot/types.rs | 2 +- rust/kcl-lib/src/lsp/kcl/hover.rs | 2 +- rust/kcl-lib/src/lsp/kcl/mod.rs | 246 +++++++++--------- rust/kcl-lib/src/lsp/mod.rs | 2 +- rust/kcl-lib/src/lsp/tests.rs | 12 +- rust/kcl-lib/src/modules.rs | 6 +- rust/kcl-lib/src/parsing/ast/mod.rs | 2 +- rust/kcl-lib/src/parsing/ast/types/mod.rs | 125 ++++----- rust/kcl-lib/src/parsing/math.rs | 4 +- rust/kcl-lib/src/parsing/mod.rs | 6 +- rust/kcl-lib/src/parsing/parser.rs | 31 ++- rust/kcl-lib/src/parsing/token/mod.rs | 4 +- rust/kcl-lib/src/parsing/token/tokeniser.rs | 4 +- .../src/settings/generate_settings_docs.rs | 18 +- rust/kcl-lib/src/settings/types/mod.rs | 36 +-- rust/kcl-lib/src/settings/types/project.rs | 14 +- rust/kcl-lib/src/simulation_tests.rs | 18 +- .../src/simulation_tests/kcl_samples.rs | 10 +- rust/kcl-lib/src/std/appearance.rs | 6 +- rust/kcl-lib/src/std/args.rs | 10 +- rust/kcl-lib/src/std/array.rs | 4 +- rust/kcl-lib/src/std/assert.rs | 4 +- rust/kcl-lib/src/std/chamfer.rs | 8 +- rust/kcl-lib/src/std/clone.rs | 35 ++- rust/kcl-lib/src/std/csg.rs | 8 +- rust/kcl-lib/src/std/edge.rs | 22 +- rust/kcl-lib/src/std/extrude.rs | 9 +- rust/kcl-lib/src/std/fillet.rs | 10 +- rust/kcl-lib/src/std/helix.rs | 6 +- rust/kcl-lib/src/std/loft.rs | 8 +- rust/kcl-lib/src/std/math.rs | 4 +- rust/kcl-lib/src/std/mirror.rs | 14 +- rust/kcl-lib/src/std/mod.rs | 2 +- rust/kcl-lib/src/std/patterns.rs | 14 +- rust/kcl-lib/src/std/planes.rs | 4 +- rust/kcl-lib/src/std/revolve.rs | 19 +- rust/kcl-lib/src/std/segment.rs | 26 +- rust/kcl-lib/src/std/shapes.rs | 9 +- rust/kcl-lib/src/std/shell.rs | 6 +- rust/kcl-lib/src/std/sketch.rs | 13 +- rust/kcl-lib/src/std/sweep.rs | 10 +- rust/kcl-lib/src/std/transform.rs | 7 +- rust/kcl-lib/src/std/utils.rs | 12 +- rust/kcl-lib/src/test_server.rs | 6 +- rust/kcl-lib/src/unparser.rs | 37 ++- rust/kcl-lib/src/walk/ast_node.rs | 4 +- rust/kcl-lib/src/walk/ast_visitor.rs | 4 +- rust/kcl-lib/src/walk/ast_walk.rs | 4 +- rust/kcl-python-bindings/src/lib.rs | 16 +- rust/kcl-to-core/src/conn_mock_core.rs | 21 +- rust/kcl-to-core/src/tool.rs | 2 +- rust/rust-toolchain.toml | 2 +- 100 files changed, 769 insertions(+), 802 deletions(-) diff --git a/flake.lock b/flake.lock index 5efd040d0..a94e01641 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1745998881, - "narHash": "sha256-vonyYAKJSlsX4n9GCsS0pHxR6yCrfqBIuGvANlkwG6U=", + "lastModified": 1750865895, + "narHash": "sha256-p2dWAQcLVzquy9LxYCZPwyUdugw78Qv3ChvnX755qHA=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "423d2df5b04b4ee7688c3d71396e872afa236a89", + "rev": "61c0f513911459945e2cb8bf333dc849f1b976ff", "type": "github" }, "original": { @@ -36,11 +36,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1745998881, - "narHash": "sha256-vonyYAKJSlsX4n9GCsS0pHxR6yCrfqBIuGvANlkwG6U=", + "lastModified": 1750865895, + "narHash": "sha256-p2dWAQcLVzquy9LxYCZPwyUdugw78Qv3ChvnX755qHA=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "423d2df5b04b4ee7688c3d71396e872afa236a89", + "rev": "61c0f513911459945e2cb8bf333dc849f1b976ff", "type": "github" }, "original": { @@ -78,11 +78,11 @@ "nixpkgs": "nixpkgs_3" }, "locked": { - "lastModified": 1745980514, - "narHash": "sha256-CITAeiuXGjDvT5iZBXr6vKVWQwsUQLJUMFO91bfJFC4=", + "lastModified": 1750964660, + "narHash": "sha256-YQ6EyFetjH1uy5JhdhRdPe6cuNXlYpMAQePFfZj4W7M=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "7fbdae44b0f40ea432e46fd152ad8be0f8f41ad6", + "rev": "04f0fcfb1a50c63529805a798b4b5c21610ff390", "type": "github" }, "original": { diff --git a/rust/kcl-language-server-release/src/build.rs b/rust/kcl-language-server-release/src/build.rs index 0e27d288d..14a062b7c 100644 --- a/rust/kcl-language-server-release/src/build.rs +++ b/rust/kcl-language-server-release/src/build.rs @@ -42,7 +42,7 @@ impl Build { .to_string(); if !stable { - version = format!("{}-nightly", version); + version = format!("{version}-nightly"); } let release_tag = if stable { @@ -59,10 +59,7 @@ impl Build { if stable && !release_tag.contains(&version) { // bail early if the tag doesn't match the version // TODO: error here when we use the tags with kcl - println!( - "Tag {} doesn't match version {}. Did you forget to update Cargo.toml?", - release_tag, version - ); + println!("Tag {release_tag} doesn't match version {version}. Did you forget to update Cargo.toml?"); } build_server(sh, &version, &target)?; diff --git a/rust/kcl-language-server-release/src/main.rs b/rust/kcl-language-server-release/src/main.rs index 81a80f2bb..117e8cd24 100644 --- a/rust/kcl-language-server-release/src/main.rs +++ b/rust/kcl-language-server-release/src/main.rs @@ -95,10 +95,10 @@ async fn main() -> Result<()> { // Format fields using the provided closure. // We want to make this very concise otherwise the logs are not able to be read by humans. let format = tracing_subscriber::fmt::format::debug_fn(|writer, field, value| { - if format!("{}", field) == "message" { - write!(writer, "{}: {:?}", field, value) + if format!("{field}") == "message" { + write!(writer, "{field}: {value:?}") } else { - write!(writer, "{}", field) + write!(writer, "{field}") } }) // Separate each field with a comma. diff --git a/rust/kcl-language-server/src/main.rs b/rust/kcl-language-server/src/main.rs index 319da5fda..5ab78a12a 100644 --- a/rust/kcl-language-server/src/main.rs +++ b/rust/kcl-language-server/src/main.rs @@ -87,10 +87,10 @@ async fn main() -> Result<()> { // Format fields using the provided closure. // We want to make this very concise otherwise the logs are not able to be read by humans. let format = tracing_subscriber::fmt::format::debug_fn(|writer, field, value| { - if format!("{}", field) == "message" { - write!(writer, "{}: {:?}", field, value) + if format!("{field}") == "message" { + write!(writer, "{field}: {value:?}") } else { - write!(writer, "{}", field) + write!(writer, "{field}") } }) // Separate each field with a comma. @@ -151,7 +151,7 @@ async fn run_cmd(opts: &Opts) -> Result<()> { tokio::spawn(async move { if let Some(sig) = signals.forever().next() { - log::info!("received signal: {:?}", sig); + log::info!("received signal: {sig:?}"); log::info!("triggering cleanup..."); // Exit the process. diff --git a/rust/kcl-lib/Cargo.toml b/rust/kcl-lib/Cargo.toml index 2b9643188..4f5d24874 100644 --- a/rust/kcl-lib/Cargo.toml +++ b/rust/kcl-lib/Cargo.toml @@ -2,10 +2,10 @@ name = "kcl-lib" description = "KittyCAD Language implementation and tools" version = "0.2.83" -edition = "2021" +edition = "2024" license = "MIT" repository = "https://github.com/KittyCAD/modeling-app" -rust-version = "1.83" +rust-version = "1.88" authors = ["Jess Frazelle", "Adam Chalmers", "KittyCAD, Inc"] keywords = ["kcl", "KittyCAD", "CAD"] exclude = ["tests/*", "benches/*", "examples/*", "e2e/*", "bindings/*", "fuzz/*"] diff --git a/rust/kcl-lib/benches/benchmark_kcl_samples.rs b/rust/kcl-lib/benches/benchmark_kcl_samples.rs index c72cec297..7aea0e817 100644 --- a/rust/kcl-lib/benches/benchmark_kcl_samples.rs +++ b/rust/kcl-lib/benches/benchmark_kcl_samples.rs @@ -4,7 +4,7 @@ use std::{ path::{Path, PathBuf}, }; -use criterion::{criterion_group, criterion_main, Criterion}; +use criterion::{Criterion, criterion_group, criterion_main}; const IGNORE_DIRS: [&str; 2] = ["step", "screenshots"]; @@ -61,7 +61,7 @@ fn run_benchmarks(c: &mut Criterion) { // Read the file content (panic on failure) let input_content = fs::read_to_string(&input_file) - .unwrap_or_else(|e| panic!("Failed to read main.kcl in directory {}: {}", dir_name, e)); + .unwrap_or_else(|e| panic!("Failed to read main.kcl in directory {dir_name}: {e}")); // Create a benchmark group for this directory let mut group = c.benchmark_group(&dir_name); @@ -72,12 +72,12 @@ fn run_benchmarks(c: &mut Criterion) { #[cfg(feature = "benchmark-execution")] let program = kcl_lib::Program::parse_no_errs(&input_content).unwrap(); - group.bench_function(format!("parse_{}", dir_name), |b| { + group.bench_function(format!("parse_{dir_name}"), |b| { b.iter(|| kcl_lib::Program::parse_no_errs(black_box(&input_content)).unwrap()) }); #[cfg(feature = "benchmark-execution")] - group.bench_function(format!("execute_{}", dir_name), |b| { + group.bench_function(format!("execute_{dir_name}"), |b| { b.iter(|| { if let Err(err) = rt.block_on(async { let ctx = kcl_lib::ExecutorContext::new_with_default_client().await?; @@ -86,7 +86,7 @@ fn run_benchmarks(c: &mut Criterion) { ctx.close().await; Ok::<(), anyhow::Error>(()) }) { - panic!("Failed to execute program: {}", err); + panic!("Failed to execute program: {err}"); } }) }); diff --git a/rust/kcl-lib/benches/compiler_benchmark_criterion.rs b/rust/kcl-lib/benches/compiler_benchmark_criterion.rs index f936d8b45..4a817e651 100644 --- a/rust/kcl-lib/benches/compiler_benchmark_criterion.rs +++ b/rust/kcl-lib/benches/compiler_benchmark_criterion.rs @@ -1,6 +1,6 @@ use std::hint::black_box; -use criterion::{criterion_group, criterion_main, Criterion}; +use criterion::{Criterion, criterion_group, criterion_main}; pub fn bench_parse(c: &mut Criterion) { for (name, file) in [ diff --git a/rust/kcl-lib/benches/digest_benchmark.rs b/rust/kcl-lib/benches/digest_benchmark.rs index df312404b..33c7d0400 100644 --- a/rust/kcl-lib/benches/digest_benchmark.rs +++ b/rust/kcl-lib/benches/digest_benchmark.rs @@ -1,4 +1,4 @@ -use criterion::{criterion_group, criterion_main, Criterion}; +use criterion::{Criterion, criterion_group, criterion_main}; pub fn bench_digest(c: &mut Criterion) { for (name, file) in [ diff --git a/rust/kcl-lib/benches/lsp_semantic_tokens_benchmark_criterion.rs b/rust/kcl-lib/benches/lsp_semantic_tokens_benchmark_criterion.rs index 6a7769ec4..c635357dc 100644 --- a/rust/kcl-lib/benches/lsp_semantic_tokens_benchmark_criterion.rs +++ b/rust/kcl-lib/benches/lsp_semantic_tokens_benchmark_criterion.rs @@ -1,6 +1,6 @@ use std::hint::black_box; -use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion}; +use criterion::{BenchmarkId, Criterion, criterion_group, criterion_main}; use kcl_lib::kcl_lsp_server; use tokio::runtime::Runtime; use tower_lsp::LanguageServer; diff --git a/rust/kcl-lib/e2e/executor/cache.rs b/rust/kcl-lib/e2e/executor/cache.rs index 388d4d925..438643f62 100644 --- a/rust/kcl-lib/e2e/executor/cache.rs +++ b/rust/kcl-lib/e2e/executor/cache.rs @@ -1,9 +1,9 @@ //! Cache testing framework. -use kcl_lib::{bust_cache, ExecError, ExecOutcome}; +use kcl_lib::{ExecError, ExecOutcome, bust_cache}; #[cfg(feature = "artifact-graph")] -use kcl_lib::{exec::Operation, NodePathStep}; -use kcmc::{each_cmd as mcmd, ModelingCmd}; +use kcl_lib::{NodePathStep, exec::Operation}; +use kcmc::{ModelingCmd, each_cmd as mcmd}; use kittycad_modeling_cmds as kcmc; use pretty_assertions::assert_eq; @@ -38,7 +38,7 @@ async fn cache_test( if !variation.other_files.is_empty() { let tmp_dir = std::env::temp_dir(); let tmp_dir = tmp_dir - .join(format!("kcl_test_{}", test_name)) + .join(format!("kcl_test_{test_name}")) .join(uuid::Uuid::new_v4().to_string()); // Create a temporary file for each of the other files. @@ -56,7 +56,7 @@ async fn cache_test( Err(error) => { let report = error.clone().into_miette_report_with_outputs(variation.code).unwrap(); let report = miette::Report::new(report); - panic!("{:?}", report); + panic!("{report:?}"); } }; @@ -69,7 +69,7 @@ async fn cache_test( .and_then(|x| x.decode().map_err(|e| ExecError::BadPng(e.to_string()))) .unwrap(); // Save the snapshot. - let path = crate::assert_out(&format!("cache_{}_{}", test_name, index), &img); + let path = crate::assert_out(&format!("cache_{test_name}_{index}"), &img); img_results.push((path, img, outcome)); } @@ -337,8 +337,7 @@ extrude001 = extrude(profile001, length = 4) // 0] as a more lenient check. .map(|c| !c.range.is_synthetic() && c.node_path.is_empty()) .unwrap_or(false), - "artifact={:?}", - artifact + "artifact={artifact:?}" ); } } diff --git a/rust/kcl-lib/e2e/executor/main.rs b/rust/kcl-lib/e2e/executor/main.rs index 591f735ee..ed8b30ad5 100644 --- a/rust/kcl-lib/e2e/executor/main.rs +++ b/rust/kcl-lib/e2e/executor/main.rs @@ -1,8 +1,8 @@ mod cache; use kcl_lib::{ - test_server::{execute_and_export_step, execute_and_snapshot, execute_and_snapshot_no_auth}, BacktraceItem, ExecError, ModuleId, SourceRange, + test_server::{execute_and_export_step, execute_and_snapshot, execute_and_snapshot_no_auth}, }; /// The minimum permissible difference between asserted twenty-twenty images. @@ -869,11 +869,13 @@ async fn kcl_test_revolve_bad_angle_low() { let result = execute_and_snapshot(code, None).await; assert!(result.is_err()); - assert!(result - .err() - .unwrap() - .to_string() - .contains("Expected angle to be between -360 and 360 and not 0, found `-455`")); + assert!( + result + .err() + .unwrap() + .to_string() + .contains("Expected angle to be between -360 and 360 and not 0, found `-455`") + ); } #[tokio::test(flavor = "multi_thread")] @@ -895,11 +897,13 @@ async fn kcl_test_revolve_bad_angle_high() { let result = execute_and_snapshot(code, None).await; assert!(result.is_err()); - assert!(result - .err() - .unwrap() - .to_string() - .contains("Expected angle to be between -360 and 360 and not 0, found `455`")); + assert!( + result + .err() + .unwrap() + .to_string() + .contains("Expected angle to be between -360 and 360 and not 0, found `455`") + ); } #[tokio::test(flavor = "multi_thread")] @@ -2090,7 +2094,10 @@ async fn kcl_test_better_type_names() { }, None => todo!(), }; - assert_eq!(err, "This function expected the input argument to be one or more Solids or ImportedGeometry but it's actually of type Sketch. You can convert a sketch (2D) into a Solid (3D) by calling a function like `extrude` or `revolve`"); + assert_eq!( + err, + "This function expected the input argument to be one or more Solids or ImportedGeometry but it's actually of type Sketch. You can convert a sketch (2D) into a Solid (3D) by calling a function like `extrude` or `revolve`" + ); } #[tokio::test(flavor = "multi_thread")] diff --git a/rust/kcl-lib/src/coredump/mod.rs b/rust/kcl-lib/src/coredump/mod.rs index 4647c5d73..5f8c66f43 100644 --- a/rust/kcl-lib/src/coredump/mod.rs +++ b/rust/kcl-lib/src/coredump/mod.rs @@ -101,7 +101,7 @@ pub trait CoreDump: Clone { .meta() .create_debug_uploads(vec![kittycad::types::multipart::Attachment { name: "".to_string(), - filepath: Some(format!(r#"modeling-app/coredump-{}.json"#, coredump_id).into()), + filepath: Some(format!(r#"modeling-app/coredump-{coredump_id}.json"#).into()), content_type: Some("application/json".to_string()), data, }]) diff --git a/rust/kcl-lib/src/docs/gen_std_tests.rs b/rust/kcl-lib/src/docs/gen_std_tests.rs index e80d8ad67..0fda03b85 100644 --- a/rust/kcl-lib/src/docs/gen_std_tests.rs +++ b/rust/kcl-lib/src/docs/gen_std_tests.rs @@ -189,7 +189,7 @@ fn generate_example(index: usize, src: &str, props: &ExampleProperties, file_nam index ); let image_data = - std::fs::read(&image_path).unwrap_or_else(|_| panic!("Failed to read image file: {}", image_path)); + std::fs::read(&image_path).unwrap_or_else(|_| panic!("Failed to read image file: {image_path}")); base64::engine::general_purpose::STANDARD.encode(&image_data) }; @@ -225,7 +225,7 @@ fn generate_type_from_kcl(ty: &TyData, file_name: String, example_name: String, let output = hbs.render("kclType", &data)?; let output = cleanup_types(&output, kcl_std); - expectorate::assert_contents(format!("../../docs/kcl-std/{}.md", file_name), &output); + expectorate::assert_contents(format!("../../docs/kcl-std/{file_name}.md"), &output); Ok(()) } @@ -267,7 +267,7 @@ fn generate_mod_from_kcl(m: &ModData, file_name: String) -> Result<()> { }); let output = hbs.render("module", &data)?; - expectorate::assert_contents(format!("../../docs/kcl-std/{}.md", file_name), &output); + expectorate::assert_contents(format!("../../docs/kcl-std/{file_name}.md"), &output); Ok(()) } @@ -334,7 +334,7 @@ fn generate_function_from_kcl( let output = hbs.render("function", &data)?; let output = &cleanup_types(&output, kcl_std); - expectorate::assert_contents(format!("../../docs/kcl-std/{}.md", file_name), output); + expectorate::assert_contents(format!("../../docs/kcl-std/{file_name}.md"), output); Ok(()) } @@ -378,7 +378,7 @@ fn generate_const_from_kcl(cnst: &ConstData, file_name: String, example_name: St let output = hbs.render("const", &data)?; let output = cleanup_types(&output, kcl_std); - expectorate::assert_contents(format!("../../docs/kcl-std/{}.md", file_name), &output); + expectorate::assert_contents(format!("../../docs/kcl-std/{file_name}.md"), &output); Ok(()) } diff --git a/rust/kcl-lib/src/docs/kcl_doc.rs b/rust/kcl-lib/src/docs/kcl_doc.rs index 2b027a105..9121dc373 100644 --- a/rust/kcl-lib/src/docs/kcl_doc.rs +++ b/rust/kcl-lib/src/docs/kcl_doc.rs @@ -8,6 +8,7 @@ use tower_lsp::lsp_types::{ }; use crate::{ + ModuleId, execution::annotations, parsing::{ ast::types::{ @@ -15,7 +16,6 @@ use crate::{ }, token::NumericSuffix, }, - ModuleId, }; pub fn walk_prelude() -> ModData { @@ -97,7 +97,7 @@ fn visit_module(name: &str, preferred_prefix: &str, names: WalkForNames) -> Resu ImportSelector::None { .. } => { let name = import.module_name().unwrap(); if names.contains(&name) { - Some(visit_module(&path[1], &format!("{}::", name), WalkForNames::All)?) + Some(visit_module(&path[1], &format!("{name}::"), WalkForNames::All)?) } else { None } @@ -451,7 +451,7 @@ impl ModData { let (name, qual_name, module_name) = if name == "prelude" { ("std", "std".to_owned(), String::new()) } else { - (name, format!("std::{}", name), "std".to_owned()) + (name, format!("std::{name}"), "std".to_owned()) }; Self { preferred_name: format!("{preferred_prefix}{name}"), @@ -767,14 +767,12 @@ impl ArgData { for s in &arr.elements { let Expr::Literal(lit) = s else { panic!( - "Invalid value in `snippetArray`, all items must be string literals but found {:?}", - s + "Invalid value in `snippetArray`, all items must be string literals but found {s:?}" ); }; let LiteralValue::String(litstr) = &lit.inner.value else { panic!( - "Invalid value in `snippetArray`, all items must be string literals but found {:?}", - s + "Invalid value in `snippetArray`, all items must be string literals but found {s:?}" ); }; items.push(litstr.to_owned()); @@ -816,7 +814,7 @@ impl ArgData { } match self.ty.as_deref() { Some("Sketch") if self.kind == ArgKind::Special => None, - Some(s) if s.starts_with("number") => Some((index, format!(r#"{label}${{{}:10}}"#, index))), + Some(s) if s.starts_with("number") => Some((index, format!(r#"{label}${{{index}:10}}"#))), Some("Point2d") => Some((index + 1, format!(r#"{label}[${{{}:0}}, ${{{}:0}}]"#, index, index + 1))), Some("Point3d") => Some(( index + 2, @@ -831,7 +829,7 @@ impl ArgData { Some("Sketch") | Some("Sketch | Helix") => Some((index, format!(r#"{label}${{{index}:sketch000}}"#))), Some("Edge") => Some((index, format!(r#"{label}${{{index}:tag_or_edge_fn}}"#))), Some("[Edge; 1+]") => Some((index, format!(r#"{label}[${{{index}:tag_or_edge_fn}}]"#))), - Some("Plane") | Some("Solid | Plane") => Some((index, format!(r#"{label}${{{}:XY}}"#, index))), + Some("Plane") | Some("Solid | Plane") => Some((index, format!(r#"{label}${{{index}:XY}}"#))), Some("[TaggedFace; 2]") => Some(( index + 1, format!(r#"{label}[${{{}:tag}}, ${{{}:tag}}]"#, index, index + 1), @@ -841,10 +839,10 @@ impl ArgData { if self.name == "color" { Some((index, format!(r"{label}${{{}:{}}}", index, "\"#ff0000\""))) } else { - Some((index, format!(r#"{label}${{{}:"string"}}"#, index))) + Some((index, format!(r#"{label}${{{index}:"string"}}"#))) } } - Some("bool") => Some((index, format!(r#"{label}${{{}:false}}"#, index))), + Some("bool") => Some((index, format!(r#"{label}${{{index}:false}}"#))), _ => None, } } @@ -1298,7 +1296,10 @@ mod test { continue; } let name = format!("{}-{i}", f.qual_name.replace("::", "-")); - assert!(TEST_NAMES.contains(&&*name), "Missing test for example \"{name}\", maybe need to update kcl-derive-docs/src/example_tests.rs?") + assert!( + TEST_NAMES.contains(&&*name), + "Missing test for example \"{name}\", maybe need to update kcl-derive-docs/src/example_tests.rs?" + ) } } } @@ -1334,7 +1335,9 @@ mod test { }; let Some(DocData::Fn(d)) = data.children.get(&format!("I:{qualname}")) else { - panic!("Could not find data for {NAME} (missing a child entry for {qualname}), maybe need to update kcl-derive-docs/src/example_tests.rs?"); + panic!( + "Could not find data for {NAME} (missing a child entry for {qualname}), maybe need to update kcl-derive-docs/src/example_tests.rs?" + ); }; for (i, eg) in d.examples.iter().enumerate() { @@ -1362,6 +1365,8 @@ mod test { return; } - panic!("Could not find data for {NAME} (no example {number}), maybe need to update kcl-derive-docs/src/example_tests.rs?"); + panic!( + "Could not find data for {NAME} (no example {number}), maybe need to update kcl-derive-docs/src/example_tests.rs?" + ); } } diff --git a/rust/kcl-lib/src/engine/async_tasks/tasks_wasm.rs b/rust/kcl-lib/src/engine/async_tasks/tasks_wasm.rs index 60e647e58..4889d591e 100644 --- a/rust/kcl-lib/src/engine/async_tasks/tasks_wasm.rs +++ b/rust/kcl-lib/src/engine/async_tasks/tasks_wasm.rs @@ -2,11 +2,11 @@ //! tasks. use std::sync::{ - atomic::{AtomicUsize, Ordering}, Arc, + atomic::{AtomicUsize, Ordering}, }; -use tokio::sync::{mpsc, Notify}; +use tokio::sync::{Notify, mpsc}; use crate::errors::KclError; diff --git a/rust/kcl-lib/src/engine/conn.rs b/rust/kcl-lib/src/engine/conn.rs index 1b48cf338..4510b4b80 100644 --- a/rust/kcl-lib/src/engine/conn.rs +++ b/rust/kcl-lib/src/engine/conn.rs @@ -3,26 +3,26 @@ use std::{collections::HashMap, sync::Arc}; -use anyhow::{anyhow, Result}; +use anyhow::{Result, anyhow}; use futures::{SinkExt, StreamExt}; use indexmap::IndexMap; use kcmc::{ + ModelingCmd, websocket::{ BatchResponse, FailureWebSocketResponse, ModelingCmdReq, ModelingSessionData, OkWebSocketResponseData, SuccessWebSocketResponse, WebSocketRequest, WebSocketResponse, }, - ModelingCmd, }; use kittycad_modeling_cmds::{self as kcmc}; -use tokio::sync::{mpsc, oneshot, RwLock}; +use tokio::sync::{RwLock, mpsc, oneshot}; use tokio_tungstenite::tungstenite::Message as WsMsg; use uuid::Uuid; use crate::{ + SourceRange, engine::{AsyncTasks, EngineManager, EngineStats}, errors::{KclError, KclErrorDetails}, execution::{DefaultPlanes, IdGenerator}, - SourceRange, }; #[derive(Debug, PartialEq)] @@ -85,7 +85,7 @@ impl TcpRead { let msg = match msg { Ok(msg) => msg, Err(e) if matches!(e, tokio_tungstenite::tungstenite::Error::Protocol(_)) => { - return Err(WebSocketReadError::Read(e)) + return Err(WebSocketReadError::Read(e)); } Err(e) => return Err(anyhow::anyhow!("Error reading from engine's WebSocket: {e}").into()), }; @@ -427,7 +427,7 @@ impl EngineManager for EngineConnection { request_sent: tx, }) .await - .map_err(|e| KclError::new_engine(KclErrorDetails::new(format!("Failed to send debug: {}", e), vec![])))?; + .map_err(|e| KclError::new_engine(KclErrorDetails::new(format!("Failed to send debug: {e}"), vec![])))?; let _ = rx.await; Ok(()) @@ -463,7 +463,7 @@ impl EngineManager for EngineConnection { .await .map_err(|e| { KclError::new_engine(KclErrorDetails::new( - format!("Failed to send modeling command: {}", e), + format!("Failed to send modeling command: {e}"), vec![source_range], )) })?; @@ -533,7 +533,7 @@ impl EngineManager for EngineConnection { } Err(KclError::new_engine(KclErrorDetails::new( - format!("Modeling command timed out `{}`", id), + format!("Modeling command timed out `{id}`"), vec![source_range], ))) } diff --git a/rust/kcl-lib/src/engine/conn_mock.rs b/rust/kcl-lib/src/engine/conn_mock.rs index f4bc7ef74..2a54f6b57 100644 --- a/rust/kcl-lib/src/engine/conn_mock.rs +++ b/rust/kcl-lib/src/engine/conn_mock.rs @@ -12,16 +12,16 @@ use kcmc::{ WebSocketResponse, }, }; -use kittycad_modeling_cmds::{self as kcmc, websocket::ModelingCmdReq, ImportFiles, ModelingCmd}; +use kittycad_modeling_cmds::{self as kcmc, ImportFiles, ModelingCmd, websocket::ModelingCmdReq}; use tokio::sync::RwLock; use uuid::Uuid; use crate::{ + SourceRange, engine::{AsyncTasks, EngineStats}, errors::KclError, exec::DefaultPlanes, execution::IdGenerator, - SourceRange, }; #[derive(Debug, Clone)] diff --git a/rust/kcl-lib/src/engine/conn_wasm.rs b/rust/kcl-lib/src/engine/conn_wasm.rs index 9f0f11ddf..9d3ae6e48 100644 --- a/rust/kcl-lib/src/engine/conn_wasm.rs +++ b/rust/kcl-lib/src/engine/conn_wasm.rs @@ -11,10 +11,10 @@ use uuid::Uuid; use wasm_bindgen::prelude::*; use crate::{ + SourceRange, engine::{AsyncTasks, EngineStats}, errors::{KclError, KclErrorDetails}, execution::{DefaultPlanes, IdGenerator}, - SourceRange, }; #[wasm_bindgen(module = "/../../src/lang/std/engineConnection.ts")] diff --git a/rust/kcl-lib/src/engine/mod.rs b/rust/kcl-lib/src/engine/mod.rs index 117a6adce..152b72cb9 100644 --- a/rust/kcl-lib/src/engine/mod.rs +++ b/rust/kcl-lib/src/engine/mod.rs @@ -12,15 +12,15 @@ pub mod conn_wasm; use std::{ collections::HashMap, sync::{ - atomic::{AtomicUsize, Ordering}, Arc, + atomic::{AtomicUsize, Ordering}, }, }; pub use async_tasks::AsyncTasks; use indexmap::IndexMap; use kcmc::{ - each_cmd as mcmd, + ModelingCmd, each_cmd as mcmd, length_unit::LengthUnit, ok_response::OkModelingCmdResponse, shared::Color, @@ -28,7 +28,6 @@ use kcmc::{ BatchResponse, ModelingBatch, ModelingCmdReq, ModelingSessionData, OkWebSocketResponseData, WebSocketRequest, WebSocketResponse, }, - ModelingCmd, }; use kittycad_modeling_cmds as kcmc; use parse_display::{Display, FromStr}; @@ -39,9 +38,9 @@ use uuid::Uuid; use web_time::Instant; use crate::{ - errors::{KclError, KclErrorDetails}, - execution::{types::UnitLen, DefaultPlanes, IdGenerator, PlaneInfo, Point3d}, SourceRange, + errors::{KclError, KclErrorDetails}, + execution::{DefaultPlanes, IdGenerator, PlaneInfo, Point3d, types::UnitLen}, }; lazy_static::lazy_static! { @@ -291,7 +290,10 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { // the artifact graph won't care either if its gone since you can't select it // anymore anyways. if let Err(err) = self.async_tasks().join_all().await { - crate::log::logln!("Error waiting for async tasks (this is typically fine and just means that an edge became something else): {:?}", err); + crate::log::logln!( + "Error waiting for async tasks (this is typically fine and just means that an edge became something else): {:?}", + err + ); } // Flush the batch to make sure nothing remains. @@ -499,7 +501,7 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { } _ => { return Err(KclError::new_engine(KclErrorDetails::new( - format!("The request is not a modeling command: {:?}", req), + format!("The request is not a modeling command: {req:?}"), vec![*range], ))); } @@ -529,7 +531,7 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { } else { // We should never get here. Err(KclError::new_engine(KclErrorDetails::new( - format!("Failed to get batch response: {:?}", response), + format!("Failed to get batch response: {response:?}"), vec![source_range], ))) } @@ -544,7 +546,7 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { // an error. let source_range = id_to_source_range.get(cmd_id.as_ref()).cloned().ok_or_else(|| { KclError::new_engine(KclErrorDetails::new( - format!("Failed to get source range for command ID: {:?}", cmd_id), + format!("Failed to get source range for command ID: {cmd_id:?}"), vec![], )) })?; @@ -554,7 +556,7 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { self.parse_websocket_response(ws_resp, source_range) } _ => Err(KclError::new_engine(KclErrorDetails::new( - format!("The final request is not a modeling command: {:?}", final_req), + format!("The final request is not a modeling command: {final_req:?}"), vec![source_range], ))), } @@ -663,7 +665,7 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { let info = DEFAULT_PLANE_INFO.get(&name).ok_or_else(|| { // We should never get here. KclError::new_engine(KclErrorDetails::new( - format!("Failed to get default plane info for: {:?}", name), + format!("Failed to get default plane info for: {name:?}"), vec![source_range], )) })?; @@ -739,7 +741,7 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { // Get the source range for the command. let source_range = id_to_source_range.get(cmd_id).cloned().ok_or_else(|| { KclError::new_engine(KclErrorDetails::new( - format!("Failed to get source range for command ID: {:?}", cmd_id), + format!("Failed to get source range for command ID: {cmd_id:?}"), vec![], )) })?; @@ -754,7 +756,7 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { // Return an error that we did not get an error or the response we wanted. // This should never happen but who knows. Err(KclError::new_engine(KclErrorDetails::new( - format!("Failed to find response for command ID: {:?}", id), + format!("Failed to find response for command ID: {id:?}"), vec![], ))) } diff --git a/rust/kcl-lib/src/errors.rs b/rust/kcl-lib/src/errors.rs index 9561fa91e..59223d0df 100644 --- a/rust/kcl-lib/src/errors.rs +++ b/rust/kcl-lib/src/errors.rs @@ -7,11 +7,11 @@ use tower_lsp::lsp_types::{Diagnostic, DiagnosticSeverity}; #[cfg(feature = "artifact-graph")] use crate::execution::{ArtifactCommand, ArtifactGraph, Operation}; use crate::{ + ModuleId, execution::DefaultPlanes, lsp::IntoDiagnostic, modules::{ModulePath, ModuleSource}, source_range::SourceRange, - ModuleId, }; /// How did the KCL execution fail diff --git a/rust/kcl-lib/src/execution/annotations.rs b/rust/kcl-lib/src/execution/annotations.rs index 9d0652a71..3c8fc3cb5 100644 --- a/rust/kcl-lib/src/execution/annotations.rs +++ b/rust/kcl-lib/src/execution/annotations.rs @@ -2,13 +2,13 @@ use std::str::FromStr; -use kittycad_modeling_cmds::coord::{System, KITTYCAD, OPENGL, VULKAN}; +use kittycad_modeling_cmds::coord::{KITTYCAD, OPENGL, System, VULKAN}; use crate::{ + KclError, SourceRange, errors::KclErrorDetails, execution::types::{UnitAngle, UnitLen}, parsing::ast::types::{Annotation, Expr, LiteralValue, Node, ObjectProperty}, - KclError, SourceRange, }; /// Annotations which should cause re-execution if they change. diff --git a/rust/kcl-lib/src/execution/artifact.rs b/rust/kcl-lib/src/execution/artifact.rs index f5505acde..3de0d0281 100644 --- a/rust/kcl-lib/src/execution/artifact.rs +++ b/rust/kcl-lib/src/execution/artifact.rs @@ -1,20 +1,19 @@ use fnv::FnvHashMap; use indexmap::IndexMap; use kittycad_modeling_cmds::{ - self as kcmc, + self as kcmc, EnableSketchMode, ModelingCmd, ok_response::OkModelingCmdResponse, shared::ExtrusionFaceCapType, websocket::{BatchResponse, OkWebSocketResponseData, WebSocketResponse}, - EnableSketchMode, ModelingCmd, }; -use serde::{ser::SerializeSeq, Serialize}; +use serde::{Serialize, ser::SerializeSeq}; use uuid::Uuid; use crate::{ + KclError, NodePath, SourceRange, errors::KclErrorDetails, execution::ArtifactId, parsing::ast::types::{Node, Program}, - KclError, NodePath, SourceRange, }; #[cfg(test)] @@ -893,7 +892,10 @@ fn artifacts_to_update( ), }; if original_path_ids.len() != face_edge_infos.len() { - internal_error!(range, "EntityMirror or EntityMirrorAcrossEdge response has different number face edge info than original mirrored paths: id={id:?}, cmd={cmd:?}, response={response:?}"); + internal_error!( + range, + "EntityMirror or EntityMirrorAcrossEdge response has different number face edge info than original mirrored paths: id={id:?}, cmd={cmd:?}, response={response:?}" + ); } let mut return_arr = Vec::new(); for (face_edge_info, original_path_id) in face_edge_infos.iter().zip(original_path_ids) { @@ -909,7 +911,10 @@ fn artifacts_to_update( // of its info. let Some(Artifact::Path(original_path)) = artifacts.get(&original_path_id) else { // We couldn't find the original path. This is a bug. - internal_error!(range, "Couldn't find original path for mirror2d: original_path_id={original_path_id:?}, cmd={cmd:?}"); + internal_error!( + range, + "Couldn't find original path for mirror2d: original_path_id={original_path_id:?}, cmd={cmd:?}" + ); }; Path { id: path_id, diff --git a/rust/kcl-lib/src/execution/artifact/mermaid_tests.rs b/rust/kcl-lib/src/execution/artifact/mermaid_tests.rs index 05e55d13e..3f35d4efa 100644 --- a/rust/kcl-lib/src/execution/artifact/mermaid_tests.rs +++ b/rust/kcl-lib/src/execution/artifact/mermaid_tests.rs @@ -268,7 +268,7 @@ impl ArtifactGraph { for (group_id, artifact_ids) in groups { let group_id = *stable_id_map.get(&group_id).unwrap(); writeln!(output, "{prefix}subgraph path{group_id} [Path]")?; - let indented = format!("{} ", prefix); + let indented = format!("{prefix} "); for artifact_id in artifact_ids { let artifact = self.map.get(&artifact_id).unwrap(); let id = *stable_id_map.get(&artifact_id).unwrap(); @@ -353,7 +353,7 @@ impl ArtifactGraph { node_path_display(output, prefix, None, &segment.code_ref)?; } Artifact::Solid2d(_solid2d) => { - writeln!(output, "{prefix}{}[Solid2d]", id)?; + writeln!(output, "{prefix}{id}[Solid2d]")?; } Artifact::StartSketchOnFace(StartSketchOnFace { code_ref, .. }) => { writeln!( @@ -494,24 +494,24 @@ impl ArtifactGraph { match edge.flow { EdgeFlow::SourceToTarget => match edge.direction { EdgeDirection::Forward => { - writeln!(output, "{prefix}{source_id} x{}--> {}", extra, target_id)?; + writeln!(output, "{prefix}{source_id} x{extra}--> {target_id}")?; } EdgeDirection::Backward => { - writeln!(output, "{prefix}{source_id} <{}--x {}", extra, target_id)?; + writeln!(output, "{prefix}{source_id} <{extra}--x {target_id}")?; } EdgeDirection::Bidirectional => { - writeln!(output, "{prefix}{source_id} {}--- {}", extra, target_id)?; + writeln!(output, "{prefix}{source_id} {extra}--- {target_id}")?; } }, EdgeFlow::TargetToSource => match edge.direction { EdgeDirection::Forward => { - writeln!(output, "{prefix}{target_id} x{}--> {}", extra, source_id)?; + writeln!(output, "{prefix}{target_id} x{extra}--> {source_id}")?; } EdgeDirection::Backward => { - writeln!(output, "{prefix}{target_id} <{}--x {}", extra, source_id)?; + writeln!(output, "{prefix}{target_id} <{extra}--x {source_id}")?; } EdgeDirection::Bidirectional => { - writeln!(output, "{prefix}{target_id} {}--- {}", extra, source_id)?; + writeln!(output, "{prefix}{target_id} {extra}--- {source_id}")?; } }, } diff --git a/rust/kcl-lib/src/execution/cache.rs b/rust/kcl-lib/src/execution/cache.rs index 3382e746e..d4840e187 100644 --- a/rust/kcl-lib/src/execution/cache.rs +++ b/rust/kcl-lib/src/execution/cache.rs @@ -6,15 +6,14 @@ use itertools::{EitherOrBoth, Itertools}; use tokio::sync::RwLock; use crate::{ + ExecOutcome, ExecutorContext, execution::{ - annotations, + EnvironmentRef, ExecutorSettings, annotations, memory::Stack, state::{self as exec_state, ModuleInfoMap}, - EnvironmentRef, ExecutorSettings, }, parsing::ast::types::{Annotation, Node, Program}, walk::Node as WalkNode, - ExecOutcome, ExecutorContext, }; lazy_static::lazy_static! { @@ -337,7 +336,7 @@ mod tests { use pretty_assertions::assert_eq; use super::*; - use crate::execution::{parse_execute, parse_execute_with_project_dir, ExecTestResults}; + use crate::execution::{ExecTestResults, parse_execute, parse_execute_with_project_dir}; #[tokio::test(flavor = "multi_thread")] async fn test_get_changed_program_same_code() { @@ -755,7 +754,7 @@ extrude(profile001, length = 100)"# .await; let CacheResult::CheckImportsOnly { reapply_settings, .. } = result else { - panic!("Expected CheckImportsOnly, got {:?}", result); + panic!("Expected CheckImportsOnly, got {result:?}"); }; assert_eq!(reapply_settings, false); @@ -839,7 +838,7 @@ extrude(profile001, length = 100) .await; let CacheResult::CheckImportsOnly { reapply_settings, .. } = result else { - panic!("Expected CheckImportsOnly, got {:?}", result); + panic!("Expected CheckImportsOnly, got {result:?}"); }; assert_eq!(reapply_settings, false); diff --git a/rust/kcl-lib/src/execution/cad_op.rs b/rust/kcl-lib/src/execution/cad_op.rs index 8d56b6865..6c277258b 100644 --- a/rust/kcl-lib/src/execution/cad_op.rs +++ b/rust/kcl-lib/src/execution/cad_op.rs @@ -1,10 +1,10 @@ use indexmap::IndexMap; use serde::Serialize; -use super::{types::NumericType, ArtifactId, KclValue}; +use super::{ArtifactId, KclValue, types::NumericType}; #[cfg(feature = "artifact-graph")] use crate::parsing::ast::types::{Node, Program}; -use crate::{parsing::ast::types::ItemVisibility, ModuleId, NodePath, SourceRange}; +use crate::{ModuleId, NodePath, SourceRange, parsing::ast::types::ItemVisibility}; /// A CAD modeling operation for display in the feature tree, AKA operations /// timeline. @@ -57,7 +57,7 @@ impl Operation { /// If the variant is `StdLibCall`, set the `is_error` field. pub(crate) fn set_std_lib_call_is_error(&mut self, is_err: bool) { match self { - Self::StdLibCall { ref mut is_error, .. } => *is_error = is_err, + Self::StdLibCall { is_error, .. } => *is_error = is_err, Self::VariableDeclaration { .. } | Self::GroupBegin { .. } | Self::GroupEnd => {} } } diff --git a/rust/kcl-lib/src/execution/exec_ast.rs b/rust/kcl-lib/src/execution/exec_ast.rs index 9c60e4393..34639033d 100644 --- a/rust/kcl-lib/src/execution/exec_ast.rs +++ b/rust/kcl-lib/src/execution/exec_ast.rs @@ -3,17 +3,17 @@ use std::collections::HashMap; use async_recursion::async_recursion; use crate::{ + CompilationError, NodePath, errors::{KclError, KclErrorDetails}, execution::{ - annotations, + BodyType, EnvironmentRef, ExecState, ExecutorContext, KclValue, Metadata, ModelingCmdMeta, ModuleArtifactState, + Operation, PlaneType, StatementKind, TagIdentifier, annotations, cad_op::OpKclValue, fn_call::Args, kcl_value::{FunctionSource, TypeDef}, memory, state::ModuleState, types::{NumericType, PrimitiveType, RuntimeType}, - BodyType, EnvironmentRef, ExecState, ExecutorContext, KclValue, Metadata, ModelingCmdMeta, ModuleArtifactState, - Operation, PlaneType, StatementKind, TagIdentifier, }, fmt, modules::{ModuleId, ModulePath, ModuleRepr}, @@ -28,7 +28,6 @@ use crate::{ }, source_range::SourceRange, std::args::TyF64, - CompilationError, NodePath, }; impl<'a> StatementKind<'a> { @@ -198,19 +197,23 @@ impl ExecutorContext { } if ty.is_ok() && !module_exports.contains(&ty_name) { - ty = Err(KclError::new_semantic(KclErrorDetails::new(format!( - "Cannot import \"{}\" from module because it is not exported. Add \"export\" before the definition to export it.", - import_item.name.name - ), - vec![SourceRange::from(&import_item.name)],))); + ty = Err(KclError::new_semantic(KclErrorDetails::new( + format!( + "Cannot import \"{}\" from module because it is not exported. Add \"export\" before the definition to export it.", + import_item.name.name + ), + vec![SourceRange::from(&import_item.name)], + ))); } if mod_value.is_ok() && !module_exports.contains(&mod_name) { - mod_value = Err(KclError::new_semantic(KclErrorDetails::new(format!( - "Cannot import \"{}\" from module because it is not exported. Add \"export\" before the definition to export it.", - import_item.name.name - ), - vec![SourceRange::from(&import_item.name)],))); + mod_value = Err(KclError::new_semantic(KclErrorDetails::new( + format!( + "Cannot import \"{}\" from module because it is not exported. Add \"export\" before the definition to export it.", + import_item.name.name + ), + vec![SourceRange::from(&import_item.name)], + ))); } if value.is_err() && ty.is_err() && mod_value.is_err() { @@ -270,7 +273,7 @@ impl ExecutorContext { .get_from(name, env_ref, source_range, 0) .map_err(|_err| { KclError::new_internal(KclErrorDetails::new( - format!("{} is not defined in module (but was exported?)", name), + format!("{name} is not defined in module (but was exported?)"), vec![source_range], )) })? @@ -431,7 +434,7 @@ impl ExecutorContext { return Err(KclError::new_semantic(KclErrorDetails::new( "User-defined types are not yet supported.".to_owned(), vec![metadata.source_range], - ))) + ))); } }, } @@ -792,11 +795,12 @@ fn var_in_own_ref_err(e: KclError, being_declared: &Option) -> KclError // TODO after June 26th: replace this with a let-chain, // which will be available in Rust 1.88 // https://rust-lang.github.io/rfcs/2497-if-let-chains.html - match (&being_declared, &name) { - (Some(name0), Some(name1)) if name0 == name1 => { - details.message = format!("You can't use `{name0}` because you're currently trying to define it. Use a different variable here instead."); - } - _ => {} + if let (Some(name0), Some(name1)) = (&being_declared, &name) + && name0 == name1 + { + details.message = format!( + "You can't use `{name0}` because you're currently trying to define it. Use a different variable here instead." + ); } KclError::UndefinedValue { details, name } } @@ -1077,7 +1081,7 @@ impl Node { (&left_value, &right_value) { return Ok(KclValue::String { - value: format!("{}{}", left, right), + value: format!("{left}{right}"), meta, }); } @@ -1237,7 +1241,9 @@ impl Node { exec_state.clear_units_warnings(&sr); let mut err = CompilationError::err( sr, - format!("{} numbers which have unknown or incompatible units.\nYou can probably fix this error by specifying the units using type ascription, e.g., `len: number(mm)` or `(a * b): number(deg)`.", verb), + format!( + "{verb} numbers which have unknown or incompatible units.\nYou can probably fix this error by specifying the units using type ascription, e.g., `len: number(mm)` or `(a * b): number(deg)`." + ), ); err.tag = crate::errors::Tag::UnknownNumericUnits; exec_state.warn(err); @@ -1417,7 +1423,7 @@ async fn inner_execute_pipe_body( for expression in body { if let Expr::TagDeclarator(_) = expression { return Err(KclError::new_semantic(KclErrorDetails::new( - format!("This cannot be in a PipeExpression: {:?}", expression), + format!("This cannot be in a PipeExpression: {expression:?}"), vec![expression.into()], ))); } @@ -1699,9 +1705,15 @@ fn jvalue_to_prop(value: &KclValue, property_sr: Vec, name: &str) - let make_err = |message: String| Err::(KclError::new_semantic(KclErrorDetails::new(message, property_sr))); match value { - n @ KclValue::Number{value: num, ty, .. } => { - if !matches!(ty, NumericType::Known(crate::exec::UnitType::Count) | NumericType::Default { .. } | NumericType::Any ) { - return make_err(format!("arrays can only be indexed by non-dimensioned numbers, found {}", n.human_friendly_type())); + n @ KclValue::Number { value: num, ty, .. } => { + if !matches!( + ty, + NumericType::Known(crate::exec::UnitType::Count) | NumericType::Default { .. } | NumericType::Any + ) { + return make_err(format!( + "arrays can only be indexed by non-dimensioned numbers, found {}", + n.human_friendly_type() + )); } let num = *num; if num < 0.0 { @@ -1711,13 +1723,15 @@ fn jvalue_to_prop(value: &KclValue, property_sr: Vec, name: &str) - if let Some(nearest_int) = nearest_int { Ok(Property::UInt(nearest_int)) } else { - make_err(format!("'{num}' is not an integer, so you can't index an array with it")) + make_err(format!( + "'{num}' is not an integer, so you can't index an array with it" + )) } } - KclValue::String{value: x, meta:_} => Ok(Property::String(x.to_owned())), - _ => { - make_err(format!("{name} is not a valid property/index, you can only use a string to get the property of an object, or an int (>= 0) to get an item in an array")) - } + KclValue::String { value: x, meta: _ } => Ok(Property::String(x.to_owned())), + _ => make_err(format!( + "{name} is not a valid property/index, you can only use a string to get the property of an object, or an int (>= 0) to get an item in an array" + )), } } @@ -1745,9 +1759,9 @@ mod test { use super::*; use crate::{ - exec::UnitType, - execution::{parse_execute, ContextType}, ExecutorSettings, UnitLen, + exec::UnitType, + execution::{ContextType, parse_execute}, }; #[tokio::test(flavor = "multi_thread")] @@ -1777,7 +1791,7 @@ arr1 = [42]: [number(cm)] .get_from("arr1", result.mem_env, SourceRange::default(), 0) .unwrap(); if let KclValue::HomArray { value, ty } = arr1 { - assert_eq!(value.len(), 1, "Expected Vec with specific length: found {:?}", value); + assert_eq!(value.len(), 1, "Expected Vec with specific length: found {value:?}"); assert_eq!(*ty, RuntimeType::known_length(UnitLen::Cm)); // Compare, ignoring meta. if let KclValue::Number { value, ty, .. } = &value[0] { @@ -1946,7 +1960,7 @@ d = b + c .await .map_err(|err| { KclError::new_internal(KclErrorDetails::new( - format!("Failed to create mock engine connection: {}", err), + format!("Failed to create mock engine connection: {err}"), vec![SourceRange::default()], )) }) diff --git a/rust/kcl-lib/src/execution/fn_call.rs b/rust/kcl-lib/src/execution/fn_call.rs index 5188597f3..778140385 100644 --- a/rust/kcl-lib/src/execution/fn_call.rs +++ b/rust/kcl-lib/src/execution/fn_call.rs @@ -2,19 +2,19 @@ use async_recursion::async_recursion; use indexmap::IndexMap; use crate::{ + CompilationError, NodePath, errors::{KclError, KclErrorDetails}, execution::{ + BodyType, EnvironmentRef, ExecState, ExecutorContext, KclValue, Metadata, StatementKind, TagEngineInfo, + TagIdentifier, cad_op::{Group, OpArg, OpKclValue, Operation}, kcl_value::FunctionSource, memory, types::RuntimeType, - BodyType, EnvironmentRef, ExecState, ExecutorContext, KclValue, Metadata, StatementKind, TagEngineInfo, - TagIdentifier, }, parsing::ast::types::{CallExpressionKw, DefaultParamVal, FunctionExpression, Node, Program, Type}, source_range::SourceRange, std::StdFn, - CompilationError, NodePath, }; #[derive(Debug, Clone)] @@ -269,7 +269,7 @@ impl Node { }; KclError::new_undefined_value( KclErrorDetails::new( - format!("Result of user-defined function {} is undefined", fn_name), + format!("Result of user-defined function {fn_name} is undefined"), source_ranges, ), None, @@ -445,7 +445,7 @@ fn update_memory_for_tags_of_geometry(result: &mut KclValue, exec_state: &mut Ex } } } - KclValue::Solid { ref mut value } => { + KclValue::Solid { value } => { for v in &value.value { if let Some(tag) = v.get_tag() { // Get the past tag and update it. @@ -555,9 +555,9 @@ fn type_err_str(expected: &Type, found: &KclValue, source_range: &SourceRange, e let found_human = found.human_friendly_type(); let found_ty = found.principal_type_string(); let found_str = if found_human == found_ty || found_human == format!("a {}", strip_backticks(&found_ty)) { - format!("a value with type {}", found_ty) + format!("a value with type {found_ty}") } else { - format!("{found_human} (with type {})", found_ty) + format!("{found_human} (with type {found_ty})") }; let mut result = format!("{expected_str}, but found {found_str}."); @@ -626,7 +626,7 @@ fn type_check_params_kw( format!( "`{label}` is not an argument of {}", fn_name - .map(|n| format!("`{}`", n)) + .map(|n| format!("`{n}`")) .unwrap_or_else(|| "this function".to_owned()), ), )); @@ -676,7 +676,7 @@ fn type_check_params_kw( format!( "The input argument of {} requires {}", fn_name - .map(|n| format!("`{}`", n)) + .map(|n| format!("`{n}`")) .unwrap_or_else(|| "this function".to_owned()), type_err_str(ty, &arg.1.value, &arg.1.source_range, exec_state), ), @@ -691,7 +691,7 @@ fn type_check_params_kw( format!( "{} expects an unlabeled first argument (`@{name}`), but it is labelled in the call", fn_name - .map(|n| format!("The function `{}`", n)) + .map(|n| format!("The function `{n}`")) .unwrap_or_else(|| "This function".to_owned()), ), )); @@ -721,7 +721,7 @@ fn assign_args_to_params_kw( )?; } None => match default { - Some(ref default_val) => { + Some(default_val) => { let value = KclValue::from_default_param(default_val.clone(), exec_state); exec_state .mut_stack() @@ -729,10 +729,7 @@ fn assign_args_to_params_kw( } None => { return Err(KclError::new_semantic(KclErrorDetails::new( - format!( - "This function requires a parameter {}, but you haven't passed it one.", - name - ), + format!("This function requires a parameter {name}, but you haven't passed it one."), source_ranges, ))); } @@ -746,7 +743,9 @@ fn assign_args_to_params_kw( let Some(unlabeled) = unlabelled else { return Err(if args.kw_args.labeled.contains_key(param_name) { KclError::new_semantic(KclErrorDetails::new( - format!("The function does declare a parameter named '{param_name}', but this parameter doesn't use a label. Try removing the `{param_name}:`"), + format!( + "The function does declare a parameter named '{param_name}', but this parameter doesn't use a label. Try removing the `{param_name}:`" + ), source_ranges, )) } else { @@ -799,7 +798,7 @@ mod test { use super::*; use crate::{ - execution::{memory::Stack, parse_execute, types::NumericType, ContextType}, + execution::{ContextType, memory::Stack, parse_execute, types::NumericType}, parsing::ast::types::{DefaultParamVal, Identifier, Parameter}, }; diff --git a/rust/kcl-lib/src/execution/geometry.rs b/rust/kcl-lib/src/execution/geometry.rs index 55faf9c10..2a091be4a 100644 --- a/rust/kcl-lib/src/execution/geometry.rs +++ b/rust/kcl-lib/src/execution/geometry.rs @@ -3,16 +3,16 @@ use std::ops::{Add, AddAssign, Mul}; use anyhow::Result; use indexmap::IndexMap; use kittycad_modeling_cmds as kcmc; -use kittycad_modeling_cmds::{each_cmd as mcmd, length_unit::LengthUnit, websocket::ModelingCmdReq, ModelingCmd}; +use kittycad_modeling_cmds::{ModelingCmd, each_cmd as mcmd, length_unit::LengthUnit, websocket::ModelingCmdReq}; use parse_display::{Display, FromStr}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use crate::{ - engine::{PlaneName, DEFAULT_PLANE_INFO}, + engine::{DEFAULT_PLANE_INFO, PlaneName}, errors::{KclError, KclErrorDetails}, execution::{ - types::NumericType, ArtifactId, ExecState, ExecutorContext, Metadata, TagEngineInfo, TagIdentifier, UnitLen, + ArtifactId, ExecState, ExecutorContext, Metadata, TagEngineInfo, TagIdentifier, UnitLen, types::NumericType, }, parsing::ast::types::{Node, NodeRef, TagDeclarator, TagNode}, std::{args::TyF64, sketch::PlaneData}, @@ -472,7 +472,7 @@ impl TryFrom for PlaneInfo { PlaneData::Plane(_) => { // We will never get here since we already checked for PlaneData::Plane. return Err(KclError::new_internal(KclErrorDetails::new( - format!("PlaneData {:?} not found", value), + format!("PlaneData {value:?} not found"), Default::default(), ))); } @@ -480,7 +480,7 @@ impl TryFrom for PlaneInfo { let info = DEFAULT_PLANE_INFO.get(&name).ok_or_else(|| { KclError::new_internal(KclErrorDetails::new( - format!("Plane {} not found", name), + format!("Plane {name} not found"), Default::default(), )) })?; @@ -815,8 +815,8 @@ impl EdgeCut { pub fn set_id(&mut self, id: uuid::Uuid) { match self { - EdgeCut::Fillet { id: ref mut i, .. } => *i = id, - EdgeCut::Chamfer { id: ref mut i, .. } => *i = id, + EdgeCut::Fillet { id: i, .. } => *i = id, + EdgeCut::Chamfer { id: i, .. } => *i = id, } } @@ -829,8 +829,8 @@ impl EdgeCut { pub fn set_edge_id(&mut self, id: uuid::Uuid) { match self { - EdgeCut::Fillet { edge_id: ref mut i, .. } => *i = id, - EdgeCut::Chamfer { edge_id: ref mut i, .. } => *i = id, + EdgeCut::Fillet { edge_id: i, .. } => *i = id, + EdgeCut::Chamfer { edge_id: i, .. } => *i = id, } } diff --git a/rust/kcl-lib/src/execution/import.rs b/rust/kcl-lib/src/execution/import.rs index 9d97fe684..4422ead34 100644 --- a/rust/kcl-lib/src/execution/import.rs +++ b/rust/kcl-lib/src/execution/import.rs @@ -2,12 +2,12 @@ use std::str::FromStr; use anyhow::Result; use kcmc::{ - coord::{System, KITTYCAD}, + ImportFile, ModelingCmd, + coord::{KITTYCAD, System}, each_cmd as mcmd, format::InputFormat3d, shared::FileImportFormat, units::UnitLength, - ImportFile, ModelingCmd, }; use kittycad_modeling_cmds as kcmc; use serde::{Deserialize, Serialize}; @@ -16,8 +16,8 @@ use uuid::Uuid; use crate::{ errors::{KclError, KclErrorDetails}, execution::{ - annotations, typed_path::TypedPath, types::UnitLen, ExecState, ExecutorContext, ImportedGeometry, - ModelingCmdMeta, + ExecState, ExecutorContext, ImportedGeometry, ModelingCmdMeta, annotations, typed_path::TypedPath, + types::UnitLen, }, fs::FileSystem, parsing::ast::types::{Annotation, Node}, @@ -184,7 +184,7 @@ pub(super) fn format_from_annotations( annotations::IMPORT_LENGTH_UNIT ), vec![p.as_source_range()], - ))) + ))); } } } @@ -225,7 +225,7 @@ fn set_coords(fmt: &mut InputFormat3d, coords_str: &str, source_range: SourceRan annotations::IMPORT_COORDS ), vec![source_range], - ))) + ))); } } @@ -246,7 +246,7 @@ fn set_length_unit(fmt: &mut InputFormat3d, units_str: &str, source_range: Sourc annotations::IMPORT_LENGTH_UNIT ), vec![source_range], - ))) + ))); } } @@ -291,7 +291,9 @@ fn get_import_format_from_extension(ext: &str) -> Result { } else if ext == "glb" { FileImportFormat::Gltf } else { - anyhow::bail!("unknown source format for file extension: {ext}. Try setting the `--src-format` flag explicitly or use a valid format.") + anyhow::bail!( + "unknown source format for file extension: {ext}. Try setting the `--src-format` flag explicitly or use a valid format." + ) } } }; diff --git a/rust/kcl-lib/src/execution/import_graph.rs b/rust/kcl-lib/src/execution/import_graph.rs index 483eda8ad..9c8628557 100644 --- a/rust/kcl-lib/src/execution/import_graph.rs +++ b/rust/kcl-lib/src/execution/import_graph.rs @@ -6,12 +6,12 @@ use std::{ use anyhow::Result; use crate::{ + ExecState, ExecutorContext, KclError, ModuleId, SourceRange, errors::KclErrorDetails, execution::typed_path::TypedPath, modules::{ModulePath, ModuleRepr}, parsing::ast::types::{ImportPath, ImportStatement, Node as AstNode}, walk::{Node, Visitable}, - ExecState, ExecutorContext, KclError, ModuleId, SourceRange, }; /// Specific dependency between two modules. The 0th element of this info @@ -147,7 +147,7 @@ fn import_dependencies( ret.lock() .map_err(|err| { KclError::new_internal(KclErrorDetails::new( - format!("Failed to lock mutex: {}", err), + format!("Failed to lock mutex: {err}"), Default::default(), )) })? @@ -157,7 +157,7 @@ fn import_dependencies( ret.lock() .map_err(|err| { KclError::new_internal(KclErrorDetails::new( - format!("Failed to lock mutex: {}", err), + format!("Failed to lock mutex: {err}"), Default::default(), )) })? @@ -179,7 +179,7 @@ fn import_dependencies( let ret = ret.lock().map_err(|err| { KclError::new_internal(KclErrorDetails::new( - format!("Failed to lock mutex: {}", err), + format!("Failed to lock mutex: {err}"), Default::default(), )) })?; @@ -224,7 +224,7 @@ pub(crate) async fn import_universe( let repr = { let Some(module_info) = exec_state.get_module(module_id) else { return Err(KclError::new_internal(KclErrorDetails::new( - format!("Module {} not found", module_id), + format!("Module {module_id} not found"), vec![import_stmt.into()], ))); }; @@ -244,9 +244,7 @@ mod tests { use crate::parsing::ast::types::{ImportSelector, Program}; macro_rules! kcl { - ( $kcl:expr ) => {{ - $crate::parsing::top_level_parse($kcl).unwrap() - }}; + ( $kcl:expr_2021 ) => {{ $crate::parsing::top_level_parse($kcl).unwrap() }}; } fn into_module_info(program: AstNode) -> DependencyInfo { diff --git a/rust/kcl-lib/src/execution/kcl_value.rs b/rust/kcl-lib/src/execution/kcl_value.rs index 53456fa2d..71c2dba66 100644 --- a/rust/kcl-lib/src/execution/kcl_value.rs +++ b/rust/kcl-lib/src/execution/kcl_value.rs @@ -5,18 +5,18 @@ use schemars::JsonSchema; use serde::Serialize; use crate::{ + CompilationError, KclError, ModuleId, SourceRange, errors::KclErrorDetails, execution::{ - annotations::{SETTINGS, SETTINGS_UNIT_LENGTH}, - types::{NumericType, PrimitiveType, RuntimeType, UnitLen}, EnvironmentRef, ExecState, Face, Geometry, GeometryWithImportedGeometry, Helix, ImportedGeometry, MetaSettings, Metadata, Plane, Sketch, Solid, TagIdentifier, + annotations::{SETTINGS, SETTINGS_UNIT_LENGTH}, + types::{NumericType, PrimitiveType, RuntimeType, UnitLen}, }, parsing::ast::types::{ DefaultParamVal, FunctionExpression, KclNone, Literal, LiteralValue, Node, TagDeclarator, TagNode, }, - std::{args::TyF64, StdFnProps}, - CompilationError, KclError, ModuleId, SourceRange, + std::{StdFnProps, args::TyF64}, }; pub type KclObjectFields = HashMap; @@ -136,9 +136,9 @@ impl JsonSchema for FunctionSource { "FunctionSource".to_owned() } - fn json_schema(gen: &mut schemars::gen::SchemaGenerator) -> schemars::schema::Schema { + fn json_schema(r#gen: &mut schemars::r#gen::SchemaGenerator) -> schemars::schema::Schema { // TODO: Actually generate a reasonable schema. - gen.subschema_for::<()>() + r#gen.subschema_for::<()>() } } @@ -587,7 +587,7 @@ impl KclValue { match self { KclValue::TagIdentifier(t) => Ok(*t.clone()), _ => Err(KclError::new_semantic(KclErrorDetails::new( - format!("Not a tag identifier: {:?}", self), + format!("Not a tag identifier: {self:?}"), self.clone().into(), ))), } @@ -598,7 +598,7 @@ impl KclValue { match self { KclValue::TagDeclarator(t) => Ok((**t).clone()), _ => Err(KclError::new_semantic(KclErrorDetails::new( - format!("Not a tag declarator: {:?}", self), + format!("Not a tag declarator: {self:?}"), self.clone().into(), ))), } diff --git a/rust/kcl-lib/src/execution/memory.rs b/rust/kcl-lib/src/execution/memory.rs index 7547a15f1..a420a6922 100644 --- a/rust/kcl-lib/src/execution/memory.rs +++ b/rust/kcl-lib/src/execution/memory.rs @@ -207,8 +207,8 @@ use std::{ fmt, pin::Pin, sync::{ - atomic::{AtomicBool, AtomicUsize, Ordering}, Arc, + atomic::{AtomicBool, AtomicUsize, Ordering}, }, }; @@ -489,7 +489,7 @@ impl ProgramMemory { } Err(KclError::new_undefined_value( - KclErrorDetails::new(format!("`{}` is not defined", var), vec![]), + KclErrorDetails::new(format!("`{var}` is not defined"), vec![]), Some(var.to_owned()), )) } @@ -647,7 +647,7 @@ impl Stack { let env = self.memory.get_env(self.current_env.index()); if env.contains_key(&key) { return Err(KclError::new_value_already_defined(KclErrorDetails::new( - format!("Cannot redefine `{}`", key), + format!("Cannot redefine `{key}`"), vec![source_range], ))); } @@ -1047,7 +1047,7 @@ mod env { } /// Take all bindings from the environment. - pub(super) fn take_bindings(self: Pin<&mut Self>) -> impl Iterator { + pub(super) fn take_bindings(self: Pin<&mut Self>) -> impl Iterator + use<> { // SAFETY: caller must have unique access since self is mut. We're not moving or invalidating `self`. let bindings = std::mem::take(unsafe { self.bindings.get().as_mut().unwrap() }); bindings.into_iter() diff --git a/rust/kcl-lib/src/execution/mod.rs b/rust/kcl-lib/src/execution/mod.rs index 111a4edaf..5c6f4c209 100644 --- a/rust/kcl-lib/src/execution/mod.rs +++ b/rust/kcl-lib/src/execution/mod.rs @@ -16,10 +16,9 @@ pub(crate) use import::PreImportedGeometry; use indexmap::IndexMap; pub use kcl_value::{KclObjectFields, KclValue}; use kcmc::{ - each_cmd as mcmd, - ok_response::{output::TakeSnapshot, OkModelingCmdResponse}, + ImageFormat, ModelingCmd, each_cmd as mcmd, + ok_response::{OkModelingCmdResponse, output::TakeSnapshot}, websocket::{ModelingSessionData, OkWebSocketResponseData}, - ImageFormat, ModelingCmd, }; use kittycad_modeling_cmds::{self as kcmc, id::ModelingCmdId}; pub use memory::EnvironmentRef; @@ -31,6 +30,7 @@ pub use state::{ExecState, MetaSettings}; use uuid::Uuid; use crate::{ + CompilationError, ExecError, KclErrorWithOutputs, engine::{EngineManager, GridScaleBehavior}, errors::{KclError, KclErrorDetails}, execution::{ @@ -43,7 +43,6 @@ use crate::{ modules::{ModuleId, ModulePath, ModuleRepr}, parsing::ast::types::{Expr, ImportPath, NodeRef}, source_range::SourceRange, - CompilationError, ExecError, KclErrorWithOutputs, }; pub(crate) mod annotations; @@ -1329,7 +1328,7 @@ impl ExecutorContext { created: if deterministic_time { Some("2021-01-01T00:00:00Z".parse().map_err(|e| { KclError::new_internal(crate::errors::KclErrorDetails::new( - format!("Failed to parse date: {}", e), + format!("Failed to parse date: {e}"), vec![SourceRange::default()], )) })?) @@ -1409,7 +1408,7 @@ pub(crate) async fn parse_execute_with_project_dir( engine: Arc::new(Box::new( crate::engine::conn_mock::EngineConnection::new().await.map_err(|err| { KclError::new_internal(crate::errors::KclErrorDetails::new( - format!("Failed to create mock engine connection: {}", err), + format!("Failed to create mock engine connection: {err}"), vec![SourceRange::default()], )) })?, @@ -1446,7 +1445,7 @@ mod tests { use pretty_assertions::assert_eq; use super::*; - use crate::{errors::KclErrorDetails, execution::memory::Stack, ModuleId}; + use crate::{ModuleId, errors::KclErrorDetails, execution::memory::Stack}; /// Convenience function to get a JSON value from memory and unwrap. #[track_caller] @@ -2045,8 +2044,7 @@ notFunction = !x"; fn_err .message() .starts_with("Cannot apply unary operator ! to non-boolean value: "), - "Actual error: {:?}", - fn_err + "Actual error: {fn_err:?}" ); let code8 = " @@ -2059,8 +2057,7 @@ notTagDeclarator = !myTagDeclarator"; tag_declarator_err .message() .starts_with("Cannot apply unary operator ! to non-boolean value: a tag declarator"), - "Actual error: {:?}", - tag_declarator_err + "Actual error: {tag_declarator_err:?}" ); let code9 = " @@ -2073,8 +2070,7 @@ notTagIdentifier = !myTag"; tag_identifier_err .message() .starts_with("Cannot apply unary operator ! to non-boolean value: a tag identifier"), - "Actual error: {:?}", - tag_identifier_err + "Actual error: {tag_identifier_err:?}" ); let code10 = "notPipe = !(1 |> 2)"; @@ -2226,7 +2222,7 @@ w = f() + f() if let Err(err) = ctx.run_with_caching(old_program).await { let report = err.into_miette_report_with_outputs(code).unwrap(); let report = miette::Report::new(report); - panic!("Error executing program: {:?}", report); + panic!("Error executing program: {report:?}"); } // Get the id_generator from the first execution. diff --git a/rust/kcl-lib/src/execution/modeling.rs b/rust/kcl-lib/src/execution/modeling.rs index d93ecff13..2394c0afe 100644 --- a/rust/kcl-lib/src/execution/modeling.rs +++ b/rust/kcl-lib/src/execution/modeling.rs @@ -8,10 +8,10 @@ use uuid::Uuid; #[cfg(feature = "artifact-graph")] use crate::exec::ArtifactCommand; use crate::{ + ExecState, ExecutorContext, KclError, SourceRange, exec::{IdGenerator, KclValue}, execution::Solid, std::Args, - ExecState, ExecutorContext, KclError, SourceRange, }; /// Context and metadata needed to send a single modeling command. diff --git a/rust/kcl-lib/src/execution/state.rs b/rust/kcl-lib/src/execution/state.rs index 53614c644..d6088153e 100644 --- a/rust/kcl-lib/src/execution/state.rs +++ b/rust/kcl-lib/src/execution/state.rs @@ -9,20 +9,19 @@ use uuid::Uuid; #[cfg(feature = "artifact-graph")] use crate::execution::{Artifact, ArtifactCommand, ArtifactGraph, ArtifactId}; use crate::{ + CompilationError, EngineManager, ExecutorContext, KclErrorWithOutputs, errors::{KclError, KclErrorDetails, Severity}, exec::DefaultPlanes, execution::{ - annotations, + EnvironmentRef, ExecOutcome, ExecutorSettings, KclValue, UnitAngle, UnitLen, annotations, cad_op::Operation, id_generator::IdGenerator, memory::{ProgramMemory, Stack}, types::{self, NumericType}, - EnvironmentRef, ExecOutcome, ExecutorSettings, KclValue, UnitAngle, UnitLen, }, modules::{ModuleId, ModuleInfo, ModuleLoader, ModulePath, ModuleRepr, ModuleSource}, parsing::ast::types::{Annotation, NodeRef}, source_range::SourceRange, - CompilationError, EngineManager, ExecutorContext, KclErrorWithOutputs, }; /// State for executing a program. @@ -555,7 +554,7 @@ impl MetaSettings { annotations::SETTINGS_UNIT_ANGLE ), vec![annotation.as_source_range()], - ))) + ))); } } } diff --git a/rust/kcl-lib/src/execution/typed_path.rs b/rust/kcl-lib/src/execution/typed_path.rs index 2dabe9709..16757a1df 100644 --- a/rust/kcl-lib/src/execution/typed_path.rs +++ b/rust/kcl-lib/src/execution/typed_path.rs @@ -220,9 +220,9 @@ impl schemars::JsonSchema for TypedPath { "TypedPath".to_owned() } - fn json_schema(gen: &mut schemars::gen::SchemaGenerator) -> schemars::schema::Schema { + fn json_schema(r#gen: &mut schemars::r#gen::SchemaGenerator) -> schemars::schema::Schema { // TODO: Actually generate a reasonable schema. - gen.subschema_for::() + r#gen.subschema_for::() } } diff --git a/rust/kcl-lib/src/execution/types.rs b/rust/kcl-lib/src/execution/types.rs index 7708516a3..6de88d39b 100644 --- a/rust/kcl-lib/src/execution/types.rs +++ b/rust/kcl-lib/src/execution/types.rs @@ -5,17 +5,17 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use crate::{ + CompilationError, SourceRange, execution::{ + ExecState, Plane, PlaneInfo, Point3d, kcl_value::{KclValue, TypeDef}, memory::{self}, - ExecState, Plane, PlaneInfo, Point3d, }, parsing::{ ast::types::{PrimitiveType as AstPrimitiveType, Type}, token::NumericSuffix, }, std::args::{FromKclValue, TyF64}, - CompilationError, SourceRange, }; #[derive(Debug, Clone, PartialEq)] @@ -210,7 +210,7 @@ impl RuntimeType { let ty_val = exec_state .stack() .get(&format!("{}{}", memory::TYPE_PREFIX, alias), source_range) - .map_err(|_| CompilationError::err(source_range, format!("Unknown type: {}", alias)))?; + .map_err(|_| CompilationError::err(source_range, format!("Unknown type: {alias}")))?; Ok(match ty_val { KclValue::Type { value, .. } => match value { @@ -241,7 +241,7 @@ impl RuntimeType { "a tuple with values of types ({})", tys.iter().map(Self::human_friendly_type).collect::>().join(", ") ), - RuntimeType::Object(_) => format!("an object with fields {}", self), + RuntimeType::Object(_) => format!("an object with fields {self}"), } } @@ -1529,7 +1529,7 @@ impl KclValue { #[cfg(test)] mod test { use super::*; - use crate::execution::{parse_execute, ExecTestResults}; + use crate::execution::{ExecTestResults, parse_execute}; fn values(exec_state: &mut ExecState) -> Vec { vec![ @@ -1975,14 +1975,16 @@ mod test { ]) ) ); - assert!(RuntimeType::Union(vec![ - RuntimeType::Primitive(PrimitiveType::Number(NumericType::Any)), - RuntimeType::Primitive(PrimitiveType::Boolean) - ]) - .subtype(&RuntimeType::Union(vec![ - RuntimeType::Primitive(PrimitiveType::Number(NumericType::Any)), - RuntimeType::Primitive(PrimitiveType::Boolean) - ]))); + assert!( + RuntimeType::Union(vec![ + RuntimeType::Primitive(PrimitiveType::Number(NumericType::Any)), + RuntimeType::Primitive(PrimitiveType::Boolean) + ]) + .subtype(&RuntimeType::Union(vec![ + RuntimeType::Primitive(PrimitiveType::Number(NumericType::Any)), + RuntimeType::Primitive(PrimitiveType::Boolean) + ])) + ); // Covariance let count = KclValue::Number { diff --git a/rust/kcl-lib/src/fs/local.rs b/rust/kcl-lib/src/fs/local.rs index ed1dd76ea..8f545f447 100644 --- a/rust/kcl-lib/src/fs/local.rs +++ b/rust/kcl-lib/src/fs/local.rs @@ -3,10 +3,10 @@ use anyhow::Result; use crate::{ + SourceRange, errors::{KclError, KclErrorDetails}, execution::typed_path::TypedPath, fs::FileSystem, - SourceRange, }; #[derive(Debug, Clone)] diff --git a/rust/kcl-lib/src/fs/mod.rs b/rust/kcl-lib/src/fs/mod.rs index 7bdcaed58..555d1fa1a 100644 --- a/rust/kcl-lib/src/fs/mod.rs +++ b/rust/kcl-lib/src/fs/mod.rs @@ -2,7 +2,7 @@ use anyhow::Result; -use crate::{execution::typed_path::TypedPath, SourceRange}; +use crate::{SourceRange, execution::typed_path::TypedPath}; #[cfg(not(target_arch = "wasm32"))] pub mod local; diff --git a/rust/kcl-lib/src/fs/wasm.rs b/rust/kcl-lib/src/fs/wasm.rs index 03a8c3461..12b6cebda 100644 --- a/rust/kcl-lib/src/fs/wasm.rs +++ b/rust/kcl-lib/src/fs/wasm.rs @@ -4,11 +4,11 @@ use anyhow::Result; use wasm_bindgen::prelude::wasm_bindgen; use crate::{ + SourceRange, errors::{KclError, KclErrorDetails}, execution::typed_path::TypedPath, fs::FileSystem, wasm::JsFuture, - SourceRange, }; #[wasm_bindgen(module = "/../../src/lang/std/fileSystemManager.ts")] diff --git a/rust/kcl-lib/src/lib.rs b/rust/kcl-lib/src/lib.rs index 95cdde534..7aebd7d20 100644 --- a/rust/kcl-lib/src/lib.rs +++ b/rust/kcl-lib/src/lib.rs @@ -90,10 +90,9 @@ pub use errors::{ ReportWithOutputs, }; pub use execution::{ - bust_cache, clear_mem_cache, + ExecOutcome, ExecState, ExecutorContext, ExecutorSettings, MetaSettings, Point2d, bust_cache, clear_mem_cache, typed_path::TypedPath, types::{UnitAngle, UnitLen}, - ExecOutcome, ExecState, ExecutorContext, ExecutorSettings, MetaSettings, Point2d, }; pub use lsp::{ copilot::Backend as CopilotLspBackend, @@ -101,7 +100,7 @@ pub use lsp::{ }; pub use modules::ModuleId; pub use parsing::ast::types::{FormatOptions, NodePath, Step as NodePathStep}; -pub use settings::types::{project::ProjectConfiguration, Configuration, UnitLength}; +pub use settings::types::{Configuration, UnitLength, project::ProjectConfiguration}; pub use source_range::SourceRange; #[cfg(not(target_arch = "wasm32"))] pub use unparser::{recast_dir, walk_dir}; @@ -109,12 +108,12 @@ pub use unparser::{recast_dir, walk_dir}; // Rather than make executor public and make lots of it pub(crate), just re-export into a new module. // Ideally we wouldn't export these things at all, they should only be used for testing. pub mod exec { - pub use crate::execution::{ - types::{NumericType, UnitAngle, UnitLen, UnitType}, - DefaultPlanes, IdGenerator, KclValue, PlaneType, Sketch, - }; #[cfg(feature = "artifact-graph")] pub use crate::execution::{ArtifactCommand, Operation}; + pub use crate::execution::{ + DefaultPlanes, IdGenerator, KclValue, PlaneType, Sketch, + types::{NumericType, UnitAngle, UnitLen, UnitType}, + }; } #[cfg(target_arch = "wasm32")] @@ -136,7 +135,7 @@ pub mod native_engine { } pub mod std_utils { - pub use crate::std::utils::{get_tangential_arc_to_info, is_points_ccw_wasm, TangentialArcInfoInput}; + pub use crate::std::utils::{TangentialArcInfoInput, get_tangential_arc_to_info, is_points_ccw_wasm}; } pub mod pretty { @@ -160,7 +159,7 @@ lazy_static::lazy_static! { #[cfg(feature = "cli")] let named_extensions = kittycad::types::FileImportFormat::value_variants() .iter() - .map(|x| format!("{}", x)) + .map(|x| format!("{x}")) .collect::>(); #[cfg(not(feature = "cli"))] let named_extensions = vec![]; // We don't really need this outside of the CLI. @@ -276,41 +275,25 @@ impl Program { #[inline] fn try_f64_to_usize(f: f64) -> Option { let i = f as usize; - if i as f64 == f { - Some(i) - } else { - None - } + if i as f64 == f { Some(i) } else { None } } #[inline] fn try_f64_to_u32(f: f64) -> Option { let i = f as u32; - if i as f64 == f { - Some(i) - } else { - None - } + if i as f64 == f { Some(i) } else { None } } #[inline] fn try_f64_to_u64(f: f64) -> Option { let i = f as u64; - if i as f64 == f { - Some(i) - } else { - None - } + if i as f64 == f { Some(i) } else { None } } #[inline] fn try_f64_to_i64(f: f64) -> Option { let i = f as i64; - if i as f64 == f { - Some(i) - } else { - None - } + if i as f64 == f { Some(i) } else { None } } /// Get the version of the KCL library. diff --git a/rust/kcl-lib/src/lint/checks/camel_case.rs b/rust/kcl-lib/src/lint/checks/camel_case.rs index ce73c158b..4c60e45aa 100644 --- a/rust/kcl-lib/src/lint/checks/camel_case.rs +++ b/rust/kcl-lib/src/lint/checks/camel_case.rs @@ -2,11 +2,11 @@ use anyhow::Result; use convert_case::Casing; use crate::{ + SourceRange, errors::Suggestion, - lint::rule::{def_finding, Discovered, Finding}, + lint::rule::{Discovered, Finding, def_finding}, parsing::ast::types::{Node as AstNode, ObjectProperty, Program, VariableDeclarator}, walk::Node, - SourceRange, }; def_finding!( @@ -38,12 +38,12 @@ fn lint_lower_camel_case_var(decl: &VariableDeclarator, prog: &AstNode) let recast = prog.recast(&Default::default(), 0); let suggestion = Suggestion { - title: format!("rename '{}' to '{}'", name, new_name), + title: format!("rename '{name}' to '{new_name}'"), insert: recast, source_range: prog.as_source_range(), }; findings.push(Z0001.at( - format!("found '{}'", name), + format!("found '{name}'"), SourceRange::new(ident.start, ident.end, ident.module_id), Some(suggestion.clone()), )); @@ -61,7 +61,7 @@ fn lint_lower_camel_case_property(decl: &ObjectProperty, _prog: &AstNode) -> Result) -> Res } let suggestion = Suggestion { title: "use defaultPlane instead".to_owned(), - insert: format!("{}", plane_name), + insert: format!("{plane_name}"), source_range: call_source_range, }; Ok(vec![Z0002.at( - format!( - "custom plane in startSketchOn; defaultPlane {} would work here", - plane_name - ), + format!("custom plane in startSketchOn; defaultPlane {plane_name} would work here"), call_source_range, Some(suggestion), )]) @@ -48,7 +45,7 @@ pub fn lint_should_be_default_plane(node: Node, _prog: &AstNode) -> Res #[cfg(test)] mod tests { - use super::{lint_should_be_default_plane, Z0002}; + use super::{Z0002, lint_should_be_default_plane}; use crate::lint::rule::{test_finding, test_no_finding}; test_finding!( diff --git a/rust/kcl-lib/src/lint/checks/mod.rs b/rust/kcl-lib/src/lint/checks/mod.rs index 1fa79ead7..598629eb3 100644 --- a/rust/kcl-lib/src/lint/checks/mod.rs +++ b/rust/kcl-lib/src/lint/checks/mod.rs @@ -2,6 +2,6 @@ mod camel_case; mod default_plane; mod offset_plane; -pub use camel_case::{lint_object_properties, lint_variables, Z0001}; -pub use default_plane::{lint_should_be_default_plane, Z0002}; -pub use offset_plane::{lint_should_be_offset_plane, Z0003}; +pub use camel_case::{Z0001, lint_object_properties, lint_variables}; +pub use default_plane::{Z0002, lint_should_be_default_plane}; +pub use offset_plane::{Z0003, lint_should_be_offset_plane}; diff --git a/rust/kcl-lib/src/lint/checks/offset_plane.rs b/rust/kcl-lib/src/lint/checks/offset_plane.rs index 614c862d9..ac4b257a0 100644 --- a/rust/kcl-lib/src/lint/checks/offset_plane.rs +++ b/rust/kcl-lib/src/lint/checks/offset_plane.rs @@ -1,15 +1,15 @@ use anyhow::Result; use crate::{ - engine::{PlaneName, DEFAULT_PLANE_INFO}, + SourceRange, + engine::{DEFAULT_PLANE_INFO, PlaneName}, errors::Suggestion, - execution::{types::UnitLen, PlaneInfo, Point3d}, - lint::rule::{def_finding, Discovered, Finding}, + execution::{PlaneInfo, Point3d, types::UnitLen}, + lint::rule::{Discovered, Finding, def_finding}, parsing::ast::types::{ BinaryPart, CallExpressionKw, Expr, LiteralValue, Node as AstNode, ObjectExpression, Program, UnaryOperator, }, walk::Node, - SourceRange, }; def_finding!( @@ -39,14 +39,11 @@ pub fn lint_should_be_offset_plane(node: Node, _prog: &AstNode) -> Resu } let suggestion = Suggestion { title: "use offsetPlane instead".to_owned(), - insert: format!("offsetPlane({}, offset = {})", plane_name, offset), + insert: format!("offsetPlane({plane_name}, offset = {offset})"), source_range: call_source_range, }; Ok(vec![Z0003.at( - format!( - "custom plane in startSketchOn; offsetPlane from {} would work here", - plane_name - ), + format!("custom plane in startSketchOn; offsetPlane from {plane_name} would work here"), call_source_range, Some(suggestion), )]) @@ -68,16 +65,16 @@ fn get_xyz(point: &ObjectExpression) -> Option<(f64, f64, f64)> { for property in &point.properties { let Some(value) = (match &property.value { - Expr::UnaryExpression(ref value) => { + Expr::UnaryExpression(value) => { if value.operator != UnaryOperator::Neg { continue; } - let BinaryPart::Literal(ref value) = &value.inner.argument else { + let BinaryPart::Literal(value) = &value.inner.argument else { continue; }; unlitafy(&value.inner.value).map(|v| -v) } - Expr::Literal(ref value) => unlitafy(&value.value), + Expr::Literal(value) => unlitafy(&value.value), _ => { continue; } @@ -271,7 +268,7 @@ fn normalize_plane_info(plane_info: &PlaneInfo) -> PlaneInfo { #[cfg(test)] mod tests { - use super::{lint_should_be_offset_plane, Z0003}; + use super::{Z0003, lint_should_be_offset_plane}; use crate::lint::rule::{test_finding, test_no_finding}; test_finding!( diff --git a/rust/kcl-lib/src/lint/rule.rs b/rust/kcl-lib/src/lint/rule.rs index 492bff3a3..f1f40e917 100644 --- a/rust/kcl-lib/src/lint/rule.rs +++ b/rust/kcl-lib/src/lint/rule.rs @@ -4,11 +4,11 @@ use serde::Serialize; use tower_lsp::lsp_types::{Diagnostic, DiagnosticSeverity}; use crate::{ + SourceRange, errors::Suggestion, lsp::IntoDiagnostic, parsing::ast::types::{Node as AstNode, Program}, walk::Node, - SourceRange, }; /// Check the provided AST for any found rule violations. @@ -180,7 +180,7 @@ impl Finding { } macro_rules! def_finding { - ( $code:ident, $title:expr, $description:expr ) => { + ( $code:ident, $title:expr_2021, $description:expr_2021 ) => { /// Generated Finding pub const $code: Finding = $crate::lint::rule::finding!($code, $title, $description); }; @@ -188,7 +188,7 @@ macro_rules! def_finding { pub(crate) use def_finding; macro_rules! finding { - ( $code:ident, $title:expr, $description:expr ) => { + ( $code:ident, $title:expr_2021, $description:expr_2021 ) => { $crate::lint::rule::Finding { code: stringify!($code), title: $title, @@ -205,7 +205,7 @@ pub(crate) use test::{assert_finding, assert_no_finding, test_finding, test_no_f mod test { macro_rules! assert_no_finding { - ( $check:expr, $finding:expr, $kcl:expr ) => { + ( $check:expr_2021, $finding:expr_2021, $kcl:expr_2021 ) => { let prog = $crate::Program::parse_no_errs($kcl).unwrap(); // Ensure the code still works. @@ -220,7 +220,7 @@ mod test { } macro_rules! assert_finding { - ( $check:expr, $finding:expr, $kcl:expr, $output:expr, $suggestion:expr ) => { + ( $check:expr_2021, $finding:expr_2021, $kcl:expr_2021, $output:expr_2021, $suggestion:expr_2021 ) => { let prog = $crate::Program::parse_no_errs($kcl).unwrap(); // Ensure the code still works. @@ -250,7 +250,7 @@ mod test { } macro_rules! test_finding { - ( $name:ident, $check:expr, $finding:expr, $kcl:expr, $output:expr, $suggestion:expr ) => { + ( $name:ident, $check:expr_2021, $finding:expr_2021, $kcl:expr_2021, $output:expr_2021, $suggestion:expr_2021 ) => { #[tokio::test] async fn $name() { $crate::lint::rule::assert_finding!($check, $finding, $kcl, $output, $suggestion); @@ -259,7 +259,7 @@ mod test { } macro_rules! test_no_finding { - ( $name:ident, $check:expr, $finding:expr, $kcl:expr ) => { + ( $name:ident, $check:expr_2021, $finding:expr_2021, $kcl:expr_2021 ) => { #[tokio::test] async fn $name() { $crate::lint::rule::assert_no_finding!($check, $finding, $kcl); diff --git a/rust/kcl-lib/src/lsp/backend.rs b/rust/kcl-lib/src/lsp/backend.rs index facff02de..86a2c61e4 100644 --- a/rust/kcl-lib/src/lsp/backend.rs +++ b/rust/kcl-lib/src/lsp/backend.rs @@ -90,7 +90,7 @@ where async fn do_initialized(&self, params: InitializedParams) { self.client() - .log_message(MessageType::INFO, format!("initialized: {:?}", params)) + .log_message(MessageType::INFO, format!("initialized: {params:?}")) .await; self.set_is_initialized(true).await; @@ -139,7 +139,7 @@ where self.client() .log_message( MessageType::WARNING, - format!("updating from disk `{}` failed: {:?}", project_dir, err), + format!("updating from disk `{project_dir}` failed: {err:?}"), ) .await; } @@ -148,19 +148,19 @@ where async fn do_did_change_configuration(&self, params: DidChangeConfigurationParams) { self.client() - .log_message(MessageType::INFO, format!("configuration changed: {:?}", params)) + .log_message(MessageType::INFO, format!("configuration changed: {params:?}")) .await; } async fn do_did_change_watched_files(&self, params: DidChangeWatchedFilesParams) { self.client() - .log_message(MessageType::INFO, format!("watched files changed: {:?}", params)) + .log_message(MessageType::INFO, format!("watched files changed: {params:?}")) .await; } async fn do_did_create_files(&self, params: CreateFilesParams) { self.client() - .log_message(MessageType::INFO, format!("files created: {:?}", params)) + .log_message(MessageType::INFO, format!("files created: {params:?}")) .await; // Create each file in the code map. for file in params.files { @@ -170,7 +170,7 @@ where async fn do_did_rename_files(&self, params: RenameFilesParams) { self.client() - .log_message(MessageType::INFO, format!("files renamed: {:?}", params)) + .log_message(MessageType::INFO, format!("files renamed: {params:?}")) .await; // Rename each file in the code map. for file in params.files { @@ -186,7 +186,7 @@ where async fn do_did_delete_files(&self, params: DeleteFilesParams) { self.client() - .log_message(MessageType::INFO, format!("files deleted: {:?}", params)) + .log_message(MessageType::INFO, format!("files deleted: {params:?}")) .await; // Delete each file in the map. for file in params.files { @@ -228,7 +228,7 @@ where async fn do_did_close(&self, params: DidCloseTextDocumentParams) { self.client() - .log_message(MessageType::INFO, format!("document closed: {:?}", params)) + .log_message(MessageType::INFO, format!("document closed: {params:?}")) .await; } } diff --git a/rust/kcl-lib/src/lsp/copilot/mod.rs b/rust/kcl-lib/src/lsp/copilot/mod.rs index 8f37ff51b..e98b23e9a 100644 --- a/rust/kcl-lib/src/lsp/copilot/mod.rs +++ b/rust/kcl-lib/src/lsp/copilot/mod.rs @@ -13,6 +13,7 @@ use std::{ use dashmap::DashMap; use serde::{Deserialize, Serialize}; use tower_lsp::{ + LanguageServer, jsonrpc::{Error, Result}, lsp_types::{ CreateFilesParams, DeleteFilesParams, Diagnostic, DidChangeConfigurationParams, DidChangeTextDocumentParams, @@ -22,7 +23,6 @@ use tower_lsp::{ TextDocumentSyncKind, TextDocumentSyncOptions, WorkspaceFolder, WorkspaceFoldersServerCapabilities, WorkspaceServerCapabilities, }, - LanguageServer, }; use crate::lsp::{ @@ -198,7 +198,7 @@ impl Backend { .map_err(|err| Error { code: tower_lsp::jsonrpc::ErrorCode::from(69), data: None, - message: Cow::from(format!("Failed to get completions from zoo api: {}", err)), + message: Cow::from(format!("Failed to get completions from zoo api: {err}")), })?; Ok(resp.completions) } @@ -209,7 +209,7 @@ impl Backend { let mut lock = copy.write().map_err(|err| Error { code: tower_lsp::jsonrpc::ErrorCode::from(69), data: None, - message: Cow::from(format!("Failed lock: {}", err)), + message: Cow::from(format!("Failed lock: {err}")), })?; *lock = params; Ok(Success::new(true)) @@ -254,7 +254,7 @@ impl Backend { .map_err(|err| Error { code: tower_lsp::jsonrpc::ErrorCode::from(69), data: None, - message: Cow::from(format!("Failed to get completions: {}", err)), + message: Cow::from(format!("Failed to get completions: {err}")), })?; #[cfg(not(test))] let mut completion_list = vec![]; @@ -294,7 +294,7 @@ part001 = cube(pos = [0,0], scale = 20) pub async fn accept_completion(&self, params: CopilotAcceptCompletionParams) { self.client - .log_message(MessageType::INFO, format!("Accepted completions: {:?}", params)) + .log_message(MessageType::INFO, format!("Accepted completions: {params:?}")) .await; // Get the original telemetry data. @@ -303,7 +303,7 @@ part001 = cube(pos = [0,0], scale = 20) }; self.client - .log_message(MessageType::INFO, format!("Original telemetry: {:?}", original)) + .log_message(MessageType::INFO, format!("Original telemetry: {original:?}")) .await; // TODO: Send the telemetry data to the zoo api. @@ -311,7 +311,7 @@ part001 = cube(pos = [0,0], scale = 20) pub async fn reject_completions(&self, params: CopilotRejectCompletionParams) { self.client - .log_message(MessageType::INFO, format!("Rejected completions: {:?}", params)) + .log_message(MessageType::INFO, format!("Rejected completions: {params:?}")) .await; // Get the original telemetry data. @@ -323,7 +323,7 @@ part001 = cube(pos = [0,0], scale = 20) } self.client - .log_message(MessageType::INFO, format!("Original telemetry: {:?}", originals)) + .log_message(MessageType::INFO, format!("Original telemetry: {originals:?}")) .await; // TODO: Send the telemetry data to the zoo api. diff --git a/rust/kcl-lib/src/lsp/copilot/types.rs b/rust/kcl-lib/src/lsp/copilot/types.rs index 5878bbc45..8dc4721bd 100644 --- a/rust/kcl-lib/src/lsp/copilot/types.rs +++ b/rust/kcl-lib/src/lsp/copilot/types.rs @@ -85,7 +85,7 @@ impl CopilotCompletionResponse { impl CopilotCyclingCompletion { pub fn new(text: String, line_before: String, position: CopilotPosition) -> Self { let display_text = text.clone(); - let text = format!("{}{}", line_before, text); + let text = format!("{line_before}{text}"); let end_char = text.find('\n').unwrap_or(text.len()) as u32; Self { uuid: uuid::Uuid::new_v4(), diff --git a/rust/kcl-lib/src/lsp/kcl/hover.rs b/rust/kcl-lib/src/lsp/kcl/hover.rs index f18738215..0db697c83 100644 --- a/rust/kcl-lib/src/lsp/kcl/hover.rs +++ b/rust/kcl-lib/src/lsp/kcl/hover.rs @@ -3,7 +3,7 @@ use std::collections::HashMap; use serde::{Deserialize, Serialize}; use tower_lsp::lsp_types::Range as LspRange; -use crate::{parsing::ast::types::*, SourceRange}; +use crate::{SourceRange, parsing::ast::types::*}; /// Describes information about a hover. #[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] diff --git a/rust/kcl-lib/src/lsp/kcl/mod.rs b/rust/kcl-lib/src/lsp/kcl/mod.rs index 30c9ec3eb..0b455ec38 100644 --- a/rust/kcl-lib/src/lsp/kcl/mod.rs +++ b/rust/kcl-lib/src/lsp/kcl/mod.rs @@ -15,6 +15,7 @@ use dashmap::DashMap; use sha2::Digest; use tokio::sync::RwLock; use tower_lsp::{ + Client, LanguageServer, jsonrpc::Result as RpcResult, lsp_types::{ CodeAction, CodeActionKind, CodeActionOptions, CodeActionOrCommand, CodeActionParams, @@ -37,10 +38,10 @@ use tower_lsp::{ TextDocumentSyncCapability, TextDocumentSyncKind, TextDocumentSyncOptions, TextEdit, WorkDoneProgressOptions, WorkspaceEdit, WorkspaceFolder, WorkspaceFoldersServerCapabilities, WorkspaceServerCapabilities, }, - Client, LanguageServer, }; use crate::{ + ModuleId, Program, SourceRange, docs::kcl_doc::ModData, errors::LspSuggestion, exec::KclValue, @@ -51,11 +52,10 @@ use crate::{ util::IntoDiagnostic, }, parsing::{ + PIPE_OPERATOR, ast::types::{Expr, VariableKind}, token::TokenStream, - PIPE_OPERATOR, }, - ModuleId, Program, SourceRange, }; pub mod custom_notifications; @@ -290,10 +290,9 @@ impl crate::lsp::backend::Backend for Backend { }; // Get the previous tokens. - let tokens_changed = if let Some(previous_tokens) = self.token_map.get(&filename) { - *previous_tokens != tokens - } else { - true + let tokens_changed = match self.token_map.get(&filename) { + Some(previous_tokens) => *previous_tokens != tokens, + _ => true, }; let had_diagnostics = self.has_diagnostics(params.uri.as_ref()).await; @@ -424,7 +423,7 @@ impl Backend { self.client .log_message( MessageType::ERROR, - format!("token type `{:?}` not accounted for", token_type), + format!("token type `{token_type:?}` not accounted for"), ) .await; continue; @@ -436,119 +435,121 @@ impl Backend { // Calculate the token modifiers. // Get the value at the current position. - let token_modifiers_bitset = if let Some(ast) = self.ast_map.get(params.uri.as_str()) { - let token_index = Arc::new(Mutex::new(token_type_index)); - let modifier_index: Arc> = Arc::new(Mutex::new(0)); - crate::walk::walk(&ast.ast, |node: crate::walk::Node| { - let Ok(node_range): Result = (&node).try_into() else { - return Ok(true); - }; - - if !node_range.contains(source_range.start()) { - return Ok(true); - } - - let get_modifier = |modifier: Vec| -> Result { - let mut mods = modifier_index.lock().map_err(|_| anyhow::anyhow!("mutex"))?; - let Some(token_modifier_index) = self.get_semantic_token_modifier_index(modifier) else { + let token_modifiers_bitset = match self.ast_map.get(params.uri.as_str()) { + Some(ast) => { + let token_index = Arc::new(Mutex::new(token_type_index)); + let modifier_index: Arc> = Arc::new(Mutex::new(0)); + crate::walk::walk(&ast.ast, |node: crate::walk::Node| { + let Ok(node_range): Result = (&node).try_into() else { return Ok(true); }; - if *mods == 0 { - *mods = token_modifier_index; - } else { - *mods |= token_modifier_index; - } - Ok(false) - }; - match node { - crate::walk::Node::TagDeclarator(_) => { - return get_modifier(vec![ - SemanticTokenModifier::DEFINITION, - SemanticTokenModifier::STATIC, - ]); + if !node_range.contains(source_range.start()) { + return Ok(true); } - crate::walk::Node::VariableDeclarator(variable) => { - let sr: SourceRange = (&variable.id).into(); - if sr.contains(source_range.start()) { - if let Expr::FunctionExpression(_) = &variable.init { + + let get_modifier = |modifier: Vec| -> Result { + let mut mods = modifier_index.lock().map_err(|_| anyhow::anyhow!("mutex"))?; + let Some(token_modifier_index) = self.get_semantic_token_modifier_index(modifier) else { + return Ok(true); + }; + if *mods == 0 { + *mods = token_modifier_index; + } else { + *mods |= token_modifier_index; + } + Ok(false) + }; + + match node { + crate::walk::Node::TagDeclarator(_) => { + return get_modifier(vec![ + SemanticTokenModifier::DEFINITION, + SemanticTokenModifier::STATIC, + ]); + } + crate::walk::Node::VariableDeclarator(variable) => { + let sr: SourceRange = (&variable.id).into(); + if sr.contains(source_range.start()) { + if let Expr::FunctionExpression(_) = &variable.init { + let mut ti = token_index.lock().map_err(|_| anyhow::anyhow!("mutex"))?; + *ti = match self.get_semantic_token_type_index(&SemanticTokenType::FUNCTION) { + Some(index) => index, + None => token_type_index, + }; + } + + return get_modifier(vec![ + SemanticTokenModifier::DECLARATION, + SemanticTokenModifier::READONLY, + ]); + } + } + crate::walk::Node::Parameter(_) => { + let mut ti = token_index.lock().map_err(|_| anyhow::anyhow!("mutex"))?; + *ti = match self.get_semantic_token_type_index(&SemanticTokenType::PARAMETER) { + Some(index) => index, + None => token_type_index, + }; + return Ok(false); + } + crate::walk::Node::MemberExpression(member_expression) => { + let sr: SourceRange = (&member_expression.property).into(); + if sr.contains(source_range.start()) { + let mut ti = token_index.lock().map_err(|_| anyhow::anyhow!("mutex"))?; + *ti = match self.get_semantic_token_type_index(&SemanticTokenType::PROPERTY) { + Some(index) => index, + None => token_type_index, + }; + return Ok(false); + } + } + crate::walk::Node::ObjectProperty(object_property) => { + let sr: SourceRange = (&object_property.key).into(); + if sr.contains(source_range.start()) { + let mut ti = token_index.lock().map_err(|_| anyhow::anyhow!("mutex"))?; + *ti = match self.get_semantic_token_type_index(&SemanticTokenType::PROPERTY) { + Some(index) => index, + None => token_type_index, + }; + } + return get_modifier(vec![SemanticTokenModifier::DECLARATION]); + } + crate::walk::Node::CallExpressionKw(call_expr) => { + let sr: SourceRange = (&call_expr.callee).into(); + if sr.contains(source_range.start()) { let mut ti = token_index.lock().map_err(|_| anyhow::anyhow!("mutex"))?; *ti = match self.get_semantic_token_type_index(&SemanticTokenType::FUNCTION) { Some(index) => index, None => token_type_index, }; + + if self.stdlib_completions.contains_key(&call_expr.callee.name.name) { + // This is a stdlib function. + return get_modifier(vec![SemanticTokenModifier::DEFAULT_LIBRARY]); + } + + return Ok(false); } + } + _ => {} + } + Ok(true) + }) + .unwrap_or_default(); - return get_modifier(vec![ - SemanticTokenModifier::DECLARATION, - SemanticTokenModifier::READONLY, - ]); - } - } - crate::walk::Node::Parameter(_) => { - let mut ti = token_index.lock().map_err(|_| anyhow::anyhow!("mutex"))?; - *ti = match self.get_semantic_token_type_index(&SemanticTokenType::PARAMETER) { - Some(index) => index, - None => token_type_index, - }; - return Ok(false); - } - crate::walk::Node::MemberExpression(member_expression) => { - let sr: SourceRange = (&member_expression.property).into(); - if sr.contains(source_range.start()) { - let mut ti = token_index.lock().map_err(|_| anyhow::anyhow!("mutex"))?; - *ti = match self.get_semantic_token_type_index(&SemanticTokenType::PROPERTY) { - Some(index) => index, - None => token_type_index, - }; - return Ok(false); - } - } - crate::walk::Node::ObjectProperty(object_property) => { - let sr: SourceRange = (&object_property.key).into(); - if sr.contains(source_range.start()) { - let mut ti = token_index.lock().map_err(|_| anyhow::anyhow!("mutex"))?; - *ti = match self.get_semantic_token_type_index(&SemanticTokenType::PROPERTY) { - Some(index) => index, - None => token_type_index, - }; - } - return get_modifier(vec![SemanticTokenModifier::DECLARATION]); - } - crate::walk::Node::CallExpressionKw(call_expr) => { - let sr: SourceRange = (&call_expr.callee).into(); - if sr.contains(source_range.start()) { - let mut ti = token_index.lock().map_err(|_| anyhow::anyhow!("mutex"))?; - *ti = match self.get_semantic_token_type_index(&SemanticTokenType::FUNCTION) { - Some(index) => index, - None => token_type_index, - }; + let t = match token_index.lock() { + Ok(guard) => *guard, + _ => 0, + }; + token_type_index = t; - if self.stdlib_completions.contains_key(&call_expr.callee.name.name) { - // This is a stdlib function. - return get_modifier(vec![SemanticTokenModifier::DEFAULT_LIBRARY]); - } - - return Ok(false); - } - } - _ => {} + match modifier_index.lock() { + Ok(guard) => *guard, + _ => 0, } - Ok(true) - }) - .unwrap_or_default(); - - let t = if let Ok(guard) = token_index.lock() { *guard } else { 0 }; - token_type_index = t; - - let m = if let Ok(guard) = modifier_index.lock() { - *guard - } else { - 0 - }; - m - } else { - 0 + } + _ => 0, }; // We need to check if we are on the last token of the line. @@ -652,11 +653,14 @@ impl Backend { .await; } - let mut items = if let Some(items) = self.diagnostics_map.get(params.uri.as_str()) { - // TODO: Would be awesome to fix the clone here. - items.clone() - } else { - vec![] + let mut items = match self.diagnostics_map.get(params.uri.as_str()) { + Some(items) => { + // TODO: Would be awesome to fix the clone here. + items.clone() + } + _ => { + vec![] + } }; for diagnostic in diagnostics { @@ -768,7 +772,7 @@ impl Backend { // Read hash digest and consume hasher let result = hasher.finalize(); // Get the hash as a string. - let user_id_hash = format!("{:x}", result); + let user_id_hash = format!("{result:x}"); // Get the workspace folders. // The key of the workspace folder is the project name. @@ -866,7 +870,7 @@ impl Backend { impl LanguageServer for Backend { async fn initialize(&self, params: InitializeParams) -> RpcResult { self.client - .log_message(MessageType::INFO, format!("initialize: {:?}", params)) + .log_message(MessageType::INFO, format!("initialize: {params:?}")) .await; Ok(InitializeResult { @@ -1006,7 +1010,7 @@ impl LanguageServer for Backend { #[cfg(not(target_arch = "wasm32"))] if let Err(err) = self.send_telemetry().await { self.client - .log_message(MessageType::WARNING, format!("failed to send telemetry: {}", err)) + .log_message(MessageType::WARNING, format!("failed to send telemetry: {err}")) .await; } } @@ -1090,7 +1094,7 @@ impl LanguageServer for Backend { Ok(Some(LspHover { contents: HoverContents::Markup(MarkupContent { kind: MarkupKind::Markdown, - value: format!("```\n{}{}\n```\n\n{}", name, sig, docs), + value: format!("```\n{name}{sig}\n```\n\n{docs}"), }), range: Some(range), })) @@ -1118,7 +1122,7 @@ impl LanguageServer for Backend { Ok(Some(LspHover { contents: HoverContents::Markup(MarkupContent { kind: MarkupKind::Markdown, - value: format!("```\n{}\n```\n\n{}", name, docs), + value: format!("```\n{name}\n```\n\n{docs}"), }), range: Some(range), })) @@ -1153,17 +1157,17 @@ impl LanguageServer for Backend { } => Ok(Some(LspHover { contents: HoverContents::Markup(MarkupContent { kind: MarkupKind::Markdown, - value: format!("```\n{}: {}\n```", name, ty), + value: format!("```\n{name}: {ty}\n```"), }), range: Some(range), })), Hover::Variable { name, ty: None, range } => Ok(with_cached_var(&name, |value| { - let mut text: String = format!("```\n{}", name); + let mut text: String = format!("```\n{name}"); if let Some(ty) = value.principal_type() { text.push_str(&format!(": {}", ty.human_friendly_type())); } if let Some(v) = value.value_str() { - text.push_str(&format!(" = {}", v)); + text.push_str(&format!(" = {v}")); } text.push_str("\n```"); diff --git a/rust/kcl-lib/src/lsp/mod.rs b/rust/kcl-lib/src/lsp/mod.rs index d66af6a99..d480907d3 100644 --- a/rust/kcl-lib/src/lsp/mod.rs +++ b/rust/kcl-lib/src/lsp/mod.rs @@ -13,8 +13,8 @@ use tower_lsp::lsp_types::{Diagnostic, DiagnosticSeverity, DiagnosticTag}; pub use util::IntoDiagnostic; use crate::{ - errors::{Severity, Tag}, CompilationError, + errors::{Severity, Tag}, }; impl IntoDiagnostic for CompilationError { diff --git a/rust/kcl-lib/src/lsp/tests.rs b/rust/kcl-lib/src/lsp/tests.rs index 9cafad993..28277f9c4 100644 --- a/rust/kcl-lib/src/lsp/tests.rs +++ b/rust/kcl-lib/src/lsp/tests.rs @@ -2,18 +2,18 @@ use std::collections::{BTreeMap, HashMap}; use pretty_assertions::assert_eq; use tower_lsp::{ + LanguageServer, lsp_types::{ CodeActionKind, CodeActionOrCommand, Diagnostic, PrepareRenameResponse, SemanticTokenModifier, SemanticTokenType, TextEdit, WorkspaceEdit, }, - LanguageServer, }; use crate::{ + SourceRange, errors::{LspSuggestion, Suggestion}, lsp::test_util::{copilot_lsp_server, kcl_lsp_server}, parsing::ast::types::{Node, Program}, - SourceRange, }; #[track_caller] @@ -276,11 +276,7 @@ async fn test_updating_kcl_lsp_files() { assert_eq!(server.code_map.len(), 11); // Just make sure that one of the current files read from disk is accurate. assert_eq!( - server - .code_map - .get(&format!("{}/util.rs", string_path)) - .unwrap() - .clone(), + server.code_map.get(&format!("{string_path}/util.rs")).unwrap().clone(), include_str!("util.rs").as_bytes() ); } @@ -633,7 +629,7 @@ async fn test_kcl_lsp_create_zip() { } assert_eq!(files.len(), 12); - let util_path = format!("{}/util.rs", string_path).replace("file://", ""); + let util_path = format!("{string_path}/util.rs").replace("file://", ""); assert!(files.contains_key(&util_path)); assert_eq!(files.get("/test.kcl"), Some(&4)); } diff --git a/rust/kcl-lib/src/modules.rs b/rust/kcl-lib/src/modules.rs index fe3ccc904..adea2ae04 100644 --- a/rust/kcl-lib/src/modules.rs +++ b/rust/kcl-lib/src/modules.rs @@ -7,7 +7,7 @@ use serde::{Deserialize, Serialize}; use crate::{ errors::{KclError, KclErrorDetails}, exec::KclValue, - execution::{typed_path::TypedPath, EnvironmentRef, ModuleArtifactState, PreImportedGeometry}, + execution::{EnvironmentRef, ModuleArtifactState, PreImportedGeometry, typed_path::TypedPath}, fs::{FileManager, FileSystem}, parsing::ast::types::{ImportPath, Node, Program}, source_range::SourceRange, @@ -73,13 +73,13 @@ impl ModuleLoader { } pub(crate) fn enter_module(&mut self, path: &ModulePath) { - if let ModulePath::Local { value: ref path } = path { + if let ModulePath::Local { value: path } = path { self.import_stack.push(path.clone()); } } pub(crate) fn leave_module(&mut self, path: &ModulePath) { - if let ModulePath::Local { value: ref path } = path { + if let ModulePath::Local { value: path } = path { let popped = self.import_stack.pop().unwrap(); assert_eq!(path, &popped); } diff --git a/rust/kcl-lib/src/parsing/ast/mod.rs b/rust/kcl-lib/src/parsing/ast/mod.rs index f2cbd2f8c..147004e81 100644 --- a/rust/kcl-lib/src/parsing/ast/mod.rs +++ b/rust/kcl-lib/src/parsing/ast/mod.rs @@ -2,8 +2,8 @@ pub(crate) mod digest; pub mod types; use crate::{ - parsing::ast::types::{BinaryPart, BodyItem, Expr, LiteralIdentifier}, ModuleId, + parsing::ast::types::{BinaryPart, BodyItem, Expr, LiteralIdentifier}, }; impl BodyItem { diff --git a/rust/kcl-lib/src/parsing/ast/types/mod.rs b/rust/kcl-lib/src/parsing/ast/types/mod.rs index 53cd2f62a..bd44f7181 100644 --- a/rust/kcl-lib/src/parsing/ast/types/mod.rs +++ b/rust/kcl-lib/src/parsing/ast/types/mod.rs @@ -25,15 +25,14 @@ pub use crate::parsing::ast::types::{ none::KclNone, }; use crate::{ + ModuleId, TypedPath, errors::KclError, execution::{ - annotations, + KclValue, Metadata, TagIdentifier, annotations, types::{ArrayLen, UnitAngle, UnitLen}, - KclValue, Metadata, TagIdentifier, }, - parsing::{ast::digest::Digest, token::NumericSuffix, PIPE_OPERATOR}, + parsing::{PIPE_OPERATOR, ast::digest::Digest, token::NumericSuffix}, source_range::SourceRange, - ModuleId, TypedPath, }; mod condition; @@ -72,18 +71,18 @@ impl schemars::JsonSchema for Node { T::schema_name() } - fn json_schema(gen: &mut schemars::gen::SchemaGenerator) -> schemars::schema::Schema { - let mut child = T::json_schema(gen).into_object(); + fn json_schema(r#gen: &mut schemars::r#gen::SchemaGenerator) -> schemars::schema::Schema { + let mut child = T::json_schema(r#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 { + let Some(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)); + object.properties.insert("start".to_string(), usize::json_schema(r#gen)); + object.properties.insert("end".to_string(), usize::json_schema(r#gen)); schemars::schema::Schema::Object(child.clone()) } @@ -681,7 +680,7 @@ impl Program { break; } } - BodyItem::VariableDeclaration(ref mut variable_declaration) => { + BodyItem::VariableDeclaration(variable_declaration) => { if let Some(var_old_name) = variable_declaration.rename_symbol(new_name, pos) { old_name = Some(var_old_name); break; @@ -705,18 +704,16 @@ impl Program { // Recurse over the item. let mut value = match item { BodyItem::ImportStatement(_) => None, // TODO - BodyItem::ExpressionStatement(ref mut expression_statement) => { - Some(&mut expression_statement.expression) - } - BodyItem::VariableDeclaration(ref mut variable_declaration) => { + BodyItem::ExpressionStatement(expression_statement) => Some(&mut expression_statement.expression), + BodyItem::VariableDeclaration(variable_declaration) => { variable_declaration.get_mut_expr_for_position(pos) } BodyItem::TypeDeclaration(_) => None, - BodyItem::ReturnStatement(ref mut return_statement) => Some(&mut return_statement.argument), + BodyItem::ReturnStatement(return_statement) => Some(&mut return_statement.argument), }; // Check if we have a function expression. - if let Some(Expr::FunctionExpression(ref mut function_expression)) = &mut value { + if let Some(Expr::FunctionExpression(function_expression)) = &mut value { // Check if the params to the function expression contain the position. for param in &mut function_expression.params { let param_source_range: SourceRange = (¶m.identifier).into(); @@ -764,7 +761,7 @@ impl Program { BodyItem::ExpressionStatement(_) => { continue; } - BodyItem::VariableDeclaration(ref mut variable_declaration) => { + BodyItem::VariableDeclaration(variable_declaration) => { if variable_declaration.declaration.id.name == name { variable_declaration.declaration = declarator; return; @@ -783,14 +780,14 @@ impl Program { for item in &mut self.body { match item { BodyItem::ImportStatement(_) => {} // TODO - BodyItem::ExpressionStatement(ref mut expression_statement) => expression_statement + BodyItem::ExpressionStatement(expression_statement) => expression_statement .expression .replace_value(source_range, new_value.clone()), - BodyItem::VariableDeclaration(ref mut variable_declaration) => { + BodyItem::VariableDeclaration(variable_declaration) => { variable_declaration.replace_value(source_range, new_value.clone()) } BodyItem::TypeDeclaration(_) => {} - BodyItem::ReturnStatement(ref mut return_statement) => { + BodyItem::ReturnStatement(return_statement) => { return_statement.argument.replace_value(source_range, new_value.clone()) } } @@ -1040,18 +1037,18 @@ impl Expr { } match self { - Expr::BinaryExpression(ref mut bin_exp) => bin_exp.replace_value(source_range, new_value), - Expr::ArrayExpression(ref mut array_exp) => array_exp.replace_value(source_range, new_value), - Expr::ArrayRangeExpression(ref mut array_range) => array_range.replace_value(source_range, new_value), - Expr::ObjectExpression(ref mut obj_exp) => obj_exp.replace_value(source_range, new_value), + Expr::BinaryExpression(bin_exp) => bin_exp.replace_value(source_range, new_value), + Expr::ArrayExpression(array_exp) => array_exp.replace_value(source_range, new_value), + Expr::ArrayRangeExpression(array_range) => array_range.replace_value(source_range, new_value), + Expr::ObjectExpression(obj_exp) => obj_exp.replace_value(source_range, new_value), Expr::MemberExpression(_) => {} Expr::Literal(_) => {} - Expr::FunctionExpression(ref mut func_exp) => func_exp.replace_value(source_range, new_value), - Expr::CallExpressionKw(ref mut call_exp) => call_exp.replace_value(source_range, new_value), + Expr::FunctionExpression(func_exp) => func_exp.replace_value(source_range, new_value), + Expr::CallExpressionKw(call_exp) => call_exp.replace_value(source_range, new_value), Expr::Name(_) => {} Expr::TagDeclarator(_) => {} - Expr::PipeExpression(ref mut pipe_exp) => pipe_exp.replace_value(source_range, new_value), - Expr::UnaryExpression(ref mut unary_exp) => unary_exp.replace_value(source_range, new_value), + Expr::PipeExpression(pipe_exp) => pipe_exp.replace_value(source_range, new_value), + Expr::UnaryExpression(unary_exp) => unary_exp.replace_value(source_range, new_value), Expr::IfExpression(_) => {} Expr::PipeSubstitution(_) => {} Expr::LabelledExpression(expr) => expr.expr.replace_value(source_range, new_value), @@ -1113,25 +1110,19 @@ impl Expr { fn rename_identifiers(&mut self, old_name: &str, new_name: &str) { match self { Expr::Literal(_literal) => {} - Expr::Name(ref mut identifier) => identifier.rename(old_name, new_name), - Expr::TagDeclarator(ref mut tag) => tag.rename(old_name, new_name), - Expr::BinaryExpression(ref mut binary_expression) => { - binary_expression.rename_identifiers(old_name, new_name) - } + Expr::Name(identifier) => identifier.rename(old_name, new_name), + Expr::TagDeclarator(tag) => tag.rename(old_name, new_name), + Expr::BinaryExpression(binary_expression) => binary_expression.rename_identifiers(old_name, new_name), Expr::FunctionExpression(_function_identifier) => {} - Expr::CallExpressionKw(ref mut call_expression) => call_expression.rename_identifiers(old_name, new_name), - Expr::PipeExpression(ref mut pipe_expression) => pipe_expression.rename_identifiers(old_name, new_name), + Expr::CallExpressionKw(call_expression) => call_expression.rename_identifiers(old_name, new_name), + Expr::PipeExpression(pipe_expression) => pipe_expression.rename_identifiers(old_name, new_name), Expr::PipeSubstitution(_) => {} - Expr::ArrayExpression(ref mut array_expression) => array_expression.rename_identifiers(old_name, new_name), - Expr::ArrayRangeExpression(ref mut array_range) => array_range.rename_identifiers(old_name, new_name), - Expr::ObjectExpression(ref mut object_expression) => { - object_expression.rename_identifiers(old_name, new_name) - } - Expr::MemberExpression(ref mut member_expression) => { - member_expression.rename_identifiers(old_name, new_name) - } - Expr::UnaryExpression(ref mut unary_expression) => unary_expression.rename_identifiers(old_name, new_name), - Expr::IfExpression(ref mut expr) => expr.rename_identifiers(old_name, new_name), + Expr::ArrayExpression(array_expression) => array_expression.rename_identifiers(old_name, new_name), + Expr::ArrayRangeExpression(array_range) => array_range.rename_identifiers(old_name, new_name), + Expr::ObjectExpression(object_expression) => object_expression.rename_identifiers(old_name, new_name), + Expr::MemberExpression(member_expression) => member_expression.rename_identifiers(old_name, new_name), + Expr::UnaryExpression(unary_expression) => unary_expression.rename_identifiers(old_name, new_name), + Expr::IfExpression(expr) => expr.rename_identifiers(old_name, new_name), Expr::LabelledExpression(expr) => expr.expr.rename_identifiers(old_name, new_name), Expr::AscribedExpression(expr) => expr.expr.rename_identifiers(old_name, new_name), Expr::None(_) => {} @@ -1325,15 +1316,9 @@ impl BinaryPart { match self { BinaryPart::Literal(_) => {} BinaryPart::Name(_) => {} - BinaryPart::BinaryExpression(ref mut binary_expression) => { - binary_expression.replace_value(source_range, new_value) - } - BinaryPart::CallExpressionKw(ref mut call_expression) => { - call_expression.replace_value(source_range, new_value) - } - BinaryPart::UnaryExpression(ref mut unary_expression) => { - unary_expression.replace_value(source_range, new_value) - } + BinaryPart::BinaryExpression(binary_expression) => binary_expression.replace_value(source_range, new_value), + BinaryPart::CallExpressionKw(call_expression) => call_expression.replace_value(source_range, new_value), + BinaryPart::UnaryExpression(unary_expression) => unary_expression.replace_value(source_range, new_value), BinaryPart::MemberExpression(_) => {} BinaryPart::IfExpression(e) => e.replace_value(source_range, new_value), BinaryPart::AscribedExpression(e) => e.expr.replace_value(source_range, new_value), @@ -1370,21 +1355,13 @@ impl BinaryPart { fn rename_identifiers(&mut self, old_name: &str, new_name: &str) { match self { BinaryPart::Literal(_literal) => {} - BinaryPart::Name(ref mut identifier) => identifier.rename(old_name, new_name), - BinaryPart::BinaryExpression(ref mut binary_expression) => { - binary_expression.rename_identifiers(old_name, new_name) - } - BinaryPart::CallExpressionKw(ref mut call_expression) => { - call_expression.rename_identifiers(old_name, new_name) - } - BinaryPart::UnaryExpression(ref mut unary_expression) => { - unary_expression.rename_identifiers(old_name, new_name) - } - BinaryPart::MemberExpression(ref mut member_expression) => { - member_expression.rename_identifiers(old_name, new_name) - } - BinaryPart::IfExpression(ref mut if_expression) => if_expression.rename_identifiers(old_name, new_name), - BinaryPart::AscribedExpression(ref mut e) => e.expr.rename_identifiers(old_name, new_name), + BinaryPart::Name(identifier) => identifier.rename(old_name, new_name), + BinaryPart::BinaryExpression(binary_expression) => binary_expression.rename_identifiers(old_name, new_name), + BinaryPart::CallExpressionKw(call_expression) => call_expression.rename_identifiers(old_name, new_name), + BinaryPart::UnaryExpression(unary_expression) => unary_expression.rename_identifiers(old_name, new_name), + BinaryPart::MemberExpression(member_expression) => member_expression.rename_identifiers(old_name, new_name), + BinaryPart::IfExpression(if_expression) => if_expression.rename_identifiers(old_name, new_name), + BinaryPart::AscribedExpression(e) => e.expr.rename_identifiers(old_name, new_name), } } } @@ -2824,7 +2801,7 @@ impl MemberExpression { self.object.rename_identifiers(old_name, new_name); match &mut self.property { - LiteralIdentifier::Identifier(ref mut identifier) => identifier.rename(old_name, new_name), + LiteralIdentifier::Identifier(identifier) => identifier.rename(old_name, new_name), LiteralIdentifier::Literal(_) => {} } } @@ -3312,7 +3289,7 @@ impl Type { .map(|t| t.human_friendly_type()) .collect::>() .join(" or "), - Type::Object { .. } => format!("an object with fields `{}`", self), + Type::Object { .. } => format!("an object with fields `{self}`"), } } @@ -3469,7 +3446,11 @@ pub struct RequiredParamAfterOptionalParam(pub Box); impl std::fmt::Display for RequiredParamAfterOptionalParam { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "KCL functions must declare any optional parameters after all the required parameters. But your required parameter {} is _after_ an optional parameter. You must move it to before the optional parameters instead.", self.0.identifier.name) + write!( + f, + "KCL functions must declare any optional parameters after all the required parameters. But your required parameter {} is _after_ an optional parameter. You must move it to before the optional parameters instead.", + self.0.identifier.name + ) } } diff --git a/rust/kcl-lib/src/parsing/math.rs b/rust/kcl-lib/src/parsing/math.rs index e069cadb8..984a4e52a 100644 --- a/rust/kcl-lib/src/parsing/math.rs +++ b/rust/kcl-lib/src/parsing/math.rs @@ -3,8 +3,8 @@ use super::CompilationError; use crate::{ - parsing::ast::types::{BinaryExpression, BinaryOperator, BinaryPart, Node}, SourceRange, + parsing::ast::types::{BinaryExpression, BinaryOperator, BinaryPart, Node}, }; /// Parses a list of tokens (in infix order, i.e. as the user typed them) @@ -127,11 +127,11 @@ impl From for BinaryExpressionToken { mod tests { use super::*; use crate::{ + ModuleId, parsing::{ ast::types::{Literal, LiteralValue}, token::NumericSuffix, }, - ModuleId, }; #[test] diff --git a/rust/kcl-lib/src/parsing/mod.rs b/rust/kcl-lib/src/parsing/mod.rs index 6445c2ac5..e2d10571d 100644 --- a/rust/kcl-lib/src/parsing/mod.rs +++ b/rust/kcl-lib/src/parsing/mod.rs @@ -1,11 +1,11 @@ use crate::{ + ModuleId, errors::{CompilationError, KclError, KclErrorDetails}, parsing::{ ast::types::{Node, Program}, token::TokenStream, }, source_range::SourceRange, - ModuleId, }; pub(crate) mod ast; @@ -18,7 +18,7 @@ pub const PIPE_OPERATOR: &str = "|>"; // `?` like behavior for `Result`s to return a ParseResult if there is an error. macro_rules! pr_try { - ($e: expr) => { + ($e: expr_2021) => { match $e { Ok(a) => a, Err(e) => return e.into(), @@ -187,7 +187,7 @@ pub fn deprecation(s: &str, kind: DeprecationKind) -> Option<&'static str> { #[cfg(test)] mod tests { macro_rules! parse_and_lex { - ($func_name:ident, $test_kcl_program:expr) => { + ($func_name:ident, $test_kcl_program:expr_2021) => { #[test] fn $func_name() { let _ = crate::parsing::top_level_parse($test_kcl_program); diff --git a/rust/kcl-lib/src/parsing/parser.rs b/rust/kcl-lib/src/parsing/parser.rs index 35e1ea908..c8b277a6b 100644 --- a/rust/kcl-lib/src/parsing/parser.rs +++ b/rust/kcl-lib/src/parsing/parser.rs @@ -14,14 +14,16 @@ use winnow::{ }; use super::{ + DeprecationKind, ast::types::{AscribedExpression, ImportPath, LabelledExpression}, token::{NumericSuffix, RESERVED_WORDS}, - DeprecationKind, }; use crate::{ + IMPORT_FILE_EXTENSIONS, SourceRange, TypedPath, errors::{CompilationError, Severity, Tag}, execution::types::ArrayLen, parsing::{ + PIPE_OPERATOR, PIPE_SUBSTITUTION_OPERATOR, ast::types::{ Annotation, ArrayExpression, ArrayRangeExpression, BinaryExpression, BinaryOperator, BinaryPart, BodyItem, BoxNode, CallExpressionKw, CommentStyle, DefaultParamVal, ElseIf, Expr, ExpressionStatement, @@ -33,9 +35,7 @@ use crate::{ }, math::BinaryExpressionToken, token::{Token, TokenSlice, TokenType}, - PIPE_OPERATOR, PIPE_SUBSTITUTION_OPERATOR, }, - SourceRange, TypedPath, IMPORT_FILE_EXTENSIONS, }; thread_local! { @@ -602,7 +602,7 @@ fn binary_operator(i: &mut TokenSlice) -> ModalResult { return Err(CompilationError::fatal( token.as_source_range(), format!("{} is not a binary operator", token.value.as_str()), - )) + )); } }; Ok(op) @@ -726,7 +726,7 @@ fn shebang(i: &mut TokenSlice) -> ModalResult> { opt(whitespace).parse_next(i)?; Ok(Node::new( - Shebang::new(format!("#!{}", value)), + Shebang::new(format!("#!{value}")), 0, tokens.last().unwrap().end, tokens.first().unwrap().module_id, @@ -1926,7 +1926,7 @@ fn validate_path_string(path_string: String, var_name: bool, path_range: SourceR return Err(ErrMode::Cut( CompilationError::fatal( path_range, - format!("Invalid import path for import from std: {}.", path_string), + format!("Invalid import path for import from std: {path_string}."), ) .into(), )); @@ -1938,7 +1938,10 @@ fn validate_path_string(path_string: String, var_name: bool, path_range: SourceR if !IMPORT_FILE_EXTENSIONS.contains(&extn.to_string_lossy().to_string()) { ParseContext::warn(CompilationError::err( path_range, - format!("unsupported import path format. KCL files can be imported from the current project, CAD files with the following formats are supported: {}", IMPORT_FILE_EXTENSIONS.join(", ")), + format!( + "unsupported import path format. KCL files can be imported from the current project, CAD files with the following formats are supported: {}", + IMPORT_FILE_EXTENSIONS.join(", ") + ), )) } ImportPath::Foreign { @@ -2210,7 +2213,7 @@ fn declaration(i: &mut TokenSlice) -> ModalResult> if matches!(val, Expr::FunctionExpression(_)) { return Err(CompilationError::fatal( SourceRange::new(start, dec_end, id.module_id), - format!("Expected a `fn` variable kind, found: `{}`", kind), + format!("Expected a `fn` variable kind, found: `{kind}`"), )); } Ok(val) @@ -3312,10 +3315,10 @@ fn fn_call_kw(i: &mut TokenSlice) -> ModalResult> { ParseContext::warn( CompilationError::err( result.as_source_range(), - format!("Calling `{}` is deprecated, prefer using `{}`.", callee_str, suggestion), + format!("Calling `{callee_str}` is deprecated, prefer using `{suggestion}`."), ) .with_suggestion( - format!("Replace `{}` with `{}`", callee_str, suggestion), + format!("Replace `{callee_str}` with `{suggestion}`"), suggestion, None, Tag::Deprecated, @@ -3333,13 +3336,13 @@ mod tests { use super::*; use crate::{ - parsing::ast::types::{BodyItem, Expr, VariableKind}, ModuleId, + parsing::ast::types::{BodyItem, Expr, VariableKind}, }; fn assert_reserved(word: &str) { // Try to use it as a variable name. - let code = format!(r#"{} = 0"#, word); + let code = format!(r#"{word} = 0"#); let result = crate::parsing::top_level_parse(code.as_str()); let err = &result.unwrap_errs().next().unwrap(); // Which token causes the error may change. In "return = 0", for @@ -5263,7 +5266,7 @@ mod snapshot_math_tests { // The macro takes a KCL program, ensures it tokenizes and parses, then compares // its parsed AST to a snapshot (kept in this repo in a file under snapshots/ dir) macro_rules! snapshot_test { - ($func_name:ident, $test_kcl_program:expr) => { + ($func_name:ident, $test_kcl_program:expr_2021) => { #[test] fn $func_name() { let module_id = crate::ModuleId::default(); @@ -5301,7 +5304,7 @@ mod snapshot_tests { // The macro takes a KCL program, ensures it tokenizes and parses, then compares // its parsed AST to a snapshot (kept in this repo in a file under snapshots/ dir) macro_rules! snapshot_test { - ($func_name:ident, $test_kcl_program:expr) => { + ($func_name:ident, $test_kcl_program:expr_2021) => { #[test] fn $func_name() { let module_id = crate::ModuleId::default(); diff --git a/rust/kcl-lib/src/parsing/token/mod.rs b/rust/kcl-lib/src/parsing/token/mod.rs index 7ccd79d93..4be1e92e9 100644 --- a/rust/kcl-lib/src/parsing/token/mod.rs +++ b/rust/kcl-lib/src/parsing/token/mod.rs @@ -16,10 +16,10 @@ use winnow::{ }; use crate::{ + CompilationError, ModuleId, errors::KclError, parsing::ast::types::{ItemVisibility, VariableKind}, source_range::SourceRange, - CompilationError, ModuleId, }; mod tokeniser; @@ -609,7 +609,7 @@ impl From, winnow::error::ContextError>> for KclError { // TODO: Add the Winnow parser context to the error. // See https://github.com/KittyCAD/modeling-app/issues/784 KclError::new_lexical(crate::errors::KclErrorDetails::new( - format!("found unknown token '{}'", bad_token), + format!("found unknown token '{bad_token}'"), vec![SourceRange::new(offset, offset + 1, module_id)], )) } diff --git a/rust/kcl-lib/src/parsing/token/tokeniser.rs b/rust/kcl-lib/src/parsing/token/tokeniser.rs index 7a2aa2321..63e7e8355 100644 --- a/rust/kcl-lib/src/parsing/token/tokeniser.rs +++ b/rust/kcl-lib/src/parsing/token/tokeniser.rs @@ -1,19 +1,19 @@ use fnv::FnvHashMap; use lazy_static::lazy_static; use winnow::{ + LocatingSlice, Stateful, ascii::{digit1, multispace1}, combinator::{alt, opt, peek, preceded, repeat}, error::{ContextError, ParseError}, prelude::*, stream::{Location, Stream}, token::{any, none_of, take_till, take_until, take_while}, - LocatingSlice, Stateful, }; use super::TokenStream; use crate::{ - parsing::token::{Token, TokenType}, ModuleId, + parsing::token::{Token, TokenType}, }; lazy_static! { diff --git a/rust/kcl-lib/src/settings/generate_settings_docs.rs b/rust/kcl-lib/src/settings/generate_settings_docs.rs index 76deb15a5..13e3bd7dd 100644 --- a/rust/kcl-lib/src/settings/generate_settings_docs.rs +++ b/rust/kcl-lib/src/settings/generate_settings_docs.rs @@ -1,9 +1,9 @@ use std::path::PathBuf; -use schemars::{gen::SchemaGenerator, JsonSchema}; -use serde_json::{json, Value}; +use schemars::{JsonSchema, r#gen::SchemaGenerator}; +use serde_json::{Value, json}; -use crate::settings::types::{project::ProjectConfiguration, Configuration}; +use crate::settings::types::{Configuration, project::ProjectConfiguration}; // Project settings example in TOML format const PROJECT_SETTINGS_EXAMPLE: &str = r#"[settings.app] @@ -60,7 +60,7 @@ fn init_handlebars() -> handlebars::Handlebars<'static> { let pretty_options = array .iter() .filter_map(|v| v.as_str()) - .map(|s| format!("`{}`", s)) + .map(|s| format!("`{s}`")) .collect::>() .join(", "); out.write(&pretty_options)?; @@ -89,17 +89,17 @@ fn init_handlebars() -> handlebars::Handlebars<'static> { Value::Null => out.write("None")?, Value::Bool(b) => out.write(&b.to_string())?, Value::Number(n) => out.write(&n.to_string())?, - Value::String(s) => out.write(&format!("`{}`", s))?, + Value::String(s) => out.write(&format!("`{s}`"))?, Value::Array(arr) => { let formatted = arr .iter() .map(|v| match v { - Value::String(s) => format!("`{}`", s), - _ => format!("{}", v), + Value::String(s) => format!("`{s}`"), + _ => format!("{v}"), }) .collect::>() .join(", "); - out.write(&format!("[{}]", formatted))?; + out.write(&format!("[{formatted}]"))?; } Value::Object(_) => out.write("(complex default)")?, } @@ -122,7 +122,7 @@ pub fn generate_settings_docs() { let hbs = init_handlebars(); // Generate project settings documentation - let mut settings = schemars::gen::SchemaSettings::default(); + let mut settings = schemars::r#gen::SchemaSettings::default(); settings.inline_subschemas = true; settings.meta_schema = None; // We don't need the meta schema for docs settings.option_nullable = false; // Important - makes Option fields show properly diff --git a/rust/kcl-lib/src/settings/types/mod.rs b/rust/kcl-lib/src/settings/types/mod.rs index f2e79619d..f284401a3 100644 --- a/rust/kcl-lib/src/settings/types/mod.rs +++ b/rust/kcl-lib/src/settings/types/mod.rs @@ -716,13 +716,15 @@ enable_ssao = false let result = color.validate(); if let Ok(r) = result { - panic!("Expected an error, but got success: {:?}", r); + panic!("Expected an error, but got success: {r:?}"); } assert!(result.is_err()); - assert!(result - .unwrap_err() - .to_string() - .contains("color: Validation error: color")); + assert!( + result + .unwrap_err() + .to_string() + .contains("color: Validation error: color") + ); let appearance = AppearanceSettings { theme: AppTheme::System, @@ -730,13 +732,15 @@ enable_ssao = false }; let result = appearance.validate(); if let Ok(r) = result { - panic!("Expected an error, but got success: {:?}", r); + panic!("Expected an error, but got success: {r:?}"); } assert!(result.is_err()); - assert!(result - .unwrap_err() - .to_string() - .contains("color: Validation error: color")); + assert!( + result + .unwrap_err() + .to_string() + .contains("color: Validation error: color") + ); } #[test] @@ -746,13 +750,15 @@ color = 1567.4"#; let result = Configuration::parse_and_validate(settings_file); if let Ok(r) = result { - panic!("Expected an error, but got success: {:?}", r); + panic!("Expected an error, but got success: {r:?}"); } assert!(result.is_err()); - assert!(result - .unwrap_err() - .to_string() - .contains("color: Validation error: color")); + assert!( + result + .unwrap_err() + .to_string() + .contains("color: Validation error: color") + ); } } diff --git a/rust/kcl-lib/src/settings/types/project.rs b/rust/kcl-lib/src/settings/types/project.rs index 60933e89b..55d50bcf2 100644 --- a/rust/kcl-lib/src/settings/types/project.rs +++ b/rust/kcl-lib/src/settings/types/project.rs @@ -7,7 +7,7 @@ use serde::{Deserialize, Serialize}; use validator::Validate; use crate::settings::types::{ - is_default, AppColor, CommandBarSettings, DefaultTrue, OnboardingStatus, TextEditorSettings, UnitLength, + AppColor, CommandBarSettings, DefaultTrue, OnboardingStatus, TextEditorSettings, UnitLength, is_default, }; /// Project specific settings for the app. @@ -203,14 +203,16 @@ color = 1567.4"#; let result = ProjectConfiguration::parse_and_validate(settings_file); if let Ok(r) = result { - panic!("Expected an error, but got success: {:?}", r); + panic!("Expected an error, but got success: {r:?}"); } assert!(result.is_err()); - assert!(result - .unwrap_err() - .to_string() - .contains("color: Validation error: color")); + assert!( + result + .unwrap_err() + .to_string() + .contains("color: Validation error: color") + ); } #[test] diff --git a/rust/kcl-lib/src/simulation_tests.rs b/rust/kcl-lib/src/simulation_tests.rs index ec336be1d..776e364ae 100644 --- a/rust/kcl-lib/src/simulation_tests.rs +++ b/rust/kcl-lib/src/simulation_tests.rs @@ -1,14 +1,14 @@ use std::{ - panic::{catch_unwind, AssertUnwindSafe}, + panic::{AssertUnwindSafe, catch_unwind}, path::{Path, PathBuf}, }; use indexmap::IndexMap; use crate::{ + ExecOutcome, ExecState, ExecutorContext, ModuleId, errors::KclError, execution::{EnvironmentRef, ModuleArtifactState}, - ExecOutcome, ExecState, ExecutorContext, ModuleId, }; #[cfg(feature = "artifact-graph")] use crate::{ @@ -241,7 +241,10 @@ async fn execute_test(test: &Test, render_to_png: bool, export_step: bool) { Ok((exec_state, ctx, env_ref, png, step)) => { let fail_path = test.output_dir.join("execution_error.snap"); if std::fs::exists(&fail_path).unwrap() { - panic!("This test case is expected to fail, but it passed. If this is intended, and the test should actually be passing now, please delete kcl-lib/{}", fail_path.to_string_lossy()) + panic!( + "This test case is expected to fail, but it passed. If this is intended, and the test should actually be passing now, please delete kcl-lib/{}", + fail_path.to_string_lossy() + ) } if render_to_png { twenty_twenty::assert_image(test.output_dir.join(RENDERED_MODEL_NAME), &png, 0.99); @@ -287,10 +290,13 @@ async fn execute_test(test: &Test, render_to_png: bool, export_step: bool) { let report = error.clone().into_miette_report_with_outputs(&input).unwrap(); let report = miette::Report::new(report); if previously_passed { - eprintln!("This test case failed, but it previously passed. If this is intended, and the test should actually be failing now, please delete kcl-lib/{} and other associated passing artifacts", ok_path.to_string_lossy()); + eprintln!( + "This test case failed, but it previously passed. If this is intended, and the test should actually be failing now, please delete kcl-lib/{} and other associated passing artifacts", + ok_path.to_string_lossy() + ); panic!("{report:?}"); } - let report = format!("{:?}", report); + let report = format!("{report:?}"); let err_result = catch_unwind(AssertUnwindSafe(|| { assert_snapshot(test, "Error from executing", || { @@ -2882,7 +2888,7 @@ mod clone_w_fillets { /// Test that KCL is executed correctly. #[tokio::test(flavor = "multi_thread")] #[ignore] // turn on when https://github.com/KittyCAD/engine/pull/3380 is merged - // There's also a test in clone.rs you need to turn too + // There's also a test in clone.rs you need to turn too async fn kcl_test_execute() { super::execute(TEST_NAME, true).await } diff --git a/rust/kcl-lib/src/simulation_tests/kcl_samples.rs b/rust/kcl-lib/src/simulation_tests/kcl_samples.rs index 7e7d2c3ba..027a5e838 100644 --- a/rust/kcl-lib/src/simulation_tests/kcl_samples.rs +++ b/rust/kcl-lib/src/simulation_tests/kcl_samples.rs @@ -1,7 +1,7 @@ //! Run all the KCL samples in the `kcl_samples` directory. use std::{ fs, - panic::{catch_unwind, AssertUnwindSafe}, + panic::{AssertUnwindSafe, catch_unwind}, path::{Path, PathBuf}, }; @@ -86,7 +86,11 @@ fn test_after_engine_ensure_kcl_samples_manifest_etc() { .into_iter() .filter(|name| !input_names.contains(name)) .collect::>(); - assert!(missing.is_empty(), "Expected input kcl-samples for the following. If these are no longer tests, delete the expected output directories for them in {}: {missing:?}", OUTPUTS_DIR.to_string_lossy()); + assert!( + missing.is_empty(), + "Expected input kcl-samples for the following. If these are no longer tests, delete the expected output directories for them in {}: {missing:?}", + OUTPUTS_DIR.to_string_lossy() + ); // We want to move the screenshot for the inputs to the public/kcl-samples // directory so that they can be used as inputs for the next run. @@ -189,7 +193,7 @@ fn kcl_samples_inputs() -> Vec { let entry_point = if main_kcl_path.exists() { main_kcl_path } else { - panic!("No main.kcl found in {:?}", sub_dir); + panic!("No main.kcl found in {sub_dir:?}"); }; tests.push(test(&dir_name_str, entry_point)); } diff --git a/rust/kcl-lib/src/std/appearance.rs b/rust/kcl-lib/src/std/appearance.rs index e47130b97..a822a9ff8 100644 --- a/rust/kcl-lib/src/std/appearance.rs +++ b/rust/kcl-lib/src/std/appearance.rs @@ -1,7 +1,7 @@ //! Standard library appearance. use anyhow::Result; -use kcmc::{each_cmd as mcmd, ModelingCmd}; +use kcmc::{ModelingCmd, each_cmd as mcmd}; use kittycad_modeling_cmds::{self as kcmc, shared::Color}; use regex::Regex; use rgba_simple::Hex; @@ -10,8 +10,8 @@ use super::args::TyF64; use crate::{ errors::{KclError, KclErrorDetails}, execution::{ - types::{ArrayLen, RuntimeType}, ExecState, KclValue, SolidOrImportedGeometry, + types::{ArrayLen, RuntimeType}, }, std::Args, }; @@ -63,7 +63,7 @@ pub async fn appearance(exec_state: &mut ExecState, args: Args) -> Result schemars::schema::Schema { - gen.subschema_for::() + fn json_schema(r#gen: &mut schemars::r#gen::SchemaGenerator) -> schemars::schema::Schema { + r#gen.subschema_for::() } } diff --git a/rust/kcl-lib/src/std/array.rs b/rust/kcl-lib/src/std/array.rs index e3de4caea..c55ffd5e4 100644 --- a/rust/kcl-lib/src/std/array.rs +++ b/rust/kcl-lib/src/std/array.rs @@ -1,15 +1,15 @@ use indexmap::IndexMap; use crate::{ + ExecutorContext, errors::{KclError, KclErrorDetails}, execution::{ + ExecState, fn_call::{Arg, Args, KwArgs}, kcl_value::{FunctionSource, KclValue}, types::RuntimeType, - ExecState, }, source_range::SourceRange, - ExecutorContext, }; /// Apply a function to each element of an array. diff --git a/rust/kcl-lib/src/std/assert.rs b/rust/kcl-lib/src/std/assert.rs index 94dcb0db7..20886e7a1 100644 --- a/rust/kcl-lib/src/std/assert.rs +++ b/rust/kcl-lib/src/std/assert.rs @@ -5,14 +5,14 @@ use anyhow::Result; use super::args::TyF64; use crate::{ errors::{KclError, KclErrorDetails}, - execution::{types::RuntimeType, ExecState, KclValue}, + execution::{ExecState, KclValue, types::RuntimeType}, std::Args, }; async fn _assert(value: bool, message: &str, args: &Args) -> Result<(), KclError> { if !value { return Err(KclError::new_type(KclErrorDetails::new( - format!("assert failed: {}", message), + format!("assert failed: {message}"), vec![args.source_range], ))); } diff --git a/rust/kcl-lib/src/std/chamfer.rs b/rust/kcl-lib/src/std/chamfer.rs index 060855519..1b1a0fac9 100644 --- a/rust/kcl-lib/src/std/chamfer.rs +++ b/rust/kcl-lib/src/std/chamfer.rs @@ -1,18 +1,18 @@ //! Standard library chamfers. use anyhow::Result; -use kcmc::{each_cmd as mcmd, length_unit::LengthUnit, shared::CutType, ModelingCmd}; +use kcmc::{ModelingCmd, each_cmd as mcmd, length_unit::LengthUnit, shared::CutType}; use kittycad_modeling_cmds as kcmc; use super::args::TyF64; use crate::{ errors::{KclError, KclErrorDetails}, execution::{ - types::RuntimeType, ChamferSurface, EdgeCut, ExecState, ExtrudeSurface, GeoMeta, KclValue, ModelingCmdMeta, - Solid, + ChamferSurface, EdgeCut, ExecState, ExtrudeSurface, GeoMeta, KclValue, ModelingCmdMeta, Solid, + types::RuntimeType, }, parsing::ast::types::TagNode, - std::{fillet::EdgeReference, Args}, + std::{Args, fillet::EdgeReference}, }; pub(crate) const DEFAULT_TOLERANCE: f64 = 0.0000001; diff --git a/rust/kcl-lib/src/std/clone.rs b/rust/kcl-lib/src/std/clone.rs index 0283bb4a7..c1727737d 100644 --- a/rust/kcl-lib/src/std/clone.rs +++ b/rust/kcl-lib/src/std/clone.rs @@ -4,10 +4,9 @@ use std::collections::HashMap; use anyhow::Result; use kcmc::{ - each_cmd as mcmd, - ok_response::{output::EntityGetAllChildUuids, OkModelingCmdResponse}, + ModelingCmd, each_cmd as mcmd, + ok_response::{OkModelingCmdResponse, output::EntityGetAllChildUuids}, websocket::OkWebSocketResponseData, - ModelingCmd, }; use kittycad_modeling_cmds::{self as kcmc}; @@ -15,11 +14,11 @@ use super::extrude::do_post_extrude; use crate::{ errors::{KclError, KclErrorDetails}, execution::{ - types::{NumericType, PrimitiveType, RuntimeType}, ExecState, GeometryWithImportedGeometry, KclValue, ModelingCmdMeta, Sketch, Solid, + types::{NumericType, PrimitiveType, RuntimeType}, }, parsing::ast::types::TagNode, - std::{extrude::NamedCapTags, Args}, + std::{Args, extrude::NamedCapTags}, }; /// Clone a sketch or solid. @@ -91,7 +90,7 @@ async fn inner_clone( .await .map_err(|e| { KclError::new_internal(KclErrorDetails::new( - format!("failed to fix tags and references: {:?}", e), + format!("failed to fix tags and references: {e:?}"), vec![args.source_range], )) })?; @@ -320,10 +319,10 @@ clonedCube = clone(cube) assert_ne!(cube, cloned_cube); let KclValue::Sketch { value: cube } = cube else { - panic!("Expected a sketch, got: {:?}", cube); + panic!("Expected a sketch, got: {cube:?}"); }; let KclValue::Sketch { value: cloned_cube } = cloned_cube else { - panic!("Expected a sketch, got: {:?}", cloned_cube); + panic!("Expected a sketch, got: {cloned_cube:?}"); }; assert_ne!(cube.id, cloned_cube.id); @@ -369,10 +368,10 @@ clonedCube = clone(cube) assert_ne!(cube, cloned_cube); let KclValue::Solid { value: cube } = cube else { - panic!("Expected a solid, got: {:?}", cube); + panic!("Expected a solid, got: {cube:?}"); }; let KclValue::Solid { value: cloned_cube } = cloned_cube else { - panic!("Expected a solid, got: {:?}", cloned_cube); + panic!("Expected a solid, got: {cloned_cube:?}"); }; assert_ne!(cube.id, cloned_cube.id); @@ -427,10 +426,10 @@ clonedCube = clone(cube) assert_ne!(cube, cloned_cube); let KclValue::Sketch { value: cube } = cube else { - panic!("Expected a sketch, got: {:?}", cube); + panic!("Expected a sketch, got: {cube:?}"); }; let KclValue::Sketch { value: cloned_cube } = cloned_cube else { - panic!("Expected a sketch, got: {:?}", cloned_cube); + panic!("Expected a sketch, got: {cloned_cube:?}"); }; assert_ne!(cube.id, cloned_cube.id); @@ -483,10 +482,10 @@ clonedCube = clone(cube) assert_ne!(cube, cloned_cube); let KclValue::Solid { value: cube } = cube else { - panic!("Expected a solid, got: {:?}", cube); + panic!("Expected a solid, got: {cube:?}"); }; let KclValue::Solid { value: cloned_cube } = cloned_cube else { - panic!("Expected a solid, got: {:?}", cloned_cube); + panic!("Expected a solid, got: {cloned_cube:?}"); }; assert_ne!(cube.id, cloned_cube.id); @@ -555,10 +554,10 @@ clonedCube = clone(cube) assert_ne!(cube, cloned_cube); let KclValue::Solid { value: cube } = cube else { - panic!("Expected a solid, got: {:?}", cube); + panic!("Expected a solid, got: {cube:?}"); }; let KclValue::Solid { value: cloned_cube } = cloned_cube else { - panic!("Expected a solid, got: {:?}", cloned_cube); + panic!("Expected a solid, got: {cloned_cube:?}"); }; assert_ne!(cube.id, cloned_cube.id); @@ -655,10 +654,10 @@ clonedCube = clone(cube) assert_ne!(cube, cloned_cube); let KclValue::Solid { value: cube } = cube else { - panic!("Expected a solid, got: {:?}", cube); + panic!("Expected a solid, got: {cube:?}"); }; let KclValue::Solid { value: cloned_cube } = cloned_cube else { - panic!("Expected a solid, got: {:?}", cloned_cube); + panic!("Expected a solid, got: {cloned_cube:?}"); }; assert_ne!(cube.id, cloned_cube.id); diff --git a/rust/kcl-lib/src/std/csg.rs b/rust/kcl-lib/src/std/csg.rs index 9b97a6b31..016abb84b 100644 --- a/rust/kcl-lib/src/std/csg.rs +++ b/rust/kcl-lib/src/std/csg.rs @@ -1,7 +1,7 @@ //! Constructive Solid Geometry (CSG) operations. use anyhow::Result; -use kcmc::{each_cmd as mcmd, length_unit::LengthUnit, ModelingCmd}; +use kcmc::{ModelingCmd, each_cmd as mcmd, length_unit::LengthUnit}; use kittycad_modeling_cmds::{ self as kcmc, ok_response::OkModelingCmdResponse, @@ -9,11 +9,11 @@ use kittycad_modeling_cmds::{ websocket::OkWebSocketResponseData, }; -use super::{args::TyF64, DEFAULT_TOLERANCE_MM}; +use super::{DEFAULT_TOLERANCE_MM, args::TyF64}; use crate::{ errors::{KclError, KclErrorDetails}, - execution::{types::RuntimeType, ExecState, KclValue, ModelingCmdMeta, Solid}, - std::{patterns::GeometryTrait, Args}, + execution::{ExecState, KclValue, ModelingCmdMeta, Solid, types::RuntimeType}, + std::{Args, patterns::GeometryTrait}, }; /// Union two or more solids into a single solid. diff --git a/rust/kcl-lib/src/std/edge.rs b/rust/kcl-lib/src/std/edge.rs index 77ac591c3..48133cdd0 100644 --- a/rust/kcl-lib/src/std/edge.rs +++ b/rust/kcl-lib/src/std/edge.rs @@ -1,18 +1,18 @@ //! Edge helper functions. use anyhow::Result; -use kcmc::{each_cmd as mcmd, ok_response::OkModelingCmdResponse, websocket::OkWebSocketResponseData, ModelingCmd}; +use kcmc::{ModelingCmd, each_cmd as mcmd, ok_response::OkModelingCmdResponse, websocket::OkWebSocketResponseData}; use kittycad_modeling_cmds as kcmc; use uuid::Uuid; use crate::{ + SourceRange, errors::{KclError, KclErrorDetails}, execution::{ - types::{ArrayLen, RuntimeType}, ExecState, ExtrudeSurface, KclValue, ModelingCmdMeta, TagIdentifier, + types::{ArrayLen, RuntimeType}, }, - std::{sketch::FaceTag, Args}, - SourceRange, + std::{Args, sketch::FaceTag}, }; /// Get the opposite edge to the edge given. @@ -55,7 +55,7 @@ async fn inner_get_opposite_edge( } = &resp else { return Err(KclError::new_engine(KclErrorDetails::new( - format!("mcmd::Solid3dGetOppositeEdge response was not as expected: {:?}", resp), + format!("mcmd::Solid3dGetOppositeEdge response was not as expected: {resp:?}"), vec![args.source_range], ))); }; @@ -104,10 +104,7 @@ async fn inner_get_next_adjacent_edge( } = &resp else { return Err(KclError::new_engine(KclErrorDetails::new( - format!( - "mcmd::Solid3dGetNextAdjacentEdge response was not as expected: {:?}", - resp - ), + format!("mcmd::Solid3dGetNextAdjacentEdge response was not as expected: {resp:?}"), vec![args.source_range], ))); }; @@ -160,10 +157,7 @@ async fn inner_get_previous_adjacent_edge( } = &resp else { return Err(KclError::new_engine(KclErrorDetails::new( - format!( - "mcmd::Solid3dGetPrevAdjacentEdge response was not as expected: {:?}", - resp - ), + format!("mcmd::Solid3dGetPrevAdjacentEdge response was not as expected: {resp:?}"), vec![args.source_range], ))); }; @@ -259,7 +253,7 @@ async fn inner_get_common_edge( } = &resp else { return Err(KclError::new_engine(KclErrorDetails::new( - format!("mcmd::Solid3dGetCommonEdge response was not as expected: {:?}", resp), + format!("mcmd::Solid3dGetCommonEdge response was not as expected: {resp:?}"), vec![args.source_range], ))); }; diff --git a/rust/kcl-lib/src/std/extrude.rs b/rust/kcl-lib/src/std/extrude.rs index f40752f4c..204253b0a 100644 --- a/rust/kcl-lib/src/std/extrude.rs +++ b/rust/kcl-lib/src/std/extrude.rs @@ -4,13 +4,12 @@ use std::collections::HashMap; use anyhow::Result; use kcmc::{ - each_cmd as mcmd, + ModelingCmd, each_cmd as mcmd, length_unit::LengthUnit, ok_response::OkModelingCmdResponse, output::ExtrusionFaceInfo, shared::{ExtrusionFaceCapType, Opposite}, websocket::{ModelingCmdReq, OkWebSocketResponseData}, - ModelingCmd, }; use kittycad_modeling_cmds::{ self as kcmc, @@ -18,12 +17,12 @@ use kittycad_modeling_cmds::{ }; use uuid::Uuid; -use super::{args::TyF64, utils::point_to_mm, DEFAULT_TOLERANCE_MM}; +use super::{DEFAULT_TOLERANCE_MM, args::TyF64, utils::point_to_mm}; use crate::{ errors::{KclError, KclErrorDetails}, execution::{ - types::RuntimeType, ArtifactId, ExecState, ExtrudeSurface, GeoMeta, KclValue, ModelingCmdMeta, Path, Sketch, - SketchSurface, Solid, + ArtifactId, ExecState, ExtrudeSurface, GeoMeta, KclValue, ModelingCmdMeta, Path, Sketch, SketchSurface, Solid, + types::RuntimeType, }, parsing::ast::types::TagNode, std::Args, diff --git a/rust/kcl-lib/src/std/fillet.rs b/rust/kcl-lib/src/std/fillet.rs index b56b25504..e7d2677de 100644 --- a/rust/kcl-lib/src/std/fillet.rs +++ b/rust/kcl-lib/src/std/fillet.rs @@ -2,20 +2,20 @@ use anyhow::Result; use indexmap::IndexMap; -use kcmc::{each_cmd as mcmd, length_unit::LengthUnit, shared::CutType, ModelingCmd}; +use kcmc::{ModelingCmd, each_cmd as mcmd, length_unit::LengthUnit, shared::CutType}; use kittycad_modeling_cmds as kcmc; use serde::{Deserialize, Serialize}; -use super::{args::TyF64, DEFAULT_TOLERANCE_MM}; +use super::{DEFAULT_TOLERANCE_MM, args::TyF64}; use crate::{ + SourceRange, errors::{KclError, KclErrorDetails}, execution::{ - types::RuntimeType, EdgeCut, ExecState, ExtrudeSurface, FilletSurface, GeoMeta, KclValue, ModelingCmdMeta, - Solid, TagIdentifier, + EdgeCut, ExecState, ExtrudeSurface, FilletSurface, GeoMeta, KclValue, ModelingCmdMeta, Solid, TagIdentifier, + types::RuntimeType, }, parsing::ast::types::TagNode, std::Args, - SourceRange, }; /// A tag or a uuid of an edge. diff --git a/rust/kcl-lib/src/std/helix.rs b/rust/kcl-lib/src/std/helix.rs index 698b222d9..621fcefe0 100644 --- a/rust/kcl-lib/src/std/helix.rs +++ b/rust/kcl-lib/src/std/helix.rs @@ -1,17 +1,17 @@ //! Standard library helices. use anyhow::Result; -use kcmc::{each_cmd as mcmd, length_unit::LengthUnit, shared::Angle, ModelingCmd}; +use kcmc::{ModelingCmd, each_cmd as mcmd, length_unit::LengthUnit, shared::Angle}; use kittycad_modeling_cmds::{self as kcmc, shared::Point3d}; use super::args::TyF64; use crate::{ errors::{KclError, KclErrorDetails}, execution::{ - types::{PrimitiveType, RuntimeType}, ExecState, Helix as HelixValue, KclValue, ModelingCmdMeta, Solid, + types::{PrimitiveType, RuntimeType}, }, - std::{axis_or_reference::Axis3dOrEdgeReference, Args}, + std::{Args, axis_or_reference::Axis3dOrEdgeReference}, }; /// Create a helix. diff --git a/rust/kcl-lib/src/std/loft.rs b/rust/kcl-lib/src/std/loft.rs index e21b71f2a..e30d36da6 100644 --- a/rust/kcl-lib/src/std/loft.rs +++ b/rust/kcl-lib/src/std/loft.rs @@ -3,18 +3,18 @@ use std::num::NonZeroU32; use anyhow::Result; -use kcmc::{each_cmd as mcmd, length_unit::LengthUnit, ModelingCmd}; +use kcmc::{ModelingCmd, each_cmd as mcmd, length_unit::LengthUnit}; use kittycad_modeling_cmds as kcmc; -use super::{args::TyF64, DEFAULT_TOLERANCE_MM}; +use super::{DEFAULT_TOLERANCE_MM, args::TyF64}; use crate::{ errors::{KclError, KclErrorDetails}, execution::{ - types::{NumericType, RuntimeType}, ExecState, KclValue, ModelingCmdMeta, Sketch, Solid, + types::{NumericType, RuntimeType}, }, parsing::ast::types::TagNode, - std::{extrude::do_post_extrude, Args}, + std::{Args, extrude::do_post_extrude}, }; const DEFAULT_V_DEGREE: u32 = 2; diff --git a/rust/kcl-lib/src/std/math.rs b/rust/kcl-lib/src/std/math.rs index 572db8d05..f5de84ce9 100644 --- a/rust/kcl-lib/src/std/math.rs +++ b/rust/kcl-lib/src/std/math.rs @@ -3,13 +3,13 @@ use anyhow::Result; use crate::{ + CompilationError, errors::{KclError, KclErrorDetails}, execution::{ - types::{ArrayLen, NumericType, RuntimeType}, ExecState, KclValue, + types::{ArrayLen, NumericType, RuntimeType}, }, std::args::{Args, TyF64}, - CompilationError, }; /// Compute the remainder after dividing `num` by `div`. diff --git a/rust/kcl-lib/src/std/mirror.rs b/rust/kcl-lib/src/std/mirror.rs index f27e55b46..2c7acfe98 100644 --- a/rust/kcl-lib/src/std/mirror.rs +++ b/rust/kcl-lib/src/std/mirror.rs @@ -1,7 +1,7 @@ //! Standard library mirror. use anyhow::Result; -use kcmc::{each_cmd as mcmd, ModelingCmd}; +use kcmc::{ModelingCmd, each_cmd as mcmd}; use kittycad_modeling_cmds::{ self as kcmc, length_unit::LengthUnit, ok_response::OkModelingCmdResponse, shared::Point3d, websocket::OkWebSocketResponseData, @@ -10,10 +10,10 @@ use kittycad_modeling_cmds::{ use crate::{ errors::{KclError, KclErrorDetails}, execution::{ - types::{PrimitiveType, RuntimeType}, ExecState, KclValue, Sketch, + types::{PrimitiveType, RuntimeType}, }, - std::{axis_or_reference::Axis2dOrEdgeReference, Args}, + std::{Args, axis_or_reference::Axis2dOrEdgeReference}, }; /// Mirror a sketch. @@ -84,14 +84,14 @@ async fn inner_mirror_2d( return Err(KclError::new_engine(KclErrorDetails::new( "No edges found in mirror info".to_string(), vec![args.source_range], - ))) + ))); } } Ok(()) })?; } else { return Err(KclError::new_engine(KclErrorDetails::new( - format!("EntityMirror response was not as expected: {:?}", resp), + format!("EntityMirror response was not as expected: {resp:?}"), vec![args.source_range], ))); }; @@ -127,14 +127,14 @@ async fn inner_mirror_2d( return Err(KclError::new_engine(KclErrorDetails::new( "No edges found in mirror info".to_string(), vec![args.source_range], - ))) + ))); } } Ok(()) })?; } else { return Err(KclError::new_engine(KclErrorDetails::new( - format!("EntityMirrorAcrossEdge response was not as expected: {:?}", resp), + format!("EntityMirrorAcrossEdge response was not as expected: {resp:?}"), vec![args.source_range], ))); }; diff --git a/rust/kcl-lib/src/std/mod.rs b/rust/kcl-lib/src/std/mod.rs index 482a74bda..4c124fcbf 100644 --- a/rust/kcl-lib/src/std/mod.rs +++ b/rust/kcl-lib/src/std/mod.rs @@ -31,7 +31,7 @@ pub use args::Args; use crate::{ errors::KclError, - execution::{types::PrimitiveType, ExecState, KclValue}, + execution::{ExecState, KclValue, types::PrimitiveType}, }; pub type StdFn = fn( diff --git a/rust/kcl-lib/src/std/patterns.rs b/rust/kcl-lib/src/std/patterns.rs index 813c907af..454385f83 100644 --- a/rust/kcl-lib/src/std/patterns.rs +++ b/rust/kcl-lib/src/std/patterns.rs @@ -4,8 +4,8 @@ use std::cmp::Ordering; use anyhow::Result; use kcmc::{ - each_cmd as mcmd, length_unit::LengthUnit, ok_response::OkModelingCmdResponse, shared::Transform, - websocket::OkWebSocketResponseData, ModelingCmd, + ModelingCmd, each_cmd as mcmd, length_unit::LengthUnit, ok_response::OkModelingCmdResponse, shared::Transform, + websocket::OkWebSocketResponseData, }; use kittycad_modeling_cmds::{ self as kcmc, @@ -16,19 +16,19 @@ use uuid::Uuid; use super::axis_or_reference::Axis3dOrPoint3d; use crate::{ + ExecutorContext, SourceRange, errors::{KclError, KclErrorDetails}, execution::{ + ExecState, Geometries, Geometry, KclObjectFields, KclValue, Sketch, Solid, fn_call::{Arg, Args, KwArgs}, kcl_value::FunctionSource, types::{NumericType, PrimitiveType, RuntimeType}, - ExecState, Geometries, Geometry, KclObjectFields, KclValue, Sketch, Solid, }, std::{ args::TyF64, axis_or_reference::Axis2dOrPoint2d, utils::{point_3d_to_mm, point_to_mm}, }, - ExecutorContext, SourceRange, }; const MUST_HAVE_ONE_INSTANCE: &str = "There must be at least 1 instance of your geometry"; @@ -176,7 +176,7 @@ async fn send_pattern_transform( &mock_ids } else { return Err(KclError::new_engine(KclErrorDetails::new( - format!("EntityLinearPattern response was not as expected: {:?}", resp), + format!("EntityLinearPattern response was not as expected: {resp:?}"), vec![args.source_range], ))); }; @@ -244,7 +244,7 @@ async fn make_transform( return Err(KclError::new_semantic(KclErrorDetails::new( "Transform function must return a transform object".to_string(), source_ranges.clone(), - ))) + ))); } }; @@ -970,7 +970,7 @@ async fn pattern_circular( &mock_ids } else { return Err(KclError::new_engine(KclErrorDetails::new( - format!("EntityCircularPattern response was not as expected: {:?}", resp), + format!("EntityCircularPattern response was not as expected: {resp:?}"), vec![args.source_range], ))); }; diff --git a/rust/kcl-lib/src/std/planes.rs b/rust/kcl-lib/src/std/planes.rs index ae5fe890e..59389196e 100644 --- a/rust/kcl-lib/src/std/planes.rs +++ b/rust/kcl-lib/src/std/planes.rs @@ -1,12 +1,12 @@ //! Standard library plane helpers. -use kcmc::{each_cmd as mcmd, length_unit::LengthUnit, shared::Color, ModelingCmd}; +use kcmc::{ModelingCmd, each_cmd as mcmd, length_unit::LengthUnit, shared::Color}; use kittycad_modeling_cmds as kcmc; use super::{args::TyF64, sketch::PlaneData}; use crate::{ errors::KclError, - execution::{types::RuntimeType, ExecState, KclValue, ModelingCmdMeta, Plane, PlaneType}, + execution::{ExecState, KclValue, ModelingCmdMeta, Plane, PlaneType, types::RuntimeType}, std::Args, }; diff --git a/rust/kcl-lib/src/std/revolve.rs b/rust/kcl-lib/src/std/revolve.rs index 66c39c7a9..5f36135ba 100644 --- a/rust/kcl-lib/src/std/revolve.rs +++ b/rust/kcl-lib/src/std/revolve.rs @@ -2,22 +2,21 @@ use anyhow::Result; use kcmc::{ - each_cmd as mcmd, + ModelingCmd, each_cmd as mcmd, length_unit::LengthUnit, shared::{Angle, Opposite}, - ModelingCmd, }; use kittycad_modeling_cmds::{self as kcmc, shared::Point3d}; -use super::{args::TyF64, DEFAULT_TOLERANCE_MM}; +use super::{DEFAULT_TOLERANCE_MM, args::TyF64}; use crate::{ errors::{KclError, KclErrorDetails}, execution::{ - types::{NumericType, PrimitiveType, RuntimeType}, ExecState, KclValue, ModelingCmdMeta, Sketch, Solid, + types::{NumericType, PrimitiveType, RuntimeType}, }, parsing::ast::types::TagNode, - std::{axis_or_reference::Axis2dOrEdgeReference, extrude::do_post_extrude, Args}, + std::{Args, axis_or_reference::Axis2dOrEdgeReference, extrude::do_post_extrude}, }; extern crate nalgebra_glm as glm; @@ -76,7 +75,7 @@ async fn inner_revolve( // nice and we use the other data in the docs, so we still need use the derive above for the json schema. if !(-360.0..=360.0).contains(&angle) || angle == 0.0 { return Err(KclError::new_semantic(KclErrorDetails::new( - format!("Expected angle to be between -360 and 360 and not 0, found `{}`", angle), + format!("Expected angle to be between -360 and 360 and not 0, found `{angle}`"), vec![args.source_range], ))); } @@ -89,8 +88,7 @@ async fn inner_revolve( if !(-360.0..=360.0).contains(&bidirectional_angle) || bidirectional_angle == 0.0 { return Err(KclError::new_semantic(KclErrorDetails::new( format!( - "Expected bidirectional angle to be between -360 and 360 and not 0, found `{}`", - bidirectional_angle + "Expected bidirectional angle to be between -360 and 360 and not 0, found `{bidirectional_angle}`" ), vec![args.source_range], ))); @@ -100,10 +98,7 @@ async fn inner_revolve( let ang = angle.signum() * bidirectional_angle + angle; if !(-360.0..=360.0).contains(&ang) { return Err(KclError::new_semantic(KclErrorDetails::new( - format!( - "Combined angle and bidirectional must be between -360 and 360, found '{}'", - ang - ), + format!("Combined angle and bidirectional must be between -360 and 360, found '{ang}'"), vec![args.source_range], ))); } diff --git a/rust/kcl-lib/src/std/segment.rs b/rust/kcl-lib/src/std/segment.rs index c8ba75e35..42d40bf42 100644 --- a/rust/kcl-lib/src/std/segment.rs +++ b/rust/kcl-lib/src/std/segment.rs @@ -7,10 +7,10 @@ use super::utils::untype_point; use crate::{ errors::{KclError, KclErrorDetails}, execution::{ - types::{NumericType, PrimitiveType, RuntimeType}, ExecState, KclValue, Sketch, TagIdentifier, + types::{NumericType, PrimitiveType, RuntimeType}, }, - std::{args::TyF64, utils::between, Args}, + std::{Args, args::TyF64, utils::between}, }; /// Returns the point at the end of the given segment. @@ -25,7 +25,7 @@ fn inner_segment_end(tag: &TagIdentifier, exec_state: &mut ExecState, args: Args let line = args.get_tag_engine_info(exec_state, tag)?; let path = line.path.clone().ok_or_else(|| { KclError::new_type(KclErrorDetails::new( - format!("Expected a line segment with a path, found `{:?}`", line), + format!("Expected a line segment with a path, found `{line:?}`"), vec![args.source_range], )) })?; @@ -48,7 +48,7 @@ fn inner_segment_end_x(tag: &TagIdentifier, exec_state: &mut ExecState, args: Ar let line = args.get_tag_engine_info(exec_state, tag)?; let path = line.path.clone().ok_or_else(|| { KclError::new_type(KclErrorDetails::new( - format!("Expected a line segment with a path, found `{:?}`", line), + format!("Expected a line segment with a path, found `{line:?}`"), vec![args.source_range], )) })?; @@ -68,7 +68,7 @@ fn inner_segment_end_y(tag: &TagIdentifier, exec_state: &mut ExecState, args: Ar let line = args.get_tag_engine_info(exec_state, tag)?; let path = line.path.clone().ok_or_else(|| { KclError::new_type(KclErrorDetails::new( - format!("Expected a line segment with a path, found `{:?}`", line), + format!("Expected a line segment with a path, found `{line:?}`"), vec![args.source_range], )) })?; @@ -88,7 +88,7 @@ fn inner_segment_start(tag: &TagIdentifier, exec_state: &mut ExecState, args: Ar let line = args.get_tag_engine_info(exec_state, tag)?; let path = line.path.clone().ok_or_else(|| { KclError::new_type(KclErrorDetails::new( - format!("Expected a line segment with a path, found `{:?}`", line), + format!("Expected a line segment with a path, found `{line:?}`"), vec![args.source_range], )) })?; @@ -111,7 +111,7 @@ fn inner_segment_start_x(tag: &TagIdentifier, exec_state: &mut ExecState, args: let line = args.get_tag_engine_info(exec_state, tag)?; let path = line.path.clone().ok_or_else(|| { KclError::new_type(KclErrorDetails::new( - format!("Expected a line segment with a path, found `{:?}`", line), + format!("Expected a line segment with a path, found `{line:?}`"), vec![args.source_range], )) })?; @@ -131,7 +131,7 @@ fn inner_segment_start_y(tag: &TagIdentifier, exec_state: &mut ExecState, args: let line = args.get_tag_engine_info(exec_state, tag)?; let path = line.path.clone().ok_or_else(|| { KclError::new_type(KclErrorDetails::new( - format!("Expected a line segment with a path, found `{:?}`", line), + format!("Expected a line segment with a path, found `{line:?}`"), vec![args.source_range], )) })?; @@ -152,7 +152,7 @@ fn inner_last_segment_x(sketch: Sketch, args: Args) -> Result { .last() .ok_or_else(|| { KclError::new_type(KclErrorDetails::new( - format!("Expected a Sketch with at least one segment, found `{:?}`", sketch), + format!("Expected a Sketch with at least one segment, found `{sketch:?}`"), vec![args.source_range], )) })? @@ -175,7 +175,7 @@ fn inner_last_segment_y(sketch: Sketch, args: Args) -> Result { .last() .ok_or_else(|| { KclError::new_type(KclErrorDetails::new( - format!("Expected a Sketch with at least one segment, found `{:?}`", sketch), + format!("Expected a Sketch with at least one segment, found `{sketch:?}`"), vec![args.source_range], )) })? @@ -195,7 +195,7 @@ fn inner_segment_length(tag: &TagIdentifier, exec_state: &mut ExecState, args: A let line = args.get_tag_engine_info(exec_state, tag)?; let path = line.path.clone().ok_or_else(|| { KclError::new_type(KclErrorDetails::new( - format!("Expected a line segment with a path, found `{:?}`", line), + format!("Expected a line segment with a path, found `{line:?}`"), vec![args.source_range], )) })?; @@ -215,7 +215,7 @@ fn inner_segment_angle(tag: &TagIdentifier, exec_state: &mut ExecState, args: Ar let line = args.get_tag_engine_info(exec_state, tag)?; let path = line.path.clone().ok_or_else(|| { KclError::new_type(KclErrorDetails::new( - format!("Expected a line segment with a path, found `{:?}`", line), + format!("Expected a line segment with a path, found `{line:?}`"), vec![args.source_range], )) })?; @@ -237,7 +237,7 @@ async fn inner_tangent_to_end(tag: &TagIdentifier, exec_state: &mut ExecState, a let line = args.get_tag_engine_info(exec_state, tag)?; let path = line.path.clone().ok_or_else(|| { KclError::new_type(KclErrorDetails::new( - format!("Expected a line segment with a path, found `{:?}`", line), + format!("Expected a line segment with a path, found `{line:?}`"), vec![args.source_range], )) })?; diff --git a/rust/kcl-lib/src/std/shapes.rs b/rust/kcl-lib/src/std/shapes.rs index 9a8004b40..74685e392 100644 --- a/rust/kcl-lib/src/std/shapes.rs +++ b/rust/kcl-lib/src/std/shapes.rs @@ -2,10 +2,9 @@ use anyhow::Result; use kcmc::{ - each_cmd as mcmd, + ModelingCmd, each_cmd as mcmd, length_unit::LengthUnit, shared::{Angle, Point2d as KPoint2d}, - ModelingCmd, }; use kittycad_modeling_cmds as kcmc; use kittycad_modeling_cmds::shared::PathSegment; @@ -17,17 +16,17 @@ use super::{ utils::{point_to_len_unit, point_to_mm, point_to_typed, untype_point, untyped_point_to_mm}, }; use crate::{ + SourceRange, errors::{KclError, KclErrorDetails}, execution::{ - types::{RuntimeType, UnitLen}, BasePath, ExecState, GeoMeta, KclValue, ModelingCmdMeta, Path, Sketch, SketchSurface, + types::{RuntimeType, UnitLen}, }, parsing::ast::types::TagNode, std::{ - utils::{calculate_circle_center, distance}, Args, + utils::{calculate_circle_center, distance}, }, - SourceRange, }; /// A sketch surface or a sketch. diff --git a/rust/kcl-lib/src/std/shell.rs b/rust/kcl-lib/src/std/shell.rs index eff145b58..3ad09d063 100644 --- a/rust/kcl-lib/src/std/shell.rs +++ b/rust/kcl-lib/src/std/shell.rs @@ -1,17 +1,17 @@ //! Standard library shells. use anyhow::Result; -use kcmc::{each_cmd as mcmd, length_unit::LengthUnit, ModelingCmd}; +use kcmc::{ModelingCmd, each_cmd as mcmd, length_unit::LengthUnit}; use kittycad_modeling_cmds as kcmc; use super::args::TyF64; use crate::{ errors::{KclError, KclErrorDetails}, execution::{ - types::{ArrayLen, RuntimeType}, ExecState, KclValue, Solid, + types::{ArrayLen, RuntimeType}, }, - std::{sketch::FaceTag, Args}, + std::{Args, sketch::FaceTag}, }; /// Create a shell. diff --git a/rust/kcl-lib/src/std/sketch.rs b/rust/kcl-lib/src/std/sketch.rs index ab24c68c1..cd09df518 100644 --- a/rust/kcl-lib/src/std/sketch.rs +++ b/rust/kcl-lib/src/std/sketch.rs @@ -4,7 +4,7 @@ use anyhow::Result; use indexmap::IndexMap; use kcmc::shared::Point2d as KPoint2d; // Point2d is already defined in this pkg, to impl ts_rs traits. use kcmc::shared::Point3d as KPoint3d; // Point3d is already defined in this pkg, to impl ts_rs traits. -use kcmc::{each_cmd as mcmd, length_unit::LengthUnit, shared::Angle, websocket::ModelingCmdReq, ModelingCmd}; +use kcmc::{ModelingCmd, each_cmd as mcmd, length_unit::LengthUnit, shared::Angle, websocket::ModelingCmdReq}; use kittycad_modeling_cmds as kcmc; use kittycad_modeling_cmds::shared::PathSegment; use parse_display::{Display, FromStr}; @@ -17,17 +17,16 @@ use crate::execution::{Artifact, ArtifactId, CodeRef, StartSketchOnFace, StartSk use crate::{ errors::{KclError, KclErrorDetails}, execution::{ - types::{ArrayLen, NumericType, PrimitiveType, RuntimeType, UnitLen}, BasePath, ExecState, Face, GeoMeta, KclValue, ModelingCmdMeta, Path, Plane, PlaneInfo, Point2d, Sketch, SketchSurface, Solid, TagEngineInfo, TagIdentifier, + types::{ArrayLen, NumericType, PrimitiveType, RuntimeType, UnitLen}, }, parsing::ast::types::TagNode, std::{ args::{Args, TyF64}, utils::{ - arc_center_and_end, get_tangential_arc_to_info, get_x_component, get_y_component, + TangentialArcInfoInput, arc_center_and_end, get_tangential_arc_to_info, get_x_component, get_y_component, intersection_with_parallel_line, point_to_len_unit, point_to_mm, untyped_point_to_mm, - TangentialArcInfoInput, }, }, }; @@ -45,7 +44,7 @@ pub enum FaceTag { impl std::fmt::Display for FaceTag { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - FaceTag::Tag(t) => write!(f, "{}", t), + FaceTag::Tag(t) => write!(f, "{t}"), FaceTag::StartOrEnd(StartOrEnd::Start) => write!(f, "start"), FaceTag::StartOrEnd(StartOrEnd::End) => write!(f, "end"), } @@ -62,7 +61,7 @@ impl FaceTag { must_be_planar: bool, ) -> Result { match self { - FaceTag::Tag(ref t) => args.get_adjacent_face_to_tag(exec_state, t, must_be_planar).await, + FaceTag::Tag(t) => args.get_adjacent_face_to_tag(exec_state, t, must_be_planar).await, FaceTag::StartOrEnd(StartOrEnd::Start) => solid.start_cap_id.ok_or_else(|| { KclError::new_type(KclErrorDetails::new( "Expected a start face".to_string(), @@ -737,7 +736,7 @@ pub async fn inner_angled_line_that_intersects( let intersect_path = args.get_tag_engine_info(exec_state, &intersect_tag)?; let path = intersect_path.path.clone().ok_or_else(|| { KclError::new_type(KclErrorDetails::new( - format!("Expected an intersect path with a path, found `{:?}`", intersect_path), + format!("Expected an intersect path with a path, found `{intersect_path:?}`"), vec![args.source_range], )) })?; diff --git a/rust/kcl-lib/src/std/sweep.rs b/rust/kcl-lib/src/std/sweep.rs index 3548edf90..949797de7 100644 --- a/rust/kcl-lib/src/std/sweep.rs +++ b/rust/kcl-lib/src/std/sweep.rs @@ -1,20 +1,20 @@ //! Standard library sweep. use anyhow::Result; -use kcmc::{each_cmd as mcmd, length_unit::LengthUnit, ModelingCmd}; +use kcmc::{ModelingCmd, each_cmd as mcmd, length_unit::LengthUnit}; use kittycad_modeling_cmds::{self as kcmc, shared::RelativeTo}; use schemars::JsonSchema; use serde::Serialize; -use super::{args::TyF64, DEFAULT_TOLERANCE_MM}; +use super::{DEFAULT_TOLERANCE_MM, args::TyF64}; use crate::{ errors::KclError, execution::{ - types::{NumericType, RuntimeType}, ExecState, Helix, KclValue, ModelingCmdMeta, Sketch, Solid, + types::{NumericType, RuntimeType}, }, parsing::ast::types::TagNode, - std::{extrude::do_post_extrude, Args}, + std::{Args, extrude::do_post_extrude}, }; /// A path to sweep along. @@ -79,7 +79,7 @@ async fn inner_sweep( return Err(KclError::new_syntax(crate::errors::KclErrorDetails::new( "If you provide relativeTo, it must either be 'sketchPlane' or 'trajectoryCurve'".to_owned(), vec![args.source_range], - ))) + ))); } }; diff --git a/rust/kcl-lib/src/std/transform.rs b/rust/kcl-lib/src/std/transform.rs index 4ce34bf53..694e84921 100644 --- a/rust/kcl-lib/src/std/transform.rs +++ b/rust/kcl-lib/src/std/transform.rs @@ -2,21 +2,20 @@ use anyhow::Result; use kcmc::{ - each_cmd as mcmd, + ModelingCmd, each_cmd as mcmd, length_unit::LengthUnit, shared, shared::{Point3d, Point4d}, - ModelingCmd, }; use kittycad_modeling_cmds as kcmc; use crate::{ errors::{KclError, KclErrorDetails}, execution::{ - types::{PrimitiveType, RuntimeType}, ExecState, KclValue, SolidOrSketchOrImportedGeometry, + types::{PrimitiveType, RuntimeType}, }, - std::{args::TyF64, axis_or_reference::Axis3dOrPoint3d, Args}, + std::{Args, args::TyF64, axis_or_reference::Axis3dOrPoint3d}, }; /// Scale a solid or a sketch. diff --git a/rust/kcl-lib/src/std/utils.rs b/rust/kcl-lib/src/std/utils.rs index ea81f706f..7a3f3fde3 100644 --- a/rust/kcl-lib/src/std/utils.rs +++ b/rust/kcl-lib/src/std/utils.rs @@ -88,11 +88,7 @@ pub(crate) fn delta(from_angle: Angle, to_angle: Angle) -> Angle { pub(crate) fn normalize_rad(angle: f64) -> f64 { let draft = angle % (2.0 * PI); - if draft < 0.0 { - draft + 2.0 * PI - } else { - draft - } + if draft < 0.0 { draft + 2.0 * PI } else { draft } } fn calculate_intersection_of_two_lines(line1: &[Coords2d; 2], line2_angle: f64, line2_point: Coords2d) -> Coords2d { @@ -174,8 +170,8 @@ pub(crate) fn arc_center_and_end( let end_angle = end_angle.to_radians(); let center = [ - -1.0 * (radius * libm::cos(start_angle) - from[0]), - -1.0 * (radius * libm::sin(start_angle) - from[1]), + -(radius * libm::cos(start_angle) - from[0]), + -(radius * libm::sin(start_angle) - from[1]), ]; let end = [ @@ -240,7 +236,7 @@ mod tests { use approx::assert_relative_eq; use pretty_assertions::assert_eq; - use super::{calculate_circle_center, get_x_component, get_y_component, Angle}; + use super::{Angle, calculate_circle_center, get_x_component, get_y_component}; static EACH_QUAD: [(i32, [i32; 2]); 12] = [ (-315, [1, 1]), diff --git a/rust/kcl-lib/src/test_server.rs b/rust/kcl-lib/src/test_server.rs index 3cbaa348b..13ada7abd 100644 --- a/rust/kcl-lib/src/test_server.rs +++ b/rust/kcl-lib/src/test_server.rs @@ -3,10 +3,10 @@ use std::path::PathBuf; use crate::{ + ConnectionError, ExecError, KclError, KclErrorWithOutputs, Program, engine::new_zoo_client, errors::ExecErrorWithState, execution::{EnvironmentRef, ExecState, ExecutorContext, ExecutorSettings}, - ConnectionError, ExecError, KclError, KclErrorWithOutputs, Program, }; #[derive(serde::Deserialize, serde::Serialize)] @@ -64,7 +64,7 @@ pub async fn execute_and_snapshot_ast( // Close the context to avoid any resource leaks. ctx.close().await; return Err(ExecErrorWithState::new( - ExecError::BadExport(format!("Export failed: {:?}", err)), + ExecError::BadExport(format!("Export failed: {err:?}")), exec_state.clone(), )); } @@ -184,7 +184,7 @@ pub async fn execute_and_export_step( Ok(f) => f, Err(err) => { return Err(ExecErrorWithState::new( - ExecError::BadExport(format!("Export failed: {:?}", err)), + ExecError::BadExport(format!("Export failed: {err:?}")), exec_state.clone(), )); } diff --git a/rust/kcl-lib/src/unparser.rs b/rust/kcl-lib/src/unparser.rs index 0d034b20f..352a9ec1f 100644 --- a/rust/kcl-lib/src/unparser.rs +++ b/rust/kcl-lib/src/unparser.rs @@ -1,7 +1,9 @@ use std::fmt::Write; use crate::{ + KclError, ModuleId, parsing::{ + DeprecationKind, PIPE_OPERATOR, ast::types::{ Annotation, ArrayExpression, ArrayRangeExpression, AscribedExpression, Associativity, BinaryExpression, BinaryOperator, BinaryPart, BodyItem, CallExpressionKw, CommentStyle, DefaultParamVal, Expr, FormatOptions, @@ -10,9 +12,8 @@ use crate::{ Parameter, PipeExpression, Program, TagDeclarator, TypeDeclaration, UnaryExpression, VariableDeclaration, VariableKind, }, - deprecation, DeprecationKind, PIPE_OPERATOR, + deprecation, }, - KclError, ModuleId, }; #[allow(dead_code)] @@ -110,7 +111,7 @@ impl Program { let formatted = custom_white_space_or_comment.recast(options, indentation_level); if i == 0 && !formatted.trim().is_empty() { if let NonCodeValue::BlockComment { .. } = custom_white_space_or_comment.value { - format!("\n{}", formatted) + format!("\n{formatted}") } else { formatted } @@ -127,7 +128,7 @@ impl Program { custom_white_space_or_comment }; - let _ = write!(output, "{}{}{}", start_string, recast_str, end_string); + let _ = write!(output, "{start_string}{recast_str}{end_string}"); output }) .trim() @@ -135,7 +136,7 @@ impl Program { // Insert a final new line if the user wants it. if options.insert_final_newline && !result.is_empty() { - format!("{}\n", result) + format!("{result}\n") } else { result } @@ -158,16 +159,16 @@ impl Node { NonCodeValue::InlineComment { value, style: CommentStyle::Line, - } => format!(" // {}\n", value), + } => format!(" // {value}\n"), NonCodeValue::InlineComment { value, style: CommentStyle::Block, - } => format!(" /* {} */", value), + } => format!(" /* {value} */"), NonCodeValue::BlockComment { value, style } => match style { - CommentStyle::Block => format!("{}/* {} */", indentation, value), + CommentStyle::Block => format!("{indentation}/* {value} */"), CommentStyle::Line => { if value.trim().is_empty() { - format!("{}//\n", indentation) + format!("{indentation}//\n") } else { format!("{}// {}\n", indentation, value.trim()) } @@ -176,10 +177,10 @@ impl Node { NonCodeValue::NewLineBlockComment { value, style } => { let add_start_new_line = if self.start == 0 { "" } else { "\n\n" }; match style { - CommentStyle::Block => format!("{}{}/* {} */\n", add_start_new_line, indentation, value), + CommentStyle::Block => format!("{add_start_new_line}{indentation}/* {value} */\n"), CommentStyle::Line => { if value.trim().is_empty() { - format!("{}{}//\n", add_start_new_line, indentation) + format!("{add_start_new_line}{indentation}//\n") } else { format!("{}{}// {}\n", add_start_new_line, indentation, value.trim()) } @@ -241,7 +242,7 @@ impl ImportStatement { } else { "" }; - let mut string = format!("{}{}import ", vis, indentation); + let mut string = format!("{vis}{indentation}import "); match &self.selector { ImportSelector::List { items } => { for (i, item) in items.iter().enumerate() { @@ -291,7 +292,7 @@ impl Expr { Expr::BinaryExpression(bin_exp) => bin_exp.recast(options, indentation_level, ctxt), Expr::ArrayExpression(array_exp) => array_exp.recast(options, indentation_level, ctxt), Expr::ArrayRangeExpression(range_exp) => range_exp.recast(options, indentation_level, ctxt), - Expr::ObjectExpression(ref obj_exp) => obj_exp.recast(options, indentation_level, ctxt), + Expr::ObjectExpression(obj_exp) => obj_exp.recast(options, indentation_level, ctxt), Expr::MemberExpression(mem_exp) => mem_exp.recast(options, indentation_level, ctxt), Expr::Literal(literal) => literal.recast(), Expr::FunctionExpression(func_exp) => { @@ -702,13 +703,7 @@ impl MemberExpression { impl BinaryExpression { fn recast(&self, options: &FormatOptions, _indentation_level: usize, ctxt: ExprContext) -> String { - let maybe_wrap_it = |a: String, doit: bool| -> String { - if doit { - format!("({})", a) - } else { - a - } - }; + let maybe_wrap_it = |a: String, doit: bool| -> String { if doit { format!("({a})") } else { a } }; // It would be better to always preserve the user's parentheses but since we've dropped that // info from the AST, we bracket expressions as necessary. @@ -977,7 +972,7 @@ mod tests { use pretty_assertions::assert_eq; use super::*; - use crate::{parsing::ast::types::FormatOptions, ModuleId}; + use crate::{ModuleId, parsing::ast::types::FormatOptions}; #[test] fn test_recast_annotations_without_body_items() { diff --git a/rust/kcl-lib/src/walk/ast_node.rs b/rust/kcl-lib/src/walk/ast_node.rs index 77561ab98..01d8950ce 100644 --- a/rust/kcl-lib/src/walk/ast_node.rs +++ b/rust/kcl-lib/src/walk/ast_node.rs @@ -289,9 +289,7 @@ mod tests { use super::*; macro_rules! kcl { - ( $kcl:expr ) => {{ - $crate::parsing::top_level_parse($kcl).unwrap() - }}; + ( $kcl:expr_2021 ) => {{ $crate::parsing::top_level_parse($kcl).unwrap() }}; } #[test] diff --git a/rust/kcl-lib/src/walk/ast_visitor.rs b/rust/kcl-lib/src/walk/ast_visitor.rs index 3eaa77db6..49fca9640 100644 --- a/rust/kcl-lib/src/walk/ast_visitor.rs +++ b/rust/kcl-lib/src/walk/ast_visitor.rs @@ -153,9 +153,7 @@ mod tests { use super::*; macro_rules! kcl { - ( $kcl:expr ) => {{ - $crate::parsing::top_level_parse($kcl).unwrap() - }}; + ( $kcl:expr_2021 ) => {{ $crate::parsing::top_level_parse($kcl).unwrap() }}; } #[test] diff --git a/rust/kcl-lib/src/walk/ast_walk.rs b/rust/kcl-lib/src/walk/ast_walk.rs index ab8d27d54..3e800f6fb 100644 --- a/rust/kcl-lib/src/walk/ast_walk.rs +++ b/rust/kcl-lib/src/walk/ast_walk.rs @@ -57,9 +57,7 @@ mod tests { use super::*; macro_rules! kcl { - ( $kcl:expr ) => {{ - $crate::parsing::top_level_parse($kcl).unwrap() - }}; + ( $kcl:expr_2021 ) => {{ $crate::parsing::top_level_parse($kcl).unwrap() }}; } #[test] diff --git a/rust/kcl-python-bindings/src/lib.rs b/rust/kcl-python-bindings/src/lib.rs index 95e74c9da..d52091149 100644 --- a/rust/kcl-python-bindings/src/lib.rs +++ b/rust/kcl-python-bindings/src/lib.rs @@ -19,7 +19,7 @@ fn tokio() -> &'static tokio::runtime::Runtime { fn into_miette(error: kcl_lib::KclErrorWithOutputs, code: &str) -> PyErr { let report = error.clone().into_miette_report_with_outputs(code).unwrap(); let report = miette::Report::new(report); - pyo3::exceptions::PyException::new_err(format!("{:?}", report)) + pyo3::exceptions::PyException::new_err(format!("{report:?}")) } fn into_miette_for_parse(filename: &str, input: &str, error: kcl_lib::KclError) -> PyErr { @@ -29,7 +29,7 @@ fn into_miette_for_parse(filename: &str, input: &str, error: kcl_lib::KclError) filename: filename.to_string(), }; let report = miette::Report::new(report); - pyo3::exceptions::PyException::new_err(format!("{:?}", report)) + pyo3::exceptions::PyException::new_err(format!("{report:?}")) } /// The variety of image formats snapshots may be exported to. @@ -402,8 +402,7 @@ async fn execute_and_snapshot(path: String, image_format: ImageFormat) -> PyResu } = resp else { return Err(pyo3::exceptions::PyException::new_err(format!( - "Unexpected response from engine: {:?}", - resp + "Unexpected response from engine: {resp:?}" ))); }; @@ -459,8 +458,7 @@ async fn execute_code_and_snapshot(code: String, image_format: ImageFormat) -> P } = resp else { return Err(pyo3::exceptions::PyException::new_err(format!( - "Unexpected response from engine: {:?}", - resp + "Unexpected response from engine: {resp:?}" ))); }; @@ -510,8 +508,7 @@ async fn execute_and_export(path: String, export_format: FileExportFormat) -> Py let kittycad_modeling_cmds::websocket::OkWebSocketResponseData::Export { files } = resp else { return Err(pyo3::exceptions::PyException::new_err(format!( - "Unexpected response from engine: {:?}", - resp + "Unexpected response from engine: {resp:?}" ))); }; @@ -558,8 +555,7 @@ async fn execute_code_and_export(code: String, export_format: FileExportFormat) let kittycad_modeling_cmds::websocket::OkWebSocketResponseData::Export { files } = resp else { return Err(pyo3::exceptions::PyException::new_err(format!( - "Unexpected response from engine: {:?}", - resp + "Unexpected response from engine: {resp:?}" ))); }; diff --git a/rust/kcl-to-core/src/conn_mock_core.rs b/rust/kcl-to-core/src/conn_mock_core.rs index fea1923a6..ffda43dfe 100644 --- a/rust/kcl-to-core/src/conn_mock_core.rs +++ b/rust/kcl-to-core/src/conn_mock_core.rs @@ -47,7 +47,7 @@ impl EngineConnection { fn handle_command(&self, cmd_id: &ModelingCmdId, cmd: &kcmc::ModelingCmd) -> (String, OkModelingCmdResponse) { let cpp_id = id_to_cpp(cmd_id); - let cmd_id = format!("{}", cmd_id); + let cmd_id = format!("{cmd_id}"); let mut this_response = OkModelingCmdResponse::Empty {}; let new_code = match cmd { @@ -86,7 +86,7 @@ impl EngineConnection { size, .. }) => { - let plane_id = format!("plane_{}", cpp_id); + let plane_id = format!("plane_{cpp_id}"); format!( r#" auto {plane_id} = make_shared("plane", glm::dvec3 {{ 0, 0, 0 }}); @@ -108,8 +108,8 @@ impl EngineConnection { ) } kcmc::ModelingCmd::StartPath(kcmc::StartPath { .. }) => { - let sketch_id = format!("sketch_{}", cpp_id); - let path_id = format!("path_{}", cpp_id); + let sketch_id = format!("sketch_{cpp_id}"); + let path_id = format!("path_{cpp_id}"); format!( r#" auto {sketch_id} = make_shared("sketch", glm::dvec3 {{ 0, 0, 0 }}); @@ -178,7 +178,7 @@ impl EngineConnection { ) } _ => { - format!("//{:?}", cmd) + format!("//{cmd:?}") } }, kcmc::ModelingCmd::ClosePath(kcmc::ClosePath { path_id }) => { @@ -240,9 +240,8 @@ impl EngineConnection { }) => { format!( r#" - //face info get {} {} - "#, - object_id, edge_id + //face info get {object_id} {edge_id} + "# ) } kcmc::ModelingCmd::EntityCircularPattern(kcmc::EntityCircularPattern { @@ -313,11 +312,11 @@ impl EngineConnection { // base_code.push_str(&repl_uuid_fix_code); // base_code - format!("//{:?}", cmd) + format!("//{cmd:?}") } _ => { //helps us follow along with the currently unhandled engine commands - format!("//{:?}", cmd) + format!("//{cmd:?}") } }; @@ -330,7 +329,7 @@ fn id_to_cpp(id: &ModelingCmdId) -> String { } fn uuid_to_cpp(id: &uuid::Uuid) -> String { - let str = format!("{}", id); + let str = format!("{id}"); str::replace(&str, "-", "_") } diff --git a/rust/kcl-to-core/src/tool.rs b/rust/kcl-to-core/src/tool.rs index 6706c7cb1..bf58bca38 100644 --- a/rust/kcl-to-core/src/tool.rs +++ b/rust/kcl-to-core/src/tool.rs @@ -16,5 +16,5 @@ async fn main() { let result = kcl_to_engine_core(&kcl).await.expect("kcl conversion"); - println!("{}", result); + println!("{result}"); } diff --git a/rust/rust-toolchain.toml b/rust/rust-toolchain.toml index a84e0ac6a..c4095368c 100644 --- a/rust/rust-toolchain.toml +++ b/rust/rust-toolchain.toml @@ -1,3 +1,3 @@ [toolchain] -channel = "1.87" +channel = "1.88" components = ["clippy", "rustfmt"] From 107adc77b3155b8b1b5fc08f372e99cdfd1ae3c1 Mon Sep 17 00:00:00 2001 From: Ben Crabbe Date: Fri, 27 Jun 2025 00:38:18 +0100 Subject: [PATCH 7/8] Allow the origin of rotation to be specified (#7608) * pass axis origin to endpoint * fmt * fix lint errors * update sim tests with new transform endpoint * added missed files * revert cargo.toml * implement review requests * fmt * revert unnecessary custom origin --- .../screenshots/ball-joint-rod-end.png | Bin 85463 -> 85463 bytes .../screenshots/surgical-drill-guide.png | Bin 35674 -> 0 bytes public/kcl-samples/screenshots/teapot.png | Bin 131032 -> 0 bytes rust/Cargo.lock | 4 +- rust/Cargo.toml | 8 +- rust/kcl-lib/src/std/axis_or_reference.rs | 7 + rust/kcl-lib/src/std/transform.rs | 87 ++++++++++--- .../tests/import_async/artifact_commands.snap | 5 +- .../import_mesh_clone/artifact_commands.snap | 20 ++- .../import_transform/artifact_commands.snap | 15 ++- .../artifact_commands.snap | 5 +- .../artifact_commands.snap | 5 +- .../intersect_cubes/artifact_commands.snap | 5 +- .../ball-joint-rod-end/artifact_commands.snap | 10 +- .../ball-joint-rod-end/rendered_model.png | Bin 85463 -> 85463 bytes .../car-wheel-assembly/artifact_commands.snap | 30 ++++- .../cpu-cooler/artifact_commands.snap | 65 ++++++++-- .../artifact_commands.snap | 20 ++- .../dodecahedron/artifact_commands.snap | 120 ++++++++++++++---- .../artifact_commands.snap | 5 +- .../herringbone-gear/artifact_commands.snap | 5 +- .../artifact_commands.snap | 20 ++- .../pdu-faceplate/artifact_commands.snap | 45 +++++-- .../artifact_commands.snap | 55 ++++++-- .../prosthetic-hip/artifact_commands.snap | 70 ++++++++-- .../sash-window/artifact_commands.snap | 40 ++++-- .../kcl_samples/spool/artifact_commands.snap | 5 +- .../artifact_commands.snap | 10 +- .../t-slot-rail/artifact_commands.snap | 5 +- .../walkie-talkie/artifact_commands.snap | 50 ++++++-- .../artifact_commands.snap | 5 +- .../artifact_commands.snap | 10 +- .../artifact_commands.snap | 5 +- .../scale_after_fillet/artifact_commands.snap | 5 +- .../artifact_commands.snap | 5 +- .../tests/spheres/artifact_commands.snap | 5 +- .../artifact_commands.snap | 5 +- .../artifact_commands.snap | 5 +- .../artifact_commands.snap | 5 +- .../subtract_regression12/rendered_model.png | Bin 61104 -> 61106 bytes .../artifact_commands.snap | 5 +- .../artifact_commands.snap | 10 +- .../artifact_commands.snap | 5 +- .../tests/union_cubes/artifact_commands.snap | 5 +- .../artifact_commands.snap | 10 +- 45 files changed, 635 insertions(+), 166 deletions(-) diff --git a/public/kcl-samples/screenshots/ball-joint-rod-end.png b/public/kcl-samples/screenshots/ball-joint-rod-end.png index ba74c58b0c31cf59a5fba12e3a7c7a896910b610..6dff8f8f0acdb0675273e9d4439aec5a0f3b9237 100644 GIT binary patch literal 85463 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 diff --git a/public/kcl-samples/screenshots/surgical-drill-guide.png b/public/kcl-samples/screenshots/surgical-drill-guide.png index b75b445e29b405abcc357d03a6c6ab2bccf55c53..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 35674 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

@ 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

>g&r*BTuZ}>AKv^WotA6IQ`mb z15Y*te-OhNxbE1!^5Oq|#wDQtpP+GNJYr7%i~)e*8FPR-I1imn6h$-^f>BsJ<8Yrv zVI3s}_4Ntsk_T~eAg>I z`<)*Tr?w0(eEIUhxMJI1*fn12vC-?xkL!Kz25q$N9qZq+A;F<;huRKtKy7%&=aR3d zJ-#ng>xs92UpT^h;(`7CZk7S`K~40Ke*JCg;7tV`JS9#vLDTyva|u48K`f{z|v3J}o0Z&Z=!4 z^VZ<(fImrm7KCI50xXn-g-UFWEdF`r9W*uPM=l<-&pF*OF)b~>dG2w^ZsoE~O2!Qd zd%a%d9e%#6jvvrIG2m8NM}w1h&4y&t-;Vt}z}@OhT;Vc2;MRxhbQ){-)*m{s(;$D< z%hAcxPAyftaZg_->&dRVK^gbaw)YHB>k8C;c7Jt~+w%WY6*M7wY6_T|NniTkaq`<% z{(AiwKB%U2m9ZCyFh^p{D>@1)1p~|XJu01M4uh*316UOr58x$zHRHqW|m;`y2Ai?sjkb)cdW#dzoP3!-VLAi1N@xh|GQJ{~f9 zfpnwkS<69dmT$@6%W-{&3it@*KrFE63y(SwJUDB`Z3nF%ml!P-sQW09CPPuxw6~@= zN?nHMdsX>yBo&k&@kRI&t>4-X!CHH_1#bb`t28>@Fjr)SN* zA@KZs$T+XfzoDl6m{Uty#w=!&$S#=e%HZ_~xv@j$ib1PIndi40ZO#=|Sp3y63_b1Q zN!ub^rabc)XKpw0cw=K~Q>kC-rm|f_-&dRURpJmUp{ekYFyvS>6Xb){0dxr((g<=R_61(;&bF3D;;>? zTabf?st}b*7~sI;L-wVl#Y$kvsNf6qVE;n8ZXEGhZDjj;tu;alGy)-h3-F9xm|r6Dn9oEN90@OJq`QTO^rIqF;R>@ z=c?!dUb~j^_WF9?UuI4Han?%jJr_<{6~;}i_PTm&x?|<}=;k1&*4u@okJG(;@A8gC zU)4q5cT78`<8Xcdj`zju3m3%rT)LjLiQ>DM9G~rQZF^z*^X7>G z(~}dePc_(n2wfhA<$x^lV&k#{B(%YV@yB7EnBR4LbK5Z@*#~w21M8TaW!UBoO(6c1c3w|Oq0!;=9vYb|jJJ;=l$?g8@nM%kBLunQ>GCnsc zeR|V?y5GM7?f`j|MJ(HXX;|+-bq^li8X;gt9g_SfI&CNX7{0*4&{3txKh7N^%t)47>`FKF)n|K*zz^0iZ~ z3@v$|wPsqtrjv!k9W=w0A4NtgKe=6=W%m#-`i#=nRudALJt|XJH*a-%Mqv?(sh_V5 z-f9lMKA0_-vHB*EcyYl4#DR?HhdQY90&2)CcD>i4ZN?wJ0R)C_2lx5R9jjO?|Lh9i zkEgcFrzH$H`9+j-BPnRg6Qr*%U=!FWUGQ)vBu(Yz4Xb$AlkBI+dr{UxXA{I{$hD4$ zZ^HN9K_vaUlsk3W2mFQ_htfE8cxoK#RTQ#Ru*#oXY60sJ^6*62a}(Ej8n!Ei23*{` z(z|cXr*Go3!|u)J#_8yMthDzVlF`@{pv;<7o%|S%q+LQ&~tnirYWK8Jt7bwq<0 zM2@H5U%%;=n3xy#-ALbJ6#PeZK8iP%mX_}in$8UCJrtk+yfjv4s80KbJp|>N3o<*0-z)N`(1x4dHWQuYJhd(SrGQ1mS^)3T1KjOBskhKDAvjQ#WRJ}B1W1ByiP;)KMc+xNpNWaMNF z)YXqH{@ZP;c6i@y*OF7-e)ifp&FfI~wr$1lCLg<0_Zm1s)e6rwo=tiakN)w)r5N`Q zkD2~?%-68`uK~uLxH?4EhG153!u||QeHm4#GWs zl5|z#9aA6Qs(o6Ko9nqXyw}#p{gd?N=^99oM3P0gU>t(Zdq8{&YQDhn*u|8VygEw2 z1@6OJoIiqoQ}f}GmVs9O<^59=GSpa|MHRIiM3lD&X&#uO1Wi&YxFK@Z01M{06;v}L z@`Ex$0fg!+KqN|7EJBi?A-<)S+<{eKUJZ?VJPt-`b~EjcflLX8$s8`-^)t^Lm)aqghtVL2S%bnf2k( z1@egUS)l0M<7!<&Q-SsE=jDoUIaqTLoqYIYw3c!~1QW6=068@ppME<7f*3)*{!m`U zKr4z|mS1(o>DaxfXCW7J5OWAvQ!qjfJ}P{V?INlG8zw#^w+VU2xihy= zcpiKJD+4)Zh)?QX%OiVZCifzzSb{R8feBe`D^p6ix#ivC4>v2{mt08(B;WDK)2c5m zx!6lw^d7P>m%qeI-zX@em%lj8s%mJudNbg|3B&&h?q?2ODjac*RvnvQM5>Pqwa?&e zfUud^n3;tQ zE5Ls+ZN|MtY2)~O^8gs_KT&3yY-??hR33Uk2(iNdO-J!X7~6IT;K@> z#gbrN9^7`O)-p*DPsQba&4>D38O_?Qw7NFF_3v5rWVaWtC8O6D;LC^^dE3iwgX z|n-ANOecevX{@@s9&L2E<=&8|C=!An{$Q-}rodv7Izw zH0)DbHbUWKFk~>$z^870c{5u1-~jZ4^_$9@{Pd|Nb&C;5VZ(H`K8Dml=BZ?IXdyf3 z;vWSZyWXQ5tzeCg$uzUJ3L@EPLUA6*-wUXBLDh5fMD@b?7;vxGg~li;B`a)Iq_9=A z0`GrUlXg7A=gTE%YDicWfxZ(^80004*p3z(PF2xrqagz*)P$r|0^9ZO>J_vnpYEJP zThbQ)pL1nDnoOGTpCRB#-seUv2-FxFwFg>`cCrvtqCMawZDec6Lf5!*fvUo}A~x7x z(44-j-KRqZS!LW^wn_oV`0as|S3;89xbdLzjL$jLbA4J`TJsLa<{YlMNi%k8!W<>! z6}O?J1e1V*46!DbO3=x@gHHSZagzS#2yyVgC&mbzRb^sqzMGGY3GLW8OY&*Qc@)#A z3Zl(lBpx6Ki8J=VFd;XI)gCoSDaa;kg<$(w{(1Y>^!CH*#TY(D0|_cTqUTe`*1_k&;S9g@DbPdV;e{uxkP=G%7K~6^MI%ctE?G z$ZNA3TKlih_`HGdJpAn0jlBHyp`O|KUaJD)tb89F_W9$*_Im8DVA?!nf7%8(%@UTM zAt2(1oQ^{G`s-8WV7{(+HO6Gt=&?7 zpb;ilg{wdulSzg8h)D)6QdwUcSd>uTz$M5av)IOLDN`S!k8iU}r)59_;ywxg#5{jm zew3QSxb?5mqxJl_*;qLfi80dx$U7WYfR%RIm~o9pau7spK6&&X%BUb@tXjIraKR8l z5kbR2&U4Q1Zx=pgcv1 zDB%GLM6{AC76BL@6#MCHjZR~uXLoEb3+|+0t!&8n;Znon-yH)MR9&z6;{@9InRAQ+ zgJ+AKq2=Su>2pEq5ZDnr2Xjh?60K$Ghq9c5T|LD7!7J>9ee&;iek{*!*BR8<{jx?i@aOfPc*rY}F zc@qBClw1R*#AEYt)_KgWE>ji4)RFO?7z0;QFD-921!JRWym1t^thbRCh_5E~4_MVf zS%B|Bm7I*-KI3d|h|7Iril3Li8U9hsF%(kyI?HO?-dTRQ+2ZqbR}&`w(SerpvB{}+ z&ykRSRR9R2UBRc8DoS1S&whGYZPjw6@KsmdRJNzb*)Cu5hi9cp>o!QJx%bC*lcju> zxlzK1Y-dbRaH`pGX*gObPSsQrq<#ouC4;qtrMa4iva-#7SA1M*C(HqUKkj`^9Z`Ig z{VS6vrKaB+Gqqful#P5oH$17|2NzL}=0o(2_xb$V3-Ks*eIAV!5z+-m4l?FPQt@)(51rjN(lEWDIY6@EbGAI>j-<8t` zTvt*(?5A)9NA|At8>^Q7c8Jd3=*9%Jf4We2wdMZDt1Z<^UMDd-LZ(V>q3&*>TqOie zIp%eNFfpe~aDttTKYLWpi-5YyxGSa4dSLDW+C2&cca+3?-+c7@y~=UQoR|M~6&#Xg zYlvJ|X~#qbWJU&*X+bugEI7d8xo4K(dMS@}n1!NGkGWswPIK(a8;xb2P8 zW_Q2ny-opB<3HV<^|7`pUioFD)7v$#*1XKl;<2;TJ6Ubhv8|&3M zkVEJ?Tt~mYYH4qmv%^J&> z8BjE?`paRfHji$98`;C(R&6lSEZddfn6U)byKj%4U076tKm$A-nTbW9RA?d;ixR9k zK4MLwfsuZuP}fLb2}xF`N05JX_0SzGHkar_Dk7$=tTH=mTELgrBfT+lzqf4D)B`E) z!UY>Q)Zu_D2M(_jIo3gDTz zJk8oQN-e!{h|acqNtVgoPB-lUxEz{T+=U=3XXbZuedRDbcrWsf8T>A04bdQ_76E4F zqXZ&?1JJ*4YklmQ-rWoA_@PI_&|kB5+N`3_TOczxAbT*pL!SiHSfo>`4on5!SD>XI z*q4-aTp(t2kcT7;rItcl2_JizT@wpcRF56(r6sr)RS*)itNqh#<<@tH<5V+$xwJvY zzpcTt^-I+xs9D^K&xl>J^RvFs?Y&lf8OXp6mKHBtv)Is3EhZ9qbgU%X2mU&NKdXr( z>5b3Pdz4oP9HkB*Rp}rdbpcpyzr$iEDpX*~KYr^PJh8Qdqf++ts*P%W=gBo!`Xnfg_AosR(|Drmn>z zq3vqEszE&wijYBMo3YA_^4`w;H-U3e861_Bt)-G6%@wI00yEQ0;+nE4p)hWm zZ=BVxkB4~{N$Iz5T~3QVykdp?=(n!zeJf*c~T#65Vk)qk1!$ueySl4a+9vhN54`MtEYnNz>y~_pnGuMjZ!V;b39; za$QsD9TaEeE`}q;RXAUqH=|6@SSfryqcj21hP(kxU(SZ>5dzU#XYPZrbQS1qhgft3 zkMwUU9k#vIyu097+rxj1N5L^F|4pUqrLuvG>?WWq(n}QKb4_NV6|9?e5TjHMx`<3l zHcMv;m24#ce?BBiov+=;6=HDOQ3@xrM$_3SsuyP_xnDDU)2o+xTld910HQ9T*1o9tfs`ld~pIBepq!jX`%4?55fu6c4qY@gEWRZkrA$5_5!^}MD$izkGor*q8meKuu=;9=%;a=B5^)ZY0%zQP``#9ct2Y8h%aH@;)silhfsMXRC`tf5Wn66_&%UIjHNiHkr8dE!;7{ACWv%Y-HxGRz#d zW=)ffvwSnUwdA{4e);ck?kE?icEQmvU$Akb*Xs4*IC>7}!+$wYr_rQ(`>U56b?Y1~ zEnkz-_v?p_kqDC*X@hux;*?Qd8!9=2Zb9HrDhU?ZK#L5D<>LYlGz2IM7kbfCOFdBxoh*2*l7xkji#5>|M)4JN1?at!Rs!*bAoY3($f^bhksiWV<v|#PTsxw3&`mjq2xI(B>K9b-01mK+Tr{x0y#KVB^hwG7x6e&2|8v9<> zS+!ThU)g?VSjN3BGD1MFugM7kMc>X>bKLsE^R`Fh%LiMDN6Wahf_*k5`iN<*nB8viom%V*wvO!xL{Nt;s!#k3>)zv7LgQu=AA`xOy_uvTLC80MMt5i(Z<19HGCa4^Hr3A5Y(oP#x z+p^mGaK2#V#AF|9I!|H_1HK@3T5KGplT;4McqyAUiFWsCQRc|oL!Fke=C>vC`IA8Q z$P|kL=uY);#c;p4S&Sfr=ttEd(rQkwZ^MokEO<0|JD)o)APu`Pu~b@O$kgD@Iv1B^ zG{oPmn4**2ZKr*^iHIFnBX5_d9r)p*^0`kXhd6ZAMyqQ;kyA-UEZ!rSv6|0~SSm## z$QmO+nWRVv^$mhBhb7h0M~xY5&9cA_bS?i$D3 zw6js{?7J9zlh;NXV}eL=O1WgbV+kBX>+peQNYCStyy;IN&G4G_^~Q; z4fK}Za#+O^>19dz>QSfd=5Z9}?p4PU&6ic`>pLffN{J-onr+9iQ!|`PDQ&3yAKHKYBfKU|)c4 zl|`SX<$LX%tQ#f5VTpG`5|gK;ryD4;TWDa&iC+o?a#NEDw5S)y5&~6GUNN7t0+yBW z>4k}gb6^B-nS{-~JL9y*ay?Fq6KRteq*q8HZUva(b@O0ws(fq*#h`4aWmG0mW6SW* z6QK)gVtfRPVCbMK?R(OZ0g*FIq5J*IkzB+?7!<-}7yq3RdDyYZ$$U6(sC<>DLN38_ z5ThGWTZowx&66i?uUwh2s|8EPdlbY@GrH|5;HSqs)@L|o+}EmG0g?S`oZh(+kM(80)mrQ^X>W3{Mp@A`O_piuZHSt78+?13%&5AOzCt9k&g@gDa9 zc00tcQ;&<}tbrDWUg;U1?M-!irG8+d+)x?91W)uV*<{KKPK_(F5_=+5_>}KDi}r$;C(OFMN6` z3FcOD*8D7`UbZ$uTRr|rv5E+ePYWdo8IA7X=zN0&Ymtf20Q32<8Y$e&3K8asdtrDy zQ`6ZX6E9JRgU*6~B2SgCZz2i;CnFQL3bNvoaaV2+oLOFC6nk%}r7Vg%^giSG#ObL= z7FBu2VO0b#vo#tnxGS+@q^<6zoQ%C`dA?^rk)KjRrkklan%Ous1G#Cigpn0xl%W+u zwN!%jIFs0BD$muEq4w4bdBGuoKK>F%2cM z%sN}>8cdobil`_uNUOqG`k6S2EVMIg=f!HV|nRax4D2(Inie_Q5C-*yO%?SjMhr!&|d@`04=b9=`e)EUlfnJ|3G>>}NS> zYG}$hJ4uQY?w(YpVI!697WBhT2_-&?NH`&ol4O}e6}IL?TTBfPMu`&NmBEr=RNP=C zW>reg;=AR&VQC!J6Oc=SlSTXjyBmyc(1@v%rdhZ*6TGMT_|^4#pdnO`WMw0=ZqzSu z&TI;x%QrK22bGripSt@F89(T49IL#yX8eYCX}@v;sYGW~po!S>JDG+E zUR;+FNnALr$-xIkUqry?0{dz>CvZWC?a0RaBt)qKgUz&|SRW+iQ*T*(5{B7Vk?8(SL3b` zul}nAi@=6LX@n(2gfU69U91@u2G&Iq{VCbFbJ&gO;S#ig*1=v&%rd`bJyY}8LFB$3 zSQAQ~9jQ|3vy6rs|G)QkZGF7{PltYwgwl_Js>6okxAG>cV01nB-nq}p_60h~M|fHjF&7Qn%zM5@jRfbis8 zrWTmXaOi*`gVbSI&+WPLvb&s&a5GAa!z%HRkrVOpS0mtqoyN2YXuO?eKjgwY4@*OX z^{M4{G>VMM2I|TS1wTo3Z36Lfh8Sh6e2olTzW^?lt&PNKX+LuvqF6;u3wHBy6=l9R z5iAZzSW%{mLC^5F~OXR;v&j;g5R-oJW7!sAP-=v0t`%7mE#+!%B&?^AC8X8%W4&P z;83Q*be|>^XTp7MMr5{50l!!d#jv&<6YPb}acDGmVKCJEL@}l)+v)zn6H&}U@&h}X zjjai^TtlQ645eXpYal3kwzd!+whj&@X-DS6xH@UBGp$iSY`(4h+jad9x(=C=_wBXW zBT2J><3kE52a>%SNKJEg1k^kp*;a0Rvqyu~t;cc2u3PU?;oYyX@xN21#PwY$6YN&* zeLAo&mc!dbk!@uusmQTo1%k;T{)t?r*j=SX7m&jzyj%xeo~ARZJu2@^LXQf<0^plH@aMk)+6%0$Oc zl9{aqn?s7FMClfXe2b$TD;u*g0)9eDwu7OG?DmzxI49S-mp1Tl?vV&FGNDz0V2G4VW`v zjtXgp53og0K$?do)P@@#%wGGzEN|ZOxy#L$&pi_PSl}*0YIxV~NT8lBcE9nJz$Ehu ziE>U#-d=Us|J9(<$_E>g+qx6|@4FM&>;E(tFE^Uz*70D()BE?`f>NEFIf+z7V0cg} zqXJAO(3MJSp#x+D7P#xGKoe+cp%28Zia^JK(?_}mE92xx2#|r7ORudR*2>QiS!?e; zJS>F3Vi8Oor_9rYGW-nE+$#4S3{iQ&NHphz1u^h#1V;6sd60YnCto1RN8O^RdFAP- z0Thd=iFioVizGBc#n3?v72%w0aFV)nI#2MMBu#g=EFNDtHfLQ1me(r$C|Ju0!jJ|2m2BU>q=b}Jnt{-Y-fEE_&geojwK|+tydefalWdil3Dq2HP+VWVOC28SfQJH*R z?%ixib5K)_egK?c$Jqyz<$+kSF_6y;QWefnahhHsrbuW+tKj$6^0223p}<)#gk;*( zpW_3Xz1Ol~{gSJT8x`Qh=)=_%T;s8Yq2<77zllQ}{JFE`p z22*s$x&0Edd`!}Rt}p*3Y4Q4>#vEPVCusmqb<`2j9D%yt0F+V@eb*gcU^YMB^^ckB zBY){tfpx=Tp~oomYqPbN-L=8u7U@jQw7s9&rk#{$r zWMzYm2l!Ag_S7XGfBP<%vmI?9nJ!ooEKxebfoFyCKbYfXK`br-sRSrGCNgWle3apN zhooeSOki*TaRSF?N}|vOOW^crC!!=%BGAfNbB)7}l91a2VWg@O4tLu!x)=CNK7mr>Z;68Q>-FUrGNM#HlqgMQ<+3bO#a_e;S3(8jK1|_PCPY48}K$+;SppWuh8=jp^%9}$9qqCPv0(q+ARVD9!&z!_^0VXw*Kq9_X2?TyDfiDt>S7+=GFVFZKRIv4 z(E=555NUuwjI~9fVZu1dxY+X5WZmds6jhLH#)f0&2tqx0%FtX{C|_MY3ig<^a4vMt zFCE1JUS5pVlHXr{3PG5g+qSGc7k~67ndrGckDi{1z^$RH>vghkuIrC)UETAR9{Odz zss@)AB&45fHKWCtZt<=ztlkjkg5~gz`;{to}RU!_C^m2x;WEKfxh=Z;G%da_R zhL=tFtkid|H_~wCRu!y4$U%%*OQjf}r-cw7cl*jR966$HPQ6Bl1`TY2!8jL(+GF~l z3lRcY3uoC02^knr0vKpZ3JrGF!4z63upkVx)0=bdu?^C-n-@Q= zoK?29z#WJAW%;|g=i)=g^~U`c%+ND1@XEM4JNj7Ok-P!3ukPWrJ&Iy%_kk?~pIk7| zych+Es&j#Nf05vM{q}&S7xtf1 zNH@(8X+%l*X4ctSqoJ4Eo21)09;hsuupVHxV9R13X$V*EfwIHF@G?<4#}^t3v;^j` zMX!)vNFhyRVvHqeMQ}ikK%^5d!NCDSAlf_i;pOcg++%rGsHipIEYSz#^MG3rmQM)| zQ&^(xkS;TZ4Cz9%>2%0MzzlnZ4=BTD9n7H_EM#*y$p`@8B94$pAM2cqJxCLyIm)FGfDB`2Jh$)3b(Nw6EXpkbkDCh8_Ae_lt=X}5E+Ym>|_ zhFt#77m>SQ#BOvu#2h?h%sjI*!GTv#nu%0qbIvA|2A!V`G161=BG0^7m?`5S%(j1Q zxmmMy+>33`x-q+z4aR4>po5hS@sFNf3SVyJR+HV!!oT%OVwT|?T^UG13@vfDB+#v?SRwbdB;72FG3#`!*nQTMty}2&e%f{Cx2ls(Q?J}~E8SYqvVX=CQ?kO7kLEb_-lgI$ z_}=;;;0Bvw!@#SHb{{>PW8h__{lKv3+mU0D{j8__=jeJM`CpGp9a$C|p_lSSpEjzMnT&FJ4TWJfT)dyV!;?P;Nt_Q zgcKZS31AdQPSgFDhsbHpY&&`xPVmleH76QiiEgD$1ud~Sz?vyw6;@ z_6~7w8cgA3S6NefkMPnlxkv5XK5S0TCGE!bYWZ*cCbnF8_f7H71NcfpWdYTIdMb0p z{66wKZ9u_V;4F0xlxnTOtrmePn<)wGONBJENUsoIb4)r4Q1nSMfz1LcMZ4BFtP+Z$ zh{YgG%GY=(j?Z#pw~HhQU6J5?Wr`AHiA;Dv;S&*8M!_N49>F42d8zVC$l`BsouB^o zND))2PBaX|P&iC6ZNKk_6Wfpa{!-xn(*c_$yMH}x7aWW{NBBUPDSi5F^s%*nxOzk; zPRKPko!9@Cg=qx+vY>y(x2E&^f4BbXRc7lk>Awmit*6?lOk28O$xVuAZ z*#Z43FITNuxn8Sd49}aJCWSp7ax${Opy+J>XIeq4lG6ODtXkg}{u_Q`$ozaPtA_fDS(Xq3XgMn1!rP#0|lXq%>2_gqX4nxu{@O~i+ zLq+PqxO&?#=ZAnAY7>V4Mgyx+e3T3r&`Vtp^Y13P=A#4WZwl#qZJjx`Vc~9WUH{wp zut(n}4xM%ER_11{rTvsHvg5iF*kA$y@~)c-b$<#T+7Z4_Yg+HSm3>LeXqwc8*eq#l z=>ge%Q8R3Ld^4$Vw0fbI{`ec)fdY&=wIGTLrc<^nVZN6UT?5? zDeh{Bz#P3ZIpIMvSRa-n1wsk^SvQR(B%S31S$JzKunrw$2QnjvbW z6hReV_3XVP$dRM+{xp32oy(;CzvUi$WAXb?;SaYm-L;mgDbcM|?!1-rBMWBc8x$4K ze(Jomy1Mks@v@fm_$$}9yz8E8zu4}wup8d`V!t@IF6~TG*~XQ-;$!YvX$Nk&n`6HD zG;?WP7m>$z#Uatn4CDqcTgo476a@&4{28#Pz8c1p>srIcfNmhY;f#H}Fc}6>qDreI z30Y=PjuLr!A)$CX8$FF^K~K<>Iu=sC7>$)+fCb&~DGUr7JqA#}BGAAF?N%vAi1LH; zCG$=O3#9yeh6Vzyg!xbBnSW=VdrWo1>ZuccD7x!DbXi~hi(bwXBG|qAT?Yr`8e^Ed z?tk+mM{AcHIu?ec&c(y$3)zxY8_J9BvFgiT4s^3WuK#0o(9H8v)hq7@mimLj3-vxZ zW3MuLaO17%x}AmqtqFN5o*7UG@>fz}uo2`9XzZ_buLcG|fq|3y({Z0bj0(^edwI4- zj-I8uT``fYN5n(P01$#|2W<65LW3Gwf{h3GKFn~Cv+>a<{sksutjna>rk z-FG@z6l|a>|Jvci5!0i!&gbqJ0=Iq9%XRAh-}WACurQ0j0u|E*xK)3h&wV)L(gd@^ z1qSF`M8B!7z7)`m;$ZT{xyLv5h<8>xJ<8M$zNu>2uuE+}++SPs;a+5+CJ`hN>kI<1 ziv%+-PQqZ!(hJyZc!xRIDSbvb0@5ae5~T>VDhsg-({<&`;H0hKW0=puCQq0GzRX8e zA572(T7J4bT%BMf%xJAkS;rU`3a5ZZq8S=g$jfKvyShhW>rE!|B-7m*dIrIqNfchA z4vO@0hb5dad|Z)Zvj4XW2UiUpoO{qKM(e^sFZX#xwg8dXJ3nKDf+db2(Aj+HO zNySn3$nwSZ`kvP${=w7n<$wR}y)-`K&d3F=n&&LFhyWlz0Zf$vEJUjptF^gcF=uY) zECsUzVEtZRos*3vpl`fIqIyfw2Nl60WPo_cgT!=xjcy6DCwOD@&A~JvnkyVFej8)e zKuK9UG>Y>I!Ebq+3ej!4KxeQ%@9Z8M4*sIR)o6C)%wUmUE{AX{GJF! zhx?@$L(m5jFWnB4^={!h@WTKVO)&B&F;0OeBA!N}Gn$jY0S`ac_=T+F+1bO# zLJ|iONC>1+rn}*R;rNqg>n@pI%YA5=`wPNs(YL18!q&OZ+pzja*g9d^J?*`t7K`DN{W3vhfQfL0c(maOO^A2(XPNjaCp}oINIe- z({KEjrfJncqheaPh^ z0ByP$4-TEi;@owMXV2B0@DN|pCNT7yNVGi=b@6>+4$)g4n61MjKeNW=$06UX$9r~< ze2f=YkGZbDO0o0MI>kNT-f^#NXH!u?({`&KAVA0Ro(02{`9HW0gZEs59RAW@zoRU|dp}fyJYoLYL+D^fn%Z}qDrXZ4~l6j zqiuJm6lkSInV*~;Zm?Wzs@@ynZ}#&-Ep0M37A;b;AtA2zF?B?$14xFs|is?%tljF1=Kcjw5*Rw zsWFJ8eC*5-5OH#rWk7iev`qfL_O8b%s_P2BMGR}itg%&b(2*o`lA0*~Xi1PoklJb{ zB4#p(W{YKpG|t5MD~c;3?xuuTQjMscT1U}Ir^Z%ALO{q9}D-~bIy0pJ@=e*^}?{D+>V-z6k!-Nkr{=(c+f~F zL$p2x2O9_K6h44^4i*E^VD=!^gu-bjQ0ptU%`g6<1Qn3k(OZfm-wc0x8x}7#{pj(2 zAs+ml-y)W|K)FvVcFl(h{Cz}J^j~Z?%dF02rrv_b12C@bsxX#!YC@zVJL>FpP`kUM zL;ffy(VfXGNy=K2ordgf(U-R+wME8XGIms2a9+_1_|& zW#|gYDkw6WGK2XRX-%)BHC-!SF&&%bImlO;VxaeS>VT(FKFv6MpsE4wv`20$*{}#E{1vakw}d34z@bNrDAB`A3A} zZ$1e~8Yv;466-1IvR0U?HAR$SI&hG3Iw&;N+BHS&{eh1ZrRYnTB*|RD2-+zLJqae4 zRA}bUERLK$>SyMPLM<5i$-F+`BS#b&)er#GcW6K@-w>&M=p-*8;4dL1LQ5wEI0ep{Yp@R*S^RqH zoSi?9Jzn%y>?c2EV2C-VNLk!kp^45RxzpkuC*Xl!t@Zra^0-yKp<RNLNRF zo23#Il9`hXhVsci?4W=OPD=iA6kpx}Z{g%9oFuXKz`{;*9(#ODkiljSXaWrFFHAw} z7bPGKEv90Ur7+W!WZ)5;Smfwy>CPdmbC(8Q%&3ujuq>G^_(uTKCqMDoH5`cZ#E|T% ze|=GjDCZCKuChN4Jq~r;#I&dCP3NU|dYqSwhPx&dc)uC2w$D0}nAcUU5m>|J5?4*+ zp^uehA~$7e7gNYgAF7C+rr@fdfrJ}fEF_SQ^*sGvuJU1S$T7T0C6HLcBQjaY9jwS= z;Al9pMCJmL8lO_vMgr-TM~pp5ol-a1A((uD<->wWfP8oeou{ z72`iNWMb2H*105k(*k4LmHga83#yF|JcUn_DUVYYR-!t=RN3qc!@`Fo2JS!?v3*7J zAtX?wFJp9@;T)1G+7U$-=pFf}gZDr$1lxyb8qGEfqc50C*q#Q*?YuuNH5&~aIJ?;H zLFWp`_QhG&b?r$e+2ZnSb@h7&JD-52=heZ7i0`J}u%chKV_e*CA9h-+Ju{vEe8Zh# ztoofn!d!>PaBm|3EkY7e>Ce;G5J%t+2#e*^t7GP+3lA9l=5&zZ*iudr=j^aXN35TP zECZ_sC7hh4rUO~|#Rj7~1S^l9njaONqRl~C*^uc~CBUB@MVhxHhAj2F1eMirc3cGx zg!km5aamUNlE$g_1}5%o@0syoPoHhe+Sap)Z=Z~i52f2PO??mYcmMFH2CTs9Q-~u# zfl*)ycTPW>ODV>kAS0L~aXS)BqH#d!h9-ti4~(QQ1MS#I#F2dhox;jJa88Ijk{l(b zI%39r!s>`cOC6*m4Ij3(hRIC`$?~MaP1=;~#cl-A_uD--_t_5Jz&GkOti4ce4PQUK z)Md4H|J$*|nb+ES9`$cuq`h2l6&;|PqcIE^EQKOy4F!sDsR))N{_ih7VMdssAXZSK zq-YA#@IV7a^jF4_Q^K{C@RN#hdNrS>b03ErlH-SJJ5GU7UZp~{kVF)voWu%@s|x} zEF$jgM@9b~mQN_Axc{gu!hkD6${qPp$m4}BLl~u4$w$`*2=O)uDWV@v)t8t zJ^2t17_ha}E?vI4qtZPB4W+5-7#VW~0ZR^?#aOkJ20J}G)$MXC$yrv-b94=dA zsj6?YWy;O{&bb!nK*I0i^A{Q)JzOr=Znv-Ji{bPls1F>rKsyY@kMu&fB*+nUOc|w`r)!3Eu7@QkuZo?gw*2Wxa>jpv+TO|#mC_72vT zS=%Nxy_dJ#FlE(*^+r?c$XSQJY}Iw9@7vJvMQ%fNrs?MS<th2ki=YC6hJ=%IUd5U)le*-k2lZYR{p!O=N z6zY_tqTpQ$a_`?z<~eBOf;?r+{0)jr>bF-|QGw+ju)=8O-45r*J0B-*?!TM-=$w31 z?o~&j4z~_AD6zI39(#E5ZcEjzuB$yo!|ipKAMUd**8k(BF}geH`!|&}Ui?XUQsSDf z${k8_5(cN9YSt!*Hx#3V;H-}+IE5?>qJrfap40vF0XXqnXo46u1r8DlhXOhRCo{4? z-_q$?)4Hl0BX+XxzA>oy9-}o4Q`ws%0~w#*>Kb?Xy&tx6@YT8lLl%Mob?K!WOB*ll zD$f}ErwGS_0~=RJ+!ha*#=wg~t@j(v7{-VKW25@`%*x1eM_8U+v$~Rt3hd*+vcuGzw{lN5s!Bo-DNRgz2pSM6s_rJnwJU2StOV+CNg6 zQT2yVvp8D)=Y#&7caqB84P@(!k9#vzE6|`19rg~MuNm~0s6Uyi-6%1#z-6F3M3`zG zLmUf~W(!FUiDE!gC?z2sBdi6cBm^Gn*$BaX&}^UJkDE^=upofk%+Kggg(G zVS$MWfk(j1hCGiTP2s$Rz$0i%Lf{bsk5FiU(U>g%B^2{e&qgRp6*L?F|KT@Nc=Dqc WK2Llh?vjLmul{<$oMWlkfA}vnWhqSn diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 74c2be1c6..918f321c0 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -2071,9 +2071,9 @@ dependencies = [ [[package]] name = "kittycad-modeling-cmds" -version = "0.2.124" +version = "0.2.125" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "221aa4670a7ad7dc8f1e4e0f9990bf3cff0a64417eb76493bafe5bbbc1f8350a" +checksum = "cfd09d95f8bbeb090d4d1137c9bf421eb75763f7a30e4a9e8eefa249ddf20bd3" dependencies = [ "anyhow", "chrono", diff --git a/rust/Cargo.toml b/rust/Cargo.toml index f9ffbb0cf..c38590cc0 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -36,7 +36,7 @@ dashmap = { version = "6.1.0" } http = "1" indexmap = "2.9.0" kittycad = { version = "0.3.37", default-features = false, features = ["js", "requests"] } -kittycad-modeling-cmds = { version = "0.2.124", features = ["ts-rs", "websocket"] } +kittycad-modeling-cmds = { version = "0.2.125", features = ["ts-rs", "websocket"] } lazy_static = "1.5.0" miette = "7.6.0" pyo3 = { version = "0.24.2" } @@ -60,6 +60,6 @@ lossy_float_literal = "warn" result_large_err = "allow" # Example: how to point modeling-app at a different repo (e.g. a branch or a local clone) -#[patch.crates-io] -#kittycad-modeling-cmds = { path = "../../../modeling-api/modeling-cmds" } -#kittycad-modeling-session = { path = "../../../modeling-api/modeling-session" } +# [patch.crates-io] +# kittycad-modeling-cmds = { path = "../../modeling-api/modeling-cmds/" } +# kittycad-modeling-session = { path = "../../modeling-api/modeling-session" } diff --git a/rust/kcl-lib/src/std/axis_or_reference.rs b/rust/kcl-lib/src/std/axis_or_reference.rs index 065a02742..31194912f 100644 --- a/rust/kcl-lib/src/std/axis_or_reference.rs +++ b/rust/kcl-lib/src/std/axis_or_reference.rs @@ -58,4 +58,11 @@ impl Axis3dOrPoint3d { Axis3dOrPoint3d::Point(point) => point.clone(), } } + + pub fn axis_origin(&self) -> Option<[TyF64; 3]> { + match self { + Axis3dOrPoint3d::Axis { origin, .. } => Some(origin.clone()), + Axis3dOrPoint3d::Point(..) => None, + } + } } diff --git a/rust/kcl-lib/src/std/transform.rs b/rust/kcl-lib/src/std/transform.rs index 694e84921..c605595f3 100644 --- a/rust/kcl-lib/src/std/transform.rs +++ b/rust/kcl-lib/src/std/transform.rs @@ -5,7 +5,7 @@ use kcmc::{ ModelingCmd, each_cmd as mcmd, length_unit::LengthUnit, shared, - shared::{Point3d, Point4d}, + shared::{OriginType, Point3d}, }; use kittycad_modeling_cmds as kcmc; @@ -18,6 +18,16 @@ use crate::{ std::{Args, args::TyF64, axis_or_reference::Axis3dOrPoint3d}, }; +fn transform_by(property: T, set: bool, is_local: bool, origin: Option) -> shared::TransformBy { + shared::TransformBy { + property, + set, + #[expect(deprecated)] + is_local, + origin, + } +} + /// Scale a solid or a sketch. pub async fn scale(exec_state: &mut ExecState, args: Args) -> Result { let objects = args.get_unlabeled_kw_arg( @@ -70,6 +80,13 @@ async fn inner_scale( exec_state.flush_batch_for_solids((&args).into(), solids).await?; } + let is_global = global.unwrap_or(false); + let origin = if is_global { + Some(OriginType::Global) + } else { + Some(OriginType::Local) + }; + let mut objects = objects.clone(); for object_id in objects.ids(&args.ctx).await? { exec_state @@ -78,15 +95,16 @@ async fn inner_scale( ModelingCmd::from(mcmd::SetObjectTransform { object_id, transforms: vec![shared::ComponentTransform { - scale: Some(shared::TransformBy::> { - property: Point3d { + scale: Some(transform_by( + Point3d { x: x.unwrap_or(1.0), y: y.unwrap_or(1.0), z: z.unwrap_or(1.0), }, - set: false, - is_local: !global.unwrap_or(false), - }), + false, + !is_global, + origin, + )), translate: None, rotate_rpy: None, rotate_angle_axis: None, @@ -142,6 +160,13 @@ async fn inner_translate( exec_state.flush_batch_for_solids((&args).into(), solids).await?; } + let is_global = global.unwrap_or(false); + let origin = if is_global { + Some(OriginType::Global) + } else { + Some(OriginType::Local) + }; + let mut objects = objects.clone(); for object_id in objects.ids(&args.ctx).await? { exec_state @@ -150,15 +175,16 @@ async fn inner_translate( ModelingCmd::from(mcmd::SetObjectTransform { object_id, transforms: vec![shared::ComponentTransform { - translate: Some(shared::TransformBy::> { - property: shared::Point3d { + translate: Some(transform_by( + shared::Point3d { x: LengthUnit(x.as_ref().map(|t| t.to_mm()).unwrap_or_default()), y: LengthUnit(y.as_ref().map(|t| t.to_mm()).unwrap_or_default()), z: LengthUnit(z.as_ref().map(|t| t.to_mm()).unwrap_or_default()), }, - set: false, - is_local: !global.unwrap_or(false), - }), + false, + !is_global, + origin, + )), scale: None, rotate_rpy: None, rotate_angle_axis: None, @@ -193,6 +219,7 @@ pub async fn rotate(exec_state: &mut ExecState, args: Args) -> Result = args.get_kw_arg_opt("angle", &RuntimeType::degrees(), exec_state)?; let global = args.get_kw_arg_opt("global", &RuntimeType::bool(), exec_state)?; @@ -286,6 +313,7 @@ pub async fn rotate(exec_state: &mut ExecState, args: Args) -> Result, yaw: Option, axis: Option<[f64; 3]>, + origin: Option<[f64; 3]>, angle: Option, global: Option, exec_state: &mut ExecState, @@ -313,6 +342,20 @@ async fn inner_rotate( exec_state.flush_batch_for_solids((&args).into(), solids).await?; } + let origin = if let Some(origin) = origin { + Some(OriginType::Custom { + origin: shared::Point3d { + x: origin[0], + y: origin[1], + z: origin[2], + }, + }) + } else if global.unwrap_or(false) { + Some(OriginType::Global) + } else { + Some(OriginType::Local) + }; + let mut objects = objects.clone(); for object_id in objects.ids(&args.ctx).await? { if let (Some(axis), Some(angle)) = (&axis, angle) { @@ -322,16 +365,17 @@ async fn inner_rotate( ModelingCmd::from(mcmd::SetObjectTransform { object_id, transforms: vec![shared::ComponentTransform { - rotate_angle_axis: Some(shared::TransformBy::> { - property: shared::Point4d { + rotate_angle_axis: Some(transform_by( + shared::Point4d { x: axis[0], y: axis[1], z: axis[2], w: angle, }, - set: false, - is_local: !global.unwrap_or(false), - }), + false, + !global.unwrap_or(false), + origin, + )), scale: None, rotate_rpy: None, translate: None, @@ -347,15 +391,16 @@ async fn inner_rotate( ModelingCmd::from(mcmd::SetObjectTransform { object_id, transforms: vec![shared::ComponentTransform { - rotate_rpy: Some(shared::TransformBy::> { - property: shared::Point3d { + rotate_rpy: Some(transform_by( + shared::Point3d { x: roll.unwrap_or(0.0), y: pitch.unwrap_or(0.0), z: yaw.unwrap_or(0.0), }, - set: false, - is_local: !global.unwrap_or(false), - }), + false, + !global.unwrap_or(false), + origin, + )), scale: None, rotate_angle_axis: None, translate: None, diff --git a/rust/kcl-lib/tests/import_async/artifact_commands.snap b/rust/kcl-lib/tests/import_async/artifact_commands.snap index fe05bf663..e7de19561 100644 --- a/rust/kcl-lib/tests/import_async/artifact_commands.snap +++ b/rust/kcl-lib/tests/import_async/artifact_commands.snap @@ -5571926,7 +5571926,10 @@ description: Artifact commands import_async.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, diff --git a/rust/kcl-lib/tests/import_mesh_clone/artifact_commands.snap b/rust/kcl-lib/tests/import_mesh_clone/artifact_commands.snap index e6b12f080..9b6e57225 100644 --- a/rust/kcl-lib/tests/import_mesh_clone/artifact_commands.snap +++ b/rust/kcl-lib/tests/import_mesh_clone/artifact_commands.snap @@ -19,7 +19,10 @@ description: Artifact commands import_mesh_clone.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -84,7 +87,10 @@ description: Artifact commands import_mesh_clone.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -149,7 +155,10 @@ description: Artifact commands import_mesh_clone.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -214,7 +223,10 @@ description: Artifact commands import_mesh_clone.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, diff --git a/rust/kcl-lib/tests/import_transform/artifact_commands.snap b/rust/kcl-lib/tests/import_transform/artifact_commands.snap index 03ff943e5..0533d02b5 100644 --- a/rust/kcl-lib/tests/import_transform/artifact_commands.snap +++ b/rust/kcl-lib/tests/import_transform/artifact_commands.snap @@ -5571084,7 +5571084,10 @@ description: Artifact commands import_transform.kcl "z": 3.14 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_angle_axis": null, "scale": null @@ -5571107,7 +5571110,10 @@ description: Artifact commands import_transform.kcl "z": 3.14 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -5571134,7 +5571140,10 @@ description: Artifact commands import_transform.kcl "z": 3.14 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } } } ] diff --git a/rust/kcl-lib/tests/import_whole_simple/artifact_commands.snap b/rust/kcl-lib/tests/import_whole_simple/artifact_commands.snap index bdd71a6a6..154df0f7f 100644 --- a/rust/kcl-lib/tests/import_whole_simple/artifact_commands.snap +++ b/rust/kcl-lib/tests/import_whole_simple/artifact_commands.snap @@ -182,7 +182,10 @@ description: Artifact commands import_whole_simple.kcl "z": 1.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, diff --git a/rust/kcl-lib/tests/import_whole_transitive_import/artifact_commands.snap b/rust/kcl-lib/tests/import_whole_transitive_import/artifact_commands.snap index 34e17168a..0c90f04d3 100644 --- a/rust/kcl-lib/tests/import_whole_transitive_import/artifact_commands.snap +++ b/rust/kcl-lib/tests/import_whole_transitive_import/artifact_commands.snap @@ -20,7 +20,10 @@ description: Artifact commands import_whole_transitive_import.kcl "z": 1.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, diff --git a/rust/kcl-lib/tests/intersect_cubes/artifact_commands.snap b/rust/kcl-lib/tests/intersect_cubes/artifact_commands.snap index aecf2cdaf..73d533c2d 100644 --- a/rust/kcl-lib/tests/intersect_cubes/artifact_commands.snap +++ b/rust/kcl-lib/tests/intersect_cubes/artifact_commands.snap @@ -393,7 +393,10 @@ description: Artifact commands intersect_cubes.kcl "z": 1.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, diff --git a/rust/kcl-lib/tests/kcl_samples/ball-joint-rod-end/artifact_commands.snap b/rust/kcl-lib/tests/kcl_samples/ball-joint-rod-end/artifact_commands.snap index a313abe15..1d0213ca5 100644 --- a/rust/kcl-lib/tests/kcl_samples/ball-joint-rod-end/artifact_commands.snap +++ b/rust/kcl-lib/tests/kcl_samples/ball-joint-rod-end/artifact_commands.snap @@ -956,7 +956,10 @@ description: Artifact commands ball-joint-rod-end.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -1211,7 +1214,10 @@ description: Artifact commands ball-joint-rod-end.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, diff --git a/rust/kcl-lib/tests/kcl_samples/ball-joint-rod-end/rendered_model.png b/rust/kcl-lib/tests/kcl_samples/ball-joint-rod-end/rendered_model.png index ba74c58b0c31cf59a5fba12e3a7c7a896910b610..6dff8f8f0acdb0675273e9d4439aec5a0f3b9237 100644 GIT binary patch literal 85463 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 diff --git a/rust/kcl-lib/tests/kcl_samples/car-wheel-assembly/artifact_commands.snap b/rust/kcl-lib/tests/kcl_samples/car-wheel-assembly/artifact_commands.snap index fe859f6cf..66d1cd994 100644 --- a/rust/kcl-lib/tests/kcl_samples/car-wheel-assembly/artifact_commands.snap +++ b/rust/kcl-lib/tests/kcl_samples/car-wheel-assembly/artifact_commands.snap @@ -7382,7 +7382,10 @@ description: Artifact commands car-wheel-assembly.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -7406,7 +7409,10 @@ description: Artifact commands car-wheel-assembly.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -7430,7 +7436,10 @@ description: Artifact commands car-wheel-assembly.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -7454,7 +7463,10 @@ description: Artifact commands car-wheel-assembly.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -7478,7 +7490,10 @@ description: Artifact commands car-wheel-assembly.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -7523,7 +7538,10 @@ description: Artifact commands car-wheel-assembly.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, diff --git a/rust/kcl-lib/tests/kcl_samples/cpu-cooler/artifact_commands.snap b/rust/kcl-lib/tests/kcl_samples/cpu-cooler/artifact_commands.snap index 6f9113f7f..062fb1684 100644 --- a/rust/kcl-lib/tests/kcl_samples/cpu-cooler/artifact_commands.snap +++ b/rust/kcl-lib/tests/kcl_samples/cpu-cooler/artifact_commands.snap @@ -7075,7 +7075,10 @@ description: Artifact commands cpu-cooler.kcl "z": 100.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -7139,7 +7142,10 @@ description: Artifact commands cpu-cooler.kcl "z": 100.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -7163,7 +7169,10 @@ description: Artifact commands cpu-cooler.kcl "z": 100.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -7267,7 +7276,10 @@ description: Artifact commands cpu-cooler.kcl "z": 100.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -7291,7 +7303,10 @@ description: Artifact commands cpu-cooler.kcl "z": 100.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -7315,7 +7330,10 @@ description: Artifact commands cpu-cooler.kcl "z": 100.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -7339,7 +7357,10 @@ description: Artifact commands cpu-cooler.kcl "z": 100.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -7363,7 +7384,10 @@ description: Artifact commands cpu-cooler.kcl "z": 100.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -7387,7 +7411,10 @@ description: Artifact commands cpu-cooler.kcl "z": 100.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -7411,7 +7438,10 @@ description: Artifact commands cpu-cooler.kcl "z": 100.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -7435,7 +7465,10 @@ description: Artifact commands cpu-cooler.kcl "z": 100.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -7459,7 +7492,10 @@ description: Artifact commands cpu-cooler.kcl "z": 100.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -7483,7 +7519,10 @@ description: Artifact commands cpu-cooler.kcl "z": 100.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, diff --git a/rust/kcl-lib/tests/kcl_samples/curtain-wall-anchor-plate/artifact_commands.snap b/rust/kcl-lib/tests/kcl_samples/curtain-wall-anchor-plate/artifact_commands.snap index 2b9276e27..5e786017d 100644 --- a/rust/kcl-lib/tests/kcl_samples/curtain-wall-anchor-plate/artifact_commands.snap +++ b/rust/kcl-lib/tests/kcl_samples/curtain-wall-anchor-plate/artifact_commands.snap @@ -482,7 +482,10 @@ description: Artifact commands curtain-wall-anchor-plate.kcl "z": -1.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -616,7 +619,10 @@ description: Artifact commands curtain-wall-anchor-plate.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -1479,7 +1485,10 @@ description: Artifact commands curtain-wall-anchor-plate.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_angle_axis": null, "scale": null @@ -1502,7 +1511,10 @@ description: Artifact commands curtain-wall-anchor-plate.kcl "z": 5.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, diff --git a/rust/kcl-lib/tests/kcl_samples/dodecahedron/artifact_commands.snap b/rust/kcl-lib/tests/kcl_samples/dodecahedron/artifact_commands.snap index 7f3a0667a..299031d63 100644 --- a/rust/kcl-lib/tests/kcl_samples/dodecahedron/artifact_commands.snap +++ b/rust/kcl-lib/tests/kcl_samples/dodecahedron/artifact_commands.snap @@ -206,7 +206,10 @@ description: Artifact commands dodecahedron.kcl "z": -6604.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -231,7 +234,10 @@ description: Artifact commands dodecahedron.kcl "z": 0.0 }, "set": false, - "is_local": false + "is_local": false, + "origin": { + "type": "global" + } }, "rotate_angle_axis": null, "scale": null @@ -441,7 +447,10 @@ description: Artifact commands dodecahedron.kcl "z": -6606.54 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -466,7 +475,10 @@ description: Artifact commands dodecahedron.kcl "z": 0.0 }, "set": false, - "is_local": false + "is_local": false, + "origin": { + "type": "global" + } }, "rotate_angle_axis": null, "scale": null @@ -676,7 +688,10 @@ description: Artifact commands dodecahedron.kcl "z": -6609.079999999999 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -701,7 +716,10 @@ description: Artifact commands dodecahedron.kcl "z": 72.0 }, "set": false, - "is_local": false + "is_local": false, + "origin": { + "type": "global" + } }, "rotate_angle_axis": null, "scale": null @@ -911,7 +929,10 @@ description: Artifact commands dodecahedron.kcl "z": -6611.62 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -936,7 +957,10 @@ description: Artifact commands dodecahedron.kcl "z": 144.0 }, "set": false, - "is_local": false + "is_local": false, + "origin": { + "type": "global" + } }, "rotate_angle_axis": null, "scale": null @@ -1146,7 +1170,10 @@ description: Artifact commands dodecahedron.kcl "z": -6614.159999999999 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -1171,7 +1198,10 @@ description: Artifact commands dodecahedron.kcl "z": 216.0 }, "set": false, - "is_local": false + "is_local": false, + "origin": { + "type": "global" + } }, "rotate_angle_axis": null, "scale": null @@ -1381,7 +1411,10 @@ description: Artifact commands dodecahedron.kcl "z": -6616.7 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -1406,7 +1439,10 @@ description: Artifact commands dodecahedron.kcl "z": 288.0 }, "set": false, - "is_local": false + "is_local": false, + "origin": { + "type": "global" + } }, "rotate_angle_axis": null, "scale": null @@ -1616,7 +1652,10 @@ description: Artifact commands dodecahedron.kcl "z": -6619.24 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -1641,7 +1680,10 @@ description: Artifact commands dodecahedron.kcl "z": 0.0 }, "set": false, - "is_local": false + "is_local": false, + "origin": { + "type": "global" + } }, "rotate_angle_axis": null, "scale": null @@ -1851,7 +1893,10 @@ description: Artifact commands dodecahedron.kcl "z": -6621.78 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -1876,7 +1921,10 @@ description: Artifact commands dodecahedron.kcl "z": 36.0 }, "set": false, - "is_local": false + "is_local": false, + "origin": { + "type": "global" + } }, "rotate_angle_axis": null, "scale": null @@ -2086,7 +2134,10 @@ description: Artifact commands dodecahedron.kcl "z": -6624.32 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -2111,7 +2162,10 @@ description: Artifact commands dodecahedron.kcl "z": 108.0 }, "set": false, - "is_local": false + "is_local": false, + "origin": { + "type": "global" + } }, "rotate_angle_axis": null, "scale": null @@ -2321,7 +2375,10 @@ description: Artifact commands dodecahedron.kcl "z": -6626.859999999999 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -2346,7 +2403,10 @@ description: Artifact commands dodecahedron.kcl "z": 180.0 }, "set": false, - "is_local": false + "is_local": false, + "origin": { + "type": "global" + } }, "rotate_angle_axis": null, "scale": null @@ -2556,7 +2616,10 @@ description: Artifact commands dodecahedron.kcl "z": -6606.794 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -2581,7 +2644,10 @@ description: Artifact commands dodecahedron.kcl "z": 252.0 }, "set": false, - "is_local": false + "is_local": false, + "origin": { + "type": "global" + } }, "rotate_angle_axis": null, "scale": null @@ -2791,7 +2857,10 @@ description: Artifact commands dodecahedron.kcl "z": -6607.048 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -2816,7 +2885,10 @@ description: Artifact commands dodecahedron.kcl "z": 324.0 }, "set": false, - "is_local": false + "is_local": false, + "origin": { + "type": "global" + } }, "rotate_angle_axis": null, "scale": null diff --git a/rust/kcl-lib/tests/kcl_samples/helical-planetary-gearset/artifact_commands.snap b/rust/kcl-lib/tests/kcl_samples/helical-planetary-gearset/artifact_commands.snap index 2440021fe..c108d2874 100644 --- a/rust/kcl-lib/tests/kcl_samples/helical-planetary-gearset/artifact_commands.snap +++ b/rust/kcl-lib/tests/kcl_samples/helical-planetary-gearset/artifact_commands.snap @@ -2743,7 +2743,10 @@ description: Artifact commands helical-planetary-gearset.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, diff --git a/rust/kcl-lib/tests/kcl_samples/herringbone-gear/artifact_commands.snap b/rust/kcl-lib/tests/kcl_samples/herringbone-gear/artifact_commands.snap index 0900e4fef..f7c81fb4b 100644 --- a/rust/kcl-lib/tests/kcl_samples/herringbone-gear/artifact_commands.snap +++ b/rust/kcl-lib/tests/kcl_samples/herringbone-gear/artifact_commands.snap @@ -629,7 +629,10 @@ description: Artifact commands herringbone-gear.kcl "z": 8.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, diff --git a/rust/kcl-lib/tests/kcl_samples/herringbone-planetary-gearset/artifact_commands.snap b/rust/kcl-lib/tests/kcl_samples/herringbone-planetary-gearset/artifact_commands.snap index 70f1a1e69..c0e33a485 100644 --- a/rust/kcl-lib/tests/kcl_samples/herringbone-planetary-gearset/artifact_commands.snap +++ b/rust/kcl-lib/tests/kcl_samples/herringbone-planetary-gearset/artifact_commands.snap @@ -707,7 +707,10 @@ description: Artifact commands herringbone-planetary-gearset.kcl "z": 8.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -1383,7 +1386,10 @@ description: Artifact commands herringbone-planetary-gearset.kcl "z": 8.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -2059,7 +2065,10 @@ description: Artifact commands herringbone-planetary-gearset.kcl "z": 8.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -2125,7 +2134,10 @@ description: Artifact commands herringbone-planetary-gearset.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, diff --git a/rust/kcl-lib/tests/kcl_samples/pdu-faceplate/artifact_commands.snap b/rust/kcl-lib/tests/kcl_samples/pdu-faceplate/artifact_commands.snap index 8817e08d6..3b9c89676 100644 --- a/rust/kcl-lib/tests/kcl_samples/pdu-faceplate/artifact_commands.snap +++ b/rust/kcl-lib/tests/kcl_samples/pdu-faceplate/artifact_commands.snap @@ -689,7 +689,10 @@ description: Artifact commands pdu-faceplate.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -1088,7 +1091,10 @@ description: Artifact commands pdu-faceplate.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -1344,7 +1350,10 @@ description: Artifact commands pdu-faceplate.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -1589,7 +1598,10 @@ description: Artifact commands pdu-faceplate.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -1817,7 +1829,10 @@ description: Artifact commands pdu-faceplate.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -1913,7 +1928,10 @@ description: Artifact commands pdu-faceplate.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -2065,7 +2083,10 @@ description: Artifact commands pdu-faceplate.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -2873,7 +2894,10 @@ description: Artifact commands pdu-faceplate.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -3012,7 +3036,10 @@ description: Artifact commands pdu-faceplate.kcl "z": -13.335 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, diff --git a/rust/kcl-lib/tests/kcl_samples/pipe-flange-assembly/artifact_commands.snap b/rust/kcl-lib/tests/kcl_samples/pipe-flange-assembly/artifact_commands.snap index d9f72ecaa..e6f3133af 100644 --- a/rust/kcl-lib/tests/kcl_samples/pipe-flange-assembly/artifact_commands.snap +++ b/rust/kcl-lib/tests/kcl_samples/pipe-flange-assembly/artifact_commands.snap @@ -1847,7 +1847,10 @@ description: Artifact commands pipe-flange-assembly.kcl "w": 180.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "scale": null } @@ -1869,7 +1872,10 @@ description: Artifact commands pipe-flange-assembly.kcl "z": 3.8353999999999995 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -1893,7 +1899,10 @@ description: Artifact commands pipe-flange-assembly.kcl "z": -2.3114 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -2223,7 +2232,10 @@ description: Artifact commands pipe-flange-assembly.kcl "z": 17.525999999999996 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -2952,7 +2964,10 @@ description: Artifact commands pipe-flange-assembly.kcl "z": 18.3388 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -2977,7 +2992,10 @@ description: Artifact commands pipe-flange-assembly.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_angle_axis": null, "scale": null @@ -3387,7 +3405,10 @@ description: Artifact commands pipe-flange-assembly.kcl "z": -36.064825 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -3739,7 +3760,10 @@ description: Artifact commands pipe-flange-assembly.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_angle_axis": null, "scale": null @@ -3762,7 +3786,10 @@ description: Artifact commands pipe-flange-assembly.kcl "z": 11.175999999999998 }, "set": false, - "is_local": false + "is_local": false, + "origin": { + "type": "global" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -4093,7 +4120,10 @@ description: Artifact commands pipe-flange-assembly.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_angle_axis": null, "scale": null @@ -4116,7 +4146,10 @@ description: Artifact commands pipe-flange-assembly.kcl "z": -15.011399999999998 }, "set": false, - "is_local": false + "is_local": false, + "origin": { + "type": "global" + } }, "rotate_rpy": null, "rotate_angle_axis": null, diff --git a/rust/kcl-lib/tests/kcl_samples/prosthetic-hip/artifact_commands.snap b/rust/kcl-lib/tests/kcl_samples/prosthetic-hip/artifact_commands.snap index 6680a3d98..eb9f89592 100644 --- a/rust/kcl-lib/tests/kcl_samples/prosthetic-hip/artifact_commands.snap +++ b/rust/kcl-lib/tests/kcl_samples/prosthetic-hip/artifact_commands.snap @@ -570,7 +570,10 @@ description: Artifact commands prosthetic-hip.kcl "z": 110.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -595,7 +598,10 @@ description: Artifact commands prosthetic-hip.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_angle_axis": null, "scale": null @@ -794,7 +800,10 @@ description: Artifact commands prosthetic-hip.kcl "z": 130.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -819,7 +828,10 @@ description: Artifact commands prosthetic-hip.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_angle_axis": null, "scale": null @@ -1018,7 +1030,10 @@ description: Artifact commands prosthetic-hip.kcl "z": 140.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -1043,7 +1058,10 @@ description: Artifact commands prosthetic-hip.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_angle_axis": null, "scale": null @@ -1242,7 +1260,10 @@ description: Artifact commands prosthetic-hip.kcl "z": 145.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -1267,7 +1288,10 @@ description: Artifact commands prosthetic-hip.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_angle_axis": null, "scale": null @@ -1709,7 +1733,10 @@ description: Artifact commands prosthetic-hip.kcl "z": 133.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -1734,7 +1761,10 @@ description: Artifact commands prosthetic-hip.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_angle_axis": null, "scale": null @@ -2003,7 +2033,10 @@ description: Artifact commands prosthetic-hip.kcl "z": 133.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -2028,7 +2061,10 @@ description: Artifact commands prosthetic-hip.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_angle_axis": null, "scale": null @@ -2297,7 +2333,10 @@ description: Artifact commands prosthetic-hip.kcl "z": 133.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -2322,7 +2361,10 @@ description: Artifact commands prosthetic-hip.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_angle_axis": null, "scale": null diff --git a/rust/kcl-lib/tests/kcl_samples/sash-window/artifact_commands.snap b/rust/kcl-lib/tests/kcl_samples/sash-window/artifact_commands.snap index abbaf12bf..c1d1053da 100644 --- a/rust/kcl-lib/tests/kcl_samples/sash-window/artifact_commands.snap +++ b/rust/kcl-lib/tests/kcl_samples/sash-window/artifact_commands.snap @@ -1002,7 +1002,10 @@ description: Artifact commands sash-window.kcl "z": -227.5 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -1026,7 +1029,10 @@ description: Artifact commands sash-window.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -1277,7 +1283,10 @@ description: Artifact commands sash-window.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -1301,7 +1310,10 @@ description: Artifact commands sash-window.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -1557,7 +1569,10 @@ description: Artifact commands sash-window.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -1581,7 +1596,10 @@ description: Artifact commands sash-window.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -1606,7 +1624,10 @@ description: Artifact commands sash-window.kcl "z": -0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_angle_axis": null, "scale": null @@ -2177,7 +2198,10 @@ description: Artifact commands sash-window.kcl "z": 227.5 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, diff --git a/rust/kcl-lib/tests/kcl_samples/spool/artifact_commands.snap b/rust/kcl-lib/tests/kcl_samples/spool/artifact_commands.snap index 28f7d10a9..a9fd6fe93 100644 --- a/rust/kcl-lib/tests/kcl_samples/spool/artifact_commands.snap +++ b/rust/kcl-lib/tests/kcl_samples/spool/artifact_commands.snap @@ -1805,7 +1805,10 @@ description: Artifact commands spool.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, diff --git a/rust/kcl-lib/tests/kcl_samples/spur-reduction-gearset/artifact_commands.snap b/rust/kcl-lib/tests/kcl_samples/spur-reduction-gearset/artifact_commands.snap index 0efef9762..281975a7f 100644 --- a/rust/kcl-lib/tests/kcl_samples/spur-reduction-gearset/artifact_commands.snap +++ b/rust/kcl-lib/tests/kcl_samples/spur-reduction-gearset/artifact_commands.snap @@ -661,7 +661,10 @@ description: Artifact commands spur-reduction-gearset.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -686,7 +689,10 @@ description: Artifact commands spur-reduction-gearset.kcl "z": 3.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_angle_axis": null, "scale": null diff --git a/rust/kcl-lib/tests/kcl_samples/t-slot-rail/artifact_commands.snap b/rust/kcl-lib/tests/kcl_samples/t-slot-rail/artifact_commands.snap index 135a28b66..9ff69f9f8 100644 --- a/rust/kcl-lib/tests/kcl_samples/t-slot-rail/artifact_commands.snap +++ b/rust/kcl-lib/tests/kcl_samples/t-slot-rail/artifact_commands.snap @@ -502,7 +502,10 @@ description: Artifact commands t-slot-rail.kcl "z": 1.5 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } } } ] diff --git a/rust/kcl-lib/tests/kcl_samples/walkie-talkie/artifact_commands.snap b/rust/kcl-lib/tests/kcl_samples/walkie-talkie/artifact_commands.snap index b3964fd86..47063d3bf 100644 --- a/rust/kcl-lib/tests/kcl_samples/walkie-talkie/artifact_commands.snap +++ b/rust/kcl-lib/tests/kcl_samples/walkie-talkie/artifact_commands.snap @@ -9827,7 +9827,10 @@ description: Artifact commands walkie-talkie.kcl "z": 50.8 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -9851,7 +9854,10 @@ description: Artifact commands walkie-talkie.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -9875,7 +9881,10 @@ description: Artifact commands walkie-talkie.kcl "z": 12.7 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -9899,7 +9908,10 @@ description: Artifact commands walkie-talkie.kcl "z": 50.8 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -10181,7 +10193,10 @@ description: Artifact commands walkie-talkie.kcl "z": 31.75 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -10463,7 +10478,10 @@ description: Artifact commands walkie-talkie.kcl "z": 18.541999999999998 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -10746,7 +10764,10 @@ description: Artifact commands walkie-talkie.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_angle_axis": null, "scale": null @@ -10769,7 +10790,10 @@ description: Artifact commands walkie-talkie.kcl "z": 19.558 }, "set": false, - "is_local": false + "is_local": false, + "origin": { + "type": "global" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -11052,7 +11076,10 @@ description: Artifact commands walkie-talkie.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_angle_axis": null, "scale": null @@ -11075,7 +11102,10 @@ description: Artifact commands walkie-talkie.kcl "z": 6.350000000000001 }, "set": false, - "is_local": false + "is_local": false, + "origin": { + "type": "global" + } }, "rotate_rpy": null, "rotate_angle_axis": null, diff --git a/rust/kcl-lib/tests/module_return_using_var/artifact_commands.snap b/rust/kcl-lib/tests/module_return_using_var/artifact_commands.snap index b61230706..d9c570edf 100644 --- a/rust/kcl-lib/tests/module_return_using_var/artifact_commands.snap +++ b/rust/kcl-lib/tests/module_return_using_var/artifact_commands.snap @@ -225,7 +225,10 @@ description: Artifact commands module_return_using_var.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, diff --git a/rust/kcl-lib/tests/multiple-foreign-imports-all-render/artifact_commands.snap b/rust/kcl-lib/tests/multiple-foreign-imports-all-render/artifact_commands.snap index 59779f3d0..06d92674f 100644 --- a/rust/kcl-lib/tests/multiple-foreign-imports-all-render/artifact_commands.snap +++ b/rust/kcl-lib/tests/multiple-foreign-imports-all-render/artifact_commands.snap @@ -15925,7 +15925,10 @@ description: Artifact commands multiple-foreign-imports-all-render.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -15966,7 +15969,10 @@ description: Artifact commands multiple-foreign-imports-all-render.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, diff --git a/rust/kcl-lib/tests/rotate_after_fillet/artifact_commands.snap b/rust/kcl-lib/tests/rotate_after_fillet/artifact_commands.snap index 40c4df93c..e2e4c5477 100644 --- a/rust/kcl-lib/tests/rotate_after_fillet/artifact_commands.snap +++ b/rust/kcl-lib/tests/rotate_after_fillet/artifact_commands.snap @@ -571,7 +571,10 @@ description: Artifact commands rotate_after_fillet.kcl "z": 3.14 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_angle_axis": null, "scale": null diff --git a/rust/kcl-lib/tests/scale_after_fillet/artifact_commands.snap b/rust/kcl-lib/tests/scale_after_fillet/artifact_commands.snap index 5d5b61308..fe5a687ea 100644 --- a/rust/kcl-lib/tests/scale_after_fillet/artifact_commands.snap +++ b/rust/kcl-lib/tests/scale_after_fillet/artifact_commands.snap @@ -573,7 +573,10 @@ description: Artifact commands scale_after_fillet.kcl "z": 3.14 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } } } ] diff --git a/rust/kcl-lib/tests/sketch_on_face_union/artifact_commands.snap b/rust/kcl-lib/tests/sketch_on_face_union/artifact_commands.snap index d7df86c6c..1995764b9 100644 --- a/rust/kcl-lib/tests/sketch_on_face_union/artifact_commands.snap +++ b/rust/kcl-lib/tests/sketch_on_face_union/artifact_commands.snap @@ -1025,7 +1025,10 @@ description: Artifact commands sketch_on_face_union.kcl "w": -90.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "scale": null } diff --git a/rust/kcl-lib/tests/spheres/artifact_commands.snap b/rust/kcl-lib/tests/spheres/artifact_commands.snap index 846016f96..8ba45ec31 100644 --- a/rust/kcl-lib/tests/spheres/artifact_commands.snap +++ b/rust/kcl-lib/tests/spheres/artifact_commands.snap @@ -357,7 +357,10 @@ description: Artifact commands spheres.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, diff --git a/rust/kcl-lib/tests/subtract_cylinder_from_cube/artifact_commands.snap b/rust/kcl-lib/tests/subtract_cylinder_from_cube/artifact_commands.snap index b44d86ef1..efb0356fb 100644 --- a/rust/kcl-lib/tests/subtract_cylinder_from_cube/artifact_commands.snap +++ b/rust/kcl-lib/tests/subtract_cylinder_from_cube/artifact_commands.snap @@ -367,7 +367,10 @@ description: Artifact commands subtract_cylinder_from_cube.kcl "z": 3.14 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, diff --git a/rust/kcl-lib/tests/subtract_doesnt_need_brackets/artifact_commands.snap b/rust/kcl-lib/tests/subtract_doesnt_need_brackets/artifact_commands.snap index fa16e058e..d85f89e2e 100644 --- a/rust/kcl-lib/tests/subtract_doesnt_need_brackets/artifact_commands.snap +++ b/rust/kcl-lib/tests/subtract_doesnt_need_brackets/artifact_commands.snap @@ -393,7 +393,10 @@ description: Artifact commands subtract_doesnt_need_brackets.kcl "z": 1.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, diff --git a/rust/kcl-lib/tests/subtract_regression03/artifact_commands.snap b/rust/kcl-lib/tests/subtract_regression03/artifact_commands.snap index bc006cfe6..196428639 100644 --- a/rust/kcl-lib/tests/subtract_regression03/artifact_commands.snap +++ b/rust/kcl-lib/tests/subtract_regression03/artifact_commands.snap @@ -233,7 +233,10 @@ description: Artifact commands subtract_regression03.kcl "z": 1.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } } } ] diff --git a/rust/kcl-lib/tests/subtract_regression12/rendered_model.png b/rust/kcl-lib/tests/subtract_regression12/rendered_model.png index c541dac7c7aa7f094e673795d0a99d9ce484697a..5aae217e389d3d0ffdf432404087fb0357d91ca7 100644 GIT binary patch delta 14577 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 diff --git a/rust/kcl-lib/tests/subtract_with_pattern/artifact_commands.snap b/rust/kcl-lib/tests/subtract_with_pattern/artifact_commands.snap index 890c1e7b6..fc9fed252 100644 --- a/rust/kcl-lib/tests/subtract_with_pattern/artifact_commands.snap +++ b/rust/kcl-lib/tests/subtract_with_pattern/artifact_commands.snap @@ -682,7 +682,10 @@ description: Artifact commands subtract_with_pattern.kcl "w": 90.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "scale": null } diff --git a/rust/kcl-lib/tests/subtract_with_pattern_cut_thru/artifact_commands.snap b/rust/kcl-lib/tests/subtract_with_pattern_cut_thru/artifact_commands.snap index ce0756a21..697f9bc1a 100644 --- a/rust/kcl-lib/tests/subtract_with_pattern_cut_thru/artifact_commands.snap +++ b/rust/kcl-lib/tests/subtract_with_pattern_cut_thru/artifact_commands.snap @@ -384,7 +384,10 @@ description: Artifact commands subtract_with_pattern_cut_thru.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -556,7 +559,10 @@ description: Artifact commands subtract_with_pattern_cut_thru.kcl "w": 90.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "scale": null } diff --git a/rust/kcl-lib/tests/translate_after_fillet/artifact_commands.snap b/rust/kcl-lib/tests/translate_after_fillet/artifact_commands.snap index 07a50c0cf..63b684c66 100644 --- a/rust/kcl-lib/tests/translate_after_fillet/artifact_commands.snap +++ b/rust/kcl-lib/tests/translate_after_fillet/artifact_commands.snap @@ -570,7 +570,10 @@ description: Artifact commands translate_after_fillet.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, diff --git a/rust/kcl-lib/tests/union_cubes/artifact_commands.snap b/rust/kcl-lib/tests/union_cubes/artifact_commands.snap index 1791939f3..33bb10a90 100644 --- a/rust/kcl-lib/tests/union_cubes/artifact_commands.snap +++ b/rust/kcl-lib/tests/union_cubes/artifact_commands.snap @@ -393,7 +393,10 @@ description: Artifact commands union_cubes.kcl "z": 1.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, diff --git a/rust/kcl-lib/tests/user_reported_union_2_bug/artifact_commands.snap b/rust/kcl-lib/tests/user_reported_union_2_bug/artifact_commands.snap index 61e4b6840..767192d7c 100644 --- a/rust/kcl-lib/tests/user_reported_union_2_bug/artifact_commands.snap +++ b/rust/kcl-lib/tests/user_reported_union_2_bug/artifact_commands.snap @@ -146,7 +146,10 @@ description: Artifact commands user_reported_union_2_bug.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_rpy": null, "rotate_angle_axis": null, @@ -401,7 +404,10 @@ description: Artifact commands user_reported_union_2_bug.kcl "z": 0.0 }, "set": false, - "is_local": true + "is_local": true, + "origin": { + "type": "local" + } }, "rotate_angle_axis": null, "scale": null From 0f8375cbb4ad289981a0e3da0c728b5647af3336 Mon Sep 17 00:00:00 2001 From: Kurt Hutten Date: Fri, 27 Jun 2025 21:36:42 +1000 Subject: [PATCH 8/8] [BUG] offsetPlane back-side startSketchOn (#7622) offset backPlane selection bug --- ...on-all-planes-and-their-back-sides.spec.ts | 162 +++++++++++++++++- e2e/playwright/fixtures/toolbarFixture.ts | 7 + src/components/CustomIcon.tsx | 128 +++++++++++--- src/components/ModelingMachineProvider.tsx | 6 +- .../ModelingPanes/FeatureTreePane.tsx | 7 +- src/hooks/useEngineConnectionSubscriptions.ts | 50 ++++-- src/lang/modifyAst.ts | 15 +- src/machines/modelingMachine.ts | 1 + 8 files changed, 337 insertions(+), 39 deletions(-) diff --git a/e2e/playwright/can-create-sketches-on-all-planes-and-their-back-sides.spec.ts b/e2e/playwright/can-create-sketches-on-all-planes-and-their-back-sides.spec.ts index 3ec4f1332..c6953644f 100644 --- a/e2e/playwright/can-create-sketches-on-all-planes-and-their-back-sides.spec.ts +++ b/e2e/playwright/can-create-sketches-on-all-planes-and-their-back-sides.spec.ts @@ -5,6 +5,7 @@ import { uuidv4 } from '@src/lib/utils' import type { HomePageFixture } from '@e2e/playwright/fixtures/homePageFixture' import type { SceneFixture } from '@e2e/playwright/fixtures/sceneFixture' import type { ToolbarFixture } from '@e2e/playwright/fixtures/toolbarFixture' +import type { CmdBarFixture } from '@e2e/playwright/fixtures/cmdBarFixture' import { getUtils } from '@e2e/playwright/test-utils' import { expect, test } from '@e2e/playwright/zoo-test' @@ -14,13 +15,18 @@ test.describe('Can create sketches on all planes and their back sides', () => { homePage: HomePageFixture, scene: SceneFixture, toolbar: ToolbarFixture, + cmdBar: CmdBarFixture, plane: string, clickCoords: { x: number; y: number } ) => { const u = await getUtils(page) + // await page.addInitScript(() => { + // localStorage.setItem('persistCode', '@settings(defaultLengthUnit = in)') + // }) await page.setBodyDimensions({ width: 1200, height: 500 }) await homePage.goToModelingScene() + // await scene.settled(cmdBar) const XYPlanRed: [number, number, number] = [98, 50, 51] await scene.expectPixelColor(XYPlanRed, { x: 700, y: 300 }, 15) @@ -119,12 +125,166 @@ test.describe('Can create sketches on all planes and their back sides', () => { ] for (const config of planeConfigs) { - test(config.plane, async ({ page, homePage, scene, toolbar }) => { + test(config.plane, async ({ page, homePage, scene, toolbar, cmdBar }) => { await sketchOnPlaneAndBackSideTest( page, homePage, scene, toolbar, + cmdBar, + config.plane, + config.coords + ) + }) + } +}) +test.describe('Can create sketches on offset planes and their back sides', () => { + const sketchOnPlaneAndBackSideTest = async ( + page: Page, + homePage: HomePageFixture, + scene: SceneFixture, + toolbar: ToolbarFixture, + cmdbar: CmdBarFixture, + plane: string, + clickCoords: { x: number; y: number } + ) => { + const u = await getUtils(page) + await page.addInitScript(() => { + localStorage.setItem( + 'persistCode', + `@settings(defaultLengthUnit = in) +xyPlane = offsetPlane(XY, offset = 0.05) +xzPlane = offsetPlane(XZ, offset = 0.05) +yzPlane = offsetPlane(YZ, offset = 0.05) +` + ) + }) + await page.setBodyDimensions({ width: 1200, height: 500 }) + + await homePage.goToModelingScene() + // await scene.settled(cmdbar) + const XYPlanRed: [number, number, number] = [74, 74, 74] + await scene.expectPixelColor(XYPlanRed, { x: 700, y: 300 }, 15) + + await u.openDebugPanel() + + const coord = + plane === '-XY' || plane === '-YZ' || plane === 'XZ' ? -100 : 100 + const camCommand: EngineCommand = { + type: 'modeling_cmd_req', + cmd_id: uuidv4(), + cmd: { + type: 'default_camera_look_at', + center: { x: 0, y: 0, z: 0 }, + vantage: { x: coord, y: coord, z: coord }, + up: { x: 0, y: 0, z: 1 }, + }, + } + const updateCamCommand: EngineCommand = { + type: 'modeling_cmd_req', + cmd_id: uuidv4(), + cmd: { + type: 'default_camera_get_settings', + }, + } + + const prefix = plane.length === 3 ? '-' : '' + const planeName = plane + .slice(plane.length === 3 ? 1 : 0) + .toLocaleLowerCase() + + const codeLine1 = `sketch001 = startSketchOn(${prefix}${planeName}Plane)` + const codeLine2 = `profile001 = startProfile(sketch001, at = [${0.91 + (plane[0] === '-' ? 0.01 : 0)}, -${1.21 + (plane[0] === '-' ? 0.01 : 0)}])` + + await u.openDebugPanel() + + await u.clearCommandLogs() + await page.getByRole('button', { name: 'Start Sketch' }).click() + + await u.sendCustomCmd(camCommand) + await page.waitForTimeout(100) + await u.sendCustomCmd(updateCamCommand) + + await u.closeDebugPanel() + + await toolbar.openFeatureTreePane() + await toolbar.getDefaultPlaneVisibilityButton('XY').click() + await toolbar.getDefaultPlaneVisibilityButton('XZ').click() + await toolbar.getDefaultPlaneVisibilityButton('YZ').click() + await expect( + toolbar + .getDefaultPlaneVisibilityButton('YZ') + .locator('[aria-label="eye crossed out"]') + ).toBeVisible() + + await page.mouse.click(clickCoords.x, clickCoords.y) + await page.waitForTimeout(600) // wait for animation + + await toolbar.waitUntilSketchingReady() + + await expect( + page.getByRole('button', { name: 'line Line', exact: true }) + ).toBeVisible() + + await u.closeDebugPanel() + await page.mouse.click(707, 393) + + await expect(page.locator('.cm-content')).toContainText(codeLine1) + await expect(page.locator('.cm-content')).toContainText(codeLine2) + + await page + .getByRole('button', { name: 'line Line', exact: true }) + .first() + .click() + await u.openAndClearDebugPanel() + await page.getByRole('button', { name: 'Exit Sketch' }).click() + await u.expectCmdLog('[data-message-type="execution-done"]') + + await u.clearCommandLogs() + await u.removeCurrentCode() + } + + const planeConfigs = [ + { + plane: 'XY', + coords: { x: 600, y: 388 }, + description: 'red plane', + }, + { + plane: 'YZ', + coords: { x: 700, y: 250 }, + description: 'green plane', + }, + { + plane: 'XZ', + coords: { x: 684, y: 427 }, + description: 'blue plane', + }, + { + plane: '-XY', + coords: { x: 600, y: 118 }, + description: 'back of red plane', + }, + { + plane: '-YZ', + coords: { x: 700, y: 219 }, + description: 'back of green plane', + }, + { + plane: '-XZ', + coords: { x: 700, y: 80 }, + description: 'back of blue plane', + }, + ] + + for (const config of planeConfigs) { + test(config.plane, async ({ page, homePage, scene, toolbar, cmdBar }) => { + await sketchOnPlaneAndBackSideTest( + page, + homePage, + scene, + toolbar, + cmdBar, config.plane, config.coords ) diff --git a/e2e/playwright/fixtures/toolbarFixture.ts b/e2e/playwright/fixtures/toolbarFixture.ts index f1be93061..2e6267329 100644 --- a/e2e/playwright/fixtures/toolbarFixture.ts +++ b/e2e/playwright/fixtures/toolbarFixture.ts @@ -274,6 +274,13 @@ export class ToolbarFixture { .nth(operationIndex) } + getDefaultPlaneVisibilityButton(plane: 'XY' | 'XZ' | 'YZ' = 'XY') { + const index = plane === 'XZ' ? 0 : plane === 'XY' ? 1 : 2 + return this.featureTreePane + .getByTestId('feature-tree-visibility-toggle') + .nth(index) + } + /** * View source on a specific operation in the Feature Tree pane. * @param operationName The name of the operation type diff --git a/src/components/CustomIcon.tsx b/src/components/CustomIcon.tsx index b5e8f2d94..938aabd11 100644 --- a/src/components/CustomIcon.tsx +++ b/src/components/CustomIcon.tsx @@ -107,7 +107,12 @@ const CustomIconMap = { ), beaker: ( - + ), chat: ( - + ), elephant: ( - + ), eyeOpen: ( - + ), eyeCrossedOut: ( - + ), helix: ( - + ), hollow: ( - + ), loading: ( - + ), model: ( - + ), play: ( - + ), patternCircular2d: ( - + ), patternCircular3d: ( - + ), patternLinear2d: ( - + ), patternLinear3d: ( - + ), sparkles: ( - + ), infinity: ( - + ), star: ( - + { }, [props.onVisibilityChange]) return ( -