Compare commits
9 Commits
franknoiro
...
nightly-v2
Author | SHA1 | Date | |
---|---|---|---|
157b76cc78 | |||
cf957d880e | |||
dfc3d19677 | |||
dd370a9365 | |||
2274d6459c | |||
32ce857119 | |||
88b51da417 | |||
30d365aeb3 | |||
7af62399ac |
1
.gitignore
vendored
1
.gitignore
vendored
@ -61,6 +61,7 @@ Mac_App_Distribution.provisionprofile
|
||||
*.tsbuildinfo
|
||||
src/wasm-lib/pkg
|
||||
|
||||
.eslintcache
|
||||
venv
|
||||
.vite/
|
||||
|
||||
|
File diff suppressed because one or more lines are too long
@ -78970,7 +78970,7 @@
|
||||
"model = import(\"tests/inputs/cube.gltf\")",
|
||||
"model = import(\"tests/inputs/cube.sldprt\")",
|
||||
"model = import(\"tests/inputs/cube.step\")",
|
||||
"import height, buildSketch from 'common.kcl'\n\nplane = 'XZ'\nmargin = 2\ns1 = buildSketch(plane, [0, 0])\ns2 = buildSketch(plane, [0, height() + margin])"
|
||||
"import height, buildSketch from \"common.kcl\"\n\nplane = 'XZ'\nmargin = 2\ns1 = buildSketch(plane, [0, 0])\ns2 = buildSketch(plane, [0, height() + margin])"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
@ -458,8 +458,8 @@ test.describe('Editor tests', () => {
|
||||
|
||||
/* add the following code to the editor ($ error is not a valid line)
|
||||
$ error
|
||||
const topAng = 30
|
||||
const bottomAng = 25
|
||||
topAng = 30
|
||||
bottomAng = 25
|
||||
*/
|
||||
await u.codeLocator.click()
|
||||
await page.keyboard.type('$ error')
|
||||
@ -474,12 +474,14 @@ test.describe('Editor tests', () => {
|
||||
await page.keyboard.type('bottomAng = 25')
|
||||
await page.keyboard.press('Enter')
|
||||
|
||||
// error in guter
|
||||
// error in gutter
|
||||
await expect(page.locator('.cm-lint-marker-error')).toBeVisible()
|
||||
|
||||
// error text on hover
|
||||
await page.hover('.cm-lint-marker-error')
|
||||
await expect(page.getByText('Unexpected token: $').first()).toBeVisible()
|
||||
await expect(
|
||||
page.getByText('Tag names must not be empty').first()
|
||||
).toBeVisible()
|
||||
|
||||
// select the line that's causing the error and delete it
|
||||
await page.getByText('$ error').click()
|
||||
|
@ -136,6 +136,335 @@ test(
|
||||
}
|
||||
)
|
||||
|
||||
test(
|
||||
'open a file in a project works and renders, open another file in different project with errors, it should clear the scene',
|
||||
{ tag: '@electron' },
|
||||
async ({ browserName }, testInfo) => {
|
||||
const { electronApp, page } = await setupElectron({
|
||||
testInfo,
|
||||
folderSetupFn: async (dir) => {
|
||||
const bracketDir = join(dir, 'bracket')
|
||||
await fsp.mkdir(bracketDir, { recursive: true })
|
||||
await fsp.copyFile(
|
||||
executorInputPath('focusrite_scarlett_mounting_braket.kcl'),
|
||||
join(bracketDir, 'main.kcl')
|
||||
)
|
||||
const errorDir = join(dir, 'broken-code')
|
||||
await fsp.mkdir(errorDir, { recursive: true })
|
||||
await fsp.copyFile(
|
||||
executorInputPath('broken-code-test.kcl'),
|
||||
join(errorDir, 'main.kcl')
|
||||
)
|
||||
},
|
||||
})
|
||||
|
||||
await page.setViewportSize({ width: 1200, height: 500 })
|
||||
const u = await getUtils(page)
|
||||
|
||||
page.on('console', console.log)
|
||||
|
||||
const pointOnModel = { x: 630, y: 280 }
|
||||
|
||||
await test.step('Opening the bracket project should load the stream', async () => {
|
||||
// expect to see the text bracket
|
||||
await expect(page.getByText('bracket')).toBeVisible()
|
||||
|
||||
await page.getByText('bracket').click()
|
||||
|
||||
await expect(page.getByTestId('loading')).toBeAttached()
|
||||
await expect(page.getByTestId('loading')).not.toBeAttached({
|
||||
timeout: 20_000,
|
||||
})
|
||||
|
||||
await expect(
|
||||
page.getByRole('button', { name: 'Start Sketch' })
|
||||
).toBeEnabled({
|
||||
timeout: 20_000,
|
||||
})
|
||||
|
||||
// gray at this pixel means the stream has loaded in the most
|
||||
// user way we can verify it (pixel color)
|
||||
await expect
|
||||
.poll(() => u.getGreatestPixDiff(pointOnModel, [85, 85, 85]), {
|
||||
timeout: 10_000,
|
||||
})
|
||||
.toBeLessThan(15)
|
||||
})
|
||||
|
||||
await test.step('Clicking the logo takes us back to the projects page / home', async () => {
|
||||
await page.getByTestId('app-logo').click()
|
||||
|
||||
await expect(page.getByRole('link', { name: 'bracket' })).toBeVisible()
|
||||
await expect(page.getByText('broken-code')).toBeVisible()
|
||||
await expect(page.getByText('bracket')).toBeVisible()
|
||||
await expect(page.getByText('New Project')).toBeVisible()
|
||||
})
|
||||
await test.step('opening broken code project should clear the scene and show the error', async () => {
|
||||
// Go back home.
|
||||
await expect(page.getByText('broken-code')).toBeVisible()
|
||||
|
||||
await page.getByText('broken-code').click()
|
||||
|
||||
// error in guter
|
||||
await expect(page.locator('.cm-lint-marker-error')).toBeVisible()
|
||||
|
||||
// error text on hover
|
||||
await page.hover('.cm-lint-marker-error')
|
||||
const crypticErrorText = `Expected a tag declarator`
|
||||
await expect(page.getByText(crypticErrorText).first()).toBeVisible()
|
||||
|
||||
// black pixel means the scene has been cleared.
|
||||
await expect
|
||||
.poll(() => u.getGreatestPixDiff(pointOnModel, [30, 30, 30]), {
|
||||
timeout: 10_000,
|
||||
})
|
||||
.toBeLessThan(15)
|
||||
})
|
||||
|
||||
await electronApp.close()
|
||||
}
|
||||
)
|
||||
|
||||
test(
|
||||
'open a file in a project works and renders, open another file in different project that is empty, it should clear the scene',
|
||||
{ tag: '@electron' },
|
||||
async ({ browserName }, testInfo) => {
|
||||
const { electronApp, page } = await setupElectron({
|
||||
testInfo,
|
||||
folderSetupFn: async (dir) => {
|
||||
const bracketDir = join(dir, 'bracket')
|
||||
await fsp.mkdir(bracketDir, { recursive: true })
|
||||
await fsp.copyFile(
|
||||
executorInputPath('focusrite_scarlett_mounting_braket.kcl'),
|
||||
join(bracketDir, 'main.kcl')
|
||||
)
|
||||
const emptyDir = join(dir, 'empty')
|
||||
await fsp.mkdir(emptyDir, { recursive: true })
|
||||
await fsp.writeFile(join(emptyDir, 'main.kcl'), '')
|
||||
},
|
||||
})
|
||||
|
||||
await page.setViewportSize({ width: 1200, height: 500 })
|
||||
const u = await getUtils(page)
|
||||
|
||||
page.on('console', console.log)
|
||||
|
||||
const pointOnModel = { x: 630, y: 280 }
|
||||
|
||||
await test.step('Opening the bracket project should load the stream', async () => {
|
||||
// expect to see the text bracket
|
||||
await expect(page.getByText('bracket')).toBeVisible()
|
||||
|
||||
await page.getByText('bracket').click()
|
||||
|
||||
await expect(page.getByTestId('loading')).toBeAttached()
|
||||
await expect(page.getByTestId('loading')).not.toBeAttached({
|
||||
timeout: 20_000,
|
||||
})
|
||||
|
||||
await expect(
|
||||
page.getByRole('button', { name: 'Start Sketch' })
|
||||
).toBeEnabled({
|
||||
timeout: 20_000,
|
||||
})
|
||||
|
||||
// gray at this pixel means the stream has loaded in the most
|
||||
// user way we can verify it (pixel color)
|
||||
await expect
|
||||
.poll(() => u.getGreatestPixDiff(pointOnModel, [85, 85, 85]), {
|
||||
timeout: 10_000,
|
||||
})
|
||||
.toBeLessThan(15)
|
||||
})
|
||||
|
||||
await test.step('Clicking the logo takes us back to the projects page / home', async () => {
|
||||
await page.getByTestId('app-logo').click()
|
||||
|
||||
await expect(page.getByRole('link', { name: 'bracket' })).toBeVisible()
|
||||
await expect(page.getByText('empty')).toBeVisible()
|
||||
await expect(page.getByText('bracket')).toBeVisible()
|
||||
await expect(page.getByText('New Project')).toBeVisible()
|
||||
})
|
||||
await test.step('opening empty code project should clear the scene', async () => {
|
||||
// Go back home.
|
||||
await expect(page.getByText('empty')).toBeVisible()
|
||||
|
||||
await page.getByText('empty').click()
|
||||
|
||||
// Ensure the code is empty.
|
||||
await expect(u.codeLocator).toContainText('')
|
||||
expect(u.codeLocator.innerHTML.length).toBeLessThan(2)
|
||||
|
||||
// planes colors means the scene has been cleared.
|
||||
await expect
|
||||
.poll(() => u.getGreatestPixDiff(pointOnModel, [92, 53, 53]), {
|
||||
timeout: 10_000,
|
||||
})
|
||||
.toBeLessThan(15)
|
||||
})
|
||||
|
||||
await electronApp.close()
|
||||
}
|
||||
)
|
||||
|
||||
test(
|
||||
'open a file in a project works and renders, open empty file, it should clear the scene',
|
||||
{ tag: '@electron' },
|
||||
async ({ browserName }, testInfo) => {
|
||||
const { electronApp, page } = await setupElectron({
|
||||
testInfo,
|
||||
folderSetupFn: async (dir) => {
|
||||
const bracketDir = join(dir, 'bracket')
|
||||
await fsp.mkdir(bracketDir, { recursive: true })
|
||||
await fsp.copyFile(
|
||||
executorInputPath('focusrite_scarlett_mounting_braket.kcl'),
|
||||
join(bracketDir, 'main.kcl')
|
||||
)
|
||||
|
||||
await fsp.writeFile(join(bracketDir, 'empty.kcl'), '')
|
||||
},
|
||||
})
|
||||
|
||||
await page.setViewportSize({ width: 1200, height: 500 })
|
||||
const u = await getUtils(page)
|
||||
|
||||
page.on('console', console.log)
|
||||
|
||||
const pointOnModel = { x: 630, y: 280 }
|
||||
|
||||
await test.step('Opening the bracket project should load the stream', async () => {
|
||||
// expect to see the text bracket
|
||||
await expect(page.getByText('bracket')).toBeVisible()
|
||||
|
||||
await page.getByText('bracket').click()
|
||||
|
||||
await expect(page.getByTestId('loading')).toBeAttached()
|
||||
await expect(page.getByTestId('loading')).not.toBeAttached({
|
||||
timeout: 20_000,
|
||||
})
|
||||
|
||||
await expect(
|
||||
page.getByRole('button', { name: 'Start Sketch' })
|
||||
).toBeEnabled({
|
||||
timeout: 20_000,
|
||||
})
|
||||
|
||||
// gray at this pixel means the stream has loaded in the most
|
||||
// user way we can verify it (pixel color)
|
||||
await expect
|
||||
.poll(() => u.getGreatestPixDiff(pointOnModel, [85, 85, 85]), {
|
||||
timeout: 10_000,
|
||||
})
|
||||
.toBeLessThan(15)
|
||||
})
|
||||
await test.step('creating a empty file should clear the scene', async () => {
|
||||
// open the file pane.
|
||||
await page.getByTestId('files-pane-button').click()
|
||||
|
||||
// OPen the other file.
|
||||
const file = page.getByRole('button', { name: 'empty.kcl' })
|
||||
await expect(file).toBeVisible()
|
||||
|
||||
await file.click()
|
||||
|
||||
// planes colors means the scene has been cleared.
|
||||
await expect
|
||||
.poll(() => u.getGreatestPixDiff(pointOnModel, [92, 53, 53]), {
|
||||
timeout: 10_000,
|
||||
})
|
||||
.toBeLessThan(15)
|
||||
|
||||
// Ensure the code is empty.
|
||||
await expect(u.codeLocator).toContainText('')
|
||||
expect(u.codeLocator.innerHTML.length).toBeLessThan(2)
|
||||
})
|
||||
|
||||
await electronApp.close()
|
||||
}
|
||||
)
|
||||
|
||||
test(
|
||||
'open a file in a project works and renders, open another file in the same project with errors, it should clear the scene',
|
||||
{ tag: '@electron' },
|
||||
async ({ browserName }, testInfo) => {
|
||||
const { electronApp, page } = await setupElectron({
|
||||
testInfo,
|
||||
folderSetupFn: async (dir) => {
|
||||
const bracketDir = join(dir, 'bracket')
|
||||
await fsp.mkdir(bracketDir, { recursive: true })
|
||||
await fsp.copyFile(
|
||||
executorInputPath('focusrite_scarlett_mounting_braket.kcl'),
|
||||
join(bracketDir, 'main.kcl')
|
||||
)
|
||||
await fsp.copyFile(
|
||||
executorInputPath('broken-code-test.kcl'),
|
||||
join(bracketDir, 'broken-code-test.kcl')
|
||||
)
|
||||
},
|
||||
})
|
||||
|
||||
await page.setViewportSize({ width: 1200, height: 500 })
|
||||
const u = await getUtils(page)
|
||||
|
||||
page.on('console', console.log)
|
||||
|
||||
const pointOnModel = { x: 630, y: 280 }
|
||||
|
||||
await test.step('Opening the bracket project should load the stream', async () => {
|
||||
// expect to see the text bracket
|
||||
await expect(page.getByText('bracket')).toBeVisible()
|
||||
|
||||
await page.getByText('bracket').click()
|
||||
|
||||
await expect(page.getByTestId('loading')).toBeAttached()
|
||||
await expect(page.getByTestId('loading')).not.toBeAttached({
|
||||
timeout: 20_000,
|
||||
})
|
||||
|
||||
await expect(
|
||||
page.getByRole('button', { name: 'Start Sketch' })
|
||||
).toBeEnabled({
|
||||
timeout: 20_000,
|
||||
})
|
||||
|
||||
// gray at this pixel means the stream has loaded in the most
|
||||
// user way we can verify it (pixel color)
|
||||
await expect
|
||||
.poll(() => u.getGreatestPixDiff(pointOnModel, [85, 85, 85]), {
|
||||
timeout: 10_000,
|
||||
})
|
||||
.toBeLessThan(15)
|
||||
})
|
||||
await test.step('opening broken code file should clear the scene and show the error', async () => {
|
||||
// open the file pane.
|
||||
await page.getByTestId('files-pane-button').click()
|
||||
|
||||
// OPen the other file.
|
||||
const file = page.getByRole('button', { name: 'broken-code-test.kcl' })
|
||||
await expect(file).toBeVisible()
|
||||
|
||||
await file.click()
|
||||
|
||||
// error in guter
|
||||
await expect(page.locator('.cm-lint-marker-error')).toBeVisible()
|
||||
|
||||
// error text on hover
|
||||
await page.hover('.cm-lint-marker-error')
|
||||
const crypticErrorText = `Expected a tag declarator`
|
||||
await expect(page.getByText(crypticErrorText).first()).toBeVisible()
|
||||
|
||||
// black pixel means the scene has been cleared.
|
||||
await expect
|
||||
.poll(() => u.getGreatestPixDiff(pointOnModel, [30, 30, 30]), {
|
||||
timeout: 10_000,
|
||||
})
|
||||
.toBeLessThan(15)
|
||||
})
|
||||
|
||||
await electronApp.close()
|
||||
}
|
||||
)
|
||||
|
||||
test(
|
||||
'when code with error first loads you get errors in console',
|
||||
{ tag: '@electron' },
|
||||
|
@ -158,6 +158,7 @@
|
||||
"@electron/rebuild": "^3.6.0",
|
||||
"@iarna/toml": "^2.2.5",
|
||||
"@lezer/generator": "^1.7.1",
|
||||
"@nabla/vite-plugin-eslint": "^2.0.5",
|
||||
"@playwright/test": "^1.46.1",
|
||||
"@testing-library/jest-dom": "^5.14.1",
|
||||
"@testing-library/react": "^15.0.2",
|
||||
@ -170,7 +171,7 @@
|
||||
"@types/pixelmatch": "^5.2.6",
|
||||
"@types/pngjs": "^6.0.4",
|
||||
"@types/react": "^18.3.4",
|
||||
"@types/react-dom": "^18.2.25",
|
||||
"@types/react-dom": "^18.3.1",
|
||||
"@types/react-modal": "^3.16.3",
|
||||
"@types/three": "^0.163.0",
|
||||
"@types/ua-parser-js": "^0.7.39",
|
||||
@ -207,7 +208,6 @@
|
||||
"ts-node": "^10.0.0",
|
||||
"typescript": "^5.7.2",
|
||||
"vite": "^5.4.6",
|
||||
"vite-plugin-eslint": "^1.8.1",
|
||||
"vite-plugin-package-version": "^1.1.0",
|
||||
"vite-tsconfig-paths": "^4.3.2",
|
||||
"vitest": "^1.6.0",
|
||||
|
@ -701,8 +701,7 @@ export class SceneEntities {
|
||||
'VariableDeclaration'
|
||||
)
|
||||
if (trap(_node1)) return Promise.reject(_node1)
|
||||
const variableDeclarationName =
|
||||
_node1.node?.declarations?.[0]?.id?.name || ''
|
||||
const variableDeclarationName = _node1.node?.declaration.id?.name || ''
|
||||
|
||||
const sg = sketchFromKclValue(
|
||||
kclManager.programMemory.get(variableDeclarationName),
|
||||
@ -902,10 +901,9 @@ export class SceneEntities {
|
||||
'VariableDeclaration'
|
||||
)
|
||||
if (trap(_node1)) return Promise.reject(_node1)
|
||||
const variableDeclarationName =
|
||||
_node1.node?.declarations?.[0]?.id?.name || ''
|
||||
const startSketchOn = _node1.node?.declarations
|
||||
const startSketchOnInit = startSketchOn?.[0]?.init
|
||||
const variableDeclarationName = _node1.node?.declaration.id?.name || ''
|
||||
const startSketchOn = _node1.node?.declaration
|
||||
const startSketchOnInit = startSketchOn?.init
|
||||
|
||||
const tags: [string, string, string] = [
|
||||
findUniqueName(_ast, 'rectangleSegmentA'),
|
||||
@ -913,7 +911,7 @@ export class SceneEntities {
|
||||
findUniqueName(_ast, 'rectangleSegmentC'),
|
||||
]
|
||||
|
||||
startSketchOn[0].init = createPipeExpression([
|
||||
startSketchOn.init = createPipeExpression([
|
||||
startSketchOnInit,
|
||||
...getRectangleCallExpressions(rectangleOrigin, tags),
|
||||
])
|
||||
@ -943,7 +941,7 @@ export class SceneEntities {
|
||||
'VariableDeclaration'
|
||||
)
|
||||
if (trap(_node)) return Promise.reject(_node)
|
||||
const sketchInit = _node.node?.declarations?.[0]?.init
|
||||
const sketchInit = _node.node?.declaration.init
|
||||
|
||||
const x = (args.intersectionPoint.twoD.x || 0) - rectangleOrigin[0]
|
||||
const y = (args.intersectionPoint.twoD.y || 0) - rectangleOrigin[1]
|
||||
@ -992,7 +990,7 @@ export class SceneEntities {
|
||||
'VariableDeclaration'
|
||||
)
|
||||
if (trap(_node)) return
|
||||
const sketchInit = _node.node?.declarations?.[0]?.init
|
||||
const sketchInit = _node.node?.declaration.init
|
||||
|
||||
if (sketchInit.type !== 'PipeExpression') {
|
||||
return
|
||||
@ -1058,10 +1056,9 @@ export class SceneEntities {
|
||||
if (trap(_node1)) return Promise.reject(_node1)
|
||||
|
||||
// startSketchOn already exists
|
||||
const variableDeclarationName =
|
||||
_node1.node?.declarations?.[0]?.id?.name || ''
|
||||
const startSketchOn = _node1.node?.declarations
|
||||
const startSketchOnInit = startSketchOn?.[0]?.init
|
||||
const variableDeclarationName = _node1.node?.declaration.id?.name || ''
|
||||
const startSketchOn = _node1.node?.declaration
|
||||
const startSketchOnInit = startSketchOn?.init
|
||||
|
||||
const tags: [string, string, string] = [
|
||||
findUniqueName(_ast, 'rectangleSegmentA'),
|
||||
@ -1069,7 +1066,7 @@ export class SceneEntities {
|
||||
findUniqueName(_ast, 'rectangleSegmentC'),
|
||||
]
|
||||
|
||||
startSketchOn[0].init = createPipeExpression([
|
||||
startSketchOn.init = createPipeExpression([
|
||||
startSketchOnInit,
|
||||
...getRectangleCallExpressions(rectangleOrigin, tags),
|
||||
])
|
||||
@ -1099,7 +1096,7 @@ export class SceneEntities {
|
||||
'VariableDeclaration'
|
||||
)
|
||||
if (trap(_node)) return Promise.reject(_node)
|
||||
const sketchInit = _node.node?.declarations?.[0]?.init
|
||||
const sketchInit = _node.node?.declaration.init
|
||||
|
||||
const x = (args.intersectionPoint.twoD.x || 0) - rectangleOrigin[0]
|
||||
const y = (args.intersectionPoint.twoD.y || 0) - rectangleOrigin[1]
|
||||
@ -1155,7 +1152,7 @@ export class SceneEntities {
|
||||
'VariableDeclaration'
|
||||
)
|
||||
if (trap(_node)) return
|
||||
const sketchInit = _node.node?.declarations?.[0]?.init
|
||||
const sketchInit = _node.node?.declaration.init
|
||||
|
||||
if (sketchInit.type === 'PipeExpression') {
|
||||
updateCenterRectangleSketch(
|
||||
@ -1224,12 +1221,11 @@ export class SceneEntities {
|
||||
'VariableDeclaration'
|
||||
)
|
||||
if (trap(_node1)) return Promise.reject(_node1)
|
||||
const variableDeclarationName =
|
||||
_node1.node?.declarations?.[0]?.id?.name || ''
|
||||
const startSketchOn = _node1.node?.declarations
|
||||
const startSketchOnInit = startSketchOn?.[0]?.init
|
||||
const variableDeclarationName = _node1.node?.declaration.id?.name || ''
|
||||
const startSketchOn = _node1.node?.declaration
|
||||
const startSketchOnInit = startSketchOn?.init
|
||||
|
||||
startSketchOn[0].init = createPipeExpression([
|
||||
startSketchOn.init = createPipeExpression([
|
||||
startSketchOnInit,
|
||||
createCallExpressionStdLib('circle', [
|
||||
createObjectExpression({
|
||||
@ -1271,7 +1267,7 @@ export class SceneEntities {
|
||||
)
|
||||
let modded = structuredClone(truncatedAst)
|
||||
if (trap(_node)) return
|
||||
const sketchInit = _node.node?.declarations?.[0]?.init
|
||||
const sketchInit = _node.node.declaration.init
|
||||
|
||||
const x = (args.intersectionPoint.twoD.x || 0) - circleCenter[0]
|
||||
const y = (args.intersectionPoint.twoD.y || 0) - circleCenter[1]
|
||||
@ -1339,7 +1335,7 @@ export class SceneEntities {
|
||||
'VariableDeclaration'
|
||||
)
|
||||
if (trap(_node)) return
|
||||
const sketchInit = _node.node?.declarations?.[0]?.init
|
||||
const sketchInit = _node.node?.declaration.init
|
||||
|
||||
let modded = structuredClone(_ast)
|
||||
if (sketchInit.type === 'PipeExpression') {
|
||||
@ -2060,7 +2056,7 @@ function prepareTruncatedMemoryAndAst(
|
||||
'VariableDeclaration'
|
||||
)
|
||||
if (err(_node)) return _node
|
||||
const variableDeclarationName = _node.node?.declarations?.[0]?.id?.name || ''
|
||||
const variableDeclarationName = _node.node?.declaration.id?.name || ''
|
||||
const sg = sketchFromKclValue(
|
||||
programMemory.get(variableDeclarationName),
|
||||
variableDeclarationName
|
||||
@ -2085,7 +2081,7 @@ function prepareTruncatedMemoryAndAst(
|
||||
])
|
||||
}
|
||||
;(
|
||||
(_ast.body[bodyIndex] as VariableDeclaration).declarations[0]
|
||||
(_ast.body[bodyIndex] as VariableDeclaration).declaration
|
||||
.init as PipeExpression
|
||||
).body.push(newSegment)
|
||||
// update source ranges to section we just added.
|
||||
@ -2096,19 +2092,19 @@ function prepareTruncatedMemoryAndAst(
|
||||
const updatedSrcRangeAst = pResult.program
|
||||
|
||||
const lastPipeItem = (
|
||||
(updatedSrcRangeAst.body[bodyIndex] as VariableDeclaration)
|
||||
.declarations[0].init as PipeExpression
|
||||
(updatedSrcRangeAst.body[bodyIndex] as VariableDeclaration).declaration
|
||||
.init as PipeExpression
|
||||
).body.slice(-1)[0]
|
||||
|
||||
;(
|
||||
(_ast.body[bodyIndex] as VariableDeclaration).declarations[0]
|
||||
(_ast.body[bodyIndex] as VariableDeclaration).declaration
|
||||
.init as PipeExpression
|
||||
).body.slice(-1)[0].start = lastPipeItem.start
|
||||
|
||||
_ast.end = lastPipeItem.end
|
||||
const varDec = _ast.body[bodyIndex] as Node<VariableDeclaration>
|
||||
varDec.end = lastPipeItem.end
|
||||
const declarator = varDec.declarations[0]
|
||||
const declarator = varDec.declaration
|
||||
declarator.end = lastPipeItem.end
|
||||
const init = declarator.init as Node<PipeExpression>
|
||||
init.end = lastPipeItem.end
|
||||
@ -2145,7 +2141,7 @@ function prepareTruncatedMemoryAndAst(
|
||||
if (node.type !== 'VariableDeclaration') {
|
||||
continue
|
||||
}
|
||||
const name = node.declarations[0].id.name
|
||||
const name = node.declaration.id.name
|
||||
const memoryItem = programMemory.get(name)
|
||||
if (!memoryItem) {
|
||||
continue
|
||||
|
@ -169,11 +169,11 @@ export function useCalc({
|
||||
const resultDeclaration = ast.body.find(
|
||||
(a) =>
|
||||
a.type === 'VariableDeclaration' &&
|
||||
a.declarations?.[0]?.id?.name === '__result__'
|
||||
a.declaration.id?.name === '__result__'
|
||||
)
|
||||
const init =
|
||||
resultDeclaration?.type === 'VariableDeclaration' &&
|
||||
resultDeclaration?.declarations?.[0]?.init
|
||||
resultDeclaration?.declaration.init
|
||||
const result = execState.memory?.get('__result__')?.value
|
||||
setCalcResult(typeof result === 'number' ? String(result) : 'NAN')
|
||||
init && setValueNode(init)
|
||||
|
@ -266,6 +266,7 @@ const FileTreeItem = ({
|
||||
// Let the lsp servers know we closed a file.
|
||||
onFileClose(currentFile?.path || null, project?.path || null)
|
||||
onFileOpen(fileOrDir.path, project?.path || null)
|
||||
kclManager.switchedFiles = true
|
||||
|
||||
// Open kcl files
|
||||
navigate(`${PATHS.FILE}/${encodeURIComponent(fileOrDir.path)}`)
|
||||
|
@ -40,7 +40,9 @@ export const KclEditorMenu = ({ children }: PropsWithChildren) => {
|
||||
<Menu.Items className="absolute right-0 left-auto w-72 flex flex-col gap-1 divide-y divide-chalkboard-20 dark:divide-chalkboard-70 align-stretch px-0 py-1 bg-chalkboard-10 dark:bg-chalkboard-100 rounded-sm shadow-lg border border-solid border-chalkboard-20/50 dark:border-chalkboard-80/50">
|
||||
<Menu.Item>
|
||||
<button
|
||||
onClick={() => kclManager.format()}
|
||||
onClick={() => {
|
||||
kclManager.format().catch(reportRejection)
|
||||
}}
|
||||
className={styles.button}
|
||||
>
|
||||
<span>Format code</span>
|
||||
|
@ -10,7 +10,7 @@ import { APP_NAME } from 'lib/constants'
|
||||
import { useCommandsContext } from 'hooks/useCommandsContext'
|
||||
import { CustomIcon } from './CustomIcon'
|
||||
import { useLspContext } from './LspProvider'
|
||||
import { engineCommandManager } from 'lib/singletons'
|
||||
import { engineCommandManager, kclManager } from 'lib/singletons'
|
||||
import { MachineManagerContext } from 'components/MachineManagerProvider'
|
||||
import usePlatform from 'hooks/usePlatform'
|
||||
import { useAbsoluteFilePath } from 'hooks/useAbsoluteFilePath'
|
||||
@ -68,8 +68,7 @@ function AppLogoLink({
|
||||
data-testid="app-logo"
|
||||
onClick={() => {
|
||||
onProjectClose(file || null, project?.path || null, false)
|
||||
// Clear the scene.
|
||||
engineCommandManager.clearScene()
|
||||
kclManager.switchedFiles = true
|
||||
}}
|
||||
to={PATHS.HOME}
|
||||
className={wrapperClassName + ' hover:before:brightness-110'}
|
||||
@ -190,8 +189,7 @@ function ProjectMenuPopover({
|
||||
className: !isDesktop() ? 'hidden' : '',
|
||||
onClick: () => {
|
||||
onProjectClose(file || null, project?.path || null, true)
|
||||
// Clear the scene.
|
||||
engineCommandManager.clearScene()
|
||||
kclManager.switchedFiles = true
|
||||
},
|
||||
},
|
||||
].filter(
|
||||
|
@ -12,6 +12,7 @@ import { EXECUTE_AST_INTERRUPT_ERROR_MESSAGE } from 'lib/constants'
|
||||
|
||||
import {
|
||||
CallExpression,
|
||||
clearSceneAndBustCache,
|
||||
emptyExecState,
|
||||
ExecState,
|
||||
initPromise,
|
||||
@ -60,6 +61,7 @@ export class KclManager {
|
||||
private _executeIsStale: ExecuteArgs | null = null
|
||||
private _wasmInitFailed = true
|
||||
private _hasErrors = false
|
||||
private _switchedFiles = false
|
||||
|
||||
engineCommandManager: EngineCommandManager
|
||||
|
||||
@ -79,6 +81,10 @@ export class KclManager {
|
||||
this._astCallBack(ast)
|
||||
}
|
||||
|
||||
set switchedFiles(switchedFiles: boolean) {
|
||||
this._switchedFiles = switchedFiles
|
||||
}
|
||||
|
||||
get programMemory() {
|
||||
return this._programMemory
|
||||
}
|
||||
@ -166,8 +172,12 @@ export class KclManager {
|
||||
this.engineCommandManager = engineCommandManager
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
||||
this.ensureWasmInit().then(() => {
|
||||
this.ast = this.safeParse(codeManager.code) || this.ast
|
||||
this.ensureWasmInit().then(async () => {
|
||||
await this.safeParse(codeManager.code).then((ast) => {
|
||||
if (ast) {
|
||||
this.ast = ast
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
@ -211,7 +221,25 @@ export class KclManager {
|
||||
}
|
||||
}
|
||||
|
||||
safeParse(code: string): Node<Program> | null {
|
||||
// (jess) I'm not in love with this, but it ensures we clear the scene and
|
||||
// bust the cache on
|
||||
// errors from parsing when opening new files.
|
||||
// Why not just clear the cache on all parse errors, you ask? well its actually
|
||||
// really nice to keep the cache on parse errors within the same file, and
|
||||
// only bust on engine errors esp if they take a long time to execute and
|
||||
// you hit the wrong key!
|
||||
private async checkIfSwitchedFilesShouldClear() {
|
||||
// If we were switching files and we hit an error on parse we need to bust
|
||||
// the cache and clear the scene.
|
||||
if (this._hasErrors && this._switchedFiles) {
|
||||
await clearSceneAndBustCache(this.engineCommandManager)
|
||||
} else if (this._switchedFiles) {
|
||||
// Reset the switched files boolean.
|
||||
this._switchedFiles = false
|
||||
}
|
||||
}
|
||||
|
||||
async safeParse(code: string): Promise<Node<Program> | null> {
|
||||
const result = parse(code)
|
||||
this.diagnostics = []
|
||||
this._hasErrors = false
|
||||
@ -220,6 +248,8 @@ export class KclManager {
|
||||
const kclerror: KCLError = result as KCLError
|
||||
this.diagnostics = kclErrorsToDiagnostics([kclerror])
|
||||
this._hasErrors = true
|
||||
|
||||
await this.checkIfSwitchedFilesShouldClear()
|
||||
return null
|
||||
}
|
||||
|
||||
@ -228,6 +258,7 @@ export class KclManager {
|
||||
if (result.errors.length > 0) {
|
||||
this._hasErrors = true
|
||||
|
||||
await this.checkIfSwitchedFilesShouldClear()
|
||||
return null
|
||||
}
|
||||
|
||||
@ -353,7 +384,7 @@ export class KclManager {
|
||||
console.error(newCode)
|
||||
return
|
||||
}
|
||||
const newAst = this.safeParse(newCode)
|
||||
const newAst = await this.safeParse(newCode)
|
||||
if (!newAst) {
|
||||
this.clearAst()
|
||||
return
|
||||
@ -408,7 +439,7 @@ export class KclManager {
|
||||
})
|
||||
}
|
||||
async executeCode(zoomToFit?: boolean): Promise<void> {
|
||||
const ast = this.safeParse(codeManager.code)
|
||||
const ast = await this.safeParse(codeManager.code)
|
||||
if (!ast) {
|
||||
this.clearAst()
|
||||
return
|
||||
@ -416,9 +447,9 @@ export class KclManager {
|
||||
this.ast = { ...ast }
|
||||
return this.executeAst({ zoomToFit })
|
||||
}
|
||||
format() {
|
||||
async format() {
|
||||
const originalCode = codeManager.code
|
||||
const ast = this.safeParse(originalCode)
|
||||
const ast = await this.safeParse(originalCode)
|
||||
if (!ast) {
|
||||
this.clearAst()
|
||||
return
|
||||
@ -458,7 +489,7 @@ export class KclManager {
|
||||
const newCode = recast(ast)
|
||||
if (err(newCode)) return Promise.reject(newCode)
|
||||
|
||||
const astWithUpdatedSource = this.safeParse(newCode)
|
||||
const astWithUpdatedSource = await this.safeParse(newCode)
|
||||
if (!astWithUpdatedSource) return Promise.reject(new Error('bad ast'))
|
||||
let returnVal: Selections | undefined = undefined
|
||||
|
||||
|
@ -60,8 +60,7 @@ const b1 = cube([0,0], 10)`
|
||||
expect(nodePath).toEqual([
|
||||
['body', ''],
|
||||
[0, 'index'],
|
||||
['declarations', 'VariableDeclaration'],
|
||||
[0, 'index'],
|
||||
['declaration', 'VariableDeclaration'],
|
||||
['init', ''],
|
||||
['params', 'FunctionExpression'],
|
||||
[0, 'index'],
|
||||
@ -96,14 +95,12 @@ const b1 = cube([0,0], 10)`
|
||||
expect(nodePath).toEqual([
|
||||
['body', ''],
|
||||
[0, 'index'],
|
||||
['declarations', 'VariableDeclaration'],
|
||||
[0, 'index'],
|
||||
['declaration', 'VariableDeclaration'],
|
||||
['init', ''],
|
||||
['body', 'FunctionExpression'],
|
||||
['body', 'FunctionExpression'],
|
||||
[0, 'index'],
|
||||
['declarations', 'VariableDeclaration'],
|
||||
[0, 'index'],
|
||||
['declaration', 'VariableDeclaration'],
|
||||
['init', ''],
|
||||
['body', 'PipeExpression'],
|
||||
[2, 'index'],
|
||||
|
@ -82,11 +82,11 @@ describe('Testing createVariableDeclaration', () => {
|
||||
it('should create a variable declaration', () => {
|
||||
const result = createVariableDeclaration('myVar', createLiteral(5))
|
||||
expect(result.type).toBe('VariableDeclaration')
|
||||
expect(result.declarations[0].type).toBe('VariableDeclarator')
|
||||
expect(result.declarations[0].id.type).toBe('Identifier')
|
||||
expect(result.declarations[0].id.name).toBe('myVar')
|
||||
expect(result.declarations[0].init.type).toBe('Literal')
|
||||
expect((result.declarations[0].init as any).value).toBe(5)
|
||||
expect(result.declaration.type).toBe('VariableDeclarator')
|
||||
expect(result.declaration.id.type).toBe('Identifier')
|
||||
expect(result.declaration.id.name).toBe('myVar')
|
||||
expect(result.declaration.init.type).toBe('Literal')
|
||||
expect((result.declaration.init as any).value).toBe(5)
|
||||
})
|
||||
})
|
||||
describe('Testing createPipeExpression', () => {
|
||||
|
@ -66,8 +66,7 @@ export function startSketchOnDefault(
|
||||
let pathToNode: PathToNode = [
|
||||
['body', ''],
|
||||
[sketchIndex, 'index'],
|
||||
['declarations', 'VariableDeclaration'],
|
||||
['0', 'index'],
|
||||
['declaration', 'VariableDeclaration'],
|
||||
['init', 'VariableDeclarator'],
|
||||
]
|
||||
|
||||
@ -94,7 +93,7 @@ export function addStartProfileAt(
|
||||
return new Error('variableDeclaration.init.type !== PipeExpression')
|
||||
}
|
||||
const _node = { ...node }
|
||||
const init = variableDeclaration.declarations[0].init
|
||||
const init = variableDeclaration.declaration.init
|
||||
const startProfileAt = createCallExpressionStdLib('startProfileAt', [
|
||||
createArrayExpression([
|
||||
createLiteral(roundOff(at[0])),
|
||||
@ -105,7 +104,7 @@ export function addStartProfileAt(
|
||||
if (init.type === 'PipeExpression') {
|
||||
init.body.splice(1, 0, startProfileAt)
|
||||
} else {
|
||||
variableDeclaration.declarations[0].init = createPipeExpression([
|
||||
variableDeclaration.declaration.init = createPipeExpression([
|
||||
init,
|
||||
startProfileAt,
|
||||
])
|
||||
@ -149,8 +148,7 @@ export function addSketchTo(
|
||||
let pathToNode: PathToNode = [
|
||||
['body', ''],
|
||||
[sketchIndex, 'index'],
|
||||
['declarations', 'VariableDeclaration'],
|
||||
['0', 'index'],
|
||||
['declaration', 'VariableDeclaration'],
|
||||
['init', 'VariableDeclarator'],
|
||||
]
|
||||
if (axis !== 'xy') {
|
||||
@ -333,8 +331,7 @@ export function extrudeSketch(
|
||||
const pathToExtrudeArg: PathToNode = [
|
||||
['body', ''],
|
||||
[sketchIndexInBody + 1, 'index'],
|
||||
['declarations', 'VariableDeclaration'],
|
||||
[0, 'index'],
|
||||
['declaration', 'VariableDeclaration'],
|
||||
['init', 'VariableDeclarator'],
|
||||
['arguments', 'CallExpression'],
|
||||
[0, 'index'],
|
||||
@ -364,8 +361,7 @@ export function loftSketches(
|
||||
const pathToNode: PathToNode = [
|
||||
['body', ''],
|
||||
[modifiedAst.body.length - 1, 'index'],
|
||||
['declarations', 'VariableDeclaration'],
|
||||
['0', 'index'],
|
||||
['declaration', 'VariableDeclaration'],
|
||||
['init', 'VariableDeclarator'],
|
||||
['arguments', 'CallExpression'],
|
||||
[0, 'index'],
|
||||
@ -460,8 +456,7 @@ export function revolveSketch(
|
||||
const pathToRevolveArg: PathToNode = [
|
||||
['body', ''],
|
||||
[sketchIndexInBody + 1, 'index'],
|
||||
['declarations', 'VariableDeclaration'],
|
||||
[0, 'index'],
|
||||
['declaration', 'VariableDeclaration'],
|
||||
['init', 'VariableDeclarator'],
|
||||
['arguments', 'CallExpression'],
|
||||
[0, 'index'],
|
||||
@ -547,8 +542,7 @@ export function sketchOnExtrudedFace(
|
||||
const newpathToNode: PathToNode = [
|
||||
['body', ''],
|
||||
[expressionIndex + 1, 'index'],
|
||||
['declarations', 'VariableDeclaration'],
|
||||
[0, 'index'],
|
||||
['declaration', 'VariableDeclaration'],
|
||||
['init', 'VariableDeclarator'],
|
||||
]
|
||||
|
||||
@ -585,8 +579,7 @@ export function addOffsetPlane({
|
||||
const pathToNode: PathToNode = [
|
||||
['body', ''],
|
||||
[modifiedAst.body.length - 1, 'index'],
|
||||
['declarations', 'VariableDeclaration'],
|
||||
['0', 'index'],
|
||||
['declaration', 'VariableDeclaration'],
|
||||
['init', 'VariableDeclarator'],
|
||||
['arguments', 'CallExpression'],
|
||||
[0, 'index'],
|
||||
@ -823,17 +816,15 @@ export function createVariableDeclaration(
|
||||
end: 0,
|
||||
moduleId: 0,
|
||||
|
||||
declarations: [
|
||||
{
|
||||
type: 'VariableDeclarator',
|
||||
start: 0,
|
||||
end: 0,
|
||||
moduleId: 0,
|
||||
declaration: {
|
||||
type: 'VariableDeclarator',
|
||||
start: 0,
|
||||
end: 0,
|
||||
moduleId: 0,
|
||||
|
||||
id: createIdentifier(varName),
|
||||
init,
|
||||
},
|
||||
],
|
||||
id: createIdentifier(varName),
|
||||
init,
|
||||
},
|
||||
visibility,
|
||||
kind,
|
||||
}
|
||||
@ -1120,7 +1111,7 @@ export async function deleteFromSelection(
|
||||
traverse(astClone, {
|
||||
enter: (node, path) => {
|
||||
if (node.type === 'VariableDeclaration') {
|
||||
const dec = node.declarations[0]
|
||||
const dec = node.declaration
|
||||
if (
|
||||
dec.init.type === 'CallExpression' &&
|
||||
(dec.init.callee.name === 'extrude' ||
|
||||
@ -1155,7 +1146,7 @@ export async function deleteFromSelection(
|
||||
enter: (node, path) => {
|
||||
;(async () => {
|
||||
if (node.type === 'VariableDeclaration') {
|
||||
currentVariableName = node.declarations[0].id.name
|
||||
currentVariableName = node.declaration.id.name
|
||||
}
|
||||
if (
|
||||
// match startSketchOn(${extrudeNameToDelete})
|
||||
|
@ -273,7 +273,7 @@ export function getPathToExtrudeForSegmentSelection(
|
||||
'VariableDeclaration'
|
||||
)
|
||||
if (err(varDecNode)) return varDecNode
|
||||
const sketchVar = varDecNode.node.declarations[0].id.name
|
||||
const sketchVar = varDecNode.node.declaration.id.name
|
||||
|
||||
const sketch = sketchFromKclValue(
|
||||
kclManager.programMemory.get(sketchVar),
|
||||
@ -367,7 +367,7 @@ function locateExtrudeDeclarator(
|
||||
if (err(nodeOfExtrudeCall)) return nodeOfExtrudeCall
|
||||
|
||||
const { node: extrudeVarDecl } = nodeOfExtrudeCall
|
||||
const extrudeDeclarator = extrudeVarDecl.declarations[0]
|
||||
const extrudeDeclarator = extrudeVarDecl.declaration
|
||||
if (!extrudeDeclarator) {
|
||||
return new Error('Extrude Declarator not found.')
|
||||
}
|
||||
|
@ -230,8 +230,7 @@ describe('testing getNodePathFromSourceRange', () => {
|
||||
expect(result).toEqual([
|
||||
['body', ''],
|
||||
[0, 'index'],
|
||||
['declarations', 'VariableDeclaration'],
|
||||
[0, 'index'],
|
||||
['declaration', 'VariableDeclaration'],
|
||||
['init', ''],
|
||||
['body', 'PipeExpression'],
|
||||
[2, 'index'],
|
||||
@ -250,8 +249,7 @@ describe('testing getNodePathFromSourceRange', () => {
|
||||
const expected = [
|
||||
['body', ''],
|
||||
[0, 'index'],
|
||||
['declarations', 'VariableDeclaration'],
|
||||
[0, 'index'],
|
||||
['declaration', 'VariableDeclaration'],
|
||||
['init', ''],
|
||||
['body', 'PipeExpression'],
|
||||
[3, 'index'],
|
||||
@ -293,8 +291,7 @@ describe('testing getNodePathFromSourceRange', () => {
|
||||
expect(result).toEqual([
|
||||
['body', ''],
|
||||
[1, 'index'],
|
||||
['declarations', 'VariableDeclaration'],
|
||||
[0, 'index'],
|
||||
['declaration', 'VariableDeclaration'],
|
||||
['init', ''],
|
||||
['cond', 'IfExpression'],
|
||||
['left', 'BinaryExpression'],
|
||||
@ -324,8 +321,7 @@ describe('testing getNodePathFromSourceRange', () => {
|
||||
expect(result).toEqual([
|
||||
['body', ''],
|
||||
[1, 'index'],
|
||||
['declarations', 'VariableDeclaration'],
|
||||
[0, 'index'],
|
||||
['declaration', 'VariableDeclaration'],
|
||||
['init', ''],
|
||||
['then_val', 'IfExpression'],
|
||||
['body', 'IfExpression'],
|
||||
@ -353,7 +349,8 @@ describe('testing getNodePathFromSourceRange', () => {
|
||||
expect(result).toEqual([
|
||||
['body', ''],
|
||||
[0, 'index'],
|
||||
['items', 'ImportStatement'],
|
||||
['selector', 'ImportStatement'],
|
||||
['items', 'ImportSelector'],
|
||||
[1, 'index'],
|
||||
['name', 'ImportItem'],
|
||||
])
|
||||
|
@ -259,34 +259,26 @@ function moreNodePathFromSourceRange(
|
||||
return moreNodePathFromSourceRange(expression, sourceRange, path)
|
||||
}
|
||||
if (_node.type === 'VariableDeclaration' && isInRange) {
|
||||
const declarations = _node.declarations
|
||||
const declaration = _node.declaration
|
||||
|
||||
for (let decIndex = 0; decIndex < declarations.length; decIndex++) {
|
||||
const declaration = declarations[decIndex]
|
||||
if (declaration.start <= start && declaration.end >= end) {
|
||||
path.push(['declarations', 'VariableDeclaration'])
|
||||
path.push([decIndex, 'index'])
|
||||
const init = declaration.init
|
||||
if (init.start <= start && init.end >= end) {
|
||||
path.push(['init', ''])
|
||||
return moreNodePathFromSourceRange(init, sourceRange, path)
|
||||
}
|
||||
if (declaration.start <= start && declaration.end >= end) {
|
||||
path.push(['declaration', 'VariableDeclaration'])
|
||||
const init = declaration.init
|
||||
if (init.start <= start && init.end >= end) {
|
||||
path.push(['init', ''])
|
||||
return moreNodePathFromSourceRange(init, sourceRange, path)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (_node.type === 'VariableDeclaration' && isInRange) {
|
||||
const declarations = _node.declarations
|
||||
const declaration = _node.declaration
|
||||
|
||||
for (let decIndex = 0; decIndex < declarations.length; decIndex++) {
|
||||
const declaration = declarations[decIndex]
|
||||
if (declaration.start <= start && declaration.end >= end) {
|
||||
const init = declaration.init
|
||||
if (init.start <= start && init.end >= end) {
|
||||
path.push(['declarations', 'VariableDeclaration'])
|
||||
path.push([decIndex, 'index'])
|
||||
path.push(['init', ''])
|
||||
return moreNodePathFromSourceRange(init, sourceRange, path)
|
||||
}
|
||||
if (declaration.start <= start && declaration.end >= end) {
|
||||
const init = declaration.init
|
||||
if (init.start <= start && init.end >= end) {
|
||||
path.push(['declaration', 'VariableDeclaration'])
|
||||
path.push(['init', ''])
|
||||
return moreNodePathFromSourceRange(init, sourceRange, path)
|
||||
}
|
||||
}
|
||||
return path
|
||||
@ -380,24 +372,31 @@ function moreNodePathFromSourceRange(
|
||||
}
|
||||
|
||||
if (_node.type === 'ImportStatement' && isInRange) {
|
||||
const { items } = _node
|
||||
for (let i = 0; i < items.length; i++) {
|
||||
const item = items[i]
|
||||
if (item.start <= start && item.end >= end) {
|
||||
path.push(['items', 'ImportStatement'])
|
||||
path.push([i, 'index'])
|
||||
if (item.name.start <= start && item.name.end >= end) {
|
||||
path.push(['name', 'ImportItem'])
|
||||
if (_node.selector && _node.selector.type === 'List') {
|
||||
path.push(['selector', 'ImportStatement'])
|
||||
const { items } = _node.selector
|
||||
for (let i = 0; i < items.length; i++) {
|
||||
const item = items[i]
|
||||
if (item.start <= start && item.end >= end) {
|
||||
path.push(['items', 'ImportSelector'])
|
||||
path.push([i, 'index'])
|
||||
if (item.name.start <= start && item.name.end >= end) {
|
||||
path.push(['name', 'ImportItem'])
|
||||
return path
|
||||
}
|
||||
if (
|
||||
item.alias &&
|
||||
item.alias.start <= start &&
|
||||
item.alias.end >= end
|
||||
) {
|
||||
path.push(['alias', 'ImportItem'])
|
||||
return path
|
||||
}
|
||||
return path
|
||||
}
|
||||
if (item.alias && item.alias.start <= start && item.alias.end >= end) {
|
||||
path.push(['alias', 'ImportItem'])
|
||||
return path
|
||||
}
|
||||
return path
|
||||
}
|
||||
return path
|
||||
}
|
||||
return path
|
||||
}
|
||||
|
||||
console.error('not implemented: ' + node.type)
|
||||
@ -451,13 +450,10 @@ export function traverse(
|
||||
traverse(node, option, pathToNode)
|
||||
|
||||
if (_node.type === 'VariableDeclaration') {
|
||||
_node.declarations.forEach((declaration, index) =>
|
||||
_traverse(declaration, [
|
||||
...pathToNode,
|
||||
['declarations', 'VariableDeclaration'],
|
||||
[index, 'index'],
|
||||
])
|
||||
)
|
||||
_traverse(_node.declaration, [
|
||||
...pathToNode,
|
||||
['declaration', 'VariableDeclaration'],
|
||||
])
|
||||
} else if (_node.type === 'VariableDeclarator') {
|
||||
_traverse(_node.init, [...pathToNode, ['init', '']])
|
||||
} else if (_node.type === 'PipeExpression') {
|
||||
@ -567,7 +563,7 @@ export function findAllPreviousVariablesPath(
|
||||
const variables: PrevVariable<any>[] = []
|
||||
bodyItems?.forEach?.((item) => {
|
||||
if (item.type !== 'VariableDeclaration' || item.end > startRange) return
|
||||
const varName = item.declarations[0].id.name
|
||||
const varName = item.declaration.id.name
|
||||
const varValue = programMemory?.get(varName)
|
||||
if (!varValue || typeof varValue?.value !== type) return
|
||||
variables.push({
|
||||
@ -761,7 +757,7 @@ export function isLinesParallelAndConstrained(
|
||||
const _varDec = getNodeFromPath(ast, primaryPath, 'VariableDeclaration')
|
||||
if (err(_varDec)) return _varDec
|
||||
const varDec = _varDec.node
|
||||
const varName = (varDec as VariableDeclaration)?.declarations[0]?.id?.name
|
||||
const varName = (varDec as VariableDeclaration)?.declaration.id?.name
|
||||
const sg = sketchFromKclValue(programMemory?.get(varName), varName)
|
||||
if (err(sg)) return sg
|
||||
const _primarySegment = getSketchSegmentFromSourceRange(
|
||||
@ -881,7 +877,7 @@ export function hasExtrudeSketch({
|
||||
}
|
||||
const varDec = varDecMeta.node
|
||||
if (varDec.type !== 'VariableDeclaration') return false
|
||||
const varName = varDec.declarations[0].id.name
|
||||
const varName = varDec.declaration.id.name
|
||||
const varValue = programMemory?.get(varName)
|
||||
return (
|
||||
varValue?.type === 'Solid' ||
|
||||
|
@ -1879,17 +1879,6 @@ export class EngineCommandManager extends EventTarget {
|
||||
}
|
||||
return JSON.stringify(this.defaultPlanes)
|
||||
}
|
||||
clearScene(): void {
|
||||
const deleteCmd: EngineCommand = {
|
||||
type: 'modeling_cmd_req',
|
||||
cmd_id: uuidv4(),
|
||||
cmd: {
|
||||
type: 'scene_clear_all',
|
||||
},
|
||||
}
|
||||
this.clearDefaultPlanes()
|
||||
this.engineConnection?.send(deleteCmd)
|
||||
}
|
||||
addCommandLog(message: CommandLog) {
|
||||
if (this.commandLogs.length > 500) {
|
||||
this.commandLogs.shift()
|
||||
|
@ -164,8 +164,7 @@ mySketch001 = startSketchOn('XY')
|
||||
pathToNode: [
|
||||
['body', ''],
|
||||
[0, 'index'],
|
||||
['declarations', 'VariableDeclaration'],
|
||||
[0, 'index'],
|
||||
['declaration', 'VariableDeclaration'],
|
||||
['init', 'VariableDeclarator'],
|
||||
],
|
||||
})
|
||||
@ -189,8 +188,7 @@ mySketch001 = startSketchOn('XY')
|
||||
pathToNode: [
|
||||
['body', ''],
|
||||
[0, 'index'],
|
||||
['declarations', 'VariableDeclaration'],
|
||||
[0, 'index'],
|
||||
['declaration', 'VariableDeclaration'],
|
||||
['init', 'VariableDeclarator'],
|
||||
],
|
||||
})
|
||||
|
@ -1701,7 +1701,7 @@ export const angledLineThatIntersects: SketchLineHelper = {
|
||||
if (err(nodeMeta2)) return nodeMeta2
|
||||
|
||||
const { node: varDec } = nodeMeta2
|
||||
const varName = varDec.declarations[0].id.name
|
||||
const varName = varDec.declaration.id.name
|
||||
const sketch = sketchFromKclValue(
|
||||
previousProgramMemory.get(varName),
|
||||
varName
|
||||
|
@ -111,12 +111,10 @@ export function isSketchVariablesLinked(
|
||||
let nextVarDec: VariableDeclarator | undefined
|
||||
for (const node of ast.body) {
|
||||
if (node.type !== 'VariableDeclaration') continue
|
||||
const found = node.declarations.find(
|
||||
({ id }) => id?.name === secondArg.name
|
||||
)
|
||||
if (!found) continue
|
||||
nextVarDec = found
|
||||
break
|
||||
if (node.declaration.id.name === secondArg.name) {
|
||||
nextVarDec = node.declaration
|
||||
break
|
||||
}
|
||||
}
|
||||
if (!nextVarDec) return false
|
||||
return isSketchVariablesLinked(nextVarDec, primaryVarDec, ast)
|
||||
|
@ -16,6 +16,7 @@ import init, {
|
||||
parse_project_settings,
|
||||
default_project_settings,
|
||||
base64_decode,
|
||||
clear_scene_and_bust_cache,
|
||||
} from '../wasm-lib/pkg/wasm_lib'
|
||||
import { KCLError } from './errors'
|
||||
import { KclError as RustKclError } from '../wasm-lib/kcl/bindings/KclError'
|
||||
@ -698,6 +699,21 @@ export function defaultAppSettings(): DeepPartial<Configuration> | Error {
|
||||
return default_app_settings()
|
||||
}
|
||||
|
||||
export async function clearSceneAndBustCache(
|
||||
engineCommandManager: EngineCommandManager
|
||||
): Promise<null | Error> {
|
||||
try {
|
||||
await clear_scene_and_bust_cache(engineCommandManager)
|
||||
} catch (e: any) {
|
||||
console.error('clear_scene_and_bust_cache: error', e)
|
||||
return Promise.reject(
|
||||
new Error(`Error on clear_scene_and_bust_cache: ${e}`)
|
||||
)
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
|
||||
export function parseAppSettings(
|
||||
toml: string
|
||||
): DeepPartial<Configuration> | Error {
|
||||
|
@ -13,7 +13,6 @@ import {
|
||||
listProjects,
|
||||
readAppSettingsFile,
|
||||
} from './desktop'
|
||||
import { engineCommandManager } from './singletons'
|
||||
|
||||
export const isHidden = (fileOrDir: FileEntry) =>
|
||||
!!fileOrDir.name?.startsWith('.')
|
||||
@ -116,9 +115,6 @@ export async function createAndOpenNewTutorialProject({
|
||||
) => void
|
||||
navigate: (path: string) => void
|
||||
}) {
|
||||
// Clear the scene.
|
||||
engineCommandManager.clearScene()
|
||||
|
||||
// Create a new project with the onboarding project name
|
||||
const configuration = await readAppSettingsFile()
|
||||
const projects = await listProjects(configuration)
|
||||
|
@ -3,27 +3,27 @@ export const bracket = `// Shelf Bracket
|
||||
|
||||
|
||||
// Define constants
|
||||
const sigmaAllow = 35000 // psi (6061-T6 aluminum)
|
||||
const width = 6 // inch
|
||||
const p = 300 // Force on shelf - lbs
|
||||
const factorOfSafety = 1.2 // FOS of 1.2
|
||||
const shelfMountL = 5 // inches
|
||||
const wallMountL = 2 // inches
|
||||
const shelfDepth = 12 // Shelf is 12 inches in depth from the wall
|
||||
const moment = shelfDepth * p // assume the force is applied at the end of the shelf to be conservative (lb-in)
|
||||
sigmaAllow = 35000 // psi (6061-T6 aluminum)
|
||||
width = 6 // inch
|
||||
p = 300 // Force on shelf - lbs
|
||||
factorOfSafety = 1.2 // FOS of 1.2
|
||||
shelfMountL = 5 // inches
|
||||
wallMountL = 2 // inches
|
||||
shelfDepth = 12 // Shelf is 12 inches in depth from the wall
|
||||
moment = shelfDepth * p // assume the force is applied at the end of the shelf to be conservative (lb-in)
|
||||
|
||||
|
||||
const filletRadius = .375 // inches
|
||||
const extFilletRadius = .25 // inches
|
||||
const mountingHoleDiameter = 0.5 // inches
|
||||
filletRadius = .375 // inches
|
||||
extFilletRadius = .25 // inches
|
||||
mountingHoleDiameter = 0.5 // inches
|
||||
|
||||
|
||||
// Calculate required thickness of bracket
|
||||
const thickness = sqrt(moment * factorOfSafety * 6 / (sigmaAllow * width)) // this is the calculation of two brackets holding up the shelf (inches)
|
||||
thickness = sqrt(moment * factorOfSafety * 6 / (sigmaAllow * width)) // this is the calculation of two brackets holding up the shelf (inches)
|
||||
|
||||
|
||||
// Sketch the bracket body and fillet the inner and outer edges of the bend
|
||||
const bracketLeg1Sketch = startSketchOn('XY')
|
||||
bracketLeg1Sketch = startSketchOn('XY')
|
||||
|> startProfileAt([0, 0], %)
|
||||
|> line([shelfMountL - filletRadius, 0], %, $fillet1)
|
||||
|> line([0, width], %, $fillet2)
|
||||
@ -47,7 +47,7 @@ const bracketLeg1Sketch = startSketchOn('XY')
|
||||
}, %), %)
|
||||
|
||||
// Extrude the leg 2 bracket sketch
|
||||
const bracketLeg1Extrude = extrude(thickness, bracketLeg1Sketch)
|
||||
bracketLeg1Extrude = extrude(thickness, bracketLeg1Sketch)
|
||||
|> fillet({
|
||||
radius = extFilletRadius,
|
||||
tags = [
|
||||
@ -57,7 +57,7 @@ const bracketLeg1Extrude = extrude(thickness, bracketLeg1Sketch)
|
||||
}, %)
|
||||
|
||||
// Sketch the fillet arc
|
||||
const filletSketch = startSketchOn('XZ')
|
||||
filletSketch = startSketchOn('XZ')
|
||||
|> startProfileAt([0, 0], %)
|
||||
|> line([0, thickness], %)
|
||||
|> arc({
|
||||
@ -73,10 +73,10 @@ const filletSketch = startSketchOn('XZ')
|
||||
}, %)
|
||||
|
||||
// Sketch the bend
|
||||
const filletExtrude = extrude(-width, filletSketch)
|
||||
filletExtrude = extrude(-width, filletSketch)
|
||||
|
||||
// Create a custom plane for the leg that sits on the wall
|
||||
const customPlane = {
|
||||
customPlane = {
|
||||
plane = {
|
||||
origin = { x = -filletRadius, y = 0, z = 0 },
|
||||
xAxis = { x = 0, y = 1, z = 0 },
|
||||
@ -86,7 +86,7 @@ const customPlane = {
|
||||
}
|
||||
|
||||
// Create a sketch for the second leg
|
||||
const bracketLeg2Sketch = startSketchOn(customPlane)
|
||||
bracketLeg2Sketch = startSketchOn(customPlane)
|
||||
|> startProfileAt([0, -filletRadius], %)
|
||||
|> line([width, 0], %)
|
||||
|> line([0, -wallMountL], %, $fillet3)
|
||||
@ -102,7 +102,7 @@ const bracketLeg2Sketch = startSketchOn(customPlane)
|
||||
}, %), %)
|
||||
|
||||
// Extrude the second leg
|
||||
const bracketLeg2Extrude = extrude(-thickness, bracketLeg2Sketch)
|
||||
bracketLeg2Extrude = extrude(-thickness, bracketLeg2Sketch)
|
||||
|> fillet({
|
||||
radius = extFilletRadius,
|
||||
tags = [
|
||||
@ -135,8 +135,8 @@ function findLineInExampleCode({
|
||||
}
|
||||
|
||||
export const bracketWidthConstantLine = findLineInExampleCode({
|
||||
searchText: 'const width',
|
||||
searchText: 'width =',
|
||||
})
|
||||
export const bracketThicknessCalculationLine = findLineInExampleCode({
|
||||
searchText: 'const thickness',
|
||||
searchText: 'thickness =',
|
||||
})
|
||||
|
@ -5,7 +5,7 @@ import { isDesktop } from './isDesktop'
|
||||
import { FILE_EXT, PROJECT_SETTINGS_FILE_NAME } from './constants'
|
||||
import { UnitLength_type } from '@kittycad/lib/dist/types/src/models'
|
||||
import { parseProjectSettings } from 'lang/wasm'
|
||||
import { err } from './trap'
|
||||
import { err, reportRejection } from './trap'
|
||||
import { projectConfigurationToSettingsPayload } from './settings/settingsUtils'
|
||||
|
||||
interface OnSubmitProps {
|
||||
@ -28,7 +28,7 @@ export function kclCommands(
|
||||
groupId: 'code',
|
||||
icon: 'code',
|
||||
onSubmit: () => {
|
||||
kclManager.format()
|
||||
kclManager.format().catch(reportRejection)
|
||||
},
|
||||
},
|
||||
{
|
||||
|
@ -109,11 +109,11 @@ export function useCalculateKclExpression({
|
||||
const resultDeclaration = ast.body.find(
|
||||
(a) =>
|
||||
a.type === 'VariableDeclaration' &&
|
||||
a.declarations?.[0]?.id?.name === '__result__'
|
||||
a.declaration.id?.name === '__result__'
|
||||
)
|
||||
const init =
|
||||
resultDeclaration?.type === 'VariableDeclaration' &&
|
||||
resultDeclaration?.declarations?.[0]?.init
|
||||
resultDeclaration?.declaration.init
|
||||
const result = execState.memory?.get('__result__')?.value
|
||||
setCalcResult(typeof result === 'number' ? String(result) : 'NAN')
|
||||
init && setValueNode(init)
|
||||
|
@ -2491,7 +2491,7 @@ export function canRectangleOrCircleTool({
|
||||
// This should not be returning false, and it should be caught
|
||||
// but we need to simulate old behavior to move on.
|
||||
if (err(node)) return false
|
||||
return node.node?.declarations?.[0]?.init.type !== 'PipeExpression'
|
||||
return node.node?.declaration.init.type !== 'PipeExpression'
|
||||
}
|
||||
|
||||
/** If the sketch contains `close` or `circle` stdlib functions it must be closed */
|
||||
@ -2508,8 +2508,8 @@ export function isClosedSketch({
|
||||
// This should not be returning false, and it should be caught
|
||||
// but we need to simulate old behavior to move on.
|
||||
if (err(node)) return false
|
||||
if (node.node?.declarations?.[0]?.init.type !== 'PipeExpression') return false
|
||||
return node.node.declarations[0].init.body.some(
|
||||
if (node.node?.declaration.init.type !== 'PipeExpression') return false
|
||||
return node.node.declaration.init.body.some(
|
||||
(node) =>
|
||||
node.type === 'CallExpression' &&
|
||||
(node.callee.name === 'close' || node.callee.name === 'circle')
|
||||
|
@ -395,10 +395,10 @@ fn do_stdlib_inner(
|
||||
#const_struct
|
||||
|
||||
fn #boxed_fn_name_ident(
|
||||
exec_state: &mut crate::executor::ExecState,
|
||||
exec_state: &mut crate::ExecState,
|
||||
args: crate::std::Args,
|
||||
) -> std::pin::Pin<
|
||||
Box<dyn std::future::Future<Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>> + Send + '_>,
|
||||
Box<dyn std::future::Future<Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>> + Send + '_>,
|
||||
> {
|
||||
Box::pin(#fn_name_ident(exec_state, args))
|
||||
}
|
||||
@ -770,12 +770,12 @@ fn generate_code_block_test(fn_name: &str, code_block: &str, index: usize) -> pr
|
||||
#[tokio::test(flavor = "multi_thread")]
|
||||
async fn #test_name_mock() {
|
||||
let program = crate::Program::parse_no_errs(#code_block).unwrap();
|
||||
let ctx = crate::executor::ExecutorContext {
|
||||
let ctx = crate::ExecutorContext {
|
||||
engine: std::sync::Arc::new(Box::new(crate::engine::conn_mock::EngineConnection::new().await.unwrap())),
|
||||
fs: std::sync::Arc::new(crate::fs::FileManager::new()),
|
||||
stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
|
||||
settings: Default::default(),
|
||||
context_type: crate::executor::ContextType::Mock,
|
||||
context_type: crate::execution::ContextType::Mock,
|
||||
};
|
||||
|
||||
ctx.run(program.into(), &mut crate::ExecState::default()).await.unwrap();
|
||||
@ -785,7 +785,7 @@ fn generate_code_block_test(fn_name: &str, code_block: &str, index: usize) -> pr
|
||||
async fn #test_name() {
|
||||
let code = #code_block;
|
||||
// Note, `crate` must be kcl_lib
|
||||
let result = crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm).await.unwrap();
|
||||
let result = crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm, None).await.unwrap();
|
||||
twenty_twenty::assert_image(&format!("tests/outputs/{}.png", #output_test_name_str), &result, 0.99);
|
||||
}
|
||||
}
|
||||
|
@ -3,7 +3,7 @@ mod test_examples_someFn {
|
||||
#[tokio::test(flavor = "multi_thread")]
|
||||
async fn test_mock_example_someFn0() {
|
||||
let program = crate::Program::parse_no_errs("someFn()").unwrap();
|
||||
let ctx = crate::executor::ExecutorContext {
|
||||
let ctx = crate::ExecutorContext {
|
||||
engine: std::sync::Arc::new(Box::new(
|
||||
crate::engine::conn_mock::EngineConnection::new()
|
||||
.await
|
||||
@ -12,7 +12,7 @@ mod test_examples_someFn {
|
||||
fs: std::sync::Arc::new(crate::fs::FileManager::new()),
|
||||
stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
|
||||
settings: Default::default(),
|
||||
context_type: crate::executor::ContextType::Mock,
|
||||
context_type: crate::execution::ContextType::Mock,
|
||||
};
|
||||
ctx.run(program.into(), &mut crate::ExecState::default())
|
||||
.await
|
||||
@ -22,10 +22,13 @@ mod test_examples_someFn {
|
||||
#[tokio::test(flavor = "multi_thread", worker_threads = 5)]
|
||||
async fn kcl_test_example_someFn0() {
|
||||
let code = "someFn()";
|
||||
let result =
|
||||
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
|
||||
.await
|
||||
.unwrap();
|
||||
let result = crate::test_server::execute_and_snapshot(
|
||||
code,
|
||||
crate::settings::types::UnitLength::Mm,
|
||||
None,
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
twenty_twenty::assert_image(
|
||||
&format!("tests/outputs/{}.png", "serial_test_example_someFn0"),
|
||||
&result,
|
||||
@ -44,12 +47,12 @@ pub(crate) struct SomeFn {}
|
||||
#[doc = "Std lib function: someFn\nDocs"]
|
||||
pub(crate) const SomeFn: SomeFn = SomeFn {};
|
||||
fn boxed_someFn(
|
||||
exec_state: &mut crate::executor::ExecState,
|
||||
exec_state: &mut crate::ExecState,
|
||||
args: crate::std::Args,
|
||||
) -> std::pin::Pin<
|
||||
Box<
|
||||
dyn std::future::Future<
|
||||
Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>,
|
||||
Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
|
||||
> + Send
|
||||
+ '_,
|
||||
>,
|
||||
|
@ -3,7 +3,7 @@ mod test_examples_someFn {
|
||||
#[tokio::test(flavor = "multi_thread")]
|
||||
async fn test_mock_example_someFn0() {
|
||||
let program = crate::Program::parse_no_errs("someFn()").unwrap();
|
||||
let ctx = crate::executor::ExecutorContext {
|
||||
let ctx = crate::ExecutorContext {
|
||||
engine: std::sync::Arc::new(Box::new(
|
||||
crate::engine::conn_mock::EngineConnection::new()
|
||||
.await
|
||||
@ -12,7 +12,7 @@ mod test_examples_someFn {
|
||||
fs: std::sync::Arc::new(crate::fs::FileManager::new()),
|
||||
stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
|
||||
settings: Default::default(),
|
||||
context_type: crate::executor::ContextType::Mock,
|
||||
context_type: crate::execution::ContextType::Mock,
|
||||
};
|
||||
ctx.run(program.into(), &mut crate::ExecState::default())
|
||||
.await
|
||||
@ -22,10 +22,13 @@ mod test_examples_someFn {
|
||||
#[tokio::test(flavor = "multi_thread", worker_threads = 5)]
|
||||
async fn kcl_test_example_someFn0() {
|
||||
let code = "someFn()";
|
||||
let result =
|
||||
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
|
||||
.await
|
||||
.unwrap();
|
||||
let result = crate::test_server::execute_and_snapshot(
|
||||
code,
|
||||
crate::settings::types::UnitLength::Mm,
|
||||
None,
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
twenty_twenty::assert_image(
|
||||
&format!("tests/outputs/{}.png", "serial_test_example_someFn0"),
|
||||
&result,
|
||||
@ -44,12 +47,12 @@ pub(crate) struct SomeFn {}
|
||||
#[doc = "Std lib function: someFn\nDocs"]
|
||||
pub(crate) const SomeFn: SomeFn = SomeFn {};
|
||||
fn boxed_someFn(
|
||||
exec_state: &mut crate::executor::ExecState,
|
||||
exec_state: &mut crate::ExecState,
|
||||
args: crate::std::Args,
|
||||
) -> std::pin::Pin<
|
||||
Box<
|
||||
dyn std::future::Future<
|
||||
Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>,
|
||||
Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
|
||||
> + Send
|
||||
+ '_,
|
||||
>,
|
||||
|
@ -4,7 +4,7 @@ mod test_examples_show {
|
||||
async fn test_mock_example_show0() {
|
||||
let program =
|
||||
crate::Program::parse_no_errs("This is another code block.\nyes sirrr.\nshow").unwrap();
|
||||
let ctx = crate::executor::ExecutorContext {
|
||||
let ctx = crate::ExecutorContext {
|
||||
engine: std::sync::Arc::new(Box::new(
|
||||
crate::engine::conn_mock::EngineConnection::new()
|
||||
.await
|
||||
@ -13,7 +13,7 @@ mod test_examples_show {
|
||||
fs: std::sync::Arc::new(crate::fs::FileManager::new()),
|
||||
stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
|
||||
settings: Default::default(),
|
||||
context_type: crate::executor::ContextType::Mock,
|
||||
context_type: crate::execution::ContextType::Mock,
|
||||
};
|
||||
ctx.run(program.into(), &mut crate::ExecState::default())
|
||||
.await
|
||||
@ -23,10 +23,13 @@ mod test_examples_show {
|
||||
#[tokio::test(flavor = "multi_thread", worker_threads = 5)]
|
||||
async fn kcl_test_example_show0() {
|
||||
let code = "This is another code block.\nyes sirrr.\nshow";
|
||||
let result =
|
||||
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
|
||||
.await
|
||||
.unwrap();
|
||||
let result = crate::test_server::execute_and_snapshot(
|
||||
code,
|
||||
crate::settings::types::UnitLength::Mm,
|
||||
None,
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
twenty_twenty::assert_image(
|
||||
&format!("tests/outputs/{}.png", "serial_test_example_show0"),
|
||||
&result,
|
||||
@ -38,7 +41,7 @@ mod test_examples_show {
|
||||
async fn test_mock_example_show1() {
|
||||
let program =
|
||||
crate::Program::parse_no_errs("This is code.\nIt does other shit.\nshow").unwrap();
|
||||
let ctx = crate::executor::ExecutorContext {
|
||||
let ctx = crate::ExecutorContext {
|
||||
engine: std::sync::Arc::new(Box::new(
|
||||
crate::engine::conn_mock::EngineConnection::new()
|
||||
.await
|
||||
@ -47,7 +50,7 @@ mod test_examples_show {
|
||||
fs: std::sync::Arc::new(crate::fs::FileManager::new()),
|
||||
stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
|
||||
settings: Default::default(),
|
||||
context_type: crate::executor::ContextType::Mock,
|
||||
context_type: crate::execution::ContextType::Mock,
|
||||
};
|
||||
ctx.run(program.into(), &mut crate::ExecState::default())
|
||||
.await
|
||||
@ -57,10 +60,13 @@ mod test_examples_show {
|
||||
#[tokio::test(flavor = "multi_thread", worker_threads = 5)]
|
||||
async fn kcl_test_example_show1() {
|
||||
let code = "This is code.\nIt does other shit.\nshow";
|
||||
let result =
|
||||
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
|
||||
.await
|
||||
.unwrap();
|
||||
let result = crate::test_server::execute_and_snapshot(
|
||||
code,
|
||||
crate::settings::types::UnitLength::Mm,
|
||||
None,
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
twenty_twenty::assert_image(
|
||||
&format!("tests/outputs/{}.png", "serial_test_example_show1"),
|
||||
&result,
|
||||
@ -79,12 +85,12 @@ pub(crate) struct Show {}
|
||||
#[doc = "Std lib function: show\nThis is some function.\nIt does shit."]
|
||||
pub(crate) const Show: Show = Show {};
|
||||
fn boxed_show(
|
||||
exec_state: &mut crate::executor::ExecState,
|
||||
exec_state: &mut crate::ExecState,
|
||||
args: crate::std::Args,
|
||||
) -> std::pin::Pin<
|
||||
Box<
|
||||
dyn std::future::Future<
|
||||
Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>,
|
||||
Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
|
||||
> + Send
|
||||
+ '_,
|
||||
>,
|
||||
|
@ -4,7 +4,7 @@ mod test_examples_show {
|
||||
async fn test_mock_example_show0() {
|
||||
let program =
|
||||
crate::Program::parse_no_errs("This is code.\nIt does other shit.\nshow").unwrap();
|
||||
let ctx = crate::executor::ExecutorContext {
|
||||
let ctx = crate::ExecutorContext {
|
||||
engine: std::sync::Arc::new(Box::new(
|
||||
crate::engine::conn_mock::EngineConnection::new()
|
||||
.await
|
||||
@ -13,7 +13,7 @@ mod test_examples_show {
|
||||
fs: std::sync::Arc::new(crate::fs::FileManager::new()),
|
||||
stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
|
||||
settings: Default::default(),
|
||||
context_type: crate::executor::ContextType::Mock,
|
||||
context_type: crate::execution::ContextType::Mock,
|
||||
};
|
||||
ctx.run(program.into(), &mut crate::ExecState::default())
|
||||
.await
|
||||
@ -23,10 +23,13 @@ mod test_examples_show {
|
||||
#[tokio::test(flavor = "multi_thread", worker_threads = 5)]
|
||||
async fn kcl_test_example_show0() {
|
||||
let code = "This is code.\nIt does other shit.\nshow";
|
||||
let result =
|
||||
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
|
||||
.await
|
||||
.unwrap();
|
||||
let result = crate::test_server::execute_and_snapshot(
|
||||
code,
|
||||
crate::settings::types::UnitLength::Mm,
|
||||
None,
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
twenty_twenty::assert_image(
|
||||
&format!("tests/outputs/{}.png", "serial_test_example_show0"),
|
||||
&result,
|
||||
@ -45,12 +48,12 @@ pub(crate) struct Show {}
|
||||
#[doc = "Std lib function: show\nThis is some function.\nIt does shit."]
|
||||
pub(crate) const Show: Show = Show {};
|
||||
fn boxed_show(
|
||||
exec_state: &mut crate::executor::ExecState,
|
||||
exec_state: &mut crate::ExecState,
|
||||
args: crate::std::Args,
|
||||
) -> std::pin::Pin<
|
||||
Box<
|
||||
dyn std::future::Future<
|
||||
Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>,
|
||||
Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
|
||||
> + Send
|
||||
+ '_,
|
||||
>,
|
||||
|
@ -5,7 +5,7 @@ mod test_examples_my_func {
|
||||
let program =
|
||||
crate::Program::parse_no_errs("This is another code block.\nyes sirrr.\nmyFunc")
|
||||
.unwrap();
|
||||
let ctx = crate::executor::ExecutorContext {
|
||||
let ctx = crate::ExecutorContext {
|
||||
engine: std::sync::Arc::new(Box::new(
|
||||
crate::engine::conn_mock::EngineConnection::new()
|
||||
.await
|
||||
@ -14,7 +14,7 @@ mod test_examples_my_func {
|
||||
fs: std::sync::Arc::new(crate::fs::FileManager::new()),
|
||||
stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
|
||||
settings: Default::default(),
|
||||
context_type: crate::executor::ContextType::Mock,
|
||||
context_type: crate::execution::ContextType::Mock,
|
||||
};
|
||||
ctx.run(program.into(), &mut crate::ExecState::default())
|
||||
.await
|
||||
@ -24,10 +24,13 @@ mod test_examples_my_func {
|
||||
#[tokio::test(flavor = "multi_thread", worker_threads = 5)]
|
||||
async fn kcl_test_example_my_func0() {
|
||||
let code = "This is another code block.\nyes sirrr.\nmyFunc";
|
||||
let result =
|
||||
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
|
||||
.await
|
||||
.unwrap();
|
||||
let result = crate::test_server::execute_and_snapshot(
|
||||
code,
|
||||
crate::settings::types::UnitLength::Mm,
|
||||
None,
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
twenty_twenty::assert_image(
|
||||
&format!("tests/outputs/{}.png", "serial_test_example_my_func0"),
|
||||
&result,
|
||||
@ -39,7 +42,7 @@ mod test_examples_my_func {
|
||||
async fn test_mock_example_my_func1() {
|
||||
let program =
|
||||
crate::Program::parse_no_errs("This is code.\nIt does other shit.\nmyFunc").unwrap();
|
||||
let ctx = crate::executor::ExecutorContext {
|
||||
let ctx = crate::ExecutorContext {
|
||||
engine: std::sync::Arc::new(Box::new(
|
||||
crate::engine::conn_mock::EngineConnection::new()
|
||||
.await
|
||||
@ -48,7 +51,7 @@ mod test_examples_my_func {
|
||||
fs: std::sync::Arc::new(crate::fs::FileManager::new()),
|
||||
stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
|
||||
settings: Default::default(),
|
||||
context_type: crate::executor::ContextType::Mock,
|
||||
context_type: crate::execution::ContextType::Mock,
|
||||
};
|
||||
ctx.run(program.into(), &mut crate::ExecState::default())
|
||||
.await
|
||||
@ -58,10 +61,13 @@ mod test_examples_my_func {
|
||||
#[tokio::test(flavor = "multi_thread", worker_threads = 5)]
|
||||
async fn kcl_test_example_my_func1() {
|
||||
let code = "This is code.\nIt does other shit.\nmyFunc";
|
||||
let result =
|
||||
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
|
||||
.await
|
||||
.unwrap();
|
||||
let result = crate::test_server::execute_and_snapshot(
|
||||
code,
|
||||
crate::settings::types::UnitLength::Mm,
|
||||
None,
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
twenty_twenty::assert_image(
|
||||
&format!("tests/outputs/{}.png", "serial_test_example_my_func1"),
|
||||
&result,
|
||||
@ -80,12 +86,12 @@ pub(crate) struct MyFunc {}
|
||||
#[doc = "Std lib function: myFunc\nThis is some function.\nIt does shit."]
|
||||
pub(crate) const MyFunc: MyFunc = MyFunc {};
|
||||
fn boxed_my_func(
|
||||
exec_state: &mut crate::executor::ExecState,
|
||||
exec_state: &mut crate::ExecState,
|
||||
args: crate::std::Args,
|
||||
) -> std::pin::Pin<
|
||||
Box<
|
||||
dyn std::future::Future<
|
||||
Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>,
|
||||
Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
|
||||
> + Send
|
||||
+ '_,
|
||||
>,
|
||||
|
@ -5,7 +5,7 @@ mod test_examples_line_to {
|
||||
let program =
|
||||
crate::Program::parse_no_errs("This is another code block.\nyes sirrr.\nlineTo")
|
||||
.unwrap();
|
||||
let ctx = crate::executor::ExecutorContext {
|
||||
let ctx = crate::ExecutorContext {
|
||||
engine: std::sync::Arc::new(Box::new(
|
||||
crate::engine::conn_mock::EngineConnection::new()
|
||||
.await
|
||||
@ -14,7 +14,7 @@ mod test_examples_line_to {
|
||||
fs: std::sync::Arc::new(crate::fs::FileManager::new()),
|
||||
stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
|
||||
settings: Default::default(),
|
||||
context_type: crate::executor::ContextType::Mock,
|
||||
context_type: crate::execution::ContextType::Mock,
|
||||
};
|
||||
ctx.run(program.into(), &mut crate::ExecState::default())
|
||||
.await
|
||||
@ -24,10 +24,13 @@ mod test_examples_line_to {
|
||||
#[tokio::test(flavor = "multi_thread", worker_threads = 5)]
|
||||
async fn kcl_test_example_line_to0() {
|
||||
let code = "This is another code block.\nyes sirrr.\nlineTo";
|
||||
let result =
|
||||
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
|
||||
.await
|
||||
.unwrap();
|
||||
let result = crate::test_server::execute_and_snapshot(
|
||||
code,
|
||||
crate::settings::types::UnitLength::Mm,
|
||||
None,
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
twenty_twenty::assert_image(
|
||||
&format!("tests/outputs/{}.png", "serial_test_example_line_to0"),
|
||||
&result,
|
||||
@ -39,7 +42,7 @@ mod test_examples_line_to {
|
||||
async fn test_mock_example_line_to1() {
|
||||
let program =
|
||||
crate::Program::parse_no_errs("This is code.\nIt does other shit.\nlineTo").unwrap();
|
||||
let ctx = crate::executor::ExecutorContext {
|
||||
let ctx = crate::ExecutorContext {
|
||||
engine: std::sync::Arc::new(Box::new(
|
||||
crate::engine::conn_mock::EngineConnection::new()
|
||||
.await
|
||||
@ -48,7 +51,7 @@ mod test_examples_line_to {
|
||||
fs: std::sync::Arc::new(crate::fs::FileManager::new()),
|
||||
stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
|
||||
settings: Default::default(),
|
||||
context_type: crate::executor::ContextType::Mock,
|
||||
context_type: crate::execution::ContextType::Mock,
|
||||
};
|
||||
ctx.run(program.into(), &mut crate::ExecState::default())
|
||||
.await
|
||||
@ -58,10 +61,13 @@ mod test_examples_line_to {
|
||||
#[tokio::test(flavor = "multi_thread", worker_threads = 5)]
|
||||
async fn kcl_test_example_line_to1() {
|
||||
let code = "This is code.\nIt does other shit.\nlineTo";
|
||||
let result =
|
||||
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
|
||||
.await
|
||||
.unwrap();
|
||||
let result = crate::test_server::execute_and_snapshot(
|
||||
code,
|
||||
crate::settings::types::UnitLength::Mm,
|
||||
None,
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
twenty_twenty::assert_image(
|
||||
&format!("tests/outputs/{}.png", "serial_test_example_line_to1"),
|
||||
&result,
|
||||
@ -80,12 +86,12 @@ pub(crate) struct LineTo {}
|
||||
#[doc = "Std lib function: lineTo\nThis is some function.\nIt does shit."]
|
||||
pub(crate) const LineTo: LineTo = LineTo {};
|
||||
fn boxed_line_to(
|
||||
exec_state: &mut crate::executor::ExecState,
|
||||
exec_state: &mut crate::ExecState,
|
||||
args: crate::std::Args,
|
||||
) -> std::pin::Pin<
|
||||
Box<
|
||||
dyn std::future::Future<
|
||||
Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>,
|
||||
Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
|
||||
> + Send
|
||||
+ '_,
|
||||
>,
|
||||
|
@ -4,7 +4,7 @@ mod test_examples_min {
|
||||
async fn test_mock_example_min0() {
|
||||
let program =
|
||||
crate::Program::parse_no_errs("This is another code block.\nyes sirrr.\nmin").unwrap();
|
||||
let ctx = crate::executor::ExecutorContext {
|
||||
let ctx = crate::ExecutorContext {
|
||||
engine: std::sync::Arc::new(Box::new(
|
||||
crate::engine::conn_mock::EngineConnection::new()
|
||||
.await
|
||||
@ -13,7 +13,7 @@ mod test_examples_min {
|
||||
fs: std::sync::Arc::new(crate::fs::FileManager::new()),
|
||||
stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
|
||||
settings: Default::default(),
|
||||
context_type: crate::executor::ContextType::Mock,
|
||||
context_type: crate::execution::ContextType::Mock,
|
||||
};
|
||||
ctx.run(program.into(), &mut crate::ExecState::default())
|
||||
.await
|
||||
@ -23,10 +23,13 @@ mod test_examples_min {
|
||||
#[tokio::test(flavor = "multi_thread", worker_threads = 5)]
|
||||
async fn kcl_test_example_min0() {
|
||||
let code = "This is another code block.\nyes sirrr.\nmin";
|
||||
let result =
|
||||
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
|
||||
.await
|
||||
.unwrap();
|
||||
let result = crate::test_server::execute_and_snapshot(
|
||||
code,
|
||||
crate::settings::types::UnitLength::Mm,
|
||||
None,
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
twenty_twenty::assert_image(
|
||||
&format!("tests/outputs/{}.png", "serial_test_example_min0"),
|
||||
&result,
|
||||
@ -38,7 +41,7 @@ mod test_examples_min {
|
||||
async fn test_mock_example_min1() {
|
||||
let program =
|
||||
crate::Program::parse_no_errs("This is code.\nIt does other shit.\nmin").unwrap();
|
||||
let ctx = crate::executor::ExecutorContext {
|
||||
let ctx = crate::ExecutorContext {
|
||||
engine: std::sync::Arc::new(Box::new(
|
||||
crate::engine::conn_mock::EngineConnection::new()
|
||||
.await
|
||||
@ -47,7 +50,7 @@ mod test_examples_min {
|
||||
fs: std::sync::Arc::new(crate::fs::FileManager::new()),
|
||||
stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
|
||||
settings: Default::default(),
|
||||
context_type: crate::executor::ContextType::Mock,
|
||||
context_type: crate::execution::ContextType::Mock,
|
||||
};
|
||||
ctx.run(program.into(), &mut crate::ExecState::default())
|
||||
.await
|
||||
@ -57,10 +60,13 @@ mod test_examples_min {
|
||||
#[tokio::test(flavor = "multi_thread", worker_threads = 5)]
|
||||
async fn kcl_test_example_min1() {
|
||||
let code = "This is code.\nIt does other shit.\nmin";
|
||||
let result =
|
||||
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
|
||||
.await
|
||||
.unwrap();
|
||||
let result = crate::test_server::execute_and_snapshot(
|
||||
code,
|
||||
crate::settings::types::UnitLength::Mm,
|
||||
None,
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
twenty_twenty::assert_image(
|
||||
&format!("tests/outputs/{}.png", "serial_test_example_min1"),
|
||||
&result,
|
||||
@ -79,12 +85,12 @@ pub(crate) struct Min {}
|
||||
#[doc = "Std lib function: min\nThis is some function.\nIt does shit."]
|
||||
pub(crate) const Min: Min = Min {};
|
||||
fn boxed_min(
|
||||
exec_state: &mut crate::executor::ExecState,
|
||||
exec_state: &mut crate::ExecState,
|
||||
args: crate::std::Args,
|
||||
) -> std::pin::Pin<
|
||||
Box<
|
||||
dyn std::future::Future<
|
||||
Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>,
|
||||
Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
|
||||
> + Send
|
||||
+ '_,
|
||||
>,
|
||||
|
@ -4,7 +4,7 @@ mod test_examples_show {
|
||||
async fn test_mock_example_show0() {
|
||||
let program =
|
||||
crate::Program::parse_no_errs("This is code.\nIt does other shit.\nshow").unwrap();
|
||||
let ctx = crate::executor::ExecutorContext {
|
||||
let ctx = crate::ExecutorContext {
|
||||
engine: std::sync::Arc::new(Box::new(
|
||||
crate::engine::conn_mock::EngineConnection::new()
|
||||
.await
|
||||
@ -13,7 +13,7 @@ mod test_examples_show {
|
||||
fs: std::sync::Arc::new(crate::fs::FileManager::new()),
|
||||
stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
|
||||
settings: Default::default(),
|
||||
context_type: crate::executor::ContextType::Mock,
|
||||
context_type: crate::execution::ContextType::Mock,
|
||||
};
|
||||
ctx.run(program.into(), &mut crate::ExecState::default())
|
||||
.await
|
||||
@ -23,10 +23,13 @@ mod test_examples_show {
|
||||
#[tokio::test(flavor = "multi_thread", worker_threads = 5)]
|
||||
async fn kcl_test_example_show0() {
|
||||
let code = "This is code.\nIt does other shit.\nshow";
|
||||
let result =
|
||||
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
|
||||
.await
|
||||
.unwrap();
|
||||
let result = crate::test_server::execute_and_snapshot(
|
||||
code,
|
||||
crate::settings::types::UnitLength::Mm,
|
||||
None,
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
twenty_twenty::assert_image(
|
||||
&format!("tests/outputs/{}.png", "serial_test_example_show0"),
|
||||
&result,
|
||||
@ -45,12 +48,12 @@ pub(crate) struct Show {}
|
||||
#[doc = "Std lib function: show\nThis is some function.\nIt does shit."]
|
||||
pub(crate) const Show: Show = Show {};
|
||||
fn boxed_show(
|
||||
exec_state: &mut crate::executor::ExecState,
|
||||
exec_state: &mut crate::ExecState,
|
||||
args: crate::std::Args,
|
||||
) -> std::pin::Pin<
|
||||
Box<
|
||||
dyn std::future::Future<
|
||||
Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>,
|
||||
Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
|
||||
> + Send
|
||||
+ '_,
|
||||
>,
|
||||
|
@ -4,7 +4,7 @@ mod test_examples_import {
|
||||
async fn test_mock_example_import0() {
|
||||
let program =
|
||||
crate::Program::parse_no_errs("This is code.\nIt does other shit.\nimport").unwrap();
|
||||
let ctx = crate::executor::ExecutorContext {
|
||||
let ctx = crate::ExecutorContext {
|
||||
engine: std::sync::Arc::new(Box::new(
|
||||
crate::engine::conn_mock::EngineConnection::new()
|
||||
.await
|
||||
@ -13,7 +13,7 @@ mod test_examples_import {
|
||||
fs: std::sync::Arc::new(crate::fs::FileManager::new()),
|
||||
stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
|
||||
settings: Default::default(),
|
||||
context_type: crate::executor::ContextType::Mock,
|
||||
context_type: crate::execution::ContextType::Mock,
|
||||
};
|
||||
ctx.run(program.into(), &mut crate::ExecState::default())
|
||||
.await
|
||||
@ -23,10 +23,13 @@ mod test_examples_import {
|
||||
#[tokio::test(flavor = "multi_thread", worker_threads = 5)]
|
||||
async fn kcl_test_example_import0() {
|
||||
let code = "This is code.\nIt does other shit.\nimport";
|
||||
let result =
|
||||
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
|
||||
.await
|
||||
.unwrap();
|
||||
let result = crate::test_server::execute_and_snapshot(
|
||||
code,
|
||||
crate::settings::types::UnitLength::Mm,
|
||||
None,
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
twenty_twenty::assert_image(
|
||||
&format!("tests/outputs/{}.png", "serial_test_example_import0"),
|
||||
&result,
|
||||
@ -45,12 +48,12 @@ pub(crate) struct Import {}
|
||||
#[doc = "Std lib function: import\nThis is some function.\nIt does shit."]
|
||||
pub(crate) const Import: Import = Import {};
|
||||
fn boxed_import(
|
||||
exec_state: &mut crate::executor::ExecState,
|
||||
exec_state: &mut crate::ExecState,
|
||||
args: crate::std::Args,
|
||||
) -> std::pin::Pin<
|
||||
Box<
|
||||
dyn std::future::Future<
|
||||
Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>,
|
||||
Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
|
||||
> + Send
|
||||
+ '_,
|
||||
>,
|
||||
|
@ -4,7 +4,7 @@ mod test_examples_import {
|
||||
async fn test_mock_example_import0() {
|
||||
let program =
|
||||
crate::Program::parse_no_errs("This is code.\nIt does other shit.\nimport").unwrap();
|
||||
let ctx = crate::executor::ExecutorContext {
|
||||
let ctx = crate::ExecutorContext {
|
||||
engine: std::sync::Arc::new(Box::new(
|
||||
crate::engine::conn_mock::EngineConnection::new()
|
||||
.await
|
||||
@ -13,7 +13,7 @@ mod test_examples_import {
|
||||
fs: std::sync::Arc::new(crate::fs::FileManager::new()),
|
||||
stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
|
||||
settings: Default::default(),
|
||||
context_type: crate::executor::ContextType::Mock,
|
||||
context_type: crate::execution::ContextType::Mock,
|
||||
};
|
||||
ctx.run(program.into(), &mut crate::ExecState::default())
|
||||
.await
|
||||
@ -23,10 +23,13 @@ mod test_examples_import {
|
||||
#[tokio::test(flavor = "multi_thread", worker_threads = 5)]
|
||||
async fn kcl_test_example_import0() {
|
||||
let code = "This is code.\nIt does other shit.\nimport";
|
||||
let result =
|
||||
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
|
||||
.await
|
||||
.unwrap();
|
||||
let result = crate::test_server::execute_and_snapshot(
|
||||
code,
|
||||
crate::settings::types::UnitLength::Mm,
|
||||
None,
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
twenty_twenty::assert_image(
|
||||
&format!("tests/outputs/{}.png", "serial_test_example_import0"),
|
||||
&result,
|
||||
@ -45,12 +48,12 @@ pub(crate) struct Import {}
|
||||
#[doc = "Std lib function: import\nThis is some function.\nIt does shit."]
|
||||
pub(crate) const Import: Import = Import {};
|
||||
fn boxed_import(
|
||||
exec_state: &mut crate::executor::ExecState,
|
||||
exec_state: &mut crate::ExecState,
|
||||
args: crate::std::Args,
|
||||
) -> std::pin::Pin<
|
||||
Box<
|
||||
dyn std::future::Future<
|
||||
Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>,
|
||||
Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
|
||||
> + Send
|
||||
+ '_,
|
||||
>,
|
||||
|
@ -4,7 +4,7 @@ mod test_examples_import {
|
||||
async fn test_mock_example_import0() {
|
||||
let program =
|
||||
crate::Program::parse_no_errs("This is code.\nIt does other shit.\nimport").unwrap();
|
||||
let ctx = crate::executor::ExecutorContext {
|
||||
let ctx = crate::ExecutorContext {
|
||||
engine: std::sync::Arc::new(Box::new(
|
||||
crate::engine::conn_mock::EngineConnection::new()
|
||||
.await
|
||||
@ -13,7 +13,7 @@ mod test_examples_import {
|
||||
fs: std::sync::Arc::new(crate::fs::FileManager::new()),
|
||||
stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
|
||||
settings: Default::default(),
|
||||
context_type: crate::executor::ContextType::Mock,
|
||||
context_type: crate::execution::ContextType::Mock,
|
||||
};
|
||||
ctx.run(program.into(), &mut crate::ExecState::default())
|
||||
.await
|
||||
@ -23,10 +23,13 @@ mod test_examples_import {
|
||||
#[tokio::test(flavor = "multi_thread", worker_threads = 5)]
|
||||
async fn kcl_test_example_import0() {
|
||||
let code = "This is code.\nIt does other shit.\nimport";
|
||||
let result =
|
||||
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
|
||||
.await
|
||||
.unwrap();
|
||||
let result = crate::test_server::execute_and_snapshot(
|
||||
code,
|
||||
crate::settings::types::UnitLength::Mm,
|
||||
None,
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
twenty_twenty::assert_image(
|
||||
&format!("tests/outputs/{}.png", "serial_test_example_import0"),
|
||||
&result,
|
||||
@ -45,12 +48,12 @@ pub(crate) struct Import {}
|
||||
#[doc = "Std lib function: import\nThis is some function.\nIt does shit."]
|
||||
pub(crate) const Import: Import = Import {};
|
||||
fn boxed_import(
|
||||
exec_state: &mut crate::executor::ExecState,
|
||||
exec_state: &mut crate::ExecState,
|
||||
args: crate::std::Args,
|
||||
) -> std::pin::Pin<
|
||||
Box<
|
||||
dyn std::future::Future<
|
||||
Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>,
|
||||
Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
|
||||
> + Send
|
||||
+ '_,
|
||||
>,
|
||||
|
@ -4,7 +4,7 @@ mod test_examples_show {
|
||||
async fn test_mock_example_show0() {
|
||||
let program =
|
||||
crate::Program::parse_no_errs("This is code.\nIt does other shit.\nshow").unwrap();
|
||||
let ctx = crate::executor::ExecutorContext {
|
||||
let ctx = crate::ExecutorContext {
|
||||
engine: std::sync::Arc::new(Box::new(
|
||||
crate::engine::conn_mock::EngineConnection::new()
|
||||
.await
|
||||
@ -13,7 +13,7 @@ mod test_examples_show {
|
||||
fs: std::sync::Arc::new(crate::fs::FileManager::new()),
|
||||
stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
|
||||
settings: Default::default(),
|
||||
context_type: crate::executor::ContextType::Mock,
|
||||
context_type: crate::execution::ContextType::Mock,
|
||||
};
|
||||
ctx.run(program.into(), &mut crate::ExecState::default())
|
||||
.await
|
||||
@ -23,10 +23,13 @@ mod test_examples_show {
|
||||
#[tokio::test(flavor = "multi_thread", worker_threads = 5)]
|
||||
async fn kcl_test_example_show0() {
|
||||
let code = "This is code.\nIt does other shit.\nshow";
|
||||
let result =
|
||||
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
|
||||
.await
|
||||
.unwrap();
|
||||
let result = crate::test_server::execute_and_snapshot(
|
||||
code,
|
||||
crate::settings::types::UnitLength::Mm,
|
||||
None,
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
twenty_twenty::assert_image(
|
||||
&format!("tests/outputs/{}.png", "serial_test_example_show0"),
|
||||
&result,
|
||||
@ -45,12 +48,12 @@ pub(crate) struct Show {}
|
||||
#[doc = "Std lib function: show\nThis is some function.\nIt does shit."]
|
||||
pub(crate) const Show: Show = Show {};
|
||||
fn boxed_show(
|
||||
exec_state: &mut crate::executor::ExecState,
|
||||
exec_state: &mut crate::ExecState,
|
||||
args: crate::std::Args,
|
||||
) -> std::pin::Pin<
|
||||
Box<
|
||||
dyn std::future::Future<
|
||||
Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>,
|
||||
Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
|
||||
> + Send
|
||||
+ '_,
|
||||
>,
|
||||
|
@ -3,7 +3,7 @@ mod test_examples_some_function {
|
||||
#[tokio::test(flavor = "multi_thread")]
|
||||
async fn test_mock_example_some_function0() {
|
||||
let program = crate::Program::parse_no_errs("someFunction()").unwrap();
|
||||
let ctx = crate::executor::ExecutorContext {
|
||||
let ctx = crate::ExecutorContext {
|
||||
engine: std::sync::Arc::new(Box::new(
|
||||
crate::engine::conn_mock::EngineConnection::new()
|
||||
.await
|
||||
@ -12,7 +12,7 @@ mod test_examples_some_function {
|
||||
fs: std::sync::Arc::new(crate::fs::FileManager::new()),
|
||||
stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
|
||||
settings: Default::default(),
|
||||
context_type: crate::executor::ContextType::Mock,
|
||||
context_type: crate::execution::ContextType::Mock,
|
||||
};
|
||||
ctx.run(program.into(), &mut crate::ExecState::default())
|
||||
.await
|
||||
@ -22,10 +22,13 @@ mod test_examples_some_function {
|
||||
#[tokio::test(flavor = "multi_thread", worker_threads = 5)]
|
||||
async fn kcl_test_example_some_function0() {
|
||||
let code = "someFunction()";
|
||||
let result =
|
||||
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
|
||||
.await
|
||||
.unwrap();
|
||||
let result = crate::test_server::execute_and_snapshot(
|
||||
code,
|
||||
crate::settings::types::UnitLength::Mm,
|
||||
None,
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
twenty_twenty::assert_image(
|
||||
&format!("tests/outputs/{}.png", "serial_test_example_some_function0"),
|
||||
&result,
|
||||
@ -44,12 +47,12 @@ pub(crate) struct SomeFunction {}
|
||||
#[doc = "Std lib function: someFunction\nDocs"]
|
||||
pub(crate) const SomeFunction: SomeFunction = SomeFunction {};
|
||||
fn boxed_some_function(
|
||||
exec_state: &mut crate::executor::ExecState,
|
||||
exec_state: &mut crate::ExecState,
|
||||
args: crate::std::Args,
|
||||
) -> std::pin::Pin<
|
||||
Box<
|
||||
dyn std::future::Future<
|
||||
Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>,
|
||||
Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
|
||||
> + Send
|
||||
+ '_,
|
||||
>,
|
||||
|
@ -15,7 +15,6 @@ redo-kcl-stdlib-docs:
|
||||
TWENTY_TWENTY=overwrite {{cnr}} -p kcl-lib kcl_test_example
|
||||
EXPECTORATE=overwrite {{cnr}} -p kcl-lib docs::gen_std_tests::test_generate_stdlib
|
||||
|
||||
|
||||
# Copy a test KCL file from executor tests into a new simulation test.
|
||||
copy-exec-test-into-sim-test test_name:
|
||||
mkdir -p kcl/tests/{{test_name}}
|
||||
|
@ -18,7 +18,7 @@ pub fn bench_execute(c: &mut Criterion) {
|
||||
let rt = Runtime::new().unwrap();
|
||||
// Spawn a future onto the runtime
|
||||
b.iter(|| {
|
||||
rt.block_on(test_server::execute_and_snapshot(s, Mm)).unwrap();
|
||||
rt.block_on(test_server::execute_and_snapshot(s, Mm, None)).unwrap();
|
||||
});
|
||||
});
|
||||
group.finish();
|
||||
@ -38,7 +38,7 @@ pub fn bench_lego(c: &mut Criterion) {
|
||||
let code = LEGO_PROGRAM.replace("{{N}}", &size.to_string());
|
||||
// Spawn a future onto the runtime
|
||||
b.iter(|| {
|
||||
rt.block_on(test_server::execute_and_snapshot(&code, Mm)).unwrap();
|
||||
rt.block_on(test_server::execute_and_snapshot(&code, Mm, None)).unwrap();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
@ -3,7 +3,7 @@ use iai::black_box;
|
||||
async fn execute_server_rack_heavy() {
|
||||
let code = SERVER_RACK_HEAVY_PROGRAM;
|
||||
black_box(
|
||||
kcl_lib::test_server::execute_and_snapshot(code, kcl_lib::UnitLength::Mm)
|
||||
kcl_lib::test_server::execute_and_snapshot(code, kcl_lib::UnitLength::Mm, None)
|
||||
.await
|
||||
.unwrap(),
|
||||
);
|
||||
@ -12,7 +12,7 @@ async fn execute_server_rack_heavy() {
|
||||
async fn execute_server_rack_lite() {
|
||||
let code = SERVER_RACK_LITE_PROGRAM;
|
||||
black_box(
|
||||
kcl_lib::test_server::execute_and_snapshot(code, kcl_lib::UnitLength::Mm)
|
||||
kcl_lib::test_server::execute_and_snapshot(code, kcl_lib::UnitLength::Mm, None)
|
||||
.await
|
||||
.unwrap(),
|
||||
);
|
||||
|
@ -1,3 +0,0 @@
|
||||
pub mod cache;
|
||||
pub mod modify;
|
||||
pub mod types;
|
@ -22,7 +22,7 @@ use super::ExecutionKind;
|
||||
use crate::{
|
||||
engine::EngineManager,
|
||||
errors::{KclError, KclErrorDetails},
|
||||
executor::{DefaultPlanes, IdGenerator},
|
||||
execution::{DefaultPlanes, IdGenerator},
|
||||
SourceRange,
|
||||
};
|
||||
|
||||
|
@ -20,7 +20,7 @@ use kittycad_modeling_cmds::{self as kcmc};
|
||||
use super::ExecutionKind;
|
||||
use crate::{
|
||||
errors::KclError,
|
||||
executor::{DefaultPlanes, IdGenerator},
|
||||
execution::{DefaultPlanes, IdGenerator},
|
||||
SourceRange,
|
||||
};
|
||||
|
||||
|
@ -11,7 +11,7 @@ use wasm_bindgen::prelude::*;
|
||||
use crate::{
|
||||
engine::ExecutionKind,
|
||||
errors::{KclError, KclErrorDetails},
|
||||
executor::{DefaultPlanes, IdGenerator},
|
||||
execution::{DefaultPlanes, IdGenerator},
|
||||
SourceRange,
|
||||
};
|
||||
|
||||
|
@ -32,7 +32,7 @@ use uuid::Uuid;
|
||||
|
||||
use crate::{
|
||||
errors::{KclError, KclErrorDetails},
|
||||
executor::{DefaultPlanes, IdGenerator, Point3d},
|
||||
execution::{DefaultPlanes, IdGenerator, Point3d},
|
||||
SourceRange,
|
||||
};
|
||||
|
||||
|
@ -4,14 +4,19 @@ use async_recursion::async_recursion;
|
||||
|
||||
use crate::{
|
||||
errors::{KclError, KclErrorDetails},
|
||||
executor::{BodyType, ExecState, ExecutorContext, KclValue, Metadata, StatementKind, TagEngineInfo, TagIdentifier},
|
||||
execution::{
|
||||
BodyType, ExecState, ExecutorContext, KclValue, Metadata, StatementKind, TagEngineInfo, TagIdentifier,
|
||||
},
|
||||
parsing::ast::types::{
|
||||
ArrayExpression, ArrayRangeExpression, BinaryExpression, BinaryOperator, BinaryPart, CallExpression,
|
||||
CallExpressionKw, Expr, IfExpression, LiteralIdentifier, LiteralValue, MemberExpression, MemberObject, Node,
|
||||
ObjectExpression, TagDeclarator, UnaryExpression, UnaryOperator,
|
||||
ObjectExpression, PipeExpression, TagDeclarator, UnaryExpression, UnaryOperator,
|
||||
},
|
||||
source_range::SourceRange,
|
||||
std::{args::Arg, FunctionKind},
|
||||
std::{
|
||||
args::{Arg, KwArgs},
|
||||
FunctionKind,
|
||||
},
|
||||
};
|
||||
|
||||
const FLOAT_TO_INT_MAX_DELTA: f64 = 0.01;
|
||||
@ -386,7 +391,14 @@ impl Node<CallExpressionKw> {
|
||||
None
|
||||
};
|
||||
|
||||
let args = crate::std::Args::new_kw(fn_args, unlabeled, self.into(), ctx.clone());
|
||||
let args = crate::std::Args::new_kw(
|
||||
KwArgs {
|
||||
unlabeled,
|
||||
labeled: fn_args,
|
||||
},
|
||||
self.into(),
|
||||
ctx.clone(),
|
||||
);
|
||||
match ctx.stdlib.get_either(fn_name) {
|
||||
FunctionKind::Core(func) => {
|
||||
// Attempt to call the function.
|
||||
@ -807,3 +819,10 @@ impl Property {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Node<PipeExpression> {
|
||||
#[async_recursion]
|
||||
pub async fn get_result(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result<KclValue, KclError> {
|
||||
execute_pipe_body(exec_state, &self.body, self.into(), ctx).await
|
||||
}
|
||||
}
|
@ -2,7 +2,7 @@ use schemars::JsonSchema;
|
||||
|
||||
use crate::{
|
||||
errors::KclError,
|
||||
executor::{
|
||||
execution::{
|
||||
call_user_defined_function, ExecState, ExecutorContext, KclValue, MemoryFunction, Metadata, ProgramMemory,
|
||||
},
|
||||
parsing::ast::types::FunctionExpression,
|
@ -7,7 +7,7 @@ use serde::{Deserialize, Serialize};
|
||||
use crate::{
|
||||
errors::KclErrorDetails,
|
||||
exec::{ProgramMemory, Sketch},
|
||||
executor::{Face, ImportedGeometry, MemoryFunction, Metadata, Plane, SketchSet, Solid, SolidSet, TagIdentifier},
|
||||
execution::{Face, ImportedGeometry, MemoryFunction, Metadata, Plane, SketchSet, Solid, SolidSet, TagIdentifier},
|
||||
parsing::ast::types::{FunctionExpression, KclNone, LiteralValue, TagDeclarator, TagNode},
|
||||
std::{args::Arg, FnAsArg},
|
||||
ExecState, ExecutorContext, KclError, SourceRange,
|
||||
@ -262,9 +262,6 @@ impl KclValue {
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn is_function(&self) -> bool {
|
||||
matches!(self, KclValue::Function { .. })
|
||||
}
|
||||
/// Put the number into a KCL value.
|
||||
pub const fn from_number(f: f64, meta: Vec<Metadata>) -> Self {
|
||||
Self::Number { value: f, meta }
|
||||
@ -496,7 +493,7 @@ impl KclValue {
|
||||
)
|
||||
.await
|
||||
} else {
|
||||
crate::executor::call_user_defined_function(
|
||||
crate::execution::call_user_defined_function(
|
||||
args,
|
||||
closure_memory.as_ref(),
|
||||
expression.as_ref(),
|
@ -1,6 +1,6 @@
|
||||
//! The executor for the AST.
|
||||
|
||||
use std::{collections::HashSet, sync::Arc};
|
||||
use std::{path::PathBuf, sync::Arc};
|
||||
|
||||
use anyhow::Result;
|
||||
use async_recursion::async_recursion;
|
||||
@ -20,14 +20,18 @@ use serde::{Deserialize, Serialize};
|
||||
type Point2D = kcmc::shared::Point2d<f64>;
|
||||
type Point3D = kcmc::shared::Point3d<f64>;
|
||||
|
||||
pub use crate::kcl_value::KclValue;
|
||||
pub use function_param::FunctionParam;
|
||||
pub use kcl_value::{KclObjectFields, KclValue};
|
||||
|
||||
use crate::{
|
||||
engine::{EngineManager, ExecutionKind},
|
||||
errors::{KclError, KclErrorDetails},
|
||||
fs::{FileManager, FileSystem},
|
||||
parsing::ast::{
|
||||
cache::{get_changed_program, CacheInformation},
|
||||
types::{BodyItem, Expr, FunctionExpression, ItemVisibility, Node, NodeRef, TagDeclarator, TagNode},
|
||||
types::{
|
||||
BodyItem, Expr, FunctionExpression, ImportSelector, ItemVisibility, Node, NodeRef, TagDeclarator, TagNode,
|
||||
},
|
||||
},
|
||||
settings::types::UnitLength,
|
||||
source_range::{ModuleId, SourceRange},
|
||||
@ -35,6 +39,10 @@ use crate::{
|
||||
ExecError, Program,
|
||||
};
|
||||
|
||||
mod exec_ast;
|
||||
mod function_param;
|
||||
mod kcl_value;
|
||||
|
||||
/// State for executing a program.
|
||||
#[derive(Debug, Default, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)]
|
||||
#[ts(export)]
|
||||
@ -50,7 +58,7 @@ pub struct ExecState {
|
||||
/// expression. If we're not currently in a pipeline, this will be None.
|
||||
pub pipe_value: Option<KclValue>,
|
||||
/// Identifiers that have been exported from the current module.
|
||||
pub module_exports: HashSet<String>,
|
||||
pub module_exports: Vec<String>,
|
||||
/// The stack of import statements for detecting circular module imports.
|
||||
/// If this is empty, we're not currently executing an import statement.
|
||||
pub import_stack: Vec<std::path::PathBuf>,
|
||||
@ -61,7 +69,7 @@ pub struct ExecState {
|
||||
}
|
||||
|
||||
impl ExecState {
|
||||
pub fn add_module(&mut self, path: std::path::PathBuf) -> ModuleId {
|
||||
fn add_module(&mut self, path: std::path::PathBuf) -> ModuleId {
|
||||
// Need to avoid borrowing self in the closure.
|
||||
let new_module_id = ModuleId::from_usize(self.path_to_source_id.len());
|
||||
let mut is_new = false;
|
||||
@ -1498,6 +1506,9 @@ pub struct ExecutorSettings {
|
||||
/// Should engine store this for replay?
|
||||
/// If so, under what name?
|
||||
pub replay: Option<String>,
|
||||
/// The directory of the current project. This is used for resolving import
|
||||
/// paths. If None is given, the current working directory is used.
|
||||
pub project_directory: Option<PathBuf>,
|
||||
}
|
||||
|
||||
impl Default for ExecutorSettings {
|
||||
@ -1508,6 +1519,7 @@ impl Default for ExecutorSettings {
|
||||
enable_ssao: false,
|
||||
show_grid: false,
|
||||
replay: None,
|
||||
project_directory: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1520,6 +1532,7 @@ impl From<crate::settings::types::Configuration> for ExecutorSettings {
|
||||
enable_ssao: config.settings.modeling.enable_ssao.into(),
|
||||
show_grid: config.settings.modeling.show_scale_grid,
|
||||
replay: None,
|
||||
project_directory: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1532,6 +1545,7 @@ impl From<crate::settings::types::project::ProjectConfiguration> for ExecutorSet
|
||||
enable_ssao: config.settings.modeling.enable_ssao.into(),
|
||||
show_grid: config.settings.modeling.show_scale_grid,
|
||||
replay: None,
|
||||
project_directory: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1544,6 +1558,7 @@ impl From<crate::settings::types::ModelingSettings> for ExecutorSettings {
|
||||
enable_ssao: modeling.enable_ssao.into(),
|
||||
show_grid: modeling.show_scale_grid,
|
||||
replay: None,
|
||||
project_directory: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1774,6 +1789,7 @@ impl ExecutorContext {
|
||||
enable_ssao: false,
|
||||
show_grid: false,
|
||||
replay: None,
|
||||
project_directory: None,
|
||||
},
|
||||
None,
|
||||
engine_addr,
|
||||
@ -1785,7 +1801,7 @@ impl ExecutorContext {
|
||||
pub async fn reset_scene(
|
||||
&self,
|
||||
exec_state: &mut ExecState,
|
||||
source_range: crate::executor::SourceRange,
|
||||
source_range: crate::execution::SourceRange,
|
||||
) -> Result<(), KclError> {
|
||||
self.engine
|
||||
.clear_scene(&mut exec_state.id_generator, source_range)
|
||||
@ -1850,7 +1866,7 @@ impl ExecutorContext {
|
||||
)
|
||||
.await?;
|
||||
|
||||
self.inner_execute(&cache_result.program, exec_state, crate::executor::BodyType::Root)
|
||||
self.inner_execute(&cache_result.program, exec_state, crate::execution::BodyType::Root)
|
||||
.await?;
|
||||
let session_data = self.engine.get_session_data();
|
||||
Ok(session_data)
|
||||
@ -1870,91 +1886,66 @@ impl ExecutorContext {
|
||||
match statement {
|
||||
BodyItem::ImportStatement(import_stmt) => {
|
||||
let source_range = SourceRange::from(import_stmt);
|
||||
let path = import_stmt.path.clone();
|
||||
// Empty path is used by the top-level module.
|
||||
if path.is_empty() {
|
||||
return Err(KclError::Semantic(KclErrorDetails {
|
||||
message: "import path cannot be empty".to_owned(),
|
||||
source_ranges: vec![source_range],
|
||||
}));
|
||||
}
|
||||
let resolved_path = std::path::PathBuf::from(&path);
|
||||
if exec_state.import_stack.contains(&resolved_path) {
|
||||
return Err(KclError::ImportCycle(KclErrorDetails {
|
||||
message: format!(
|
||||
"circular import of modules is not allowed: {} -> {}",
|
||||
exec_state
|
||||
.import_stack
|
||||
.iter()
|
||||
.map(|p| p.as_path().to_string_lossy())
|
||||
.collect::<Vec<_>>()
|
||||
.join(" -> "),
|
||||
resolved_path.to_string_lossy()
|
||||
),
|
||||
source_ranges: vec![import_stmt.into()],
|
||||
}));
|
||||
}
|
||||
let module_id = exec_state.add_module(resolved_path.clone());
|
||||
let source = self.fs.read_to_string(&resolved_path, source_range).await?;
|
||||
// TODO handle parsing errors properly
|
||||
let program = crate::parsing::parse_str(&source, module_id).parse_errs_as_err()?;
|
||||
let (module_memory, module_exports) = {
|
||||
exec_state.import_stack.push(resolved_path.clone());
|
||||
let original_execution = self.engine.replace_execution_kind(ExecutionKind::Isolated);
|
||||
let original_memory = std::mem::take(&mut exec_state.memory);
|
||||
let original_exports = std::mem::take(&mut exec_state.module_exports);
|
||||
let result = self
|
||||
.inner_execute(&program, exec_state, crate::executor::BodyType::Root)
|
||||
.await;
|
||||
let module_exports = std::mem::replace(&mut exec_state.module_exports, original_exports);
|
||||
let module_memory = std::mem::replace(&mut exec_state.memory, original_memory);
|
||||
self.engine.replace_execution_kind(original_execution);
|
||||
exec_state.import_stack.pop();
|
||||
let (module_memory, module_exports) =
|
||||
self.open_module(&import_stmt.path, exec_state, source_range).await?;
|
||||
|
||||
result.map_err(|err| {
|
||||
if let KclError::ImportCycle(_) = err {
|
||||
// It was an import cycle. Keep the original message.
|
||||
err.override_source_ranges(vec![source_range])
|
||||
} else {
|
||||
KclError::Semantic(KclErrorDetails {
|
||||
message: format!(
|
||||
"Error loading imported file. Open it to view more details. {path}: {}",
|
||||
err.message()
|
||||
),
|
||||
source_ranges: vec![source_range],
|
||||
})
|
||||
match &import_stmt.selector {
|
||||
ImportSelector::List { items } => {
|
||||
for import_item in items {
|
||||
// Extract the item from the module.
|
||||
let item =
|
||||
module_memory
|
||||
.get(&import_item.name.name, import_item.into())
|
||||
.map_err(|_err| {
|
||||
KclError::UndefinedValue(KclErrorDetails {
|
||||
message: format!("{} is not defined in module", import_item.name.name),
|
||||
source_ranges: vec![SourceRange::from(&import_item.name)],
|
||||
})
|
||||
})?;
|
||||
// Check that the item is allowed to be imported.
|
||||
if !module_exports.contains(&import_item.name.name) {
|
||||
return Err(KclError::Semantic(KclErrorDetails {
|
||||
message: format!(
|
||||
"Cannot import \"{}\" from module because it is not exported. Add \"export\" before the definition to export it.",
|
||||
import_item.name.name
|
||||
),
|
||||
source_ranges: vec![SourceRange::from(&import_item.name)],
|
||||
}));
|
||||
}
|
||||
|
||||
// Add the item to the current module.
|
||||
exec_state.memory.add(
|
||||
import_item.identifier(),
|
||||
item.clone(),
|
||||
SourceRange::from(&import_item.name),
|
||||
)?;
|
||||
|
||||
if let ItemVisibility::Export = import_stmt.visibility {
|
||||
exec_state.module_exports.push(import_item.identifier().to_owned());
|
||||
}
|
||||
}
|
||||
})?;
|
||||
}
|
||||
ImportSelector::Glob(_) => {
|
||||
for name in module_exports.iter() {
|
||||
let item = module_memory.get(name, source_range).map_err(|_err| {
|
||||
KclError::Internal(KclErrorDetails {
|
||||
message: format!("{} is not defined in module (but was exported?)", name),
|
||||
source_ranges: vec![source_range],
|
||||
})
|
||||
})?;
|
||||
exec_state.memory.add(name, item.clone(), source_range)?;
|
||||
|
||||
(module_memory, module_exports)
|
||||
};
|
||||
for import_item in &import_stmt.items {
|
||||
// Extract the item from the module.
|
||||
let item = module_memory
|
||||
.get(&import_item.name.name, import_item.into())
|
||||
.map_err(|_err| {
|
||||
KclError::UndefinedValue(KclErrorDetails {
|
||||
message: format!("{} is not defined in module", import_item.name.name),
|
||||
source_ranges: vec![SourceRange::from(&import_item.name)],
|
||||
})
|
||||
})?;
|
||||
// Check that the item is allowed to be imported.
|
||||
if !module_exports.contains(&import_item.name.name) {
|
||||
if let ItemVisibility::Export = import_stmt.visibility {
|
||||
exec_state.module_exports.push(name.clone());
|
||||
}
|
||||
}
|
||||
}
|
||||
ImportSelector::None(_) => {
|
||||
return Err(KclError::Semantic(KclErrorDetails {
|
||||
message: format!(
|
||||
"Cannot import \"{}\" from module because it is not exported. Add \"export\" before the definition to export it.",
|
||||
import_item.name.name
|
||||
),
|
||||
source_ranges: vec![SourceRange::from(&import_item.name)],
|
||||
message: "Importing whole module is not yet implemented, sorry.".to_owned(),
|
||||
source_ranges: vec![source_range],
|
||||
}));
|
||||
}
|
||||
|
||||
// Add the item to the current module.
|
||||
exec_state.memory.add(
|
||||
import_item.identifier(),
|
||||
item.clone(),
|
||||
SourceRange::from(&import_item.name),
|
||||
)?;
|
||||
}
|
||||
last_expr = None;
|
||||
}
|
||||
@ -1971,34 +1962,23 @@ impl ExecutorContext {
|
||||
);
|
||||
}
|
||||
BodyItem::VariableDeclaration(variable_declaration) => {
|
||||
for declaration in &variable_declaration.declarations {
|
||||
let var_name = declaration.id.name.to_string();
|
||||
let source_range = SourceRange::from(&declaration.init);
|
||||
let metadata = Metadata { source_range };
|
||||
let var_name = variable_declaration.declaration.id.name.to_string();
|
||||
let source_range = SourceRange::from(&variable_declaration.declaration.init);
|
||||
let metadata = Metadata { source_range };
|
||||
|
||||
let memory_item = self
|
||||
.execute_expr(
|
||||
&declaration.init,
|
||||
exec_state,
|
||||
&metadata,
|
||||
StatementKind::Declaration { name: &var_name },
|
||||
)
|
||||
.await?;
|
||||
let is_function = memory_item.is_function();
|
||||
exec_state.memory.add(&var_name, memory_item, source_range)?;
|
||||
// Track exports.
|
||||
match variable_declaration.visibility {
|
||||
ItemVisibility::Export => {
|
||||
if !is_function {
|
||||
return Err(KclError::Semantic(KclErrorDetails {
|
||||
message: "Only functions can be exported".to_owned(),
|
||||
source_ranges: vec![source_range],
|
||||
}));
|
||||
}
|
||||
exec_state.module_exports.insert(var_name);
|
||||
}
|
||||
ItemVisibility::Default => {}
|
||||
}
|
||||
let memory_item = self
|
||||
.execute_expr(
|
||||
&variable_declaration.declaration.init,
|
||||
exec_state,
|
||||
&metadata,
|
||||
StatementKind::Declaration { name: &var_name },
|
||||
)
|
||||
.await?;
|
||||
exec_state.memory.add(&var_name, memory_item, source_range)?;
|
||||
|
||||
// Track exports.
|
||||
if let ItemVisibility::Export = variable_declaration.visibility {
|
||||
exec_state.module_exports.push(var_name);
|
||||
}
|
||||
last_expr = None;
|
||||
}
|
||||
@ -2033,6 +2013,68 @@ impl ExecutorContext {
|
||||
Ok(last_expr)
|
||||
}
|
||||
|
||||
async fn open_module(
|
||||
&self,
|
||||
path: &str,
|
||||
exec_state: &mut ExecState,
|
||||
source_range: SourceRange,
|
||||
) -> Result<(ProgramMemory, Vec<String>), KclError> {
|
||||
let resolved_path = if let Some(project_dir) = &self.settings.project_directory {
|
||||
project_dir.join(path)
|
||||
} else {
|
||||
std::path::PathBuf::from(&path)
|
||||
};
|
||||
|
||||
if exec_state.import_stack.contains(&resolved_path) {
|
||||
return Err(KclError::ImportCycle(KclErrorDetails {
|
||||
message: format!(
|
||||
"circular import of modules is not allowed: {} -> {}",
|
||||
exec_state
|
||||
.import_stack
|
||||
.iter()
|
||||
.map(|p| p.as_path().to_string_lossy())
|
||||
.collect::<Vec<_>>()
|
||||
.join(" -> "),
|
||||
resolved_path.to_string_lossy()
|
||||
),
|
||||
source_ranges: vec![source_range],
|
||||
}));
|
||||
}
|
||||
let module_id = exec_state.add_module(resolved_path.clone());
|
||||
let source = self.fs.read_to_string(&resolved_path, source_range).await?;
|
||||
// TODO handle parsing errors properly
|
||||
let program = crate::parsing::parse_str(&source, module_id).parse_errs_as_err()?;
|
||||
|
||||
exec_state.import_stack.push(resolved_path.clone());
|
||||
let original_execution = self.engine.replace_execution_kind(ExecutionKind::Isolated);
|
||||
let original_memory = std::mem::take(&mut exec_state.memory);
|
||||
let original_exports = std::mem::take(&mut exec_state.module_exports);
|
||||
let result = self
|
||||
.inner_execute(&program, exec_state, crate::execution::BodyType::Root)
|
||||
.await;
|
||||
let module_exports = std::mem::replace(&mut exec_state.module_exports, original_exports);
|
||||
let module_memory = std::mem::replace(&mut exec_state.memory, original_memory);
|
||||
self.engine.replace_execution_kind(original_execution);
|
||||
exec_state.import_stack.pop();
|
||||
|
||||
result.map_err(|err| {
|
||||
if let KclError::ImportCycle(_) = err {
|
||||
// It was an import cycle. Keep the original message.
|
||||
err.override_source_ranges(vec![source_range])
|
||||
} else {
|
||||
KclError::Semantic(KclErrorDetails {
|
||||
message: format!(
|
||||
"Error loading imported file. Open it to view more details. {path}: {}",
|
||||
err.message()
|
||||
),
|
||||
source_ranges: vec![source_range],
|
||||
})
|
||||
}
|
||||
})?;
|
||||
|
||||
Ok((module_memory, module_exports))
|
||||
}
|
||||
|
||||
pub async fn execute_expr<'a>(
|
||||
&self,
|
||||
init: &Expr,
|
||||
@ -2120,7 +2162,7 @@ impl ExecutorContext {
|
||||
self.engine
|
||||
.send_modeling_cmd(
|
||||
uuid::Uuid::new_v4(),
|
||||
crate::executor::SourceRange::default(),
|
||||
crate::execution::SourceRange::default(),
|
||||
ModelingCmd::from(mcmd::ZoomToFit {
|
||||
object_ids: Default::default(),
|
||||
animated: false,
|
||||
@ -2134,7 +2176,7 @@ impl ExecutorContext {
|
||||
.engine
|
||||
.send_modeling_cmd(
|
||||
uuid::Uuid::new_v4(),
|
||||
crate::executor::SourceRange::default(),
|
||||
crate::execution::SourceRange::default(),
|
||||
ModelingCmd::from(mcmd::TakeSnapshot {
|
||||
format: ImageFormat::Png,
|
||||
}),
|
@ -60,10 +60,8 @@ mod coredump;
|
||||
mod docs;
|
||||
mod engine;
|
||||
mod errors;
|
||||
mod executor;
|
||||
mod execution;
|
||||
mod fs;
|
||||
mod function_param;
|
||||
mod kcl_value;
|
||||
pub mod lint;
|
||||
mod log;
|
||||
mod lsp;
|
||||
@ -84,7 +82,7 @@ mod wasm;
|
||||
pub use coredump::CoreDump;
|
||||
pub use engine::{EngineManager, ExecutionKind};
|
||||
pub use errors::{CompilationError, ConnectionError, ExecError, KclError};
|
||||
pub use executor::{ExecState, ExecutorContext, ExecutorSettings};
|
||||
pub use execution::{ExecState, ExecutorContext, ExecutorSettings};
|
||||
pub use lsp::{
|
||||
copilot::Backend as CopilotLspBackend,
|
||||
kcl::{Backend as KclLspBackend, Server as KclLspServerSubCommand},
|
||||
@ -100,7 +98,7 @@ pub use source_range::{ModuleId, SourceRange};
|
||||
// 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::executor::{DefaultPlanes, IdGenerator, KclValue, PlaneType, ProgramMemory, Sketch};
|
||||
pub use crate::execution::{DefaultPlanes, IdGenerator, KclValue, PlaneType, ProgramMemory, Sketch};
|
||||
}
|
||||
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
|
@ -60,11 +60,7 @@ pub fn lint_variables(decl: Node) -> Result<Vec<Discovered>> {
|
||||
return Ok(vec![]);
|
||||
};
|
||||
|
||||
Ok(decl
|
||||
.declarations
|
||||
.iter()
|
||||
.flat_map(|v| lint_lower_camel_case_var(v).unwrap_or_default())
|
||||
.collect())
|
||||
lint_lower_camel_case_var(&decl.declaration)
|
||||
}
|
||||
|
||||
pub fn lint_object_properties(decl: Node) -> Result<Vec<Discovered>> {
|
||||
|
@ -19,7 +19,7 @@ impl Notification for AstUpdated {
|
||||
pub enum MemoryUpdated {}
|
||||
|
||||
impl Notification for MemoryUpdated {
|
||||
type Params = crate::executor::ProgramMemory;
|
||||
type Params = crate::execution::ProgramMemory;
|
||||
const METHOD: &'static str = "kcl/memoryUpdated";
|
||||
}
|
||||
|
||||
|
@ -115,7 +115,7 @@ pub struct Backend {
|
||||
/// information.
|
||||
pub last_successful_ast_state: Arc<RwLock<Option<OldAstState>>>,
|
||||
/// Memory maps.
|
||||
pub memory_map: DashMap<String, crate::executor::ProgramMemory>,
|
||||
pub memory_map: DashMap<String, crate::execution::ProgramMemory>,
|
||||
/// Current code.
|
||||
pub code_map: DashMap<String, Vec<u8>>,
|
||||
/// Diagnostics.
|
||||
@ -129,7 +129,7 @@ pub struct Backend {
|
||||
/// If we can send telemetry for this user.
|
||||
pub can_send_telemetry: bool,
|
||||
/// Optional executor context to use if we want to execute the code.
|
||||
pub executor_ctx: Arc<RwLock<Option<crate::executor::ExecutorContext>>>,
|
||||
pub executor_ctx: Arc<RwLock<Option<crate::execution::ExecutorContext>>>,
|
||||
/// If we are currently allowed to execute the ast.
|
||||
pub can_execute: Arc<RwLock<bool>>,
|
||||
|
||||
@ -140,7 +140,7 @@ impl Backend {
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
pub fn new_wasm(
|
||||
client: Client,
|
||||
executor_ctx: Option<crate::executor::ExecutorContext>,
|
||||
executor_ctx: Option<crate::execution::ExecutorContext>,
|
||||
fs: crate::fs::wasm::FileSystemManager,
|
||||
zoo_client: kittycad::Client,
|
||||
can_send_telemetry: bool,
|
||||
@ -157,7 +157,7 @@ impl Backend {
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
pub fn new(
|
||||
client: Client,
|
||||
executor_ctx: Option<crate::executor::ExecutorContext>,
|
||||
executor_ctx: Option<crate::execution::ExecutorContext>,
|
||||
zoo_client: kittycad::Client,
|
||||
can_send_telemetry: bool,
|
||||
) -> Result<Self, String> {
|
||||
@ -172,7 +172,7 @@ impl Backend {
|
||||
|
||||
fn with_file_manager(
|
||||
client: Client,
|
||||
executor_ctx: Option<crate::executor::ExecutorContext>,
|
||||
executor_ctx: Option<crate::execution::ExecutorContext>,
|
||||
fs: crate::fs::FileManager,
|
||||
zoo_client: kittycad::Client,
|
||||
can_send_telemetry: bool,
|
||||
@ -297,7 +297,7 @@ impl crate::lsp::backend::Backend for Backend {
|
||||
|
||||
// Try to get the memory for the current code.
|
||||
let has_memory = if let Some(memory) = self.memory_map.get(&filename) {
|
||||
*memory != crate::executor::ProgramMemory::default()
|
||||
*memory != crate::execution::ProgramMemory::default()
|
||||
} else {
|
||||
false
|
||||
};
|
||||
@ -406,7 +406,7 @@ impl Backend {
|
||||
*self.can_execute.read().await
|
||||
}
|
||||
|
||||
pub async fn executor_ctx(&self) -> tokio::sync::RwLockReadGuard<'_, Option<crate::executor::ExecutorContext>> {
|
||||
pub async fn executor_ctx(&self) -> tokio::sync::RwLockReadGuard<'_, Option<crate::execution::ExecutorContext>> {
|
||||
self.executor_ctx.read().await
|
||||
}
|
||||
|
||||
@ -871,7 +871,7 @@ impl Backend {
|
||||
|
||||
// Try to get the memory for the current code.
|
||||
let has_memory = if let Some(memory) = self.memory_map.get(&filename) {
|
||||
*memory != crate::executor::ProgramMemory::default()
|
||||
*memory != crate::execution::ProgramMemory::default()
|
||||
} else {
|
||||
false
|
||||
};
|
||||
|
@ -9,10 +9,10 @@ pub async fn kcl_lsp_server(execute: bool) -> Result<crate::lsp::kcl::Backend> {
|
||||
let stdlib_completions = crate::lsp::kcl::get_completions_from_stdlib(&stdlib)?;
|
||||
let stdlib_signatures = crate::lsp::kcl::get_signatures_from_stdlib(&stdlib)?;
|
||||
|
||||
let zoo_client = crate::executor::new_zoo_client(None, None)?;
|
||||
let zoo_client = crate::execution::new_zoo_client(None, None)?;
|
||||
|
||||
let executor_ctx = if execute {
|
||||
Some(crate::executor::ExecutorContext::new(&zoo_client, Default::default()).await?)
|
||||
Some(crate::execution::ExecutorContext::new(&zoo_client, Default::default()).await?)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
@ -7,7 +7,7 @@ use tower_lsp::{
|
||||
};
|
||||
|
||||
use crate::{
|
||||
executor::ProgramMemory,
|
||||
execution::ProgramMemory,
|
||||
lsp::test_util::{copilot_lsp_server, kcl_lsp_server},
|
||||
parsing::ast::types::{Node, Program},
|
||||
};
|
||||
|
@ -4,7 +4,7 @@ use schemars::JsonSchema;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::{
|
||||
executor::ExecState,
|
||||
execution::ExecState,
|
||||
parsing::ast::types::{Node, Program},
|
||||
};
|
||||
|
||||
@ -27,7 +27,7 @@ pub struct OldAstState {
|
||||
/// The exec state.
|
||||
pub exec_state: ExecState,
|
||||
/// The last settings used for execution.
|
||||
pub settings: crate::executor::ExecutorSettings,
|
||||
pub settings: crate::execution::ExecutorSettings,
|
||||
}
|
||||
|
||||
impl From<crate::Program> for CacheInformation {
|
||||
@ -55,7 +55,7 @@ pub struct CacheResult {
|
||||
// the cache.
|
||||
pub fn get_changed_program(
|
||||
info: CacheInformation,
|
||||
new_settings: &crate::executor::ExecutorSettings,
|
||||
new_settings: &crate::execution::ExecutorSettings,
|
||||
) -> Option<CacheResult> {
|
||||
let Some(old) = info.old else {
|
||||
// We have no old info, we need to re-execute the whole thing.
|
||||
@ -109,14 +109,14 @@ mod tests {
|
||||
use super::*;
|
||||
|
||||
async fn execute(program: &crate::Program) -> Result<ExecState> {
|
||||
let ctx = crate::executor::ExecutorContext {
|
||||
let ctx = crate::execution::ExecutorContext {
|
||||
engine: Arc::new(Box::new(crate::engine::conn_mock::EngineConnection::new().await?)),
|
||||
fs: Arc::new(crate::fs::FileManager::new()),
|
||||
stdlib: Arc::new(crate::std::StdLib::new()),
|
||||
settings: Default::default(),
|
||||
context_type: crate::executor::ContextType::Mock,
|
||||
context_type: crate::execution::ContextType::Mock,
|
||||
};
|
||||
let mut exec_state = crate::executor::ExecState::default();
|
||||
let mut exec_state = crate::execution::ExecState::default();
|
||||
ctx.run(program.clone().into(), &mut exec_state).await?;
|
||||
|
||||
Ok(exec_state)
|
||||
|
@ -4,9 +4,10 @@ use super::types::{DefaultParamVal, ItemVisibility, VariableKind};
|
||||
use crate::parsing::ast::types::{
|
||||
ArrayExpression, ArrayRangeExpression, BinaryExpression, BinaryPart, BodyItem, CallExpression, CallExpressionKw,
|
||||
CommentStyle, ElseIf, Expr, ExpressionStatement, FnArgType, FunctionExpression, Identifier, IfExpression,
|
||||
ImportItem, ImportStatement, Literal, LiteralIdentifier, MemberExpression, MemberObject, NonCodeMeta, NonCodeNode,
|
||||
NonCodeValue, ObjectExpression, ObjectProperty, Parameter, PipeExpression, PipeSubstitution, Program,
|
||||
ReturnStatement, TagDeclarator, UnaryExpression, VariableDeclaration, VariableDeclarator,
|
||||
ImportItem, ImportSelector, ImportStatement, Literal, LiteralIdentifier, MemberExpression, MemberObject,
|
||||
NonCodeMeta, NonCodeNode, NonCodeValue, ObjectExpression, ObjectProperty, Parameter, PipeExpression,
|
||||
PipeSubstitution, Program, ReturnStatement, TagDeclarator, UnaryExpression, VariableDeclaration,
|
||||
VariableDeclarator,
|
||||
};
|
||||
|
||||
/// Position-independent digest of the AST node.
|
||||
@ -52,9 +53,20 @@ impl ImportItem {
|
||||
|
||||
impl ImportStatement {
|
||||
compute_digest!(|slf, hasher| {
|
||||
for item in &mut slf.items {
|
||||
hasher.update(item.compute_digest());
|
||||
match &mut slf.selector {
|
||||
ImportSelector::List { items } => {
|
||||
for item in items {
|
||||
hasher.update(item.compute_digest());
|
||||
}
|
||||
}
|
||||
ImportSelector::Glob(_) => hasher.update(b"ImportSelector::Glob"),
|
||||
ImportSelector::None(None) => hasher.update(b"ImportSelector::None"),
|
||||
ImportSelector::None(Some(alias)) => {
|
||||
hasher.update(b"ImportSelector::None");
|
||||
hasher.update(alias.compute_digest());
|
||||
}
|
||||
}
|
||||
hasher.update(slf.visibility.digestable_id());
|
||||
let path = slf.path.as_bytes();
|
||||
hasher.update(path.len().to_ne_bytes());
|
||||
hasher.update(path);
|
||||
@ -270,10 +282,7 @@ impl ExpressionStatement {
|
||||
|
||||
impl VariableDeclaration {
|
||||
compute_digest!(|slf, hasher| {
|
||||
hasher.update(slf.declarations.len().to_ne_bytes());
|
||||
for declarator in &mut slf.declarations {
|
||||
hasher.update(declarator.compute_digest());
|
||||
}
|
||||
hasher.update(slf.declaration.compute_digest());
|
||||
hasher.update(slf.visibility.digestable_id());
|
||||
hasher.update(slf.kind.digestable_id());
|
||||
});
|
||||
|
@ -1,6 +1,76 @@
|
||||
pub(crate) mod cache;
|
||||
pub(crate) mod digest;
|
||||
pub(crate) mod execute;
|
||||
pub mod modify;
|
||||
pub(crate) mod source_range;
|
||||
pub mod types;
|
||||
|
||||
use crate::{
|
||||
parsing::ast::types::{BinaryPart, BodyItem, Expr, LiteralIdentifier, MemberObject},
|
||||
source_range::ModuleId,
|
||||
};
|
||||
|
||||
impl BodyItem {
|
||||
pub fn module_id(&self) -> ModuleId {
|
||||
match self {
|
||||
BodyItem::ImportStatement(stmt) => stmt.module_id,
|
||||
BodyItem::ExpressionStatement(expression_statement) => expression_statement.module_id,
|
||||
BodyItem::VariableDeclaration(variable_declaration) => variable_declaration.module_id,
|
||||
BodyItem::ReturnStatement(return_statement) => return_statement.module_id,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Expr {
|
||||
pub fn module_id(&self) -> ModuleId {
|
||||
match self {
|
||||
Expr::Literal(literal) => literal.module_id,
|
||||
Expr::Identifier(identifier) => identifier.module_id,
|
||||
Expr::TagDeclarator(tag) => tag.module_id,
|
||||
Expr::BinaryExpression(binary_expression) => binary_expression.module_id,
|
||||
Expr::FunctionExpression(function_expression) => function_expression.module_id,
|
||||
Expr::CallExpression(call_expression) => call_expression.module_id,
|
||||
Expr::CallExpressionKw(call_expression) => call_expression.module_id,
|
||||
Expr::PipeExpression(pipe_expression) => pipe_expression.module_id,
|
||||
Expr::PipeSubstitution(pipe_substitution) => pipe_substitution.module_id,
|
||||
Expr::ArrayExpression(array_expression) => array_expression.module_id,
|
||||
Expr::ArrayRangeExpression(array_range) => array_range.module_id,
|
||||
Expr::ObjectExpression(object_expression) => object_expression.module_id,
|
||||
Expr::MemberExpression(member_expression) => member_expression.module_id,
|
||||
Expr::UnaryExpression(unary_expression) => unary_expression.module_id,
|
||||
Expr::IfExpression(expr) => expr.module_id,
|
||||
Expr::None(none) => none.module_id,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl BinaryPart {
|
||||
pub fn module_id(&self) -> ModuleId {
|
||||
match self {
|
||||
BinaryPart::Literal(literal) => literal.module_id,
|
||||
BinaryPart::Identifier(identifier) => identifier.module_id,
|
||||
BinaryPart::BinaryExpression(binary_expression) => binary_expression.module_id,
|
||||
BinaryPart::CallExpression(call_expression) => call_expression.module_id,
|
||||
BinaryPart::CallExpressionKw(call_expression) => call_expression.module_id,
|
||||
BinaryPart::UnaryExpression(unary_expression) => unary_expression.module_id,
|
||||
BinaryPart::MemberExpression(member_expression) => member_expression.module_id,
|
||||
BinaryPart::IfExpression(e) => e.module_id,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl MemberObject {
|
||||
pub fn module_id(&self) -> ModuleId {
|
||||
match self {
|
||||
MemberObject::MemberExpression(member_expression) => member_expression.module_id,
|
||||
MemberObject::Identifier(identifier) => identifier.module_id,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl LiteralIdentifier {
|
||||
pub fn module_id(&self) -> ModuleId {
|
||||
match self {
|
||||
LiteralIdentifier::Identifier(identifier) => identifier.module_id,
|
||||
LiteralIdentifier::Literal(literal) => literal.module_id,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -9,7 +9,7 @@ use kittycad_modeling_cmds as kcmc;
|
||||
use crate::{
|
||||
engine::EngineManager,
|
||||
errors::{KclError, KclErrorDetails},
|
||||
executor::Point2d,
|
||||
execution::Point2d,
|
||||
parsing::ast::types::{
|
||||
ArrayExpression, CallExpression, ConstraintLevel, FormatOptions, Literal, Node, PipeExpression,
|
||||
PipeSubstitution, VariableDeclarator,
|
||||
@ -42,7 +42,7 @@ pub async fn modify_ast_for_sketch(
|
||||
// The name of the sketch.
|
||||
sketch_name: &str,
|
||||
// The type of plane the sketch is on. `XY` or `XZ`, etc
|
||||
plane: crate::executor::PlaneType,
|
||||
plane: crate::execution::PlaneType,
|
||||
// The ID of the parent sketch.
|
||||
sketch_id: uuid::Uuid,
|
||||
) -> Result<String, KclError> {
|
||||
@ -196,7 +196,7 @@ fn create_start_sketch_on(
|
||||
name: &str,
|
||||
start: [f64; 2],
|
||||
end: [f64; 2],
|
||||
plane: crate::executor::PlaneType,
|
||||
plane: crate::execution::PlaneType,
|
||||
additional_lines: Vec<[f64; 2]>,
|
||||
) -> Result<Node<VariableDeclarator>, KclError> {
|
||||
let start_sketch_on = CallExpression::new("startSketchOn", vec![Literal::new(plane.to_string().into()).into()])?;
|
||||
|
@ -1,71 +0,0 @@
|
||||
use crate::{
|
||||
parsing::ast::types::{BinaryPart, BodyItem, Expr, LiteralIdentifier, MemberObject},
|
||||
source_range::ModuleId,
|
||||
};
|
||||
|
||||
impl BodyItem {
|
||||
pub fn module_id(&self) -> ModuleId {
|
||||
match self {
|
||||
BodyItem::ImportStatement(stmt) => stmt.module_id,
|
||||
BodyItem::ExpressionStatement(expression_statement) => expression_statement.module_id,
|
||||
BodyItem::VariableDeclaration(variable_declaration) => variable_declaration.module_id,
|
||||
BodyItem::ReturnStatement(return_statement) => return_statement.module_id,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Expr {
|
||||
pub fn module_id(&self) -> ModuleId {
|
||||
match self {
|
||||
Expr::Literal(literal) => literal.module_id,
|
||||
Expr::Identifier(identifier) => identifier.module_id,
|
||||
Expr::TagDeclarator(tag) => tag.module_id,
|
||||
Expr::BinaryExpression(binary_expression) => binary_expression.module_id,
|
||||
Expr::FunctionExpression(function_expression) => function_expression.module_id,
|
||||
Expr::CallExpression(call_expression) => call_expression.module_id,
|
||||
Expr::CallExpressionKw(call_expression) => call_expression.module_id,
|
||||
Expr::PipeExpression(pipe_expression) => pipe_expression.module_id,
|
||||
Expr::PipeSubstitution(pipe_substitution) => pipe_substitution.module_id,
|
||||
Expr::ArrayExpression(array_expression) => array_expression.module_id,
|
||||
Expr::ArrayRangeExpression(array_range) => array_range.module_id,
|
||||
Expr::ObjectExpression(object_expression) => object_expression.module_id,
|
||||
Expr::MemberExpression(member_expression) => member_expression.module_id,
|
||||
Expr::UnaryExpression(unary_expression) => unary_expression.module_id,
|
||||
Expr::IfExpression(expr) => expr.module_id,
|
||||
Expr::None(none) => none.module_id,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl BinaryPart {
|
||||
pub fn module_id(&self) -> ModuleId {
|
||||
match self {
|
||||
BinaryPart::Literal(literal) => literal.module_id,
|
||||
BinaryPart::Identifier(identifier) => identifier.module_id,
|
||||
BinaryPart::BinaryExpression(binary_expression) => binary_expression.module_id,
|
||||
BinaryPart::CallExpression(call_expression) => call_expression.module_id,
|
||||
BinaryPart::CallExpressionKw(call_expression) => call_expression.module_id,
|
||||
BinaryPart::UnaryExpression(unary_expression) => unary_expression.module_id,
|
||||
BinaryPart::MemberExpression(member_expression) => member_expression.module_id,
|
||||
BinaryPart::IfExpression(e) => e.module_id,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl MemberObject {
|
||||
pub fn module_id(&self) -> ModuleId {
|
||||
match self {
|
||||
MemberObject::MemberExpression(member_expression) => member_expression.module_id,
|
||||
MemberObject::Identifier(identifier) => identifier.module_id,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl LiteralIdentifier {
|
||||
pub fn module_id(&self) -> ModuleId {
|
||||
match self {
|
||||
LiteralIdentifier::Identifier(identifier) => identifier.module_id,
|
||||
LiteralIdentifier::Literal(literal) => literal.module_id,
|
||||
}
|
||||
}
|
||||
}
|
@ -8,7 +8,6 @@ use std::{
|
||||
};
|
||||
|
||||
use anyhow::Result;
|
||||
use async_recursion::async_recursion;
|
||||
use parse_display::{Display, FromStr};
|
||||
use schemars::JsonSchema;
|
||||
use serde::{Deserialize, Serialize};
|
||||
@ -17,7 +16,7 @@ use tower_lsp::lsp_types::{
|
||||
CompletionItem, CompletionItemKind, DocumentSymbol, FoldingRange, FoldingRangeKind, Range as LspRange, SymbolKind,
|
||||
};
|
||||
|
||||
use super::{digest::Digest, execute::execute_pipe_body};
|
||||
use super::digest::Digest;
|
||||
pub use crate::parsing::ast::types::{
|
||||
condition::{ElseIf, IfExpression},
|
||||
literal_value::LiteralValue,
|
||||
@ -26,7 +25,7 @@ pub use crate::parsing::ast::types::{
|
||||
use crate::{
|
||||
docs::StdLibFn,
|
||||
errors::KclError,
|
||||
executor::{ExecState, ExecutorContext, KclValue, Metadata, TagIdentifier},
|
||||
execution::{KclValue, Metadata, TagIdentifier},
|
||||
parsing::PIPE_OPERATOR,
|
||||
source_range::{ModuleId, SourceRange},
|
||||
};
|
||||
@ -466,11 +465,9 @@ impl Program {
|
||||
continue;
|
||||
}
|
||||
BodyItem::VariableDeclaration(ref mut variable_declaration) => {
|
||||
for declaration in &mut variable_declaration.declarations {
|
||||
if declaration.id.name == name {
|
||||
*declaration = declarator;
|
||||
return;
|
||||
}
|
||||
if variable_declaration.declaration.id.name == name {
|
||||
variable_declaration.declaration = declarator;
|
||||
return;
|
||||
}
|
||||
}
|
||||
BodyItem::ReturnStatement(_return_statement) => continue,
|
||||
@ -501,20 +498,16 @@ impl Program {
|
||||
for item in &self.body {
|
||||
match item {
|
||||
BodyItem::ImportStatement(stmt) => {
|
||||
for import_item in &stmt.items {
|
||||
if import_item.identifier() == name {
|
||||
return Some(Definition::Import(stmt.as_ref()));
|
||||
}
|
||||
if stmt.get_variable(name) {
|
||||
return Some(Definition::Import(stmt));
|
||||
}
|
||||
}
|
||||
BodyItem::ExpressionStatement(_expression_statement) => {
|
||||
continue;
|
||||
}
|
||||
BodyItem::VariableDeclaration(variable_declaration) => {
|
||||
for declaration in &variable_declaration.declarations {
|
||||
if declaration.id.name == name {
|
||||
return Some(Definition::Variable(declaration));
|
||||
}
|
||||
if variable_declaration.declaration.id.name == name {
|
||||
return Some(Definition::Variable(&variable_declaration.declaration));
|
||||
}
|
||||
}
|
||||
BodyItem::ReturnStatement(_return_statement) => continue,
|
||||
@ -1125,7 +1118,7 @@ impl NonCodeMeta {
|
||||
pub struct ImportItem {
|
||||
/// Name of the item to import.
|
||||
pub name: Node<Identifier>,
|
||||
/// Rename the item using an identifier after "as".
|
||||
/// Rename the item using an identifier after `as`.
|
||||
pub alias: Option<Node<Identifier>>,
|
||||
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
@ -1171,13 +1164,71 @@ impl ImportItem {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)]
|
||||
#[ts(export)]
|
||||
#[serde(tag = "type")]
|
||||
#[allow(clippy::large_enum_variant)]
|
||||
pub enum ImportSelector {
|
||||
/// A comma-separated list of names and possible aliases to import (may be a single item, but never zero).
|
||||
/// E.g., `import bar as baz from "foo.kcl"`
|
||||
List { items: NodeList<ImportItem> },
|
||||
/// Import all public items from a module.
|
||||
/// E.g., `import * from "foo.kcl"`
|
||||
Glob(Node<()>),
|
||||
/// Import the module itself (the param is an optional alias).
|
||||
/// E.g., `import "foo.kcl" as bar`
|
||||
None(Option<Node<Identifier>>),
|
||||
}
|
||||
|
||||
impl ImportSelector {
|
||||
pub fn rename_symbol(&mut self, new_name: &str, pos: usize) -> Option<String> {
|
||||
match self {
|
||||
ImportSelector::List { items } => {
|
||||
for item in items {
|
||||
let source_range = SourceRange::from(&*item);
|
||||
if source_range.contains(pos) {
|
||||
let old_name = item.rename_symbol(new_name, pos);
|
||||
if old_name.is_some() {
|
||||
return old_name;
|
||||
}
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
ImportSelector::Glob(_) => None,
|
||||
ImportSelector::None(None) => None,
|
||||
ImportSelector::None(Some(alias)) => {
|
||||
let alias_source_range = SourceRange::from(&*alias);
|
||||
if !alias_source_range.contains(pos) {
|
||||
return None;
|
||||
}
|
||||
let old_name = std::mem::replace(&mut alias.name, new_name.to_owned());
|
||||
Some(old_name)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn rename_identifiers(&mut self, old_name: &str, new_name: &str) {
|
||||
match self {
|
||||
ImportSelector::List { items } => {
|
||||
for item in items {
|
||||
item.rename_identifiers(old_name, new_name);
|
||||
}
|
||||
}
|
||||
ImportSelector::Glob(_) => {}
|
||||
ImportSelector::None(None) => {}
|
||||
ImportSelector::None(Some(alias)) => alias.rename(old_name, new_name),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)]
|
||||
#[ts(export)]
|
||||
#[serde(tag = "type")]
|
||||
pub struct ImportStatement {
|
||||
pub items: NodeList<ImportItem>,
|
||||
pub selector: ImportSelector,
|
||||
pub path: String,
|
||||
pub raw_path: String,
|
||||
pub visibility: ItemVisibility,
|
||||
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
#[ts(optional)]
|
||||
@ -1185,6 +1236,41 @@ pub struct ImportStatement {
|
||||
}
|
||||
|
||||
impl Node<ImportStatement> {
|
||||
pub fn get_variable(&self, name: &str) -> bool {
|
||||
match &self.selector {
|
||||
ImportSelector::List { items } => {
|
||||
for import_item in items {
|
||||
if import_item.identifier() == name {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
false
|
||||
}
|
||||
ImportSelector::Glob(_) => false,
|
||||
ImportSelector::None(_) => name == self.module_name().unwrap(),
|
||||
}
|
||||
}
|
||||
|
||||
/// Get the name of the module object for this import.
|
||||
/// Validated during parsing and guaranteed to return `Some` if the statement imports
|
||||
/// the module itself (i.e., self.selector is ImportSelector::None).
|
||||
pub fn module_name(&self) -> Option<String> {
|
||||
if let ImportSelector::None(Some(alias)) = &self.selector {
|
||||
return Some(alias.name.clone());
|
||||
}
|
||||
|
||||
let mut parts = self.path.split('.');
|
||||
let name = parts.next()?;
|
||||
let ext = parts.next()?;
|
||||
let rest = parts.next();
|
||||
|
||||
if rest.is_some() || ext != "kcl" {
|
||||
return None;
|
||||
}
|
||||
|
||||
Some(name.to_owned())
|
||||
}
|
||||
|
||||
pub fn get_constraint_level(&self) -> ConstraintLevel {
|
||||
ConstraintLevel::Full {
|
||||
source_ranges: vec![self.into()],
|
||||
@ -1192,24 +1278,13 @@ impl Node<ImportStatement> {
|
||||
}
|
||||
|
||||
pub fn rename_symbol(&mut self, new_name: &str, pos: usize) -> Option<String> {
|
||||
for item in &mut self.items {
|
||||
let source_range = SourceRange::from(&*item);
|
||||
if source_range.contains(pos) {
|
||||
let old_name = item.rename_symbol(new_name, pos);
|
||||
if old_name.is_some() {
|
||||
return old_name;
|
||||
}
|
||||
}
|
||||
}
|
||||
None
|
||||
self.selector.rename_symbol(new_name, pos)
|
||||
}
|
||||
}
|
||||
|
||||
impl ImportStatement {
|
||||
pub fn rename_identifiers(&mut self, old_name: &str, new_name: &str) {
|
||||
for item in &mut self.items {
|
||||
item.rename_identifiers(old_name, new_name);
|
||||
}
|
||||
self.selector.rename_identifiers(old_name, new_name);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1471,7 +1546,7 @@ impl ItemVisibility {
|
||||
#[ts(export)]
|
||||
#[serde(tag = "type")]
|
||||
pub struct VariableDeclaration {
|
||||
pub declarations: NodeList<VariableDeclarator>,
|
||||
pub declaration: Node<VariableDeclarator>,
|
||||
#[serde(default, skip_serializing_if = "ItemVisibility::is_default")]
|
||||
pub visibility: ItemVisibility,
|
||||
pub kind: VariableKind, // Change to enum if there are specific values
|
||||
@ -1483,33 +1558,29 @@ pub struct VariableDeclaration {
|
||||
|
||||
impl From<&Node<VariableDeclaration>> for Vec<CompletionItem> {
|
||||
fn from(declaration: &Node<VariableDeclaration>) -> Self {
|
||||
let mut completions = vec![];
|
||||
for variable in &declaration.declarations {
|
||||
completions.push(CompletionItem {
|
||||
label: variable.id.name.to_string(),
|
||||
label_details: None,
|
||||
kind: Some(match declaration.inner.kind {
|
||||
VariableKind::Const => CompletionItemKind::CONSTANT,
|
||||
VariableKind::Fn => CompletionItemKind::FUNCTION,
|
||||
}),
|
||||
detail: Some(declaration.inner.kind.to_string()),
|
||||
documentation: None,
|
||||
deprecated: None,
|
||||
preselect: None,
|
||||
sort_text: None,
|
||||
filter_text: None,
|
||||
insert_text: None,
|
||||
insert_text_format: None,
|
||||
insert_text_mode: None,
|
||||
text_edit: None,
|
||||
additional_text_edits: None,
|
||||
command: None,
|
||||
commit_characters: None,
|
||||
data: None,
|
||||
tags: None,
|
||||
})
|
||||
}
|
||||
completions
|
||||
vec![CompletionItem {
|
||||
label: declaration.declaration.id.name.to_string(),
|
||||
label_details: None,
|
||||
kind: Some(match declaration.inner.kind {
|
||||
VariableKind::Const => CompletionItemKind::CONSTANT,
|
||||
VariableKind::Fn => CompletionItemKind::FUNCTION,
|
||||
}),
|
||||
detail: Some(declaration.inner.kind.to_string()),
|
||||
documentation: None,
|
||||
deprecated: None,
|
||||
preselect: None,
|
||||
sort_text: None,
|
||||
filter_text: None,
|
||||
insert_text: None,
|
||||
insert_text_format: None,
|
||||
insert_text_mode: None,
|
||||
text_edit: None,
|
||||
additional_text_edits: None,
|
||||
command: None,
|
||||
commit_characters: None,
|
||||
data: None,
|
||||
tags: None,
|
||||
}]
|
||||
}
|
||||
}
|
||||
|
||||
@ -1543,13 +1614,11 @@ impl Node<VariableDeclaration> {
|
||||
return None;
|
||||
}
|
||||
|
||||
for declaration in &mut self.declarations {
|
||||
let declaration_source_range: SourceRange = declaration.id.clone().into();
|
||||
if declaration_source_range.contains(pos) {
|
||||
let old_name = declaration.id.name.clone();
|
||||
declaration.id.name = new_name.to_string();
|
||||
return Some(old_name);
|
||||
}
|
||||
let declaration_source_range: SourceRange = self.declaration.id.clone().into();
|
||||
if declaration_source_range.contains(pos) {
|
||||
let old_name = self.declaration.id.name.clone();
|
||||
self.declaration.id.name = new_name.to_string();
|
||||
return Some(old_name);
|
||||
}
|
||||
|
||||
None
|
||||
@ -1557,9 +1626,9 @@ impl Node<VariableDeclaration> {
|
||||
}
|
||||
|
||||
impl VariableDeclaration {
|
||||
pub fn new(declarations: NodeList<VariableDeclarator>, visibility: ItemVisibility, kind: VariableKind) -> Self {
|
||||
pub fn new(declaration: Node<VariableDeclarator>, visibility: ItemVisibility, kind: VariableKind) -> Self {
|
||||
Self {
|
||||
declarations,
|
||||
declaration,
|
||||
visibility,
|
||||
kind,
|
||||
digest: None,
|
||||
@ -1567,18 +1636,14 @@ impl VariableDeclaration {
|
||||
}
|
||||
|
||||
pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) {
|
||||
for declaration in &mut self.declarations {
|
||||
declaration.init.replace_value(source_range, new_value.clone());
|
||||
}
|
||||
self.declaration.init.replace_value(source_range, new_value.clone());
|
||||
}
|
||||
|
||||
/// Returns an Expr that includes the given character position.
|
||||
pub fn get_expr_for_position(&self, pos: usize) -> Option<&Expr> {
|
||||
for declaration in &self.declarations {
|
||||
let source_range: SourceRange = declaration.into();
|
||||
if source_range.contains(pos) {
|
||||
return Some(&declaration.init);
|
||||
}
|
||||
let source_range: SourceRange = self.declaration.clone().into();
|
||||
if source_range.contains(pos) {
|
||||
return Some(&self.declaration.init);
|
||||
}
|
||||
|
||||
None
|
||||
@ -1586,77 +1651,69 @@ impl VariableDeclaration {
|
||||
|
||||
/// Returns an Expr that includes the given character position.
|
||||
pub fn get_mut_expr_for_position(&mut self, pos: usize) -> Option<&mut Expr> {
|
||||
for declaration in &mut self.declarations {
|
||||
let source_range: SourceRange = declaration.clone().into();
|
||||
if source_range.contains(pos) {
|
||||
return Some(&mut declaration.init);
|
||||
}
|
||||
let source_range: SourceRange = self.declaration.clone().into();
|
||||
if source_range.contains(pos) {
|
||||
return Some(&mut self.declaration.init);
|
||||
}
|
||||
|
||||
None
|
||||
}
|
||||
|
||||
pub fn rename_identifiers(&mut self, old_name: &str, new_name: &str) {
|
||||
for declaration in &mut self.declarations {
|
||||
// Skip the init for the variable with the new name since it is the one we are renaming.
|
||||
if declaration.id.name == new_name {
|
||||
continue;
|
||||
}
|
||||
|
||||
declaration.init.rename_identifiers(old_name, new_name);
|
||||
// Skip the init for the variable with the new name since it is the one we are renaming.
|
||||
if self.declaration.id.name != new_name {
|
||||
self.declaration.init.rename_identifiers(old_name, new_name);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_lsp_symbols(&self, code: &str) -> Vec<DocumentSymbol> {
|
||||
let mut symbols = vec![];
|
||||
let source_range: SourceRange = self.declaration.clone().into();
|
||||
let inner_source_range: SourceRange = self.declaration.id.clone().into();
|
||||
|
||||
for declaration in &self.declarations {
|
||||
let source_range: SourceRange = declaration.into();
|
||||
let inner_source_range: SourceRange = declaration.id.clone().into();
|
||||
let mut symbol_kind = match self.kind {
|
||||
VariableKind::Fn => SymbolKind::FUNCTION,
|
||||
VariableKind::Const => SymbolKind::CONSTANT,
|
||||
};
|
||||
|
||||
let mut symbol_kind = match self.kind {
|
||||
VariableKind::Fn => SymbolKind::FUNCTION,
|
||||
VariableKind::Const => SymbolKind::CONSTANT,
|
||||
};
|
||||
|
||||
let children = match &declaration.init {
|
||||
Expr::FunctionExpression(function_expression) => {
|
||||
symbol_kind = SymbolKind::FUNCTION;
|
||||
let mut children = vec![];
|
||||
for param in &function_expression.params {
|
||||
let param_source_range: SourceRange = (¶m.identifier).into();
|
||||
#[allow(deprecated)]
|
||||
children.push(DocumentSymbol {
|
||||
name: param.identifier.name.clone(),
|
||||
detail: None,
|
||||
kind: SymbolKind::CONSTANT,
|
||||
range: param_source_range.to_lsp_range(code),
|
||||
selection_range: param_source_range.to_lsp_range(code),
|
||||
children: None,
|
||||
tags: None,
|
||||
deprecated: None,
|
||||
});
|
||||
}
|
||||
children
|
||||
let children = match &self.declaration.init {
|
||||
Expr::FunctionExpression(function_expression) => {
|
||||
symbol_kind = SymbolKind::FUNCTION;
|
||||
let mut children = vec![];
|
||||
for param in &function_expression.params {
|
||||
let param_source_range: SourceRange = (¶m.identifier).into();
|
||||
#[allow(deprecated)]
|
||||
children.push(DocumentSymbol {
|
||||
name: param.identifier.name.clone(),
|
||||
detail: None,
|
||||
kind: SymbolKind::CONSTANT,
|
||||
range: param_source_range.to_lsp_range(code),
|
||||
selection_range: param_source_range.to_lsp_range(code),
|
||||
children: None,
|
||||
tags: None,
|
||||
deprecated: None,
|
||||
});
|
||||
}
|
||||
Expr::ObjectExpression(object_expression) => {
|
||||
symbol_kind = SymbolKind::OBJECT;
|
||||
let mut children = vec![];
|
||||
for property in &object_expression.properties {
|
||||
children.extend(property.get_lsp_symbols(code));
|
||||
}
|
||||
children
|
||||
children
|
||||
}
|
||||
Expr::ObjectExpression(object_expression) => {
|
||||
symbol_kind = SymbolKind::OBJECT;
|
||||
let mut children = vec![];
|
||||
for property in &object_expression.properties {
|
||||
children.extend(property.get_lsp_symbols(code));
|
||||
}
|
||||
Expr::ArrayExpression(_) => {
|
||||
symbol_kind = SymbolKind::ARRAY;
|
||||
vec![]
|
||||
}
|
||||
_ => vec![],
|
||||
};
|
||||
children
|
||||
}
|
||||
Expr::ArrayExpression(_) => {
|
||||
symbol_kind = SymbolKind::ARRAY;
|
||||
vec![]
|
||||
}
|
||||
_ => vec![],
|
||||
};
|
||||
|
||||
vec![
|
||||
#[allow(deprecated)]
|
||||
symbols.push(DocumentSymbol {
|
||||
name: declaration.id.name.clone(),
|
||||
DocumentSymbol {
|
||||
name: self.declaration.id.name.clone(),
|
||||
detail: Some(self.kind.to_string()),
|
||||
kind: symbol_kind,
|
||||
range: source_range.to_lsp_range(code),
|
||||
@ -1664,10 +1721,8 @@ impl VariableDeclaration {
|
||||
children: Some(children),
|
||||
tags: None,
|
||||
deprecated: None,
|
||||
});
|
||||
}
|
||||
|
||||
symbols
|
||||
},
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@ -2629,11 +2684,6 @@ impl Node<PipeExpression> {
|
||||
|
||||
constraint_levels.get_constraint_level(self.into())
|
||||
}
|
||||
|
||||
#[async_recursion]
|
||||
pub async fn get_result(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result<KclValue, KclError> {
|
||||
execute_pipe_body(exec_state, &self.body, self.into(), ctx).await
|
||||
}
|
||||
}
|
||||
|
||||
impl PipeExpression {
|
||||
@ -2783,6 +2833,18 @@ impl Parameter {
|
||||
}
|
||||
}
|
||||
|
||||
impl From<&Parameter> for SourceRange {
|
||||
fn from(p: &Parameter) -> Self {
|
||||
let sr = Self::from(&p.identifier);
|
||||
// If it's unlabelled, the span should start 1 char earlier than the identifier,
|
||||
// to include the '@' symbol.
|
||||
if !p.labeled {
|
||||
return Self::new(sr.start() - 1, sr.end(), sr.module_id());
|
||||
}
|
||||
sr
|
||||
}
|
||||
}
|
||||
|
||||
fn is_true(b: &bool) -> bool {
|
||||
*b
|
||||
}
|
||||
@ -3243,7 +3305,7 @@ const cylinder = startSketchOn('-XZ')
|
||||
let BodyItem::VariableDeclaration(var_decl) = function else {
|
||||
panic!("expected a variable declaration")
|
||||
};
|
||||
let Expr::FunctionExpression(ref func_expr) = var_decl.declarations.first().unwrap().init else {
|
||||
let Expr::FunctionExpression(ref func_expr) = var_decl.declaration.init else {
|
||||
panic!("expected a function expression")
|
||||
};
|
||||
let params = &func_expr.params;
|
||||
@ -3265,7 +3327,7 @@ const cylinder = startSketchOn('-XZ')
|
||||
let BodyItem::VariableDeclaration(var_decl) = function else {
|
||||
panic!("expected a variable declaration")
|
||||
};
|
||||
let Expr::FunctionExpression(ref func_expr) = var_decl.declarations.first().unwrap().init else {
|
||||
let Expr::FunctionExpression(ref func_expr) = var_decl.declaration.init else {
|
||||
panic!("expected a function expression")
|
||||
};
|
||||
let params = &func_expr.params;
|
||||
@ -3288,7 +3350,7 @@ const cylinder = startSketchOn('-XZ')
|
||||
let BodyItem::VariableDeclaration(var_decl) = function else {
|
||||
panic!("expected a variable declaration")
|
||||
};
|
||||
let Expr::FunctionExpression(ref func_expr) = var_decl.declarations.first().unwrap().init else {
|
||||
let Expr::FunctionExpression(ref func_expr) = var_decl.declaration.init else {
|
||||
panic!("expected a function expression")
|
||||
};
|
||||
let params = &func_expr.params;
|
||||
@ -3362,7 +3424,7 @@ const cylinder = startSketchOn('-XZ')
|
||||
let BodyItem::VariableDeclaration(var_decl) = function else {
|
||||
panic!("expected a variable declaration")
|
||||
};
|
||||
let Expr::FunctionExpression(ref func_expr) = var_decl.declarations.first().unwrap().init else {
|
||||
let Expr::FunctionExpression(ref func_expr) = var_decl.declaration.init else {
|
||||
panic!("expected a function expression")
|
||||
};
|
||||
let params = &func_expr.params;
|
||||
|
@ -4,7 +4,7 @@ use schemars::JsonSchema;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use super::Node;
|
||||
use crate::{executor::KclValue, parsing::ast::types::ConstraintLevel};
|
||||
use crate::{execution::KclValue, parsing::ast::types::ConstraintLevel};
|
||||
|
||||
const KCL_NONE_ID: &str = "KCL_NONE_ID";
|
||||
|
||||
|
@ -19,11 +19,11 @@ use crate::{
|
||||
ast::types::{
|
||||
ArrayExpression, ArrayRangeExpression, BinaryExpression, BinaryOperator, BinaryPart, BodyItem, BoxNode,
|
||||
CallExpression, CallExpressionKw, CommentStyle, DefaultParamVal, ElseIf, Expr, ExpressionStatement,
|
||||
FnArgPrimitive, FnArgType, FunctionExpression, Identifier, IfExpression, ImportItem, ImportStatement,
|
||||
ItemVisibility, LabeledArg, Literal, LiteralIdentifier, LiteralValue, MemberExpression, MemberObject, Node,
|
||||
NonCodeMeta, NonCodeNode, NonCodeValue, ObjectExpression, ObjectProperty, Parameter, PipeExpression,
|
||||
PipeSubstitution, Program, ReturnStatement, Shebang, TagDeclarator, UnaryExpression, UnaryOperator,
|
||||
VariableDeclaration, VariableDeclarator, VariableKind,
|
||||
FnArgPrimitive, FnArgType, FunctionExpression, Identifier, IfExpression, ImportItem, ImportSelector,
|
||||
ImportStatement, ItemVisibility, LabeledArg, Literal, LiteralIdentifier, LiteralValue, MemberExpression,
|
||||
MemberObject, Node, NodeList, NonCodeMeta, NonCodeNode, NonCodeValue, ObjectExpression, ObjectProperty,
|
||||
Parameter, PipeExpression, PipeSubstitution, Program, ReturnStatement, Shebang, TagDeclarator,
|
||||
UnaryExpression, UnaryOperator, VariableDeclaration, VariableDeclarator, VariableKind,
|
||||
},
|
||||
math::BinaryExpressionToken,
|
||||
token::{Token, TokenType},
|
||||
@ -1217,7 +1217,6 @@ fn noncode_just_after_code(i: TokenSlice) -> PResult<Node<NonCodeNode>> {
|
||||
// the large_enum_variant lint below introduces a LOT of code complexity in a
|
||||
// match!() that's super clean that isn't worth it for the marginal space
|
||||
// savings. revisit if that's a lie.
|
||||
|
||||
#[derive(Debug)]
|
||||
#[allow(clippy::large_enum_variant)]
|
||||
enum WithinFunction {
|
||||
@ -1238,7 +1237,8 @@ fn body_items_within_function(i: TokenSlice) -> PResult<WithinFunction> {
|
||||
// Any of the body item variants, each of which can optionally be followed by a comment.
|
||||
// If there is a comment, it may be preceded by whitespace.
|
||||
let item = dispatch! {peek(any);
|
||||
token if token.declaration_keyword().is_some() || token.visibility_keyword().is_some() =>
|
||||
token if token.visibility_keyword().is_some() => (alt((declaration.map(BodyItem::VariableDeclaration), import_stmt.map(BodyItem::ImportStatement))), opt(noncode_just_after_code)).map(WithinFunction::BodyItem),
|
||||
token if token.declaration_keyword().is_some() =>
|
||||
(declaration.map(BodyItem::VariableDeclaration), opt(noncode_just_after_code)).map(WithinFunction::BodyItem),
|
||||
token if token.value == "import" && matches!(token.token_type, TokenType::Keyword) =>
|
||||
(import_stmt.map(BodyItem::ImportStatement), opt(noncode_just_after_code)).map(WithinFunction::BodyItem),
|
||||
@ -1407,7 +1407,22 @@ fn function_body(i: TokenSlice) -> PResult<Node<Program>> {
|
||||
))
|
||||
}
|
||||
|
||||
fn import_items(i: TokenSlice) -> PResult<NodeList<ImportItem>> {
|
||||
separated(1.., import_item, comma_sep)
|
||||
.parse_next(i)
|
||||
.map_err(|e| e.cut())
|
||||
}
|
||||
|
||||
fn glob(i: TokenSlice) -> PResult<Token> {
|
||||
one_of((TokenType::Operator, "*"))
|
||||
.context(expected("the multiple import operator, *"))
|
||||
.parse_next(i)
|
||||
}
|
||||
|
||||
fn import_stmt(i: TokenSlice) -> PResult<BoxNode<ImportStatement>> {
|
||||
let (visibility, visibility_token) = opt(terminated(item_visibility, whitespace))
|
||||
.parse_next(i)?
|
||||
.map_or((ItemVisibility::Default, None), |pair| (pair.0, Some(pair.1)));
|
||||
let import_token = any
|
||||
.try_map(|token: Token| {
|
||||
if matches!(token.token_type, TokenType::Keyword) && token.value == "import" {
|
||||
@ -1421,38 +1436,63 @@ fn import_stmt(i: TokenSlice) -> PResult<BoxNode<ImportStatement>> {
|
||||
})
|
||||
.context(expected("the 'import' keyword"))
|
||||
.parse_next(i)?;
|
||||
let start = import_token.start;
|
||||
|
||||
let module_id = import_token.module_id;
|
||||
let start = visibility_token.unwrap_or(import_token).start;
|
||||
|
||||
require_whitespace(i)?;
|
||||
|
||||
let items = separated(1.., import_item, comma_sep)
|
||||
.parse_next(i)
|
||||
.map_err(|e| e.cut())?;
|
||||
let (mut selector, path) = alt((
|
||||
string_literal.map(|s| (ImportSelector::None(None), Some(s))),
|
||||
glob.map(|t| {
|
||||
let s = t.as_source_range();
|
||||
(
|
||||
ImportSelector::Glob(Node::new((), s.start(), s.end(), s.module_id())),
|
||||
None,
|
||||
)
|
||||
}),
|
||||
import_items.map(|items| (ImportSelector::List { items }, None)),
|
||||
))
|
||||
.parse_next(i)?;
|
||||
|
||||
require_whitespace(i)?;
|
||||
let path = match path {
|
||||
Some(path) => path,
|
||||
None => {
|
||||
require_whitespace(i)?;
|
||||
any.try_map(|token: Token| {
|
||||
if matches!(token.token_type, TokenType::Keyword | TokenType::Word) && token.value == "from" {
|
||||
Ok(())
|
||||
} else {
|
||||
Err(CompilationError::fatal(
|
||||
token.as_source_range(),
|
||||
format!("{} is not the 'from' keyword", token.value.as_str()),
|
||||
))
|
||||
}
|
||||
})
|
||||
.context(expected("the 'from' keyword"))
|
||||
.parse_next(i)
|
||||
.map_err(|e| e.cut())?;
|
||||
|
||||
any.try_map(|token: Token| {
|
||||
if matches!(token.token_type, TokenType::Keyword | TokenType::Word) && token.value == "from" {
|
||||
Ok(())
|
||||
} else {
|
||||
Err(CompilationError::fatal(
|
||||
token.as_source_range(),
|
||||
format!("{} is not the 'from' keyword", token.value.as_str()),
|
||||
))
|
||||
require_whitespace(i)?;
|
||||
|
||||
string_literal(i)?
|
||||
}
|
||||
})
|
||||
.context(expected("the 'from' keyword"))
|
||||
.parse_next(i)
|
||||
.map_err(|e| e.cut())?;
|
||||
};
|
||||
|
||||
require_whitespace(i)?;
|
||||
|
||||
let path = string_literal(i)?;
|
||||
let end = path.end;
|
||||
let mut end: usize = path.end;
|
||||
let path_string = match path.inner.value {
|
||||
LiteralValue::String(s) => s,
|
||||
_ => unreachable!(),
|
||||
};
|
||||
if path_string.is_empty() {
|
||||
return Err(ErrMode::Cut(
|
||||
CompilationError::fatal(
|
||||
SourceRange::new(path.start, path.end, path.module_id),
|
||||
"import path cannot be empty",
|
||||
)
|
||||
.into(),
|
||||
));
|
||||
}
|
||||
if path_string
|
||||
.chars()
|
||||
.any(|c| !c.is_ascii_alphanumeric() && c != '_' && c != '-' && c != '.')
|
||||
@ -1465,16 +1505,44 @@ fn import_stmt(i: TokenSlice) -> PResult<BoxNode<ImportStatement>> {
|
||||
.into(),
|
||||
));
|
||||
}
|
||||
|
||||
if let ImportSelector::None(ref mut a) = selector {
|
||||
if let Some(alias) = opt(preceded(
|
||||
(whitespace, import_as_keyword, whitespace),
|
||||
identifier.context(expected("an identifier to alias the import")),
|
||||
))
|
||||
.parse_next(i)?
|
||||
{
|
||||
end = alias.end;
|
||||
*a = Some(alias);
|
||||
}
|
||||
|
||||
if a.is_none()
|
||||
&& (!path_string.ends_with(".kcl")
|
||||
|| path_string.starts_with("_")
|
||||
|| path_string.contains('-')
|
||||
|| path_string[0..path_string.len() - 4].contains('.'))
|
||||
{
|
||||
return Err(ErrMode::Cut(
|
||||
CompilationError::fatal(
|
||||
SourceRange::new(path.start, path.end, path.module_id),
|
||||
"import path is not a valid identifier and must be aliased.".to_owned(),
|
||||
)
|
||||
.into(),
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
Ok(Node::boxed(
|
||||
ImportStatement {
|
||||
items,
|
||||
selector,
|
||||
visibility,
|
||||
path: path_string,
|
||||
raw_path: path.inner.raw,
|
||||
digest: None,
|
||||
},
|
||||
start,
|
||||
end,
|
||||
import_token.module_id,
|
||||
module_id,
|
||||
))
|
||||
}
|
||||
|
||||
@ -1707,7 +1775,7 @@ fn declaration(i: TokenSlice) -> PResult<BoxNode<VariableDeclaration>> {
|
||||
let end = val.end();
|
||||
Ok(Box::new(Node {
|
||||
inner: VariableDeclaration {
|
||||
declarations: vec![Node {
|
||||
declaration: Node {
|
||||
start: id.start,
|
||||
end,
|
||||
module_id,
|
||||
@ -1716,7 +1784,7 @@ fn declaration(i: TokenSlice) -> PResult<BoxNode<VariableDeclaration>> {
|
||||
init: val,
|
||||
digest: None,
|
||||
},
|
||||
}],
|
||||
},
|
||||
visibility,
|
||||
kind,
|
||||
digest: None,
|
||||
@ -1787,22 +1855,59 @@ impl TryFrom<Token> for Node<TagDeclarator> {
|
||||
type Error = CompilationError;
|
||||
|
||||
fn try_from(token: Token) -> Result<Self, Self::Error> {
|
||||
if token.token_type == TokenType::Word {
|
||||
Ok(Node::new(
|
||||
TagDeclarator {
|
||||
// We subtract 1 from the start because the tag starts with a `$`.
|
||||
name: token.value,
|
||||
digest: None,
|
||||
},
|
||||
token.start - 1,
|
||||
token.end,
|
||||
token.module_id,
|
||||
))
|
||||
} else {
|
||||
Err(CompilationError::fatal(
|
||||
match token.token_type {
|
||||
TokenType::Word => {
|
||||
Ok(Node::new(
|
||||
TagDeclarator {
|
||||
// We subtract 1 from the start because the tag starts with a `$`.
|
||||
name: token.value,
|
||||
digest: None,
|
||||
},
|
||||
token.start - 1,
|
||||
token.end,
|
||||
token.module_id,
|
||||
))
|
||||
}
|
||||
TokenType::Number => Err(CompilationError::fatal(
|
||||
token.as_source_range(),
|
||||
format!(
|
||||
"Tag names must not start with a number. Tag starts with `{}`",
|
||||
token.value.as_str()
|
||||
),
|
||||
)),
|
||||
|
||||
// e.g. `line(%, $)` or `line(%, $ , 5)`
|
||||
TokenType::Brace | TokenType::Whitespace | TokenType::Comma => Err(CompilationError::fatal(
|
||||
token.as_source_range(),
|
||||
"Tag names must not be empty".to_string(),
|
||||
)),
|
||||
|
||||
TokenType::Type => Err(CompilationError::fatal(
|
||||
token.as_source_range(),
|
||||
format!("Cannot assign a tag to a reserved keyword: {}", token.value.as_str()),
|
||||
))
|
||||
)),
|
||||
|
||||
TokenType::Bang
|
||||
| TokenType::At
|
||||
| TokenType::Hash
|
||||
| TokenType::Colon
|
||||
| TokenType::Period
|
||||
| TokenType::Operator
|
||||
| TokenType::DoublePeriod
|
||||
| TokenType::QuestionMark
|
||||
| TokenType::BlockComment
|
||||
| TokenType::Function
|
||||
| TokenType::String
|
||||
| TokenType::Dollar
|
||||
| TokenType::Keyword
|
||||
| TokenType::Unknown
|
||||
| TokenType::LineComment => Err(CompilationError::fatal(
|
||||
token.as_source_range(),
|
||||
// this is `start with` because if most of these cases are in the middle, it ends
|
||||
// up hitting a different error path(e.g. including a bang) or being valid(e.g. including a comment) since it will get broken up into
|
||||
// multiple tokens
|
||||
format!("Tag names must not start with a {}", token.token_type),
|
||||
)),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1826,7 +1931,8 @@ fn tag(i: TokenSlice) -> PResult<Node<TagDeclarator>> {
|
||||
let tag_declarator = any
|
||||
.try_map(Node::<TagDeclarator>::try_from)
|
||||
.context(expected("a tag, e.g. '$seg01' or '$line01'"))
|
||||
.parse_next(i)?;
|
||||
.parse_next(i)
|
||||
.map_err(|e| e.cut())?;
|
||||
// Now that we've parsed a tag declarator, verify that it's not a stdlib
|
||||
// name. If it is, stop backtracking.
|
||||
tag_declarator
|
||||
@ -2074,6 +2180,11 @@ fn question_mark(i: TokenSlice) -> PResult<()> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn at_sign(i: TokenSlice) -> PResult<()> {
|
||||
TokenType::At.parse_from(i)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn fun(i: TokenSlice) -> PResult<Token> {
|
||||
any.try_map(|token: Token| match token.token_type {
|
||||
TokenType::Keyword if token.value == "fn" => Ok(token),
|
||||
@ -2146,13 +2257,15 @@ fn argument_type(i: TokenSlice) -> PResult<FnArgType> {
|
||||
}
|
||||
|
||||
struct ParamDescription {
|
||||
labeled: bool,
|
||||
arg_name: Token,
|
||||
type_: std::option::Option<FnArgType>,
|
||||
is_optional: bool,
|
||||
}
|
||||
|
||||
fn parameter(i: TokenSlice) -> PResult<ParamDescription> {
|
||||
let (arg_name, optional, _, type_) = (
|
||||
let (found_at_sign, arg_name, optional, _, type_) = (
|
||||
opt(at_sign),
|
||||
any.verify(|token: &Token| !matches!(token.token_type, TokenType::Brace) || token.value != ")"),
|
||||
opt(question_mark),
|
||||
opt(whitespace),
|
||||
@ -2160,6 +2273,7 @@ fn parameter(i: TokenSlice) -> PResult<ParamDescription> {
|
||||
)
|
||||
.parse_next(i)?;
|
||||
Ok(ParamDescription {
|
||||
labeled: found_at_sign.is_none(),
|
||||
arg_name,
|
||||
type_,
|
||||
is_optional: optional.is_some(),
|
||||
@ -2178,6 +2292,7 @@ fn parameters(i: TokenSlice) -> PResult<Vec<Parameter>> {
|
||||
.into_iter()
|
||||
.map(
|
||||
|ParamDescription {
|
||||
labeled,
|
||||
arg_name,
|
||||
type_,
|
||||
is_optional,
|
||||
@ -2193,7 +2308,7 @@ fn parameters(i: TokenSlice) -> PResult<Vec<Parameter>> {
|
||||
} else {
|
||||
None
|
||||
},
|
||||
labeled: true,
|
||||
labeled,
|
||||
digest: None,
|
||||
})
|
||||
},
|
||||
@ -2201,6 +2316,15 @@ fn parameters(i: TokenSlice) -> PResult<Vec<Parameter>> {
|
||||
.collect::<Result<_, _>>()
|
||||
.map_err(|e: CompilationError| ErrMode::Backtrack(ContextError::from(e)))?;
|
||||
|
||||
// Make sure the only unlabeled parameter is the first one.
|
||||
if let Some(param) = params.iter().skip(1).find(|param| !param.labeled) {
|
||||
let source_range = SourceRange::from(param);
|
||||
return Err(ErrMode::Cut(ContextError::from(CompilationError::fatal(
|
||||
source_range,
|
||||
"Only the first parameter can be declared unlabeled",
|
||||
))));
|
||||
}
|
||||
|
||||
// Make sure optional parameters are last.
|
||||
if let Err(e) = optional_after_required(¶ms) {
|
||||
return Err(ErrMode::Cut(ContextError::from(e)));
|
||||
@ -2304,6 +2428,7 @@ fn fn_call(i: TokenSlice) -> PResult<Node<CallExpression>> {
|
||||
opt(whitespace).parse_next(i)?;
|
||||
let _ = terminated(open_paren, opt(whitespace)).parse_next(i)?;
|
||||
let args = arguments(i)?;
|
||||
|
||||
if let Some(std_fn) = crate::std::get_stdlib_fn(&fn_name.name) {
|
||||
let just_args: Vec<_> = args.iter().collect();
|
||||
typecheck_all(std_fn, &just_args)?;
|
||||
@ -2383,10 +2508,11 @@ mod tests {
|
||||
// example, "return" is the problem.
|
||||
assert!(
|
||||
err.message.starts_with("Unexpected token: ")
|
||||
|| err.message.starts_with("= is not")
|
||||
|| err
|
||||
.message
|
||||
.starts_with("Cannot assign a variable to a reserved keyword: "),
|
||||
"Error message is: {}",
|
||||
"Error message is: `{}`",
|
||||
err.message,
|
||||
);
|
||||
}
|
||||
@ -2449,7 +2575,7 @@ mod tests {
|
||||
let tokens = crate::parsing::token::lexer("x = 4", ModuleId::default()).unwrap();
|
||||
let vardec = declaration(&mut tokens.as_slice()).unwrap();
|
||||
assert_eq!(vardec.inner.kind, VariableKind::Const);
|
||||
let vardec = vardec.declarations.first().unwrap();
|
||||
let vardec = &vardec.declaration;
|
||||
assert_eq!(vardec.id.name, "x");
|
||||
let Expr::Literal(init_val) = &vardec.init else {
|
||||
panic!("weird init value")
|
||||
@ -2524,10 +2650,10 @@ const mySk1 = startSketchAt([0, 0])"#;
|
||||
fn test_comment_in_pipe() {
|
||||
let tokens = crate::parsing::token::lexer(r#"const x = y() |> /*hi*/ z(%)"#, ModuleId::default()).unwrap();
|
||||
let mut body = program.parse(&tokens).unwrap().inner.body;
|
||||
let BodyItem::VariableDeclaration(mut item) = body.remove(0) else {
|
||||
let BodyItem::VariableDeclaration(item) = body.remove(0) else {
|
||||
panic!("expected vardec");
|
||||
};
|
||||
let val = item.declarations.remove(0).inner.init;
|
||||
let val = item.inner.declaration.inner.init;
|
||||
let Expr::PipeExpression(pipe) = val else {
|
||||
panic!("expected pipe");
|
||||
};
|
||||
@ -2795,14 +2921,14 @@ const mySk1 = startSketchAt([0, 0])"#;
|
||||
.enumerate()
|
||||
{
|
||||
let tokens = crate::parsing::token::lexer(test_input, ModuleId::default()).unwrap();
|
||||
let mut actual = match declaration.parse(&tokens) {
|
||||
let actual = match declaration.parse(&tokens) {
|
||||
Err(e) => panic!("Could not parse test {i}: {e:#?}"),
|
||||
Ok(a) => a,
|
||||
};
|
||||
let Expr::BinaryExpression(_expr) = actual.declarations.remove(0).inner.init else {
|
||||
let Expr::BinaryExpression(_expr) = &actual.declaration.inner.init else {
|
||||
panic!(
|
||||
"Expected test {i} to be a binary expression but it wasn't, it was {:?}",
|
||||
actual.declarations[0]
|
||||
actual.declaration
|
||||
);
|
||||
};
|
||||
// TODO: check both sides are 1... probably not necessary but should do.
|
||||
@ -3144,16 +3270,15 @@ const mySk1 = startSketchAt([0, 0])"#;
|
||||
};
|
||||
|
||||
// Run the second parser, check it matches the first parser.
|
||||
let mut actual = declaration.parse(&tokens).unwrap();
|
||||
let actual = declaration.parse(&tokens).unwrap();
|
||||
assert_eq!(expected, actual);
|
||||
|
||||
// Inspect its output in more detail.
|
||||
assert_eq!(actual.inner.kind, VariableKind::Const);
|
||||
assert_eq!(actual.start, 0);
|
||||
assert_eq!(actual.declarations.len(), 1);
|
||||
let decl = actual.declarations.pop().unwrap();
|
||||
let decl = &actual.declaration;
|
||||
assert_eq!(decl.id.name, "myVar");
|
||||
let Expr::Literal(value) = decl.inner.init else {
|
||||
let Expr::Literal(value) = &decl.inner.init else {
|
||||
panic!("value should be a literal")
|
||||
};
|
||||
assert_eq!(value.end, test.len());
|
||||
@ -3368,12 +3493,18 @@ const mySk1 = startSketchAt([0, 0])"#;
|
||||
}
|
||||
|
||||
#[track_caller]
|
||||
fn assert_err(p: &str, msg: &str, src: [usize; 2]) {
|
||||
fn assert_err(p: &str, msg: &str, src_expected: [usize; 2]) {
|
||||
let result = crate::parsing::top_level_parse(p);
|
||||
let err = result.unwrap_errs().next().unwrap();
|
||||
assert_eq!(err.message, msg);
|
||||
assert_eq!(err.source_range.start(), src[0]);
|
||||
assert_eq!(err.source_range.end(), src[1]);
|
||||
let src_actual = [err.source_range.start(), err.source_range.end()];
|
||||
assert_eq!(
|
||||
src_expected,
|
||||
src_actual,
|
||||
"expected error would highlight {} but it actually highlighted {}",
|
||||
&p[src_expected[0]..src_expected[1]],
|
||||
&p[src_actual[0]..src_actual[1]],
|
||||
);
|
||||
}
|
||||
|
||||
#[track_caller]
|
||||
@ -3482,6 +3613,20 @@ const secondExtrude = startSketchOn('XY')
|
||||
assert_err(">!", "Unexpected token: >", [0, 1]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_parse_unlabeled_param_not_allowed() {
|
||||
assert_err(
|
||||
"fn f(@x, @y) { return 1 }",
|
||||
"Only the first parameter can be declared unlabeled",
|
||||
[9, 11],
|
||||
);
|
||||
assert_err(
|
||||
"fn f(x, @y) { return 1 }",
|
||||
"Only the first parameter can be declared unlabeled",
|
||||
[8, 10],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_parse_z_percent_parens() {
|
||||
assert_err("z%)", "Unexpected token: %", [1, 2]);
|
||||
@ -3697,6 +3842,46 @@ e
|
||||
)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn bad_imports() {
|
||||
assert_err(
|
||||
r#"import cube from "../cube.kcl""#,
|
||||
"import path may only contain alphanumeric characters, underscore, hyphen, and period. Files in other directories are not yet supported.",
|
||||
[17, 30],
|
||||
);
|
||||
assert_err(
|
||||
r#"import * as foo from "dsfs""#,
|
||||
"as is not the 'from' keyword",
|
||||
[9, 11],
|
||||
);
|
||||
assert_err(r#"import a from "dsfs" as b"#, "Unexpected token: as", [21, 23]);
|
||||
assert_err(r#"import * from "dsfs" as b"#, "Unexpected token: as", [21, 23]);
|
||||
assert_err(r#"import a from b"#, "invalid string literal", [14, 15]);
|
||||
assert_err(r#"import * "dsfs""#, "\"dsfs\" is not the 'from' keyword", [9, 15]);
|
||||
assert_err(r#"import from "dsfs""#, "\"dsfs\" is not the 'from' keyword", [12, 18]);
|
||||
assert_err(r#"import "dsfs.kcl" as *"#, "Unexpected token: as", [18, 20]);
|
||||
assert_err(
|
||||
r#"import "dsfs""#,
|
||||
"import path is not a valid identifier and must be aliased.",
|
||||
[7, 13],
|
||||
);
|
||||
assert_err(
|
||||
r#"import "foo.bar.kcl""#,
|
||||
"import path is not a valid identifier and must be aliased.",
|
||||
[7, 20],
|
||||
);
|
||||
assert_err(
|
||||
r#"import "_foo.kcl""#,
|
||||
"import path is not a valid identifier and must be aliased.",
|
||||
[7, 17],
|
||||
);
|
||||
assert_err(
|
||||
r#"import "foo-bar.kcl""#,
|
||||
"import path is not a valid identifier and must be aliased.",
|
||||
[7, 20],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn zero_param_function() {
|
||||
let code = r#"
|
||||
@ -3927,12 +4112,108 @@ let myBox = box([0,0], -3, -16, -10)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_parse_empty_tag() {
|
||||
fn test_parse_empty_tag_brace() {
|
||||
let some_program_string = r#"startSketchOn('XY')
|
||||
|> startProfileAt([0, 0], %)
|
||||
|> line([5, 5], %, $)
|
||||
"#;
|
||||
assert_err(some_program_string, "Unexpected token: |>", [57, 59]);
|
||||
|> line(%, $)
|
||||
"#;
|
||||
assert_err(some_program_string, "Tag names must not be empty", [69, 70]);
|
||||
}
|
||||
#[test]
|
||||
fn test_parse_empty_tag_whitespace() {
|
||||
let some_program_string = r#"startSketchOn('XY')
|
||||
|> startProfileAt([0, 0], %)
|
||||
|> line(%, $ ,01)
|
||||
"#;
|
||||
assert_err(some_program_string, "Tag names must not be empty", [69, 70]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_parse_empty_tag_comma() {
|
||||
let some_program_string = r#"startSketchOn('XY')
|
||||
|> startProfileAt([0, 0], %)
|
||||
|> line(%, $,)
|
||||
"#;
|
||||
assert_err(some_program_string, "Tag names must not be empty", [69, 70]);
|
||||
}
|
||||
#[test]
|
||||
fn test_parse_tag_starting_with_digit() {
|
||||
let some_program_string = r#"
|
||||
startSketchOn('XY')
|
||||
|> startProfileAt([0, 0], %)
|
||||
|> line(%, $01)"#;
|
||||
assert_err(
|
||||
some_program_string,
|
||||
"Tag names must not start with a number. Tag starts with `01`",
|
||||
[74, 76],
|
||||
);
|
||||
}
|
||||
#[test]
|
||||
fn test_parse_tag_including_digit() {
|
||||
let some_program_string = r#"
|
||||
startSketchOn('XY')
|
||||
|> startProfileAt([0, 0], %)
|
||||
|> line(%, $var01)"#;
|
||||
assert_no_err(some_program_string);
|
||||
}
|
||||
#[test]
|
||||
fn test_parse_tag_starting_with_bang() {
|
||||
let some_program_string = r#"startSketchOn('XY')
|
||||
|> startProfileAt([0, 0], %)
|
||||
|> line(%, $!var,01)
|
||||
"#;
|
||||
assert_err(some_program_string, "Tag names must not start with a bang", [69, 70]);
|
||||
}
|
||||
#[test]
|
||||
fn test_parse_tag_starting_with_dollar() {
|
||||
let some_program_string = r#"startSketchOn('XY')
|
||||
|> startProfileAt([0, 0], %)
|
||||
|> line(%, $$,01)
|
||||
"#;
|
||||
assert_err(some_program_string, "Tag names must not start with a dollar", [69, 70]);
|
||||
}
|
||||
#[test]
|
||||
fn test_parse_tag_starting_with_fn() {
|
||||
let some_program_string = r#"startSketchOn('XY')
|
||||
|> startProfileAt([0, 0], %)
|
||||
|> line(%, $fn,01)
|
||||
"#;
|
||||
assert_err(some_program_string, "Tag names must not start with a keyword", [69, 71]);
|
||||
}
|
||||
#[test]
|
||||
fn test_parse_tag_starting_with_a_comment() {
|
||||
let some_program_string = r#"startSketchOn('XY')
|
||||
|> startProfileAt([0, 0], %)
|
||||
|> line(%, $//
|
||||
,01)
|
||||
"#;
|
||||
assert_err(
|
||||
some_program_string,
|
||||
"Tag names must not start with a lineComment",
|
||||
[69, 71],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_parse_tag_starting_with_reserved_type() {
|
||||
let some_program_string = r#"
|
||||
startSketchOn('XY')
|
||||
|> line(%, $sketch)
|
||||
"#;
|
||||
assert_err(
|
||||
some_program_string,
|
||||
"Cannot assign a tag to a reserved keyword: sketch",
|
||||
[41, 47],
|
||||
);
|
||||
}
|
||||
#[test]
|
||||
fn test_parse_tag_with_reserved_in_middle_works() {
|
||||
let some_program_string = r#"
|
||||
startSketchOn('XY')
|
||||
|> startProfileAt([0, 0], %)
|
||||
|> line([5, 5], %, $sketching)
|
||||
"#;
|
||||
assert_no_err(some_program_string);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@ -4235,6 +4516,8 @@ const my14 = 4 ^ 2 - 3 ^ 2 * 2
|
||||
);
|
||||
snapshot_test!(kw_function_unnamed_first, r#"val = foo(x, y: z)"#);
|
||||
snapshot_test!(kw_function_all_named, r#"val = foo(x: a, y: b)"#);
|
||||
snapshot_test!(kw_function_decl_all_labeled, r#"fn foo(x, y) { return 1 }"#);
|
||||
snapshot_test!(kw_function_decl_first_unlabeled, r#"fn foo(@x, y) { return 1 }"#);
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
|
@ -1,245 +1,241 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
assertion_line: 3893
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"end": 143,
|
||||
"id": {
|
||||
"end": 15,
|
||||
"name": "boxSketch",
|
||||
"start": 6,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"body": [
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"elements": [
|
||||
{
|
||||
"end": 34,
|
||||
"raw": "0",
|
||||
"start": 33,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 0.0
|
||||
},
|
||||
{
|
||||
"end": 37,
|
||||
"raw": "0",
|
||||
"start": 36,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 0.0
|
||||
}
|
||||
],
|
||||
"end": 38,
|
||||
"start": 32,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 31,
|
||||
"name": "startSketchAt",
|
||||
"start": 18,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 39,
|
||||
"start": 18,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"elements": [
|
||||
{
|
||||
"end": 54,
|
||||
"raw": "0",
|
||||
"start": 53,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 0.0
|
||||
},
|
||||
{
|
||||
"end": 58,
|
||||
"raw": "10",
|
||||
"start": 56,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 10.0
|
||||
}
|
||||
],
|
||||
"end": 59,
|
||||
"start": 52,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
},
|
||||
{
|
||||
"end": 62,
|
||||
"start": 61,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 51,
|
||||
"name": "line",
|
||||
"start": 47,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 63,
|
||||
"start": 47,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"elements": [
|
||||
{
|
||||
"argument": {
|
||||
"end": 88,
|
||||
"raw": "5",
|
||||
"start": 87,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 5.0
|
||||
},
|
||||
"end": 88,
|
||||
"operator": "-",
|
||||
"start": 86,
|
||||
"type": "UnaryExpression",
|
||||
"type": "UnaryExpression"
|
||||
},
|
||||
{
|
||||
"end": 91,
|
||||
"raw": "5",
|
||||
"start": 90,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 5.0
|
||||
}
|
||||
],
|
||||
"end": 92,
|
||||
"start": 85,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
},
|
||||
{
|
||||
"end": 95,
|
||||
"start": 94,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 84,
|
||||
"name": "tangentialArc",
|
||||
"start": 71,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 96,
|
||||
"start": 71,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"elements": [
|
||||
{
|
||||
"end": 111,
|
||||
"raw": "5",
|
||||
"start": 110,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 5.0
|
||||
},
|
||||
{
|
||||
"argument": {
|
||||
"end": 116,
|
||||
"raw": "15",
|
||||
"start": 114,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 15.0
|
||||
},
|
||||
"end": 116,
|
||||
"operator": "-",
|
||||
"start": 113,
|
||||
"type": "UnaryExpression",
|
||||
"type": "UnaryExpression"
|
||||
}
|
||||
],
|
||||
"end": 117,
|
||||
"start": 109,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
},
|
||||
{
|
||||
"end": 120,
|
||||
"start": 119,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 108,
|
||||
"name": "line",
|
||||
"start": 104,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 121,
|
||||
"start": 104,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"end": 139,
|
||||
"raw": "10",
|
||||
"start": 137,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 10.0
|
||||
},
|
||||
{
|
||||
"end": 142,
|
||||
"start": 141,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 136,
|
||||
"name": "extrude",
|
||||
"start": 129,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 143,
|
||||
"start": 129,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
}
|
||||
],
|
||||
"end": 143,
|
||||
"start": 18,
|
||||
"type": "PipeExpression",
|
||||
"type": "PipeExpression"
|
||||
},
|
||||
"declaration": {
|
||||
"end": 143,
|
||||
"id": {
|
||||
"end": 15,
|
||||
"name": "boxSketch",
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"body": [
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"elements": [
|
||||
{
|
||||
"end": 34,
|
||||
"raw": "0",
|
||||
"start": 33,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 0.0
|
||||
},
|
||||
{
|
||||
"end": 37,
|
||||
"raw": "0",
|
||||
"start": 36,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 0.0
|
||||
}
|
||||
],
|
||||
"end": 38,
|
||||
"start": 32,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 31,
|
||||
"name": "startSketchAt",
|
||||
"start": 18,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 39,
|
||||
"start": 18,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"elements": [
|
||||
{
|
||||
"end": 54,
|
||||
"raw": "0",
|
||||
"start": 53,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 0.0
|
||||
},
|
||||
{
|
||||
"end": 58,
|
||||
"raw": "10",
|
||||
"start": 56,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 10.0
|
||||
}
|
||||
],
|
||||
"end": 59,
|
||||
"start": 52,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
},
|
||||
{
|
||||
"end": 62,
|
||||
"start": 61,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 51,
|
||||
"name": "line",
|
||||
"start": 47,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 63,
|
||||
"start": 47,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"elements": [
|
||||
{
|
||||
"argument": {
|
||||
"end": 88,
|
||||
"raw": "5",
|
||||
"start": 87,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 5.0
|
||||
},
|
||||
"end": 88,
|
||||
"operator": "-",
|
||||
"start": 86,
|
||||
"type": "UnaryExpression",
|
||||
"type": "UnaryExpression"
|
||||
},
|
||||
{
|
||||
"end": 91,
|
||||
"raw": "5",
|
||||
"start": 90,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 5.0
|
||||
}
|
||||
],
|
||||
"end": 92,
|
||||
"start": 85,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
},
|
||||
{
|
||||
"end": 95,
|
||||
"start": 94,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 84,
|
||||
"name": "tangentialArc",
|
||||
"start": 71,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 96,
|
||||
"start": 71,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"elements": [
|
||||
{
|
||||
"end": 111,
|
||||
"raw": "5",
|
||||
"start": 110,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 5.0
|
||||
},
|
||||
{
|
||||
"argument": {
|
||||
"end": 116,
|
||||
"raw": "15",
|
||||
"start": 114,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 15.0
|
||||
},
|
||||
"end": 116,
|
||||
"operator": "-",
|
||||
"start": 113,
|
||||
"type": "UnaryExpression",
|
||||
"type": "UnaryExpression"
|
||||
}
|
||||
],
|
||||
"end": 117,
|
||||
"start": 109,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
},
|
||||
{
|
||||
"end": 120,
|
||||
"start": 119,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 108,
|
||||
"name": "line",
|
||||
"start": 104,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 121,
|
||||
"start": 104,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"end": 139,
|
||||
"raw": "10",
|
||||
"start": 137,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 10.0
|
||||
},
|
||||
{
|
||||
"end": 142,
|
||||
"start": 141,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 136,
|
||||
"name": "extrude",
|
||||
"start": 129,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 143,
|
||||
"start": 129,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
}
|
||||
],
|
||||
"end": 143,
|
||||
"start": 18,
|
||||
"type": "PipeExpression",
|
||||
"type": "PipeExpression"
|
||||
},
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 143,
|
||||
"kind": "const",
|
||||
"start": 0,
|
||||
|
@ -1,39 +1,35 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
assertion_line: 3963
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"end": 17,
|
||||
"id": {
|
||||
"end": 8,
|
||||
"name": "sg",
|
||||
"start": 6,
|
||||
"declaration": {
|
||||
"end": 17,
|
||||
"id": {
|
||||
"end": 8,
|
||||
"name": "sg",
|
||||
"start": 6,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"argument": {
|
||||
"end": 17,
|
||||
"name": "scale",
|
||||
"start": 12,
|
||||
"type": "Identifier",
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"argument": {
|
||||
"end": 17,
|
||||
"name": "scale",
|
||||
"start": 12,
|
||||
"type": "Identifier",
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 17,
|
||||
"operator": "-",
|
||||
"start": 11,
|
||||
"type": "UnaryExpression",
|
||||
"type": "UnaryExpression"
|
||||
},
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"end": 17,
|
||||
"operator": "-",
|
||||
"start": 11,
|
||||
"type": "UnaryExpression",
|
||||
"type": "UnaryExpression"
|
||||
},
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 17,
|
||||
"kind": "const",
|
||||
"start": 0,
|
||||
|
@ -1,48 +1,44 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
assertion_line: 3965
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"end": 23,
|
||||
"id": {
|
||||
"end": 13,
|
||||
"name": "myArray",
|
||||
"start": 6,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"end": 23,
|
||||
"endElement": {
|
||||
"end": 22,
|
||||
"raw": "10",
|
||||
"start": 20,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 10.0
|
||||
},
|
||||
"endInclusive": true,
|
||||
"start": 16,
|
||||
"startElement": {
|
||||
"end": 18,
|
||||
"raw": "0",
|
||||
"start": 17,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 0.0
|
||||
},
|
||||
"type": "ArrayRangeExpression",
|
||||
"type": "ArrayRangeExpression"
|
||||
},
|
||||
"declaration": {
|
||||
"end": 23,
|
||||
"id": {
|
||||
"end": 13,
|
||||
"name": "myArray",
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"end": 23,
|
||||
"endElement": {
|
||||
"end": 22,
|
||||
"raw": "10",
|
||||
"start": 20,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 10.0
|
||||
},
|
||||
"endInclusive": true,
|
||||
"start": 16,
|
||||
"startElement": {
|
||||
"end": 18,
|
||||
"raw": "0",
|
||||
"start": 17,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 0.0
|
||||
},
|
||||
"type": "ArrayRangeExpression",
|
||||
"type": "ArrayRangeExpression"
|
||||
},
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 23,
|
||||
"kind": "const",
|
||||
"start": 0,
|
||||
|
@ -1,52 +1,48 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
assertion_line: 3966
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"end": 57,
|
||||
"id": {
|
||||
"end": 24,
|
||||
"name": "firstPrimeNumber",
|
||||
"start": 8,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"body": {
|
||||
"body": [
|
||||
{
|
||||
"argument": {
|
||||
"end": 51,
|
||||
"raw": "2",
|
||||
"start": 50,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 2.0
|
||||
},
|
||||
"end": 51,
|
||||
"start": 43,
|
||||
"type": "ReturnStatement",
|
||||
"type": "ReturnStatement"
|
||||
}
|
||||
],
|
||||
"end": 57,
|
||||
"start": 33
|
||||
},
|
||||
"end": 57,
|
||||
"params": [],
|
||||
"start": 27,
|
||||
"type": "FunctionExpression",
|
||||
"type": "FunctionExpression"
|
||||
},
|
||||
"declaration": {
|
||||
"end": 57,
|
||||
"id": {
|
||||
"end": 24,
|
||||
"name": "firstPrimeNumber",
|
||||
"start": 8,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"body": {
|
||||
"body": [
|
||||
{
|
||||
"argument": {
|
||||
"end": 51,
|
||||
"raw": "2",
|
||||
"start": 50,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 2.0
|
||||
},
|
||||
"end": 51,
|
||||
"start": 43,
|
||||
"type": "ReturnStatement",
|
||||
"type": "ReturnStatement"
|
||||
}
|
||||
],
|
||||
"end": 57,
|
||||
"start": 33
|
||||
},
|
||||
"end": 57,
|
||||
"params": [],
|
||||
"start": 27,
|
||||
"type": "FunctionExpression",
|
||||
"type": "FunctionExpression"
|
||||
},
|
||||
"start": 8,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 57,
|
||||
"kind": "fn",
|
||||
"start": 5,
|
||||
|
@ -1,61 +1,58 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"end": 49,
|
||||
"id": {
|
||||
"end": 8,
|
||||
"name": "thing",
|
||||
"start": 3,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"body": {
|
||||
"body": [
|
||||
{
|
||||
"argument": {
|
||||
"end": 43,
|
||||
"raw": "true",
|
||||
"start": 39,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": true
|
||||
},
|
||||
"end": 43,
|
||||
"start": 32,
|
||||
"type": "ReturnStatement",
|
||||
"type": "ReturnStatement"
|
||||
}
|
||||
],
|
||||
"end": 49,
|
||||
"start": 22
|
||||
},
|
||||
"end": 49,
|
||||
"params": [
|
||||
"declaration": {
|
||||
"end": 49,
|
||||
"id": {
|
||||
"end": 8,
|
||||
"name": "thing",
|
||||
"start": 3,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"body": {
|
||||
"body": [
|
||||
{
|
||||
"type": "Parameter",
|
||||
"identifier": {
|
||||
"end": 17,
|
||||
"name": "param",
|
||||
"start": 12,
|
||||
"type": "Identifier"
|
||||
}
|
||||
"argument": {
|
||||
"end": 43,
|
||||
"raw": "true",
|
||||
"start": 39,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": true
|
||||
},
|
||||
"end": 43,
|
||||
"start": 32,
|
||||
"type": "ReturnStatement",
|
||||
"type": "ReturnStatement"
|
||||
}
|
||||
],
|
||||
"start": 11,
|
||||
"type": "FunctionExpression",
|
||||
"type": "FunctionExpression"
|
||||
"end": 49,
|
||||
"start": 22
|
||||
},
|
||||
"start": 3,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"end": 49,
|
||||
"params": [
|
||||
{
|
||||
"type": "Parameter",
|
||||
"identifier": {
|
||||
"end": 17,
|
||||
"name": "param",
|
||||
"start": 12,
|
||||
"type": "Identifier"
|
||||
}
|
||||
}
|
||||
],
|
||||
"start": 11,
|
||||
"type": "FunctionExpression",
|
||||
"type": "FunctionExpression"
|
||||
},
|
||||
"start": 3,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 49,
|
||||
"kind": "fn",
|
||||
"start": 0,
|
||||
|
@ -1,237 +1,233 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
assertion_line: 3981
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"end": 165,
|
||||
"id": {
|
||||
"end": 14,
|
||||
"name": "mySketch",
|
||||
"start": 6,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"body": [
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"elements": [
|
||||
{
|
||||
"end": 33,
|
||||
"raw": "0",
|
||||
"start": 32,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 0.0
|
||||
},
|
||||
{
|
||||
"end": 35,
|
||||
"raw": "0",
|
||||
"start": 34,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 0.0
|
||||
}
|
||||
],
|
||||
"end": 36,
|
||||
"start": 31,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 30,
|
||||
"name": "startSketchAt",
|
||||
"start": 17,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 37,
|
||||
"start": 17,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"elements": [
|
||||
{
|
||||
"end": 58,
|
||||
"raw": "0",
|
||||
"start": 57,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 0.0
|
||||
},
|
||||
{
|
||||
"end": 61,
|
||||
"raw": "1",
|
||||
"start": 60,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 1.0
|
||||
}
|
||||
],
|
||||
"end": 62,
|
||||
"start": 56,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
},
|
||||
{
|
||||
"end": 65,
|
||||
"start": 64,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
},
|
||||
{
|
||||
"end": 74,
|
||||
"start": 67,
|
||||
"type": "TagDeclarator",
|
||||
"type": "TagDeclarator",
|
||||
"value": "myPath"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 55,
|
||||
"name": "lineTo",
|
||||
"start": 49,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 75,
|
||||
"start": 49,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"elements": [
|
||||
{
|
||||
"end": 96,
|
||||
"raw": "1",
|
||||
"start": 95,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 1.0
|
||||
},
|
||||
{
|
||||
"end": 99,
|
||||
"raw": "1",
|
||||
"start": 98,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 1.0
|
||||
}
|
||||
],
|
||||
"end": 100,
|
||||
"start": 94,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
},
|
||||
{
|
||||
"end": 103,
|
||||
"start": 102,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 93,
|
||||
"name": "lineTo",
|
||||
"start": 87,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 104,
|
||||
"start": 87,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"elements": [
|
||||
{
|
||||
"end": 125,
|
||||
"raw": "1",
|
||||
"start": 124,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 1.0
|
||||
},
|
||||
{
|
||||
"end": 128,
|
||||
"raw": "0",
|
||||
"start": 127,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 0.0
|
||||
}
|
||||
],
|
||||
"end": 129,
|
||||
"start": 123,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
},
|
||||
{
|
||||
"end": 132,
|
||||
"start": 131,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
},
|
||||
{
|
||||
"end": 144,
|
||||
"start": 134,
|
||||
"type": "TagDeclarator",
|
||||
"type": "TagDeclarator",
|
||||
"value": "rightPath"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 122,
|
||||
"name": "lineTo",
|
||||
"start": 116,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 145,
|
||||
"start": 116,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"end": 164,
|
||||
"start": 163,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 162,
|
||||
"name": "close",
|
||||
"start": 157,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 165,
|
||||
"start": 157,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
}
|
||||
],
|
||||
"end": 165,
|
||||
"start": 17,
|
||||
"type": "PipeExpression",
|
||||
"type": "PipeExpression"
|
||||
},
|
||||
"declaration": {
|
||||
"end": 165,
|
||||
"id": {
|
||||
"end": 14,
|
||||
"name": "mySketch",
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"body": [
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"elements": [
|
||||
{
|
||||
"end": 33,
|
||||
"raw": "0",
|
||||
"start": 32,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 0.0
|
||||
},
|
||||
{
|
||||
"end": 35,
|
||||
"raw": "0",
|
||||
"start": 34,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 0.0
|
||||
}
|
||||
],
|
||||
"end": 36,
|
||||
"start": 31,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 30,
|
||||
"name": "startSketchAt",
|
||||
"start": 17,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 37,
|
||||
"start": 17,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"elements": [
|
||||
{
|
||||
"end": 58,
|
||||
"raw": "0",
|
||||
"start": 57,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 0.0
|
||||
},
|
||||
{
|
||||
"end": 61,
|
||||
"raw": "1",
|
||||
"start": 60,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 1.0
|
||||
}
|
||||
],
|
||||
"end": 62,
|
||||
"start": 56,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
},
|
||||
{
|
||||
"end": 65,
|
||||
"start": 64,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
},
|
||||
{
|
||||
"end": 74,
|
||||
"start": 67,
|
||||
"type": "TagDeclarator",
|
||||
"type": "TagDeclarator",
|
||||
"value": "myPath"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 55,
|
||||
"name": "lineTo",
|
||||
"start": 49,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 75,
|
||||
"start": 49,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"elements": [
|
||||
{
|
||||
"end": 96,
|
||||
"raw": "1",
|
||||
"start": 95,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 1.0
|
||||
},
|
||||
{
|
||||
"end": 99,
|
||||
"raw": "1",
|
||||
"start": 98,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 1.0
|
||||
}
|
||||
],
|
||||
"end": 100,
|
||||
"start": 94,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
},
|
||||
{
|
||||
"end": 103,
|
||||
"start": 102,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 93,
|
||||
"name": "lineTo",
|
||||
"start": 87,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 104,
|
||||
"start": 87,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"elements": [
|
||||
{
|
||||
"end": 125,
|
||||
"raw": "1",
|
||||
"start": 124,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 1.0
|
||||
},
|
||||
{
|
||||
"end": 128,
|
||||
"raw": "0",
|
||||
"start": 127,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 0.0
|
||||
}
|
||||
],
|
||||
"end": 129,
|
||||
"start": 123,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
},
|
||||
{
|
||||
"end": 132,
|
||||
"start": 131,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
},
|
||||
{
|
||||
"end": 144,
|
||||
"start": 134,
|
||||
"type": "TagDeclarator",
|
||||
"type": "TagDeclarator",
|
||||
"value": "rightPath"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 122,
|
||||
"name": "lineTo",
|
||||
"start": 116,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 145,
|
||||
"start": 116,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"end": 164,
|
||||
"start": 163,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 162,
|
||||
"name": "close",
|
||||
"start": 157,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 165,
|
||||
"start": 157,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
}
|
||||
],
|
||||
"end": 165,
|
||||
"start": 17,
|
||||
"type": "PipeExpression",
|
||||
"type": "PipeExpression"
|
||||
},
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 165,
|
||||
"kind": "const",
|
||||
"start": 0,
|
||||
|
@ -1,135 +1,131 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
assertion_line: 3989
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"end": 70,
|
||||
"id": {
|
||||
"end": 14,
|
||||
"name": "mySketch",
|
||||
"start": 6,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"body": [
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"elements": [
|
||||
{
|
||||
"end": 33,
|
||||
"raw": "0",
|
||||
"start": 32,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 0.0
|
||||
},
|
||||
{
|
||||
"end": 35,
|
||||
"raw": "0",
|
||||
"start": 34,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 0.0
|
||||
}
|
||||
],
|
||||
"end": 36,
|
||||
"start": 31,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 30,
|
||||
"name": "startSketchAt",
|
||||
"start": 17,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 37,
|
||||
"start": 17,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"elements": [
|
||||
{
|
||||
"end": 50,
|
||||
"raw": "1",
|
||||
"start": 49,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 1.0
|
||||
},
|
||||
{
|
||||
"end": 53,
|
||||
"raw": "1",
|
||||
"start": 52,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 1.0
|
||||
}
|
||||
],
|
||||
"end": 54,
|
||||
"start": 48,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
},
|
||||
{
|
||||
"end": 57,
|
||||
"start": 56,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 47,
|
||||
"name": "lineTo",
|
||||
"start": 41,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 58,
|
||||
"start": 41,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"end": 69,
|
||||
"start": 68,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 67,
|
||||
"name": "close",
|
||||
"start": 62,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 70,
|
||||
"start": 62,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
}
|
||||
],
|
||||
"end": 70,
|
||||
"start": 17,
|
||||
"type": "PipeExpression",
|
||||
"type": "PipeExpression"
|
||||
},
|
||||
"declaration": {
|
||||
"end": 70,
|
||||
"id": {
|
||||
"end": 14,
|
||||
"name": "mySketch",
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"body": [
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"elements": [
|
||||
{
|
||||
"end": 33,
|
||||
"raw": "0",
|
||||
"start": 32,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 0.0
|
||||
},
|
||||
{
|
||||
"end": 35,
|
||||
"raw": "0",
|
||||
"start": 34,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 0.0
|
||||
}
|
||||
],
|
||||
"end": 36,
|
||||
"start": 31,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 30,
|
||||
"name": "startSketchAt",
|
||||
"start": 17,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 37,
|
||||
"start": 17,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"elements": [
|
||||
{
|
||||
"end": 50,
|
||||
"raw": "1",
|
||||
"start": 49,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 1.0
|
||||
},
|
||||
{
|
||||
"end": 53,
|
||||
"raw": "1",
|
||||
"start": 52,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 1.0
|
||||
}
|
||||
],
|
||||
"end": 54,
|
||||
"start": 48,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
},
|
||||
{
|
||||
"end": 57,
|
||||
"start": 56,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 47,
|
||||
"name": "lineTo",
|
||||
"start": 41,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 58,
|
||||
"start": 41,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"end": 69,
|
||||
"start": 68,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 67,
|
||||
"name": "close",
|
||||
"start": 62,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 70,
|
||||
"start": 62,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
}
|
||||
],
|
||||
"end": 70,
|
||||
"start": 17,
|
||||
"type": "PipeExpression",
|
||||
"type": "PipeExpression"
|
||||
},
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 70,
|
||||
"kind": "const",
|
||||
"start": 0,
|
||||
|
@ -1,46 +1,42 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
assertion_line: 3993
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"end": 30,
|
||||
"id": {
|
||||
"end": 11,
|
||||
"name": "myBox",
|
||||
"start": 6,
|
||||
"declaration": {
|
||||
"end": 30,
|
||||
"id": {
|
||||
"end": 11,
|
||||
"name": "myBox",
|
||||
"start": 6,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"arguments": [
|
||||
{
|
||||
"end": 29,
|
||||
"name": "p",
|
||||
"start": 28,
|
||||
"type": "Identifier",
|
||||
"type": "Identifier"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 27,
|
||||
"name": "startSketchAt",
|
||||
"start": 14,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"arguments": [
|
||||
{
|
||||
"end": 29,
|
||||
"name": "p",
|
||||
"start": 28,
|
||||
"type": "Identifier",
|
||||
"type": "Identifier"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 27,
|
||||
"name": "startSketchAt",
|
||||
"start": 14,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 30,
|
||||
"start": 14,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"end": 30,
|
||||
"start": 14,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 30,
|
||||
"kind": "const",
|
||||
"start": 0,
|
||||
|
@ -1,83 +1,79 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
assertion_line: 3994
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"end": 29,
|
||||
"id": {
|
||||
"end": 11,
|
||||
"name": "myBox",
|
||||
"start": 6,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"body": [
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"end": 17,
|
||||
"raw": "1",
|
||||
"start": 16,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 1.0
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 15,
|
||||
"name": "f",
|
||||
"start": 14,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 18,
|
||||
"start": 14,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"end": 25,
|
||||
"raw": "2",
|
||||
"start": 24,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 2.0
|
||||
},
|
||||
{
|
||||
"end": 28,
|
||||
"start": 27,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 23,
|
||||
"name": "g",
|
||||
"start": 22,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 29,
|
||||
"start": 22,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
}
|
||||
],
|
||||
"end": 29,
|
||||
"start": 14,
|
||||
"type": "PipeExpression",
|
||||
"type": "PipeExpression"
|
||||
},
|
||||
"declaration": {
|
||||
"end": 29,
|
||||
"id": {
|
||||
"end": 11,
|
||||
"name": "myBox",
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"body": [
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"end": 17,
|
||||
"raw": "1",
|
||||
"start": 16,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 1.0
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 15,
|
||||
"name": "f",
|
||||
"start": 14,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 18,
|
||||
"start": 14,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"end": 25,
|
||||
"raw": "2",
|
||||
"start": 24,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 2.0
|
||||
},
|
||||
{
|
||||
"end": 28,
|
||||
"start": 27,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 23,
|
||||
"name": "g",
|
||||
"start": 22,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 29,
|
||||
"start": 22,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
}
|
||||
],
|
||||
"end": 29,
|
||||
"start": 14,
|
||||
"type": "PipeExpression",
|
||||
"type": "PipeExpression"
|
||||
},
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 29,
|
||||
"kind": "const",
|
||||
"start": 0,
|
||||
|
@ -1,97 +1,93 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
assertion_line: 3995
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"end": 49,
|
||||
"id": {
|
||||
"end": 11,
|
||||
"name": "myBox",
|
||||
"start": 6,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"body": [
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"end": 29,
|
||||
"name": "p",
|
||||
"start": 28,
|
||||
"type": "Identifier",
|
||||
"type": "Identifier"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 27,
|
||||
"name": "startSketchAt",
|
||||
"start": 14,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 30,
|
||||
"start": 14,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"elements": [
|
||||
{
|
||||
"end": 41,
|
||||
"raw": "0",
|
||||
"start": 40,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 0.0
|
||||
},
|
||||
{
|
||||
"end": 44,
|
||||
"name": "l",
|
||||
"start": 43,
|
||||
"type": "Identifier",
|
||||
"type": "Identifier"
|
||||
}
|
||||
],
|
||||
"end": 45,
|
||||
"start": 39,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
},
|
||||
{
|
||||
"end": 48,
|
||||
"start": 47,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 38,
|
||||
"name": "line",
|
||||
"start": 34,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 49,
|
||||
"start": 34,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
}
|
||||
],
|
||||
"end": 49,
|
||||
"start": 14,
|
||||
"type": "PipeExpression",
|
||||
"type": "PipeExpression"
|
||||
},
|
||||
"declaration": {
|
||||
"end": 49,
|
||||
"id": {
|
||||
"end": 11,
|
||||
"name": "myBox",
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"body": [
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"end": 29,
|
||||
"name": "p",
|
||||
"start": 28,
|
||||
"type": "Identifier",
|
||||
"type": "Identifier"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 27,
|
||||
"name": "startSketchAt",
|
||||
"start": 14,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 30,
|
||||
"start": 14,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"elements": [
|
||||
{
|
||||
"end": 41,
|
||||
"raw": "0",
|
||||
"start": 40,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 0.0
|
||||
},
|
||||
{
|
||||
"end": 44,
|
||||
"name": "l",
|
||||
"start": 43,
|
||||
"type": "Identifier",
|
||||
"type": "Identifier"
|
||||
}
|
||||
],
|
||||
"end": 45,
|
||||
"start": 39,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
},
|
||||
{
|
||||
"end": 48,
|
||||
"start": 47,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 38,
|
||||
"name": "line",
|
||||
"start": 34,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 49,
|
||||
"start": 34,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
}
|
||||
],
|
||||
"end": 49,
|
||||
"start": 14,
|
||||
"type": "PipeExpression",
|
||||
"type": "PipeExpression"
|
||||
},
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 49,
|
||||
"kind": "const",
|
||||
"start": 0,
|
||||
|
@ -1,63 +1,59 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
assertion_line: 4001
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"end": 37,
|
||||
"id": {
|
||||
"end": 14,
|
||||
"name": "mySketch",
|
||||
"start": 6,
|
||||
"declaration": {
|
||||
"end": 37,
|
||||
"id": {
|
||||
"end": 14,
|
||||
"name": "mySketch",
|
||||
"start": 6,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"arguments": [
|
||||
{
|
||||
"elements": [
|
||||
{
|
||||
"end": 33,
|
||||
"raw": "0",
|
||||
"start": 32,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 0.0
|
||||
},
|
||||
{
|
||||
"end": 35,
|
||||
"raw": "0",
|
||||
"start": 34,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 0.0
|
||||
}
|
||||
],
|
||||
"end": 36,
|
||||
"start": 31,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 30,
|
||||
"name": "startSketchAt",
|
||||
"start": 17,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"arguments": [
|
||||
{
|
||||
"elements": [
|
||||
{
|
||||
"end": 33,
|
||||
"raw": "0",
|
||||
"start": 32,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 0.0
|
||||
},
|
||||
{
|
||||
"end": 35,
|
||||
"raw": "0",
|
||||
"start": 34,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 0.0
|
||||
}
|
||||
],
|
||||
"end": 36,
|
||||
"start": 31,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 30,
|
||||
"name": "startSketchAt",
|
||||
"start": 17,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 37,
|
||||
"start": 17,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"end": 37,
|
||||
"start": 17,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 37,
|
||||
"kind": "const",
|
||||
"start": 0,
|
||||
|
@ -1,165 +1,161 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
assertion_line: 4005
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"end": 107,
|
||||
"id": {
|
||||
"end": 14,
|
||||
"name": "cylinder",
|
||||
"start": 6,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"body": [
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"end": 35,
|
||||
"raw": "'XY'",
|
||||
"start": 31,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": "XY"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 30,
|
||||
"name": "startSketchOn",
|
||||
"start": 17,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 36,
|
||||
"start": 17,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"end": 81,
|
||||
"properties": [
|
||||
{
|
||||
"end": 67,
|
||||
"key": {
|
||||
"end": 59,
|
||||
"name": "center",
|
||||
"start": 53,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"start": 53,
|
||||
"type": "ObjectProperty",
|
||||
"value": {
|
||||
"elements": [
|
||||
{
|
||||
"end": 63,
|
||||
"raw": "0",
|
||||
"start": 62,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 0.0
|
||||
},
|
||||
{
|
||||
"end": 66,
|
||||
"raw": "0",
|
||||
"start": 65,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 0.0
|
||||
}
|
||||
],
|
||||
"end": 67,
|
||||
"start": 61,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
}
|
||||
},
|
||||
{
|
||||
"end": 79,
|
||||
"key": {
|
||||
"end": 75,
|
||||
"name": "radius",
|
||||
"start": 69,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"start": 69,
|
||||
"type": "ObjectProperty",
|
||||
"value": {
|
||||
"end": 79,
|
||||
"raw": "22",
|
||||
"start": 77,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 22.0
|
||||
}
|
||||
}
|
||||
],
|
||||
"start": 51,
|
||||
"type": "ObjectExpression",
|
||||
"type": "ObjectExpression"
|
||||
},
|
||||
{
|
||||
"end": 84,
|
||||
"start": 83,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 50,
|
||||
"name": "circle",
|
||||
"start": 44,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 85,
|
||||
"start": 44,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"end": 103,
|
||||
"raw": "14",
|
||||
"start": 101,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 14.0
|
||||
},
|
||||
{
|
||||
"end": 106,
|
||||
"start": 105,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 100,
|
||||
"name": "extrude",
|
||||
"start": 93,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 107,
|
||||
"start": 93,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
}
|
||||
],
|
||||
"end": 107,
|
||||
"start": 17,
|
||||
"type": "PipeExpression",
|
||||
"type": "PipeExpression"
|
||||
},
|
||||
"declaration": {
|
||||
"end": 107,
|
||||
"id": {
|
||||
"end": 14,
|
||||
"name": "cylinder",
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"body": [
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"end": 35,
|
||||
"raw": "'XY'",
|
||||
"start": 31,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": "XY"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 30,
|
||||
"name": "startSketchOn",
|
||||
"start": 17,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 36,
|
||||
"start": 17,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"end": 81,
|
||||
"properties": [
|
||||
{
|
||||
"end": 67,
|
||||
"key": {
|
||||
"end": 59,
|
||||
"name": "center",
|
||||
"start": 53,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"start": 53,
|
||||
"type": "ObjectProperty",
|
||||
"value": {
|
||||
"elements": [
|
||||
{
|
||||
"end": 63,
|
||||
"raw": "0",
|
||||
"start": 62,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 0.0
|
||||
},
|
||||
{
|
||||
"end": 66,
|
||||
"raw": "0",
|
||||
"start": 65,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 0.0
|
||||
}
|
||||
],
|
||||
"end": 67,
|
||||
"start": 61,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
}
|
||||
},
|
||||
{
|
||||
"end": 79,
|
||||
"key": {
|
||||
"end": 75,
|
||||
"name": "radius",
|
||||
"start": 69,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"start": 69,
|
||||
"type": "ObjectProperty",
|
||||
"value": {
|
||||
"end": 79,
|
||||
"raw": "22",
|
||||
"start": 77,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 22.0
|
||||
}
|
||||
}
|
||||
],
|
||||
"start": 51,
|
||||
"type": "ObjectExpression",
|
||||
"type": "ObjectExpression"
|
||||
},
|
||||
{
|
||||
"end": 84,
|
||||
"start": 83,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 50,
|
||||
"name": "circle",
|
||||
"start": 44,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 85,
|
||||
"start": 44,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"end": 103,
|
||||
"raw": "14",
|
||||
"start": 101,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 14.0
|
||||
},
|
||||
{
|
||||
"end": 106,
|
||||
"start": 105,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 100,
|
||||
"name": "extrude",
|
||||
"start": 93,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 107,
|
||||
"start": 93,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
}
|
||||
],
|
||||
"end": 107,
|
||||
"start": 17,
|
||||
"type": "PipeExpression",
|
||||
"type": "PipeExpression"
|
||||
},
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 107,
|
||||
"kind": "const",
|
||||
"start": 0,
|
||||
|
@ -1,87 +1,84 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"end": 49,
|
||||
"id": {
|
||||
"end": 4,
|
||||
"name": "f",
|
||||
"start": 3,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"body": {
|
||||
"body": [
|
||||
{
|
||||
"argument": {
|
||||
"arguments": [
|
||||
{
|
||||
"end": 41,
|
||||
"name": "angle",
|
||||
"start": 36,
|
||||
"type": "Identifier",
|
||||
"type": "Identifier"
|
||||
},
|
||||
{
|
||||
"end": 46,
|
||||
"raw": "360",
|
||||
"start": 43,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 360.0
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 35,
|
||||
"name": "default",
|
||||
"start": 28,
|
||||
"declaration": {
|
||||
"end": 49,
|
||||
"id": {
|
||||
"end": 4,
|
||||
"name": "f",
|
||||
"start": 3,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"body": {
|
||||
"body": [
|
||||
{
|
||||
"argument": {
|
||||
"arguments": [
|
||||
{
|
||||
"end": 41,
|
||||
"name": "angle",
|
||||
"start": 36,
|
||||
"type": "Identifier",
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 47,
|
||||
{
|
||||
"end": 46,
|
||||
"raw": "360",
|
||||
"start": 43,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 360.0
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 35,
|
||||
"name": "default",
|
||||
"start": 28,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 47,
|
||||
"start": 21,
|
||||
"type": "ReturnStatement",
|
||||
"type": "ReturnStatement"
|
||||
}
|
||||
],
|
||||
"end": 49,
|
||||
"start": 19
|
||||
},
|
||||
"end": 49,
|
||||
"params": [
|
||||
{
|
||||
"type": "Parameter",
|
||||
"identifier": {
|
||||
"end": 13,
|
||||
"name": "angle",
|
||||
"start": 8,
|
||||
"type": "Identifier"
|
||||
"start": 28,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
"default_value": {
|
||||
"type": "KclNone",
|
||||
"type": "KclNone",
|
||||
"__private": "KCL_NONE_ID"
|
||||
}
|
||||
"end": 47,
|
||||
"start": 21,
|
||||
"type": "ReturnStatement",
|
||||
"type": "ReturnStatement"
|
||||
}
|
||||
],
|
||||
"start": 7,
|
||||
"type": "FunctionExpression",
|
||||
"type": "FunctionExpression"
|
||||
"end": 49,
|
||||
"start": 19
|
||||
},
|
||||
"start": 3,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"end": 49,
|
||||
"params": [
|
||||
{
|
||||
"type": "Parameter",
|
||||
"identifier": {
|
||||
"end": 13,
|
||||
"name": "angle",
|
||||
"start": 8,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"default_value": {
|
||||
"type": "KclNone",
|
||||
"type": "KclNone",
|
||||
"__private": "KCL_NONE_ID"
|
||||
}
|
||||
}
|
||||
],
|
||||
"start": 7,
|
||||
"type": "FunctionExpression",
|
||||
"type": "FunctionExpression"
|
||||
},
|
||||
"start": 3,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 49,
|
||||
"kind": "fn",
|
||||
"start": 0,
|
||||
|
@ -1,78 +1,74 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
assertion_line: 4007
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"end": 91,
|
||||
"id": {
|
||||
"end": 11,
|
||||
"name": "numbers",
|
||||
"start": 4,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"elements": [
|
||||
{
|
||||
"end": 29,
|
||||
"raw": "1",
|
||||
"start": 28,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 1.0
|
||||
},
|
||||
{
|
||||
"end": 80,
|
||||
"raw": "3",
|
||||
"start": 79,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 3.0
|
||||
}
|
||||
],
|
||||
"end": 91,
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {
|
||||
"1": [
|
||||
{
|
||||
"end": 48,
|
||||
"start": 43,
|
||||
"type": "NonCodeNode",
|
||||
"value": {
|
||||
"type": "blockComment",
|
||||
"value": "A,",
|
||||
"style": "line"
|
||||
}
|
||||
}
|
||||
],
|
||||
"2": [
|
||||
{
|
||||
"end": 66,
|
||||
"start": 61,
|
||||
"type": "NonCodeNode",
|
||||
"value": {
|
||||
"type": "blockComment",
|
||||
"value": "B,",
|
||||
"style": "line"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"startNodes": []
|
||||
},
|
||||
"start": 14,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
},
|
||||
"declaration": {
|
||||
"end": 91,
|
||||
"id": {
|
||||
"end": 11,
|
||||
"name": "numbers",
|
||||
"start": 4,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"elements": [
|
||||
{
|
||||
"end": 29,
|
||||
"raw": "1",
|
||||
"start": 28,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 1.0
|
||||
},
|
||||
{
|
||||
"end": 80,
|
||||
"raw": "3",
|
||||
"start": 79,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 3.0
|
||||
}
|
||||
],
|
||||
"end": 91,
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {
|
||||
"1": [
|
||||
{
|
||||
"end": 48,
|
||||
"start": 43,
|
||||
"type": "NonCodeNode",
|
||||
"value": {
|
||||
"type": "blockComment",
|
||||
"value": "A,",
|
||||
"style": "line"
|
||||
}
|
||||
}
|
||||
],
|
||||
"2": [
|
||||
{
|
||||
"end": 66,
|
||||
"start": 61,
|
||||
"type": "NonCodeNode",
|
||||
"value": {
|
||||
"type": "blockComment",
|
||||
"value": "B,",
|
||||
"style": "line"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"startNodes": []
|
||||
},
|
||||
"start": 14,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
},
|
||||
"start": 4,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 91,
|
||||
"kind": "const",
|
||||
"start": 0,
|
||||
|
@ -1,78 +1,74 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
assertion_line: 4016
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"end": 91,
|
||||
"id": {
|
||||
"end": 11,
|
||||
"name": "numbers",
|
||||
"start": 4,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"elements": [
|
||||
{
|
||||
"end": 29,
|
||||
"raw": "1",
|
||||
"start": 28,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 1.0
|
||||
},
|
||||
{
|
||||
"end": 44,
|
||||
"raw": "2",
|
||||
"start": 43,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 2.0
|
||||
}
|
||||
],
|
||||
"end": 91,
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {
|
||||
"2": [
|
||||
{
|
||||
"end": 63,
|
||||
"start": 58,
|
||||
"type": "NonCodeNode",
|
||||
"value": {
|
||||
"type": "blockComment",
|
||||
"value": "A,",
|
||||
"style": "line"
|
||||
}
|
||||
}
|
||||
],
|
||||
"3": [
|
||||
{
|
||||
"end": 81,
|
||||
"start": 76,
|
||||
"type": "NonCodeNode",
|
||||
"value": {
|
||||
"type": "blockComment",
|
||||
"value": "B,",
|
||||
"style": "line"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"startNodes": []
|
||||
},
|
||||
"start": 14,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
},
|
||||
"declaration": {
|
||||
"end": 91,
|
||||
"id": {
|
||||
"end": 11,
|
||||
"name": "numbers",
|
||||
"start": 4,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"elements": [
|
||||
{
|
||||
"end": 29,
|
||||
"raw": "1",
|
||||
"start": 28,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 1.0
|
||||
},
|
||||
{
|
||||
"end": 44,
|
||||
"raw": "2",
|
||||
"start": 43,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 2.0
|
||||
}
|
||||
],
|
||||
"end": 91,
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {
|
||||
"2": [
|
||||
{
|
||||
"end": 63,
|
||||
"start": 58,
|
||||
"type": "NonCodeNode",
|
||||
"value": {
|
||||
"type": "blockComment",
|
||||
"value": "A,",
|
||||
"style": "line"
|
||||
}
|
||||
}
|
||||
],
|
||||
"3": [
|
||||
{
|
||||
"end": 81,
|
||||
"start": 76,
|
||||
"type": "NonCodeNode",
|
||||
"value": {
|
||||
"type": "blockComment",
|
||||
"value": "B,",
|
||||
"style": "line"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"startNodes": []
|
||||
},
|
||||
"start": 14,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
},
|
||||
"start": 4,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 91,
|
||||
"kind": "const",
|
||||
"start": 0,
|
||||
|
@ -1,88 +1,84 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
assertion_line: 4025
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"end": 80,
|
||||
"id": {
|
||||
"end": 9,
|
||||
"name": "props",
|
||||
"start": 4,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"end": 80,
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {
|
||||
"1": [
|
||||
{
|
||||
"end": 52,
|
||||
"start": 44,
|
||||
"type": "NonCodeNode",
|
||||
"value": {
|
||||
"type": "blockComment",
|
||||
"value": "b: 2,",
|
||||
"style": "line"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"startNodes": []
|
||||
},
|
||||
"properties": [
|
||||
{
|
||||
"end": 30,
|
||||
"key": {
|
||||
"end": 27,
|
||||
"name": "a",
|
||||
"start": 26,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"start": 26,
|
||||
"type": "ObjectProperty",
|
||||
"value": {
|
||||
"end": 30,
|
||||
"raw": "1",
|
||||
"start": 29,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 1.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"end": 69,
|
||||
"key": {
|
||||
"end": 66,
|
||||
"name": "c",
|
||||
"start": 65,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"start": 65,
|
||||
"type": "ObjectProperty",
|
||||
"value": {
|
||||
"end": 69,
|
||||
"raw": "3",
|
||||
"start": 68,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 3.0
|
||||
}
|
||||
}
|
||||
],
|
||||
"start": 12,
|
||||
"type": "ObjectExpression",
|
||||
"type": "ObjectExpression"
|
||||
},
|
||||
"declaration": {
|
||||
"end": 80,
|
||||
"id": {
|
||||
"end": 9,
|
||||
"name": "props",
|
||||
"start": 4,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"end": 80,
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {
|
||||
"1": [
|
||||
{
|
||||
"end": 52,
|
||||
"start": 44,
|
||||
"type": "NonCodeNode",
|
||||
"value": {
|
||||
"type": "blockComment",
|
||||
"value": "b: 2,",
|
||||
"style": "line"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"startNodes": []
|
||||
},
|
||||
"properties": [
|
||||
{
|
||||
"end": 30,
|
||||
"key": {
|
||||
"end": 27,
|
||||
"name": "a",
|
||||
"start": 26,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"start": 26,
|
||||
"type": "ObjectProperty",
|
||||
"value": {
|
||||
"end": 30,
|
||||
"raw": "1",
|
||||
"start": 29,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 1.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"end": 69,
|
||||
"key": {
|
||||
"end": 66,
|
||||
"name": "c",
|
||||
"start": 65,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"start": 65,
|
||||
"type": "ObjectProperty",
|
||||
"value": {
|
||||
"end": 69,
|
||||
"raw": "3",
|
||||
"start": 68,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 3.0
|
||||
}
|
||||
}
|
||||
],
|
||||
"start": 12,
|
||||
"type": "ObjectExpression",
|
||||
"type": "ObjectExpression"
|
||||
},
|
||||
"start": 4,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 80,
|
||||
"kind": "const",
|
||||
"start": 0,
|
||||
|
@ -1,88 +1,84 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
assertion_line: 4033
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"end": 79,
|
||||
"id": {
|
||||
"end": 9,
|
||||
"name": "props",
|
||||
"start": 4,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"end": 79,
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {
|
||||
"1": [
|
||||
{
|
||||
"end": 52,
|
||||
"start": 44,
|
||||
"type": "NonCodeNode",
|
||||
"value": {
|
||||
"type": "blockComment",
|
||||
"value": "b: 2,",
|
||||
"style": "line"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"startNodes": []
|
||||
},
|
||||
"properties": [
|
||||
{
|
||||
"end": 30,
|
||||
"key": {
|
||||
"end": 27,
|
||||
"name": "a",
|
||||
"start": 26,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"start": 26,
|
||||
"type": "ObjectProperty",
|
||||
"value": {
|
||||
"end": 30,
|
||||
"raw": "1",
|
||||
"start": 29,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 1.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"end": 69,
|
||||
"key": {
|
||||
"end": 66,
|
||||
"name": "c",
|
||||
"start": 65,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"start": 65,
|
||||
"type": "ObjectProperty",
|
||||
"value": {
|
||||
"end": 69,
|
||||
"raw": "3",
|
||||
"start": 68,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 3.0
|
||||
}
|
||||
}
|
||||
],
|
||||
"start": 12,
|
||||
"type": "ObjectExpression",
|
||||
"type": "ObjectExpression"
|
||||
},
|
||||
"declaration": {
|
||||
"end": 79,
|
||||
"id": {
|
||||
"end": 9,
|
||||
"name": "props",
|
||||
"start": 4,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"end": 79,
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {
|
||||
"1": [
|
||||
{
|
||||
"end": 52,
|
||||
"start": 44,
|
||||
"type": "NonCodeNode",
|
||||
"value": {
|
||||
"type": "blockComment",
|
||||
"value": "b: 2,",
|
||||
"style": "line"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"startNodes": []
|
||||
},
|
||||
"properties": [
|
||||
{
|
||||
"end": 30,
|
||||
"key": {
|
||||
"end": 27,
|
||||
"name": "a",
|
||||
"start": 26,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"start": 26,
|
||||
"type": "ObjectProperty",
|
||||
"value": {
|
||||
"end": 30,
|
||||
"raw": "1",
|
||||
"start": 29,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 1.0
|
||||
}
|
||||
},
|
||||
{
|
||||
"end": 69,
|
||||
"key": {
|
||||
"end": 66,
|
||||
"name": "c",
|
||||
"start": 65,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"start": 65,
|
||||
"type": "ObjectProperty",
|
||||
"value": {
|
||||
"end": 69,
|
||||
"raw": "3",
|
||||
"start": 68,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 3.0
|
||||
}
|
||||
}
|
||||
],
|
||||
"start": 12,
|
||||
"type": "ObjectExpression",
|
||||
"type": "ObjectExpression"
|
||||
},
|
||||
"start": 4,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 79,
|
||||
"kind": "const",
|
||||
"start": 0,
|
||||
|
@ -1,84 +1,80 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
assertion_line: 3902
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"end": 36,
|
||||
"id": {
|
||||
"end": 11,
|
||||
"name": "myVar",
|
||||
"start": 6,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"arguments": [
|
||||
{
|
||||
"end": 19,
|
||||
"raw": "5",
|
||||
"start": 18,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 5.0
|
||||
},
|
||||
{
|
||||
"argument": {
|
||||
"arguments": [
|
||||
{
|
||||
"end": 31,
|
||||
"raw": "5",
|
||||
"start": 30,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 5.0
|
||||
},
|
||||
{
|
||||
"end": 34,
|
||||
"raw": "4",
|
||||
"start": 33,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 4.0
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 29,
|
||||
"name": "legLen",
|
||||
"start": 23,
|
||||
"type": "Identifier"
|
||||
"declaration": {
|
||||
"end": 36,
|
||||
"id": {
|
||||
"end": 11,
|
||||
"name": "myVar",
|
||||
"start": 6,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"arguments": [
|
||||
{
|
||||
"end": 19,
|
||||
"raw": "5",
|
||||
"start": 18,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 5.0
|
||||
},
|
||||
{
|
||||
"argument": {
|
||||
"arguments": [
|
||||
{
|
||||
"end": 31,
|
||||
"raw": "5",
|
||||
"start": 30,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 5.0
|
||||
},
|
||||
"end": 35,
|
||||
{
|
||||
"end": 34,
|
||||
"raw": "4",
|
||||
"start": 33,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 4.0
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 29,
|
||||
"name": "legLen",
|
||||
"start": 23,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 35,
|
||||
"operator": "-",
|
||||
"start": 22,
|
||||
"type": "UnaryExpression",
|
||||
"type": "UnaryExpression"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 17,
|
||||
"name": "min",
|
||||
"start": 14,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 36,
|
||||
"start": 23,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
"end": 35,
|
||||
"operator": "-",
|
||||
"start": 22,
|
||||
"type": "UnaryExpression",
|
||||
"type": "UnaryExpression"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 17,
|
||||
"name": "min",
|
||||
"start": 14,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
"type": "Identifier"
|
||||
},
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"end": 36,
|
||||
"start": 14,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 36,
|
||||
"kind": "const",
|
||||
"start": 0,
|
||||
|
@ -1,122 +1,118 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
assertion_line: 4041
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"end": 132,
|
||||
"id": {
|
||||
"end": 16,
|
||||
"name": "sketch001",
|
||||
"start": 7,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"body": [
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"end": 37,
|
||||
"raw": "'XY'",
|
||||
"start": 33,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": "XY"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 32,
|
||||
"name": "startSketchOn",
|
||||
"start": 19,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 38,
|
||||
"start": 19,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"end": 131,
|
||||
"start": 130,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 129,
|
||||
"name": "startProfileAt",
|
||||
"start": 115,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 132,
|
||||
"start": 115,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
}
|
||||
],
|
||||
"end": 132,
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {
|
||||
"0": [
|
||||
{
|
||||
"end": 52,
|
||||
"start": 41,
|
||||
"type": "NonCodeNode",
|
||||
"value": {
|
||||
"type": "blockComment",
|
||||
"value": "|> arc({",
|
||||
"style": "line"
|
||||
}
|
||||
},
|
||||
{
|
||||
"end": 74,
|
||||
"start": 55,
|
||||
"type": "NonCodeNode",
|
||||
"value": {
|
||||
"type": "blockComment",
|
||||
"value": "angleEnd: 270,",
|
||||
"style": "line"
|
||||
}
|
||||
},
|
||||
{
|
||||
"end": 98,
|
||||
"start": 77,
|
||||
"type": "NonCodeNode",
|
||||
"value": {
|
||||
"type": "blockComment",
|
||||
"value": "angleStart: 450,",
|
||||
"style": "line"
|
||||
}
|
||||
},
|
||||
{
|
||||
"end": 109,
|
||||
"start": 101,
|
||||
"type": "NonCodeNode",
|
||||
"value": {
|
||||
"type": "blockComment",
|
||||
"value": "}, %)",
|
||||
"style": "line"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"startNodes": []
|
||||
},
|
||||
"start": 19,
|
||||
"type": "PipeExpression",
|
||||
"type": "PipeExpression"
|
||||
},
|
||||
"declaration": {
|
||||
"end": 132,
|
||||
"id": {
|
||||
"end": 16,
|
||||
"name": "sketch001",
|
||||
"start": 7,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"body": [
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"end": 37,
|
||||
"raw": "'XY'",
|
||||
"start": 33,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": "XY"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 32,
|
||||
"name": "startSketchOn",
|
||||
"start": 19,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 38,
|
||||
"start": 19,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"end": 131,
|
||||
"start": 130,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 129,
|
||||
"name": "startProfileAt",
|
||||
"start": 115,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 132,
|
||||
"start": 115,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
}
|
||||
],
|
||||
"end": 132,
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {
|
||||
"0": [
|
||||
{
|
||||
"end": 52,
|
||||
"start": 41,
|
||||
"type": "NonCodeNode",
|
||||
"value": {
|
||||
"type": "blockComment",
|
||||
"value": "|> arc({",
|
||||
"style": "line"
|
||||
}
|
||||
},
|
||||
{
|
||||
"end": 74,
|
||||
"start": 55,
|
||||
"type": "NonCodeNode",
|
||||
"value": {
|
||||
"type": "blockComment",
|
||||
"value": "angleEnd: 270,",
|
||||
"style": "line"
|
||||
}
|
||||
},
|
||||
{
|
||||
"end": 98,
|
||||
"start": 77,
|
||||
"type": "NonCodeNode",
|
||||
"value": {
|
||||
"type": "blockComment",
|
||||
"value": "angleStart: 450,",
|
||||
"style": "line"
|
||||
}
|
||||
},
|
||||
{
|
||||
"end": 109,
|
||||
"start": 101,
|
||||
"type": "NonCodeNode",
|
||||
"value": {
|
||||
"type": "blockComment",
|
||||
"value": "}, %)",
|
||||
"style": "line"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"startNodes": []
|
||||
},
|
||||
"start": 19,
|
||||
"type": "PipeExpression",
|
||||
"type": "PipeExpression"
|
||||
},
|
||||
"start": 7,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 132,
|
||||
"kind": "const",
|
||||
"start": 1,
|
||||
|
@ -1,77 +1,61 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
assertion_line: 4052
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"declaration": {
|
||||
"end": 31,
|
||||
"id": {
|
||||
"end": 11,
|
||||
"name": "my14",
|
||||
"start": 7,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"end": 31,
|
||||
"id": {
|
||||
"end": 11,
|
||||
"name": "my14",
|
||||
"start": 7,
|
||||
"type": "Identifier"
|
||||
"left": {
|
||||
"end": 19,
|
||||
"left": {
|
||||
"end": 15,
|
||||
"raw": "4",
|
||||
"start": 14,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 4.0
|
||||
},
|
||||
"operator": "^",
|
||||
"right": {
|
||||
"end": 19,
|
||||
"raw": "2",
|
||||
"start": 18,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 2.0
|
||||
},
|
||||
"start": 14,
|
||||
"type": "BinaryExpression",
|
||||
"type": "BinaryExpression"
|
||||
},
|
||||
"init": {
|
||||
"operator": "-",
|
||||
"right": {
|
||||
"end": 31,
|
||||
"left": {
|
||||
"end": 19,
|
||||
"end": 27,
|
||||
"left": {
|
||||
"end": 15,
|
||||
"raw": "4",
|
||||
"start": 14,
|
||||
"end": 23,
|
||||
"raw": "3",
|
||||
"start": 22,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 4.0
|
||||
"value": 3.0
|
||||
},
|
||||
"operator": "^",
|
||||
"right": {
|
||||
"end": 19,
|
||||
"raw": "2",
|
||||
"start": 18,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 2.0
|
||||
},
|
||||
"start": 14,
|
||||
"type": "BinaryExpression",
|
||||
"type": "BinaryExpression"
|
||||
},
|
||||
"operator": "-",
|
||||
"right": {
|
||||
"end": 31,
|
||||
"left": {
|
||||
"end": 27,
|
||||
"left": {
|
||||
"end": 23,
|
||||
"raw": "3",
|
||||
"start": 22,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 3.0
|
||||
},
|
||||
"operator": "^",
|
||||
"right": {
|
||||
"end": 27,
|
||||
"raw": "2",
|
||||
"start": 26,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 2.0
|
||||
},
|
||||
"start": 22,
|
||||
"type": "BinaryExpression",
|
||||
"type": "BinaryExpression"
|
||||
},
|
||||
"operator": "*",
|
||||
"right": {
|
||||
"end": 31,
|
||||
"raw": "2",
|
||||
"start": 30,
|
||||
"start": 26,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 2.0
|
||||
@ -80,14 +64,26 @@ snapshot_kind: text
|
||||
"type": "BinaryExpression",
|
||||
"type": "BinaryExpression"
|
||||
},
|
||||
"start": 14,
|
||||
"operator": "*",
|
||||
"right": {
|
||||
"end": 31,
|
||||
"raw": "2",
|
||||
"start": 30,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 2.0
|
||||
},
|
||||
"start": 22,
|
||||
"type": "BinaryExpression",
|
||||
"type": "BinaryExpression"
|
||||
},
|
||||
"start": 7,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"start": 14,
|
||||
"type": "BinaryExpression",
|
||||
"type": "BinaryExpression"
|
||||
},
|
||||
"start": 7,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 31,
|
||||
"kind": "const",
|
||||
"start": 1,
|
||||
|
@ -1,81 +1,77 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
assertion_line: 4058
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"end": 74,
|
||||
"id": {
|
||||
"end": 7,
|
||||
"name": "x",
|
||||
"start": 6,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"cond": {
|
||||
"end": 17,
|
||||
"raw": "true",
|
||||
"start": 13,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": true
|
||||
},
|
||||
"digest": null,
|
||||
"else_ifs": [],
|
||||
"end": 74,
|
||||
"final_else": {
|
||||
"body": [
|
||||
{
|
||||
"end": 64,
|
||||
"expression": {
|
||||
"end": 64,
|
||||
"raw": "4",
|
||||
"start": 63,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 4.0
|
||||
},
|
||||
"start": 63,
|
||||
"type": "ExpressionStatement",
|
||||
"type": "ExpressionStatement"
|
||||
}
|
||||
],
|
||||
"end": 73,
|
||||
"start": 63
|
||||
},
|
||||
"start": 10,
|
||||
"then_val": {
|
||||
"body": [
|
||||
{
|
||||
"end": 33,
|
||||
"expression": {
|
||||
"end": 33,
|
||||
"raw": "3",
|
||||
"start": 32,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 3.0
|
||||
},
|
||||
"start": 32,
|
||||
"type": "ExpressionStatement",
|
||||
"type": "ExpressionStatement"
|
||||
}
|
||||
],
|
||||
"end": 42,
|
||||
"start": 32
|
||||
},
|
||||
"type": "IfExpression",
|
||||
"type": "IfExpression"
|
||||
},
|
||||
"declaration": {
|
||||
"end": 74,
|
||||
"id": {
|
||||
"end": 7,
|
||||
"name": "x",
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"cond": {
|
||||
"end": 17,
|
||||
"raw": "true",
|
||||
"start": 13,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": true
|
||||
},
|
||||
"digest": null,
|
||||
"else_ifs": [],
|
||||
"end": 74,
|
||||
"final_else": {
|
||||
"body": [
|
||||
{
|
||||
"end": 64,
|
||||
"expression": {
|
||||
"end": 64,
|
||||
"raw": "4",
|
||||
"start": 63,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 4.0
|
||||
},
|
||||
"start": 63,
|
||||
"type": "ExpressionStatement",
|
||||
"type": "ExpressionStatement"
|
||||
}
|
||||
],
|
||||
"end": 73,
|
||||
"start": 63
|
||||
},
|
||||
"start": 10,
|
||||
"then_val": {
|
||||
"body": [
|
||||
{
|
||||
"end": 33,
|
||||
"expression": {
|
||||
"end": 33,
|
||||
"raw": "3",
|
||||
"start": 32,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 3.0
|
||||
},
|
||||
"start": 32,
|
||||
"type": "ExpressionStatement",
|
||||
"type": "ExpressionStatement"
|
||||
}
|
||||
],
|
||||
"end": 42,
|
||||
"start": 32
|
||||
},
|
||||
"type": "IfExpression",
|
||||
"type": "IfExpression"
|
||||
},
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 74,
|
||||
"kind": "const",
|
||||
"start": 0,
|
||||
|
@ -1,129 +1,125 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
assertion_line: 4066
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"end": 121,
|
||||
"id": {
|
||||
"end": 7,
|
||||
"name": "x",
|
||||
"start": 6,
|
||||
"type": "Identifier"
|
||||
"declaration": {
|
||||
"end": 121,
|
||||
"id": {
|
||||
"end": 7,
|
||||
"name": "x",
|
||||
"start": 6,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"cond": {
|
||||
"end": 17,
|
||||
"raw": "true",
|
||||
"start": 13,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": true
|
||||
},
|
||||
"init": {
|
||||
"cond": {
|
||||
"end": 17,
|
||||
"raw": "true",
|
||||
"start": 13,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": true
|
||||
},
|
||||
"digest": null,
|
||||
"else_ifs": [
|
||||
{
|
||||
"cond": {
|
||||
"arguments": [
|
||||
{
|
||||
"end": 63,
|
||||
"name": "radius",
|
||||
"start": 57,
|
||||
"type": "Identifier",
|
||||
"type": "Identifier"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 56,
|
||||
"name": "func",
|
||||
"start": 52,
|
||||
"digest": null,
|
||||
"else_ifs": [
|
||||
{
|
||||
"cond": {
|
||||
"arguments": [
|
||||
{
|
||||
"end": 63,
|
||||
"name": "radius",
|
||||
"start": 57,
|
||||
"type": "Identifier",
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 64,
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 56,
|
||||
"name": "func",
|
||||
"start": 52,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
"type": "Identifier"
|
||||
},
|
||||
"digest": null,
|
||||
"end": 90,
|
||||
"start": 44,
|
||||
"then_val": {
|
||||
"body": [
|
||||
{
|
||||
"end": 64,
|
||||
"start": 52,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
"digest": null,
|
||||
"end": 90,
|
||||
"start": 44,
|
||||
"then_val": {
|
||||
"body": [
|
||||
{
|
||||
"end": 80,
|
||||
"expression": {
|
||||
"end": 80,
|
||||
"expression": {
|
||||
"end": 80,
|
||||
"raw": "4",
|
||||
"start": 79,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 4.0
|
||||
},
|
||||
"raw": "4",
|
||||
"start": 79,
|
||||
"type": "ExpressionStatement",
|
||||
"type": "ExpressionStatement"
|
||||
}
|
||||
],
|
||||
"end": 89,
|
||||
"start": 65
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 4.0
|
||||
},
|
||||
"start": 79,
|
||||
"type": "ExpressionStatement",
|
||||
"type": "ExpressionStatement"
|
||||
}
|
||||
],
|
||||
"end": 89,
|
||||
"start": 65
|
||||
},
|
||||
"type": "ElseIf"
|
||||
}
|
||||
],
|
||||
"end": 121,
|
||||
"final_else": {
|
||||
"body": [
|
||||
{
|
||||
"end": 111,
|
||||
"expression": {
|
||||
"end": 111,
|
||||
"raw": "5",
|
||||
"start": 110,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 5.0
|
||||
},
|
||||
"type": "ElseIf"
|
||||
"start": 110,
|
||||
"type": "ExpressionStatement",
|
||||
"type": "ExpressionStatement"
|
||||
}
|
||||
],
|
||||
"end": 121,
|
||||
"final_else": {
|
||||
"body": [
|
||||
{
|
||||
"end": 111,
|
||||
"expression": {
|
||||
"end": 111,
|
||||
"raw": "5",
|
||||
"start": 110,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 5.0
|
||||
},
|
||||
"start": 110,
|
||||
"type": "ExpressionStatement",
|
||||
"type": "ExpressionStatement"
|
||||
}
|
||||
],
|
||||
"end": 120,
|
||||
"start": 110
|
||||
},
|
||||
"start": 10,
|
||||
"then_val": {
|
||||
"body": [
|
||||
{
|
||||
"end": 33,
|
||||
"expression": {
|
||||
"end": 33,
|
||||
"raw": "3",
|
||||
"start": 32,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 3.0
|
||||
},
|
||||
"start": 32,
|
||||
"type": "ExpressionStatement",
|
||||
"type": "ExpressionStatement"
|
||||
}
|
||||
],
|
||||
"end": 42,
|
||||
"start": 32
|
||||
},
|
||||
"type": "IfExpression",
|
||||
"type": "IfExpression"
|
||||
"end": 120,
|
||||
"start": 110
|
||||
},
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"start": 10,
|
||||
"then_val": {
|
||||
"body": [
|
||||
{
|
||||
"end": 33,
|
||||
"expression": {
|
||||
"end": 33,
|
||||
"raw": "3",
|
||||
"start": 32,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 3.0
|
||||
},
|
||||
"start": 32,
|
||||
"type": "ExpressionStatement",
|
||||
"type": "ExpressionStatement"
|
||||
}
|
||||
],
|
||||
"end": 42,
|
||||
"start": 32
|
||||
},
|
||||
"type": "IfExpression",
|
||||
"type": "IfExpression"
|
||||
},
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 121,
|
||||
"kind": "const",
|
||||
"start": 0,
|
||||
|
@ -1,48 +1,44 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
assertion_line: 4076
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"end": 14,
|
||||
"id": {
|
||||
"end": 5,
|
||||
"name": "x",
|
||||
"start": 4,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"end": 14,
|
||||
"left": {
|
||||
"end": 9,
|
||||
"raw": "3",
|
||||
"start": 8,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 3.0
|
||||
},
|
||||
"operator": "==",
|
||||
"right": {
|
||||
"end": 14,
|
||||
"raw": "3",
|
||||
"start": 13,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 3.0
|
||||
},
|
||||
"start": 8,
|
||||
"type": "BinaryExpression",
|
||||
"type": "BinaryExpression"
|
||||
},
|
||||
"declaration": {
|
||||
"end": 14,
|
||||
"id": {
|
||||
"end": 5,
|
||||
"name": "x",
|
||||
"start": 4,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"end": 14,
|
||||
"left": {
|
||||
"end": 9,
|
||||
"raw": "3",
|
||||
"start": 8,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 3.0
|
||||
},
|
||||
"operator": "==",
|
||||
"right": {
|
||||
"end": 14,
|
||||
"raw": "3",
|
||||
"start": 13,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 3.0
|
||||
},
|
||||
"start": 8,
|
||||
"type": "BinaryExpression",
|
||||
"type": "BinaryExpression"
|
||||
},
|
||||
"start": 4,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 14,
|
||||
"kind": "const",
|
||||
"start": 0,
|
||||
|
@ -1,48 +1,44 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
assertion_line: 4077
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"end": 14,
|
||||
"id": {
|
||||
"end": 5,
|
||||
"name": "x",
|
||||
"start": 4,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"end": 14,
|
||||
"left": {
|
||||
"end": 9,
|
||||
"raw": "3",
|
||||
"start": 8,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 3.0
|
||||
},
|
||||
"operator": "!=",
|
||||
"right": {
|
||||
"end": 14,
|
||||
"raw": "3",
|
||||
"start": 13,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 3.0
|
||||
},
|
||||
"start": 8,
|
||||
"type": "BinaryExpression",
|
||||
"type": "BinaryExpression"
|
||||
},
|
||||
"declaration": {
|
||||
"end": 14,
|
||||
"id": {
|
||||
"end": 5,
|
||||
"name": "x",
|
||||
"start": 4,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"end": 14,
|
||||
"left": {
|
||||
"end": 9,
|
||||
"raw": "3",
|
||||
"start": 8,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 3.0
|
||||
},
|
||||
"operator": "!=",
|
||||
"right": {
|
||||
"end": 14,
|
||||
"raw": "3",
|
||||
"start": 13,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 3.0
|
||||
},
|
||||
"start": 8,
|
||||
"type": "BinaryExpression",
|
||||
"type": "BinaryExpression"
|
||||
},
|
||||
"start": 4,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 14,
|
||||
"kind": "const",
|
||||
"start": 0,
|
||||
|
@ -1,33 +1,29 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
assertion_line: 4078
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"end": 5,
|
||||
"id": {
|
||||
"end": 1,
|
||||
"name": "x",
|
||||
"start": 0,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"end": 5,
|
||||
"raw": "4",
|
||||
"start": 4,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 4.0
|
||||
},
|
||||
"declaration": {
|
||||
"end": 5,
|
||||
"id": {
|
||||
"end": 1,
|
||||
"name": "x",
|
||||
"start": 0,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"end": 5,
|
||||
"raw": "4",
|
||||
"start": 4,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 4.0
|
||||
},
|
||||
"start": 0,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 5,
|
||||
"kind": "const",
|
||||
"start": 0,
|
||||
|
@ -1,87 +1,83 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
assertion_line: 4079
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"end": 42,
|
||||
"id": {
|
||||
"end": 9,
|
||||
"name": "obj",
|
||||
"start": 6,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"end": 42,
|
||||
"properties": [
|
||||
{
|
||||
"end": 30,
|
||||
"key": {
|
||||
"end": 19,
|
||||
"name": "center",
|
||||
"start": 13,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"start": 13,
|
||||
"type": "ObjectProperty",
|
||||
"value": {
|
||||
"elements": [
|
||||
{
|
||||
"end": 25,
|
||||
"raw": "10",
|
||||
"start": 23,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 10.0
|
||||
},
|
||||
{
|
||||
"end": 29,
|
||||
"raw": "10",
|
||||
"start": 27,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 10.0
|
||||
}
|
||||
],
|
||||
"end": 30,
|
||||
"start": 22,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
}
|
||||
},
|
||||
{
|
||||
"end": 41,
|
||||
"key": {
|
||||
"end": 38,
|
||||
"name": "radius",
|
||||
"start": 32,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"start": 32,
|
||||
"type": "ObjectProperty",
|
||||
"value": {
|
||||
"end": 41,
|
||||
"raw": "5",
|
||||
"start": 40,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 5.0
|
||||
}
|
||||
}
|
||||
],
|
||||
"start": 12,
|
||||
"type": "ObjectExpression",
|
||||
"type": "ObjectExpression"
|
||||
},
|
||||
"declaration": {
|
||||
"end": 42,
|
||||
"id": {
|
||||
"end": 9,
|
||||
"name": "obj",
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"end": 42,
|
||||
"properties": [
|
||||
{
|
||||
"end": 30,
|
||||
"key": {
|
||||
"end": 19,
|
||||
"name": "center",
|
||||
"start": 13,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"start": 13,
|
||||
"type": "ObjectProperty",
|
||||
"value": {
|
||||
"elements": [
|
||||
{
|
||||
"end": 25,
|
||||
"raw": "10",
|
||||
"start": 23,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 10.0
|
||||
},
|
||||
{
|
||||
"end": 29,
|
||||
"raw": "10",
|
||||
"start": 27,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 10.0
|
||||
}
|
||||
],
|
||||
"end": 30,
|
||||
"start": 22,
|
||||
"type": "ArrayExpression",
|
||||
"type": "ArrayExpression"
|
||||
}
|
||||
},
|
||||
{
|
||||
"end": 41,
|
||||
"key": {
|
||||
"end": 38,
|
||||
"name": "radius",
|
||||
"start": 32,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"start": 32,
|
||||
"type": "ObjectProperty",
|
||||
"value": {
|
||||
"end": 41,
|
||||
"raw": "5",
|
||||
"start": 40,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 5.0
|
||||
}
|
||||
}
|
||||
],
|
||||
"start": 12,
|
||||
"type": "ObjectExpression",
|
||||
"type": "ObjectExpression"
|
||||
},
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 42,
|
||||
"kind": "const",
|
||||
"start": 0,
|
||||
|
@ -1,33 +1,29 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
assertion_line: 4080
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"end": 5,
|
||||
"id": {
|
||||
"end": 1,
|
||||
"name": "x",
|
||||
"start": 0,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"end": 5,
|
||||
"raw": "3",
|
||||
"start": 4,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 3.0
|
||||
},
|
||||
"declaration": {
|
||||
"end": 5,
|
||||
"id": {
|
||||
"end": 1,
|
||||
"name": "x",
|
||||
"start": 0,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"end": 5,
|
||||
"raw": "3",
|
||||
"start": 4,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 3.0
|
||||
},
|
||||
"start": 0,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 5,
|
||||
"kind": "const",
|
||||
"start": 0,
|
||||
@ -35,64 +31,62 @@ snapshot_kind: text
|
||||
"type": "VariableDeclaration"
|
||||
},
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"end": 30,
|
||||
"id": {
|
||||
"end": 17,
|
||||
"name": "obj",
|
||||
"start": 14,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"end": 30,
|
||||
"properties": [
|
||||
{
|
||||
"end": 23,
|
||||
"key": {
|
||||
"end": 23,
|
||||
"name": "x",
|
||||
"start": 22,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"start": 22,
|
||||
"type": "ObjectProperty",
|
||||
"value": {
|
||||
"end": 23,
|
||||
"name": "x",
|
||||
"start": 22,
|
||||
"type": "Identifier",
|
||||
"type": "Identifier"
|
||||
}
|
||||
},
|
||||
{
|
||||
"end": 29,
|
||||
"key": {
|
||||
"end": 26,
|
||||
"name": "y",
|
||||
"start": 25,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"start": 25,
|
||||
"type": "ObjectProperty",
|
||||
"value": {
|
||||
"end": 29,
|
||||
"raw": "4",
|
||||
"start": 28,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 4.0
|
||||
}
|
||||
}
|
||||
],
|
||||
"start": 20,
|
||||
"type": "ObjectExpression",
|
||||
"type": "ObjectExpression"
|
||||
},
|
||||
"declaration": {
|
||||
"end": 30,
|
||||
"id": {
|
||||
"end": 17,
|
||||
"name": "obj",
|
||||
"start": 14,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"end": 30,
|
||||
"properties": [
|
||||
{
|
||||
"end": 23,
|
||||
"key": {
|
||||
"end": 23,
|
||||
"name": "x",
|
||||
"start": 22,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"start": 22,
|
||||
"type": "ObjectProperty",
|
||||
"value": {
|
||||
"end": 23,
|
||||
"name": "x",
|
||||
"start": 22,
|
||||
"type": "Identifier",
|
||||
"type": "Identifier"
|
||||
}
|
||||
},
|
||||
{
|
||||
"end": 29,
|
||||
"key": {
|
||||
"end": 26,
|
||||
"name": "y",
|
||||
"start": 25,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"start": 25,
|
||||
"type": "ObjectProperty",
|
||||
"value": {
|
||||
"end": 29,
|
||||
"raw": "4",
|
||||
"start": 28,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 4.0
|
||||
}
|
||||
}
|
||||
],
|
||||
"start": 20,
|
||||
"type": "ObjectExpression",
|
||||
"type": "ObjectExpression"
|
||||
},
|
||||
"start": 14,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 30,
|
||||
"kind": "const",
|
||||
"start": 14,
|
||||
|
@ -1,84 +1,80 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
assertion_line: 3904
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"end": 35,
|
||||
"id": {
|
||||
"end": 11,
|
||||
"name": "myVar",
|
||||
"start": 6,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"arguments": [
|
||||
{
|
||||
"argument": {
|
||||
"arguments": [
|
||||
{
|
||||
"end": 27,
|
||||
"raw": "5",
|
||||
"start": 26,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 5.0
|
||||
},
|
||||
{
|
||||
"end": 30,
|
||||
"raw": "4",
|
||||
"start": 29,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 4.0
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 25,
|
||||
"name": "legLen",
|
||||
"start": 19,
|
||||
"type": "Identifier"
|
||||
"declaration": {
|
||||
"end": 35,
|
||||
"id": {
|
||||
"end": 11,
|
||||
"name": "myVar",
|
||||
"start": 6,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"arguments": [
|
||||
{
|
||||
"argument": {
|
||||
"arguments": [
|
||||
{
|
||||
"end": 27,
|
||||
"raw": "5",
|
||||
"start": 26,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 5.0
|
||||
},
|
||||
"end": 31,
|
||||
{
|
||||
"end": 30,
|
||||
"raw": "4",
|
||||
"start": 29,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 4.0
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 25,
|
||||
"name": "legLen",
|
||||
"start": 19,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 31,
|
||||
"operator": "-",
|
||||
"start": 18,
|
||||
"type": "UnaryExpression",
|
||||
"type": "UnaryExpression"
|
||||
"start": 19,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
{
|
||||
"end": 34,
|
||||
"raw": "5",
|
||||
"start": 33,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 5.0
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 17,
|
||||
"name": "min",
|
||||
"start": 14,
|
||||
"type": "Identifier"
|
||||
"end": 31,
|
||||
"operator": "-",
|
||||
"start": 18,
|
||||
"type": "UnaryExpression",
|
||||
"type": "UnaryExpression"
|
||||
},
|
||||
"end": 35,
|
||||
{
|
||||
"end": 34,
|
||||
"raw": "5",
|
||||
"start": 33,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 5.0
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 17,
|
||||
"name": "min",
|
||||
"start": 14,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
"type": "Identifier"
|
||||
},
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"end": 35,
|
||||
"start": 14,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
},
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 35,
|
||||
"kind": "const",
|
||||
"start": 0,
|
||||
|
@ -1,84 +1,80 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
assertion_line: 3905
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"end": 36,
|
||||
"id": {
|
||||
"end": 11,
|
||||
"name": "myVar",
|
||||
"start": 6,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"body": [
|
||||
{
|
||||
"end": 19,
|
||||
"left": {
|
||||
"end": 15,
|
||||
"raw": "5",
|
||||
"start": 14,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 5.0
|
||||
},
|
||||
"operator": "+",
|
||||
"right": {
|
||||
"end": 19,
|
||||
"raw": "6",
|
||||
"start": 18,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 6.0
|
||||
},
|
||||
"start": 14,
|
||||
"type": "BinaryExpression",
|
||||
"type": "BinaryExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"end": 32,
|
||||
"raw": "45",
|
||||
"start": 30,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 45.0
|
||||
},
|
||||
{
|
||||
"end": 35,
|
||||
"start": 34,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 29,
|
||||
"name": "myFunc",
|
||||
"start": 23,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 36,
|
||||
"start": 23,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
}
|
||||
],
|
||||
"end": 36,
|
||||
"start": 14,
|
||||
"type": "PipeExpression",
|
||||
"type": "PipeExpression"
|
||||
},
|
||||
"declaration": {
|
||||
"end": 36,
|
||||
"id": {
|
||||
"end": 11,
|
||||
"name": "myVar",
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"body": [
|
||||
{
|
||||
"end": 19,
|
||||
"left": {
|
||||
"end": 15,
|
||||
"raw": "5",
|
||||
"start": 14,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 5.0
|
||||
},
|
||||
"operator": "+",
|
||||
"right": {
|
||||
"end": 19,
|
||||
"raw": "6",
|
||||
"start": 18,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 6.0
|
||||
},
|
||||
"start": 14,
|
||||
"type": "BinaryExpression",
|
||||
"type": "BinaryExpression"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
{
|
||||
"end": 32,
|
||||
"raw": "45",
|
||||
"start": 30,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 45.0
|
||||
},
|
||||
{
|
||||
"end": 35,
|
||||
"start": 34,
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution"
|
||||
}
|
||||
],
|
||||
"callee": {
|
||||
"end": 29,
|
||||
"name": "myFunc",
|
||||
"start": 23,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 36,
|
||||
"start": 23,
|
||||
"type": "CallExpression",
|
||||
"type": "CallExpression"
|
||||
}
|
||||
],
|
||||
"end": 36,
|
||||
"start": 14,
|
||||
"type": "PipeExpression",
|
||||
"type": "PipeExpression"
|
||||
},
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 36,
|
||||
"kind": "const",
|
||||
"start": 0,
|
||||
|
@ -1,53 +1,49 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
assertion_line: 3915
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"declaration": {
|
||||
"end": 27,
|
||||
"id": {
|
||||
"end": 7,
|
||||
"name": "x",
|
||||
"start": 6,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"end": 27,
|
||||
"id": {
|
||||
"end": 7,
|
||||
"name": "x",
|
||||
"start": 6,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"end": 27,
|
||||
"left": {
|
||||
"argument": {
|
||||
"end": 15,
|
||||
"name": "leg2",
|
||||
"start": 11,
|
||||
"type": "Identifier",
|
||||
"type": "Identifier"
|
||||
},
|
||||
"left": {
|
||||
"argument": {
|
||||
"end": 15,
|
||||
"operator": "-",
|
||||
"start": 10,
|
||||
"type": "UnaryExpression",
|
||||
"type": "UnaryExpression"
|
||||
},
|
||||
"operator": "+",
|
||||
"right": {
|
||||
"end": 27,
|
||||
"name": "thickness",
|
||||
"start": 18,
|
||||
"name": "leg2",
|
||||
"start": 11,
|
||||
"type": "Identifier",
|
||||
"type": "Identifier"
|
||||
},
|
||||
"end": 15,
|
||||
"operator": "-",
|
||||
"start": 10,
|
||||
"type": "BinaryExpression",
|
||||
"type": "BinaryExpression"
|
||||
"type": "UnaryExpression",
|
||||
"type": "UnaryExpression"
|
||||
},
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"operator": "+",
|
||||
"right": {
|
||||
"end": 27,
|
||||
"name": "thickness",
|
||||
"start": 18,
|
||||
"type": "Identifier",
|
||||
"type": "Identifier"
|
||||
},
|
||||
"start": 10,
|
||||
"type": "BinaryExpression",
|
||||
"type": "BinaryExpression"
|
||||
},
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 27,
|
||||
"kind": "const",
|
||||
"start": 0,
|
||||
|
@ -1,63 +1,59 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
assertion_line: 3906
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"declaration": {
|
||||
"end": 18,
|
||||
"id": {
|
||||
"end": 5,
|
||||
"name": "x",
|
||||
"start": 4,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"end": 18,
|
||||
"id": {
|
||||
"end": 5,
|
||||
"name": "x",
|
||||
"start": 4,
|
||||
"type": "Identifier"
|
||||
"left": {
|
||||
"end": 9,
|
||||
"raw": "1",
|
||||
"start": 8,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 1.0
|
||||
},
|
||||
"init": {
|
||||
"operator": "*",
|
||||
"right": {
|
||||
"end": 18,
|
||||
"left": {
|
||||
"end": 9,
|
||||
"raw": "1",
|
||||
"start": 8,
|
||||
"end": 14,
|
||||
"raw": "3",
|
||||
"start": 13,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 1.0
|
||||
"value": 3.0
|
||||
},
|
||||
"operator": "*",
|
||||
"operator": "-",
|
||||
"right": {
|
||||
"end": 18,
|
||||
"left": {
|
||||
"end": 14,
|
||||
"raw": "3",
|
||||
"start": 13,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 3.0
|
||||
},
|
||||
"operator": "-",
|
||||
"right": {
|
||||
"end": 18,
|
||||
"raw": "4",
|
||||
"start": 17,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 4.0
|
||||
},
|
||||
"start": 13,
|
||||
"type": "BinaryExpression",
|
||||
"type": "BinaryExpression"
|
||||
"raw": "4",
|
||||
"start": 17,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 4.0
|
||||
},
|
||||
"start": 8,
|
||||
"start": 13,
|
||||
"type": "BinaryExpression",
|
||||
"type": "BinaryExpression"
|
||||
},
|
||||
"start": 4,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"start": 8,
|
||||
"type": "BinaryExpression",
|
||||
"type": "BinaryExpression"
|
||||
},
|
||||
"start": 4,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 18,
|
||||
"kind": "const",
|
||||
"start": 0,
|
||||
|
@ -1,33 +1,29 @@
|
||||
---
|
||||
source: kcl/src/parsing/parser.rs
|
||||
assertion_line: 3907
|
||||
expression: actual
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"body": [
|
||||
{
|
||||
"declarations": [
|
||||
{
|
||||
"end": 11,
|
||||
"id": {
|
||||
"end": 7,
|
||||
"name": "x",
|
||||
"start": 6,
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"end": 11,
|
||||
"raw": "1",
|
||||
"start": 10,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 1.0
|
||||
},
|
||||
"declaration": {
|
||||
"end": 11,
|
||||
"id": {
|
||||
"end": 7,
|
||||
"name": "x",
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
}
|
||||
],
|
||||
"type": "Identifier"
|
||||
},
|
||||
"init": {
|
||||
"end": 11,
|
||||
"raw": "1",
|
||||
"start": 10,
|
||||
"type": "Literal",
|
||||
"type": "Literal",
|
||||
"value": 1.0
|
||||
},
|
||||
"start": 6,
|
||||
"type": "VariableDeclarator"
|
||||
},
|
||||
"end": 11,
|
||||
"kind": "const",
|
||||
"start": 0,
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user