Merge branch 'main' into move-tests-to-electon

This commit is contained in:
49lf
2024-12-06 13:20:47 -05:00
241 changed files with 103359 additions and 103615 deletions

1
.gitignore vendored
View File

@ -61,6 +61,7 @@ Mac_App_Distribution.provisionprofile
*.tsbuildinfo *.tsbuildinfo
src/wasm-lib/pkg src/wasm-lib/pkg
.eslintcache
venv venv
.vite/ .vite/

File diff suppressed because one or more lines are too long

View File

@ -78970,7 +78970,7 @@
"model = import(\"tests/inputs/cube.gltf\")", "model = import(\"tests/inputs/cube.gltf\")",
"model = import(\"tests/inputs/cube.sldprt\")", "model = import(\"tests/inputs/cube.sldprt\")",
"model = import(\"tests/inputs/cube.step\")", "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])"
] ]
}, },
{ {

View File

@ -157,6 +157,7 @@
"@iarna/toml": "^2.2.5", "@iarna/toml": "^2.2.5",
"@lezer/generator": "^1.7.1", "@lezer/generator": "^1.7.1",
"@playwright/test": "^1.49.0", "@playwright/test": "^1.49.0",
"@nabla/vite-plugin-eslint": "^2.0.5",
"@testing-library/jest-dom": "^5.14.1", "@testing-library/jest-dom": "^5.14.1",
"@testing-library/react": "^15.0.2", "@testing-library/react": "^15.0.2",
"@types/d3-force": "^3.0.10", "@types/d3-force": "^3.0.10",
@ -205,7 +206,6 @@
"ts-node": "^10.0.0", "ts-node": "^10.0.0",
"typescript": "^5.7.2", "typescript": "^5.7.2",
"vite": "^5.4.6", "vite": "^5.4.6",
"vite-plugin-eslint": "^1.8.1",
"vite-plugin-package-version": "^1.1.0", "vite-plugin-package-version": "^1.1.0",
"vite-tsconfig-paths": "^4.3.2", "vite-tsconfig-paths": "^4.3.2",
"vitest": "^1.6.0", "vitest": "^1.6.0",

View File

@ -701,8 +701,7 @@ export class SceneEntities {
'VariableDeclaration' 'VariableDeclaration'
) )
if (trap(_node1)) return Promise.reject(_node1) if (trap(_node1)) return Promise.reject(_node1)
const variableDeclarationName = const variableDeclarationName = _node1.node?.declaration.id?.name || ''
_node1.node?.declarations?.[0]?.id?.name || ''
const sg = sketchFromKclValue( const sg = sketchFromKclValue(
kclManager.programMemory.get(variableDeclarationName), kclManager.programMemory.get(variableDeclarationName),
@ -902,10 +901,9 @@ export class SceneEntities {
'VariableDeclaration' 'VariableDeclaration'
) )
if (trap(_node1)) return Promise.reject(_node1) if (trap(_node1)) return Promise.reject(_node1)
const variableDeclarationName = const variableDeclarationName = _node1.node?.declaration.id?.name || ''
_node1.node?.declarations?.[0]?.id?.name || '' const startSketchOn = _node1.node?.declaration
const startSketchOn = _node1.node?.declarations const startSketchOnInit = startSketchOn?.init
const startSketchOnInit = startSketchOn?.[0]?.init
const tags: [string, string, string] = [ const tags: [string, string, string] = [
findUniqueName(_ast, 'rectangleSegmentA'), findUniqueName(_ast, 'rectangleSegmentA'),
@ -913,7 +911,7 @@ export class SceneEntities {
findUniqueName(_ast, 'rectangleSegmentC'), findUniqueName(_ast, 'rectangleSegmentC'),
] ]
startSketchOn[0].init = createPipeExpression([ startSketchOn.init = createPipeExpression([
startSketchOnInit, startSketchOnInit,
...getRectangleCallExpressions(rectangleOrigin, tags), ...getRectangleCallExpressions(rectangleOrigin, tags),
]) ])
@ -943,7 +941,7 @@ export class SceneEntities {
'VariableDeclaration' 'VariableDeclaration'
) )
if (trap(_node)) return Promise.reject(_node) 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 x = (args.intersectionPoint.twoD.x || 0) - rectangleOrigin[0]
const y = (args.intersectionPoint.twoD.y || 0) - rectangleOrigin[1] const y = (args.intersectionPoint.twoD.y || 0) - rectangleOrigin[1]
@ -992,7 +990,7 @@ export class SceneEntities {
'VariableDeclaration' 'VariableDeclaration'
) )
if (trap(_node)) return if (trap(_node)) return
const sketchInit = _node.node?.declarations?.[0]?.init const sketchInit = _node.node?.declaration.init
if (sketchInit.type !== 'PipeExpression') { if (sketchInit.type !== 'PipeExpression') {
return return
@ -1058,10 +1056,9 @@ export class SceneEntities {
if (trap(_node1)) return Promise.reject(_node1) if (trap(_node1)) return Promise.reject(_node1)
// startSketchOn already exists // startSketchOn already exists
const variableDeclarationName = const variableDeclarationName = _node1.node?.declaration.id?.name || ''
_node1.node?.declarations?.[0]?.id?.name || '' const startSketchOn = _node1.node?.declaration
const startSketchOn = _node1.node?.declarations const startSketchOnInit = startSketchOn?.init
const startSketchOnInit = startSketchOn?.[0]?.init
const tags: [string, string, string] = [ const tags: [string, string, string] = [
findUniqueName(_ast, 'rectangleSegmentA'), findUniqueName(_ast, 'rectangleSegmentA'),
@ -1069,7 +1066,7 @@ export class SceneEntities {
findUniqueName(_ast, 'rectangleSegmentC'), findUniqueName(_ast, 'rectangleSegmentC'),
] ]
startSketchOn[0].init = createPipeExpression([ startSketchOn.init = createPipeExpression([
startSketchOnInit, startSketchOnInit,
...getRectangleCallExpressions(rectangleOrigin, tags), ...getRectangleCallExpressions(rectangleOrigin, tags),
]) ])
@ -1099,7 +1096,7 @@ export class SceneEntities {
'VariableDeclaration' 'VariableDeclaration'
) )
if (trap(_node)) return Promise.reject(_node) 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 x = (args.intersectionPoint.twoD.x || 0) - rectangleOrigin[0]
const y = (args.intersectionPoint.twoD.y || 0) - rectangleOrigin[1] const y = (args.intersectionPoint.twoD.y || 0) - rectangleOrigin[1]
@ -1155,7 +1152,7 @@ export class SceneEntities {
'VariableDeclaration' 'VariableDeclaration'
) )
if (trap(_node)) return if (trap(_node)) return
const sketchInit = _node.node?.declarations?.[0]?.init const sketchInit = _node.node?.declaration.init
if (sketchInit.type === 'PipeExpression') { if (sketchInit.type === 'PipeExpression') {
updateCenterRectangleSketch( updateCenterRectangleSketch(
@ -1224,12 +1221,11 @@ export class SceneEntities {
'VariableDeclaration' 'VariableDeclaration'
) )
if (trap(_node1)) return Promise.reject(_node1) if (trap(_node1)) return Promise.reject(_node1)
const variableDeclarationName = const variableDeclarationName = _node1.node?.declaration.id?.name || ''
_node1.node?.declarations?.[0]?.id?.name || '' const startSketchOn = _node1.node?.declaration
const startSketchOn = _node1.node?.declarations const startSketchOnInit = startSketchOn?.init
const startSketchOnInit = startSketchOn?.[0]?.init
startSketchOn[0].init = createPipeExpression([ startSketchOn.init = createPipeExpression([
startSketchOnInit, startSketchOnInit,
createCallExpressionStdLib('circle', [ createCallExpressionStdLib('circle', [
createObjectExpression({ createObjectExpression({
@ -1271,7 +1267,7 @@ export class SceneEntities {
) )
let modded = structuredClone(truncatedAst) let modded = structuredClone(truncatedAst)
if (trap(_node)) return 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 x = (args.intersectionPoint.twoD.x || 0) - circleCenter[0]
const y = (args.intersectionPoint.twoD.y || 0) - circleCenter[1] const y = (args.intersectionPoint.twoD.y || 0) - circleCenter[1]
@ -1339,7 +1335,7 @@ export class SceneEntities {
'VariableDeclaration' 'VariableDeclaration'
) )
if (trap(_node)) return if (trap(_node)) return
const sketchInit = _node.node?.declarations?.[0]?.init const sketchInit = _node.node?.declaration.init
let modded = structuredClone(_ast) let modded = structuredClone(_ast)
if (sketchInit.type === 'PipeExpression') { if (sketchInit.type === 'PipeExpression') {
@ -2060,7 +2056,7 @@ function prepareTruncatedMemoryAndAst(
'VariableDeclaration' 'VariableDeclaration'
) )
if (err(_node)) return _node if (err(_node)) return _node
const variableDeclarationName = _node.node?.declarations?.[0]?.id?.name || '' const variableDeclarationName = _node.node?.declaration.id?.name || ''
const sg = sketchFromKclValue( const sg = sketchFromKclValue(
programMemory.get(variableDeclarationName), programMemory.get(variableDeclarationName),
variableDeclarationName variableDeclarationName
@ -2085,7 +2081,7 @@ function prepareTruncatedMemoryAndAst(
]) ])
} }
;( ;(
(_ast.body[bodyIndex] as VariableDeclaration).declarations[0] (_ast.body[bodyIndex] as VariableDeclaration).declaration
.init as PipeExpression .init as PipeExpression
).body.push(newSegment) ).body.push(newSegment)
// update source ranges to section we just added. // update source ranges to section we just added.
@ -2096,19 +2092,19 @@ function prepareTruncatedMemoryAndAst(
const updatedSrcRangeAst = pResult.program const updatedSrcRangeAst = pResult.program
const lastPipeItem = ( const lastPipeItem = (
(updatedSrcRangeAst.body[bodyIndex] as VariableDeclaration) (updatedSrcRangeAst.body[bodyIndex] as VariableDeclaration).declaration
.declarations[0].init as PipeExpression .init as PipeExpression
).body.slice(-1)[0] ).body.slice(-1)[0]
;( ;(
(_ast.body[bodyIndex] as VariableDeclaration).declarations[0] (_ast.body[bodyIndex] as VariableDeclaration).declaration
.init as PipeExpression .init as PipeExpression
).body.slice(-1)[0].start = lastPipeItem.start ).body.slice(-1)[0].start = lastPipeItem.start
_ast.end = lastPipeItem.end _ast.end = lastPipeItem.end
const varDec = _ast.body[bodyIndex] as Node<VariableDeclaration> const varDec = _ast.body[bodyIndex] as Node<VariableDeclaration>
varDec.end = lastPipeItem.end varDec.end = lastPipeItem.end
const declarator = varDec.declarations[0] const declarator = varDec.declaration
declarator.end = lastPipeItem.end declarator.end = lastPipeItem.end
const init = declarator.init as Node<PipeExpression> const init = declarator.init as Node<PipeExpression>
init.end = lastPipeItem.end init.end = lastPipeItem.end
@ -2145,7 +2141,7 @@ function prepareTruncatedMemoryAndAst(
if (node.type !== 'VariableDeclaration') { if (node.type !== 'VariableDeclaration') {
continue continue
} }
const name = node.declarations[0].id.name const name = node.declaration.id.name
const memoryItem = programMemory.get(name) const memoryItem = programMemory.get(name)
if (!memoryItem) { if (!memoryItem) {
continue continue

View File

@ -169,11 +169,11 @@ export function useCalc({
const resultDeclaration = ast.body.find( const resultDeclaration = ast.body.find(
(a) => (a) =>
a.type === 'VariableDeclaration' && a.type === 'VariableDeclaration' &&
a.declarations?.[0]?.id?.name === '__result__' a.declaration.id?.name === '__result__'
) )
const init = const init =
resultDeclaration?.type === 'VariableDeclaration' && resultDeclaration?.type === 'VariableDeclaration' &&
resultDeclaration?.declarations?.[0]?.init resultDeclaration?.declaration.init
const result = execState.memory?.get('__result__')?.value const result = execState.memory?.get('__result__')?.value
setCalcResult(typeof result === 'number' ? String(result) : 'NAN') setCalcResult(typeof result === 'number' ? String(result) : 'NAN')
init && setValueNode(init) init && setValueNode(init)

View File

@ -60,8 +60,7 @@ const b1 = cube([0,0], 10)`
expect(nodePath).toEqual([ expect(nodePath).toEqual([
['body', ''], ['body', ''],
[0, 'index'], [0, 'index'],
['declarations', 'VariableDeclaration'], ['declaration', 'VariableDeclaration'],
[0, 'index'],
['init', ''], ['init', ''],
['params', 'FunctionExpression'], ['params', 'FunctionExpression'],
[0, 'index'], [0, 'index'],
@ -96,14 +95,12 @@ const b1 = cube([0,0], 10)`
expect(nodePath).toEqual([ expect(nodePath).toEqual([
['body', ''], ['body', ''],
[0, 'index'], [0, 'index'],
['declarations', 'VariableDeclaration'], ['declaration', 'VariableDeclaration'],
[0, 'index'],
['init', ''], ['init', ''],
['body', 'FunctionExpression'], ['body', 'FunctionExpression'],
['body', 'FunctionExpression'], ['body', 'FunctionExpression'],
[0, 'index'], [0, 'index'],
['declarations', 'VariableDeclaration'], ['declaration', 'VariableDeclaration'],
[0, 'index'],
['init', ''], ['init', ''],
['body', 'PipeExpression'], ['body', 'PipeExpression'],
[2, 'index'], [2, 'index'],

View File

@ -82,11 +82,11 @@ describe('Testing createVariableDeclaration', () => {
it('should create a variable declaration', () => { it('should create a variable declaration', () => {
const result = createVariableDeclaration('myVar', createLiteral(5)) const result = createVariableDeclaration('myVar', createLiteral(5))
expect(result.type).toBe('VariableDeclaration') expect(result.type).toBe('VariableDeclaration')
expect(result.declarations[0].type).toBe('VariableDeclarator') expect(result.declaration.type).toBe('VariableDeclarator')
expect(result.declarations[0].id.type).toBe('Identifier') expect(result.declaration.id.type).toBe('Identifier')
expect(result.declarations[0].id.name).toBe('myVar') expect(result.declaration.id.name).toBe('myVar')
expect(result.declarations[0].init.type).toBe('Literal') expect(result.declaration.init.type).toBe('Literal')
expect((result.declarations[0].init as any).value).toBe(5) expect((result.declaration.init as any).value).toBe(5)
}) })
}) })
describe('Testing createPipeExpression', () => { describe('Testing createPipeExpression', () => {

View File

@ -66,8 +66,7 @@ export function startSketchOnDefault(
let pathToNode: PathToNode = [ let pathToNode: PathToNode = [
['body', ''], ['body', ''],
[sketchIndex, 'index'], [sketchIndex, 'index'],
['declarations', 'VariableDeclaration'], ['declaration', 'VariableDeclaration'],
['0', 'index'],
['init', 'VariableDeclarator'], ['init', 'VariableDeclarator'],
] ]
@ -94,7 +93,7 @@ export function addStartProfileAt(
return new Error('variableDeclaration.init.type !== PipeExpression') return new Error('variableDeclaration.init.type !== PipeExpression')
} }
const _node = { ...node } const _node = { ...node }
const init = variableDeclaration.declarations[0].init const init = variableDeclaration.declaration.init
const startProfileAt = createCallExpressionStdLib('startProfileAt', [ const startProfileAt = createCallExpressionStdLib('startProfileAt', [
createArrayExpression([ createArrayExpression([
createLiteral(roundOff(at[0])), createLiteral(roundOff(at[0])),
@ -105,7 +104,7 @@ export function addStartProfileAt(
if (init.type === 'PipeExpression') { if (init.type === 'PipeExpression') {
init.body.splice(1, 0, startProfileAt) init.body.splice(1, 0, startProfileAt)
} else { } else {
variableDeclaration.declarations[0].init = createPipeExpression([ variableDeclaration.declaration.init = createPipeExpression([
init, init,
startProfileAt, startProfileAt,
]) ])
@ -149,8 +148,7 @@ export function addSketchTo(
let pathToNode: PathToNode = [ let pathToNode: PathToNode = [
['body', ''], ['body', ''],
[sketchIndex, 'index'], [sketchIndex, 'index'],
['declarations', 'VariableDeclaration'], ['declaration', 'VariableDeclaration'],
['0', 'index'],
['init', 'VariableDeclarator'], ['init', 'VariableDeclarator'],
] ]
if (axis !== 'xy') { if (axis !== 'xy') {
@ -333,8 +331,7 @@ export function extrudeSketch(
const pathToExtrudeArg: PathToNode = [ const pathToExtrudeArg: PathToNode = [
['body', ''], ['body', ''],
[sketchIndexInBody + 1, 'index'], [sketchIndexInBody + 1, 'index'],
['declarations', 'VariableDeclaration'], ['declaration', 'VariableDeclaration'],
[0, 'index'],
['init', 'VariableDeclarator'], ['init', 'VariableDeclarator'],
['arguments', 'CallExpression'], ['arguments', 'CallExpression'],
[0, 'index'], [0, 'index'],
@ -364,8 +361,7 @@ export function loftSketches(
const pathToNode: PathToNode = [ const pathToNode: PathToNode = [
['body', ''], ['body', ''],
[modifiedAst.body.length - 1, 'index'], [modifiedAst.body.length - 1, 'index'],
['declarations', 'VariableDeclaration'], ['declaration', 'VariableDeclaration'],
['0', 'index'],
['init', 'VariableDeclarator'], ['init', 'VariableDeclarator'],
['arguments', 'CallExpression'], ['arguments', 'CallExpression'],
[0, 'index'], [0, 'index'],
@ -460,8 +456,7 @@ export function revolveSketch(
const pathToRevolveArg: PathToNode = [ const pathToRevolveArg: PathToNode = [
['body', ''], ['body', ''],
[sketchIndexInBody + 1, 'index'], [sketchIndexInBody + 1, 'index'],
['declarations', 'VariableDeclaration'], ['declaration', 'VariableDeclaration'],
[0, 'index'],
['init', 'VariableDeclarator'], ['init', 'VariableDeclarator'],
['arguments', 'CallExpression'], ['arguments', 'CallExpression'],
[0, 'index'], [0, 'index'],
@ -547,8 +542,7 @@ export function sketchOnExtrudedFace(
const newpathToNode: PathToNode = [ const newpathToNode: PathToNode = [
['body', ''], ['body', ''],
[expressionIndex + 1, 'index'], [expressionIndex + 1, 'index'],
['declarations', 'VariableDeclaration'], ['declaration', 'VariableDeclaration'],
[0, 'index'],
['init', 'VariableDeclarator'], ['init', 'VariableDeclarator'],
] ]
@ -585,8 +579,7 @@ export function addOffsetPlane({
const pathToNode: PathToNode = [ const pathToNode: PathToNode = [
['body', ''], ['body', ''],
[modifiedAst.body.length - 1, 'index'], [modifiedAst.body.length - 1, 'index'],
['declarations', 'VariableDeclaration'], ['declaration', 'VariableDeclaration'],
['0', 'index'],
['init', 'VariableDeclarator'], ['init', 'VariableDeclarator'],
['arguments', 'CallExpression'], ['arguments', 'CallExpression'],
[0, 'index'], [0, 'index'],
@ -823,17 +816,15 @@ export function createVariableDeclaration(
end: 0, end: 0,
moduleId: 0, moduleId: 0,
declarations: [ declaration: {
{ type: 'VariableDeclarator',
type: 'VariableDeclarator', start: 0,
start: 0, end: 0,
end: 0, moduleId: 0,
moduleId: 0,
id: createIdentifier(varName), id: createIdentifier(varName),
init, init,
}, },
],
visibility, visibility,
kind, kind,
} }
@ -1120,7 +1111,7 @@ export async function deleteFromSelection(
traverse(astClone, { traverse(astClone, {
enter: (node, path) => { enter: (node, path) => {
if (node.type === 'VariableDeclaration') { if (node.type === 'VariableDeclaration') {
const dec = node.declarations[0] const dec = node.declaration
if ( if (
dec.init.type === 'CallExpression' && dec.init.type === 'CallExpression' &&
(dec.init.callee.name === 'extrude' || (dec.init.callee.name === 'extrude' ||
@ -1155,7 +1146,7 @@ export async function deleteFromSelection(
enter: (node, path) => { enter: (node, path) => {
;(async () => { ;(async () => {
if (node.type === 'VariableDeclaration') { if (node.type === 'VariableDeclaration') {
currentVariableName = node.declarations[0].id.name currentVariableName = node.declaration.id.name
} }
if ( if (
// match startSketchOn(${extrudeNameToDelete}) // match startSketchOn(${extrudeNameToDelete})

View File

@ -273,7 +273,7 @@ export function getPathToExtrudeForSegmentSelection(
'VariableDeclaration' 'VariableDeclaration'
) )
if (err(varDecNode)) return varDecNode if (err(varDecNode)) return varDecNode
const sketchVar = varDecNode.node.declarations[0].id.name const sketchVar = varDecNode.node.declaration.id.name
const sketch = sketchFromKclValue( const sketch = sketchFromKclValue(
kclManager.programMemory.get(sketchVar), kclManager.programMemory.get(sketchVar),
@ -367,7 +367,7 @@ function locateExtrudeDeclarator(
if (err(nodeOfExtrudeCall)) return nodeOfExtrudeCall if (err(nodeOfExtrudeCall)) return nodeOfExtrudeCall
const { node: extrudeVarDecl } = nodeOfExtrudeCall const { node: extrudeVarDecl } = nodeOfExtrudeCall
const extrudeDeclarator = extrudeVarDecl.declarations[0] const extrudeDeclarator = extrudeVarDecl.declaration
if (!extrudeDeclarator) { if (!extrudeDeclarator) {
return new Error('Extrude Declarator not found.') return new Error('Extrude Declarator not found.')
} }

View File

@ -230,8 +230,7 @@ describe('testing getNodePathFromSourceRange', () => {
expect(result).toEqual([ expect(result).toEqual([
['body', ''], ['body', ''],
[0, 'index'], [0, 'index'],
['declarations', 'VariableDeclaration'], ['declaration', 'VariableDeclaration'],
[0, 'index'],
['init', ''], ['init', ''],
['body', 'PipeExpression'], ['body', 'PipeExpression'],
[2, 'index'], [2, 'index'],
@ -250,8 +249,7 @@ describe('testing getNodePathFromSourceRange', () => {
const expected = [ const expected = [
['body', ''], ['body', ''],
[0, 'index'], [0, 'index'],
['declarations', 'VariableDeclaration'], ['declaration', 'VariableDeclaration'],
[0, 'index'],
['init', ''], ['init', ''],
['body', 'PipeExpression'], ['body', 'PipeExpression'],
[3, 'index'], [3, 'index'],
@ -293,8 +291,7 @@ describe('testing getNodePathFromSourceRange', () => {
expect(result).toEqual([ expect(result).toEqual([
['body', ''], ['body', ''],
[1, 'index'], [1, 'index'],
['declarations', 'VariableDeclaration'], ['declaration', 'VariableDeclaration'],
[0, 'index'],
['init', ''], ['init', ''],
['cond', 'IfExpression'], ['cond', 'IfExpression'],
['left', 'BinaryExpression'], ['left', 'BinaryExpression'],
@ -324,8 +321,7 @@ describe('testing getNodePathFromSourceRange', () => {
expect(result).toEqual([ expect(result).toEqual([
['body', ''], ['body', ''],
[1, 'index'], [1, 'index'],
['declarations', 'VariableDeclaration'], ['declaration', 'VariableDeclaration'],
[0, 'index'],
['init', ''], ['init', ''],
['then_val', 'IfExpression'], ['then_val', 'IfExpression'],
['body', 'IfExpression'], ['body', 'IfExpression'],
@ -353,7 +349,8 @@ describe('testing getNodePathFromSourceRange', () => {
expect(result).toEqual([ expect(result).toEqual([
['body', ''], ['body', ''],
[0, 'index'], [0, 'index'],
['items', 'ImportStatement'], ['selector', 'ImportStatement'],
['items', 'ImportSelector'],
[1, 'index'], [1, 'index'],
['name', 'ImportItem'], ['name', 'ImportItem'],
]) ])

View File

@ -259,34 +259,26 @@ function moreNodePathFromSourceRange(
return moreNodePathFromSourceRange(expression, sourceRange, path) return moreNodePathFromSourceRange(expression, sourceRange, path)
} }
if (_node.type === 'VariableDeclaration' && isInRange) { if (_node.type === 'VariableDeclaration' && isInRange) {
const declarations = _node.declarations const declaration = _node.declaration
for (let decIndex = 0; decIndex < declarations.length; decIndex++) { if (declaration.start <= start && declaration.end >= end) {
const declaration = declarations[decIndex] path.push(['declaration', 'VariableDeclaration'])
if (declaration.start <= start && declaration.end >= end) { const init = declaration.init
path.push(['declarations', 'VariableDeclaration']) if (init.start <= start && init.end >= end) {
path.push([decIndex, 'index']) path.push(['init', ''])
const init = declaration.init return moreNodePathFromSourceRange(init, sourceRange, path)
if (init.start <= start && init.end >= end) {
path.push(['init', ''])
return moreNodePathFromSourceRange(init, sourceRange, path)
}
} }
} }
} }
if (_node.type === 'VariableDeclaration' && isInRange) { if (_node.type === 'VariableDeclaration' && isInRange) {
const declarations = _node.declarations const declaration = _node.declaration
for (let decIndex = 0; decIndex < declarations.length; decIndex++) { if (declaration.start <= start && declaration.end >= end) {
const declaration = declarations[decIndex] const init = declaration.init
if (declaration.start <= start && declaration.end >= end) { if (init.start <= start && init.end >= end) {
const init = declaration.init path.push(['declaration', 'VariableDeclaration'])
if (init.start <= start && init.end >= end) { path.push(['init', ''])
path.push(['declarations', 'VariableDeclaration']) return moreNodePathFromSourceRange(init, sourceRange, path)
path.push([decIndex, 'index'])
path.push(['init', ''])
return moreNodePathFromSourceRange(init, sourceRange, path)
}
} }
} }
return path return path
@ -380,24 +372,31 @@ function moreNodePathFromSourceRange(
} }
if (_node.type === 'ImportStatement' && isInRange) { if (_node.type === 'ImportStatement' && isInRange) {
const { items } = _node if (_node.selector && _node.selector.type === 'List') {
for (let i = 0; i < items.length; i++) { path.push(['selector', 'ImportStatement'])
const item = items[i] const { items } = _node.selector
if (item.start <= start && item.end >= end) { for (let i = 0; i < items.length; i++) {
path.push(['items', 'ImportStatement']) const item = items[i]
path.push([i, 'index']) if (item.start <= start && item.end >= end) {
if (item.name.start <= start && item.name.end >= end) { path.push(['items', 'ImportSelector'])
path.push(['name', 'ImportItem']) 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 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) console.error('not implemented: ' + node.type)
@ -451,13 +450,10 @@ export function traverse(
traverse(node, option, pathToNode) traverse(node, option, pathToNode)
if (_node.type === 'VariableDeclaration') { if (_node.type === 'VariableDeclaration') {
_node.declarations.forEach((declaration, index) => _traverse(_node.declaration, [
_traverse(declaration, [ ...pathToNode,
...pathToNode, ['declaration', 'VariableDeclaration'],
['declarations', 'VariableDeclaration'], ])
[index, 'index'],
])
)
} else if (_node.type === 'VariableDeclarator') { } else if (_node.type === 'VariableDeclarator') {
_traverse(_node.init, [...pathToNode, ['init', '']]) _traverse(_node.init, [...pathToNode, ['init', '']])
} else if (_node.type === 'PipeExpression') { } else if (_node.type === 'PipeExpression') {
@ -567,7 +563,7 @@ export function findAllPreviousVariablesPath(
const variables: PrevVariable<any>[] = [] const variables: PrevVariable<any>[] = []
bodyItems?.forEach?.((item) => { bodyItems?.forEach?.((item) => {
if (item.type !== 'VariableDeclaration' || item.end > startRange) return 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) const varValue = programMemory?.get(varName)
if (!varValue || typeof varValue?.value !== type) return if (!varValue || typeof varValue?.value !== type) return
variables.push({ variables.push({
@ -761,7 +757,7 @@ export function isLinesParallelAndConstrained(
const _varDec = getNodeFromPath(ast, primaryPath, 'VariableDeclaration') const _varDec = getNodeFromPath(ast, primaryPath, 'VariableDeclaration')
if (err(_varDec)) return _varDec if (err(_varDec)) return _varDec
const varDec = _varDec.node 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) const sg = sketchFromKclValue(programMemory?.get(varName), varName)
if (err(sg)) return sg if (err(sg)) return sg
const _primarySegment = getSketchSegmentFromSourceRange( const _primarySegment = getSketchSegmentFromSourceRange(
@ -881,7 +877,7 @@ export function hasExtrudeSketch({
} }
const varDec = varDecMeta.node const varDec = varDecMeta.node
if (varDec.type !== 'VariableDeclaration') return false if (varDec.type !== 'VariableDeclaration') return false
const varName = varDec.declarations[0].id.name const varName = varDec.declaration.id.name
const varValue = programMemory?.get(varName) const varValue = programMemory?.get(varName)
return ( return (
varValue?.type === 'Solid' || varValue?.type === 'Solid' ||

View File

@ -164,8 +164,7 @@ mySketch001 = startSketchOn('XY')
pathToNode: [ pathToNode: [
['body', ''], ['body', ''],
[0, 'index'], [0, 'index'],
['declarations', 'VariableDeclaration'], ['declaration', 'VariableDeclaration'],
[0, 'index'],
['init', 'VariableDeclarator'], ['init', 'VariableDeclarator'],
], ],
}) })
@ -189,8 +188,7 @@ mySketch001 = startSketchOn('XY')
pathToNode: [ pathToNode: [
['body', ''], ['body', ''],
[0, 'index'], [0, 'index'],
['declarations', 'VariableDeclaration'], ['declaration', 'VariableDeclaration'],
[0, 'index'],
['init', 'VariableDeclarator'], ['init', 'VariableDeclarator'],
], ],
}) })

View File

@ -1701,7 +1701,7 @@ export const angledLineThatIntersects: SketchLineHelper = {
if (err(nodeMeta2)) return nodeMeta2 if (err(nodeMeta2)) return nodeMeta2
const { node: varDec } = nodeMeta2 const { node: varDec } = nodeMeta2
const varName = varDec.declarations[0].id.name const varName = varDec.declaration.id.name
const sketch = sketchFromKclValue( const sketch = sketchFromKclValue(
previousProgramMemory.get(varName), previousProgramMemory.get(varName),
varName varName

View File

@ -111,12 +111,10 @@ export function isSketchVariablesLinked(
let nextVarDec: VariableDeclarator | undefined let nextVarDec: VariableDeclarator | undefined
for (const node of ast.body) { for (const node of ast.body) {
if (node.type !== 'VariableDeclaration') continue if (node.type !== 'VariableDeclaration') continue
const found = node.declarations.find( if (node.declaration.id.name === secondArg.name) {
({ id }) => id?.name === secondArg.name nextVarDec = node.declaration
) break
if (!found) continue }
nextVarDec = found
break
} }
if (!nextVarDec) return false if (!nextVarDec) return false
return isSketchVariablesLinked(nextVarDec, primaryVarDec, ast) return isSketchVariablesLinked(nextVarDec, primaryVarDec, ast)

View File

@ -109,11 +109,11 @@ export function useCalculateKclExpression({
const resultDeclaration = ast.body.find( const resultDeclaration = ast.body.find(
(a) => (a) =>
a.type === 'VariableDeclaration' && a.type === 'VariableDeclaration' &&
a.declarations?.[0]?.id?.name === '__result__' a.declaration.id?.name === '__result__'
) )
const init = const init =
resultDeclaration?.type === 'VariableDeclaration' && resultDeclaration?.type === 'VariableDeclaration' &&
resultDeclaration?.declarations?.[0]?.init resultDeclaration?.declaration.init
const result = execState.memory?.get('__result__')?.value const result = execState.memory?.get('__result__')?.value
setCalcResult(typeof result === 'number' ? String(result) : 'NAN') setCalcResult(typeof result === 'number' ? String(result) : 'NAN')
init && setValueNode(init) init && setValueNode(init)

View File

@ -2491,7 +2491,7 @@ export function canRectangleOrCircleTool({
// This should not be returning false, and it should be caught // This should not be returning false, and it should be caught
// but we need to simulate old behavior to move on. // but we need to simulate old behavior to move on.
if (err(node)) return false 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 */ /** 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 // This should not be returning false, and it should be caught
// but we need to simulate old behavior to move on. // but we need to simulate old behavior to move on.
if (err(node)) return false if (err(node)) return false
if (node.node?.declarations?.[0]?.init.type !== 'PipeExpression') return false if (node.node?.declaration.init.type !== 'PipeExpression') return false
return node.node.declarations[0].init.body.some( return node.node.declaration.init.body.some(
(node) => (node) =>
node.type === 'CallExpression' && node.type === 'CallExpression' &&
(node.callee.name === 'close' || node.callee.name === 'circle') (node.callee.name === 'close' || node.callee.name === 'circle')

View File

@ -395,10 +395,10 @@ fn do_stdlib_inner(
#const_struct #const_struct
fn #boxed_fn_name_ident( fn #boxed_fn_name_ident(
exec_state: &mut crate::executor::ExecState, exec_state: &mut crate::ExecState,
args: crate::std::Args, args: crate::std::Args,
) -> std::pin::Pin< ) -> 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)) 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")] #[tokio::test(flavor = "multi_thread")]
async fn #test_name_mock() { async fn #test_name_mock() {
let program = crate::Program::parse_no_errs(#code_block).unwrap(); 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())), engine: std::sync::Arc::new(Box::new(crate::engine::conn_mock::EngineConnection::new().await.unwrap())),
fs: std::sync::Arc::new(crate::fs::FileManager::new()), fs: std::sync::Arc::new(crate::fs::FileManager::new()),
stdlib: std::sync::Arc::new(crate::std::StdLib::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
settings: Default::default(), 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(); 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() { async fn #test_name() {
let code = #code_block; let code = #code_block;
// Note, `crate` must be kcl_lib // 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); twenty_twenty::assert_image(&format!("tests/outputs/{}.png", #output_test_name_str), &result, 0.99);
} }
} }

View File

@ -3,7 +3,7 @@ mod test_examples_someFn {
#[tokio::test(flavor = "multi_thread")] #[tokio::test(flavor = "multi_thread")]
async fn test_mock_example_someFn0() { async fn test_mock_example_someFn0() {
let program = crate::Program::parse_no_errs("someFn()").unwrap(); 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( engine: std::sync::Arc::new(Box::new(
crate::engine::conn_mock::EngineConnection::new() crate::engine::conn_mock::EngineConnection::new()
.await .await
@ -12,7 +12,7 @@ mod test_examples_someFn {
fs: std::sync::Arc::new(crate::fs::FileManager::new()), fs: std::sync::Arc::new(crate::fs::FileManager::new()),
stdlib: std::sync::Arc::new(crate::std::StdLib::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
settings: Default::default(), settings: Default::default(),
context_type: crate::executor::ContextType::Mock, context_type: crate::execution::ContextType::Mock,
}; };
ctx.run(program.into(), &mut crate::ExecState::default()) ctx.run(program.into(), &mut crate::ExecState::default())
.await .await
@ -22,10 +22,13 @@ mod test_examples_someFn {
#[tokio::test(flavor = "multi_thread", worker_threads = 5)] #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
async fn kcl_test_example_someFn0() { async fn kcl_test_example_someFn0() {
let code = "someFn()"; let code = "someFn()";
let result = let result = crate::test_server::execute_and_snapshot(
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) code,
.await crate::settings::types::UnitLength::Mm,
.unwrap(); None,
)
.await
.unwrap();
twenty_twenty::assert_image( twenty_twenty::assert_image(
&format!("tests/outputs/{}.png", "serial_test_example_someFn0"), &format!("tests/outputs/{}.png", "serial_test_example_someFn0"),
&result, &result,
@ -44,12 +47,12 @@ pub(crate) struct SomeFn {}
#[doc = "Std lib function: someFn\nDocs"] #[doc = "Std lib function: someFn\nDocs"]
pub(crate) const SomeFn: SomeFn = SomeFn {}; pub(crate) const SomeFn: SomeFn = SomeFn {};
fn boxed_someFn( fn boxed_someFn(
exec_state: &mut crate::executor::ExecState, exec_state: &mut crate::ExecState,
args: crate::std::Args, args: crate::std::Args,
) -> std::pin::Pin< ) -> std::pin::Pin<
Box< Box<
dyn std::future::Future< dyn std::future::Future<
Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>, Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
> + Send > + Send
+ '_, + '_,
>, >,

View File

@ -3,7 +3,7 @@ mod test_examples_someFn {
#[tokio::test(flavor = "multi_thread")] #[tokio::test(flavor = "multi_thread")]
async fn test_mock_example_someFn0() { async fn test_mock_example_someFn0() {
let program = crate::Program::parse_no_errs("someFn()").unwrap(); 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( engine: std::sync::Arc::new(Box::new(
crate::engine::conn_mock::EngineConnection::new() crate::engine::conn_mock::EngineConnection::new()
.await .await
@ -12,7 +12,7 @@ mod test_examples_someFn {
fs: std::sync::Arc::new(crate::fs::FileManager::new()), fs: std::sync::Arc::new(crate::fs::FileManager::new()),
stdlib: std::sync::Arc::new(crate::std::StdLib::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
settings: Default::default(), settings: Default::default(),
context_type: crate::executor::ContextType::Mock, context_type: crate::execution::ContextType::Mock,
}; };
ctx.run(program.into(), &mut crate::ExecState::default()) ctx.run(program.into(), &mut crate::ExecState::default())
.await .await
@ -22,10 +22,13 @@ mod test_examples_someFn {
#[tokio::test(flavor = "multi_thread", worker_threads = 5)] #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
async fn kcl_test_example_someFn0() { async fn kcl_test_example_someFn0() {
let code = "someFn()"; let code = "someFn()";
let result = let result = crate::test_server::execute_and_snapshot(
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) code,
.await crate::settings::types::UnitLength::Mm,
.unwrap(); None,
)
.await
.unwrap();
twenty_twenty::assert_image( twenty_twenty::assert_image(
&format!("tests/outputs/{}.png", "serial_test_example_someFn0"), &format!("tests/outputs/{}.png", "serial_test_example_someFn0"),
&result, &result,
@ -44,12 +47,12 @@ pub(crate) struct SomeFn {}
#[doc = "Std lib function: someFn\nDocs"] #[doc = "Std lib function: someFn\nDocs"]
pub(crate) const SomeFn: SomeFn = SomeFn {}; pub(crate) const SomeFn: SomeFn = SomeFn {};
fn boxed_someFn( fn boxed_someFn(
exec_state: &mut crate::executor::ExecState, exec_state: &mut crate::ExecState,
args: crate::std::Args, args: crate::std::Args,
) -> std::pin::Pin< ) -> std::pin::Pin<
Box< Box<
dyn std::future::Future< dyn std::future::Future<
Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>, Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
> + Send > + Send
+ '_, + '_,
>, >,

View File

@ -4,7 +4,7 @@ mod test_examples_show {
async fn test_mock_example_show0() { async fn test_mock_example_show0() {
let program = let program =
crate::Program::parse_no_errs("This is another code block.\nyes sirrr.\nshow").unwrap(); 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( engine: std::sync::Arc::new(Box::new(
crate::engine::conn_mock::EngineConnection::new() crate::engine::conn_mock::EngineConnection::new()
.await .await
@ -13,7 +13,7 @@ mod test_examples_show {
fs: std::sync::Arc::new(crate::fs::FileManager::new()), fs: std::sync::Arc::new(crate::fs::FileManager::new()),
stdlib: std::sync::Arc::new(crate::std::StdLib::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
settings: Default::default(), settings: Default::default(),
context_type: crate::executor::ContextType::Mock, context_type: crate::execution::ContextType::Mock,
}; };
ctx.run(program.into(), &mut crate::ExecState::default()) ctx.run(program.into(), &mut crate::ExecState::default())
.await .await
@ -23,10 +23,13 @@ mod test_examples_show {
#[tokio::test(flavor = "multi_thread", worker_threads = 5)] #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
async fn kcl_test_example_show0() { async fn kcl_test_example_show0() {
let code = "This is another code block.\nyes sirrr.\nshow"; let code = "This is another code block.\nyes sirrr.\nshow";
let result = let result = crate::test_server::execute_and_snapshot(
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) code,
.await crate::settings::types::UnitLength::Mm,
.unwrap(); None,
)
.await
.unwrap();
twenty_twenty::assert_image( twenty_twenty::assert_image(
&format!("tests/outputs/{}.png", "serial_test_example_show0"), &format!("tests/outputs/{}.png", "serial_test_example_show0"),
&result, &result,
@ -38,7 +41,7 @@ mod test_examples_show {
async fn test_mock_example_show1() { async fn test_mock_example_show1() {
let program = let program =
crate::Program::parse_no_errs("This is code.\nIt does other shit.\nshow").unwrap(); 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( engine: std::sync::Arc::new(Box::new(
crate::engine::conn_mock::EngineConnection::new() crate::engine::conn_mock::EngineConnection::new()
.await .await
@ -47,7 +50,7 @@ mod test_examples_show {
fs: std::sync::Arc::new(crate::fs::FileManager::new()), fs: std::sync::Arc::new(crate::fs::FileManager::new()),
stdlib: std::sync::Arc::new(crate::std::StdLib::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
settings: Default::default(), settings: Default::default(),
context_type: crate::executor::ContextType::Mock, context_type: crate::execution::ContextType::Mock,
}; };
ctx.run(program.into(), &mut crate::ExecState::default()) ctx.run(program.into(), &mut crate::ExecState::default())
.await .await
@ -57,10 +60,13 @@ mod test_examples_show {
#[tokio::test(flavor = "multi_thread", worker_threads = 5)] #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
async fn kcl_test_example_show1() { async fn kcl_test_example_show1() {
let code = "This is code.\nIt does other shit.\nshow"; let code = "This is code.\nIt does other shit.\nshow";
let result = let result = crate::test_server::execute_and_snapshot(
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) code,
.await crate::settings::types::UnitLength::Mm,
.unwrap(); None,
)
.await
.unwrap();
twenty_twenty::assert_image( twenty_twenty::assert_image(
&format!("tests/outputs/{}.png", "serial_test_example_show1"), &format!("tests/outputs/{}.png", "serial_test_example_show1"),
&result, &result,
@ -79,12 +85,12 @@ pub(crate) struct Show {}
#[doc = "Std lib function: show\nThis is some function.\nIt does shit."] #[doc = "Std lib function: show\nThis is some function.\nIt does shit."]
pub(crate) const Show: Show = Show {}; pub(crate) const Show: Show = Show {};
fn boxed_show( fn boxed_show(
exec_state: &mut crate::executor::ExecState, exec_state: &mut crate::ExecState,
args: crate::std::Args, args: crate::std::Args,
) -> std::pin::Pin< ) -> std::pin::Pin<
Box< Box<
dyn std::future::Future< dyn std::future::Future<
Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>, Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
> + Send > + Send
+ '_, + '_,
>, >,

View File

@ -4,7 +4,7 @@ mod test_examples_show {
async fn test_mock_example_show0() { async fn test_mock_example_show0() {
let program = let program =
crate::Program::parse_no_errs("This is code.\nIt does other shit.\nshow").unwrap(); 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( engine: std::sync::Arc::new(Box::new(
crate::engine::conn_mock::EngineConnection::new() crate::engine::conn_mock::EngineConnection::new()
.await .await
@ -13,7 +13,7 @@ mod test_examples_show {
fs: std::sync::Arc::new(crate::fs::FileManager::new()), fs: std::sync::Arc::new(crate::fs::FileManager::new()),
stdlib: std::sync::Arc::new(crate::std::StdLib::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
settings: Default::default(), settings: Default::default(),
context_type: crate::executor::ContextType::Mock, context_type: crate::execution::ContextType::Mock,
}; };
ctx.run(program.into(), &mut crate::ExecState::default()) ctx.run(program.into(), &mut crate::ExecState::default())
.await .await
@ -23,10 +23,13 @@ mod test_examples_show {
#[tokio::test(flavor = "multi_thread", worker_threads = 5)] #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
async fn kcl_test_example_show0() { async fn kcl_test_example_show0() {
let code = "This is code.\nIt does other shit.\nshow"; let code = "This is code.\nIt does other shit.\nshow";
let result = let result = crate::test_server::execute_and_snapshot(
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) code,
.await crate::settings::types::UnitLength::Mm,
.unwrap(); None,
)
.await
.unwrap();
twenty_twenty::assert_image( twenty_twenty::assert_image(
&format!("tests/outputs/{}.png", "serial_test_example_show0"), &format!("tests/outputs/{}.png", "serial_test_example_show0"),
&result, &result,
@ -45,12 +48,12 @@ pub(crate) struct Show {}
#[doc = "Std lib function: show\nThis is some function.\nIt does shit."] #[doc = "Std lib function: show\nThis is some function.\nIt does shit."]
pub(crate) const Show: Show = Show {}; pub(crate) const Show: Show = Show {};
fn boxed_show( fn boxed_show(
exec_state: &mut crate::executor::ExecState, exec_state: &mut crate::ExecState,
args: crate::std::Args, args: crate::std::Args,
) -> std::pin::Pin< ) -> std::pin::Pin<
Box< Box<
dyn std::future::Future< dyn std::future::Future<
Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>, Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
> + Send > + Send
+ '_, + '_,
>, >,

View File

@ -5,7 +5,7 @@ mod test_examples_my_func {
let program = let program =
crate::Program::parse_no_errs("This is another code block.\nyes sirrr.\nmyFunc") crate::Program::parse_no_errs("This is another code block.\nyes sirrr.\nmyFunc")
.unwrap(); .unwrap();
let ctx = crate::executor::ExecutorContext { let ctx = crate::ExecutorContext {
engine: std::sync::Arc::new(Box::new( engine: std::sync::Arc::new(Box::new(
crate::engine::conn_mock::EngineConnection::new() crate::engine::conn_mock::EngineConnection::new()
.await .await
@ -14,7 +14,7 @@ mod test_examples_my_func {
fs: std::sync::Arc::new(crate::fs::FileManager::new()), fs: std::sync::Arc::new(crate::fs::FileManager::new()),
stdlib: std::sync::Arc::new(crate::std::StdLib::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
settings: Default::default(), settings: Default::default(),
context_type: crate::executor::ContextType::Mock, context_type: crate::execution::ContextType::Mock,
}; };
ctx.run(program.into(), &mut crate::ExecState::default()) ctx.run(program.into(), &mut crate::ExecState::default())
.await .await
@ -24,10 +24,13 @@ mod test_examples_my_func {
#[tokio::test(flavor = "multi_thread", worker_threads = 5)] #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
async fn kcl_test_example_my_func0() { async fn kcl_test_example_my_func0() {
let code = "This is another code block.\nyes sirrr.\nmyFunc"; let code = "This is another code block.\nyes sirrr.\nmyFunc";
let result = let result = crate::test_server::execute_and_snapshot(
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) code,
.await crate::settings::types::UnitLength::Mm,
.unwrap(); None,
)
.await
.unwrap();
twenty_twenty::assert_image( twenty_twenty::assert_image(
&format!("tests/outputs/{}.png", "serial_test_example_my_func0"), &format!("tests/outputs/{}.png", "serial_test_example_my_func0"),
&result, &result,
@ -39,7 +42,7 @@ mod test_examples_my_func {
async fn test_mock_example_my_func1() { async fn test_mock_example_my_func1() {
let program = let program =
crate::Program::parse_no_errs("This is code.\nIt does other shit.\nmyFunc").unwrap(); 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( engine: std::sync::Arc::new(Box::new(
crate::engine::conn_mock::EngineConnection::new() crate::engine::conn_mock::EngineConnection::new()
.await .await
@ -48,7 +51,7 @@ mod test_examples_my_func {
fs: std::sync::Arc::new(crate::fs::FileManager::new()), fs: std::sync::Arc::new(crate::fs::FileManager::new()),
stdlib: std::sync::Arc::new(crate::std::StdLib::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
settings: Default::default(), settings: Default::default(),
context_type: crate::executor::ContextType::Mock, context_type: crate::execution::ContextType::Mock,
}; };
ctx.run(program.into(), &mut crate::ExecState::default()) ctx.run(program.into(), &mut crate::ExecState::default())
.await .await
@ -58,10 +61,13 @@ mod test_examples_my_func {
#[tokio::test(flavor = "multi_thread", worker_threads = 5)] #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
async fn kcl_test_example_my_func1() { async fn kcl_test_example_my_func1() {
let code = "This is code.\nIt does other shit.\nmyFunc"; let code = "This is code.\nIt does other shit.\nmyFunc";
let result = let result = crate::test_server::execute_and_snapshot(
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) code,
.await crate::settings::types::UnitLength::Mm,
.unwrap(); None,
)
.await
.unwrap();
twenty_twenty::assert_image( twenty_twenty::assert_image(
&format!("tests/outputs/{}.png", "serial_test_example_my_func1"), &format!("tests/outputs/{}.png", "serial_test_example_my_func1"),
&result, &result,
@ -80,12 +86,12 @@ pub(crate) struct MyFunc {}
#[doc = "Std lib function: myFunc\nThis is some function.\nIt does shit."] #[doc = "Std lib function: myFunc\nThis is some function.\nIt does shit."]
pub(crate) const MyFunc: MyFunc = MyFunc {}; pub(crate) const MyFunc: MyFunc = MyFunc {};
fn boxed_my_func( fn boxed_my_func(
exec_state: &mut crate::executor::ExecState, exec_state: &mut crate::ExecState,
args: crate::std::Args, args: crate::std::Args,
) -> std::pin::Pin< ) -> std::pin::Pin<
Box< Box<
dyn std::future::Future< dyn std::future::Future<
Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>, Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
> + Send > + Send
+ '_, + '_,
>, >,

View File

@ -5,7 +5,7 @@ mod test_examples_line_to {
let program = let program =
crate::Program::parse_no_errs("This is another code block.\nyes sirrr.\nlineTo") crate::Program::parse_no_errs("This is another code block.\nyes sirrr.\nlineTo")
.unwrap(); .unwrap();
let ctx = crate::executor::ExecutorContext { let ctx = crate::ExecutorContext {
engine: std::sync::Arc::new(Box::new( engine: std::sync::Arc::new(Box::new(
crate::engine::conn_mock::EngineConnection::new() crate::engine::conn_mock::EngineConnection::new()
.await .await
@ -14,7 +14,7 @@ mod test_examples_line_to {
fs: std::sync::Arc::new(crate::fs::FileManager::new()), fs: std::sync::Arc::new(crate::fs::FileManager::new()),
stdlib: std::sync::Arc::new(crate::std::StdLib::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
settings: Default::default(), settings: Default::default(),
context_type: crate::executor::ContextType::Mock, context_type: crate::execution::ContextType::Mock,
}; };
ctx.run(program.into(), &mut crate::ExecState::default()) ctx.run(program.into(), &mut crate::ExecState::default())
.await .await
@ -24,10 +24,13 @@ mod test_examples_line_to {
#[tokio::test(flavor = "multi_thread", worker_threads = 5)] #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
async fn kcl_test_example_line_to0() { async fn kcl_test_example_line_to0() {
let code = "This is another code block.\nyes sirrr.\nlineTo"; let code = "This is another code block.\nyes sirrr.\nlineTo";
let result = let result = crate::test_server::execute_and_snapshot(
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) code,
.await crate::settings::types::UnitLength::Mm,
.unwrap(); None,
)
.await
.unwrap();
twenty_twenty::assert_image( twenty_twenty::assert_image(
&format!("tests/outputs/{}.png", "serial_test_example_line_to0"), &format!("tests/outputs/{}.png", "serial_test_example_line_to0"),
&result, &result,
@ -39,7 +42,7 @@ mod test_examples_line_to {
async fn test_mock_example_line_to1() { async fn test_mock_example_line_to1() {
let program = let program =
crate::Program::parse_no_errs("This is code.\nIt does other shit.\nlineTo").unwrap(); 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( engine: std::sync::Arc::new(Box::new(
crate::engine::conn_mock::EngineConnection::new() crate::engine::conn_mock::EngineConnection::new()
.await .await
@ -48,7 +51,7 @@ mod test_examples_line_to {
fs: std::sync::Arc::new(crate::fs::FileManager::new()), fs: std::sync::Arc::new(crate::fs::FileManager::new()),
stdlib: std::sync::Arc::new(crate::std::StdLib::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
settings: Default::default(), settings: Default::default(),
context_type: crate::executor::ContextType::Mock, context_type: crate::execution::ContextType::Mock,
}; };
ctx.run(program.into(), &mut crate::ExecState::default()) ctx.run(program.into(), &mut crate::ExecState::default())
.await .await
@ -58,10 +61,13 @@ mod test_examples_line_to {
#[tokio::test(flavor = "multi_thread", worker_threads = 5)] #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
async fn kcl_test_example_line_to1() { async fn kcl_test_example_line_to1() {
let code = "This is code.\nIt does other shit.\nlineTo"; let code = "This is code.\nIt does other shit.\nlineTo";
let result = let result = crate::test_server::execute_and_snapshot(
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) code,
.await crate::settings::types::UnitLength::Mm,
.unwrap(); None,
)
.await
.unwrap();
twenty_twenty::assert_image( twenty_twenty::assert_image(
&format!("tests/outputs/{}.png", "serial_test_example_line_to1"), &format!("tests/outputs/{}.png", "serial_test_example_line_to1"),
&result, &result,
@ -80,12 +86,12 @@ pub(crate) struct LineTo {}
#[doc = "Std lib function: lineTo\nThis is some function.\nIt does shit."] #[doc = "Std lib function: lineTo\nThis is some function.\nIt does shit."]
pub(crate) const LineTo: LineTo = LineTo {}; pub(crate) const LineTo: LineTo = LineTo {};
fn boxed_line_to( fn boxed_line_to(
exec_state: &mut crate::executor::ExecState, exec_state: &mut crate::ExecState,
args: crate::std::Args, args: crate::std::Args,
) -> std::pin::Pin< ) -> std::pin::Pin<
Box< Box<
dyn std::future::Future< dyn std::future::Future<
Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>, Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
> + Send > + Send
+ '_, + '_,
>, >,

View File

@ -4,7 +4,7 @@ mod test_examples_min {
async fn test_mock_example_min0() { async fn test_mock_example_min0() {
let program = let program =
crate::Program::parse_no_errs("This is another code block.\nyes sirrr.\nmin").unwrap(); 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( engine: std::sync::Arc::new(Box::new(
crate::engine::conn_mock::EngineConnection::new() crate::engine::conn_mock::EngineConnection::new()
.await .await
@ -13,7 +13,7 @@ mod test_examples_min {
fs: std::sync::Arc::new(crate::fs::FileManager::new()), fs: std::sync::Arc::new(crate::fs::FileManager::new()),
stdlib: std::sync::Arc::new(crate::std::StdLib::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
settings: Default::default(), settings: Default::default(),
context_type: crate::executor::ContextType::Mock, context_type: crate::execution::ContextType::Mock,
}; };
ctx.run(program.into(), &mut crate::ExecState::default()) ctx.run(program.into(), &mut crate::ExecState::default())
.await .await
@ -23,10 +23,13 @@ mod test_examples_min {
#[tokio::test(flavor = "multi_thread", worker_threads = 5)] #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
async fn kcl_test_example_min0() { async fn kcl_test_example_min0() {
let code = "This is another code block.\nyes sirrr.\nmin"; let code = "This is another code block.\nyes sirrr.\nmin";
let result = let result = crate::test_server::execute_and_snapshot(
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) code,
.await crate::settings::types::UnitLength::Mm,
.unwrap(); None,
)
.await
.unwrap();
twenty_twenty::assert_image( twenty_twenty::assert_image(
&format!("tests/outputs/{}.png", "serial_test_example_min0"), &format!("tests/outputs/{}.png", "serial_test_example_min0"),
&result, &result,
@ -38,7 +41,7 @@ mod test_examples_min {
async fn test_mock_example_min1() { async fn test_mock_example_min1() {
let program = let program =
crate::Program::parse_no_errs("This is code.\nIt does other shit.\nmin").unwrap(); 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( engine: std::sync::Arc::new(Box::new(
crate::engine::conn_mock::EngineConnection::new() crate::engine::conn_mock::EngineConnection::new()
.await .await
@ -47,7 +50,7 @@ mod test_examples_min {
fs: std::sync::Arc::new(crate::fs::FileManager::new()), fs: std::sync::Arc::new(crate::fs::FileManager::new()),
stdlib: std::sync::Arc::new(crate::std::StdLib::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
settings: Default::default(), settings: Default::default(),
context_type: crate::executor::ContextType::Mock, context_type: crate::execution::ContextType::Mock,
}; };
ctx.run(program.into(), &mut crate::ExecState::default()) ctx.run(program.into(), &mut crate::ExecState::default())
.await .await
@ -57,10 +60,13 @@ mod test_examples_min {
#[tokio::test(flavor = "multi_thread", worker_threads = 5)] #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
async fn kcl_test_example_min1() { async fn kcl_test_example_min1() {
let code = "This is code.\nIt does other shit.\nmin"; let code = "This is code.\nIt does other shit.\nmin";
let result = let result = crate::test_server::execute_and_snapshot(
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) code,
.await crate::settings::types::UnitLength::Mm,
.unwrap(); None,
)
.await
.unwrap();
twenty_twenty::assert_image( twenty_twenty::assert_image(
&format!("tests/outputs/{}.png", "serial_test_example_min1"), &format!("tests/outputs/{}.png", "serial_test_example_min1"),
&result, &result,
@ -79,12 +85,12 @@ pub(crate) struct Min {}
#[doc = "Std lib function: min\nThis is some function.\nIt does shit."] #[doc = "Std lib function: min\nThis is some function.\nIt does shit."]
pub(crate) const Min: Min = Min {}; pub(crate) const Min: Min = Min {};
fn boxed_min( fn boxed_min(
exec_state: &mut crate::executor::ExecState, exec_state: &mut crate::ExecState,
args: crate::std::Args, args: crate::std::Args,
) -> std::pin::Pin< ) -> std::pin::Pin<
Box< Box<
dyn std::future::Future< dyn std::future::Future<
Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>, Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
> + Send > + Send
+ '_, + '_,
>, >,

View File

@ -4,7 +4,7 @@ mod test_examples_show {
async fn test_mock_example_show0() { async fn test_mock_example_show0() {
let program = let program =
crate::Program::parse_no_errs("This is code.\nIt does other shit.\nshow").unwrap(); 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( engine: std::sync::Arc::new(Box::new(
crate::engine::conn_mock::EngineConnection::new() crate::engine::conn_mock::EngineConnection::new()
.await .await
@ -13,7 +13,7 @@ mod test_examples_show {
fs: std::sync::Arc::new(crate::fs::FileManager::new()), fs: std::sync::Arc::new(crate::fs::FileManager::new()),
stdlib: std::sync::Arc::new(crate::std::StdLib::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
settings: Default::default(), settings: Default::default(),
context_type: crate::executor::ContextType::Mock, context_type: crate::execution::ContextType::Mock,
}; };
ctx.run(program.into(), &mut crate::ExecState::default()) ctx.run(program.into(), &mut crate::ExecState::default())
.await .await
@ -23,10 +23,13 @@ mod test_examples_show {
#[tokio::test(flavor = "multi_thread", worker_threads = 5)] #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
async fn kcl_test_example_show0() { async fn kcl_test_example_show0() {
let code = "This is code.\nIt does other shit.\nshow"; let code = "This is code.\nIt does other shit.\nshow";
let result = let result = crate::test_server::execute_and_snapshot(
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) code,
.await crate::settings::types::UnitLength::Mm,
.unwrap(); None,
)
.await
.unwrap();
twenty_twenty::assert_image( twenty_twenty::assert_image(
&format!("tests/outputs/{}.png", "serial_test_example_show0"), &format!("tests/outputs/{}.png", "serial_test_example_show0"),
&result, &result,
@ -45,12 +48,12 @@ pub(crate) struct Show {}
#[doc = "Std lib function: show\nThis is some function.\nIt does shit."] #[doc = "Std lib function: show\nThis is some function.\nIt does shit."]
pub(crate) const Show: Show = Show {}; pub(crate) const Show: Show = Show {};
fn boxed_show( fn boxed_show(
exec_state: &mut crate::executor::ExecState, exec_state: &mut crate::ExecState,
args: crate::std::Args, args: crate::std::Args,
) -> std::pin::Pin< ) -> std::pin::Pin<
Box< Box<
dyn std::future::Future< dyn std::future::Future<
Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>, Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
> + Send > + Send
+ '_, + '_,
>, >,

View File

@ -4,7 +4,7 @@ mod test_examples_import {
async fn test_mock_example_import0() { async fn test_mock_example_import0() {
let program = let program =
crate::Program::parse_no_errs("This is code.\nIt does other shit.\nimport").unwrap(); 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( engine: std::sync::Arc::new(Box::new(
crate::engine::conn_mock::EngineConnection::new() crate::engine::conn_mock::EngineConnection::new()
.await .await
@ -13,7 +13,7 @@ mod test_examples_import {
fs: std::sync::Arc::new(crate::fs::FileManager::new()), fs: std::sync::Arc::new(crate::fs::FileManager::new()),
stdlib: std::sync::Arc::new(crate::std::StdLib::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
settings: Default::default(), settings: Default::default(),
context_type: crate::executor::ContextType::Mock, context_type: crate::execution::ContextType::Mock,
}; };
ctx.run(program.into(), &mut crate::ExecState::default()) ctx.run(program.into(), &mut crate::ExecState::default())
.await .await
@ -23,10 +23,13 @@ mod test_examples_import {
#[tokio::test(flavor = "multi_thread", worker_threads = 5)] #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
async fn kcl_test_example_import0() { async fn kcl_test_example_import0() {
let code = "This is code.\nIt does other shit.\nimport"; let code = "This is code.\nIt does other shit.\nimport";
let result = let result = crate::test_server::execute_and_snapshot(
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) code,
.await crate::settings::types::UnitLength::Mm,
.unwrap(); None,
)
.await
.unwrap();
twenty_twenty::assert_image( twenty_twenty::assert_image(
&format!("tests/outputs/{}.png", "serial_test_example_import0"), &format!("tests/outputs/{}.png", "serial_test_example_import0"),
&result, &result,
@ -45,12 +48,12 @@ pub(crate) struct Import {}
#[doc = "Std lib function: import\nThis is some function.\nIt does shit."] #[doc = "Std lib function: import\nThis is some function.\nIt does shit."]
pub(crate) const Import: Import = Import {}; pub(crate) const Import: Import = Import {};
fn boxed_import( fn boxed_import(
exec_state: &mut crate::executor::ExecState, exec_state: &mut crate::ExecState,
args: crate::std::Args, args: crate::std::Args,
) -> std::pin::Pin< ) -> std::pin::Pin<
Box< Box<
dyn std::future::Future< dyn std::future::Future<
Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>, Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
> + Send > + Send
+ '_, + '_,
>, >,

View File

@ -4,7 +4,7 @@ mod test_examples_import {
async fn test_mock_example_import0() { async fn test_mock_example_import0() {
let program = let program =
crate::Program::parse_no_errs("This is code.\nIt does other shit.\nimport").unwrap(); 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( engine: std::sync::Arc::new(Box::new(
crate::engine::conn_mock::EngineConnection::new() crate::engine::conn_mock::EngineConnection::new()
.await .await
@ -13,7 +13,7 @@ mod test_examples_import {
fs: std::sync::Arc::new(crate::fs::FileManager::new()), fs: std::sync::Arc::new(crate::fs::FileManager::new()),
stdlib: std::sync::Arc::new(crate::std::StdLib::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
settings: Default::default(), settings: Default::default(),
context_type: crate::executor::ContextType::Mock, context_type: crate::execution::ContextType::Mock,
}; };
ctx.run(program.into(), &mut crate::ExecState::default()) ctx.run(program.into(), &mut crate::ExecState::default())
.await .await
@ -23,10 +23,13 @@ mod test_examples_import {
#[tokio::test(flavor = "multi_thread", worker_threads = 5)] #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
async fn kcl_test_example_import0() { async fn kcl_test_example_import0() {
let code = "This is code.\nIt does other shit.\nimport"; let code = "This is code.\nIt does other shit.\nimport";
let result = let result = crate::test_server::execute_and_snapshot(
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) code,
.await crate::settings::types::UnitLength::Mm,
.unwrap(); None,
)
.await
.unwrap();
twenty_twenty::assert_image( twenty_twenty::assert_image(
&format!("tests/outputs/{}.png", "serial_test_example_import0"), &format!("tests/outputs/{}.png", "serial_test_example_import0"),
&result, &result,
@ -45,12 +48,12 @@ pub(crate) struct Import {}
#[doc = "Std lib function: import\nThis is some function.\nIt does shit."] #[doc = "Std lib function: import\nThis is some function.\nIt does shit."]
pub(crate) const Import: Import = Import {}; pub(crate) const Import: Import = Import {};
fn boxed_import( fn boxed_import(
exec_state: &mut crate::executor::ExecState, exec_state: &mut crate::ExecState,
args: crate::std::Args, args: crate::std::Args,
) -> std::pin::Pin< ) -> std::pin::Pin<
Box< Box<
dyn std::future::Future< dyn std::future::Future<
Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>, Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
> + Send > + Send
+ '_, + '_,
>, >,

View File

@ -4,7 +4,7 @@ mod test_examples_import {
async fn test_mock_example_import0() { async fn test_mock_example_import0() {
let program = let program =
crate::Program::parse_no_errs("This is code.\nIt does other shit.\nimport").unwrap(); 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( engine: std::sync::Arc::new(Box::new(
crate::engine::conn_mock::EngineConnection::new() crate::engine::conn_mock::EngineConnection::new()
.await .await
@ -13,7 +13,7 @@ mod test_examples_import {
fs: std::sync::Arc::new(crate::fs::FileManager::new()), fs: std::sync::Arc::new(crate::fs::FileManager::new()),
stdlib: std::sync::Arc::new(crate::std::StdLib::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
settings: Default::default(), settings: Default::default(),
context_type: crate::executor::ContextType::Mock, context_type: crate::execution::ContextType::Mock,
}; };
ctx.run(program.into(), &mut crate::ExecState::default()) ctx.run(program.into(), &mut crate::ExecState::default())
.await .await
@ -23,10 +23,13 @@ mod test_examples_import {
#[tokio::test(flavor = "multi_thread", worker_threads = 5)] #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
async fn kcl_test_example_import0() { async fn kcl_test_example_import0() {
let code = "This is code.\nIt does other shit.\nimport"; let code = "This is code.\nIt does other shit.\nimport";
let result = let result = crate::test_server::execute_and_snapshot(
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) code,
.await crate::settings::types::UnitLength::Mm,
.unwrap(); None,
)
.await
.unwrap();
twenty_twenty::assert_image( twenty_twenty::assert_image(
&format!("tests/outputs/{}.png", "serial_test_example_import0"), &format!("tests/outputs/{}.png", "serial_test_example_import0"),
&result, &result,
@ -45,12 +48,12 @@ pub(crate) struct Import {}
#[doc = "Std lib function: import\nThis is some function.\nIt does shit."] #[doc = "Std lib function: import\nThis is some function.\nIt does shit."]
pub(crate) const Import: Import = Import {}; pub(crate) const Import: Import = Import {};
fn boxed_import( fn boxed_import(
exec_state: &mut crate::executor::ExecState, exec_state: &mut crate::ExecState,
args: crate::std::Args, args: crate::std::Args,
) -> std::pin::Pin< ) -> std::pin::Pin<
Box< Box<
dyn std::future::Future< dyn std::future::Future<
Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>, Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
> + Send > + Send
+ '_, + '_,
>, >,

View File

@ -4,7 +4,7 @@ mod test_examples_show {
async fn test_mock_example_show0() { async fn test_mock_example_show0() {
let program = let program =
crate::Program::parse_no_errs("This is code.\nIt does other shit.\nshow").unwrap(); 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( engine: std::sync::Arc::new(Box::new(
crate::engine::conn_mock::EngineConnection::new() crate::engine::conn_mock::EngineConnection::new()
.await .await
@ -13,7 +13,7 @@ mod test_examples_show {
fs: std::sync::Arc::new(crate::fs::FileManager::new()), fs: std::sync::Arc::new(crate::fs::FileManager::new()),
stdlib: std::sync::Arc::new(crate::std::StdLib::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
settings: Default::default(), settings: Default::default(),
context_type: crate::executor::ContextType::Mock, context_type: crate::execution::ContextType::Mock,
}; };
ctx.run(program.into(), &mut crate::ExecState::default()) ctx.run(program.into(), &mut crate::ExecState::default())
.await .await
@ -23,10 +23,13 @@ mod test_examples_show {
#[tokio::test(flavor = "multi_thread", worker_threads = 5)] #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
async fn kcl_test_example_show0() { async fn kcl_test_example_show0() {
let code = "This is code.\nIt does other shit.\nshow"; let code = "This is code.\nIt does other shit.\nshow";
let result = let result = crate::test_server::execute_and_snapshot(
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) code,
.await crate::settings::types::UnitLength::Mm,
.unwrap(); None,
)
.await
.unwrap();
twenty_twenty::assert_image( twenty_twenty::assert_image(
&format!("tests/outputs/{}.png", "serial_test_example_show0"), &format!("tests/outputs/{}.png", "serial_test_example_show0"),
&result, &result,
@ -45,12 +48,12 @@ pub(crate) struct Show {}
#[doc = "Std lib function: show\nThis is some function.\nIt does shit."] #[doc = "Std lib function: show\nThis is some function.\nIt does shit."]
pub(crate) const Show: Show = Show {}; pub(crate) const Show: Show = Show {};
fn boxed_show( fn boxed_show(
exec_state: &mut crate::executor::ExecState, exec_state: &mut crate::ExecState,
args: crate::std::Args, args: crate::std::Args,
) -> std::pin::Pin< ) -> std::pin::Pin<
Box< Box<
dyn std::future::Future< dyn std::future::Future<
Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>, Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
> + Send > + Send
+ '_, + '_,
>, >,

View File

@ -3,7 +3,7 @@ mod test_examples_some_function {
#[tokio::test(flavor = "multi_thread")] #[tokio::test(flavor = "multi_thread")]
async fn test_mock_example_some_function0() { async fn test_mock_example_some_function0() {
let program = crate::Program::parse_no_errs("someFunction()").unwrap(); 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( engine: std::sync::Arc::new(Box::new(
crate::engine::conn_mock::EngineConnection::new() crate::engine::conn_mock::EngineConnection::new()
.await .await
@ -12,7 +12,7 @@ mod test_examples_some_function {
fs: std::sync::Arc::new(crate::fs::FileManager::new()), fs: std::sync::Arc::new(crate::fs::FileManager::new()),
stdlib: std::sync::Arc::new(crate::std::StdLib::new()), stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
settings: Default::default(), settings: Default::default(),
context_type: crate::executor::ContextType::Mock, context_type: crate::execution::ContextType::Mock,
}; };
ctx.run(program.into(), &mut crate::ExecState::default()) ctx.run(program.into(), &mut crate::ExecState::default())
.await .await
@ -22,10 +22,13 @@ mod test_examples_some_function {
#[tokio::test(flavor = "multi_thread", worker_threads = 5)] #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
async fn kcl_test_example_some_function0() { async fn kcl_test_example_some_function0() {
let code = "someFunction()"; let code = "someFunction()";
let result = let result = crate::test_server::execute_and_snapshot(
crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm) code,
.await crate::settings::types::UnitLength::Mm,
.unwrap(); None,
)
.await
.unwrap();
twenty_twenty::assert_image( twenty_twenty::assert_image(
&format!("tests/outputs/{}.png", "serial_test_example_some_function0"), &format!("tests/outputs/{}.png", "serial_test_example_some_function0"),
&result, &result,
@ -44,12 +47,12 @@ pub(crate) struct SomeFunction {}
#[doc = "Std lib function: someFunction\nDocs"] #[doc = "Std lib function: someFunction\nDocs"]
pub(crate) const SomeFunction: SomeFunction = SomeFunction {}; pub(crate) const SomeFunction: SomeFunction = SomeFunction {};
fn boxed_some_function( fn boxed_some_function(
exec_state: &mut crate::executor::ExecState, exec_state: &mut crate::ExecState,
args: crate::std::Args, args: crate::std::Args,
) -> std::pin::Pin< ) -> std::pin::Pin<
Box< Box<
dyn std::future::Future< dyn std::future::Future<
Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>, Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
> + Send > + Send
+ '_, + '_,
>, >,

View File

@ -18,7 +18,7 @@ pub fn bench_execute(c: &mut Criterion) {
let rt = Runtime::new().unwrap(); let rt = Runtime::new().unwrap();
// Spawn a future onto the runtime // Spawn a future onto the runtime
b.iter(|| { 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(); group.finish();
@ -38,7 +38,7 @@ pub fn bench_lego(c: &mut Criterion) {
let code = LEGO_PROGRAM.replace("{{N}}", &size.to_string()); let code = LEGO_PROGRAM.replace("{{N}}", &size.to_string());
// Spawn a future onto the runtime // Spawn a future onto the runtime
b.iter(|| { 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();
}); });
}); });
} }

View File

@ -3,7 +3,7 @@ use iai::black_box;
async fn execute_server_rack_heavy() { async fn execute_server_rack_heavy() {
let code = SERVER_RACK_HEAVY_PROGRAM; let code = SERVER_RACK_HEAVY_PROGRAM;
black_box( 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 .await
.unwrap(), .unwrap(),
); );
@ -12,7 +12,7 @@ async fn execute_server_rack_heavy() {
async fn execute_server_rack_lite() { async fn execute_server_rack_lite() {
let code = SERVER_RACK_LITE_PROGRAM; let code = SERVER_RACK_LITE_PROGRAM;
black_box( 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 .await
.unwrap(), .unwrap(),
); );

View File

@ -1,3 +0,0 @@
pub mod cache;
pub mod modify;
pub mod types;

View File

@ -22,7 +22,7 @@ use super::ExecutionKind;
use crate::{ use crate::{
engine::EngineManager, engine::EngineManager,
errors::{KclError, KclErrorDetails}, errors::{KclError, KclErrorDetails},
executor::{DefaultPlanes, IdGenerator}, execution::{DefaultPlanes, IdGenerator},
SourceRange, SourceRange,
}; };

View File

@ -20,7 +20,7 @@ use kittycad_modeling_cmds::{self as kcmc};
use super::ExecutionKind; use super::ExecutionKind;
use crate::{ use crate::{
errors::KclError, errors::KclError,
executor::{DefaultPlanes, IdGenerator}, execution::{DefaultPlanes, IdGenerator},
SourceRange, SourceRange,
}; };

View File

@ -11,7 +11,7 @@ use wasm_bindgen::prelude::*;
use crate::{ use crate::{
engine::ExecutionKind, engine::ExecutionKind,
errors::{KclError, KclErrorDetails}, errors::{KclError, KclErrorDetails},
executor::{DefaultPlanes, IdGenerator}, execution::{DefaultPlanes, IdGenerator},
SourceRange, SourceRange,
}; };

View File

@ -32,7 +32,7 @@ use uuid::Uuid;
use crate::{ use crate::{
errors::{KclError, KclErrorDetails}, errors::{KclError, KclErrorDetails},
executor::{DefaultPlanes, IdGenerator, Point3d}, execution::{DefaultPlanes, IdGenerator, Point3d},
SourceRange, SourceRange,
}; };

View File

@ -4,11 +4,13 @@ use async_recursion::async_recursion;
use crate::{ use crate::{
errors::{KclError, KclErrorDetails}, errors::{KclError, KclErrorDetails},
executor::{BodyType, ExecState, ExecutorContext, KclValue, Metadata, StatementKind, TagEngineInfo, TagIdentifier}, execution::{
BodyType, ExecState, ExecutorContext, KclValue, Metadata, StatementKind, TagEngineInfo, TagIdentifier,
},
parsing::ast::types::{ parsing::ast::types::{
ArrayExpression, ArrayRangeExpression, BinaryExpression, BinaryOperator, BinaryPart, CallExpression, ArrayExpression, ArrayRangeExpression, BinaryExpression, BinaryOperator, BinaryPart, CallExpression,
CallExpressionKw, Expr, IfExpression, LiteralIdentifier, LiteralValue, MemberExpression, MemberObject, Node, CallExpressionKw, Expr, IfExpression, LiteralIdentifier, LiteralValue, MemberExpression, MemberObject, Node,
ObjectExpression, TagDeclarator, UnaryExpression, UnaryOperator, ObjectExpression, PipeExpression, TagDeclarator, UnaryExpression, UnaryOperator,
}, },
source_range::SourceRange, source_range::SourceRange,
std::{args::Arg, FunctionKind}, std::{args::Arg, FunctionKind},
@ -807,3 +809,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
}
}

View File

@ -2,7 +2,7 @@ use schemars::JsonSchema;
use crate::{ use crate::{
errors::KclError, errors::KclError,
executor::{ execution::{
call_user_defined_function, ExecState, ExecutorContext, KclValue, MemoryFunction, Metadata, ProgramMemory, call_user_defined_function, ExecState, ExecutorContext, KclValue, MemoryFunction, Metadata, ProgramMemory,
}, },
parsing::ast::types::FunctionExpression, parsing::ast::types::FunctionExpression,

View File

@ -7,7 +7,7 @@ use serde::{Deserialize, Serialize};
use crate::{ use crate::{
errors::KclErrorDetails, errors::KclErrorDetails,
exec::{ProgramMemory, Sketch}, 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}, parsing::ast::types::{FunctionExpression, KclNone, LiteralValue, TagDeclarator, TagNode},
std::{args::Arg, FnAsArg}, std::{args::Arg, FnAsArg},
ExecState, ExecutorContext, KclError, SourceRange, 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. /// Put the number into a KCL value.
pub const fn from_number(f: f64, meta: Vec<Metadata>) -> Self { pub const fn from_number(f: f64, meta: Vec<Metadata>) -> Self {
Self::Number { value: f, meta } Self::Number { value: f, meta }
@ -496,7 +493,7 @@ impl KclValue {
) )
.await .await
} else { } else {
crate::executor::call_user_defined_function( crate::execution::call_user_defined_function(
args, args,
closure_memory.as_ref(), closure_memory.as_ref(),
expression.as_ref(), expression.as_ref(),

View File

@ -1,6 +1,6 @@
//! The executor for the AST. //! The executor for the AST.
use std::{collections::HashSet, sync::Arc}; use std::{path::PathBuf, sync::Arc};
use anyhow::Result; use anyhow::Result;
use async_recursion::async_recursion; use async_recursion::async_recursion;
@ -20,14 +20,18 @@ use serde::{Deserialize, Serialize};
type Point2D = kcmc::shared::Point2d<f64>; type Point2D = kcmc::shared::Point2d<f64>;
type Point3D = kcmc::shared::Point3d<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::{ use crate::{
engine::{EngineManager, ExecutionKind}, engine::{EngineManager, ExecutionKind},
errors::{KclError, KclErrorDetails}, errors::{KclError, KclErrorDetails},
fs::{FileManager, FileSystem}, fs::{FileManager, FileSystem},
parsing::ast::{ parsing::ast::{
cache::{get_changed_program, CacheInformation}, 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, settings::types::UnitLength,
source_range::{ModuleId, SourceRange}, source_range::{ModuleId, SourceRange},
@ -35,6 +39,10 @@ use crate::{
ExecError, Program, ExecError, Program,
}; };
mod exec_ast;
mod function_param;
mod kcl_value;
/// State for executing a program. /// State for executing a program.
#[derive(Debug, Default, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[derive(Debug, Default, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)]
#[ts(export)] #[ts(export)]
@ -50,7 +58,7 @@ pub struct ExecState {
/// expression. If we're not currently in a pipeline, this will be None. /// expression. If we're not currently in a pipeline, this will be None.
pub pipe_value: Option<KclValue>, pub pipe_value: Option<KclValue>,
/// Identifiers that have been exported from the current module. /// 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. /// The stack of import statements for detecting circular module imports.
/// If this is empty, we're not currently executing an import statement. /// If this is empty, we're not currently executing an import statement.
pub import_stack: Vec<std::path::PathBuf>, pub import_stack: Vec<std::path::PathBuf>,
@ -61,7 +69,7 @@ pub struct ExecState {
} }
impl 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. // Need to avoid borrowing self in the closure.
let new_module_id = ModuleId::from_usize(self.path_to_source_id.len()); let new_module_id = ModuleId::from_usize(self.path_to_source_id.len());
let mut is_new = false; let mut is_new = false;
@ -1498,6 +1506,9 @@ pub struct ExecutorSettings {
/// Should engine store this for replay? /// Should engine store this for replay?
/// If so, under what name? /// If so, under what name?
pub replay: Option<String>, 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 { impl Default for ExecutorSettings {
@ -1508,6 +1519,7 @@ impl Default for ExecutorSettings {
enable_ssao: false, enable_ssao: false,
show_grid: false, show_grid: false,
replay: None, 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(), enable_ssao: config.settings.modeling.enable_ssao.into(),
show_grid: config.settings.modeling.show_scale_grid, show_grid: config.settings.modeling.show_scale_grid,
replay: None, 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(), enable_ssao: config.settings.modeling.enable_ssao.into(),
show_grid: config.settings.modeling.show_scale_grid, show_grid: config.settings.modeling.show_scale_grid,
replay: None, replay: None,
project_directory: None,
} }
} }
} }
@ -1544,6 +1558,7 @@ impl From<crate::settings::types::ModelingSettings> for ExecutorSettings {
enable_ssao: modeling.enable_ssao.into(), enable_ssao: modeling.enable_ssao.into(),
show_grid: modeling.show_scale_grid, show_grid: modeling.show_scale_grid,
replay: None, replay: None,
project_directory: None,
} }
} }
} }
@ -1774,6 +1789,7 @@ impl ExecutorContext {
enable_ssao: false, enable_ssao: false,
show_grid: false, show_grid: false,
replay: None, replay: None,
project_directory: None,
}, },
None, None,
engine_addr, engine_addr,
@ -1785,7 +1801,7 @@ impl ExecutorContext {
pub async fn reset_scene( pub async fn reset_scene(
&self, &self,
exec_state: &mut ExecState, exec_state: &mut ExecState,
source_range: crate::executor::SourceRange, source_range: crate::execution::SourceRange,
) -> Result<(), KclError> { ) -> Result<(), KclError> {
self.engine self.engine
.clear_scene(&mut exec_state.id_generator, source_range) .clear_scene(&mut exec_state.id_generator, source_range)
@ -1850,7 +1866,7 @@ impl ExecutorContext {
) )
.await?; .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?; .await?;
let session_data = self.engine.get_session_data(); let session_data = self.engine.get_session_data();
Ok(session_data) Ok(session_data)
@ -1870,91 +1886,66 @@ impl ExecutorContext {
match statement { match statement {
BodyItem::ImportStatement(import_stmt) => { BodyItem::ImportStatement(import_stmt) => {
let source_range = SourceRange::from(import_stmt); let source_range = SourceRange::from(import_stmt);
let path = import_stmt.path.clone(); let (module_memory, module_exports) =
// Empty path is used by the top-level module. self.open_module(&import_stmt.path, exec_state, source_range).await?;
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();
result.map_err(|err| { match &import_stmt.selector {
if let KclError::ImportCycle(_) = err { ImportSelector::List { items } => {
// It was an import cycle. Keep the original message. for import_item in items {
err.override_source_ranges(vec![source_range]) // Extract the item from the module.
} else { let item =
KclError::Semantic(KclErrorDetails { module_memory
message: format!( .get(&import_item.name.name, import_item.into())
"Error loading imported file. Open it to view more details. {path}: {}", .map_err(|_err| {
err.message() KclError::UndefinedValue(KclErrorDetails {
), message: format!("{} is not defined in module", import_item.name.name),
source_ranges: vec![source_range], 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) if let ItemVisibility::Export = import_stmt.visibility {
}; exec_state.module_exports.push(name.clone());
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()) ImportSelector::None(_) => {
.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 { return Err(KclError::Semantic(KclErrorDetails {
message: format!( message: "Importing whole module is not yet implemented, sorry.".to_owned(),
"Cannot import \"{}\" from module because it is not exported. Add \"export\" before the definition to export it.", source_ranges: vec![source_range],
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),
)?;
} }
last_expr = None; last_expr = None;
} }
@ -1971,34 +1962,23 @@ impl ExecutorContext {
); );
} }
BodyItem::VariableDeclaration(variable_declaration) => { BodyItem::VariableDeclaration(variable_declaration) => {
for declaration in &variable_declaration.declarations { let var_name = variable_declaration.declaration.id.name.to_string();
let var_name = declaration.id.name.to_string(); let source_range = SourceRange::from(&variable_declaration.declaration.init);
let source_range = SourceRange::from(&declaration.init); let metadata = Metadata { source_range };
let metadata = Metadata { source_range };
let memory_item = self let memory_item = self
.execute_expr( .execute_expr(
&declaration.init, &variable_declaration.declaration.init,
exec_state, exec_state,
&metadata, &metadata,
StatementKind::Declaration { name: &var_name }, StatementKind::Declaration { name: &var_name },
) )
.await?; .await?;
let is_function = memory_item.is_function(); exec_state.memory.add(&var_name, memory_item, source_range)?;
exec_state.memory.add(&var_name, memory_item, source_range)?;
// Track exports. // Track exports.
match variable_declaration.visibility { if let ItemVisibility::Export = variable_declaration.visibility {
ItemVisibility::Export => { exec_state.module_exports.push(var_name);
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 => {}
}
} }
last_expr = None; last_expr = None;
} }
@ -2033,6 +2013,68 @@ impl ExecutorContext {
Ok(last_expr) 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>( pub async fn execute_expr<'a>(
&self, &self,
init: &Expr, init: &Expr,
@ -2120,7 +2162,7 @@ impl ExecutorContext {
self.engine self.engine
.send_modeling_cmd( .send_modeling_cmd(
uuid::Uuid::new_v4(), uuid::Uuid::new_v4(),
crate::executor::SourceRange::default(), crate::execution::SourceRange::default(),
ModelingCmd::from(mcmd::ZoomToFit { ModelingCmd::from(mcmd::ZoomToFit {
object_ids: Default::default(), object_ids: Default::default(),
animated: false, animated: false,
@ -2134,7 +2176,7 @@ impl ExecutorContext {
.engine .engine
.send_modeling_cmd( .send_modeling_cmd(
uuid::Uuid::new_v4(), uuid::Uuid::new_v4(),
crate::executor::SourceRange::default(), crate::execution::SourceRange::default(),
ModelingCmd::from(mcmd::TakeSnapshot { ModelingCmd::from(mcmd::TakeSnapshot {
format: ImageFormat::Png, format: ImageFormat::Png,
}), }),

View File

@ -60,10 +60,8 @@ mod coredump;
mod docs; mod docs;
mod engine; mod engine;
mod errors; mod errors;
mod executor; mod execution;
mod fs; mod fs;
mod function_param;
mod kcl_value;
pub mod lint; pub mod lint;
mod log; mod log;
mod lsp; mod lsp;
@ -84,7 +82,7 @@ mod wasm;
pub use coredump::CoreDump; pub use coredump::CoreDump;
pub use engine::{EngineManager, ExecutionKind}; pub use engine::{EngineManager, ExecutionKind};
pub use errors::{CompilationError, ConnectionError, ExecError, KclError}; pub use errors::{CompilationError, ConnectionError, ExecError, KclError};
pub use executor::{ExecState, ExecutorContext, ExecutorSettings}; pub use execution::{ExecState, ExecutorContext, ExecutorSettings};
pub use lsp::{ pub use lsp::{
copilot::Backend as CopilotLspBackend, copilot::Backend as CopilotLspBackend,
kcl::{Backend as KclLspBackend, Server as KclLspServerSubCommand}, 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. // 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. // Ideally we wouldn't export these things at all, they should only be used for testing.
pub mod exec { 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")] #[cfg(target_arch = "wasm32")]

View File

@ -60,11 +60,7 @@ pub fn lint_variables(decl: Node) -> Result<Vec<Discovered>> {
return Ok(vec![]); return Ok(vec![]);
}; };
Ok(decl lint_lower_camel_case_var(&decl.declaration)
.declarations
.iter()
.flat_map(|v| lint_lower_camel_case_var(v).unwrap_or_default())
.collect())
} }
pub fn lint_object_properties(decl: Node) -> Result<Vec<Discovered>> { pub fn lint_object_properties(decl: Node) -> Result<Vec<Discovered>> {

View File

@ -19,7 +19,7 @@ impl Notification for AstUpdated {
pub enum MemoryUpdated {} pub enum MemoryUpdated {}
impl Notification for MemoryUpdated { impl Notification for MemoryUpdated {
type Params = crate::executor::ProgramMemory; type Params = crate::execution::ProgramMemory;
const METHOD: &'static str = "kcl/memoryUpdated"; const METHOD: &'static str = "kcl/memoryUpdated";
} }

View File

@ -115,7 +115,7 @@ pub struct Backend {
/// information. /// information.
pub last_successful_ast_state: Arc<RwLock<Option<OldAstState>>>, pub last_successful_ast_state: Arc<RwLock<Option<OldAstState>>>,
/// Memory maps. /// Memory maps.
pub memory_map: DashMap<String, crate::executor::ProgramMemory>, pub memory_map: DashMap<String, crate::execution::ProgramMemory>,
/// Current code. /// Current code.
pub code_map: DashMap<String, Vec<u8>>, pub code_map: DashMap<String, Vec<u8>>,
/// Diagnostics. /// Diagnostics.
@ -129,7 +129,7 @@ pub struct Backend {
/// If we can send telemetry for this user. /// If we can send telemetry for this user.
pub can_send_telemetry: bool, pub can_send_telemetry: bool,
/// Optional executor context to use if we want to execute the code. /// 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. /// If we are currently allowed to execute the ast.
pub can_execute: Arc<RwLock<bool>>, pub can_execute: Arc<RwLock<bool>>,
@ -140,7 +140,7 @@ impl Backend {
#[cfg(target_arch = "wasm32")] #[cfg(target_arch = "wasm32")]
pub fn new_wasm( pub fn new_wasm(
client: Client, client: Client,
executor_ctx: Option<crate::executor::ExecutorContext>, executor_ctx: Option<crate::execution::ExecutorContext>,
fs: crate::fs::wasm::FileSystemManager, fs: crate::fs::wasm::FileSystemManager,
zoo_client: kittycad::Client, zoo_client: kittycad::Client,
can_send_telemetry: bool, can_send_telemetry: bool,
@ -157,7 +157,7 @@ impl Backend {
#[cfg(not(target_arch = "wasm32"))] #[cfg(not(target_arch = "wasm32"))]
pub fn new( pub fn new(
client: Client, client: Client,
executor_ctx: Option<crate::executor::ExecutorContext>, executor_ctx: Option<crate::execution::ExecutorContext>,
zoo_client: kittycad::Client, zoo_client: kittycad::Client,
can_send_telemetry: bool, can_send_telemetry: bool,
) -> Result<Self, String> { ) -> Result<Self, String> {
@ -172,7 +172,7 @@ impl Backend {
fn with_file_manager( fn with_file_manager(
client: Client, client: Client,
executor_ctx: Option<crate::executor::ExecutorContext>, executor_ctx: Option<crate::execution::ExecutorContext>,
fs: crate::fs::FileManager, fs: crate::fs::FileManager,
zoo_client: kittycad::Client, zoo_client: kittycad::Client,
can_send_telemetry: bool, can_send_telemetry: bool,
@ -297,7 +297,7 @@ impl crate::lsp::backend::Backend for Backend {
// Try to get the memory for the current code. // Try to get the memory for the current code.
let has_memory = if let Some(memory) = self.memory_map.get(&filename) { let has_memory = if let Some(memory) = self.memory_map.get(&filename) {
*memory != crate::executor::ProgramMemory::default() *memory != crate::execution::ProgramMemory::default()
} else { } else {
false false
}; };
@ -406,7 +406,7 @@ impl Backend {
*self.can_execute.read().await *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 self.executor_ctx.read().await
} }
@ -871,7 +871,7 @@ impl Backend {
// Try to get the memory for the current code. // Try to get the memory for the current code.
let has_memory = if let Some(memory) = self.memory_map.get(&filename) { let has_memory = if let Some(memory) = self.memory_map.get(&filename) {
*memory != crate::executor::ProgramMemory::default() *memory != crate::execution::ProgramMemory::default()
} else { } else {
false false
}; };

View File

@ -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_completions = crate::lsp::kcl::get_completions_from_stdlib(&stdlib)?;
let stdlib_signatures = crate::lsp::kcl::get_signatures_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 { 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 { } else {
None None
}; };

View File

@ -7,7 +7,7 @@ use tower_lsp::{
}; };
use crate::{ use crate::{
executor::ProgramMemory, execution::ProgramMemory,
lsp::test_util::{copilot_lsp_server, kcl_lsp_server}, lsp::test_util::{copilot_lsp_server, kcl_lsp_server},
parsing::ast::types::{Node, Program}, parsing::ast::types::{Node, Program},
}; };

View File

@ -4,7 +4,7 @@ use schemars::JsonSchema;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::{ use crate::{
executor::ExecState, execution::ExecState,
parsing::ast::types::{Node, Program}, parsing::ast::types::{Node, Program},
}; };
@ -27,7 +27,7 @@ pub struct OldAstState {
/// The exec state. /// The exec state.
pub exec_state: ExecState, pub exec_state: ExecState,
/// The last settings used for execution. /// The last settings used for execution.
pub settings: crate::executor::ExecutorSettings, pub settings: crate::execution::ExecutorSettings,
} }
impl From<crate::Program> for CacheInformation { impl From<crate::Program> for CacheInformation {
@ -55,7 +55,7 @@ pub struct CacheResult {
// the cache. // the cache.
pub fn get_changed_program( pub fn get_changed_program(
info: CacheInformation, info: CacheInformation,
new_settings: &crate::executor::ExecutorSettings, new_settings: &crate::execution::ExecutorSettings,
) -> Option<CacheResult> { ) -> Option<CacheResult> {
let Some(old) = info.old else { let Some(old) = info.old else {
// We have no old info, we need to re-execute the whole thing. // We have no old info, we need to re-execute the whole thing.
@ -109,14 +109,14 @@ mod tests {
use super::*; use super::*;
async fn execute(program: &crate::Program) -> Result<ExecState> { 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?)), engine: Arc::new(Box::new(crate::engine::conn_mock::EngineConnection::new().await?)),
fs: Arc::new(crate::fs::FileManager::new()), fs: Arc::new(crate::fs::FileManager::new()),
stdlib: Arc::new(crate::std::StdLib::new()), stdlib: Arc::new(crate::std::StdLib::new()),
settings: Default::default(), 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?; ctx.run(program.clone().into(), &mut exec_state).await?;
Ok(exec_state) Ok(exec_state)

View File

@ -4,9 +4,10 @@ use super::types::{DefaultParamVal, ItemVisibility, VariableKind};
use crate::parsing::ast::types::{ use crate::parsing::ast::types::{
ArrayExpression, ArrayRangeExpression, BinaryExpression, BinaryPart, BodyItem, CallExpression, CallExpressionKw, ArrayExpression, ArrayRangeExpression, BinaryExpression, BinaryPart, BodyItem, CallExpression, CallExpressionKw,
CommentStyle, ElseIf, Expr, ExpressionStatement, FnArgType, FunctionExpression, Identifier, IfExpression, CommentStyle, ElseIf, Expr, ExpressionStatement, FnArgType, FunctionExpression, Identifier, IfExpression,
ImportItem, ImportStatement, Literal, LiteralIdentifier, MemberExpression, MemberObject, NonCodeMeta, NonCodeNode, ImportItem, ImportSelector, ImportStatement, Literal, LiteralIdentifier, MemberExpression, MemberObject,
NonCodeValue, ObjectExpression, ObjectProperty, Parameter, PipeExpression, PipeSubstitution, Program, NonCodeMeta, NonCodeNode, NonCodeValue, ObjectExpression, ObjectProperty, Parameter, PipeExpression,
ReturnStatement, TagDeclarator, UnaryExpression, VariableDeclaration, VariableDeclarator, PipeSubstitution, Program, ReturnStatement, TagDeclarator, UnaryExpression, VariableDeclaration,
VariableDeclarator,
}; };
/// Position-independent digest of the AST node. /// Position-independent digest of the AST node.
@ -52,9 +53,20 @@ impl ImportItem {
impl ImportStatement { impl ImportStatement {
compute_digest!(|slf, hasher| { compute_digest!(|slf, hasher| {
for item in &mut slf.items { match &mut slf.selector {
hasher.update(item.compute_digest()); 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(); let path = slf.path.as_bytes();
hasher.update(path.len().to_ne_bytes()); hasher.update(path.len().to_ne_bytes());
hasher.update(path); hasher.update(path);
@ -270,10 +282,7 @@ impl ExpressionStatement {
impl VariableDeclaration { impl VariableDeclaration {
compute_digest!(|slf, hasher| { compute_digest!(|slf, hasher| {
hasher.update(slf.declarations.len().to_ne_bytes()); hasher.update(slf.declaration.compute_digest());
for declarator in &mut slf.declarations {
hasher.update(declarator.compute_digest());
}
hasher.update(slf.visibility.digestable_id()); hasher.update(slf.visibility.digestable_id());
hasher.update(slf.kind.digestable_id()); hasher.update(slf.kind.digestable_id());
}); });

View File

@ -1,6 +1,74 @@
pub(crate) mod cache; pub(crate) mod cache;
pub(crate) mod digest; pub(crate) mod digest;
pub(crate) mod execute;
pub mod modify; pub mod modify;
pub(crate) mod source_range;
pub mod types; pub mod types;
use crate::parsing::ast::types::{BinaryPart, BodyItem, Expr, LiteralIdentifier, MemberObject};
use crate::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,
}
}
}

View File

@ -9,7 +9,7 @@ use kittycad_modeling_cmds as kcmc;
use crate::{ use crate::{
engine::EngineManager, engine::EngineManager,
errors::{KclError, KclErrorDetails}, errors::{KclError, KclErrorDetails},
executor::Point2d, execution::Point2d,
parsing::ast::types::{ parsing::ast::types::{
ArrayExpression, CallExpression, ConstraintLevel, FormatOptions, Literal, Node, PipeExpression, ArrayExpression, CallExpression, ConstraintLevel, FormatOptions, Literal, Node, PipeExpression,
PipeSubstitution, VariableDeclarator, PipeSubstitution, VariableDeclarator,
@ -42,7 +42,7 @@ pub async fn modify_ast_for_sketch(
// The name of the sketch. // The name of the sketch.
sketch_name: &str, sketch_name: &str,
// The type of plane the sketch is on. `XY` or `XZ`, etc // 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. // The ID of the parent sketch.
sketch_id: uuid::Uuid, sketch_id: uuid::Uuid,
) -> Result<String, KclError> { ) -> Result<String, KclError> {
@ -196,7 +196,7 @@ fn create_start_sketch_on(
name: &str, name: &str,
start: [f64; 2], start: [f64; 2],
end: [f64; 2], end: [f64; 2],
plane: crate::executor::PlaneType, plane: crate::execution::PlaneType,
additional_lines: Vec<[f64; 2]>, additional_lines: Vec<[f64; 2]>,
) -> Result<Node<VariableDeclarator>, KclError> { ) -> Result<Node<VariableDeclarator>, KclError> {
let start_sketch_on = CallExpression::new("startSketchOn", vec![Literal::new(plane.to_string().into()).into()])?; let start_sketch_on = CallExpression::new("startSketchOn", vec![Literal::new(plane.to_string().into()).into()])?;

View File

@ -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,
}
}
}

View File

@ -8,7 +8,7 @@ use std::{
}; };
use anyhow::Result; use anyhow::Result;
use async_recursion::async_recursion;
use parse_display::{Display, FromStr}; use parse_display::{Display, FromStr};
use schemars::JsonSchema; use schemars::JsonSchema;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -17,7 +17,7 @@ use tower_lsp::lsp_types::{
CompletionItem, CompletionItemKind, DocumentSymbol, FoldingRange, FoldingRangeKind, Range as LspRange, SymbolKind, 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::{ pub use crate::parsing::ast::types::{
condition::{ElseIf, IfExpression}, condition::{ElseIf, IfExpression},
literal_value::LiteralValue, literal_value::LiteralValue,
@ -26,7 +26,7 @@ pub use crate::parsing::ast::types::{
use crate::{ use crate::{
docs::StdLibFn, docs::StdLibFn,
errors::KclError, errors::KclError,
executor::{ExecState, ExecutorContext, KclValue, Metadata, TagIdentifier}, execution::{KclValue, Metadata, TagIdentifier},
parsing::PIPE_OPERATOR, parsing::PIPE_OPERATOR,
source_range::{ModuleId, SourceRange}, source_range::{ModuleId, SourceRange},
}; };
@ -466,11 +466,9 @@ impl Program {
continue; continue;
} }
BodyItem::VariableDeclaration(ref mut variable_declaration) => { BodyItem::VariableDeclaration(ref mut variable_declaration) => {
for declaration in &mut variable_declaration.declarations { if variable_declaration.declaration.id.name == name {
if declaration.id.name == name { variable_declaration.declaration = declarator;
*declaration = declarator; return;
return;
}
} }
} }
BodyItem::ReturnStatement(_return_statement) => continue, BodyItem::ReturnStatement(_return_statement) => continue,
@ -501,20 +499,16 @@ impl Program {
for item in &self.body { for item in &self.body {
match item { match item {
BodyItem::ImportStatement(stmt) => { BodyItem::ImportStatement(stmt) => {
for import_item in &stmt.items { if stmt.get_variable(name) {
if import_item.identifier() == name { return Some(Definition::Import(stmt));
return Some(Definition::Import(stmt.as_ref()));
}
} }
} }
BodyItem::ExpressionStatement(_expression_statement) => { BodyItem::ExpressionStatement(_expression_statement) => {
continue; continue;
} }
BodyItem::VariableDeclaration(variable_declaration) => { BodyItem::VariableDeclaration(variable_declaration) => {
for declaration in &variable_declaration.declarations { if variable_declaration.declaration.id.name == name {
if declaration.id.name == name { return Some(Definition::Variable(&variable_declaration.declaration));
return Some(Definition::Variable(declaration));
}
} }
} }
BodyItem::ReturnStatement(_return_statement) => continue, BodyItem::ReturnStatement(_return_statement) => continue,
@ -1125,7 +1119,7 @@ impl NonCodeMeta {
pub struct ImportItem { pub struct ImportItem {
/// Name of the item to import. /// Name of the item to import.
pub name: Node<Identifier>, 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>>, pub alias: Option<Node<Identifier>>,
#[serde(default, skip_serializing_if = "Option::is_none")] #[serde(default, skip_serializing_if = "Option::is_none")]
@ -1171,13 +1165,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)] #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)]
#[ts(export)] #[ts(export)]
#[serde(tag = "type")] #[serde(tag = "type")]
pub struct ImportStatement { pub struct ImportStatement {
pub items: NodeList<ImportItem>, pub selector: ImportSelector,
pub path: String, pub path: String,
pub raw_path: String, pub visibility: ItemVisibility,
#[serde(default, skip_serializing_if = "Option::is_none")] #[serde(default, skip_serializing_if = "Option::is_none")]
#[ts(optional)] #[ts(optional)]
@ -1185,6 +1237,41 @@ pub struct ImportStatement {
} }
impl Node<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 { pub fn get_constraint_level(&self) -> ConstraintLevel {
ConstraintLevel::Full { ConstraintLevel::Full {
source_ranges: vec![self.into()], source_ranges: vec![self.into()],
@ -1192,24 +1279,13 @@ impl Node<ImportStatement> {
} }
pub fn rename_symbol(&mut self, new_name: &str, pos: usize) -> Option<String> { pub fn rename_symbol(&mut self, new_name: &str, pos: usize) -> Option<String> {
for item in &mut self.items { self.selector.rename_symbol(new_name, pos)
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
} }
} }
impl ImportStatement { impl ImportStatement {
pub fn rename_identifiers(&mut self, old_name: &str, new_name: &str) { pub fn rename_identifiers(&mut self, old_name: &str, new_name: &str) {
for item in &mut self.items { self.selector.rename_identifiers(old_name, new_name);
item.rename_identifiers(old_name, new_name);
}
} }
} }
@ -1471,7 +1547,7 @@ impl ItemVisibility {
#[ts(export)] #[ts(export)]
#[serde(tag = "type")] #[serde(tag = "type")]
pub struct VariableDeclaration { pub struct VariableDeclaration {
pub declarations: NodeList<VariableDeclarator>, pub declaration: Node<VariableDeclarator>,
#[serde(default, skip_serializing_if = "ItemVisibility::is_default")] #[serde(default, skip_serializing_if = "ItemVisibility::is_default")]
pub visibility: ItemVisibility, pub visibility: ItemVisibility,
pub kind: VariableKind, // Change to enum if there are specific values pub kind: VariableKind, // Change to enum if there are specific values
@ -1483,33 +1559,29 @@ pub struct VariableDeclaration {
impl From<&Node<VariableDeclaration>> for Vec<CompletionItem> { impl From<&Node<VariableDeclaration>> for Vec<CompletionItem> {
fn from(declaration: &Node<VariableDeclaration>) -> Self { fn from(declaration: &Node<VariableDeclaration>) -> Self {
let mut completions = vec![]; vec![CompletionItem {
for variable in &declaration.declarations { label: declaration.declaration.id.name.to_string(),
completions.push(CompletionItem { label_details: None,
label: variable.id.name.to_string(), kind: Some(match declaration.inner.kind {
label_details: None, VariableKind::Const => CompletionItemKind::CONSTANT,
kind: Some(match declaration.inner.kind { VariableKind::Fn => CompletionItemKind::FUNCTION,
VariableKind::Const => CompletionItemKind::CONSTANT, }),
VariableKind::Fn => CompletionItemKind::FUNCTION, detail: Some(declaration.inner.kind.to_string()),
}), documentation: None,
detail: Some(declaration.inner.kind.to_string()), deprecated: None,
documentation: None, preselect: None,
deprecated: None, sort_text: None,
preselect: None, filter_text: None,
sort_text: None, insert_text: None,
filter_text: None, insert_text_format: None,
insert_text: None, insert_text_mode: None,
insert_text_format: None, text_edit: None,
insert_text_mode: None, additional_text_edits: None,
text_edit: None, command: None,
additional_text_edits: None, commit_characters: None,
command: None, data: None,
commit_characters: None, tags: None,
data: None, }]
tags: None,
})
}
completions
} }
} }
@ -1543,13 +1615,11 @@ impl Node<VariableDeclaration> {
return None; return None;
} }
for declaration in &mut self.declarations { let declaration_source_range: SourceRange = self.declaration.id.clone().into();
let declaration_source_range: SourceRange = declaration.id.clone().into(); if declaration_source_range.contains(pos) {
if declaration_source_range.contains(pos) { let old_name = self.declaration.id.name.clone();
let old_name = declaration.id.name.clone(); self.declaration.id.name = new_name.to_string();
declaration.id.name = new_name.to_string(); return Some(old_name);
return Some(old_name);
}
} }
None None
@ -1557,9 +1627,9 @@ impl Node<VariableDeclaration> {
} }
impl 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 { Self {
declarations, declaration,
visibility, visibility,
kind, kind,
digest: None, digest: None,
@ -1567,18 +1637,14 @@ impl VariableDeclaration {
} }
pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) {
for declaration in &mut self.declarations { self.declaration.init.replace_value(source_range, new_value.clone());
declaration.init.replace_value(source_range, new_value.clone());
}
} }
/// Returns an Expr that includes the given character position. /// Returns an Expr that includes the given character position.
pub fn get_expr_for_position(&self, pos: usize) -> Option<&Expr> { pub fn get_expr_for_position(&self, pos: usize) -> Option<&Expr> {
for declaration in &self.declarations { let source_range: SourceRange = self.declaration.clone().into();
let source_range: SourceRange = declaration.into(); if source_range.contains(pos) {
if source_range.contains(pos) { return Some(&self.declaration.init);
return Some(&declaration.init);
}
} }
None None
@ -1586,77 +1652,69 @@ impl VariableDeclaration {
/// Returns an Expr that includes the given character position. /// Returns an Expr that includes the given character position.
pub fn get_mut_expr_for_position(&mut self, pos: usize) -> Option<&mut Expr> { pub fn get_mut_expr_for_position(&mut self, pos: usize) -> Option<&mut Expr> {
for declaration in &mut self.declarations { let source_range: SourceRange = self.declaration.clone().into();
let source_range: SourceRange = declaration.clone().into(); if source_range.contains(pos) {
if source_range.contains(pos) { return Some(&mut self.declaration.init);
return Some(&mut declaration.init);
}
} }
None None
} }
pub fn rename_identifiers(&mut self, old_name: &str, new_name: &str) { 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.
// 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 {
if declaration.id.name == new_name { self.declaration.init.rename_identifiers(old_name, new_name);
continue;
}
declaration.init.rename_identifiers(old_name, new_name);
} }
} }
pub fn get_lsp_symbols(&self, code: &str) -> Vec<DocumentSymbol> { 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 mut symbol_kind = match self.kind {
let source_range: SourceRange = declaration.into(); VariableKind::Fn => SymbolKind::FUNCTION,
let inner_source_range: SourceRange = declaration.id.clone().into(); VariableKind::Const => SymbolKind::CONSTANT,
};
let mut symbol_kind = match self.kind { let children = match &self.declaration.init {
VariableKind::Fn => SymbolKind::FUNCTION, Expr::FunctionExpression(function_expression) => {
VariableKind::Const => SymbolKind::CONSTANT, symbol_kind = SymbolKind::FUNCTION;
}; let mut children = vec![];
for param in &function_expression.params {
let children = match &declaration.init { let param_source_range: SourceRange = (&param.identifier).into();
Expr::FunctionExpression(function_expression) => { #[allow(deprecated)]
symbol_kind = SymbolKind::FUNCTION; children.push(DocumentSymbol {
let mut children = vec![]; name: param.identifier.name.clone(),
for param in &function_expression.params { detail: None,
let param_source_range: SourceRange = (&param.identifier).into(); kind: SymbolKind::CONSTANT,
#[allow(deprecated)] range: param_source_range.to_lsp_range(code),
children.push(DocumentSymbol { selection_range: param_source_range.to_lsp_range(code),
name: param.identifier.name.clone(), children: None,
detail: None, tags: None,
kind: SymbolKind::CONSTANT, deprecated: None,
range: param_source_range.to_lsp_range(code), });
selection_range: param_source_range.to_lsp_range(code),
children: None,
tags: None,
deprecated: None,
});
}
children
} }
Expr::ObjectExpression(object_expression) => { children
symbol_kind = SymbolKind::OBJECT; }
let mut children = vec![]; Expr::ObjectExpression(object_expression) => {
for property in &object_expression.properties { symbol_kind = SymbolKind::OBJECT;
children.extend(property.get_lsp_symbols(code)); let mut children = vec![];
} for property in &object_expression.properties {
children children.extend(property.get_lsp_symbols(code));
} }
Expr::ArrayExpression(_) => { children
symbol_kind = SymbolKind::ARRAY; }
vec![] Expr::ArrayExpression(_) => {
} symbol_kind = SymbolKind::ARRAY;
_ => vec![], vec![]
}; }
_ => vec![],
};
vec![
#[allow(deprecated)] #[allow(deprecated)]
symbols.push(DocumentSymbol { DocumentSymbol {
name: declaration.id.name.clone(), name: self.declaration.id.name.clone(),
detail: Some(self.kind.to_string()), detail: Some(self.kind.to_string()),
kind: symbol_kind, kind: symbol_kind,
range: source_range.to_lsp_range(code), range: source_range.to_lsp_range(code),
@ -1664,10 +1722,8 @@ impl VariableDeclaration {
children: Some(children), children: Some(children),
tags: None, tags: None,
deprecated: None, deprecated: None,
}); },
} ]
symbols
} }
} }
@ -2629,11 +2685,6 @@ impl Node<PipeExpression> {
constraint_levels.get_constraint_level(self.into()) 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 { impl PipeExpression {
@ -3243,7 +3294,7 @@ const cylinder = startSketchOn('-XZ')
let BodyItem::VariableDeclaration(var_decl) = function else { let BodyItem::VariableDeclaration(var_decl) = function else {
panic!("expected a variable declaration") 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") panic!("expected a function expression")
}; };
let params = &func_expr.params; let params = &func_expr.params;
@ -3265,7 +3316,7 @@ const cylinder = startSketchOn('-XZ')
let BodyItem::VariableDeclaration(var_decl) = function else { let BodyItem::VariableDeclaration(var_decl) = function else {
panic!("expected a variable declaration") 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") panic!("expected a function expression")
}; };
let params = &func_expr.params; let params = &func_expr.params;
@ -3288,7 +3339,7 @@ const cylinder = startSketchOn('-XZ')
let BodyItem::VariableDeclaration(var_decl) = function else { let BodyItem::VariableDeclaration(var_decl) = function else {
panic!("expected a variable declaration") 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") panic!("expected a function expression")
}; };
let params = &func_expr.params; let params = &func_expr.params;
@ -3362,7 +3413,7 @@ const cylinder = startSketchOn('-XZ')
let BodyItem::VariableDeclaration(var_decl) = function else { let BodyItem::VariableDeclaration(var_decl) = function else {
panic!("expected a variable declaration") 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") panic!("expected a function expression")
}; };
let params = &func_expr.params; let params = &func_expr.params;

View File

@ -4,7 +4,7 @@ use schemars::JsonSchema;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use super::Node; 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"; const KCL_NONE_ID: &str = "KCL_NONE_ID";

View File

@ -19,11 +19,11 @@ use crate::{
ast::types::{ ast::types::{
ArrayExpression, ArrayRangeExpression, BinaryExpression, BinaryOperator, BinaryPart, BodyItem, BoxNode, ArrayExpression, ArrayRangeExpression, BinaryExpression, BinaryOperator, BinaryPart, BodyItem, BoxNode,
CallExpression, CallExpressionKw, CommentStyle, DefaultParamVal, ElseIf, Expr, ExpressionStatement, CallExpression, CallExpressionKw, CommentStyle, DefaultParamVal, ElseIf, Expr, ExpressionStatement,
FnArgPrimitive, FnArgType, FunctionExpression, Identifier, IfExpression, ImportItem, ImportStatement, FnArgPrimitive, FnArgType, FunctionExpression, Identifier, IfExpression, ImportItem, ImportSelector,
ItemVisibility, LabeledArg, Literal, LiteralIdentifier, LiteralValue, MemberExpression, MemberObject, Node, ImportStatement, ItemVisibility, LabeledArg, Literal, LiteralIdentifier, LiteralValue, MemberExpression,
NonCodeMeta, NonCodeNode, NonCodeValue, ObjectExpression, ObjectProperty, Parameter, PipeExpression, MemberObject, Node, NodeList, NonCodeMeta, NonCodeNode, NonCodeValue, ObjectExpression, ObjectProperty,
PipeSubstitution, Program, ReturnStatement, Shebang, TagDeclarator, UnaryExpression, UnaryOperator, Parameter, PipeExpression, PipeSubstitution, Program, ReturnStatement, Shebang, TagDeclarator,
VariableDeclaration, VariableDeclarator, VariableKind, UnaryExpression, UnaryOperator, VariableDeclaration, VariableDeclarator, VariableKind,
}, },
math::BinaryExpressionToken, math::BinaryExpressionToken,
token::{Token, TokenType}, 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 // 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 // match!() that's super clean that isn't worth it for the marginal space
// savings. revisit if that's a lie. // savings. revisit if that's a lie.
#[derive(Debug)] #[derive(Debug)]
#[allow(clippy::large_enum_variant)] #[allow(clippy::large_enum_variant)]
enum WithinFunction { 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. // 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. // If there is a comment, it may be preceded by whitespace.
let item = dispatch! {peek(any); 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), (declaration.map(BodyItem::VariableDeclaration), opt(noncode_just_after_code)).map(WithinFunction::BodyItem),
token if token.value == "import" && matches!(token.token_type, TokenType::Keyword) => token if token.value == "import" && matches!(token.token_type, TokenType::Keyword) =>
(import_stmt.map(BodyItem::ImportStatement), opt(noncode_just_after_code)).map(WithinFunction::BodyItem), (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>> { 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 let import_token = any
.try_map(|token: Token| { .try_map(|token: Token| {
if matches!(token.token_type, TokenType::Keyword) && token.value == "import" { 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")) .context(expected("the 'import' keyword"))
.parse_next(i)?; .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)?; require_whitespace(i)?;
let items = separated(1.., import_item, comma_sep) let (mut selector, path) = alt((
.parse_next(i) string_literal.map(|s| (ImportSelector::None(None), Some(s))),
.map_err(|e| e.cut())?; 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| { require_whitespace(i)?;
if matches!(token.token_type, TokenType::Keyword | TokenType::Word) && token.value == "from" {
Ok(()) string_literal(i)?
} 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())?;
require_whitespace(i)?; let mut end: usize = path.end;
let path = string_literal(i)?;
let end = path.end;
let path_string = match path.inner.value { let path_string = match path.inner.value {
LiteralValue::String(s) => s, LiteralValue::String(s) => s,
_ => unreachable!(), _ => 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 if path_string
.chars() .chars()
.any(|c| !c.is_ascii_alphanumeric() && c != '_' && c != '-' && c != '.') .any(|c| !c.is_ascii_alphanumeric() && c != '_' && c != '-' && c != '.')
@ -1465,16 +1505,44 @@ fn import_stmt(i: TokenSlice) -> PResult<BoxNode<ImportStatement>> {
.into(), .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( Ok(Node::boxed(
ImportStatement { ImportStatement {
items, selector,
visibility,
path: path_string, path: path_string,
raw_path: path.inner.raw,
digest: None, digest: None,
}, },
start, start,
end, end,
import_token.module_id, module_id,
)) ))
} }
@ -1707,7 +1775,7 @@ fn declaration(i: TokenSlice) -> PResult<BoxNode<VariableDeclaration>> {
let end = val.end(); let end = val.end();
Ok(Box::new(Node { Ok(Box::new(Node {
inner: VariableDeclaration { inner: VariableDeclaration {
declarations: vec![Node { declaration: Node {
start: id.start, start: id.start,
end, end,
module_id, module_id,
@ -1716,7 +1784,7 @@ fn declaration(i: TokenSlice) -> PResult<BoxNode<VariableDeclaration>> {
init: val, init: val,
digest: None, digest: None,
}, },
}], },
visibility, visibility,
kind, kind,
digest: None, digest: None,
@ -2383,10 +2451,11 @@ mod tests {
// example, "return" is the problem. // example, "return" is the problem.
assert!( assert!(
err.message.starts_with("Unexpected token: ") err.message.starts_with("Unexpected token: ")
|| err.message.starts_with("= is not")
|| err || err
.message .message
.starts_with("Cannot assign a variable to a reserved keyword: "), .starts_with("Cannot assign a variable to a reserved keyword: "),
"Error message is: {}", "Error message is: `{}`",
err.message, err.message,
); );
} }
@ -2449,7 +2518,7 @@ mod tests {
let tokens = crate::parsing::token::lexer("x = 4", ModuleId::default()).unwrap(); let tokens = crate::parsing::token::lexer("x = 4", ModuleId::default()).unwrap();
let vardec = declaration(&mut tokens.as_slice()).unwrap(); let vardec = declaration(&mut tokens.as_slice()).unwrap();
assert_eq!(vardec.inner.kind, VariableKind::Const); assert_eq!(vardec.inner.kind, VariableKind::Const);
let vardec = vardec.declarations.first().unwrap(); let vardec = &vardec.declaration;
assert_eq!(vardec.id.name, "x"); assert_eq!(vardec.id.name, "x");
let Expr::Literal(init_val) = &vardec.init else { let Expr::Literal(init_val) = &vardec.init else {
panic!("weird init value") panic!("weird init value")
@ -2524,10 +2593,10 @@ const mySk1 = startSketchAt([0, 0])"#;
fn test_comment_in_pipe() { fn test_comment_in_pipe() {
let tokens = crate::parsing::token::lexer(r#"const x = y() |> /*hi*/ z(%)"#, ModuleId::default()).unwrap(); 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 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"); panic!("expected vardec");
}; };
let val = item.declarations.remove(0).inner.init; let val = item.inner.declaration.inner.init;
let Expr::PipeExpression(pipe) = val else { let Expr::PipeExpression(pipe) = val else {
panic!("expected pipe"); panic!("expected pipe");
}; };
@ -2795,14 +2864,14 @@ const mySk1 = startSketchAt([0, 0])"#;
.enumerate() .enumerate()
{ {
let tokens = crate::parsing::token::lexer(test_input, ModuleId::default()).unwrap(); 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:#?}"), Err(e) => panic!("Could not parse test {i}: {e:#?}"),
Ok(a) => a, Ok(a) => a,
}; };
let Expr::BinaryExpression(_expr) = actual.declarations.remove(0).inner.init else { let Expr::BinaryExpression(_expr) = &actual.declaration.inner.init else {
panic!( panic!(
"Expected test {i} to be a binary expression but it wasn't, it was {:?}", "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. // TODO: check both sides are 1... probably not necessary but should do.
@ -3144,16 +3213,15 @@ const mySk1 = startSketchAt([0, 0])"#;
}; };
// Run the second parser, check it matches the first parser. // 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); assert_eq!(expected, actual);
// Inspect its output in more detail. // Inspect its output in more detail.
assert_eq!(actual.inner.kind, VariableKind::Const); assert_eq!(actual.inner.kind, VariableKind::Const);
assert_eq!(actual.start, 0); assert_eq!(actual.start, 0);
assert_eq!(actual.declarations.len(), 1); let decl = &actual.declaration;
let decl = actual.declarations.pop().unwrap();
assert_eq!(decl.id.name, "myVar"); 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") panic!("value should be a literal")
}; };
assert_eq!(value.end, test.len()); assert_eq!(value.end, test.len());
@ -3697,6 +3765,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] #[test]
fn zero_param_function() { fn zero_param_function() {
let code = r#" let code = r#"

View File

@ -1,245 +1,241 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 3893
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 143,
"end": 143, "id": {
"id": { "end": 15,
"end": 15, "name": "boxSketch",
"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"
},
"start": 6, "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, "end": 143,
"kind": "const", "kind": "const",
"start": 0, "start": 0,

View File

@ -1,39 +1,35 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 3963
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 17,
"end": 17, "id": {
"id": { "end": 8,
"end": 8, "name": "sg",
"name": "sg", "start": 6,
"start": 6, "type": "Identifier"
},
"init": {
"argument": {
"end": 17,
"name": "scale",
"start": 12,
"type": "Identifier",
"type": "Identifier" "type": "Identifier"
}, },
"init": { "end": 17,
"argument": { "operator": "-",
"end": 17, "start": 11,
"name": "scale", "type": "UnaryExpression",
"start": 12, "type": "UnaryExpression"
"type": "Identifier", },
"type": "Identifier" "start": 6,
}, "type": "VariableDeclarator"
"end": 17, },
"operator": "-",
"start": 11,
"type": "UnaryExpression",
"type": "UnaryExpression"
},
"start": 6,
"type": "VariableDeclarator"
}
],
"end": 17, "end": 17,
"kind": "const", "kind": "const",
"start": 0, "start": 0,

View File

@ -1,48 +1,44 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 3965
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 23,
"end": 23, "id": {
"id": { "end": 13,
"end": 13, "name": "myArray",
"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"
},
"start": 6, "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, "end": 23,
"kind": "const", "kind": "const",
"start": 0, "start": 0,

View File

@ -1,52 +1,48 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 3966
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 57,
"end": 57, "id": {
"id": { "end": 24,
"end": 24, "name": "firstPrimeNumber",
"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"
},
"start": 8, "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, "end": 57,
"kind": "fn", "kind": "fn",
"start": 5, "start": 5,

View File

@ -1,61 +1,58 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 49,
"end": 49, "id": {
"id": { "end": 8,
"end": 8, "name": "thing",
"name": "thing", "start": 3,
"start": 3, "type": "Identifier"
"type": "Identifier" },
}, "init": {
"init": { "body": {
"body": { "body": [
"body": [
{
"argument": {
"end": 43,
"raw": "true",
"start": 39,
"type": "Literal",
"type": "Literal",
"value": true
},
"end": 43,
"start": 32,
"type": "ReturnStatement",
"type": "ReturnStatement"
}
],
"end": 49,
"start": 22
},
"end": 49,
"params": [
{ {
"type": "Parameter", "argument": {
"identifier": { "end": 43,
"end": 17, "raw": "true",
"name": "param", "start": 39,
"start": 12, "type": "Literal",
"type": "Identifier" "type": "Literal",
} "value": true
},
"end": 43,
"start": 32,
"type": "ReturnStatement",
"type": "ReturnStatement"
} }
], ],
"start": 11, "end": 49,
"type": "FunctionExpression", "start": 22
"type": "FunctionExpression"
}, },
"start": 3, "end": 49,
"type": "VariableDeclarator" "params": [
} {
], "type": "Parameter",
"identifier": {
"end": 17,
"name": "param",
"start": 12,
"type": "Identifier"
}
}
],
"start": 11,
"type": "FunctionExpression",
"type": "FunctionExpression"
},
"start": 3,
"type": "VariableDeclarator"
},
"end": 49, "end": 49,
"kind": "fn", "kind": "fn",
"start": 0, "start": 0,

View File

@ -1,237 +1,233 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 3981
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 165,
"end": 165, "id": {
"id": { "end": 14,
"end": 14, "name": "mySketch",
"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"
},
"start": 6, "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, "end": 165,
"kind": "const", "kind": "const",
"start": 0, "start": 0,

View File

@ -1,135 +1,131 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 3989
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 70,
"end": 70, "id": {
"id": { "end": 14,
"end": 14, "name": "mySketch",
"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"
},
"start": 6, "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, "end": 70,
"kind": "const", "kind": "const",
"start": 0, "start": 0,

View File

@ -1,46 +1,42 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 3993
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 30,
"end": 30, "id": {
"id": { "end": 11,
"end": 11, "name": "myBox",
"name": "myBox", "start": 6,
"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" "type": "Identifier"
}, },
"init": { "end": 30,
"arguments": [ "start": 14,
{ "type": "CallExpression",
"end": 29, "type": "CallExpression"
"name": "p", },
"start": 28, "start": 6,
"type": "Identifier", "type": "VariableDeclarator"
"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, "end": 30,
"kind": "const", "kind": "const",
"start": 0, "start": 0,

View File

@ -1,83 +1,79 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 3994
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 29,
"end": 29, "id": {
"id": { "end": 11,
"end": 11, "name": "myBox",
"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"
},
"start": 6, "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, "end": 29,
"kind": "const", "kind": "const",
"start": 0, "start": 0,

View File

@ -1,97 +1,93 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 3995
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 49,
"end": 49, "id": {
"id": { "end": 11,
"end": 11, "name": "myBox",
"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"
},
"start": 6, "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, "end": 49,
"kind": "const", "kind": "const",
"start": 0, "start": 0,

View File

@ -1,63 +1,59 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 4001
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 37,
"end": 37, "id": {
"id": { "end": 14,
"end": 14, "name": "mySketch",
"name": "mySketch", "start": 6,
"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" "type": "Identifier"
}, },
"init": { "end": 37,
"arguments": [ "start": 17,
{ "type": "CallExpression",
"elements": [ "type": "CallExpression"
{ },
"end": 33, "start": 6,
"raw": "0", "type": "VariableDeclarator"
"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, "end": 37,
"kind": "const", "kind": "const",
"start": 0, "start": 0,

View File

@ -1,165 +1,161 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 4005
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 107,
"end": 107, "id": {
"id": { "end": 14,
"end": 14, "name": "cylinder",
"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"
},
"start": 6, "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, "end": 107,
"kind": "const", "kind": "const",
"start": 0, "start": 0,

View File

@ -1,87 +1,84 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 49,
"end": 49, "id": {
"id": { "end": 4,
"end": 4, "name": "f",
"name": "f", "start": 3,
"start": 3, "type": "Identifier"
"type": "Identifier" },
}, "init": {
"init": { "body": {
"body": { "body": [
"body": [ {
{ "argument": {
"argument": { "arguments": [
"arguments": [ {
{ "end": 41,
"end": 41, "name": "angle",
"name": "angle", "start": 36,
"start": 36, "type": "Identifier",
"type": "Identifier",
"type": "Identifier"
},
{
"end": 46,
"raw": "360",
"start": 43,
"type": "Literal",
"type": "Literal",
"value": 360.0
}
],
"callee": {
"end": 35,
"name": "default",
"start": 28,
"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, "start": 28,
"type": "CallExpression", "type": "Identifier"
"type": "CallExpression"
}, },
"end": 47, "end": 47,
"start": 21, "start": 28,
"type": "ReturnStatement", "type": "CallExpression",
"type": "ReturnStatement" "type": "CallExpression"
}
],
"end": 49,
"start": 19
},
"end": 49,
"params": [
{
"type": "Parameter",
"identifier": {
"end": 13,
"name": "angle",
"start": 8,
"type": "Identifier"
}, },
"default_value": { "end": 47,
"type": "KclNone", "start": 21,
"type": "KclNone", "type": "ReturnStatement",
"__private": "KCL_NONE_ID" "type": "ReturnStatement"
}
} }
], ],
"start": 7, "end": 49,
"type": "FunctionExpression", "start": 19
"type": "FunctionExpression"
}, },
"start": 3, "end": 49,
"type": "VariableDeclarator" "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, "end": 49,
"kind": "fn", "kind": "fn",
"start": 0, "start": 0,

View File

@ -1,78 +1,74 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 4007
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 91,
"end": 91, "id": {
"id": { "end": 11,
"end": 11, "name": "numbers",
"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"
},
"start": 4, "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, "end": 91,
"kind": "const", "kind": "const",
"start": 0, "start": 0,

View File

@ -1,78 +1,74 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 4016
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 91,
"end": 91, "id": {
"id": { "end": 11,
"end": 11, "name": "numbers",
"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"
},
"start": 4, "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, "end": 91,
"kind": "const", "kind": "const",
"start": 0, "start": 0,

View File

@ -1,88 +1,84 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 4025
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 80,
"end": 80, "id": {
"id": { "end": 9,
"end": 9, "name": "props",
"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"
},
"start": 4, "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, "end": 80,
"kind": "const", "kind": "const",
"start": 0, "start": 0,

View File

@ -1,88 +1,84 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 4033
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 79,
"end": 79, "id": {
"id": { "end": 9,
"end": 9, "name": "props",
"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"
},
"start": 4, "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, "end": 79,
"kind": "const", "kind": "const",
"start": 0, "start": 0,

View File

@ -1,84 +1,80 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 3902
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 36,
"end": 36, "id": {
"id": { "end": 11,
"end": 11, "name": "myVar",
"name": "myVar", "start": 6,
"start": 6, "type": "Identifier"
"type": "Identifier" },
}, "init": {
"init": { "arguments": [
"arguments": [ {
{ "end": 19,
"end": 19, "raw": "5",
"raw": "5", "start": 18,
"start": 18, "type": "Literal",
"type": "Literal", "type": "Literal",
"type": "Literal", "value": 5.0
"value": 5.0 },
}, {
{ "argument": {
"argument": { "arguments": [
"arguments": [ {
{ "end": 31,
"end": 31, "raw": "5",
"raw": "5", "start": 30,
"start": 30, "type": "Literal",
"type": "Literal", "type": "Literal",
"type": "Literal", "value": 5.0
"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"
}, },
"end": 35, {
"end": 34,
"raw": "4",
"start": 33,
"type": "Literal",
"type": "Literal",
"value": 4.0
}
],
"callee": {
"end": 29,
"name": "legLen",
"start": 23, "start": 23,
"type": "CallExpression", "type": "Identifier"
"type": "CallExpression"
}, },
"end": 35, "end": 35,
"operator": "-", "start": 23,
"start": 22, "type": "CallExpression",
"type": "UnaryExpression", "type": "CallExpression"
"type": "UnaryExpression" },
} "end": 35,
], "operator": "-",
"callee": { "start": 22,
"end": 17, "type": "UnaryExpression",
"name": "min", "type": "UnaryExpression"
"start": 14, }
"type": "Identifier" ],
}, "callee": {
"end": 36, "end": 17,
"name": "min",
"start": 14, "start": 14,
"type": "CallExpression", "type": "Identifier"
"type": "CallExpression"
}, },
"start": 6, "end": 36,
"type": "VariableDeclarator" "start": 14,
} "type": "CallExpression",
], "type": "CallExpression"
},
"start": 6,
"type": "VariableDeclarator"
},
"end": 36, "end": 36,
"kind": "const", "kind": "const",
"start": 0, "start": 0,

View File

@ -1,122 +1,118 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 4041
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 132,
"end": 132, "id": {
"id": { "end": 16,
"end": 16, "name": "sketch001",
"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"
},
"start": 7, "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, "end": 132,
"kind": "const", "kind": "const",
"start": 1, "start": 1,

View File

@ -1,77 +1,61 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 4052
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 31,
"id": {
"end": 11,
"name": "my14",
"start": 7,
"type": "Identifier"
},
"init": {
"end": 31, "end": 31,
"id": { "left": {
"end": 11, "end": 19,
"name": "my14", "left": {
"start": 7, "end": 15,
"type": "Identifier" "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, "end": 31,
"left": { "left": {
"end": 19, "end": 27,
"left": { "left": {
"end": 15, "end": 23,
"raw": "4", "raw": "3",
"start": 14, "start": 22,
"type": "Literal", "type": "Literal",
"type": "Literal", "type": "Literal",
"value": 4.0 "value": 3.0
}, },
"operator": "^", "operator": "^",
"right": { "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, "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", "raw": "2",
"start": 30, "start": 26,
"type": "Literal", "type": "Literal",
"type": "Literal", "type": "Literal",
"value": 2.0 "value": 2.0
@ -80,14 +64,26 @@ snapshot_kind: text
"type": "BinaryExpression", "type": "BinaryExpression",
"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",
"type": "BinaryExpression" "type": "BinaryExpression"
}, },
"start": 7, "start": 14,
"type": "VariableDeclarator" "type": "BinaryExpression",
} "type": "BinaryExpression"
], },
"start": 7,
"type": "VariableDeclarator"
},
"end": 31, "end": 31,
"kind": "const", "kind": "const",
"start": 1, "start": 1,

View File

@ -1,81 +1,77 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 4058
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 74,
"end": 74, "id": {
"id": { "end": 7,
"end": 7, "name": "x",
"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"
},
"start": 6, "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, "end": 74,
"kind": "const", "kind": "const",
"start": 0, "start": 0,

View File

@ -1,129 +1,125 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 4066
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 121,
"end": 121, "id": {
"id": { "end": 7,
"end": 7, "name": "x",
"name": "x", "start": 6,
"start": 6, "type": "Identifier"
"type": "Identifier" },
"init": {
"cond": {
"end": 17,
"raw": "true",
"start": 13,
"type": "Literal",
"type": "Literal",
"value": true
}, },
"init": { "digest": null,
"cond": { "else_ifs": [
"end": 17, {
"raw": "true", "cond": {
"start": 13, "arguments": [
"type": "Literal", {
"type": "Literal", "end": 63,
"value": true "name": "radius",
}, "start": 57,
"digest": null, "type": "Identifier",
"else_ifs": [
{
"cond": {
"arguments": [
{
"end": 63,
"name": "radius",
"start": 57,
"type": "Identifier",
"type": "Identifier"
}
],
"callee": {
"end": 56,
"name": "func",
"start": 52,
"type": "Identifier" "type": "Identifier"
}, }
"end": 64, ],
"callee": {
"end": 56,
"name": "func",
"start": 52, "start": 52,
"type": "CallExpression", "type": "Identifier"
"type": "CallExpression"
}, },
"digest": null, "end": 64,
"end": 90, "start": 52,
"start": 44, "type": "CallExpression",
"then_val": { "type": "CallExpression"
"body": [ },
{ "digest": null,
"end": 90,
"start": 44,
"then_val": {
"body": [
{
"end": 80,
"expression": {
"end": 80, "end": 80,
"expression": { "raw": "4",
"end": 80,
"raw": "4",
"start": 79,
"type": "Literal",
"type": "Literal",
"value": 4.0
},
"start": 79, "start": 79,
"type": "ExpressionStatement", "type": "Literal",
"type": "ExpressionStatement" "type": "Literal",
} "value": 4.0
], },
"end": 89, "start": 79,
"start": 65 "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, "end": 120,
"final_else": { "start": 110
"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"
}, },
"start": 6, "start": 10,
"type": "VariableDeclarator" "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, "end": 121,
"kind": "const", "kind": "const",
"start": 0, "start": 0,

View File

@ -1,48 +1,44 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 4076
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 14,
"end": 14, "id": {
"id": { "end": 5,
"end": 5, "name": "x",
"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"
},
"start": 4, "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, "end": 14,
"kind": "const", "kind": "const",
"start": 0, "start": 0,

View File

@ -1,48 +1,44 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 4077
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 14,
"end": 14, "id": {
"id": { "end": 5,
"end": 5, "name": "x",
"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"
},
"start": 4, "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, "end": 14,
"kind": "const", "kind": "const",
"start": 0, "start": 0,

View File

@ -1,33 +1,29 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 4078
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 5,
"end": 5, "id": {
"id": { "end": 1,
"end": 1, "name": "x",
"name": "x",
"start": 0,
"type": "Identifier"
},
"init": {
"end": 5,
"raw": "4",
"start": 4,
"type": "Literal",
"type": "Literal",
"value": 4.0
},
"start": 0, "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, "end": 5,
"kind": "const", "kind": "const",
"start": 0, "start": 0,

View File

@ -1,87 +1,83 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 4079
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 42,
"end": 42, "id": {
"id": { "end": 9,
"end": 9, "name": "obj",
"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"
},
"start": 6, "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, "end": 42,
"kind": "const", "kind": "const",
"start": 0, "start": 0,

View File

@ -1,33 +1,29 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 4080
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 5,
"end": 5, "id": {
"id": { "end": 1,
"end": 1, "name": "x",
"name": "x",
"start": 0,
"type": "Identifier"
},
"init": {
"end": 5,
"raw": "3",
"start": 4,
"type": "Literal",
"type": "Literal",
"value": 3.0
},
"start": 0, "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, "end": 5,
"kind": "const", "kind": "const",
"start": 0, "start": 0,
@ -35,64 +31,62 @@ snapshot_kind: text
"type": "VariableDeclaration" "type": "VariableDeclaration"
}, },
{ {
"declarations": [ "declaration": {
{ "end": 30,
"end": 30, "id": {
"id": { "end": 17,
"end": 17, "name": "obj",
"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"
},
"start": 14, "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, "end": 30,
"kind": "const", "kind": "const",
"start": 14, "start": 14,

View File

@ -1,84 +1,80 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 3904
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 35,
"end": 35, "id": {
"id": { "end": 11,
"end": 11, "name": "myVar",
"name": "myVar", "start": 6,
"start": 6, "type": "Identifier"
"type": "Identifier" },
}, "init": {
"init": { "arguments": [
"arguments": [ {
{ "argument": {
"argument": { "arguments": [
"arguments": [ {
{ "end": 27,
"end": 27, "raw": "5",
"raw": "5", "start": 26,
"start": 26, "type": "Literal",
"type": "Literal", "type": "Literal",
"type": "Literal", "value": 5.0
"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"
}, },
"end": 31, {
"end": 30,
"raw": "4",
"start": 29,
"type": "Literal",
"type": "Literal",
"value": 4.0
}
],
"callee": {
"end": 25,
"name": "legLen",
"start": 19, "start": 19,
"type": "CallExpression", "type": "Identifier"
"type": "CallExpression"
}, },
"end": 31, "end": 31,
"operator": "-", "start": 19,
"start": 18, "type": "CallExpression",
"type": "UnaryExpression", "type": "CallExpression"
"type": "UnaryExpression"
}, },
{ "end": 31,
"end": 34, "operator": "-",
"raw": "5", "start": 18,
"start": 33, "type": "UnaryExpression",
"type": "Literal", "type": "UnaryExpression"
"type": "Literal",
"value": 5.0
}
],
"callee": {
"end": 17,
"name": "min",
"start": 14,
"type": "Identifier"
}, },
"end": 35, {
"end": 34,
"raw": "5",
"start": 33,
"type": "Literal",
"type": "Literal",
"value": 5.0
}
],
"callee": {
"end": 17,
"name": "min",
"start": 14, "start": 14,
"type": "CallExpression", "type": "Identifier"
"type": "CallExpression"
}, },
"start": 6, "end": 35,
"type": "VariableDeclarator" "start": 14,
} "type": "CallExpression",
], "type": "CallExpression"
},
"start": 6,
"type": "VariableDeclarator"
},
"end": 35, "end": 35,
"kind": "const", "kind": "const",
"start": 0, "start": 0,

View File

@ -1,84 +1,80 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 3905
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 36,
"end": 36, "id": {
"id": { "end": 11,
"end": 11, "name": "myVar",
"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"
},
"start": 6, "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, "end": 36,
"kind": "const", "kind": "const",
"start": 0, "start": 0,

View File

@ -1,53 +1,49 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 3915
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 27,
"id": {
"end": 7,
"name": "x",
"start": 6,
"type": "Identifier"
},
"init": {
"end": 27, "end": 27,
"id": { "left": {
"end": 7, "argument": {
"name": "x",
"start": 6,
"type": "Identifier"
},
"init": {
"end": 27,
"left": {
"argument": {
"end": 15,
"name": "leg2",
"start": 11,
"type": "Identifier",
"type": "Identifier"
},
"end": 15, "end": 15,
"operator": "-", "name": "leg2",
"start": 10, "start": 11,
"type": "UnaryExpression",
"type": "UnaryExpression"
},
"operator": "+",
"right": {
"end": 27,
"name": "thickness",
"start": 18,
"type": "Identifier", "type": "Identifier",
"type": "Identifier" "type": "Identifier"
}, },
"end": 15,
"operator": "-",
"start": 10, "start": 10,
"type": "BinaryExpression", "type": "UnaryExpression",
"type": "BinaryExpression" "type": "UnaryExpression"
}, },
"start": 6, "operator": "+",
"type": "VariableDeclarator" "right": {
} "end": 27,
], "name": "thickness",
"start": 18,
"type": "Identifier",
"type": "Identifier"
},
"start": 10,
"type": "BinaryExpression",
"type": "BinaryExpression"
},
"start": 6,
"type": "VariableDeclarator"
},
"end": 27, "end": 27,
"kind": "const", "kind": "const",
"start": 0, "start": 0,

View File

@ -1,63 +1,59 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 3906
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 18,
"id": {
"end": 5,
"name": "x",
"start": 4,
"type": "Identifier"
},
"init": {
"end": 18, "end": 18,
"id": { "left": {
"end": 5, "end": 9,
"name": "x", "raw": "1",
"start": 4, "start": 8,
"type": "Identifier" "type": "Literal",
"type": "Literal",
"value": 1.0
}, },
"init": { "operator": "*",
"right": {
"end": 18, "end": 18,
"left": { "left": {
"end": 9, "end": 14,
"raw": "1", "raw": "3",
"start": 8, "start": 13,
"type": "Literal", "type": "Literal",
"type": "Literal", "type": "Literal",
"value": 1.0 "value": 3.0
}, },
"operator": "*", "operator": "-",
"right": { "right": {
"end": 18, "end": 18,
"left": { "raw": "4",
"end": 14, "start": 17,
"raw": "3", "type": "Literal",
"start": 13, "type": "Literal",
"type": "Literal", "value": 4.0
"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"
}, },
"start": 8, "start": 13,
"type": "BinaryExpression", "type": "BinaryExpression",
"type": "BinaryExpression" "type": "BinaryExpression"
}, },
"start": 4, "start": 8,
"type": "VariableDeclarator" "type": "BinaryExpression",
} "type": "BinaryExpression"
], },
"start": 4,
"type": "VariableDeclarator"
},
"end": 18, "end": 18,
"kind": "const", "kind": "const",
"start": 0, "start": 0,

View File

@ -1,33 +1,29 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 3907
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 11,
"end": 11, "id": {
"id": { "end": 7,
"end": 7, "name": "x",
"name": "x",
"start": 6,
"type": "Identifier"
},
"init": {
"end": 11,
"raw": "1",
"start": 10,
"type": "Literal",
"type": "Literal",
"value": 1.0
},
"start": 6, "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, "end": 11,
"kind": "const", "kind": "const",
"start": 0, "start": 0,

View File

@ -1,64 +1,60 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 3908
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 58,
"end": 58, "id": {
"id": { "end": 4,
"end": 4, "name": "x",
"name": "x",
"start": 3,
"type": "Identifier"
},
"init": {
"body": {
"body": [
{
"argument": {
"end": 32,
"name": "sg",
"start": 30,
"type": "Identifier",
"type": "Identifier"
},
"end": 32,
"start": 23,
"type": "ReturnStatement",
"type": "ReturnStatement"
},
{
"argument": {
"end": 50,
"name": "sg",
"start": 48,
"type": "Identifier",
"type": "Identifier"
},
"end": 50,
"start": 41,
"type": "ReturnStatement",
"type": "ReturnStatement"
}
],
"end": 58,
"start": 13
},
"end": 58,
"params": [],
"start": 7,
"type": "FunctionExpression",
"type": "FunctionExpression"
},
"start": 3, "start": 3,
"type": "VariableDeclarator" "type": "Identifier"
} },
], "init": {
"body": {
"body": [
{
"argument": {
"end": 32,
"name": "sg",
"start": 30,
"type": "Identifier",
"type": "Identifier"
},
"end": 32,
"start": 23,
"type": "ReturnStatement",
"type": "ReturnStatement"
},
{
"argument": {
"end": 50,
"name": "sg",
"start": 48,
"type": "Identifier",
"type": "Identifier"
},
"end": 50,
"start": 41,
"type": "ReturnStatement",
"type": "ReturnStatement"
}
],
"end": 58,
"start": 13
},
"end": 58,
"params": [],
"start": 7,
"type": "FunctionExpression",
"type": "FunctionExpression"
},
"start": 3,
"type": "VariableDeclarator"
},
"end": 58, "end": 58,
"kind": "fn", "kind": "fn",
"start": 0, "start": 0,

View File

@ -1,71 +1,67 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 3916
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 26,
"end": 26, "id": {
"id": { "end": 9,
"end": 9, "name": "obj",
"name": "obj",
"start": 6,
"type": "Identifier"
},
"init": {
"end": 26,
"properties": [
{
"end": 18,
"key": {
"end": 15,
"name": "a",
"start": 14,
"type": "Identifier"
},
"start": 14,
"type": "ObjectProperty",
"value": {
"end": 18,
"raw": "1",
"start": 17,
"type": "Literal",
"type": "Literal",
"value": 1.0
}
},
{
"end": 24,
"key": {
"end": 21,
"name": "b",
"start": 20,
"type": "Identifier"
},
"start": 20,
"type": "ObjectProperty",
"value": {
"end": 24,
"raw": "2",
"start": 23,
"type": "Literal",
"type": "Literal",
"value": 2.0
}
}
],
"start": 12,
"type": "ObjectExpression",
"type": "ObjectExpression"
},
"start": 6, "start": 6,
"type": "VariableDeclarator" "type": "Identifier"
} },
], "init": {
"end": 26,
"properties": [
{
"end": 18,
"key": {
"end": 15,
"name": "a",
"start": 14,
"type": "Identifier"
},
"start": 14,
"type": "ObjectProperty",
"value": {
"end": 18,
"raw": "1",
"start": 17,
"type": "Literal",
"type": "Literal",
"value": 1.0
}
},
{
"end": 24,
"key": {
"end": 21,
"name": "b",
"start": 20,
"type": "Identifier"
},
"start": 20,
"type": "ObjectProperty",
"value": {
"end": 24,
"raw": "2",
"start": 23,
"type": "Literal",
"type": "Literal",
"value": 2.0
}
}
],
"start": 12,
"type": "ObjectExpression",
"type": "ObjectExpression"
},
"start": 6,
"type": "VariableDeclarator"
},
"end": 26, "end": 26,
"kind": "const", "kind": "const",
"start": 0, "start": 0,
@ -73,55 +69,53 @@ snapshot_kind: text
"type": "VariableDeclaration" "type": "VariableDeclaration"
}, },
{ {
"declarations": [ "declaration": {
{ "end": 55,
"end": 55, "id": {
"id": { "end": 43,
"end": 43, "name": "height",
"name": "height",
"start": 37,
"type": "Identifier"
},
"init": {
"end": 55,
"left": {
"end": 47,
"raw": "1",
"start": 46,
"type": "Literal",
"type": "Literal",
"value": 1.0
},
"operator": "-",
"right": {
"computed": false,
"end": 55,
"object": {
"end": 53,
"name": "obj",
"start": 50,
"type": "Identifier",
"type": "Identifier"
},
"property": {
"end": 55,
"name": "a",
"start": 54,
"type": "Identifier",
"type": "Identifier"
},
"start": 50,
"type": "MemberExpression",
"type": "MemberExpression"
},
"start": 46,
"type": "BinaryExpression",
"type": "BinaryExpression"
},
"start": 37, "start": 37,
"type": "VariableDeclarator" "type": "Identifier"
} },
], "init": {
"end": 55,
"left": {
"end": 47,
"raw": "1",
"start": 46,
"type": "Literal",
"type": "Literal",
"value": 1.0
},
"operator": "-",
"right": {
"computed": false,
"end": 55,
"object": {
"end": 53,
"name": "obj",
"start": 50,
"type": "Identifier",
"type": "Identifier"
},
"property": {
"end": 55,
"name": "a",
"start": 54,
"type": "Identifier",
"type": "Identifier"
},
"start": 50,
"type": "MemberExpression",
"type": "MemberExpression"
},
"start": 46,
"type": "BinaryExpression",
"type": "BinaryExpression"
},
"start": 37,
"type": "VariableDeclarator"
},
"end": 55, "end": 55,
"kind": "const", "kind": "const",
"start": 31, "start": 31,

View File

@ -1,71 +1,67 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 3921
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 26,
"end": 26, "id": {
"id": { "end": 9,
"end": 9, "name": "obj",
"name": "obj",
"start": 6,
"type": "Identifier"
},
"init": {
"end": 26,
"properties": [
{
"end": 18,
"key": {
"end": 15,
"name": "a",
"start": 14,
"type": "Identifier"
},
"start": 14,
"type": "ObjectProperty",
"value": {
"end": 18,
"raw": "1",
"start": 17,
"type": "Literal",
"type": "Literal",
"value": 1.0
}
},
{
"end": 24,
"key": {
"end": 21,
"name": "b",
"start": 20,
"type": "Identifier"
},
"start": 20,
"type": "ObjectProperty",
"value": {
"end": 24,
"raw": "2",
"start": 23,
"type": "Literal",
"type": "Literal",
"value": 2.0
}
}
],
"start": 12,
"type": "ObjectExpression",
"type": "ObjectExpression"
},
"start": 6, "start": 6,
"type": "VariableDeclarator" "type": "Identifier"
} },
], "init": {
"end": 26,
"properties": [
{
"end": 18,
"key": {
"end": 15,
"name": "a",
"start": 14,
"type": "Identifier"
},
"start": 14,
"type": "ObjectProperty",
"value": {
"end": 18,
"raw": "1",
"start": 17,
"type": "Literal",
"type": "Literal",
"value": 1.0
}
},
{
"end": 24,
"key": {
"end": 21,
"name": "b",
"start": 20,
"type": "Identifier"
},
"start": 20,
"type": "ObjectProperty",
"value": {
"end": 24,
"raw": "2",
"start": 23,
"type": "Literal",
"type": "Literal",
"value": 2.0
}
}
],
"start": 12,
"type": "ObjectExpression",
"type": "ObjectExpression"
},
"start": 6,
"type": "VariableDeclarator"
},
"end": 26, "end": 26,
"kind": "const", "kind": "const",
"start": 0, "start": 0,
@ -73,56 +69,54 @@ snapshot_kind: text
"type": "VariableDeclaration" "type": "VariableDeclaration"
}, },
{ {
"declarations": [ "declaration": {
{ "end": 59,
"end": 59, "id": {
"id": { "end": 44,
"end": 44, "name": "height",
"name": "height",
"start": 38,
"type": "Identifier"
},
"init": {
"end": 59,
"left": {
"end": 48,
"raw": "1",
"start": 47,
"type": "Literal",
"type": "Literal",
"value": 1.0
},
"operator": "-",
"right": {
"computed": false,
"end": 59,
"object": {
"end": 54,
"name": "obj",
"start": 51,
"type": "Identifier",
"type": "Identifier"
},
"property": {
"end": 58,
"raw": "\"a\"",
"start": 55,
"type": "Literal",
"type": "Literal",
"value": "a"
},
"start": 51,
"type": "MemberExpression",
"type": "MemberExpression"
},
"start": 47,
"type": "BinaryExpression",
"type": "BinaryExpression"
},
"start": 38, "start": 38,
"type": "VariableDeclarator" "type": "Identifier"
} },
], "init": {
"end": 59,
"left": {
"end": 48,
"raw": "1",
"start": 47,
"type": "Literal",
"type": "Literal",
"value": 1.0
},
"operator": "-",
"right": {
"computed": false,
"end": 59,
"object": {
"end": 54,
"name": "obj",
"start": 51,
"type": "Identifier",
"type": "Identifier"
},
"property": {
"end": 58,
"raw": "\"a\"",
"start": 55,
"type": "Literal",
"type": "Literal",
"value": "a"
},
"start": 51,
"type": "MemberExpression",
"type": "MemberExpression"
},
"start": 47,
"type": "BinaryExpression",
"type": "BinaryExpression"
},
"start": 38,
"type": "VariableDeclarator"
},
"end": 59, "end": 59,
"kind": "const", "kind": "const",
"start": 32, "start": 32,

View File

@ -1,71 +1,67 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 3926
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 26,
"end": 26, "id": {
"id": { "end": 9,
"end": 9, "name": "obj",
"name": "obj",
"start": 6,
"type": "Identifier"
},
"init": {
"end": 26,
"properties": [
{
"end": 18,
"key": {
"end": 15,
"name": "a",
"start": 14,
"type": "Identifier"
},
"start": 14,
"type": "ObjectProperty",
"value": {
"end": 18,
"raw": "1",
"start": 17,
"type": "Literal",
"type": "Literal",
"value": 1.0
}
},
{
"end": 24,
"key": {
"end": 21,
"name": "b",
"start": 20,
"type": "Identifier"
},
"start": 20,
"type": "ObjectProperty",
"value": {
"end": 24,
"raw": "2",
"start": 23,
"type": "Literal",
"type": "Literal",
"value": 2.0
}
}
],
"start": 12,
"type": "ObjectExpression",
"type": "ObjectExpression"
},
"start": 6, "start": 6,
"type": "VariableDeclarator" "type": "Identifier"
} },
], "init": {
"end": 26,
"properties": [
{
"end": 18,
"key": {
"end": 15,
"name": "a",
"start": 14,
"type": "Identifier"
},
"start": 14,
"type": "ObjectProperty",
"value": {
"end": 18,
"raw": "1",
"start": 17,
"type": "Literal",
"type": "Literal",
"value": 1.0
}
},
{
"end": 24,
"key": {
"end": 21,
"name": "b",
"start": 20,
"type": "Identifier"
},
"start": 20,
"type": "ObjectProperty",
"value": {
"end": 24,
"raw": "2",
"start": 23,
"type": "Literal",
"type": "Literal",
"value": 2.0
}
}
],
"start": 12,
"type": "ObjectExpression",
"type": "ObjectExpression"
},
"start": 6,
"type": "VariableDeclarator"
},
"end": 26, "end": 26,
"kind": "const", "kind": "const",
"start": 0, "start": 0,
@ -73,56 +69,54 @@ snapshot_kind: text
"type": "VariableDeclaration" "type": "VariableDeclaration"
}, },
{ {
"declarations": [ "declaration": {
{ "end": 58,
"id": {
"end": 43,
"name": "height",
"start": 37,
"type": "Identifier"
},
"init": {
"end": 58, "end": 58,
"id": { "left": {
"end": 43, "computed": false,
"name": "height", "end": 54,
"start": 37, "object": {
"type": "Identifier" "end": 49,
}, "name": "obj",
"init": {
"end": 58,
"left": {
"computed": false,
"end": 54,
"object": {
"end": 49,
"name": "obj",
"start": 46,
"type": "Identifier",
"type": "Identifier"
},
"property": {
"end": 53,
"raw": "\"a\"",
"start": 50,
"type": "Literal",
"type": "Literal",
"value": "a"
},
"start": 46, "start": 46,
"type": "MemberExpression", "type": "Identifier",
"type": "MemberExpression" "type": "Identifier"
}, },
"operator": "-", "property": {
"right": { "end": 53,
"end": 58, "raw": "\"a\"",
"raw": "1", "start": 50,
"start": 57,
"type": "Literal", "type": "Literal",
"type": "Literal", "type": "Literal",
"value": 1.0 "value": "a"
}, },
"start": 46, "start": 46,
"type": "BinaryExpression", "type": "MemberExpression",
"type": "BinaryExpression" "type": "MemberExpression"
}, },
"start": 37, "operator": "-",
"type": "VariableDeclarator" "right": {
} "end": 58,
], "raw": "1",
"start": 57,
"type": "Literal",
"type": "Literal",
"value": 1.0
},
"start": 46,
"type": "BinaryExpression",
"type": "BinaryExpression"
},
"start": 37,
"type": "VariableDeclarator"
},
"end": 58, "end": 58,
"kind": "const", "kind": "const",
"start": 31, "start": 31,

View File

@ -1,71 +1,67 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 3931
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 26,
"end": 26, "id": {
"id": { "end": 9,
"end": 9, "name": "obj",
"name": "obj",
"start": 6,
"type": "Identifier"
},
"init": {
"end": 26,
"properties": [
{
"end": 18,
"key": {
"end": 15,
"name": "a",
"start": 14,
"type": "Identifier"
},
"start": 14,
"type": "ObjectProperty",
"value": {
"end": 18,
"raw": "1",
"start": 17,
"type": "Literal",
"type": "Literal",
"value": 1.0
}
},
{
"end": 24,
"key": {
"end": 21,
"name": "b",
"start": 20,
"type": "Identifier"
},
"start": 20,
"type": "ObjectProperty",
"value": {
"end": 24,
"raw": "2",
"start": 23,
"type": "Literal",
"type": "Literal",
"value": 2.0
}
}
],
"start": 12,
"type": "ObjectExpression",
"type": "ObjectExpression"
},
"start": 6, "start": 6,
"type": "VariableDeclarator" "type": "Identifier"
} },
], "init": {
"end": 26,
"properties": [
{
"end": 18,
"key": {
"end": 15,
"name": "a",
"start": 14,
"type": "Identifier"
},
"start": 14,
"type": "ObjectProperty",
"value": {
"end": 18,
"raw": "1",
"start": 17,
"type": "Literal",
"type": "Literal",
"value": 1.0
}
},
{
"end": 24,
"key": {
"end": 21,
"name": "b",
"start": 20,
"type": "Identifier"
},
"start": 20,
"type": "ObjectProperty",
"value": {
"end": 24,
"raw": "2",
"start": 23,
"type": "Literal",
"type": "Literal",
"value": 2.0
}
}
],
"start": 12,
"type": "ObjectExpression",
"type": "ObjectExpression"
},
"start": 6,
"type": "VariableDeclarator"
},
"end": 26, "end": 26,
"kind": "const", "kind": "const",
"start": 0, "start": 0,
@ -73,72 +69,70 @@ snapshot_kind: text
"type": "VariableDeclaration" "type": "VariableDeclaration"
}, },
{ {
"declarations": [ "declaration": {
{ "end": 63,
"end": 63, "id": {
"id": { "end": 43,
"end": 43, "name": "height",
"name": "height",
"start": 37,
"type": "Identifier"
},
"init": {
"elements": [
{
"end": 59,
"left": {
"end": 48,
"raw": "1",
"start": 47,
"type": "Literal",
"type": "Literal",
"value": 1.0
},
"operator": "-",
"right": {
"computed": false,
"end": 59,
"object": {
"end": 54,
"name": "obj",
"start": 51,
"type": "Identifier",
"type": "Identifier"
},
"property": {
"end": 58,
"raw": "\"a\"",
"start": 55,
"type": "Literal",
"type": "Literal",
"value": "a"
},
"start": 51,
"type": "MemberExpression",
"type": "MemberExpression"
},
"start": 47,
"type": "BinaryExpression",
"type": "BinaryExpression"
},
{
"end": 62,
"raw": "0",
"start": 61,
"type": "Literal",
"type": "Literal",
"value": 0.0
}
],
"end": 63,
"start": 46,
"type": "ArrayExpression",
"type": "ArrayExpression"
},
"start": 37, "start": 37,
"type": "VariableDeclarator" "type": "Identifier"
} },
], "init": {
"elements": [
{
"end": 59,
"left": {
"end": 48,
"raw": "1",
"start": 47,
"type": "Literal",
"type": "Literal",
"value": 1.0
},
"operator": "-",
"right": {
"computed": false,
"end": 59,
"object": {
"end": 54,
"name": "obj",
"start": 51,
"type": "Identifier",
"type": "Identifier"
},
"property": {
"end": 58,
"raw": "\"a\"",
"start": 55,
"type": "Literal",
"type": "Literal",
"value": "a"
},
"start": 51,
"type": "MemberExpression",
"type": "MemberExpression"
},
"start": 47,
"type": "BinaryExpression",
"type": "BinaryExpression"
},
{
"end": 62,
"raw": "0",
"start": 61,
"type": "Literal",
"type": "Literal",
"value": 0.0
}
],
"end": 63,
"start": 46,
"type": "ArrayExpression",
"type": "ArrayExpression"
},
"start": 37,
"type": "VariableDeclarator"
},
"end": 63, "end": 63,
"kind": "const", "kind": "const",
"start": 31, "start": 31,

View File

@ -5,62 +5,60 @@ expression: actual
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 21,
"end": 21, "id": {
"id": { "end": 3,
"end": 3, "name": "val",
"name": "val", "start": 0,
"start": 0, "type": "Identifier"
},
"init": {
"arguments": [
{
"type": "LabeledArg",
"label": {
"type": "Identifier",
"name": "x"
},
"arg": {
"end": 14,
"name": "a",
"start": 13,
"type": "Identifier",
"type": "Identifier"
}
},
{
"type": "LabeledArg",
"label": {
"type": "Identifier",
"name": "y"
},
"arg": {
"end": 20,
"name": "b",
"start": 19,
"type": "Identifier",
"type": "Identifier"
}
}
],
"callee": {
"end": 9,
"name": "foo",
"start": 6,
"type": "Identifier" "type": "Identifier"
}, },
"init": { "end": 21,
"arguments": [ "start": 6,
{ "type": "CallExpressionKw",
"type": "LabeledArg", "type": "CallExpressionKw",
"label": { "unlabeled": null
"type": "Identifier", },
"name": "x" "start": 0,
}, "type": "VariableDeclarator"
"arg": { },
"end": 14,
"name": "a",
"start": 13,
"type": "Identifier",
"type": "Identifier"
}
},
{
"type": "LabeledArg",
"label": {
"type": "Identifier",
"name": "y"
},
"arg": {
"end": 20,
"name": "b",
"start": 19,
"type": "Identifier",
"type": "Identifier"
}
}
],
"callee": {
"end": 9,
"name": "foo",
"start": 6,
"type": "Identifier"
},
"end": 21,
"start": 6,
"type": "CallExpressionKw",
"type": "CallExpressionKw",
"unlabeled": null
},
"start": 0,
"type": "VariableDeclarator"
}
],
"end": 21, "end": 21,
"kind": "const", "kind": "const",
"start": 0, "start": 0,

View File

@ -5,54 +5,52 @@ expression: actual
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 18,
"end": 18, "id": {
"id": { "end": 3,
"end": 3, "name": "val",
"name": "val", "start": 0,
"start": 0, "type": "Identifier"
},
"init": {
"arguments": [
{
"type": "LabeledArg",
"label": {
"type": "Identifier",
"name": "y"
},
"arg": {
"end": 17,
"name": "z",
"start": 16,
"type": "Identifier",
"type": "Identifier"
}
}
],
"callee": {
"end": 9,
"name": "foo",
"start": 6,
"type": "Identifier" "type": "Identifier"
}, },
"init": { "end": 18,
"arguments": [ "start": 6,
{ "type": "CallExpressionKw",
"type": "LabeledArg", "type": "CallExpressionKw",
"label": { "unlabeled": {
"type": "Identifier", "end": 11,
"name": "y" "name": "x",
}, "start": 10,
"arg": { "type": "Identifier",
"end": 17, "type": "Identifier"
"name": "z", }
"start": 16, },
"type": "Identifier", "start": 0,
"type": "Identifier" "type": "VariableDeclarator"
} },
}
],
"callee": {
"end": 9,
"name": "foo",
"start": 6,
"type": "Identifier"
},
"end": 18,
"start": 6,
"type": "CallExpressionKw",
"type": "CallExpressionKw",
"unlabeled": {
"end": 11,
"name": "x",
"start": 10,
"type": "Identifier",
"type": "Identifier"
}
},
"start": 0,
"type": "VariableDeclarator"
}
],
"end": 18, "end": 18,
"kind": "const", "kind": "const",
"start": 0, "start": 0,

View File

@ -1,71 +1,67 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 3936
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 26,
"end": 26, "id": {
"id": { "end": 9,
"end": 9, "name": "obj",
"name": "obj",
"start": 6,
"type": "Identifier"
},
"init": {
"end": 26,
"properties": [
{
"end": 18,
"key": {
"end": 15,
"name": "a",
"start": 14,
"type": "Identifier"
},
"start": 14,
"type": "ObjectProperty",
"value": {
"end": 18,
"raw": "1",
"start": 17,
"type": "Literal",
"type": "Literal",
"value": 1.0
}
},
{
"end": 24,
"key": {
"end": 21,
"name": "b",
"start": 20,
"type": "Identifier"
},
"start": 20,
"type": "ObjectProperty",
"value": {
"end": 24,
"raw": "2",
"start": 23,
"type": "Literal",
"type": "Literal",
"value": 2.0
}
}
],
"start": 12,
"type": "ObjectExpression",
"type": "ObjectExpression"
},
"start": 6, "start": 6,
"type": "VariableDeclarator" "type": "Identifier"
} },
], "init": {
"end": 26,
"properties": [
{
"end": 18,
"key": {
"end": 15,
"name": "a",
"start": 14,
"type": "Identifier"
},
"start": 14,
"type": "ObjectProperty",
"value": {
"end": 18,
"raw": "1",
"start": 17,
"type": "Literal",
"type": "Literal",
"value": 1.0
}
},
{
"end": 24,
"key": {
"end": 21,
"name": "b",
"start": 20,
"type": "Identifier"
},
"start": 20,
"type": "ObjectProperty",
"value": {
"end": 24,
"raw": "2",
"start": 23,
"type": "Literal",
"type": "Literal",
"value": 2.0
}
}
],
"start": 12,
"type": "ObjectExpression",
"type": "ObjectExpression"
},
"start": 6,
"type": "VariableDeclarator"
},
"end": 26, "end": 26,
"kind": "const", "kind": "const",
"start": 0, "start": 0,
@ -73,72 +69,70 @@ snapshot_kind: text
"type": "VariableDeclaration" "type": "VariableDeclaration"
}, },
{ {
"declarations": [ "declaration": {
{ "end": 63,
"end": 63, "id": {
"id": { "end": 43,
"end": 43, "name": "height",
"name": "height", "start": 37,
"start": 37, "type": "Identifier"
"type": "Identifier" },
}, "init": {
"init": { "elements": [
"elements": [ {
{ "end": 59,
"end": 59, "left": {
"left": { "computed": false,
"computed": false, "end": 55,
"end": 55, "object": {
"object": { "end": 50,
"end": 50, "name": "obj",
"name": "obj",
"start": 47,
"type": "Identifier",
"type": "Identifier"
},
"property": {
"end": 54,
"raw": "\"a\"",
"start": 51,
"type": "Literal",
"type": "Literal",
"value": "a"
},
"start": 47, "start": 47,
"type": "MemberExpression", "type": "Identifier",
"type": "MemberExpression" "type": "Identifier"
}, },
"operator": "-", "property": {
"right": { "end": 54,
"end": 59, "raw": "\"a\"",
"raw": "1", "start": 51,
"start": 58,
"type": "Literal", "type": "Literal",
"type": "Literal", "type": "Literal",
"value": 1.0 "value": "a"
}, },
"start": 47, "start": 47,
"type": "BinaryExpression", "type": "MemberExpression",
"type": "BinaryExpression" "type": "MemberExpression"
}, },
{ "operator": "-",
"end": 62, "right": {
"raw": "0", "end": 59,
"start": 61, "raw": "1",
"start": 58,
"type": "Literal", "type": "Literal",
"type": "Literal", "type": "Literal",
"value": 0.0 "value": 1.0
} },
], "start": 47,
"end": 63, "type": "BinaryExpression",
"start": 46, "type": "BinaryExpression"
"type": "ArrayExpression", },
"type": "ArrayExpression" {
}, "end": 62,
"start": 37, "raw": "0",
"type": "VariableDeclarator" "start": 61,
} "type": "Literal",
], "type": "Literal",
"value": 0.0
}
],
"end": 63,
"start": 46,
"type": "ArrayExpression",
"type": "ArrayExpression"
},
"start": 37,
"type": "VariableDeclarator"
},
"end": 63, "end": 63,
"kind": "const", "kind": "const",
"start": 31, "start": 31,

View File

@ -1,71 +1,67 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 3941
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 26,
"end": 26, "id": {
"id": { "end": 9,
"end": 9, "name": "obj",
"name": "obj",
"start": 6,
"type": "Identifier"
},
"init": {
"end": 26,
"properties": [
{
"end": 18,
"key": {
"end": 15,
"name": "a",
"start": 14,
"type": "Identifier"
},
"start": 14,
"type": "ObjectProperty",
"value": {
"end": 18,
"raw": "1",
"start": 17,
"type": "Literal",
"type": "Literal",
"value": 1.0
}
},
{
"end": 24,
"key": {
"end": 21,
"name": "b",
"start": 20,
"type": "Identifier"
},
"start": 20,
"type": "ObjectProperty",
"value": {
"end": 24,
"raw": "2",
"start": 23,
"type": "Literal",
"type": "Literal",
"value": 2.0
}
}
],
"start": 12,
"type": "ObjectExpression",
"type": "ObjectExpression"
},
"start": 6, "start": 6,
"type": "VariableDeclarator" "type": "Identifier"
} },
], "init": {
"end": 26,
"properties": [
{
"end": 18,
"key": {
"end": 15,
"name": "a",
"start": 14,
"type": "Identifier"
},
"start": 14,
"type": "ObjectProperty",
"value": {
"end": 18,
"raw": "1",
"start": 17,
"type": "Literal",
"type": "Literal",
"value": 1.0
}
},
{
"end": 24,
"key": {
"end": 21,
"name": "b",
"start": 20,
"type": "Identifier"
},
"start": 20,
"type": "ObjectProperty",
"value": {
"end": 24,
"raw": "2",
"start": 23,
"type": "Literal",
"type": "Literal",
"value": 2.0
}
}
],
"start": 12,
"type": "ObjectExpression",
"type": "ObjectExpression"
},
"start": 6,
"type": "VariableDeclarator"
},
"end": 26, "end": 26,
"kind": "const", "kind": "const",
"start": 0, "start": 0,
@ -73,72 +69,70 @@ snapshot_kind: text
"type": "VariableDeclaration" "type": "VariableDeclaration"
}, },
{ {
"declarations": [ "declaration": {
{ "end": 62,
"end": 62, "id": {
"id": { "end": 43,
"end": 43, "name": "height",
"name": "height", "start": 37,
"start": 37, "type": "Identifier"
"type": "Identifier" },
}, "init": {
"init": { "elements": [
"elements": [ {
{ "end": 58,
"end": 58, "left": {
"left": { "computed": false,
"computed": false, "end": 55,
"end": 55, "object": {
"object": { "end": 50,
"end": 50, "name": "obj",
"name": "obj",
"start": 47,
"type": "Identifier",
"type": "Identifier"
},
"property": {
"end": 54,
"raw": "\"a\"",
"start": 51,
"type": "Literal",
"type": "Literal",
"value": "a"
},
"start": 47, "start": 47,
"type": "MemberExpression", "type": "Identifier",
"type": "MemberExpression" "type": "Identifier"
}, },
"operator": "-", "property": {
"right": { "end": 54,
"end": 58, "raw": "\"a\"",
"raw": "1", "start": 51,
"start": 57,
"type": "Literal", "type": "Literal",
"type": "Literal", "type": "Literal",
"value": 1.0 "value": "a"
}, },
"start": 47, "start": 47,
"type": "BinaryExpression", "type": "MemberExpression",
"type": "BinaryExpression" "type": "MemberExpression"
}, },
{ "operator": "-",
"end": 61, "right": {
"raw": "0", "end": 58,
"start": 60, "raw": "1",
"start": 57,
"type": "Literal", "type": "Literal",
"type": "Literal", "type": "Literal",
"value": 0.0 "value": 1.0
} },
], "start": 47,
"end": 62, "type": "BinaryExpression",
"start": 46, "type": "BinaryExpression"
"type": "ArrayExpression", },
"type": "ArrayExpression" {
}, "end": 61,
"start": 37, "raw": "0",
"type": "VariableDeclarator" "start": 60,
} "type": "Literal",
], "type": "Literal",
"value": 0.0
}
],
"end": 62,
"start": 46,
"type": "ArrayExpression",
"type": "ArrayExpression"
},
"start": 37,
"type": "VariableDeclarator"
},
"end": 62, "end": 62,
"kind": "const", "kind": "const",
"start": 31, "start": 31,

View File

@ -1,61 +1,57 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 3946
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 24,
"end": 24, "id": {
"id": { "end": 12,
"end": 12, "name": "height",
"name": "height",
"start": 6,
"type": "Identifier"
},
"init": {
"end": 24,
"left": {
"end": 16,
"raw": "1",
"start": 15,
"type": "Literal",
"type": "Literal",
"value": 1.0
},
"operator": "-",
"right": {
"computed": false,
"end": 24,
"object": {
"end": 22,
"name": "obj",
"start": 19,
"type": "Identifier",
"type": "Identifier"
},
"property": {
"end": 24,
"name": "a",
"start": 23,
"type": "Identifier",
"type": "Identifier"
},
"start": 19,
"type": "MemberExpression",
"type": "MemberExpression"
},
"start": 15,
"type": "BinaryExpression",
"type": "BinaryExpression"
},
"start": 6, "start": 6,
"type": "VariableDeclarator" "type": "Identifier"
} },
], "init": {
"end": 24,
"left": {
"end": 16,
"raw": "1",
"start": 15,
"type": "Literal",
"type": "Literal",
"value": 1.0
},
"operator": "-",
"right": {
"computed": false,
"end": 24,
"object": {
"end": 22,
"name": "obj",
"start": 19,
"type": "Identifier",
"type": "Identifier"
},
"property": {
"end": 24,
"name": "a",
"start": 23,
"type": "Identifier",
"type": "Identifier"
},
"start": 19,
"type": "MemberExpression",
"type": "MemberExpression"
},
"start": 15,
"type": "BinaryExpression",
"type": "BinaryExpression"
},
"start": 6,
"type": "VariableDeclarator"
},
"end": 24, "end": 24,
"kind": "const", "kind": "const",
"start": 0, "start": 0,

View File

@ -1,63 +1,59 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 3947
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 21,
"id": {
"end": 9,
"name": "six",
"start": 6,
"type": "Identifier"
},
"init": {
"end": 21, "end": 21,
"id": { "left": {
"end": 9, "end": 17,
"name": "six",
"start": 6,
"type": "Identifier"
},
"init": {
"end": 21,
"left": { "left": {
"end": 17, "end": 13,
"left": { "raw": "1",
"end": 13,
"raw": "1",
"start": 12,
"type": "Literal",
"type": "Literal",
"value": 1.0
},
"operator": "+",
"right": {
"end": 17,
"raw": "2",
"start": 16,
"type": "Literal",
"type": "Literal",
"value": 2.0
},
"start": 12, "start": 12,
"type": "BinaryExpression", "type": "Literal",
"type": "BinaryExpression" "type": "Literal",
"value": 1.0
}, },
"operator": "+", "operator": "+",
"right": { "right": {
"end": 21, "end": 17,
"raw": "3", "raw": "2",
"start": 20, "start": 16,
"type": "Literal", "type": "Literal",
"type": "Literal", "type": "Literal",
"value": 3.0 "value": 2.0
}, },
"start": 12, "start": 12,
"type": "BinaryExpression", "type": "BinaryExpression",
"type": "BinaryExpression" "type": "BinaryExpression"
}, },
"start": 6, "operator": "+",
"type": "VariableDeclarator" "right": {
} "end": 21,
], "raw": "3",
"start": 20,
"type": "Literal",
"type": "Literal",
"value": 3.0
},
"start": 12,
"type": "BinaryExpression",
"type": "BinaryExpression"
},
"start": 6,
"type": "VariableDeclarator"
},
"end": 21, "end": 21,
"kind": "const", "kind": "const",
"start": 0, "start": 0,

View File

@ -1,63 +1,59 @@
--- ---
source: kcl/src/parsing/parser.rs source: kcl/src/parsing/parser.rs
assertion_line: 3948
expression: actual expression: actual
snapshot_kind: text
--- ---
{ {
"body": [ "body": [
{ {
"declarations": [ "declaration": {
{ "end": 22,
"id": {
"end": 10,
"name": "five",
"start": 6,
"type": "Identifier"
},
"init": {
"end": 22, "end": 22,
"id": { "left": {
"end": 10, "end": 18,
"name": "five",
"start": 6,
"type": "Identifier"
},
"init": {
"end": 22,
"left": { "left": {
"end": 18, "end": 14,
"left": { "raw": "3",
"end": 14,
"raw": "3",
"start": 13,
"type": "Literal",
"type": "Literal",
"value": 3.0
},
"operator": "*",
"right": {
"end": 18,
"raw": "1",
"start": 17,
"type": "Literal",
"type": "Literal",
"value": 1.0
},
"start": 13, "start": 13,
"type": "BinaryExpression", "type": "Literal",
"type": "BinaryExpression" "type": "Literal",
"value": 3.0
}, },
"operator": "+", "operator": "*",
"right": { "right": {
"end": 22, "end": 18,
"raw": "2", "raw": "1",
"start": 21, "start": 17,
"type": "Literal", "type": "Literal",
"type": "Literal", "type": "Literal",
"value": 2.0 "value": 1.0
}, },
"start": 13, "start": 13,
"type": "BinaryExpression", "type": "BinaryExpression",
"type": "BinaryExpression" "type": "BinaryExpression"
}, },
"start": 6, "operator": "+",
"type": "VariableDeclarator" "right": {
} "end": 22,
], "raw": "2",
"start": 21,
"type": "Literal",
"type": "Literal",
"value": 2.0
},
"start": 13,
"type": "BinaryExpression",
"type": "BinaryExpression"
},
"start": 6,
"type": "VariableDeclarator"
},
"end": 22, "end": 22,
"kind": "const", "kind": "const",
"start": 0, "start": 0,

Some files were not shown because too many files have changed in this diff Show More