Module/import upgrades (#4677)
* Parse more import syntax Signed-off-by: Nick Cameron <nrc@ncameron.org> * Remove unnecessary Vec from VariableDeclaration Signed-off-by: Nick Cameron <nrc@ncameron.org> * Parse export import Signed-off-by: Nick Cameron <nrc@ncameron.org> * Factor out an execution module Signed-off-by: Nick Cameron <nrc@ncameron.org> * imports: constants, globs, export import Signed-off-by: Nick Cameron <nrc@ncameron.org> * test fixups Signed-off-by: Nick Cameron <nrc@ncameron.org> --------- Signed-off-by: Nick Cameron <nrc@ncameron.org>
This commit is contained in:
		
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@ -78970,7 +78970,7 @@
 | 
			
		||||
      "model = import(\"tests/inputs/cube.gltf\")",
 | 
			
		||||
      "model = import(\"tests/inputs/cube.sldprt\")",
 | 
			
		||||
      "model = import(\"tests/inputs/cube.step\")",
 | 
			
		||||
      "import height, buildSketch from 'common.kcl'\n\nplane = 'XZ'\nmargin = 2\ns1 = buildSketch(plane, [0, 0])\ns2 = buildSketch(plane, [0, height() + margin])"
 | 
			
		||||
      "import height, buildSketch from \"common.kcl\"\n\nplane = 'XZ'\nmargin = 2\ns1 = buildSketch(plane, [0, 0])\ns2 = buildSketch(plane, [0, height() + margin])"
 | 
			
		||||
    ]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
 | 
			
		||||
@ -701,8 +701,7 @@ export class SceneEntities {
 | 
			
		||||
      'VariableDeclaration'
 | 
			
		||||
    )
 | 
			
		||||
    if (trap(_node1)) return Promise.reject(_node1)
 | 
			
		||||
    const variableDeclarationName =
 | 
			
		||||
      _node1.node?.declarations?.[0]?.id?.name || ''
 | 
			
		||||
    const variableDeclarationName = _node1.node?.declaration.id?.name || ''
 | 
			
		||||
 | 
			
		||||
    const sg = sketchFromKclValue(
 | 
			
		||||
      kclManager.programMemory.get(variableDeclarationName),
 | 
			
		||||
@ -902,10 +901,9 @@ export class SceneEntities {
 | 
			
		||||
      'VariableDeclaration'
 | 
			
		||||
    )
 | 
			
		||||
    if (trap(_node1)) return Promise.reject(_node1)
 | 
			
		||||
    const variableDeclarationName =
 | 
			
		||||
      _node1.node?.declarations?.[0]?.id?.name || ''
 | 
			
		||||
    const startSketchOn = _node1.node?.declarations
 | 
			
		||||
    const startSketchOnInit = startSketchOn?.[0]?.init
 | 
			
		||||
    const variableDeclarationName = _node1.node?.declaration.id?.name || ''
 | 
			
		||||
    const startSketchOn = _node1.node?.declaration
 | 
			
		||||
    const startSketchOnInit = startSketchOn?.init
 | 
			
		||||
 | 
			
		||||
    const tags: [string, string, string] = [
 | 
			
		||||
      findUniqueName(_ast, 'rectangleSegmentA'),
 | 
			
		||||
@ -913,7 +911,7 @@ export class SceneEntities {
 | 
			
		||||
      findUniqueName(_ast, 'rectangleSegmentC'),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    startSketchOn[0].init = createPipeExpression([
 | 
			
		||||
    startSketchOn.init = createPipeExpression([
 | 
			
		||||
      startSketchOnInit,
 | 
			
		||||
      ...getRectangleCallExpressions(rectangleOrigin, tags),
 | 
			
		||||
    ])
 | 
			
		||||
@ -943,7 +941,7 @@ export class SceneEntities {
 | 
			
		||||
          'VariableDeclaration'
 | 
			
		||||
        )
 | 
			
		||||
        if (trap(_node)) return Promise.reject(_node)
 | 
			
		||||
        const sketchInit = _node.node?.declarations?.[0]?.init
 | 
			
		||||
        const sketchInit = _node.node?.declaration.init
 | 
			
		||||
 | 
			
		||||
        const x = (args.intersectionPoint.twoD.x || 0) - rectangleOrigin[0]
 | 
			
		||||
        const y = (args.intersectionPoint.twoD.y || 0) - rectangleOrigin[1]
 | 
			
		||||
@ -992,7 +990,7 @@ export class SceneEntities {
 | 
			
		||||
          'VariableDeclaration'
 | 
			
		||||
        )
 | 
			
		||||
        if (trap(_node)) return
 | 
			
		||||
        const sketchInit = _node.node?.declarations?.[0]?.init
 | 
			
		||||
        const sketchInit = _node.node?.declaration.init
 | 
			
		||||
 | 
			
		||||
        if (sketchInit.type !== 'PipeExpression') {
 | 
			
		||||
          return
 | 
			
		||||
@ -1058,10 +1056,9 @@ export class SceneEntities {
 | 
			
		||||
    if (trap(_node1)) return Promise.reject(_node1)
 | 
			
		||||
 | 
			
		||||
    // startSketchOn already exists
 | 
			
		||||
    const variableDeclarationName =
 | 
			
		||||
      _node1.node?.declarations?.[0]?.id?.name || ''
 | 
			
		||||
    const startSketchOn = _node1.node?.declarations
 | 
			
		||||
    const startSketchOnInit = startSketchOn?.[0]?.init
 | 
			
		||||
    const variableDeclarationName = _node1.node?.declaration.id?.name || ''
 | 
			
		||||
    const startSketchOn = _node1.node?.declaration
 | 
			
		||||
    const startSketchOnInit = startSketchOn?.init
 | 
			
		||||
 | 
			
		||||
    const tags: [string, string, string] = [
 | 
			
		||||
      findUniqueName(_ast, 'rectangleSegmentA'),
 | 
			
		||||
@ -1069,7 +1066,7 @@ export class SceneEntities {
 | 
			
		||||
      findUniqueName(_ast, 'rectangleSegmentC'),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    startSketchOn[0].init = createPipeExpression([
 | 
			
		||||
    startSketchOn.init = createPipeExpression([
 | 
			
		||||
      startSketchOnInit,
 | 
			
		||||
      ...getRectangleCallExpressions(rectangleOrigin, tags),
 | 
			
		||||
    ])
 | 
			
		||||
@ -1099,7 +1096,7 @@ export class SceneEntities {
 | 
			
		||||
          'VariableDeclaration'
 | 
			
		||||
        )
 | 
			
		||||
        if (trap(_node)) return Promise.reject(_node)
 | 
			
		||||
        const sketchInit = _node.node?.declarations?.[0]?.init
 | 
			
		||||
        const sketchInit = _node.node?.declaration.init
 | 
			
		||||
 | 
			
		||||
        const x = (args.intersectionPoint.twoD.x || 0) - rectangleOrigin[0]
 | 
			
		||||
        const y = (args.intersectionPoint.twoD.y || 0) - rectangleOrigin[1]
 | 
			
		||||
@ -1155,7 +1152,7 @@ export class SceneEntities {
 | 
			
		||||
          'VariableDeclaration'
 | 
			
		||||
        )
 | 
			
		||||
        if (trap(_node)) return
 | 
			
		||||
        const sketchInit = _node.node?.declarations?.[0]?.init
 | 
			
		||||
        const sketchInit = _node.node?.declaration.init
 | 
			
		||||
 | 
			
		||||
        if (sketchInit.type === 'PipeExpression') {
 | 
			
		||||
          updateCenterRectangleSketch(
 | 
			
		||||
@ -1224,12 +1221,11 @@ export class SceneEntities {
 | 
			
		||||
      'VariableDeclaration'
 | 
			
		||||
    )
 | 
			
		||||
    if (trap(_node1)) return Promise.reject(_node1)
 | 
			
		||||
    const variableDeclarationName =
 | 
			
		||||
      _node1.node?.declarations?.[0]?.id?.name || ''
 | 
			
		||||
    const startSketchOn = _node1.node?.declarations
 | 
			
		||||
    const startSketchOnInit = startSketchOn?.[0]?.init
 | 
			
		||||
    const variableDeclarationName = _node1.node?.declaration.id?.name || ''
 | 
			
		||||
    const startSketchOn = _node1.node?.declaration
 | 
			
		||||
    const startSketchOnInit = startSketchOn?.init
 | 
			
		||||
 | 
			
		||||
    startSketchOn[0].init = createPipeExpression([
 | 
			
		||||
    startSketchOn.init = createPipeExpression([
 | 
			
		||||
      startSketchOnInit,
 | 
			
		||||
      createCallExpressionStdLib('circle', [
 | 
			
		||||
        createObjectExpression({
 | 
			
		||||
@ -1271,7 +1267,7 @@ export class SceneEntities {
 | 
			
		||||
        )
 | 
			
		||||
        let modded = structuredClone(truncatedAst)
 | 
			
		||||
        if (trap(_node)) return
 | 
			
		||||
        const sketchInit = _node.node?.declarations?.[0]?.init
 | 
			
		||||
        const sketchInit = _node.node.declaration.init
 | 
			
		||||
 | 
			
		||||
        const x = (args.intersectionPoint.twoD.x || 0) - circleCenter[0]
 | 
			
		||||
        const y = (args.intersectionPoint.twoD.y || 0) - circleCenter[1]
 | 
			
		||||
@ -1339,7 +1335,7 @@ export class SceneEntities {
 | 
			
		||||
          'VariableDeclaration'
 | 
			
		||||
        )
 | 
			
		||||
        if (trap(_node)) return
 | 
			
		||||
        const sketchInit = _node.node?.declarations?.[0]?.init
 | 
			
		||||
        const sketchInit = _node.node?.declaration.init
 | 
			
		||||
 | 
			
		||||
        let modded = structuredClone(_ast)
 | 
			
		||||
        if (sketchInit.type === 'PipeExpression') {
 | 
			
		||||
@ -2060,7 +2056,7 @@ function prepareTruncatedMemoryAndAst(
 | 
			
		||||
    'VariableDeclaration'
 | 
			
		||||
  )
 | 
			
		||||
  if (err(_node)) return _node
 | 
			
		||||
  const variableDeclarationName = _node.node?.declarations?.[0]?.id?.name || ''
 | 
			
		||||
  const variableDeclarationName = _node.node?.declaration.id?.name || ''
 | 
			
		||||
  const sg = sketchFromKclValue(
 | 
			
		||||
    programMemory.get(variableDeclarationName),
 | 
			
		||||
    variableDeclarationName
 | 
			
		||||
@ -2085,7 +2081,7 @@ function prepareTruncatedMemoryAndAst(
 | 
			
		||||
      ])
 | 
			
		||||
    }
 | 
			
		||||
    ;(
 | 
			
		||||
      (_ast.body[bodyIndex] as VariableDeclaration).declarations[0]
 | 
			
		||||
      (_ast.body[bodyIndex] as VariableDeclaration).declaration
 | 
			
		||||
        .init as PipeExpression
 | 
			
		||||
    ).body.push(newSegment)
 | 
			
		||||
    // update source ranges to section we just added.
 | 
			
		||||
@ -2096,19 +2092,19 @@ function prepareTruncatedMemoryAndAst(
 | 
			
		||||
    const updatedSrcRangeAst = pResult.program
 | 
			
		||||
 | 
			
		||||
    const lastPipeItem = (
 | 
			
		||||
      (updatedSrcRangeAst.body[bodyIndex] as VariableDeclaration)
 | 
			
		||||
        .declarations[0].init as PipeExpression
 | 
			
		||||
      (updatedSrcRangeAst.body[bodyIndex] as VariableDeclaration).declaration
 | 
			
		||||
        .init as PipeExpression
 | 
			
		||||
    ).body.slice(-1)[0]
 | 
			
		||||
 | 
			
		||||
    ;(
 | 
			
		||||
      (_ast.body[bodyIndex] as VariableDeclaration).declarations[0]
 | 
			
		||||
      (_ast.body[bodyIndex] as VariableDeclaration).declaration
 | 
			
		||||
        .init as PipeExpression
 | 
			
		||||
    ).body.slice(-1)[0].start = lastPipeItem.start
 | 
			
		||||
 | 
			
		||||
    _ast.end = lastPipeItem.end
 | 
			
		||||
    const varDec = _ast.body[bodyIndex] as Node<VariableDeclaration>
 | 
			
		||||
    varDec.end = lastPipeItem.end
 | 
			
		||||
    const declarator = varDec.declarations[0]
 | 
			
		||||
    const declarator = varDec.declaration
 | 
			
		||||
    declarator.end = lastPipeItem.end
 | 
			
		||||
    const init = declarator.init as Node<PipeExpression>
 | 
			
		||||
    init.end = lastPipeItem.end
 | 
			
		||||
@ -2145,7 +2141,7 @@ function prepareTruncatedMemoryAndAst(
 | 
			
		||||
    if (node.type !== 'VariableDeclaration') {
 | 
			
		||||
      continue
 | 
			
		||||
    }
 | 
			
		||||
    const name = node.declarations[0].id.name
 | 
			
		||||
    const name = node.declaration.id.name
 | 
			
		||||
    const memoryItem = programMemory.get(name)
 | 
			
		||||
    if (!memoryItem) {
 | 
			
		||||
      continue
 | 
			
		||||
 | 
			
		||||
@ -169,11 +169,11 @@ export function useCalc({
 | 
			
		||||
        const resultDeclaration = ast.body.find(
 | 
			
		||||
          (a) =>
 | 
			
		||||
            a.type === 'VariableDeclaration' &&
 | 
			
		||||
            a.declarations?.[0]?.id?.name === '__result__'
 | 
			
		||||
            a.declaration.id?.name === '__result__'
 | 
			
		||||
        )
 | 
			
		||||
        const init =
 | 
			
		||||
          resultDeclaration?.type === 'VariableDeclaration' &&
 | 
			
		||||
          resultDeclaration?.declarations?.[0]?.init
 | 
			
		||||
          resultDeclaration?.declaration.init
 | 
			
		||||
        const result = execState.memory?.get('__result__')?.value
 | 
			
		||||
        setCalcResult(typeof result === 'number' ? String(result) : 'NAN')
 | 
			
		||||
        init && setValueNode(init)
 | 
			
		||||
 | 
			
		||||
@ -60,8 +60,7 @@ const b1 = cube([0,0], 10)`
 | 
			
		||||
    expect(nodePath).toEqual([
 | 
			
		||||
      ['body', ''],
 | 
			
		||||
      [0, 'index'],
 | 
			
		||||
      ['declarations', 'VariableDeclaration'],
 | 
			
		||||
      [0, 'index'],
 | 
			
		||||
      ['declaration', 'VariableDeclaration'],
 | 
			
		||||
      ['init', ''],
 | 
			
		||||
      ['params', 'FunctionExpression'],
 | 
			
		||||
      [0, 'index'],
 | 
			
		||||
@ -96,14 +95,12 @@ const b1 = cube([0,0], 10)`
 | 
			
		||||
    expect(nodePath).toEqual([
 | 
			
		||||
      ['body', ''],
 | 
			
		||||
      [0, 'index'],
 | 
			
		||||
      ['declarations', 'VariableDeclaration'],
 | 
			
		||||
      [0, 'index'],
 | 
			
		||||
      ['declaration', 'VariableDeclaration'],
 | 
			
		||||
      ['init', ''],
 | 
			
		||||
      ['body', 'FunctionExpression'],
 | 
			
		||||
      ['body', 'FunctionExpression'],
 | 
			
		||||
      [0, 'index'],
 | 
			
		||||
      ['declarations', 'VariableDeclaration'],
 | 
			
		||||
      [0, 'index'],
 | 
			
		||||
      ['declaration', 'VariableDeclaration'],
 | 
			
		||||
      ['init', ''],
 | 
			
		||||
      ['body', 'PipeExpression'],
 | 
			
		||||
      [2, 'index'],
 | 
			
		||||
 | 
			
		||||
@ -82,11 +82,11 @@ describe('Testing createVariableDeclaration', () => {
 | 
			
		||||
  it('should create a variable declaration', () => {
 | 
			
		||||
    const result = createVariableDeclaration('myVar', createLiteral(5))
 | 
			
		||||
    expect(result.type).toBe('VariableDeclaration')
 | 
			
		||||
    expect(result.declarations[0].type).toBe('VariableDeclarator')
 | 
			
		||||
    expect(result.declarations[0].id.type).toBe('Identifier')
 | 
			
		||||
    expect(result.declarations[0].id.name).toBe('myVar')
 | 
			
		||||
    expect(result.declarations[0].init.type).toBe('Literal')
 | 
			
		||||
    expect((result.declarations[0].init as any).value).toBe(5)
 | 
			
		||||
    expect(result.declaration.type).toBe('VariableDeclarator')
 | 
			
		||||
    expect(result.declaration.id.type).toBe('Identifier')
 | 
			
		||||
    expect(result.declaration.id.name).toBe('myVar')
 | 
			
		||||
    expect(result.declaration.init.type).toBe('Literal')
 | 
			
		||||
    expect((result.declaration.init as any).value).toBe(5)
 | 
			
		||||
  })
 | 
			
		||||
})
 | 
			
		||||
describe('Testing createPipeExpression', () => {
 | 
			
		||||
 | 
			
		||||
@ -66,8 +66,7 @@ export function startSketchOnDefault(
 | 
			
		||||
  let pathToNode: PathToNode = [
 | 
			
		||||
    ['body', ''],
 | 
			
		||||
    [sketchIndex, 'index'],
 | 
			
		||||
    ['declarations', 'VariableDeclaration'],
 | 
			
		||||
    ['0', 'index'],
 | 
			
		||||
    ['declaration', 'VariableDeclaration'],
 | 
			
		||||
    ['init', 'VariableDeclarator'],
 | 
			
		||||
  ]
 | 
			
		||||
 | 
			
		||||
@ -94,7 +93,7 @@ export function addStartProfileAt(
 | 
			
		||||
    return new Error('variableDeclaration.init.type !== PipeExpression')
 | 
			
		||||
  }
 | 
			
		||||
  const _node = { ...node }
 | 
			
		||||
  const init = variableDeclaration.declarations[0].init
 | 
			
		||||
  const init = variableDeclaration.declaration.init
 | 
			
		||||
  const startProfileAt = createCallExpressionStdLib('startProfileAt', [
 | 
			
		||||
    createArrayExpression([
 | 
			
		||||
      createLiteral(roundOff(at[0])),
 | 
			
		||||
@ -105,7 +104,7 @@ export function addStartProfileAt(
 | 
			
		||||
  if (init.type === 'PipeExpression') {
 | 
			
		||||
    init.body.splice(1, 0, startProfileAt)
 | 
			
		||||
  } else {
 | 
			
		||||
    variableDeclaration.declarations[0].init = createPipeExpression([
 | 
			
		||||
    variableDeclaration.declaration.init = createPipeExpression([
 | 
			
		||||
      init,
 | 
			
		||||
      startProfileAt,
 | 
			
		||||
    ])
 | 
			
		||||
@ -149,8 +148,7 @@ export function addSketchTo(
 | 
			
		||||
  let pathToNode: PathToNode = [
 | 
			
		||||
    ['body', ''],
 | 
			
		||||
    [sketchIndex, 'index'],
 | 
			
		||||
    ['declarations', 'VariableDeclaration'],
 | 
			
		||||
    ['0', 'index'],
 | 
			
		||||
    ['declaration', 'VariableDeclaration'],
 | 
			
		||||
    ['init', 'VariableDeclarator'],
 | 
			
		||||
  ]
 | 
			
		||||
  if (axis !== 'xy') {
 | 
			
		||||
@ -333,8 +331,7 @@ export function extrudeSketch(
 | 
			
		||||
  const pathToExtrudeArg: PathToNode = [
 | 
			
		||||
    ['body', ''],
 | 
			
		||||
    [sketchIndexInBody + 1, 'index'],
 | 
			
		||||
    ['declarations', 'VariableDeclaration'],
 | 
			
		||||
    [0, 'index'],
 | 
			
		||||
    ['declaration', 'VariableDeclaration'],
 | 
			
		||||
    ['init', 'VariableDeclarator'],
 | 
			
		||||
    ['arguments', 'CallExpression'],
 | 
			
		||||
    [0, 'index'],
 | 
			
		||||
@ -364,8 +361,7 @@ export function loftSketches(
 | 
			
		||||
  const pathToNode: PathToNode = [
 | 
			
		||||
    ['body', ''],
 | 
			
		||||
    [modifiedAst.body.length - 1, 'index'],
 | 
			
		||||
    ['declarations', 'VariableDeclaration'],
 | 
			
		||||
    ['0', 'index'],
 | 
			
		||||
    ['declaration', 'VariableDeclaration'],
 | 
			
		||||
    ['init', 'VariableDeclarator'],
 | 
			
		||||
    ['arguments', 'CallExpression'],
 | 
			
		||||
    [0, 'index'],
 | 
			
		||||
@ -460,8 +456,7 @@ export function revolveSketch(
 | 
			
		||||
  const pathToRevolveArg: PathToNode = [
 | 
			
		||||
    ['body', ''],
 | 
			
		||||
    [sketchIndexInBody + 1, 'index'],
 | 
			
		||||
    ['declarations', 'VariableDeclaration'],
 | 
			
		||||
    [0, 'index'],
 | 
			
		||||
    ['declaration', 'VariableDeclaration'],
 | 
			
		||||
    ['init', 'VariableDeclarator'],
 | 
			
		||||
    ['arguments', 'CallExpression'],
 | 
			
		||||
    [0, 'index'],
 | 
			
		||||
@ -547,8 +542,7 @@ export function sketchOnExtrudedFace(
 | 
			
		||||
  const newpathToNode: PathToNode = [
 | 
			
		||||
    ['body', ''],
 | 
			
		||||
    [expressionIndex + 1, 'index'],
 | 
			
		||||
    ['declarations', 'VariableDeclaration'],
 | 
			
		||||
    [0, 'index'],
 | 
			
		||||
    ['declaration', 'VariableDeclaration'],
 | 
			
		||||
    ['init', 'VariableDeclarator'],
 | 
			
		||||
  ]
 | 
			
		||||
 | 
			
		||||
@ -585,8 +579,7 @@ export function addOffsetPlane({
 | 
			
		||||
  const pathToNode: PathToNode = [
 | 
			
		||||
    ['body', ''],
 | 
			
		||||
    [modifiedAst.body.length - 1, 'index'],
 | 
			
		||||
    ['declarations', 'VariableDeclaration'],
 | 
			
		||||
    ['0', 'index'],
 | 
			
		||||
    ['declaration', 'VariableDeclaration'],
 | 
			
		||||
    ['init', 'VariableDeclarator'],
 | 
			
		||||
    ['arguments', 'CallExpression'],
 | 
			
		||||
    [0, 'index'],
 | 
			
		||||
@ -823,17 +816,15 @@ export function createVariableDeclaration(
 | 
			
		||||
    end: 0,
 | 
			
		||||
    moduleId: 0,
 | 
			
		||||
 | 
			
		||||
    declarations: [
 | 
			
		||||
      {
 | 
			
		||||
        type: 'VariableDeclarator',
 | 
			
		||||
        start: 0,
 | 
			
		||||
        end: 0,
 | 
			
		||||
        moduleId: 0,
 | 
			
		||||
    declaration: {
 | 
			
		||||
      type: 'VariableDeclarator',
 | 
			
		||||
      start: 0,
 | 
			
		||||
      end: 0,
 | 
			
		||||
      moduleId: 0,
 | 
			
		||||
 | 
			
		||||
        id: createIdentifier(varName),
 | 
			
		||||
        init,
 | 
			
		||||
      },
 | 
			
		||||
    ],
 | 
			
		||||
      id: createIdentifier(varName),
 | 
			
		||||
      init,
 | 
			
		||||
    },
 | 
			
		||||
    visibility,
 | 
			
		||||
    kind,
 | 
			
		||||
  }
 | 
			
		||||
@ -1120,7 +1111,7 @@ export async function deleteFromSelection(
 | 
			
		||||
    traverse(astClone, {
 | 
			
		||||
      enter: (node, path) => {
 | 
			
		||||
        if (node.type === 'VariableDeclaration') {
 | 
			
		||||
          const dec = node.declarations[0]
 | 
			
		||||
          const dec = node.declaration
 | 
			
		||||
          if (
 | 
			
		||||
            dec.init.type === 'CallExpression' &&
 | 
			
		||||
            (dec.init.callee.name === 'extrude' ||
 | 
			
		||||
@ -1155,7 +1146,7 @@ export async function deleteFromSelection(
 | 
			
		||||
            enter: (node, path) => {
 | 
			
		||||
              ;(async () => {
 | 
			
		||||
                if (node.type === 'VariableDeclaration') {
 | 
			
		||||
                  currentVariableName = node.declarations[0].id.name
 | 
			
		||||
                  currentVariableName = node.declaration.id.name
 | 
			
		||||
                }
 | 
			
		||||
                if (
 | 
			
		||||
                  // match startSketchOn(${extrudeNameToDelete})
 | 
			
		||||
 | 
			
		||||
@ -273,7 +273,7 @@ export function getPathToExtrudeForSegmentSelection(
 | 
			
		||||
    'VariableDeclaration'
 | 
			
		||||
  )
 | 
			
		||||
  if (err(varDecNode)) return varDecNode
 | 
			
		||||
  const sketchVar = varDecNode.node.declarations[0].id.name
 | 
			
		||||
  const sketchVar = varDecNode.node.declaration.id.name
 | 
			
		||||
 | 
			
		||||
  const sketch = sketchFromKclValue(
 | 
			
		||||
    kclManager.programMemory.get(sketchVar),
 | 
			
		||||
@ -367,7 +367,7 @@ function locateExtrudeDeclarator(
 | 
			
		||||
  if (err(nodeOfExtrudeCall)) return nodeOfExtrudeCall
 | 
			
		||||
 | 
			
		||||
  const { node: extrudeVarDecl } = nodeOfExtrudeCall
 | 
			
		||||
  const extrudeDeclarator = extrudeVarDecl.declarations[0]
 | 
			
		||||
  const extrudeDeclarator = extrudeVarDecl.declaration
 | 
			
		||||
  if (!extrudeDeclarator) {
 | 
			
		||||
    return new Error('Extrude Declarator not found.')
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -230,8 +230,7 @@ describe('testing getNodePathFromSourceRange', () => {
 | 
			
		||||
    expect(result).toEqual([
 | 
			
		||||
      ['body', ''],
 | 
			
		||||
      [0, 'index'],
 | 
			
		||||
      ['declarations', 'VariableDeclaration'],
 | 
			
		||||
      [0, 'index'],
 | 
			
		||||
      ['declaration', 'VariableDeclaration'],
 | 
			
		||||
      ['init', ''],
 | 
			
		||||
      ['body', 'PipeExpression'],
 | 
			
		||||
      [2, 'index'],
 | 
			
		||||
@ -250,8 +249,7 @@ describe('testing getNodePathFromSourceRange', () => {
 | 
			
		||||
    const expected = [
 | 
			
		||||
      ['body', ''],
 | 
			
		||||
      [0, 'index'],
 | 
			
		||||
      ['declarations', 'VariableDeclaration'],
 | 
			
		||||
      [0, 'index'],
 | 
			
		||||
      ['declaration', 'VariableDeclaration'],
 | 
			
		||||
      ['init', ''],
 | 
			
		||||
      ['body', 'PipeExpression'],
 | 
			
		||||
      [3, 'index'],
 | 
			
		||||
@ -293,8 +291,7 @@ describe('testing getNodePathFromSourceRange', () => {
 | 
			
		||||
    expect(result).toEqual([
 | 
			
		||||
      ['body', ''],
 | 
			
		||||
      [1, 'index'],
 | 
			
		||||
      ['declarations', 'VariableDeclaration'],
 | 
			
		||||
      [0, 'index'],
 | 
			
		||||
      ['declaration', 'VariableDeclaration'],
 | 
			
		||||
      ['init', ''],
 | 
			
		||||
      ['cond', 'IfExpression'],
 | 
			
		||||
      ['left', 'BinaryExpression'],
 | 
			
		||||
@ -324,8 +321,7 @@ describe('testing getNodePathFromSourceRange', () => {
 | 
			
		||||
    expect(result).toEqual([
 | 
			
		||||
      ['body', ''],
 | 
			
		||||
      [1, 'index'],
 | 
			
		||||
      ['declarations', 'VariableDeclaration'],
 | 
			
		||||
      [0, 'index'],
 | 
			
		||||
      ['declaration', 'VariableDeclaration'],
 | 
			
		||||
      ['init', ''],
 | 
			
		||||
      ['then_val', 'IfExpression'],
 | 
			
		||||
      ['body', 'IfExpression'],
 | 
			
		||||
@ -353,7 +349,8 @@ describe('testing getNodePathFromSourceRange', () => {
 | 
			
		||||
    expect(result).toEqual([
 | 
			
		||||
      ['body', ''],
 | 
			
		||||
      [0, 'index'],
 | 
			
		||||
      ['items', 'ImportStatement'],
 | 
			
		||||
      ['selector', 'ImportStatement'],
 | 
			
		||||
      ['items', 'ImportSelector'],
 | 
			
		||||
      [1, 'index'],
 | 
			
		||||
      ['name', 'ImportItem'],
 | 
			
		||||
    ])
 | 
			
		||||
 | 
			
		||||
@ -259,34 +259,26 @@ function moreNodePathFromSourceRange(
 | 
			
		||||
    return moreNodePathFromSourceRange(expression, sourceRange, path)
 | 
			
		||||
  }
 | 
			
		||||
  if (_node.type === 'VariableDeclaration' && isInRange) {
 | 
			
		||||
    const declarations = _node.declarations
 | 
			
		||||
    const declaration = _node.declaration
 | 
			
		||||
 | 
			
		||||
    for (let decIndex = 0; decIndex < declarations.length; decIndex++) {
 | 
			
		||||
      const declaration = declarations[decIndex]
 | 
			
		||||
      if (declaration.start <= start && declaration.end >= end) {
 | 
			
		||||
        path.push(['declarations', 'VariableDeclaration'])
 | 
			
		||||
        path.push([decIndex, 'index'])
 | 
			
		||||
        const init = declaration.init
 | 
			
		||||
        if (init.start <= start && init.end >= end) {
 | 
			
		||||
          path.push(['init', ''])
 | 
			
		||||
          return moreNodePathFromSourceRange(init, sourceRange, path)
 | 
			
		||||
        }
 | 
			
		||||
    if (declaration.start <= start && declaration.end >= end) {
 | 
			
		||||
      path.push(['declaration', 'VariableDeclaration'])
 | 
			
		||||
      const init = declaration.init
 | 
			
		||||
      if (init.start <= start && init.end >= end) {
 | 
			
		||||
        path.push(['init', ''])
 | 
			
		||||
        return moreNodePathFromSourceRange(init, sourceRange, path)
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  if (_node.type === 'VariableDeclaration' && isInRange) {
 | 
			
		||||
    const declarations = _node.declarations
 | 
			
		||||
    const declaration = _node.declaration
 | 
			
		||||
 | 
			
		||||
    for (let decIndex = 0; decIndex < declarations.length; decIndex++) {
 | 
			
		||||
      const declaration = declarations[decIndex]
 | 
			
		||||
      if (declaration.start <= start && declaration.end >= end) {
 | 
			
		||||
        const init = declaration.init
 | 
			
		||||
        if (init.start <= start && init.end >= end) {
 | 
			
		||||
          path.push(['declarations', 'VariableDeclaration'])
 | 
			
		||||
          path.push([decIndex, 'index'])
 | 
			
		||||
          path.push(['init', ''])
 | 
			
		||||
          return moreNodePathFromSourceRange(init, sourceRange, path)
 | 
			
		||||
        }
 | 
			
		||||
    if (declaration.start <= start && declaration.end >= end) {
 | 
			
		||||
      const init = declaration.init
 | 
			
		||||
      if (init.start <= start && init.end >= end) {
 | 
			
		||||
        path.push(['declaration', 'VariableDeclaration'])
 | 
			
		||||
        path.push(['init', ''])
 | 
			
		||||
        return moreNodePathFromSourceRange(init, sourceRange, path)
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    return path
 | 
			
		||||
@ -380,24 +372,31 @@ function moreNodePathFromSourceRange(
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (_node.type === 'ImportStatement' && isInRange) {
 | 
			
		||||
    const { items } = _node
 | 
			
		||||
    for (let i = 0; i < items.length; i++) {
 | 
			
		||||
      const item = items[i]
 | 
			
		||||
      if (item.start <= start && item.end >= end) {
 | 
			
		||||
        path.push(['items', 'ImportStatement'])
 | 
			
		||||
        path.push([i, 'index'])
 | 
			
		||||
        if (item.name.start <= start && item.name.end >= end) {
 | 
			
		||||
          path.push(['name', 'ImportItem'])
 | 
			
		||||
    if (_node.selector && _node.selector.type === 'List') {
 | 
			
		||||
      path.push(['selector', 'ImportStatement'])
 | 
			
		||||
      const { items } = _node.selector
 | 
			
		||||
      for (let i = 0; i < items.length; i++) {
 | 
			
		||||
        const item = items[i]
 | 
			
		||||
        if (item.start <= start && item.end >= end) {
 | 
			
		||||
          path.push(['items', 'ImportSelector'])
 | 
			
		||||
          path.push([i, 'index'])
 | 
			
		||||
          if (item.name.start <= start && item.name.end >= end) {
 | 
			
		||||
            path.push(['name', 'ImportItem'])
 | 
			
		||||
            return path
 | 
			
		||||
          }
 | 
			
		||||
          if (
 | 
			
		||||
            item.alias &&
 | 
			
		||||
            item.alias.start <= start &&
 | 
			
		||||
            item.alias.end >= end
 | 
			
		||||
          ) {
 | 
			
		||||
            path.push(['alias', 'ImportItem'])
 | 
			
		||||
            return path
 | 
			
		||||
          }
 | 
			
		||||
          return path
 | 
			
		||||
        }
 | 
			
		||||
        if (item.alias && item.alias.start <= start && item.alias.end >= end) {
 | 
			
		||||
          path.push(['alias', 'ImportItem'])
 | 
			
		||||
          return path
 | 
			
		||||
        }
 | 
			
		||||
        return path
 | 
			
		||||
      }
 | 
			
		||||
      return path
 | 
			
		||||
    }
 | 
			
		||||
    return path
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  console.error('not implemented: ' + node.type)
 | 
			
		||||
@ -451,13 +450,10 @@ export function traverse(
 | 
			
		||||
    traverse(node, option, pathToNode)
 | 
			
		||||
 | 
			
		||||
  if (_node.type === 'VariableDeclaration') {
 | 
			
		||||
    _node.declarations.forEach((declaration, index) =>
 | 
			
		||||
      _traverse(declaration, [
 | 
			
		||||
        ...pathToNode,
 | 
			
		||||
        ['declarations', 'VariableDeclaration'],
 | 
			
		||||
        [index, 'index'],
 | 
			
		||||
      ])
 | 
			
		||||
    )
 | 
			
		||||
    _traverse(_node.declaration, [
 | 
			
		||||
      ...pathToNode,
 | 
			
		||||
      ['declaration', 'VariableDeclaration'],
 | 
			
		||||
    ])
 | 
			
		||||
  } else if (_node.type === 'VariableDeclarator') {
 | 
			
		||||
    _traverse(_node.init, [...pathToNode, ['init', '']])
 | 
			
		||||
  } else if (_node.type === 'PipeExpression') {
 | 
			
		||||
@ -567,7 +563,7 @@ export function findAllPreviousVariablesPath(
 | 
			
		||||
  const variables: PrevVariable<any>[] = []
 | 
			
		||||
  bodyItems?.forEach?.((item) => {
 | 
			
		||||
    if (item.type !== 'VariableDeclaration' || item.end > startRange) return
 | 
			
		||||
    const varName = item.declarations[0].id.name
 | 
			
		||||
    const varName = item.declaration.id.name
 | 
			
		||||
    const varValue = programMemory?.get(varName)
 | 
			
		||||
    if (!varValue || typeof varValue?.value !== type) return
 | 
			
		||||
    variables.push({
 | 
			
		||||
@ -761,7 +757,7 @@ export function isLinesParallelAndConstrained(
 | 
			
		||||
    const _varDec = getNodeFromPath(ast, primaryPath, 'VariableDeclaration')
 | 
			
		||||
    if (err(_varDec)) return _varDec
 | 
			
		||||
    const varDec = _varDec.node
 | 
			
		||||
    const varName = (varDec as VariableDeclaration)?.declarations[0]?.id?.name
 | 
			
		||||
    const varName = (varDec as VariableDeclaration)?.declaration.id?.name
 | 
			
		||||
    const sg = sketchFromKclValue(programMemory?.get(varName), varName)
 | 
			
		||||
    if (err(sg)) return sg
 | 
			
		||||
    const _primarySegment = getSketchSegmentFromSourceRange(
 | 
			
		||||
@ -881,7 +877,7 @@ export function hasExtrudeSketch({
 | 
			
		||||
  }
 | 
			
		||||
  const varDec = varDecMeta.node
 | 
			
		||||
  if (varDec.type !== 'VariableDeclaration') return false
 | 
			
		||||
  const varName = varDec.declarations[0].id.name
 | 
			
		||||
  const varName = varDec.declaration.id.name
 | 
			
		||||
  const varValue = programMemory?.get(varName)
 | 
			
		||||
  return (
 | 
			
		||||
    varValue?.type === 'Solid' ||
 | 
			
		||||
 | 
			
		||||
@ -164,8 +164,7 @@ mySketch001 = startSketchOn('XY')
 | 
			
		||||
      pathToNode: [
 | 
			
		||||
        ['body', ''],
 | 
			
		||||
        [0, 'index'],
 | 
			
		||||
        ['declarations', 'VariableDeclaration'],
 | 
			
		||||
        [0, 'index'],
 | 
			
		||||
        ['declaration', 'VariableDeclaration'],
 | 
			
		||||
        ['init', 'VariableDeclarator'],
 | 
			
		||||
      ],
 | 
			
		||||
    })
 | 
			
		||||
@ -189,8 +188,7 @@ mySketch001 = startSketchOn('XY')
 | 
			
		||||
      pathToNode: [
 | 
			
		||||
        ['body', ''],
 | 
			
		||||
        [0, 'index'],
 | 
			
		||||
        ['declarations', 'VariableDeclaration'],
 | 
			
		||||
        [0, 'index'],
 | 
			
		||||
        ['declaration', 'VariableDeclaration'],
 | 
			
		||||
        ['init', 'VariableDeclarator'],
 | 
			
		||||
      ],
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
@ -1701,7 +1701,7 @@ export const angledLineThatIntersects: SketchLineHelper = {
 | 
			
		||||
    if (err(nodeMeta2)) return nodeMeta2
 | 
			
		||||
 | 
			
		||||
    const { node: varDec } = nodeMeta2
 | 
			
		||||
    const varName = varDec.declarations[0].id.name
 | 
			
		||||
    const varName = varDec.declaration.id.name
 | 
			
		||||
    const sketch = sketchFromKclValue(
 | 
			
		||||
      previousProgramMemory.get(varName),
 | 
			
		||||
      varName
 | 
			
		||||
 | 
			
		||||
@ -111,12 +111,10 @@ export function isSketchVariablesLinked(
 | 
			
		||||
  let nextVarDec: VariableDeclarator | undefined
 | 
			
		||||
  for (const node of ast.body) {
 | 
			
		||||
    if (node.type !== 'VariableDeclaration') continue
 | 
			
		||||
    const found = node.declarations.find(
 | 
			
		||||
      ({ id }) => id?.name === secondArg.name
 | 
			
		||||
    )
 | 
			
		||||
    if (!found) continue
 | 
			
		||||
    nextVarDec = found
 | 
			
		||||
    break
 | 
			
		||||
    if (node.declaration.id.name === secondArg.name) {
 | 
			
		||||
      nextVarDec = node.declaration
 | 
			
		||||
      break
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  if (!nextVarDec) return false
 | 
			
		||||
  return isSketchVariablesLinked(nextVarDec, primaryVarDec, ast)
 | 
			
		||||
 | 
			
		||||
@ -109,11 +109,11 @@ export function useCalculateKclExpression({
 | 
			
		||||
      const resultDeclaration = ast.body.find(
 | 
			
		||||
        (a) =>
 | 
			
		||||
          a.type === 'VariableDeclaration' &&
 | 
			
		||||
          a.declarations?.[0]?.id?.name === '__result__'
 | 
			
		||||
          a.declaration.id?.name === '__result__'
 | 
			
		||||
      )
 | 
			
		||||
      const init =
 | 
			
		||||
        resultDeclaration?.type === 'VariableDeclaration' &&
 | 
			
		||||
        resultDeclaration?.declarations?.[0]?.init
 | 
			
		||||
        resultDeclaration?.declaration.init
 | 
			
		||||
      const result = execState.memory?.get('__result__')?.value
 | 
			
		||||
      setCalcResult(typeof result === 'number' ? String(result) : 'NAN')
 | 
			
		||||
      init && setValueNode(init)
 | 
			
		||||
 | 
			
		||||
@ -2491,7 +2491,7 @@ export function canRectangleOrCircleTool({
 | 
			
		||||
  // This should not be returning false, and it should be caught
 | 
			
		||||
  // but we need to simulate old behavior to move on.
 | 
			
		||||
  if (err(node)) return false
 | 
			
		||||
  return node.node?.declarations?.[0]?.init.type !== 'PipeExpression'
 | 
			
		||||
  return node.node?.declaration.init.type !== 'PipeExpression'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** If the sketch contains `close` or `circle` stdlib functions it must be closed */
 | 
			
		||||
@ -2508,8 +2508,8 @@ export function isClosedSketch({
 | 
			
		||||
  // This should not be returning false, and it should be caught
 | 
			
		||||
  // but we need to simulate old behavior to move on.
 | 
			
		||||
  if (err(node)) return false
 | 
			
		||||
  if (node.node?.declarations?.[0]?.init.type !== 'PipeExpression') return false
 | 
			
		||||
  return node.node.declarations[0].init.body.some(
 | 
			
		||||
  if (node.node?.declaration.init.type !== 'PipeExpression') return false
 | 
			
		||||
  return node.node.declaration.init.body.some(
 | 
			
		||||
    (node) =>
 | 
			
		||||
      node.type === 'CallExpression' &&
 | 
			
		||||
      (node.callee.name === 'close' || node.callee.name === 'circle')
 | 
			
		||||
 | 
			
		||||
@ -395,10 +395,10 @@ fn do_stdlib_inner(
 | 
			
		||||
        #const_struct
 | 
			
		||||
 | 
			
		||||
        fn #boxed_fn_name_ident(
 | 
			
		||||
            exec_state: &mut crate::executor::ExecState,
 | 
			
		||||
            exec_state: &mut crate::ExecState,
 | 
			
		||||
            args: crate::std::Args,
 | 
			
		||||
        ) -> std::pin::Pin<
 | 
			
		||||
            Box<dyn std::future::Future<Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>> + Send + '_>,
 | 
			
		||||
            Box<dyn std::future::Future<Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>> + Send + '_>,
 | 
			
		||||
        > {
 | 
			
		||||
            Box::pin(#fn_name_ident(exec_state, args))
 | 
			
		||||
        }
 | 
			
		||||
@ -770,12 +770,12 @@ fn generate_code_block_test(fn_name: &str, code_block: &str, index: usize) -> pr
 | 
			
		||||
        #[tokio::test(flavor = "multi_thread")]
 | 
			
		||||
        async fn #test_name_mock() {
 | 
			
		||||
            let program = crate::Program::parse_no_errs(#code_block).unwrap();
 | 
			
		||||
            let ctx = crate::executor::ExecutorContext {
 | 
			
		||||
            let ctx = crate::ExecutorContext {
 | 
			
		||||
                engine: std::sync::Arc::new(Box::new(crate::engine::conn_mock::EngineConnection::new().await.unwrap())),
 | 
			
		||||
                fs: std::sync::Arc::new(crate::fs::FileManager::new()),
 | 
			
		||||
                stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
 | 
			
		||||
                settings: Default::default(),
 | 
			
		||||
                context_type: crate::executor::ContextType::Mock,
 | 
			
		||||
                context_type: crate::execution::ContextType::Mock,
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            ctx.run(program.into(), &mut crate::ExecState::default()).await.unwrap();
 | 
			
		||||
@ -785,7 +785,7 @@ fn generate_code_block_test(fn_name: &str, code_block: &str, index: usize) -> pr
 | 
			
		||||
        async fn #test_name() {
 | 
			
		||||
            let code = #code_block;
 | 
			
		||||
            // Note, `crate` must be kcl_lib
 | 
			
		||||
            let result = crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm).await.unwrap();
 | 
			
		||||
            let result = crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm, None).await.unwrap();
 | 
			
		||||
            twenty_twenty::assert_image(&format!("tests/outputs/{}.png", #output_test_name_str), &result, 0.99);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,7 @@ mod test_examples_someFn {
 | 
			
		||||
    #[tokio::test(flavor = "multi_thread")]
 | 
			
		||||
    async fn test_mock_example_someFn0() {
 | 
			
		||||
        let program = crate::Program::parse_no_errs("someFn()").unwrap();
 | 
			
		||||
        let ctx = crate::executor::ExecutorContext {
 | 
			
		||||
        let ctx = crate::ExecutorContext {
 | 
			
		||||
            engine: std::sync::Arc::new(Box::new(
 | 
			
		||||
                crate::engine::conn_mock::EngineConnection::new()
 | 
			
		||||
                    .await
 | 
			
		||||
@ -12,7 +12,7 @@ mod test_examples_someFn {
 | 
			
		||||
            fs: std::sync::Arc::new(crate::fs::FileManager::new()),
 | 
			
		||||
            stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
 | 
			
		||||
            settings: Default::default(),
 | 
			
		||||
            context_type: crate::executor::ContextType::Mock,
 | 
			
		||||
            context_type: crate::execution::ContextType::Mock,
 | 
			
		||||
        };
 | 
			
		||||
        ctx.run(program.into(), &mut crate::ExecState::default())
 | 
			
		||||
            .await
 | 
			
		||||
@ -22,10 +22,13 @@ mod test_examples_someFn {
 | 
			
		||||
    #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
 | 
			
		||||
    async fn kcl_test_example_someFn0() {
 | 
			
		||||
        let code = "someFn()";
 | 
			
		||||
        let result =
 | 
			
		||||
            crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
 | 
			
		||||
                .await
 | 
			
		||||
                .unwrap();
 | 
			
		||||
        let result = crate::test_server::execute_and_snapshot(
 | 
			
		||||
            code,
 | 
			
		||||
            crate::settings::types::UnitLength::Mm,
 | 
			
		||||
            None,
 | 
			
		||||
        )
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
        twenty_twenty::assert_image(
 | 
			
		||||
            &format!("tests/outputs/{}.png", "serial_test_example_someFn0"),
 | 
			
		||||
            &result,
 | 
			
		||||
@ -44,12 +47,12 @@ pub(crate) struct SomeFn {}
 | 
			
		||||
#[doc = "Std lib function: someFn\nDocs"]
 | 
			
		||||
pub(crate) const SomeFn: SomeFn = SomeFn {};
 | 
			
		||||
fn boxed_someFn(
 | 
			
		||||
    exec_state: &mut crate::executor::ExecState,
 | 
			
		||||
    exec_state: &mut crate::ExecState,
 | 
			
		||||
    args: crate::std::Args,
 | 
			
		||||
) -> std::pin::Pin<
 | 
			
		||||
    Box<
 | 
			
		||||
        dyn std::future::Future<
 | 
			
		||||
                Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>,
 | 
			
		||||
                Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
 | 
			
		||||
            > + Send
 | 
			
		||||
            + '_,
 | 
			
		||||
    >,
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,7 @@ mod test_examples_someFn {
 | 
			
		||||
    #[tokio::test(flavor = "multi_thread")]
 | 
			
		||||
    async fn test_mock_example_someFn0() {
 | 
			
		||||
        let program = crate::Program::parse_no_errs("someFn()").unwrap();
 | 
			
		||||
        let ctx = crate::executor::ExecutorContext {
 | 
			
		||||
        let ctx = crate::ExecutorContext {
 | 
			
		||||
            engine: std::sync::Arc::new(Box::new(
 | 
			
		||||
                crate::engine::conn_mock::EngineConnection::new()
 | 
			
		||||
                    .await
 | 
			
		||||
@ -12,7 +12,7 @@ mod test_examples_someFn {
 | 
			
		||||
            fs: std::sync::Arc::new(crate::fs::FileManager::new()),
 | 
			
		||||
            stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
 | 
			
		||||
            settings: Default::default(),
 | 
			
		||||
            context_type: crate::executor::ContextType::Mock,
 | 
			
		||||
            context_type: crate::execution::ContextType::Mock,
 | 
			
		||||
        };
 | 
			
		||||
        ctx.run(program.into(), &mut crate::ExecState::default())
 | 
			
		||||
            .await
 | 
			
		||||
@ -22,10 +22,13 @@ mod test_examples_someFn {
 | 
			
		||||
    #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
 | 
			
		||||
    async fn kcl_test_example_someFn0() {
 | 
			
		||||
        let code = "someFn()";
 | 
			
		||||
        let result =
 | 
			
		||||
            crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
 | 
			
		||||
                .await
 | 
			
		||||
                .unwrap();
 | 
			
		||||
        let result = crate::test_server::execute_and_snapshot(
 | 
			
		||||
            code,
 | 
			
		||||
            crate::settings::types::UnitLength::Mm,
 | 
			
		||||
            None,
 | 
			
		||||
        )
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
        twenty_twenty::assert_image(
 | 
			
		||||
            &format!("tests/outputs/{}.png", "serial_test_example_someFn0"),
 | 
			
		||||
            &result,
 | 
			
		||||
@ -44,12 +47,12 @@ pub(crate) struct SomeFn {}
 | 
			
		||||
#[doc = "Std lib function: someFn\nDocs"]
 | 
			
		||||
pub(crate) const SomeFn: SomeFn = SomeFn {};
 | 
			
		||||
fn boxed_someFn(
 | 
			
		||||
    exec_state: &mut crate::executor::ExecState,
 | 
			
		||||
    exec_state: &mut crate::ExecState,
 | 
			
		||||
    args: crate::std::Args,
 | 
			
		||||
) -> std::pin::Pin<
 | 
			
		||||
    Box<
 | 
			
		||||
        dyn std::future::Future<
 | 
			
		||||
                Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>,
 | 
			
		||||
                Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
 | 
			
		||||
            > + Send
 | 
			
		||||
            + '_,
 | 
			
		||||
    >,
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@ mod test_examples_show {
 | 
			
		||||
    async fn test_mock_example_show0() {
 | 
			
		||||
        let program =
 | 
			
		||||
            crate::Program::parse_no_errs("This is another code block.\nyes sirrr.\nshow").unwrap();
 | 
			
		||||
        let ctx = crate::executor::ExecutorContext {
 | 
			
		||||
        let ctx = crate::ExecutorContext {
 | 
			
		||||
            engine: std::sync::Arc::new(Box::new(
 | 
			
		||||
                crate::engine::conn_mock::EngineConnection::new()
 | 
			
		||||
                    .await
 | 
			
		||||
@ -13,7 +13,7 @@ mod test_examples_show {
 | 
			
		||||
            fs: std::sync::Arc::new(crate::fs::FileManager::new()),
 | 
			
		||||
            stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
 | 
			
		||||
            settings: Default::default(),
 | 
			
		||||
            context_type: crate::executor::ContextType::Mock,
 | 
			
		||||
            context_type: crate::execution::ContextType::Mock,
 | 
			
		||||
        };
 | 
			
		||||
        ctx.run(program.into(), &mut crate::ExecState::default())
 | 
			
		||||
            .await
 | 
			
		||||
@ -23,10 +23,13 @@ mod test_examples_show {
 | 
			
		||||
    #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
 | 
			
		||||
    async fn kcl_test_example_show0() {
 | 
			
		||||
        let code = "This is another code block.\nyes sirrr.\nshow";
 | 
			
		||||
        let result =
 | 
			
		||||
            crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
 | 
			
		||||
                .await
 | 
			
		||||
                .unwrap();
 | 
			
		||||
        let result = crate::test_server::execute_and_snapshot(
 | 
			
		||||
            code,
 | 
			
		||||
            crate::settings::types::UnitLength::Mm,
 | 
			
		||||
            None,
 | 
			
		||||
        )
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
        twenty_twenty::assert_image(
 | 
			
		||||
            &format!("tests/outputs/{}.png", "serial_test_example_show0"),
 | 
			
		||||
            &result,
 | 
			
		||||
@ -38,7 +41,7 @@ mod test_examples_show {
 | 
			
		||||
    async fn test_mock_example_show1() {
 | 
			
		||||
        let program =
 | 
			
		||||
            crate::Program::parse_no_errs("This is code.\nIt does other shit.\nshow").unwrap();
 | 
			
		||||
        let ctx = crate::executor::ExecutorContext {
 | 
			
		||||
        let ctx = crate::ExecutorContext {
 | 
			
		||||
            engine: std::sync::Arc::new(Box::new(
 | 
			
		||||
                crate::engine::conn_mock::EngineConnection::new()
 | 
			
		||||
                    .await
 | 
			
		||||
@ -47,7 +50,7 @@ mod test_examples_show {
 | 
			
		||||
            fs: std::sync::Arc::new(crate::fs::FileManager::new()),
 | 
			
		||||
            stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
 | 
			
		||||
            settings: Default::default(),
 | 
			
		||||
            context_type: crate::executor::ContextType::Mock,
 | 
			
		||||
            context_type: crate::execution::ContextType::Mock,
 | 
			
		||||
        };
 | 
			
		||||
        ctx.run(program.into(), &mut crate::ExecState::default())
 | 
			
		||||
            .await
 | 
			
		||||
@ -57,10 +60,13 @@ mod test_examples_show {
 | 
			
		||||
    #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
 | 
			
		||||
    async fn kcl_test_example_show1() {
 | 
			
		||||
        let code = "This is code.\nIt does other shit.\nshow";
 | 
			
		||||
        let result =
 | 
			
		||||
            crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
 | 
			
		||||
                .await
 | 
			
		||||
                .unwrap();
 | 
			
		||||
        let result = crate::test_server::execute_and_snapshot(
 | 
			
		||||
            code,
 | 
			
		||||
            crate::settings::types::UnitLength::Mm,
 | 
			
		||||
            None,
 | 
			
		||||
        )
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
        twenty_twenty::assert_image(
 | 
			
		||||
            &format!("tests/outputs/{}.png", "serial_test_example_show1"),
 | 
			
		||||
            &result,
 | 
			
		||||
@ -79,12 +85,12 @@ pub(crate) struct Show {}
 | 
			
		||||
#[doc = "Std lib function: show\nThis is some function.\nIt does shit."]
 | 
			
		||||
pub(crate) const Show: Show = Show {};
 | 
			
		||||
fn boxed_show(
 | 
			
		||||
    exec_state: &mut crate::executor::ExecState,
 | 
			
		||||
    exec_state: &mut crate::ExecState,
 | 
			
		||||
    args: crate::std::Args,
 | 
			
		||||
) -> std::pin::Pin<
 | 
			
		||||
    Box<
 | 
			
		||||
        dyn std::future::Future<
 | 
			
		||||
                Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>,
 | 
			
		||||
                Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
 | 
			
		||||
            > + Send
 | 
			
		||||
            + '_,
 | 
			
		||||
    >,
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@ mod test_examples_show {
 | 
			
		||||
    async fn test_mock_example_show0() {
 | 
			
		||||
        let program =
 | 
			
		||||
            crate::Program::parse_no_errs("This is code.\nIt does other shit.\nshow").unwrap();
 | 
			
		||||
        let ctx = crate::executor::ExecutorContext {
 | 
			
		||||
        let ctx = crate::ExecutorContext {
 | 
			
		||||
            engine: std::sync::Arc::new(Box::new(
 | 
			
		||||
                crate::engine::conn_mock::EngineConnection::new()
 | 
			
		||||
                    .await
 | 
			
		||||
@ -13,7 +13,7 @@ mod test_examples_show {
 | 
			
		||||
            fs: std::sync::Arc::new(crate::fs::FileManager::new()),
 | 
			
		||||
            stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
 | 
			
		||||
            settings: Default::default(),
 | 
			
		||||
            context_type: crate::executor::ContextType::Mock,
 | 
			
		||||
            context_type: crate::execution::ContextType::Mock,
 | 
			
		||||
        };
 | 
			
		||||
        ctx.run(program.into(), &mut crate::ExecState::default())
 | 
			
		||||
            .await
 | 
			
		||||
@ -23,10 +23,13 @@ mod test_examples_show {
 | 
			
		||||
    #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
 | 
			
		||||
    async fn kcl_test_example_show0() {
 | 
			
		||||
        let code = "This is code.\nIt does other shit.\nshow";
 | 
			
		||||
        let result =
 | 
			
		||||
            crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
 | 
			
		||||
                .await
 | 
			
		||||
                .unwrap();
 | 
			
		||||
        let result = crate::test_server::execute_and_snapshot(
 | 
			
		||||
            code,
 | 
			
		||||
            crate::settings::types::UnitLength::Mm,
 | 
			
		||||
            None,
 | 
			
		||||
        )
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
        twenty_twenty::assert_image(
 | 
			
		||||
            &format!("tests/outputs/{}.png", "serial_test_example_show0"),
 | 
			
		||||
            &result,
 | 
			
		||||
@ -45,12 +48,12 @@ pub(crate) struct Show {}
 | 
			
		||||
#[doc = "Std lib function: show\nThis is some function.\nIt does shit."]
 | 
			
		||||
pub(crate) const Show: Show = Show {};
 | 
			
		||||
fn boxed_show(
 | 
			
		||||
    exec_state: &mut crate::executor::ExecState,
 | 
			
		||||
    exec_state: &mut crate::ExecState,
 | 
			
		||||
    args: crate::std::Args,
 | 
			
		||||
) -> std::pin::Pin<
 | 
			
		||||
    Box<
 | 
			
		||||
        dyn std::future::Future<
 | 
			
		||||
                Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>,
 | 
			
		||||
                Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
 | 
			
		||||
            > + Send
 | 
			
		||||
            + '_,
 | 
			
		||||
    >,
 | 
			
		||||
 | 
			
		||||
@ -5,7 +5,7 @@ mod test_examples_my_func {
 | 
			
		||||
        let program =
 | 
			
		||||
            crate::Program::parse_no_errs("This is another code block.\nyes sirrr.\nmyFunc")
 | 
			
		||||
                .unwrap();
 | 
			
		||||
        let ctx = crate::executor::ExecutorContext {
 | 
			
		||||
        let ctx = crate::ExecutorContext {
 | 
			
		||||
            engine: std::sync::Arc::new(Box::new(
 | 
			
		||||
                crate::engine::conn_mock::EngineConnection::new()
 | 
			
		||||
                    .await
 | 
			
		||||
@ -14,7 +14,7 @@ mod test_examples_my_func {
 | 
			
		||||
            fs: std::sync::Arc::new(crate::fs::FileManager::new()),
 | 
			
		||||
            stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
 | 
			
		||||
            settings: Default::default(),
 | 
			
		||||
            context_type: crate::executor::ContextType::Mock,
 | 
			
		||||
            context_type: crate::execution::ContextType::Mock,
 | 
			
		||||
        };
 | 
			
		||||
        ctx.run(program.into(), &mut crate::ExecState::default())
 | 
			
		||||
            .await
 | 
			
		||||
@ -24,10 +24,13 @@ mod test_examples_my_func {
 | 
			
		||||
    #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
 | 
			
		||||
    async fn kcl_test_example_my_func0() {
 | 
			
		||||
        let code = "This is another code block.\nyes sirrr.\nmyFunc";
 | 
			
		||||
        let result =
 | 
			
		||||
            crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
 | 
			
		||||
                .await
 | 
			
		||||
                .unwrap();
 | 
			
		||||
        let result = crate::test_server::execute_and_snapshot(
 | 
			
		||||
            code,
 | 
			
		||||
            crate::settings::types::UnitLength::Mm,
 | 
			
		||||
            None,
 | 
			
		||||
        )
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
        twenty_twenty::assert_image(
 | 
			
		||||
            &format!("tests/outputs/{}.png", "serial_test_example_my_func0"),
 | 
			
		||||
            &result,
 | 
			
		||||
@ -39,7 +42,7 @@ mod test_examples_my_func {
 | 
			
		||||
    async fn test_mock_example_my_func1() {
 | 
			
		||||
        let program =
 | 
			
		||||
            crate::Program::parse_no_errs("This is code.\nIt does other shit.\nmyFunc").unwrap();
 | 
			
		||||
        let ctx = crate::executor::ExecutorContext {
 | 
			
		||||
        let ctx = crate::ExecutorContext {
 | 
			
		||||
            engine: std::sync::Arc::new(Box::new(
 | 
			
		||||
                crate::engine::conn_mock::EngineConnection::new()
 | 
			
		||||
                    .await
 | 
			
		||||
@ -48,7 +51,7 @@ mod test_examples_my_func {
 | 
			
		||||
            fs: std::sync::Arc::new(crate::fs::FileManager::new()),
 | 
			
		||||
            stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
 | 
			
		||||
            settings: Default::default(),
 | 
			
		||||
            context_type: crate::executor::ContextType::Mock,
 | 
			
		||||
            context_type: crate::execution::ContextType::Mock,
 | 
			
		||||
        };
 | 
			
		||||
        ctx.run(program.into(), &mut crate::ExecState::default())
 | 
			
		||||
            .await
 | 
			
		||||
@ -58,10 +61,13 @@ mod test_examples_my_func {
 | 
			
		||||
    #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
 | 
			
		||||
    async fn kcl_test_example_my_func1() {
 | 
			
		||||
        let code = "This is code.\nIt does other shit.\nmyFunc";
 | 
			
		||||
        let result =
 | 
			
		||||
            crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
 | 
			
		||||
                .await
 | 
			
		||||
                .unwrap();
 | 
			
		||||
        let result = crate::test_server::execute_and_snapshot(
 | 
			
		||||
            code,
 | 
			
		||||
            crate::settings::types::UnitLength::Mm,
 | 
			
		||||
            None,
 | 
			
		||||
        )
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
        twenty_twenty::assert_image(
 | 
			
		||||
            &format!("tests/outputs/{}.png", "serial_test_example_my_func1"),
 | 
			
		||||
            &result,
 | 
			
		||||
@ -80,12 +86,12 @@ pub(crate) struct MyFunc {}
 | 
			
		||||
#[doc = "Std lib function: myFunc\nThis is some function.\nIt does shit."]
 | 
			
		||||
pub(crate) const MyFunc: MyFunc = MyFunc {};
 | 
			
		||||
fn boxed_my_func(
 | 
			
		||||
    exec_state: &mut crate::executor::ExecState,
 | 
			
		||||
    exec_state: &mut crate::ExecState,
 | 
			
		||||
    args: crate::std::Args,
 | 
			
		||||
) -> std::pin::Pin<
 | 
			
		||||
    Box<
 | 
			
		||||
        dyn std::future::Future<
 | 
			
		||||
                Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>,
 | 
			
		||||
                Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
 | 
			
		||||
            > + Send
 | 
			
		||||
            + '_,
 | 
			
		||||
    >,
 | 
			
		||||
 | 
			
		||||
@ -5,7 +5,7 @@ mod test_examples_line_to {
 | 
			
		||||
        let program =
 | 
			
		||||
            crate::Program::parse_no_errs("This is another code block.\nyes sirrr.\nlineTo")
 | 
			
		||||
                .unwrap();
 | 
			
		||||
        let ctx = crate::executor::ExecutorContext {
 | 
			
		||||
        let ctx = crate::ExecutorContext {
 | 
			
		||||
            engine: std::sync::Arc::new(Box::new(
 | 
			
		||||
                crate::engine::conn_mock::EngineConnection::new()
 | 
			
		||||
                    .await
 | 
			
		||||
@ -14,7 +14,7 @@ mod test_examples_line_to {
 | 
			
		||||
            fs: std::sync::Arc::new(crate::fs::FileManager::new()),
 | 
			
		||||
            stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
 | 
			
		||||
            settings: Default::default(),
 | 
			
		||||
            context_type: crate::executor::ContextType::Mock,
 | 
			
		||||
            context_type: crate::execution::ContextType::Mock,
 | 
			
		||||
        };
 | 
			
		||||
        ctx.run(program.into(), &mut crate::ExecState::default())
 | 
			
		||||
            .await
 | 
			
		||||
@ -24,10 +24,13 @@ mod test_examples_line_to {
 | 
			
		||||
    #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
 | 
			
		||||
    async fn kcl_test_example_line_to0() {
 | 
			
		||||
        let code = "This is another code block.\nyes sirrr.\nlineTo";
 | 
			
		||||
        let result =
 | 
			
		||||
            crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
 | 
			
		||||
                .await
 | 
			
		||||
                .unwrap();
 | 
			
		||||
        let result = crate::test_server::execute_and_snapshot(
 | 
			
		||||
            code,
 | 
			
		||||
            crate::settings::types::UnitLength::Mm,
 | 
			
		||||
            None,
 | 
			
		||||
        )
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
        twenty_twenty::assert_image(
 | 
			
		||||
            &format!("tests/outputs/{}.png", "serial_test_example_line_to0"),
 | 
			
		||||
            &result,
 | 
			
		||||
@ -39,7 +42,7 @@ mod test_examples_line_to {
 | 
			
		||||
    async fn test_mock_example_line_to1() {
 | 
			
		||||
        let program =
 | 
			
		||||
            crate::Program::parse_no_errs("This is code.\nIt does other shit.\nlineTo").unwrap();
 | 
			
		||||
        let ctx = crate::executor::ExecutorContext {
 | 
			
		||||
        let ctx = crate::ExecutorContext {
 | 
			
		||||
            engine: std::sync::Arc::new(Box::new(
 | 
			
		||||
                crate::engine::conn_mock::EngineConnection::new()
 | 
			
		||||
                    .await
 | 
			
		||||
@ -48,7 +51,7 @@ mod test_examples_line_to {
 | 
			
		||||
            fs: std::sync::Arc::new(crate::fs::FileManager::new()),
 | 
			
		||||
            stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
 | 
			
		||||
            settings: Default::default(),
 | 
			
		||||
            context_type: crate::executor::ContextType::Mock,
 | 
			
		||||
            context_type: crate::execution::ContextType::Mock,
 | 
			
		||||
        };
 | 
			
		||||
        ctx.run(program.into(), &mut crate::ExecState::default())
 | 
			
		||||
            .await
 | 
			
		||||
@ -58,10 +61,13 @@ mod test_examples_line_to {
 | 
			
		||||
    #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
 | 
			
		||||
    async fn kcl_test_example_line_to1() {
 | 
			
		||||
        let code = "This is code.\nIt does other shit.\nlineTo";
 | 
			
		||||
        let result =
 | 
			
		||||
            crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
 | 
			
		||||
                .await
 | 
			
		||||
                .unwrap();
 | 
			
		||||
        let result = crate::test_server::execute_and_snapshot(
 | 
			
		||||
            code,
 | 
			
		||||
            crate::settings::types::UnitLength::Mm,
 | 
			
		||||
            None,
 | 
			
		||||
        )
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
        twenty_twenty::assert_image(
 | 
			
		||||
            &format!("tests/outputs/{}.png", "serial_test_example_line_to1"),
 | 
			
		||||
            &result,
 | 
			
		||||
@ -80,12 +86,12 @@ pub(crate) struct LineTo {}
 | 
			
		||||
#[doc = "Std lib function: lineTo\nThis is some function.\nIt does shit."]
 | 
			
		||||
pub(crate) const LineTo: LineTo = LineTo {};
 | 
			
		||||
fn boxed_line_to(
 | 
			
		||||
    exec_state: &mut crate::executor::ExecState,
 | 
			
		||||
    exec_state: &mut crate::ExecState,
 | 
			
		||||
    args: crate::std::Args,
 | 
			
		||||
) -> std::pin::Pin<
 | 
			
		||||
    Box<
 | 
			
		||||
        dyn std::future::Future<
 | 
			
		||||
                Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>,
 | 
			
		||||
                Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
 | 
			
		||||
            > + Send
 | 
			
		||||
            + '_,
 | 
			
		||||
    >,
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@ mod test_examples_min {
 | 
			
		||||
    async fn test_mock_example_min0() {
 | 
			
		||||
        let program =
 | 
			
		||||
            crate::Program::parse_no_errs("This is another code block.\nyes sirrr.\nmin").unwrap();
 | 
			
		||||
        let ctx = crate::executor::ExecutorContext {
 | 
			
		||||
        let ctx = crate::ExecutorContext {
 | 
			
		||||
            engine: std::sync::Arc::new(Box::new(
 | 
			
		||||
                crate::engine::conn_mock::EngineConnection::new()
 | 
			
		||||
                    .await
 | 
			
		||||
@ -13,7 +13,7 @@ mod test_examples_min {
 | 
			
		||||
            fs: std::sync::Arc::new(crate::fs::FileManager::new()),
 | 
			
		||||
            stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
 | 
			
		||||
            settings: Default::default(),
 | 
			
		||||
            context_type: crate::executor::ContextType::Mock,
 | 
			
		||||
            context_type: crate::execution::ContextType::Mock,
 | 
			
		||||
        };
 | 
			
		||||
        ctx.run(program.into(), &mut crate::ExecState::default())
 | 
			
		||||
            .await
 | 
			
		||||
@ -23,10 +23,13 @@ mod test_examples_min {
 | 
			
		||||
    #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
 | 
			
		||||
    async fn kcl_test_example_min0() {
 | 
			
		||||
        let code = "This is another code block.\nyes sirrr.\nmin";
 | 
			
		||||
        let result =
 | 
			
		||||
            crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
 | 
			
		||||
                .await
 | 
			
		||||
                .unwrap();
 | 
			
		||||
        let result = crate::test_server::execute_and_snapshot(
 | 
			
		||||
            code,
 | 
			
		||||
            crate::settings::types::UnitLength::Mm,
 | 
			
		||||
            None,
 | 
			
		||||
        )
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
        twenty_twenty::assert_image(
 | 
			
		||||
            &format!("tests/outputs/{}.png", "serial_test_example_min0"),
 | 
			
		||||
            &result,
 | 
			
		||||
@ -38,7 +41,7 @@ mod test_examples_min {
 | 
			
		||||
    async fn test_mock_example_min1() {
 | 
			
		||||
        let program =
 | 
			
		||||
            crate::Program::parse_no_errs("This is code.\nIt does other shit.\nmin").unwrap();
 | 
			
		||||
        let ctx = crate::executor::ExecutorContext {
 | 
			
		||||
        let ctx = crate::ExecutorContext {
 | 
			
		||||
            engine: std::sync::Arc::new(Box::new(
 | 
			
		||||
                crate::engine::conn_mock::EngineConnection::new()
 | 
			
		||||
                    .await
 | 
			
		||||
@ -47,7 +50,7 @@ mod test_examples_min {
 | 
			
		||||
            fs: std::sync::Arc::new(crate::fs::FileManager::new()),
 | 
			
		||||
            stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
 | 
			
		||||
            settings: Default::default(),
 | 
			
		||||
            context_type: crate::executor::ContextType::Mock,
 | 
			
		||||
            context_type: crate::execution::ContextType::Mock,
 | 
			
		||||
        };
 | 
			
		||||
        ctx.run(program.into(), &mut crate::ExecState::default())
 | 
			
		||||
            .await
 | 
			
		||||
@ -57,10 +60,13 @@ mod test_examples_min {
 | 
			
		||||
    #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
 | 
			
		||||
    async fn kcl_test_example_min1() {
 | 
			
		||||
        let code = "This is code.\nIt does other shit.\nmin";
 | 
			
		||||
        let result =
 | 
			
		||||
            crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
 | 
			
		||||
                .await
 | 
			
		||||
                .unwrap();
 | 
			
		||||
        let result = crate::test_server::execute_and_snapshot(
 | 
			
		||||
            code,
 | 
			
		||||
            crate::settings::types::UnitLength::Mm,
 | 
			
		||||
            None,
 | 
			
		||||
        )
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
        twenty_twenty::assert_image(
 | 
			
		||||
            &format!("tests/outputs/{}.png", "serial_test_example_min1"),
 | 
			
		||||
            &result,
 | 
			
		||||
@ -79,12 +85,12 @@ pub(crate) struct Min {}
 | 
			
		||||
#[doc = "Std lib function: min\nThis is some function.\nIt does shit."]
 | 
			
		||||
pub(crate) const Min: Min = Min {};
 | 
			
		||||
fn boxed_min(
 | 
			
		||||
    exec_state: &mut crate::executor::ExecState,
 | 
			
		||||
    exec_state: &mut crate::ExecState,
 | 
			
		||||
    args: crate::std::Args,
 | 
			
		||||
) -> std::pin::Pin<
 | 
			
		||||
    Box<
 | 
			
		||||
        dyn std::future::Future<
 | 
			
		||||
                Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>,
 | 
			
		||||
                Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
 | 
			
		||||
            > + Send
 | 
			
		||||
            + '_,
 | 
			
		||||
    >,
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@ mod test_examples_show {
 | 
			
		||||
    async fn test_mock_example_show0() {
 | 
			
		||||
        let program =
 | 
			
		||||
            crate::Program::parse_no_errs("This is code.\nIt does other shit.\nshow").unwrap();
 | 
			
		||||
        let ctx = crate::executor::ExecutorContext {
 | 
			
		||||
        let ctx = crate::ExecutorContext {
 | 
			
		||||
            engine: std::sync::Arc::new(Box::new(
 | 
			
		||||
                crate::engine::conn_mock::EngineConnection::new()
 | 
			
		||||
                    .await
 | 
			
		||||
@ -13,7 +13,7 @@ mod test_examples_show {
 | 
			
		||||
            fs: std::sync::Arc::new(crate::fs::FileManager::new()),
 | 
			
		||||
            stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
 | 
			
		||||
            settings: Default::default(),
 | 
			
		||||
            context_type: crate::executor::ContextType::Mock,
 | 
			
		||||
            context_type: crate::execution::ContextType::Mock,
 | 
			
		||||
        };
 | 
			
		||||
        ctx.run(program.into(), &mut crate::ExecState::default())
 | 
			
		||||
            .await
 | 
			
		||||
@ -23,10 +23,13 @@ mod test_examples_show {
 | 
			
		||||
    #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
 | 
			
		||||
    async fn kcl_test_example_show0() {
 | 
			
		||||
        let code = "This is code.\nIt does other shit.\nshow";
 | 
			
		||||
        let result =
 | 
			
		||||
            crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
 | 
			
		||||
                .await
 | 
			
		||||
                .unwrap();
 | 
			
		||||
        let result = crate::test_server::execute_and_snapshot(
 | 
			
		||||
            code,
 | 
			
		||||
            crate::settings::types::UnitLength::Mm,
 | 
			
		||||
            None,
 | 
			
		||||
        )
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
        twenty_twenty::assert_image(
 | 
			
		||||
            &format!("tests/outputs/{}.png", "serial_test_example_show0"),
 | 
			
		||||
            &result,
 | 
			
		||||
@ -45,12 +48,12 @@ pub(crate) struct Show {}
 | 
			
		||||
#[doc = "Std lib function: show\nThis is some function.\nIt does shit."]
 | 
			
		||||
pub(crate) const Show: Show = Show {};
 | 
			
		||||
fn boxed_show(
 | 
			
		||||
    exec_state: &mut crate::executor::ExecState,
 | 
			
		||||
    exec_state: &mut crate::ExecState,
 | 
			
		||||
    args: crate::std::Args,
 | 
			
		||||
) -> std::pin::Pin<
 | 
			
		||||
    Box<
 | 
			
		||||
        dyn std::future::Future<
 | 
			
		||||
                Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>,
 | 
			
		||||
                Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
 | 
			
		||||
            > + Send
 | 
			
		||||
            + '_,
 | 
			
		||||
    >,
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@ mod test_examples_import {
 | 
			
		||||
    async fn test_mock_example_import0() {
 | 
			
		||||
        let program =
 | 
			
		||||
            crate::Program::parse_no_errs("This is code.\nIt does other shit.\nimport").unwrap();
 | 
			
		||||
        let ctx = crate::executor::ExecutorContext {
 | 
			
		||||
        let ctx = crate::ExecutorContext {
 | 
			
		||||
            engine: std::sync::Arc::new(Box::new(
 | 
			
		||||
                crate::engine::conn_mock::EngineConnection::new()
 | 
			
		||||
                    .await
 | 
			
		||||
@ -13,7 +13,7 @@ mod test_examples_import {
 | 
			
		||||
            fs: std::sync::Arc::new(crate::fs::FileManager::new()),
 | 
			
		||||
            stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
 | 
			
		||||
            settings: Default::default(),
 | 
			
		||||
            context_type: crate::executor::ContextType::Mock,
 | 
			
		||||
            context_type: crate::execution::ContextType::Mock,
 | 
			
		||||
        };
 | 
			
		||||
        ctx.run(program.into(), &mut crate::ExecState::default())
 | 
			
		||||
            .await
 | 
			
		||||
@ -23,10 +23,13 @@ mod test_examples_import {
 | 
			
		||||
    #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
 | 
			
		||||
    async fn kcl_test_example_import0() {
 | 
			
		||||
        let code = "This is code.\nIt does other shit.\nimport";
 | 
			
		||||
        let result =
 | 
			
		||||
            crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
 | 
			
		||||
                .await
 | 
			
		||||
                .unwrap();
 | 
			
		||||
        let result = crate::test_server::execute_and_snapshot(
 | 
			
		||||
            code,
 | 
			
		||||
            crate::settings::types::UnitLength::Mm,
 | 
			
		||||
            None,
 | 
			
		||||
        )
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
        twenty_twenty::assert_image(
 | 
			
		||||
            &format!("tests/outputs/{}.png", "serial_test_example_import0"),
 | 
			
		||||
            &result,
 | 
			
		||||
@ -45,12 +48,12 @@ pub(crate) struct Import {}
 | 
			
		||||
#[doc = "Std lib function: import\nThis is some function.\nIt does shit."]
 | 
			
		||||
pub(crate) const Import: Import = Import {};
 | 
			
		||||
fn boxed_import(
 | 
			
		||||
    exec_state: &mut crate::executor::ExecState,
 | 
			
		||||
    exec_state: &mut crate::ExecState,
 | 
			
		||||
    args: crate::std::Args,
 | 
			
		||||
) -> std::pin::Pin<
 | 
			
		||||
    Box<
 | 
			
		||||
        dyn std::future::Future<
 | 
			
		||||
                Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>,
 | 
			
		||||
                Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
 | 
			
		||||
            > + Send
 | 
			
		||||
            + '_,
 | 
			
		||||
    >,
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@ mod test_examples_import {
 | 
			
		||||
    async fn test_mock_example_import0() {
 | 
			
		||||
        let program =
 | 
			
		||||
            crate::Program::parse_no_errs("This is code.\nIt does other shit.\nimport").unwrap();
 | 
			
		||||
        let ctx = crate::executor::ExecutorContext {
 | 
			
		||||
        let ctx = crate::ExecutorContext {
 | 
			
		||||
            engine: std::sync::Arc::new(Box::new(
 | 
			
		||||
                crate::engine::conn_mock::EngineConnection::new()
 | 
			
		||||
                    .await
 | 
			
		||||
@ -13,7 +13,7 @@ mod test_examples_import {
 | 
			
		||||
            fs: std::sync::Arc::new(crate::fs::FileManager::new()),
 | 
			
		||||
            stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
 | 
			
		||||
            settings: Default::default(),
 | 
			
		||||
            context_type: crate::executor::ContextType::Mock,
 | 
			
		||||
            context_type: crate::execution::ContextType::Mock,
 | 
			
		||||
        };
 | 
			
		||||
        ctx.run(program.into(), &mut crate::ExecState::default())
 | 
			
		||||
            .await
 | 
			
		||||
@ -23,10 +23,13 @@ mod test_examples_import {
 | 
			
		||||
    #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
 | 
			
		||||
    async fn kcl_test_example_import0() {
 | 
			
		||||
        let code = "This is code.\nIt does other shit.\nimport";
 | 
			
		||||
        let result =
 | 
			
		||||
            crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
 | 
			
		||||
                .await
 | 
			
		||||
                .unwrap();
 | 
			
		||||
        let result = crate::test_server::execute_and_snapshot(
 | 
			
		||||
            code,
 | 
			
		||||
            crate::settings::types::UnitLength::Mm,
 | 
			
		||||
            None,
 | 
			
		||||
        )
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
        twenty_twenty::assert_image(
 | 
			
		||||
            &format!("tests/outputs/{}.png", "serial_test_example_import0"),
 | 
			
		||||
            &result,
 | 
			
		||||
@ -45,12 +48,12 @@ pub(crate) struct Import {}
 | 
			
		||||
#[doc = "Std lib function: import\nThis is some function.\nIt does shit."]
 | 
			
		||||
pub(crate) const Import: Import = Import {};
 | 
			
		||||
fn boxed_import(
 | 
			
		||||
    exec_state: &mut crate::executor::ExecState,
 | 
			
		||||
    exec_state: &mut crate::ExecState,
 | 
			
		||||
    args: crate::std::Args,
 | 
			
		||||
) -> std::pin::Pin<
 | 
			
		||||
    Box<
 | 
			
		||||
        dyn std::future::Future<
 | 
			
		||||
                Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>,
 | 
			
		||||
                Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
 | 
			
		||||
            > + Send
 | 
			
		||||
            + '_,
 | 
			
		||||
    >,
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@ mod test_examples_import {
 | 
			
		||||
    async fn test_mock_example_import0() {
 | 
			
		||||
        let program =
 | 
			
		||||
            crate::Program::parse_no_errs("This is code.\nIt does other shit.\nimport").unwrap();
 | 
			
		||||
        let ctx = crate::executor::ExecutorContext {
 | 
			
		||||
        let ctx = crate::ExecutorContext {
 | 
			
		||||
            engine: std::sync::Arc::new(Box::new(
 | 
			
		||||
                crate::engine::conn_mock::EngineConnection::new()
 | 
			
		||||
                    .await
 | 
			
		||||
@ -13,7 +13,7 @@ mod test_examples_import {
 | 
			
		||||
            fs: std::sync::Arc::new(crate::fs::FileManager::new()),
 | 
			
		||||
            stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
 | 
			
		||||
            settings: Default::default(),
 | 
			
		||||
            context_type: crate::executor::ContextType::Mock,
 | 
			
		||||
            context_type: crate::execution::ContextType::Mock,
 | 
			
		||||
        };
 | 
			
		||||
        ctx.run(program.into(), &mut crate::ExecState::default())
 | 
			
		||||
            .await
 | 
			
		||||
@ -23,10 +23,13 @@ mod test_examples_import {
 | 
			
		||||
    #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
 | 
			
		||||
    async fn kcl_test_example_import0() {
 | 
			
		||||
        let code = "This is code.\nIt does other shit.\nimport";
 | 
			
		||||
        let result =
 | 
			
		||||
            crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
 | 
			
		||||
                .await
 | 
			
		||||
                .unwrap();
 | 
			
		||||
        let result = crate::test_server::execute_and_snapshot(
 | 
			
		||||
            code,
 | 
			
		||||
            crate::settings::types::UnitLength::Mm,
 | 
			
		||||
            None,
 | 
			
		||||
        )
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
        twenty_twenty::assert_image(
 | 
			
		||||
            &format!("tests/outputs/{}.png", "serial_test_example_import0"),
 | 
			
		||||
            &result,
 | 
			
		||||
@ -45,12 +48,12 @@ pub(crate) struct Import {}
 | 
			
		||||
#[doc = "Std lib function: import\nThis is some function.\nIt does shit."]
 | 
			
		||||
pub(crate) const Import: Import = Import {};
 | 
			
		||||
fn boxed_import(
 | 
			
		||||
    exec_state: &mut crate::executor::ExecState,
 | 
			
		||||
    exec_state: &mut crate::ExecState,
 | 
			
		||||
    args: crate::std::Args,
 | 
			
		||||
) -> std::pin::Pin<
 | 
			
		||||
    Box<
 | 
			
		||||
        dyn std::future::Future<
 | 
			
		||||
                Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>,
 | 
			
		||||
                Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
 | 
			
		||||
            > + Send
 | 
			
		||||
            + '_,
 | 
			
		||||
    >,
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@ mod test_examples_show {
 | 
			
		||||
    async fn test_mock_example_show0() {
 | 
			
		||||
        let program =
 | 
			
		||||
            crate::Program::parse_no_errs("This is code.\nIt does other shit.\nshow").unwrap();
 | 
			
		||||
        let ctx = crate::executor::ExecutorContext {
 | 
			
		||||
        let ctx = crate::ExecutorContext {
 | 
			
		||||
            engine: std::sync::Arc::new(Box::new(
 | 
			
		||||
                crate::engine::conn_mock::EngineConnection::new()
 | 
			
		||||
                    .await
 | 
			
		||||
@ -13,7 +13,7 @@ mod test_examples_show {
 | 
			
		||||
            fs: std::sync::Arc::new(crate::fs::FileManager::new()),
 | 
			
		||||
            stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
 | 
			
		||||
            settings: Default::default(),
 | 
			
		||||
            context_type: crate::executor::ContextType::Mock,
 | 
			
		||||
            context_type: crate::execution::ContextType::Mock,
 | 
			
		||||
        };
 | 
			
		||||
        ctx.run(program.into(), &mut crate::ExecState::default())
 | 
			
		||||
            .await
 | 
			
		||||
@ -23,10 +23,13 @@ mod test_examples_show {
 | 
			
		||||
    #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
 | 
			
		||||
    async fn kcl_test_example_show0() {
 | 
			
		||||
        let code = "This is code.\nIt does other shit.\nshow";
 | 
			
		||||
        let result =
 | 
			
		||||
            crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
 | 
			
		||||
                .await
 | 
			
		||||
                .unwrap();
 | 
			
		||||
        let result = crate::test_server::execute_and_snapshot(
 | 
			
		||||
            code,
 | 
			
		||||
            crate::settings::types::UnitLength::Mm,
 | 
			
		||||
            None,
 | 
			
		||||
        )
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
        twenty_twenty::assert_image(
 | 
			
		||||
            &format!("tests/outputs/{}.png", "serial_test_example_show0"),
 | 
			
		||||
            &result,
 | 
			
		||||
@ -45,12 +48,12 @@ pub(crate) struct Show {}
 | 
			
		||||
#[doc = "Std lib function: show\nThis is some function.\nIt does shit."]
 | 
			
		||||
pub(crate) const Show: Show = Show {};
 | 
			
		||||
fn boxed_show(
 | 
			
		||||
    exec_state: &mut crate::executor::ExecState,
 | 
			
		||||
    exec_state: &mut crate::ExecState,
 | 
			
		||||
    args: crate::std::Args,
 | 
			
		||||
) -> std::pin::Pin<
 | 
			
		||||
    Box<
 | 
			
		||||
        dyn std::future::Future<
 | 
			
		||||
                Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>,
 | 
			
		||||
                Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
 | 
			
		||||
            > + Send
 | 
			
		||||
            + '_,
 | 
			
		||||
    >,
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,7 @@ mod test_examples_some_function {
 | 
			
		||||
    #[tokio::test(flavor = "multi_thread")]
 | 
			
		||||
    async fn test_mock_example_some_function0() {
 | 
			
		||||
        let program = crate::Program::parse_no_errs("someFunction()").unwrap();
 | 
			
		||||
        let ctx = crate::executor::ExecutorContext {
 | 
			
		||||
        let ctx = crate::ExecutorContext {
 | 
			
		||||
            engine: std::sync::Arc::new(Box::new(
 | 
			
		||||
                crate::engine::conn_mock::EngineConnection::new()
 | 
			
		||||
                    .await
 | 
			
		||||
@ -12,7 +12,7 @@ mod test_examples_some_function {
 | 
			
		||||
            fs: std::sync::Arc::new(crate::fs::FileManager::new()),
 | 
			
		||||
            stdlib: std::sync::Arc::new(crate::std::StdLib::new()),
 | 
			
		||||
            settings: Default::default(),
 | 
			
		||||
            context_type: crate::executor::ContextType::Mock,
 | 
			
		||||
            context_type: crate::execution::ContextType::Mock,
 | 
			
		||||
        };
 | 
			
		||||
        ctx.run(program.into(), &mut crate::ExecState::default())
 | 
			
		||||
            .await
 | 
			
		||||
@ -22,10 +22,13 @@ mod test_examples_some_function {
 | 
			
		||||
    #[tokio::test(flavor = "multi_thread", worker_threads = 5)]
 | 
			
		||||
    async fn kcl_test_example_some_function0() {
 | 
			
		||||
        let code = "someFunction()";
 | 
			
		||||
        let result =
 | 
			
		||||
            crate::test_server::execute_and_snapshot(code, crate::settings::types::UnitLength::Mm)
 | 
			
		||||
                .await
 | 
			
		||||
                .unwrap();
 | 
			
		||||
        let result = crate::test_server::execute_and_snapshot(
 | 
			
		||||
            code,
 | 
			
		||||
            crate::settings::types::UnitLength::Mm,
 | 
			
		||||
            None,
 | 
			
		||||
        )
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
        twenty_twenty::assert_image(
 | 
			
		||||
            &format!("tests/outputs/{}.png", "serial_test_example_some_function0"),
 | 
			
		||||
            &result,
 | 
			
		||||
@ -44,12 +47,12 @@ pub(crate) struct SomeFunction {}
 | 
			
		||||
#[doc = "Std lib function: someFunction\nDocs"]
 | 
			
		||||
pub(crate) const SomeFunction: SomeFunction = SomeFunction {};
 | 
			
		||||
fn boxed_some_function(
 | 
			
		||||
    exec_state: &mut crate::executor::ExecState,
 | 
			
		||||
    exec_state: &mut crate::ExecState,
 | 
			
		||||
    args: crate::std::Args,
 | 
			
		||||
) -> std::pin::Pin<
 | 
			
		||||
    Box<
 | 
			
		||||
        dyn std::future::Future<
 | 
			
		||||
                Output = anyhow::Result<crate::executor::KclValue, crate::errors::KclError>,
 | 
			
		||||
                Output = anyhow::Result<crate::execution::KclValue, crate::errors::KclError>,
 | 
			
		||||
            > + Send
 | 
			
		||||
            + '_,
 | 
			
		||||
    >,
 | 
			
		||||
 | 
			
		||||
@ -18,7 +18,7 @@ pub fn bench_execute(c: &mut Criterion) {
 | 
			
		||||
            let rt = Runtime::new().unwrap();
 | 
			
		||||
            // Spawn a future onto the runtime
 | 
			
		||||
            b.iter(|| {
 | 
			
		||||
                rt.block_on(test_server::execute_and_snapshot(s, Mm)).unwrap();
 | 
			
		||||
                rt.block_on(test_server::execute_and_snapshot(s, Mm, None)).unwrap();
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
        group.finish();
 | 
			
		||||
@ -38,7 +38,7 @@ pub fn bench_lego(c: &mut Criterion) {
 | 
			
		||||
            let code = LEGO_PROGRAM.replace("{{N}}", &size.to_string());
 | 
			
		||||
            // Spawn a future onto the runtime
 | 
			
		||||
            b.iter(|| {
 | 
			
		||||
                rt.block_on(test_server::execute_and_snapshot(&code, Mm)).unwrap();
 | 
			
		||||
                rt.block_on(test_server::execute_and_snapshot(&code, Mm, None)).unwrap();
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,7 @@ use iai::black_box;
 | 
			
		||||
async fn execute_server_rack_heavy() {
 | 
			
		||||
    let code = SERVER_RACK_HEAVY_PROGRAM;
 | 
			
		||||
    black_box(
 | 
			
		||||
        kcl_lib::test_server::execute_and_snapshot(code, kcl_lib::UnitLength::Mm)
 | 
			
		||||
        kcl_lib::test_server::execute_and_snapshot(code, kcl_lib::UnitLength::Mm, None)
 | 
			
		||||
            .await
 | 
			
		||||
            .unwrap(),
 | 
			
		||||
    );
 | 
			
		||||
@ -12,7 +12,7 @@ async fn execute_server_rack_heavy() {
 | 
			
		||||
async fn execute_server_rack_lite() {
 | 
			
		||||
    let code = SERVER_RACK_LITE_PROGRAM;
 | 
			
		||||
    black_box(
 | 
			
		||||
        kcl_lib::test_server::execute_and_snapshot(code, kcl_lib::UnitLength::Mm)
 | 
			
		||||
        kcl_lib::test_server::execute_and_snapshot(code, kcl_lib::UnitLength::Mm, None)
 | 
			
		||||
            .await
 | 
			
		||||
            .unwrap(),
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
@ -1,3 +0,0 @@
 | 
			
		||||
pub mod cache;
 | 
			
		||||
pub mod modify;
 | 
			
		||||
pub mod types;
 | 
			
		||||
@ -22,7 +22,7 @@ use super::ExecutionKind;
 | 
			
		||||
use crate::{
 | 
			
		||||
    engine::EngineManager,
 | 
			
		||||
    errors::{KclError, KclErrorDetails},
 | 
			
		||||
    executor::{DefaultPlanes, IdGenerator},
 | 
			
		||||
    execution::{DefaultPlanes, IdGenerator},
 | 
			
		||||
    SourceRange,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -20,7 +20,7 @@ use kittycad_modeling_cmds::{self as kcmc};
 | 
			
		||||
use super::ExecutionKind;
 | 
			
		||||
use crate::{
 | 
			
		||||
    errors::KclError,
 | 
			
		||||
    executor::{DefaultPlanes, IdGenerator},
 | 
			
		||||
    execution::{DefaultPlanes, IdGenerator},
 | 
			
		||||
    SourceRange,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -11,7 +11,7 @@ use wasm_bindgen::prelude::*;
 | 
			
		||||
use crate::{
 | 
			
		||||
    engine::ExecutionKind,
 | 
			
		||||
    errors::{KclError, KclErrorDetails},
 | 
			
		||||
    executor::{DefaultPlanes, IdGenerator},
 | 
			
		||||
    execution::{DefaultPlanes, IdGenerator},
 | 
			
		||||
    SourceRange,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -32,7 +32,7 @@ use uuid::Uuid;
 | 
			
		||||
 | 
			
		||||
use crate::{
 | 
			
		||||
    errors::{KclError, KclErrorDetails},
 | 
			
		||||
    executor::{DefaultPlanes, IdGenerator, Point3d},
 | 
			
		||||
    execution::{DefaultPlanes, IdGenerator, Point3d},
 | 
			
		||||
    SourceRange,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -4,11 +4,13 @@ use async_recursion::async_recursion;
 | 
			
		||||
 | 
			
		||||
use crate::{
 | 
			
		||||
    errors::{KclError, KclErrorDetails},
 | 
			
		||||
    executor::{BodyType, ExecState, ExecutorContext, KclValue, Metadata, StatementKind, TagEngineInfo, TagIdentifier},
 | 
			
		||||
    execution::{
 | 
			
		||||
        BodyType, ExecState, ExecutorContext, KclValue, Metadata, StatementKind, TagEngineInfo, TagIdentifier,
 | 
			
		||||
    },
 | 
			
		||||
    parsing::ast::types::{
 | 
			
		||||
        ArrayExpression, ArrayRangeExpression, BinaryExpression, BinaryOperator, BinaryPart, CallExpression,
 | 
			
		||||
        CallExpressionKw, Expr, IfExpression, LiteralIdentifier, LiteralValue, MemberExpression, MemberObject, Node,
 | 
			
		||||
        ObjectExpression, TagDeclarator, UnaryExpression, UnaryOperator,
 | 
			
		||||
        ObjectExpression, PipeExpression, TagDeclarator, UnaryExpression, UnaryOperator,
 | 
			
		||||
    },
 | 
			
		||||
    source_range::SourceRange,
 | 
			
		||||
    std::{args::Arg, FunctionKind},
 | 
			
		||||
@ -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
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -2,7 +2,7 @@ use schemars::JsonSchema;
 | 
			
		||||
 | 
			
		||||
use crate::{
 | 
			
		||||
    errors::KclError,
 | 
			
		||||
    executor::{
 | 
			
		||||
    execution::{
 | 
			
		||||
        call_user_defined_function, ExecState, ExecutorContext, KclValue, MemoryFunction, Metadata, ProgramMemory,
 | 
			
		||||
    },
 | 
			
		||||
    parsing::ast::types::FunctionExpression,
 | 
			
		||||
@ -7,7 +7,7 @@ use serde::{Deserialize, Serialize};
 | 
			
		||||
use crate::{
 | 
			
		||||
    errors::KclErrorDetails,
 | 
			
		||||
    exec::{ProgramMemory, Sketch},
 | 
			
		||||
    executor::{Face, ImportedGeometry, MemoryFunction, Metadata, Plane, SketchSet, Solid, SolidSet, TagIdentifier},
 | 
			
		||||
    execution::{Face, ImportedGeometry, MemoryFunction, Metadata, Plane, SketchSet, Solid, SolidSet, TagIdentifier},
 | 
			
		||||
    parsing::ast::types::{FunctionExpression, KclNone, LiteralValue, TagDeclarator, TagNode},
 | 
			
		||||
    std::{args::Arg, FnAsArg},
 | 
			
		||||
    ExecState, ExecutorContext, KclError, SourceRange,
 | 
			
		||||
@ -262,9 +262,6 @@ impl KclValue {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub(crate) fn is_function(&self) -> bool {
 | 
			
		||||
        matches!(self, KclValue::Function { .. })
 | 
			
		||||
    }
 | 
			
		||||
    /// Put the number into a KCL value.
 | 
			
		||||
    pub const fn from_number(f: f64, meta: Vec<Metadata>) -> Self {
 | 
			
		||||
        Self::Number { value: f, meta }
 | 
			
		||||
@ -496,7 +493,7 @@ impl KclValue {
 | 
			
		||||
            )
 | 
			
		||||
            .await
 | 
			
		||||
        } else {
 | 
			
		||||
            crate::executor::call_user_defined_function(
 | 
			
		||||
            crate::execution::call_user_defined_function(
 | 
			
		||||
                args,
 | 
			
		||||
                closure_memory.as_ref(),
 | 
			
		||||
                expression.as_ref(),
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
//! The executor for the AST.
 | 
			
		||||
 | 
			
		||||
use std::{collections::HashSet, sync::Arc};
 | 
			
		||||
use std::{path::PathBuf, sync::Arc};
 | 
			
		||||
 | 
			
		||||
use anyhow::Result;
 | 
			
		||||
use async_recursion::async_recursion;
 | 
			
		||||
@ -20,14 +20,18 @@ use serde::{Deserialize, Serialize};
 | 
			
		||||
type Point2D = kcmc::shared::Point2d<f64>;
 | 
			
		||||
type Point3D = kcmc::shared::Point3d<f64>;
 | 
			
		||||
 | 
			
		||||
pub use crate::kcl_value::KclValue;
 | 
			
		||||
pub use function_param::FunctionParam;
 | 
			
		||||
pub use kcl_value::{KclObjectFields, KclValue};
 | 
			
		||||
 | 
			
		||||
use crate::{
 | 
			
		||||
    engine::{EngineManager, ExecutionKind},
 | 
			
		||||
    errors::{KclError, KclErrorDetails},
 | 
			
		||||
    fs::{FileManager, FileSystem},
 | 
			
		||||
    parsing::ast::{
 | 
			
		||||
        cache::{get_changed_program, CacheInformation},
 | 
			
		||||
        types::{BodyItem, Expr, FunctionExpression, ItemVisibility, Node, NodeRef, TagDeclarator, TagNode},
 | 
			
		||||
        types::{
 | 
			
		||||
            BodyItem, Expr, FunctionExpression, ImportSelector, ItemVisibility, Node, NodeRef, TagDeclarator, TagNode,
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
    settings::types::UnitLength,
 | 
			
		||||
    source_range::{ModuleId, SourceRange},
 | 
			
		||||
@ -35,6 +39,10 @@ use crate::{
 | 
			
		||||
    ExecError, Program,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
mod exec_ast;
 | 
			
		||||
mod function_param;
 | 
			
		||||
mod kcl_value;
 | 
			
		||||
 | 
			
		||||
/// State for executing a program.
 | 
			
		||||
#[derive(Debug, Default, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
@ -50,7 +58,7 @@ pub struct ExecState {
 | 
			
		||||
    /// expression.  If we're not currently in a pipeline, this will be None.
 | 
			
		||||
    pub pipe_value: Option<KclValue>,
 | 
			
		||||
    /// Identifiers that have been exported from the current module.
 | 
			
		||||
    pub module_exports: HashSet<String>,
 | 
			
		||||
    pub module_exports: Vec<String>,
 | 
			
		||||
    /// The stack of import statements for detecting circular module imports.
 | 
			
		||||
    /// If this is empty, we're not currently executing an import statement.
 | 
			
		||||
    pub import_stack: Vec<std::path::PathBuf>,
 | 
			
		||||
@ -61,7 +69,7 @@ pub struct ExecState {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl ExecState {
 | 
			
		||||
    pub fn add_module(&mut self, path: std::path::PathBuf) -> ModuleId {
 | 
			
		||||
    fn add_module(&mut self, path: std::path::PathBuf) -> ModuleId {
 | 
			
		||||
        // Need to avoid borrowing self in the closure.
 | 
			
		||||
        let new_module_id = ModuleId::from_usize(self.path_to_source_id.len());
 | 
			
		||||
        let mut is_new = false;
 | 
			
		||||
@ -1498,6 +1506,9 @@ pub struct ExecutorSettings {
 | 
			
		||||
    /// Should engine store this for replay?
 | 
			
		||||
    /// If so, under what name?
 | 
			
		||||
    pub replay: Option<String>,
 | 
			
		||||
    /// The directory of the current project.  This is used for resolving import
 | 
			
		||||
    /// paths.  If None is given, the current working directory is used.
 | 
			
		||||
    pub project_directory: Option<PathBuf>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Default for ExecutorSettings {
 | 
			
		||||
@ -1508,6 +1519,7 @@ impl Default for ExecutorSettings {
 | 
			
		||||
            enable_ssao: false,
 | 
			
		||||
            show_grid: false,
 | 
			
		||||
            replay: None,
 | 
			
		||||
            project_directory: None,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1520,6 +1532,7 @@ impl From<crate::settings::types::Configuration> for ExecutorSettings {
 | 
			
		||||
            enable_ssao: config.settings.modeling.enable_ssao.into(),
 | 
			
		||||
            show_grid: config.settings.modeling.show_scale_grid,
 | 
			
		||||
            replay: None,
 | 
			
		||||
            project_directory: None,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1532,6 +1545,7 @@ impl From<crate::settings::types::project::ProjectConfiguration> for ExecutorSet
 | 
			
		||||
            enable_ssao: config.settings.modeling.enable_ssao.into(),
 | 
			
		||||
            show_grid: config.settings.modeling.show_scale_grid,
 | 
			
		||||
            replay: None,
 | 
			
		||||
            project_directory: None,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1544,6 +1558,7 @@ impl From<crate::settings::types::ModelingSettings> for ExecutorSettings {
 | 
			
		||||
            enable_ssao: modeling.enable_ssao.into(),
 | 
			
		||||
            show_grid: modeling.show_scale_grid,
 | 
			
		||||
            replay: None,
 | 
			
		||||
            project_directory: None,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1774,6 +1789,7 @@ impl ExecutorContext {
 | 
			
		||||
                enable_ssao: false,
 | 
			
		||||
                show_grid: false,
 | 
			
		||||
                replay: None,
 | 
			
		||||
                project_directory: None,
 | 
			
		||||
            },
 | 
			
		||||
            None,
 | 
			
		||||
            engine_addr,
 | 
			
		||||
@ -1785,7 +1801,7 @@ impl ExecutorContext {
 | 
			
		||||
    pub async fn reset_scene(
 | 
			
		||||
        &self,
 | 
			
		||||
        exec_state: &mut ExecState,
 | 
			
		||||
        source_range: crate::executor::SourceRange,
 | 
			
		||||
        source_range: crate::execution::SourceRange,
 | 
			
		||||
    ) -> Result<(), KclError> {
 | 
			
		||||
        self.engine
 | 
			
		||||
            .clear_scene(&mut exec_state.id_generator, source_range)
 | 
			
		||||
@ -1850,7 +1866,7 @@ impl ExecutorContext {
 | 
			
		||||
            )
 | 
			
		||||
            .await?;
 | 
			
		||||
 | 
			
		||||
        self.inner_execute(&cache_result.program, exec_state, crate::executor::BodyType::Root)
 | 
			
		||||
        self.inner_execute(&cache_result.program, exec_state, crate::execution::BodyType::Root)
 | 
			
		||||
            .await?;
 | 
			
		||||
        let session_data = self.engine.get_session_data();
 | 
			
		||||
        Ok(session_data)
 | 
			
		||||
@ -1870,91 +1886,66 @@ impl ExecutorContext {
 | 
			
		||||
            match statement {
 | 
			
		||||
                BodyItem::ImportStatement(import_stmt) => {
 | 
			
		||||
                    let source_range = SourceRange::from(import_stmt);
 | 
			
		||||
                    let path = import_stmt.path.clone();
 | 
			
		||||
                    // Empty path is used by the top-level module.
 | 
			
		||||
                    if path.is_empty() {
 | 
			
		||||
                        return Err(KclError::Semantic(KclErrorDetails {
 | 
			
		||||
                            message: "import path cannot be empty".to_owned(),
 | 
			
		||||
                            source_ranges: vec![source_range],
 | 
			
		||||
                        }));
 | 
			
		||||
                    }
 | 
			
		||||
                    let resolved_path = std::path::PathBuf::from(&path);
 | 
			
		||||
                    if exec_state.import_stack.contains(&resolved_path) {
 | 
			
		||||
                        return Err(KclError::ImportCycle(KclErrorDetails {
 | 
			
		||||
                            message: format!(
 | 
			
		||||
                                "circular import of modules is not allowed: {} -> {}",
 | 
			
		||||
                                exec_state
 | 
			
		||||
                                    .import_stack
 | 
			
		||||
                                    .iter()
 | 
			
		||||
                                    .map(|p| p.as_path().to_string_lossy())
 | 
			
		||||
                                    .collect::<Vec<_>>()
 | 
			
		||||
                                    .join(" -> "),
 | 
			
		||||
                                resolved_path.to_string_lossy()
 | 
			
		||||
                            ),
 | 
			
		||||
                            source_ranges: vec![import_stmt.into()],
 | 
			
		||||
                        }));
 | 
			
		||||
                    }
 | 
			
		||||
                    let module_id = exec_state.add_module(resolved_path.clone());
 | 
			
		||||
                    let source = self.fs.read_to_string(&resolved_path, source_range).await?;
 | 
			
		||||
                    // TODO handle parsing errors properly
 | 
			
		||||
                    let program = crate::parsing::parse_str(&source, module_id).parse_errs_as_err()?;
 | 
			
		||||
                    let (module_memory, module_exports) = {
 | 
			
		||||
                        exec_state.import_stack.push(resolved_path.clone());
 | 
			
		||||
                        let original_execution = self.engine.replace_execution_kind(ExecutionKind::Isolated);
 | 
			
		||||
                        let original_memory = std::mem::take(&mut exec_state.memory);
 | 
			
		||||
                        let original_exports = std::mem::take(&mut exec_state.module_exports);
 | 
			
		||||
                        let result = self
 | 
			
		||||
                            .inner_execute(&program, exec_state, crate::executor::BodyType::Root)
 | 
			
		||||
                            .await;
 | 
			
		||||
                        let module_exports = std::mem::replace(&mut exec_state.module_exports, original_exports);
 | 
			
		||||
                        let module_memory = std::mem::replace(&mut exec_state.memory, original_memory);
 | 
			
		||||
                        self.engine.replace_execution_kind(original_execution);
 | 
			
		||||
                        exec_state.import_stack.pop();
 | 
			
		||||
                    let (module_memory, module_exports) =
 | 
			
		||||
                        self.open_module(&import_stmt.path, exec_state, source_range).await?;
 | 
			
		||||
 | 
			
		||||
                        result.map_err(|err| {
 | 
			
		||||
                            if let KclError::ImportCycle(_) = err {
 | 
			
		||||
                                // It was an import cycle.  Keep the original message.
 | 
			
		||||
                                err.override_source_ranges(vec![source_range])
 | 
			
		||||
                            } else {
 | 
			
		||||
                                KclError::Semantic(KclErrorDetails {
 | 
			
		||||
                                    message: format!(
 | 
			
		||||
                                        "Error loading imported file. Open it to view more details. {path}: {}",
 | 
			
		||||
                                        err.message()
 | 
			
		||||
                                    ),
 | 
			
		||||
                                    source_ranges: vec![source_range],
 | 
			
		||||
                                })
 | 
			
		||||
                    match &import_stmt.selector {
 | 
			
		||||
                        ImportSelector::List { items } => {
 | 
			
		||||
                            for import_item in items {
 | 
			
		||||
                                // Extract the item from the module.
 | 
			
		||||
                                let item =
 | 
			
		||||
                                    module_memory
 | 
			
		||||
                                        .get(&import_item.name.name, import_item.into())
 | 
			
		||||
                                        .map_err(|_err| {
 | 
			
		||||
                                            KclError::UndefinedValue(KclErrorDetails {
 | 
			
		||||
                                                message: format!("{} is not defined in module", import_item.name.name),
 | 
			
		||||
                                                source_ranges: vec![SourceRange::from(&import_item.name)],
 | 
			
		||||
                                            })
 | 
			
		||||
                                        })?;
 | 
			
		||||
                                // Check that the item is allowed to be imported.
 | 
			
		||||
                                if !module_exports.contains(&import_item.name.name) {
 | 
			
		||||
                                    return Err(KclError::Semantic(KclErrorDetails {
 | 
			
		||||
                                        message: format!(
 | 
			
		||||
                                            "Cannot import \"{}\" from module because it is not exported. Add \"export\" before the definition to export it.",
 | 
			
		||||
                                            import_item.name.name
 | 
			
		||||
                                        ),
 | 
			
		||||
                                        source_ranges: vec![SourceRange::from(&import_item.name)],
 | 
			
		||||
                                    }));
 | 
			
		||||
                                }
 | 
			
		||||
 | 
			
		||||
                                // Add the item to the current module.
 | 
			
		||||
                                exec_state.memory.add(
 | 
			
		||||
                                    import_item.identifier(),
 | 
			
		||||
                                    item.clone(),
 | 
			
		||||
                                    SourceRange::from(&import_item.name),
 | 
			
		||||
                                )?;
 | 
			
		||||
 | 
			
		||||
                                if let ItemVisibility::Export = import_stmt.visibility {
 | 
			
		||||
                                    exec_state.module_exports.push(import_item.identifier().to_owned());
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                        })?;
 | 
			
		||||
                        }
 | 
			
		||||
                        ImportSelector::Glob(_) => {
 | 
			
		||||
                            for name in module_exports.iter() {
 | 
			
		||||
                                let item = module_memory.get(name, source_range).map_err(|_err| {
 | 
			
		||||
                                    KclError::Internal(KclErrorDetails {
 | 
			
		||||
                                        message: format!("{} is not defined in module (but was exported?)", name),
 | 
			
		||||
                                        source_ranges: vec![source_range],
 | 
			
		||||
                                    })
 | 
			
		||||
                                })?;
 | 
			
		||||
                                exec_state.memory.add(name, item.clone(), source_range)?;
 | 
			
		||||
 | 
			
		||||
                        (module_memory, module_exports)
 | 
			
		||||
                    };
 | 
			
		||||
                    for import_item in &import_stmt.items {
 | 
			
		||||
                        // Extract the item from the module.
 | 
			
		||||
                        let item = module_memory
 | 
			
		||||
                            .get(&import_item.name.name, import_item.into())
 | 
			
		||||
                            .map_err(|_err| {
 | 
			
		||||
                                KclError::UndefinedValue(KclErrorDetails {
 | 
			
		||||
                                    message: format!("{} is not defined in module", import_item.name.name),
 | 
			
		||||
                                    source_ranges: vec![SourceRange::from(&import_item.name)],
 | 
			
		||||
                                })
 | 
			
		||||
                            })?;
 | 
			
		||||
                        // Check that the item is allowed to be imported.
 | 
			
		||||
                        if !module_exports.contains(&import_item.name.name) {
 | 
			
		||||
                                if let ItemVisibility::Export = import_stmt.visibility {
 | 
			
		||||
                                    exec_state.module_exports.push(name.clone());
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                        ImportSelector::None(_) => {
 | 
			
		||||
                            return Err(KclError::Semantic(KclErrorDetails {
 | 
			
		||||
                                message: format!(
 | 
			
		||||
                                    "Cannot import \"{}\" from module because it is not exported. Add \"export\" before the definition to export it.",
 | 
			
		||||
                                    import_item.name.name
 | 
			
		||||
                                ),
 | 
			
		||||
                                source_ranges: vec![SourceRange::from(&import_item.name)],
 | 
			
		||||
                                message: "Importing whole module is not yet implemented, sorry.".to_owned(),
 | 
			
		||||
                                source_ranges: vec![source_range],
 | 
			
		||||
                            }));
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        // Add the item to the current module.
 | 
			
		||||
                        exec_state.memory.add(
 | 
			
		||||
                            import_item.identifier(),
 | 
			
		||||
                            item.clone(),
 | 
			
		||||
                            SourceRange::from(&import_item.name),
 | 
			
		||||
                        )?;
 | 
			
		||||
                    }
 | 
			
		||||
                    last_expr = None;
 | 
			
		||||
                }
 | 
			
		||||
@ -1971,34 +1962,23 @@ impl ExecutorContext {
 | 
			
		||||
                    );
 | 
			
		||||
                }
 | 
			
		||||
                BodyItem::VariableDeclaration(variable_declaration) => {
 | 
			
		||||
                    for declaration in &variable_declaration.declarations {
 | 
			
		||||
                        let var_name = declaration.id.name.to_string();
 | 
			
		||||
                        let source_range = SourceRange::from(&declaration.init);
 | 
			
		||||
                        let metadata = Metadata { source_range };
 | 
			
		||||
                    let var_name = variable_declaration.declaration.id.name.to_string();
 | 
			
		||||
                    let source_range = SourceRange::from(&variable_declaration.declaration.init);
 | 
			
		||||
                    let metadata = Metadata { source_range };
 | 
			
		||||
 | 
			
		||||
                        let memory_item = self
 | 
			
		||||
                            .execute_expr(
 | 
			
		||||
                                &declaration.init,
 | 
			
		||||
                                exec_state,
 | 
			
		||||
                                &metadata,
 | 
			
		||||
                                StatementKind::Declaration { name: &var_name },
 | 
			
		||||
                            )
 | 
			
		||||
                            .await?;
 | 
			
		||||
                        let is_function = memory_item.is_function();
 | 
			
		||||
                        exec_state.memory.add(&var_name, memory_item, source_range)?;
 | 
			
		||||
                        // Track exports.
 | 
			
		||||
                        match variable_declaration.visibility {
 | 
			
		||||
                            ItemVisibility::Export => {
 | 
			
		||||
                                if !is_function {
 | 
			
		||||
                                    return Err(KclError::Semantic(KclErrorDetails {
 | 
			
		||||
                                        message: "Only functions can be exported".to_owned(),
 | 
			
		||||
                                        source_ranges: vec![source_range],
 | 
			
		||||
                                    }));
 | 
			
		||||
                                }
 | 
			
		||||
                                exec_state.module_exports.insert(var_name);
 | 
			
		||||
                            }
 | 
			
		||||
                            ItemVisibility::Default => {}
 | 
			
		||||
                        }
 | 
			
		||||
                    let memory_item = self
 | 
			
		||||
                        .execute_expr(
 | 
			
		||||
                            &variable_declaration.declaration.init,
 | 
			
		||||
                            exec_state,
 | 
			
		||||
                            &metadata,
 | 
			
		||||
                            StatementKind::Declaration { name: &var_name },
 | 
			
		||||
                        )
 | 
			
		||||
                        .await?;
 | 
			
		||||
                    exec_state.memory.add(&var_name, memory_item, source_range)?;
 | 
			
		||||
 | 
			
		||||
                    // Track exports.
 | 
			
		||||
                    if let ItemVisibility::Export = variable_declaration.visibility {
 | 
			
		||||
                        exec_state.module_exports.push(var_name);
 | 
			
		||||
                    }
 | 
			
		||||
                    last_expr = None;
 | 
			
		||||
                }
 | 
			
		||||
@ -2033,6 +2013,68 @@ impl ExecutorContext {
 | 
			
		||||
        Ok(last_expr)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async fn open_module(
 | 
			
		||||
        &self,
 | 
			
		||||
        path: &str,
 | 
			
		||||
        exec_state: &mut ExecState,
 | 
			
		||||
        source_range: SourceRange,
 | 
			
		||||
    ) -> Result<(ProgramMemory, Vec<String>), KclError> {
 | 
			
		||||
        let resolved_path = if let Some(project_dir) = &self.settings.project_directory {
 | 
			
		||||
            project_dir.join(path)
 | 
			
		||||
        } else {
 | 
			
		||||
            std::path::PathBuf::from(&path)
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        if exec_state.import_stack.contains(&resolved_path) {
 | 
			
		||||
            return Err(KclError::ImportCycle(KclErrorDetails {
 | 
			
		||||
                message: format!(
 | 
			
		||||
                    "circular import of modules is not allowed: {} -> {}",
 | 
			
		||||
                    exec_state
 | 
			
		||||
                        .import_stack
 | 
			
		||||
                        .iter()
 | 
			
		||||
                        .map(|p| p.as_path().to_string_lossy())
 | 
			
		||||
                        .collect::<Vec<_>>()
 | 
			
		||||
                        .join(" -> "),
 | 
			
		||||
                    resolved_path.to_string_lossy()
 | 
			
		||||
                ),
 | 
			
		||||
                source_ranges: vec![source_range],
 | 
			
		||||
            }));
 | 
			
		||||
        }
 | 
			
		||||
        let module_id = exec_state.add_module(resolved_path.clone());
 | 
			
		||||
        let source = self.fs.read_to_string(&resolved_path, source_range).await?;
 | 
			
		||||
        // TODO handle parsing errors properly
 | 
			
		||||
        let program = crate::parsing::parse_str(&source, module_id).parse_errs_as_err()?;
 | 
			
		||||
 | 
			
		||||
        exec_state.import_stack.push(resolved_path.clone());
 | 
			
		||||
        let original_execution = self.engine.replace_execution_kind(ExecutionKind::Isolated);
 | 
			
		||||
        let original_memory = std::mem::take(&mut exec_state.memory);
 | 
			
		||||
        let original_exports = std::mem::take(&mut exec_state.module_exports);
 | 
			
		||||
        let result = self
 | 
			
		||||
            .inner_execute(&program, exec_state, crate::execution::BodyType::Root)
 | 
			
		||||
            .await;
 | 
			
		||||
        let module_exports = std::mem::replace(&mut exec_state.module_exports, original_exports);
 | 
			
		||||
        let module_memory = std::mem::replace(&mut exec_state.memory, original_memory);
 | 
			
		||||
        self.engine.replace_execution_kind(original_execution);
 | 
			
		||||
        exec_state.import_stack.pop();
 | 
			
		||||
 | 
			
		||||
        result.map_err(|err| {
 | 
			
		||||
            if let KclError::ImportCycle(_) = err {
 | 
			
		||||
                // It was an import cycle.  Keep the original message.
 | 
			
		||||
                err.override_source_ranges(vec![source_range])
 | 
			
		||||
            } else {
 | 
			
		||||
                KclError::Semantic(KclErrorDetails {
 | 
			
		||||
                    message: format!(
 | 
			
		||||
                        "Error loading imported file. Open it to view more details. {path}: {}",
 | 
			
		||||
                        err.message()
 | 
			
		||||
                    ),
 | 
			
		||||
                    source_ranges: vec![source_range],
 | 
			
		||||
                })
 | 
			
		||||
            }
 | 
			
		||||
        })?;
 | 
			
		||||
 | 
			
		||||
        Ok((module_memory, module_exports))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub async fn execute_expr<'a>(
 | 
			
		||||
        &self,
 | 
			
		||||
        init: &Expr,
 | 
			
		||||
@ -2120,7 +2162,7 @@ impl ExecutorContext {
 | 
			
		||||
        self.engine
 | 
			
		||||
            .send_modeling_cmd(
 | 
			
		||||
                uuid::Uuid::new_v4(),
 | 
			
		||||
                crate::executor::SourceRange::default(),
 | 
			
		||||
                crate::execution::SourceRange::default(),
 | 
			
		||||
                ModelingCmd::from(mcmd::ZoomToFit {
 | 
			
		||||
                    object_ids: Default::default(),
 | 
			
		||||
                    animated: false,
 | 
			
		||||
@ -2134,7 +2176,7 @@ impl ExecutorContext {
 | 
			
		||||
            .engine
 | 
			
		||||
            .send_modeling_cmd(
 | 
			
		||||
                uuid::Uuid::new_v4(),
 | 
			
		||||
                crate::executor::SourceRange::default(),
 | 
			
		||||
                crate::execution::SourceRange::default(),
 | 
			
		||||
                ModelingCmd::from(mcmd::TakeSnapshot {
 | 
			
		||||
                    format: ImageFormat::Png,
 | 
			
		||||
                }),
 | 
			
		||||
@ -60,10 +60,8 @@ mod coredump;
 | 
			
		||||
mod docs;
 | 
			
		||||
mod engine;
 | 
			
		||||
mod errors;
 | 
			
		||||
mod executor;
 | 
			
		||||
mod execution;
 | 
			
		||||
mod fs;
 | 
			
		||||
mod function_param;
 | 
			
		||||
mod kcl_value;
 | 
			
		||||
pub mod lint;
 | 
			
		||||
mod log;
 | 
			
		||||
mod lsp;
 | 
			
		||||
@ -84,7 +82,7 @@ mod wasm;
 | 
			
		||||
pub use coredump::CoreDump;
 | 
			
		||||
pub use engine::{EngineManager, ExecutionKind};
 | 
			
		||||
pub use errors::{CompilationError, ConnectionError, ExecError, KclError};
 | 
			
		||||
pub use executor::{ExecState, ExecutorContext, ExecutorSettings};
 | 
			
		||||
pub use execution::{ExecState, ExecutorContext, ExecutorSettings};
 | 
			
		||||
pub use lsp::{
 | 
			
		||||
    copilot::Backend as CopilotLspBackend,
 | 
			
		||||
    kcl::{Backend as KclLspBackend, Server as KclLspServerSubCommand},
 | 
			
		||||
@ -100,7 +98,7 @@ pub use source_range::{ModuleId, SourceRange};
 | 
			
		||||
// Rather than make executor public and make lots of it pub(crate), just re-export into a new module.
 | 
			
		||||
// Ideally we wouldn't export these things at all, they should only be used for testing.
 | 
			
		||||
pub mod exec {
 | 
			
		||||
    pub use crate::executor::{DefaultPlanes, IdGenerator, KclValue, PlaneType, ProgramMemory, Sketch};
 | 
			
		||||
    pub use crate::execution::{DefaultPlanes, IdGenerator, KclValue, PlaneType, ProgramMemory, Sketch};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[cfg(target_arch = "wasm32")]
 | 
			
		||||
 | 
			
		||||
@ -60,11 +60,7 @@ pub fn lint_variables(decl: Node) -> Result<Vec<Discovered>> {
 | 
			
		||||
        return Ok(vec![]);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    Ok(decl
 | 
			
		||||
        .declarations
 | 
			
		||||
        .iter()
 | 
			
		||||
        .flat_map(|v| lint_lower_camel_case_var(v).unwrap_or_default())
 | 
			
		||||
        .collect())
 | 
			
		||||
    lint_lower_camel_case_var(&decl.declaration)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn lint_object_properties(decl: Node) -> Result<Vec<Discovered>> {
 | 
			
		||||
 | 
			
		||||
@ -19,7 +19,7 @@ impl Notification for AstUpdated {
 | 
			
		||||
pub enum MemoryUpdated {}
 | 
			
		||||
 | 
			
		||||
impl Notification for MemoryUpdated {
 | 
			
		||||
    type Params = crate::executor::ProgramMemory;
 | 
			
		||||
    type Params = crate::execution::ProgramMemory;
 | 
			
		||||
    const METHOD: &'static str = "kcl/memoryUpdated";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -115,7 +115,7 @@ pub struct Backend {
 | 
			
		||||
    /// information.
 | 
			
		||||
    pub last_successful_ast_state: Arc<RwLock<Option<OldAstState>>>,
 | 
			
		||||
    /// Memory maps.
 | 
			
		||||
    pub memory_map: DashMap<String, crate::executor::ProgramMemory>,
 | 
			
		||||
    pub memory_map: DashMap<String, crate::execution::ProgramMemory>,
 | 
			
		||||
    /// Current code.
 | 
			
		||||
    pub code_map: DashMap<String, Vec<u8>>,
 | 
			
		||||
    /// Diagnostics.
 | 
			
		||||
@ -129,7 +129,7 @@ pub struct Backend {
 | 
			
		||||
    /// If we can send telemetry for this user.
 | 
			
		||||
    pub can_send_telemetry: bool,
 | 
			
		||||
    /// Optional executor context to use if we want to execute the code.
 | 
			
		||||
    pub executor_ctx: Arc<RwLock<Option<crate::executor::ExecutorContext>>>,
 | 
			
		||||
    pub executor_ctx: Arc<RwLock<Option<crate::execution::ExecutorContext>>>,
 | 
			
		||||
    /// If we are currently allowed to execute the ast.
 | 
			
		||||
    pub can_execute: Arc<RwLock<bool>>,
 | 
			
		||||
 | 
			
		||||
@ -140,7 +140,7 @@ impl Backend {
 | 
			
		||||
    #[cfg(target_arch = "wasm32")]
 | 
			
		||||
    pub fn new_wasm(
 | 
			
		||||
        client: Client,
 | 
			
		||||
        executor_ctx: Option<crate::executor::ExecutorContext>,
 | 
			
		||||
        executor_ctx: Option<crate::execution::ExecutorContext>,
 | 
			
		||||
        fs: crate::fs::wasm::FileSystemManager,
 | 
			
		||||
        zoo_client: kittycad::Client,
 | 
			
		||||
        can_send_telemetry: bool,
 | 
			
		||||
@ -157,7 +157,7 @@ impl Backend {
 | 
			
		||||
    #[cfg(not(target_arch = "wasm32"))]
 | 
			
		||||
    pub fn new(
 | 
			
		||||
        client: Client,
 | 
			
		||||
        executor_ctx: Option<crate::executor::ExecutorContext>,
 | 
			
		||||
        executor_ctx: Option<crate::execution::ExecutorContext>,
 | 
			
		||||
        zoo_client: kittycad::Client,
 | 
			
		||||
        can_send_telemetry: bool,
 | 
			
		||||
    ) -> Result<Self, String> {
 | 
			
		||||
@ -172,7 +172,7 @@ impl Backend {
 | 
			
		||||
 | 
			
		||||
    fn with_file_manager(
 | 
			
		||||
        client: Client,
 | 
			
		||||
        executor_ctx: Option<crate::executor::ExecutorContext>,
 | 
			
		||||
        executor_ctx: Option<crate::execution::ExecutorContext>,
 | 
			
		||||
        fs: crate::fs::FileManager,
 | 
			
		||||
        zoo_client: kittycad::Client,
 | 
			
		||||
        can_send_telemetry: bool,
 | 
			
		||||
@ -297,7 +297,7 @@ impl crate::lsp::backend::Backend for Backend {
 | 
			
		||||
 | 
			
		||||
        // Try to get the memory for the current code.
 | 
			
		||||
        let has_memory = if let Some(memory) = self.memory_map.get(&filename) {
 | 
			
		||||
            *memory != crate::executor::ProgramMemory::default()
 | 
			
		||||
            *memory != crate::execution::ProgramMemory::default()
 | 
			
		||||
        } else {
 | 
			
		||||
            false
 | 
			
		||||
        };
 | 
			
		||||
@ -406,7 +406,7 @@ impl Backend {
 | 
			
		||||
        *self.can_execute.read().await
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub async fn executor_ctx(&self) -> tokio::sync::RwLockReadGuard<'_, Option<crate::executor::ExecutorContext>> {
 | 
			
		||||
    pub async fn executor_ctx(&self) -> tokio::sync::RwLockReadGuard<'_, Option<crate::execution::ExecutorContext>> {
 | 
			
		||||
        self.executor_ctx.read().await
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -871,7 +871,7 @@ impl Backend {
 | 
			
		||||
 | 
			
		||||
            // Try to get the memory for the current code.
 | 
			
		||||
            let has_memory = if let Some(memory) = self.memory_map.get(&filename) {
 | 
			
		||||
                *memory != crate::executor::ProgramMemory::default()
 | 
			
		||||
                *memory != crate::execution::ProgramMemory::default()
 | 
			
		||||
            } else {
 | 
			
		||||
                false
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
@ -9,10 +9,10 @@ pub async fn kcl_lsp_server(execute: bool) -> Result<crate::lsp::kcl::Backend> {
 | 
			
		||||
    let stdlib_completions = crate::lsp::kcl::get_completions_from_stdlib(&stdlib)?;
 | 
			
		||||
    let stdlib_signatures = crate::lsp::kcl::get_signatures_from_stdlib(&stdlib)?;
 | 
			
		||||
 | 
			
		||||
    let zoo_client = crate::executor::new_zoo_client(None, None)?;
 | 
			
		||||
    let zoo_client = crate::execution::new_zoo_client(None, None)?;
 | 
			
		||||
 | 
			
		||||
    let executor_ctx = if execute {
 | 
			
		||||
        Some(crate::executor::ExecutorContext::new(&zoo_client, Default::default()).await?)
 | 
			
		||||
        Some(crate::execution::ExecutorContext::new(&zoo_client, Default::default()).await?)
 | 
			
		||||
    } else {
 | 
			
		||||
        None
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
@ -7,7 +7,7 @@ use tower_lsp::{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
use crate::{
 | 
			
		||||
    executor::ProgramMemory,
 | 
			
		||||
    execution::ProgramMemory,
 | 
			
		||||
    lsp::test_util::{copilot_lsp_server, kcl_lsp_server},
 | 
			
		||||
    parsing::ast::types::{Node, Program},
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@ use schemars::JsonSchema;
 | 
			
		||||
use serde::{Deserialize, Serialize};
 | 
			
		||||
 | 
			
		||||
use crate::{
 | 
			
		||||
    executor::ExecState,
 | 
			
		||||
    execution::ExecState,
 | 
			
		||||
    parsing::ast::types::{Node, Program},
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -27,7 +27,7 @@ pub struct OldAstState {
 | 
			
		||||
    /// The exec state.
 | 
			
		||||
    pub exec_state: ExecState,
 | 
			
		||||
    /// The last settings used for execution.
 | 
			
		||||
    pub settings: crate::executor::ExecutorSettings,
 | 
			
		||||
    pub settings: crate::execution::ExecutorSettings,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl From<crate::Program> for CacheInformation {
 | 
			
		||||
@ -55,7 +55,7 @@ pub struct CacheResult {
 | 
			
		||||
// the cache.
 | 
			
		||||
pub fn get_changed_program(
 | 
			
		||||
    info: CacheInformation,
 | 
			
		||||
    new_settings: &crate::executor::ExecutorSettings,
 | 
			
		||||
    new_settings: &crate::execution::ExecutorSettings,
 | 
			
		||||
) -> Option<CacheResult> {
 | 
			
		||||
    let Some(old) = info.old else {
 | 
			
		||||
        // We have no old info, we need to re-execute the whole thing.
 | 
			
		||||
@ -109,14 +109,14 @@ mod tests {
 | 
			
		||||
    use super::*;
 | 
			
		||||
 | 
			
		||||
    async fn execute(program: &crate::Program) -> Result<ExecState> {
 | 
			
		||||
        let ctx = crate::executor::ExecutorContext {
 | 
			
		||||
        let ctx = crate::execution::ExecutorContext {
 | 
			
		||||
            engine: Arc::new(Box::new(crate::engine::conn_mock::EngineConnection::new().await?)),
 | 
			
		||||
            fs: Arc::new(crate::fs::FileManager::new()),
 | 
			
		||||
            stdlib: Arc::new(crate::std::StdLib::new()),
 | 
			
		||||
            settings: Default::default(),
 | 
			
		||||
            context_type: crate::executor::ContextType::Mock,
 | 
			
		||||
            context_type: crate::execution::ContextType::Mock,
 | 
			
		||||
        };
 | 
			
		||||
        let mut exec_state = crate::executor::ExecState::default();
 | 
			
		||||
        let mut exec_state = crate::execution::ExecState::default();
 | 
			
		||||
        ctx.run(program.clone().into(), &mut exec_state).await?;
 | 
			
		||||
 | 
			
		||||
        Ok(exec_state)
 | 
			
		||||
 | 
			
		||||
@ -4,9 +4,10 @@ use super::types::{DefaultParamVal, ItemVisibility, VariableKind};
 | 
			
		||||
use crate::parsing::ast::types::{
 | 
			
		||||
    ArrayExpression, ArrayRangeExpression, BinaryExpression, BinaryPart, BodyItem, CallExpression, CallExpressionKw,
 | 
			
		||||
    CommentStyle, ElseIf, Expr, ExpressionStatement, FnArgType, FunctionExpression, Identifier, IfExpression,
 | 
			
		||||
    ImportItem, ImportStatement, Literal, LiteralIdentifier, MemberExpression, MemberObject, NonCodeMeta, NonCodeNode,
 | 
			
		||||
    NonCodeValue, ObjectExpression, ObjectProperty, Parameter, PipeExpression, PipeSubstitution, Program,
 | 
			
		||||
    ReturnStatement, TagDeclarator, UnaryExpression, VariableDeclaration, VariableDeclarator,
 | 
			
		||||
    ImportItem, ImportSelector, ImportStatement, Literal, LiteralIdentifier, MemberExpression, MemberObject,
 | 
			
		||||
    NonCodeMeta, NonCodeNode, NonCodeValue, ObjectExpression, ObjectProperty, Parameter, PipeExpression,
 | 
			
		||||
    PipeSubstitution, Program, ReturnStatement, TagDeclarator, UnaryExpression, VariableDeclaration,
 | 
			
		||||
    VariableDeclarator,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/// Position-independent digest of the AST node.
 | 
			
		||||
@ -52,9 +53,20 @@ impl ImportItem {
 | 
			
		||||
 | 
			
		||||
impl ImportStatement {
 | 
			
		||||
    compute_digest!(|slf, hasher| {
 | 
			
		||||
        for item in &mut slf.items {
 | 
			
		||||
            hasher.update(item.compute_digest());
 | 
			
		||||
        match &mut slf.selector {
 | 
			
		||||
            ImportSelector::List { items } => {
 | 
			
		||||
                for item in items {
 | 
			
		||||
                    hasher.update(item.compute_digest());
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            ImportSelector::Glob(_) => hasher.update(b"ImportSelector::Glob"),
 | 
			
		||||
            ImportSelector::None(None) => hasher.update(b"ImportSelector::None"),
 | 
			
		||||
            ImportSelector::None(Some(alias)) => {
 | 
			
		||||
                hasher.update(b"ImportSelector::None");
 | 
			
		||||
                hasher.update(alias.compute_digest());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        hasher.update(slf.visibility.digestable_id());
 | 
			
		||||
        let path = slf.path.as_bytes();
 | 
			
		||||
        hasher.update(path.len().to_ne_bytes());
 | 
			
		||||
        hasher.update(path);
 | 
			
		||||
@ -270,10 +282,7 @@ impl ExpressionStatement {
 | 
			
		||||
 | 
			
		||||
impl VariableDeclaration {
 | 
			
		||||
    compute_digest!(|slf, hasher| {
 | 
			
		||||
        hasher.update(slf.declarations.len().to_ne_bytes());
 | 
			
		||||
        for declarator in &mut slf.declarations {
 | 
			
		||||
            hasher.update(declarator.compute_digest());
 | 
			
		||||
        }
 | 
			
		||||
        hasher.update(slf.declaration.compute_digest());
 | 
			
		||||
        hasher.update(slf.visibility.digestable_id());
 | 
			
		||||
        hasher.update(slf.kind.digestable_id());
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,74 @@
 | 
			
		||||
pub(crate) mod cache;
 | 
			
		||||
pub(crate) mod digest;
 | 
			
		||||
pub(crate) mod execute;
 | 
			
		||||
pub mod modify;
 | 
			
		||||
pub(crate) mod source_range;
 | 
			
		||||
pub mod types;
 | 
			
		||||
 | 
			
		||||
use crate::parsing::ast::types::{BinaryPart, BodyItem, Expr, LiteralIdentifier, MemberObject};
 | 
			
		||||
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,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -9,7 +9,7 @@ use kittycad_modeling_cmds as kcmc;
 | 
			
		||||
use crate::{
 | 
			
		||||
    engine::EngineManager,
 | 
			
		||||
    errors::{KclError, KclErrorDetails},
 | 
			
		||||
    executor::Point2d,
 | 
			
		||||
    execution::Point2d,
 | 
			
		||||
    parsing::ast::types::{
 | 
			
		||||
        ArrayExpression, CallExpression, ConstraintLevel, FormatOptions, Literal, Node, PipeExpression,
 | 
			
		||||
        PipeSubstitution, VariableDeclarator,
 | 
			
		||||
@ -42,7 +42,7 @@ pub async fn modify_ast_for_sketch(
 | 
			
		||||
    // The name of the sketch.
 | 
			
		||||
    sketch_name: &str,
 | 
			
		||||
    // The type of plane the sketch is on. `XY` or `XZ`, etc
 | 
			
		||||
    plane: crate::executor::PlaneType,
 | 
			
		||||
    plane: crate::execution::PlaneType,
 | 
			
		||||
    // The ID of the parent sketch.
 | 
			
		||||
    sketch_id: uuid::Uuid,
 | 
			
		||||
) -> Result<String, KclError> {
 | 
			
		||||
@ -196,7 +196,7 @@ fn create_start_sketch_on(
 | 
			
		||||
    name: &str,
 | 
			
		||||
    start: [f64; 2],
 | 
			
		||||
    end: [f64; 2],
 | 
			
		||||
    plane: crate::executor::PlaneType,
 | 
			
		||||
    plane: crate::execution::PlaneType,
 | 
			
		||||
    additional_lines: Vec<[f64; 2]>,
 | 
			
		||||
) -> Result<Node<VariableDeclarator>, KclError> {
 | 
			
		||||
    let start_sketch_on = CallExpression::new("startSketchOn", vec![Literal::new(plane.to_string().into()).into()])?;
 | 
			
		||||
 | 
			
		||||
@ -1,71 +0,0 @@
 | 
			
		||||
use crate::{
 | 
			
		||||
    parsing::ast::types::{BinaryPart, BodyItem, Expr, LiteralIdentifier, MemberObject},
 | 
			
		||||
    source_range::ModuleId,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
impl BodyItem {
 | 
			
		||||
    pub fn module_id(&self) -> ModuleId {
 | 
			
		||||
        match self {
 | 
			
		||||
            BodyItem::ImportStatement(stmt) => stmt.module_id,
 | 
			
		||||
            BodyItem::ExpressionStatement(expression_statement) => expression_statement.module_id,
 | 
			
		||||
            BodyItem::VariableDeclaration(variable_declaration) => variable_declaration.module_id,
 | 
			
		||||
            BodyItem::ReturnStatement(return_statement) => return_statement.module_id,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Expr {
 | 
			
		||||
    pub fn module_id(&self) -> ModuleId {
 | 
			
		||||
        match self {
 | 
			
		||||
            Expr::Literal(literal) => literal.module_id,
 | 
			
		||||
            Expr::Identifier(identifier) => identifier.module_id,
 | 
			
		||||
            Expr::TagDeclarator(tag) => tag.module_id,
 | 
			
		||||
            Expr::BinaryExpression(binary_expression) => binary_expression.module_id,
 | 
			
		||||
            Expr::FunctionExpression(function_expression) => function_expression.module_id,
 | 
			
		||||
            Expr::CallExpression(call_expression) => call_expression.module_id,
 | 
			
		||||
            Expr::CallExpressionKw(call_expression) => call_expression.module_id,
 | 
			
		||||
            Expr::PipeExpression(pipe_expression) => pipe_expression.module_id,
 | 
			
		||||
            Expr::PipeSubstitution(pipe_substitution) => pipe_substitution.module_id,
 | 
			
		||||
            Expr::ArrayExpression(array_expression) => array_expression.module_id,
 | 
			
		||||
            Expr::ArrayRangeExpression(array_range) => array_range.module_id,
 | 
			
		||||
            Expr::ObjectExpression(object_expression) => object_expression.module_id,
 | 
			
		||||
            Expr::MemberExpression(member_expression) => member_expression.module_id,
 | 
			
		||||
            Expr::UnaryExpression(unary_expression) => unary_expression.module_id,
 | 
			
		||||
            Expr::IfExpression(expr) => expr.module_id,
 | 
			
		||||
            Expr::None(none) => none.module_id,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl BinaryPart {
 | 
			
		||||
    pub fn module_id(&self) -> ModuleId {
 | 
			
		||||
        match self {
 | 
			
		||||
            BinaryPart::Literal(literal) => literal.module_id,
 | 
			
		||||
            BinaryPart::Identifier(identifier) => identifier.module_id,
 | 
			
		||||
            BinaryPart::BinaryExpression(binary_expression) => binary_expression.module_id,
 | 
			
		||||
            BinaryPart::CallExpression(call_expression) => call_expression.module_id,
 | 
			
		||||
            BinaryPart::CallExpressionKw(call_expression) => call_expression.module_id,
 | 
			
		||||
            BinaryPart::UnaryExpression(unary_expression) => unary_expression.module_id,
 | 
			
		||||
            BinaryPart::MemberExpression(member_expression) => member_expression.module_id,
 | 
			
		||||
            BinaryPart::IfExpression(e) => e.module_id,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl MemberObject {
 | 
			
		||||
    pub fn module_id(&self) -> ModuleId {
 | 
			
		||||
        match self {
 | 
			
		||||
            MemberObject::MemberExpression(member_expression) => member_expression.module_id,
 | 
			
		||||
            MemberObject::Identifier(identifier) => identifier.module_id,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl LiteralIdentifier {
 | 
			
		||||
    pub fn module_id(&self) -> ModuleId {
 | 
			
		||||
        match self {
 | 
			
		||||
            LiteralIdentifier::Identifier(identifier) => identifier.module_id,
 | 
			
		||||
            LiteralIdentifier::Literal(literal) => literal.module_id,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -8,7 +8,7 @@ use std::{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
use anyhow::Result;
 | 
			
		||||
use async_recursion::async_recursion;
 | 
			
		||||
 | 
			
		||||
use parse_display::{Display, FromStr};
 | 
			
		||||
use schemars::JsonSchema;
 | 
			
		||||
use serde::{Deserialize, Serialize};
 | 
			
		||||
@ -17,7 +17,7 @@ use tower_lsp::lsp_types::{
 | 
			
		||||
    CompletionItem, CompletionItemKind, DocumentSymbol, FoldingRange, FoldingRangeKind, Range as LspRange, SymbolKind,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
use super::{digest::Digest, execute::execute_pipe_body};
 | 
			
		||||
use super::digest::Digest;
 | 
			
		||||
pub use crate::parsing::ast::types::{
 | 
			
		||||
    condition::{ElseIf, IfExpression},
 | 
			
		||||
    literal_value::LiteralValue,
 | 
			
		||||
@ -26,7 +26,7 @@ pub use crate::parsing::ast::types::{
 | 
			
		||||
use crate::{
 | 
			
		||||
    docs::StdLibFn,
 | 
			
		||||
    errors::KclError,
 | 
			
		||||
    executor::{ExecState, ExecutorContext, KclValue, Metadata, TagIdentifier},
 | 
			
		||||
    execution::{KclValue, Metadata, TagIdentifier},
 | 
			
		||||
    parsing::PIPE_OPERATOR,
 | 
			
		||||
    source_range::{ModuleId, SourceRange},
 | 
			
		||||
};
 | 
			
		||||
@ -466,11 +466,9 @@ impl Program {
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
                BodyItem::VariableDeclaration(ref mut variable_declaration) => {
 | 
			
		||||
                    for declaration in &mut variable_declaration.declarations {
 | 
			
		||||
                        if declaration.id.name == name {
 | 
			
		||||
                            *declaration = declarator;
 | 
			
		||||
                            return;
 | 
			
		||||
                        }
 | 
			
		||||
                    if variable_declaration.declaration.id.name == name {
 | 
			
		||||
                        variable_declaration.declaration = declarator;
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                BodyItem::ReturnStatement(_return_statement) => continue,
 | 
			
		||||
@ -501,20 +499,16 @@ impl Program {
 | 
			
		||||
        for item in &self.body {
 | 
			
		||||
            match item {
 | 
			
		||||
                BodyItem::ImportStatement(stmt) => {
 | 
			
		||||
                    for import_item in &stmt.items {
 | 
			
		||||
                        if import_item.identifier() == name {
 | 
			
		||||
                            return Some(Definition::Import(stmt.as_ref()));
 | 
			
		||||
                        }
 | 
			
		||||
                    if stmt.get_variable(name) {
 | 
			
		||||
                        return Some(Definition::Import(stmt));
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                BodyItem::ExpressionStatement(_expression_statement) => {
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
                BodyItem::VariableDeclaration(variable_declaration) => {
 | 
			
		||||
                    for declaration in &variable_declaration.declarations {
 | 
			
		||||
                        if declaration.id.name == name {
 | 
			
		||||
                            return Some(Definition::Variable(declaration));
 | 
			
		||||
                        }
 | 
			
		||||
                    if variable_declaration.declaration.id.name == name {
 | 
			
		||||
                        return Some(Definition::Variable(&variable_declaration.declaration));
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                BodyItem::ReturnStatement(_return_statement) => continue,
 | 
			
		||||
@ -1125,7 +1119,7 @@ impl NonCodeMeta {
 | 
			
		||||
pub struct ImportItem {
 | 
			
		||||
    /// Name of the item to import.
 | 
			
		||||
    pub name: Node<Identifier>,
 | 
			
		||||
    /// Rename the item using an identifier after "as".
 | 
			
		||||
    /// Rename the item using an identifier after `as`.
 | 
			
		||||
    pub alias: Option<Node<Identifier>>,
 | 
			
		||||
 | 
			
		||||
    #[serde(default, skip_serializing_if = "Option::is_none")]
 | 
			
		||||
@ -1171,13 +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)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(tag = "type")]
 | 
			
		||||
pub struct ImportStatement {
 | 
			
		||||
    pub items: NodeList<ImportItem>,
 | 
			
		||||
    pub selector: ImportSelector,
 | 
			
		||||
    pub path: String,
 | 
			
		||||
    pub raw_path: String,
 | 
			
		||||
    pub visibility: ItemVisibility,
 | 
			
		||||
 | 
			
		||||
    #[serde(default, skip_serializing_if = "Option::is_none")]
 | 
			
		||||
    #[ts(optional)]
 | 
			
		||||
@ -1185,6 +1237,41 @@ pub struct ImportStatement {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Node<ImportStatement> {
 | 
			
		||||
    pub fn get_variable(&self, name: &str) -> bool {
 | 
			
		||||
        match &self.selector {
 | 
			
		||||
            ImportSelector::List { items } => {
 | 
			
		||||
                for import_item in items {
 | 
			
		||||
                    if import_item.identifier() == name {
 | 
			
		||||
                        return true;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                false
 | 
			
		||||
            }
 | 
			
		||||
            ImportSelector::Glob(_) => false,
 | 
			
		||||
            ImportSelector::None(_) => name == self.module_name().unwrap(),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Get the name of the module object for this import.
 | 
			
		||||
    /// Validated during parsing and guaranteed to return `Some` if the statement imports
 | 
			
		||||
    /// the module itself (i.e., self.selector is ImportSelector::None).
 | 
			
		||||
    pub fn module_name(&self) -> Option<String> {
 | 
			
		||||
        if let ImportSelector::None(Some(alias)) = &self.selector {
 | 
			
		||||
            return Some(alias.name.clone());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let mut parts = self.path.split('.');
 | 
			
		||||
        let name = parts.next()?;
 | 
			
		||||
        let ext = parts.next()?;
 | 
			
		||||
        let rest = parts.next();
 | 
			
		||||
 | 
			
		||||
        if rest.is_some() || ext != "kcl" {
 | 
			
		||||
            return None;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Some(name.to_owned())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn get_constraint_level(&self) -> ConstraintLevel {
 | 
			
		||||
        ConstraintLevel::Full {
 | 
			
		||||
            source_ranges: vec![self.into()],
 | 
			
		||||
@ -1192,24 +1279,13 @@ impl Node<ImportStatement> {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn rename_symbol(&mut self, new_name: &str, pos: usize) -> Option<String> {
 | 
			
		||||
        for item in &mut self.items {
 | 
			
		||||
            let source_range = SourceRange::from(&*item);
 | 
			
		||||
            if source_range.contains(pos) {
 | 
			
		||||
                let old_name = item.rename_symbol(new_name, pos);
 | 
			
		||||
                if old_name.is_some() {
 | 
			
		||||
                    return old_name;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        None
 | 
			
		||||
        self.selector.rename_symbol(new_name, pos)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl ImportStatement {
 | 
			
		||||
    pub fn rename_identifiers(&mut self, old_name: &str, new_name: &str) {
 | 
			
		||||
        for item in &mut self.items {
 | 
			
		||||
            item.rename_identifiers(old_name, new_name);
 | 
			
		||||
        }
 | 
			
		||||
        self.selector.rename_identifiers(old_name, new_name);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1471,7 +1547,7 @@ impl ItemVisibility {
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(tag = "type")]
 | 
			
		||||
pub struct VariableDeclaration {
 | 
			
		||||
    pub declarations: NodeList<VariableDeclarator>,
 | 
			
		||||
    pub declaration: Node<VariableDeclarator>,
 | 
			
		||||
    #[serde(default, skip_serializing_if = "ItemVisibility::is_default")]
 | 
			
		||||
    pub visibility: ItemVisibility,
 | 
			
		||||
    pub kind: VariableKind, // Change to enum if there are specific values
 | 
			
		||||
@ -1483,33 +1559,29 @@ pub struct VariableDeclaration {
 | 
			
		||||
 | 
			
		||||
impl From<&Node<VariableDeclaration>> for Vec<CompletionItem> {
 | 
			
		||||
    fn from(declaration: &Node<VariableDeclaration>) -> Self {
 | 
			
		||||
        let mut completions = vec![];
 | 
			
		||||
        for variable in &declaration.declarations {
 | 
			
		||||
            completions.push(CompletionItem {
 | 
			
		||||
                label: variable.id.name.to_string(),
 | 
			
		||||
                label_details: None,
 | 
			
		||||
                kind: Some(match declaration.inner.kind {
 | 
			
		||||
                    VariableKind::Const => CompletionItemKind::CONSTANT,
 | 
			
		||||
                    VariableKind::Fn => CompletionItemKind::FUNCTION,
 | 
			
		||||
                }),
 | 
			
		||||
                detail: Some(declaration.inner.kind.to_string()),
 | 
			
		||||
                documentation: None,
 | 
			
		||||
                deprecated: None,
 | 
			
		||||
                preselect: None,
 | 
			
		||||
                sort_text: None,
 | 
			
		||||
                filter_text: None,
 | 
			
		||||
                insert_text: None,
 | 
			
		||||
                insert_text_format: None,
 | 
			
		||||
                insert_text_mode: None,
 | 
			
		||||
                text_edit: None,
 | 
			
		||||
                additional_text_edits: None,
 | 
			
		||||
                command: None,
 | 
			
		||||
                commit_characters: None,
 | 
			
		||||
                data: None,
 | 
			
		||||
                tags: None,
 | 
			
		||||
            })
 | 
			
		||||
        }
 | 
			
		||||
        completions
 | 
			
		||||
        vec![CompletionItem {
 | 
			
		||||
            label: declaration.declaration.id.name.to_string(),
 | 
			
		||||
            label_details: None,
 | 
			
		||||
            kind: Some(match declaration.inner.kind {
 | 
			
		||||
                VariableKind::Const => CompletionItemKind::CONSTANT,
 | 
			
		||||
                VariableKind::Fn => CompletionItemKind::FUNCTION,
 | 
			
		||||
            }),
 | 
			
		||||
            detail: Some(declaration.inner.kind.to_string()),
 | 
			
		||||
            documentation: None,
 | 
			
		||||
            deprecated: None,
 | 
			
		||||
            preselect: None,
 | 
			
		||||
            sort_text: None,
 | 
			
		||||
            filter_text: None,
 | 
			
		||||
            insert_text: None,
 | 
			
		||||
            insert_text_format: None,
 | 
			
		||||
            insert_text_mode: None,
 | 
			
		||||
            text_edit: None,
 | 
			
		||||
            additional_text_edits: None,
 | 
			
		||||
            command: None,
 | 
			
		||||
            commit_characters: None,
 | 
			
		||||
            data: None,
 | 
			
		||||
            tags: None,
 | 
			
		||||
        }]
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1543,13 +1615,11 @@ impl Node<VariableDeclaration> {
 | 
			
		||||
            return None;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        for declaration in &mut self.declarations {
 | 
			
		||||
            let declaration_source_range: SourceRange = declaration.id.clone().into();
 | 
			
		||||
            if declaration_source_range.contains(pos) {
 | 
			
		||||
                let old_name = declaration.id.name.clone();
 | 
			
		||||
                declaration.id.name = new_name.to_string();
 | 
			
		||||
                return Some(old_name);
 | 
			
		||||
            }
 | 
			
		||||
        let declaration_source_range: SourceRange = self.declaration.id.clone().into();
 | 
			
		||||
        if declaration_source_range.contains(pos) {
 | 
			
		||||
            let old_name = self.declaration.id.name.clone();
 | 
			
		||||
            self.declaration.id.name = new_name.to_string();
 | 
			
		||||
            return Some(old_name);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        None
 | 
			
		||||
@ -1557,9 +1627,9 @@ impl Node<VariableDeclaration> {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl VariableDeclaration {
 | 
			
		||||
    pub fn new(declarations: NodeList<VariableDeclarator>, visibility: ItemVisibility, kind: VariableKind) -> Self {
 | 
			
		||||
    pub fn new(declaration: Node<VariableDeclarator>, visibility: ItemVisibility, kind: VariableKind) -> Self {
 | 
			
		||||
        Self {
 | 
			
		||||
            declarations,
 | 
			
		||||
            declaration,
 | 
			
		||||
            visibility,
 | 
			
		||||
            kind,
 | 
			
		||||
            digest: None,
 | 
			
		||||
@ -1567,18 +1637,14 @@ impl VariableDeclaration {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) {
 | 
			
		||||
        for declaration in &mut self.declarations {
 | 
			
		||||
            declaration.init.replace_value(source_range, new_value.clone());
 | 
			
		||||
        }
 | 
			
		||||
        self.declaration.init.replace_value(source_range, new_value.clone());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Returns an Expr that includes the given character position.
 | 
			
		||||
    pub fn get_expr_for_position(&self, pos: usize) -> Option<&Expr> {
 | 
			
		||||
        for declaration in &self.declarations {
 | 
			
		||||
            let source_range: SourceRange = declaration.into();
 | 
			
		||||
            if source_range.contains(pos) {
 | 
			
		||||
                return Some(&declaration.init);
 | 
			
		||||
            }
 | 
			
		||||
        let source_range: SourceRange = self.declaration.clone().into();
 | 
			
		||||
        if source_range.contains(pos) {
 | 
			
		||||
            return Some(&self.declaration.init);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        None
 | 
			
		||||
@ -1586,77 +1652,69 @@ impl VariableDeclaration {
 | 
			
		||||
 | 
			
		||||
    /// Returns an Expr that includes the given character position.
 | 
			
		||||
    pub fn get_mut_expr_for_position(&mut self, pos: usize) -> Option<&mut Expr> {
 | 
			
		||||
        for declaration in &mut self.declarations {
 | 
			
		||||
            let source_range: SourceRange = declaration.clone().into();
 | 
			
		||||
            if source_range.contains(pos) {
 | 
			
		||||
                return Some(&mut declaration.init);
 | 
			
		||||
            }
 | 
			
		||||
        let source_range: SourceRange = self.declaration.clone().into();
 | 
			
		||||
        if source_range.contains(pos) {
 | 
			
		||||
            return Some(&mut self.declaration.init);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        None
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn rename_identifiers(&mut self, old_name: &str, new_name: &str) {
 | 
			
		||||
        for declaration in &mut self.declarations {
 | 
			
		||||
            // Skip the init for the variable with the new name since it is the one we are renaming.
 | 
			
		||||
            if declaration.id.name == new_name {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            declaration.init.rename_identifiers(old_name, new_name);
 | 
			
		||||
        // Skip the init for the variable with the new name since it is the one we are renaming.
 | 
			
		||||
        if self.declaration.id.name != new_name {
 | 
			
		||||
            self.declaration.init.rename_identifiers(old_name, new_name);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn get_lsp_symbols(&self, code: &str) -> Vec<DocumentSymbol> {
 | 
			
		||||
        let mut symbols = vec![];
 | 
			
		||||
        let source_range: SourceRange = self.declaration.clone().into();
 | 
			
		||||
        let inner_source_range: SourceRange = self.declaration.id.clone().into();
 | 
			
		||||
 | 
			
		||||
        for declaration in &self.declarations {
 | 
			
		||||
            let source_range: SourceRange = declaration.into();
 | 
			
		||||
            let inner_source_range: SourceRange = declaration.id.clone().into();
 | 
			
		||||
        let mut symbol_kind = match self.kind {
 | 
			
		||||
            VariableKind::Fn => SymbolKind::FUNCTION,
 | 
			
		||||
            VariableKind::Const => SymbolKind::CONSTANT,
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
            let mut symbol_kind = match self.kind {
 | 
			
		||||
                VariableKind::Fn => SymbolKind::FUNCTION,
 | 
			
		||||
                VariableKind::Const => SymbolKind::CONSTANT,
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            let children = match &declaration.init {
 | 
			
		||||
                Expr::FunctionExpression(function_expression) => {
 | 
			
		||||
                    symbol_kind = SymbolKind::FUNCTION;
 | 
			
		||||
                    let mut children = vec![];
 | 
			
		||||
                    for param in &function_expression.params {
 | 
			
		||||
                        let param_source_range: SourceRange = (¶m.identifier).into();
 | 
			
		||||
                        #[allow(deprecated)]
 | 
			
		||||
                        children.push(DocumentSymbol {
 | 
			
		||||
                            name: param.identifier.name.clone(),
 | 
			
		||||
                            detail: None,
 | 
			
		||||
                            kind: SymbolKind::CONSTANT,
 | 
			
		||||
                            range: param_source_range.to_lsp_range(code),
 | 
			
		||||
                            selection_range: param_source_range.to_lsp_range(code),
 | 
			
		||||
                            children: None,
 | 
			
		||||
                            tags: None,
 | 
			
		||||
                            deprecated: None,
 | 
			
		||||
                        });
 | 
			
		||||
                    }
 | 
			
		||||
                    children
 | 
			
		||||
        let children = match &self.declaration.init {
 | 
			
		||||
            Expr::FunctionExpression(function_expression) => {
 | 
			
		||||
                symbol_kind = SymbolKind::FUNCTION;
 | 
			
		||||
                let mut children = vec![];
 | 
			
		||||
                for param in &function_expression.params {
 | 
			
		||||
                    let param_source_range: SourceRange = (¶m.identifier).into();
 | 
			
		||||
                    #[allow(deprecated)]
 | 
			
		||||
                    children.push(DocumentSymbol {
 | 
			
		||||
                        name: param.identifier.name.clone(),
 | 
			
		||||
                        detail: None,
 | 
			
		||||
                        kind: SymbolKind::CONSTANT,
 | 
			
		||||
                        range: param_source_range.to_lsp_range(code),
 | 
			
		||||
                        selection_range: param_source_range.to_lsp_range(code),
 | 
			
		||||
                        children: None,
 | 
			
		||||
                        tags: None,
 | 
			
		||||
                        deprecated: None,
 | 
			
		||||
                    });
 | 
			
		||||
                }
 | 
			
		||||
                Expr::ObjectExpression(object_expression) => {
 | 
			
		||||
                    symbol_kind = SymbolKind::OBJECT;
 | 
			
		||||
                    let mut children = vec![];
 | 
			
		||||
                    for property in &object_expression.properties {
 | 
			
		||||
                        children.extend(property.get_lsp_symbols(code));
 | 
			
		||||
                    }
 | 
			
		||||
                    children
 | 
			
		||||
                children
 | 
			
		||||
            }
 | 
			
		||||
            Expr::ObjectExpression(object_expression) => {
 | 
			
		||||
                symbol_kind = SymbolKind::OBJECT;
 | 
			
		||||
                let mut children = vec![];
 | 
			
		||||
                for property in &object_expression.properties {
 | 
			
		||||
                    children.extend(property.get_lsp_symbols(code));
 | 
			
		||||
                }
 | 
			
		||||
                Expr::ArrayExpression(_) => {
 | 
			
		||||
                    symbol_kind = SymbolKind::ARRAY;
 | 
			
		||||
                    vec![]
 | 
			
		||||
                }
 | 
			
		||||
                _ => vec![],
 | 
			
		||||
            };
 | 
			
		||||
                children
 | 
			
		||||
            }
 | 
			
		||||
            Expr::ArrayExpression(_) => {
 | 
			
		||||
                symbol_kind = SymbolKind::ARRAY;
 | 
			
		||||
                vec![]
 | 
			
		||||
            }
 | 
			
		||||
            _ => vec![],
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        vec![
 | 
			
		||||
            #[allow(deprecated)]
 | 
			
		||||
            symbols.push(DocumentSymbol {
 | 
			
		||||
                name: declaration.id.name.clone(),
 | 
			
		||||
            DocumentSymbol {
 | 
			
		||||
                name: self.declaration.id.name.clone(),
 | 
			
		||||
                detail: Some(self.kind.to_string()),
 | 
			
		||||
                kind: symbol_kind,
 | 
			
		||||
                range: source_range.to_lsp_range(code),
 | 
			
		||||
@ -1664,10 +1722,8 @@ impl VariableDeclaration {
 | 
			
		||||
                children: Some(children),
 | 
			
		||||
                tags: None,
 | 
			
		||||
                deprecated: None,
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        symbols
 | 
			
		||||
            },
 | 
			
		||||
        ]
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -2629,11 +2685,6 @@ impl Node<PipeExpression> {
 | 
			
		||||
 | 
			
		||||
        constraint_levels.get_constraint_level(self.into())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[async_recursion]
 | 
			
		||||
    pub async fn get_result(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result<KclValue, KclError> {
 | 
			
		||||
        execute_pipe_body(exec_state, &self.body, self.into(), ctx).await
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl PipeExpression {
 | 
			
		||||
@ -3243,7 +3294,7 @@ const cylinder = startSketchOn('-XZ')
 | 
			
		||||
        let BodyItem::VariableDeclaration(var_decl) = function else {
 | 
			
		||||
            panic!("expected a variable declaration")
 | 
			
		||||
        };
 | 
			
		||||
        let Expr::FunctionExpression(ref func_expr) = var_decl.declarations.first().unwrap().init else {
 | 
			
		||||
        let Expr::FunctionExpression(ref func_expr) = var_decl.declaration.init else {
 | 
			
		||||
            panic!("expected a function expression")
 | 
			
		||||
        };
 | 
			
		||||
        let params = &func_expr.params;
 | 
			
		||||
@ -3265,7 +3316,7 @@ const cylinder = startSketchOn('-XZ')
 | 
			
		||||
        let BodyItem::VariableDeclaration(var_decl) = function else {
 | 
			
		||||
            panic!("expected a variable declaration")
 | 
			
		||||
        };
 | 
			
		||||
        let Expr::FunctionExpression(ref func_expr) = var_decl.declarations.first().unwrap().init else {
 | 
			
		||||
        let Expr::FunctionExpression(ref func_expr) = var_decl.declaration.init else {
 | 
			
		||||
            panic!("expected a function expression")
 | 
			
		||||
        };
 | 
			
		||||
        let params = &func_expr.params;
 | 
			
		||||
@ -3288,7 +3339,7 @@ const cylinder = startSketchOn('-XZ')
 | 
			
		||||
        let BodyItem::VariableDeclaration(var_decl) = function else {
 | 
			
		||||
            panic!("expected a variable declaration")
 | 
			
		||||
        };
 | 
			
		||||
        let Expr::FunctionExpression(ref func_expr) = var_decl.declarations.first().unwrap().init else {
 | 
			
		||||
        let Expr::FunctionExpression(ref func_expr) = var_decl.declaration.init else {
 | 
			
		||||
            panic!("expected a function expression")
 | 
			
		||||
        };
 | 
			
		||||
        let params = &func_expr.params;
 | 
			
		||||
@ -3362,7 +3413,7 @@ const cylinder = startSketchOn('-XZ')
 | 
			
		||||
        let BodyItem::VariableDeclaration(var_decl) = function else {
 | 
			
		||||
            panic!("expected a variable declaration")
 | 
			
		||||
        };
 | 
			
		||||
        let Expr::FunctionExpression(ref func_expr) = var_decl.declarations.first().unwrap().init else {
 | 
			
		||||
        let Expr::FunctionExpression(ref func_expr) = var_decl.declaration.init else {
 | 
			
		||||
            panic!("expected a function expression")
 | 
			
		||||
        };
 | 
			
		||||
        let params = &func_expr.params;
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@ use schemars::JsonSchema;
 | 
			
		||||
use serde::{Deserialize, Serialize};
 | 
			
		||||
 | 
			
		||||
use super::Node;
 | 
			
		||||
use crate::{executor::KclValue, parsing::ast::types::ConstraintLevel};
 | 
			
		||||
use crate::{execution::KclValue, parsing::ast::types::ConstraintLevel};
 | 
			
		||||
 | 
			
		||||
const KCL_NONE_ID: &str = "KCL_NONE_ID";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -19,11 +19,11 @@ use crate::{
 | 
			
		||||
        ast::types::{
 | 
			
		||||
            ArrayExpression, ArrayRangeExpression, BinaryExpression, BinaryOperator, BinaryPart, BodyItem, BoxNode,
 | 
			
		||||
            CallExpression, CallExpressionKw, CommentStyle, DefaultParamVal, ElseIf, Expr, ExpressionStatement,
 | 
			
		||||
            FnArgPrimitive, FnArgType, FunctionExpression, Identifier, IfExpression, ImportItem, ImportStatement,
 | 
			
		||||
            ItemVisibility, LabeledArg, Literal, LiteralIdentifier, LiteralValue, MemberExpression, MemberObject, Node,
 | 
			
		||||
            NonCodeMeta, NonCodeNode, NonCodeValue, ObjectExpression, ObjectProperty, Parameter, PipeExpression,
 | 
			
		||||
            PipeSubstitution, Program, ReturnStatement, Shebang, TagDeclarator, UnaryExpression, UnaryOperator,
 | 
			
		||||
            VariableDeclaration, VariableDeclarator, VariableKind,
 | 
			
		||||
            FnArgPrimitive, FnArgType, FunctionExpression, Identifier, IfExpression, ImportItem, ImportSelector,
 | 
			
		||||
            ImportStatement, ItemVisibility, LabeledArg, Literal, LiteralIdentifier, LiteralValue, MemberExpression,
 | 
			
		||||
            MemberObject, Node, NodeList, NonCodeMeta, NonCodeNode, NonCodeValue, ObjectExpression, ObjectProperty,
 | 
			
		||||
            Parameter, PipeExpression, PipeSubstitution, Program, ReturnStatement, Shebang, TagDeclarator,
 | 
			
		||||
            UnaryExpression, UnaryOperator, VariableDeclaration, VariableDeclarator, VariableKind,
 | 
			
		||||
        },
 | 
			
		||||
        math::BinaryExpressionToken,
 | 
			
		||||
        token::{Token, TokenType},
 | 
			
		||||
@ -1217,7 +1217,6 @@ fn noncode_just_after_code(i: TokenSlice) -> PResult<Node<NonCodeNode>> {
 | 
			
		||||
// the large_enum_variant lint below introduces a LOT of code complexity in a
 | 
			
		||||
// match!() that's super clean that isn't worth it for the marginal space
 | 
			
		||||
// savings. revisit if that's a lie.
 | 
			
		||||
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
#[allow(clippy::large_enum_variant)]
 | 
			
		||||
enum WithinFunction {
 | 
			
		||||
@ -1238,7 +1237,8 @@ fn body_items_within_function(i: TokenSlice) -> PResult<WithinFunction> {
 | 
			
		||||
    // Any of the body item variants, each of which can optionally be followed by a comment.
 | 
			
		||||
    // If there is a comment, it may be preceded by whitespace.
 | 
			
		||||
    let item = dispatch! {peek(any);
 | 
			
		||||
        token if token.declaration_keyword().is_some() || token.visibility_keyword().is_some() =>
 | 
			
		||||
        token if token.visibility_keyword().is_some() => (alt((declaration.map(BodyItem::VariableDeclaration), import_stmt.map(BodyItem::ImportStatement))), opt(noncode_just_after_code)).map(WithinFunction::BodyItem),
 | 
			
		||||
        token if token.declaration_keyword().is_some() =>
 | 
			
		||||
            (declaration.map(BodyItem::VariableDeclaration), opt(noncode_just_after_code)).map(WithinFunction::BodyItem),
 | 
			
		||||
        token if token.value == "import" && matches!(token.token_type, TokenType::Keyword) =>
 | 
			
		||||
            (import_stmt.map(BodyItem::ImportStatement), opt(noncode_just_after_code)).map(WithinFunction::BodyItem),
 | 
			
		||||
@ -1407,7 +1407,22 @@ fn function_body(i: TokenSlice) -> PResult<Node<Program>> {
 | 
			
		||||
    ))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn import_items(i: TokenSlice) -> PResult<NodeList<ImportItem>> {
 | 
			
		||||
    separated(1.., import_item, comma_sep)
 | 
			
		||||
        .parse_next(i)
 | 
			
		||||
        .map_err(|e| e.cut())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn glob(i: TokenSlice) -> PResult<Token> {
 | 
			
		||||
    one_of((TokenType::Operator, "*"))
 | 
			
		||||
        .context(expected("the multiple import operator, *"))
 | 
			
		||||
        .parse_next(i)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn import_stmt(i: TokenSlice) -> PResult<BoxNode<ImportStatement>> {
 | 
			
		||||
    let (visibility, visibility_token) = opt(terminated(item_visibility, whitespace))
 | 
			
		||||
        .parse_next(i)?
 | 
			
		||||
        .map_or((ItemVisibility::Default, None), |pair| (pair.0, Some(pair.1)));
 | 
			
		||||
    let import_token = any
 | 
			
		||||
        .try_map(|token: Token| {
 | 
			
		||||
            if matches!(token.token_type, TokenType::Keyword) && token.value == "import" {
 | 
			
		||||
@ -1421,38 +1436,63 @@ fn import_stmt(i: TokenSlice) -> PResult<BoxNode<ImportStatement>> {
 | 
			
		||||
        })
 | 
			
		||||
        .context(expected("the 'import' keyword"))
 | 
			
		||||
        .parse_next(i)?;
 | 
			
		||||
    let start = import_token.start;
 | 
			
		||||
 | 
			
		||||
    let module_id = import_token.module_id;
 | 
			
		||||
    let start = visibility_token.unwrap_or(import_token).start;
 | 
			
		||||
 | 
			
		||||
    require_whitespace(i)?;
 | 
			
		||||
 | 
			
		||||
    let items = separated(1.., import_item, comma_sep)
 | 
			
		||||
        .parse_next(i)
 | 
			
		||||
        .map_err(|e| e.cut())?;
 | 
			
		||||
    let (mut selector, path) = alt((
 | 
			
		||||
        string_literal.map(|s| (ImportSelector::None(None), Some(s))),
 | 
			
		||||
        glob.map(|t| {
 | 
			
		||||
            let s = t.as_source_range();
 | 
			
		||||
            (
 | 
			
		||||
                ImportSelector::Glob(Node::new((), s.start(), s.end(), s.module_id())),
 | 
			
		||||
                None,
 | 
			
		||||
            )
 | 
			
		||||
        }),
 | 
			
		||||
        import_items.map(|items| (ImportSelector::List { items }, None)),
 | 
			
		||||
    ))
 | 
			
		||||
    .parse_next(i)?;
 | 
			
		||||
 | 
			
		||||
    require_whitespace(i)?;
 | 
			
		||||
    let path = match path {
 | 
			
		||||
        Some(path) => path,
 | 
			
		||||
        None => {
 | 
			
		||||
            require_whitespace(i)?;
 | 
			
		||||
            any.try_map(|token: Token| {
 | 
			
		||||
                if matches!(token.token_type, TokenType::Keyword | TokenType::Word) && token.value == "from" {
 | 
			
		||||
                    Ok(())
 | 
			
		||||
                } else {
 | 
			
		||||
                    Err(CompilationError::fatal(
 | 
			
		||||
                        token.as_source_range(),
 | 
			
		||||
                        format!("{} is not the 'from' keyword", token.value.as_str()),
 | 
			
		||||
                    ))
 | 
			
		||||
                }
 | 
			
		||||
            })
 | 
			
		||||
            .context(expected("the 'from' keyword"))
 | 
			
		||||
            .parse_next(i)
 | 
			
		||||
            .map_err(|e| e.cut())?;
 | 
			
		||||
 | 
			
		||||
    any.try_map(|token: Token| {
 | 
			
		||||
        if matches!(token.token_type, TokenType::Keyword | TokenType::Word) && token.value == "from" {
 | 
			
		||||
            Ok(())
 | 
			
		||||
        } else {
 | 
			
		||||
            Err(CompilationError::fatal(
 | 
			
		||||
                token.as_source_range(),
 | 
			
		||||
                format!("{} is not the 'from' keyword", token.value.as_str()),
 | 
			
		||||
            ))
 | 
			
		||||
            require_whitespace(i)?;
 | 
			
		||||
 | 
			
		||||
            string_literal(i)?
 | 
			
		||||
        }
 | 
			
		||||
    })
 | 
			
		||||
    .context(expected("the 'from' keyword"))
 | 
			
		||||
    .parse_next(i)
 | 
			
		||||
    .map_err(|e| e.cut())?;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    require_whitespace(i)?;
 | 
			
		||||
 | 
			
		||||
    let path = string_literal(i)?;
 | 
			
		||||
    let end = path.end;
 | 
			
		||||
    let mut end: usize = path.end;
 | 
			
		||||
    let path_string = match path.inner.value {
 | 
			
		||||
        LiteralValue::String(s) => s,
 | 
			
		||||
        _ => unreachable!(),
 | 
			
		||||
    };
 | 
			
		||||
    if path_string.is_empty() {
 | 
			
		||||
        return Err(ErrMode::Cut(
 | 
			
		||||
            CompilationError::fatal(
 | 
			
		||||
                SourceRange::new(path.start, path.end, path.module_id),
 | 
			
		||||
                "import path cannot be empty",
 | 
			
		||||
            )
 | 
			
		||||
            .into(),
 | 
			
		||||
        ));
 | 
			
		||||
    }
 | 
			
		||||
    if path_string
 | 
			
		||||
        .chars()
 | 
			
		||||
        .any(|c| !c.is_ascii_alphanumeric() && c != '_' && c != '-' && c != '.')
 | 
			
		||||
@ -1465,16 +1505,44 @@ fn import_stmt(i: TokenSlice) -> PResult<BoxNode<ImportStatement>> {
 | 
			
		||||
            .into(),
 | 
			
		||||
        ));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if let ImportSelector::None(ref mut a) = selector {
 | 
			
		||||
        if let Some(alias) = opt(preceded(
 | 
			
		||||
            (whitespace, import_as_keyword, whitespace),
 | 
			
		||||
            identifier.context(expected("an identifier to alias the import")),
 | 
			
		||||
        ))
 | 
			
		||||
        .parse_next(i)?
 | 
			
		||||
        {
 | 
			
		||||
            end = alias.end;
 | 
			
		||||
            *a = Some(alias);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if a.is_none()
 | 
			
		||||
            && (!path_string.ends_with(".kcl")
 | 
			
		||||
                || path_string.starts_with("_")
 | 
			
		||||
                || path_string.contains('-')
 | 
			
		||||
                || path_string[0..path_string.len() - 4].contains('.'))
 | 
			
		||||
        {
 | 
			
		||||
            return Err(ErrMode::Cut(
 | 
			
		||||
                CompilationError::fatal(
 | 
			
		||||
                    SourceRange::new(path.start, path.end, path.module_id),
 | 
			
		||||
                    "import path is not a valid identifier and must be aliased.".to_owned(),
 | 
			
		||||
                )
 | 
			
		||||
                .into(),
 | 
			
		||||
            ));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Ok(Node::boxed(
 | 
			
		||||
        ImportStatement {
 | 
			
		||||
            items,
 | 
			
		||||
            selector,
 | 
			
		||||
            visibility,
 | 
			
		||||
            path: path_string,
 | 
			
		||||
            raw_path: path.inner.raw,
 | 
			
		||||
            digest: None,
 | 
			
		||||
        },
 | 
			
		||||
        start,
 | 
			
		||||
        end,
 | 
			
		||||
        import_token.module_id,
 | 
			
		||||
        module_id,
 | 
			
		||||
    ))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1707,7 +1775,7 @@ fn declaration(i: TokenSlice) -> PResult<BoxNode<VariableDeclaration>> {
 | 
			
		||||
    let end = val.end();
 | 
			
		||||
    Ok(Box::new(Node {
 | 
			
		||||
        inner: VariableDeclaration {
 | 
			
		||||
            declarations: vec![Node {
 | 
			
		||||
            declaration: Node {
 | 
			
		||||
                start: id.start,
 | 
			
		||||
                end,
 | 
			
		||||
                module_id,
 | 
			
		||||
@ -1716,7 +1784,7 @@ fn declaration(i: TokenSlice) -> PResult<BoxNode<VariableDeclaration>> {
 | 
			
		||||
                    init: val,
 | 
			
		||||
                    digest: None,
 | 
			
		||||
                },
 | 
			
		||||
            }],
 | 
			
		||||
            },
 | 
			
		||||
            visibility,
 | 
			
		||||
            kind,
 | 
			
		||||
            digest: None,
 | 
			
		||||
@ -2383,10 +2451,11 @@ mod tests {
 | 
			
		||||
        // example, "return" is the problem.
 | 
			
		||||
        assert!(
 | 
			
		||||
            err.message.starts_with("Unexpected token: ")
 | 
			
		||||
                || err.message.starts_with("= is not")
 | 
			
		||||
                || err
 | 
			
		||||
                    .message
 | 
			
		||||
                    .starts_with("Cannot assign a variable to a reserved keyword: "),
 | 
			
		||||
            "Error message is: {}",
 | 
			
		||||
            "Error message is: `{}`",
 | 
			
		||||
            err.message,
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
@ -2449,7 +2518,7 @@ mod tests {
 | 
			
		||||
        let tokens = crate::parsing::token::lexer("x = 4", ModuleId::default()).unwrap();
 | 
			
		||||
        let vardec = declaration(&mut tokens.as_slice()).unwrap();
 | 
			
		||||
        assert_eq!(vardec.inner.kind, VariableKind::Const);
 | 
			
		||||
        let vardec = vardec.declarations.first().unwrap();
 | 
			
		||||
        let vardec = &vardec.declaration;
 | 
			
		||||
        assert_eq!(vardec.id.name, "x");
 | 
			
		||||
        let Expr::Literal(init_val) = &vardec.init else {
 | 
			
		||||
            panic!("weird init value")
 | 
			
		||||
@ -2524,10 +2593,10 @@ const mySk1 = startSketchAt([0, 0])"#;
 | 
			
		||||
    fn test_comment_in_pipe() {
 | 
			
		||||
        let tokens = crate::parsing::token::lexer(r#"const x = y() |> /*hi*/ z(%)"#, ModuleId::default()).unwrap();
 | 
			
		||||
        let mut body = program.parse(&tokens).unwrap().inner.body;
 | 
			
		||||
        let BodyItem::VariableDeclaration(mut item) = body.remove(0) else {
 | 
			
		||||
        let BodyItem::VariableDeclaration(item) = body.remove(0) else {
 | 
			
		||||
            panic!("expected vardec");
 | 
			
		||||
        };
 | 
			
		||||
        let val = item.declarations.remove(0).inner.init;
 | 
			
		||||
        let val = item.inner.declaration.inner.init;
 | 
			
		||||
        let Expr::PipeExpression(pipe) = val else {
 | 
			
		||||
            panic!("expected pipe");
 | 
			
		||||
        };
 | 
			
		||||
@ -2795,14 +2864,14 @@ const mySk1 = startSketchAt([0, 0])"#;
 | 
			
		||||
        .enumerate()
 | 
			
		||||
        {
 | 
			
		||||
            let tokens = crate::parsing::token::lexer(test_input, ModuleId::default()).unwrap();
 | 
			
		||||
            let mut actual = match declaration.parse(&tokens) {
 | 
			
		||||
            let actual = match declaration.parse(&tokens) {
 | 
			
		||||
                Err(e) => panic!("Could not parse test {i}: {e:#?}"),
 | 
			
		||||
                Ok(a) => a,
 | 
			
		||||
            };
 | 
			
		||||
            let Expr::BinaryExpression(_expr) = actual.declarations.remove(0).inner.init else {
 | 
			
		||||
            let Expr::BinaryExpression(_expr) = &actual.declaration.inner.init else {
 | 
			
		||||
                panic!(
 | 
			
		||||
                    "Expected test {i} to be a binary expression but it wasn't, it was {:?}",
 | 
			
		||||
                    actual.declarations[0]
 | 
			
		||||
                    actual.declaration
 | 
			
		||||
                );
 | 
			
		||||
            };
 | 
			
		||||
            // TODO: check both sides are 1... probably not necessary but should do.
 | 
			
		||||
@ -3144,16 +3213,15 @@ const mySk1 = startSketchAt([0, 0])"#;
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            // Run the second parser, check it matches the first parser.
 | 
			
		||||
            let mut actual = declaration.parse(&tokens).unwrap();
 | 
			
		||||
            let actual = declaration.parse(&tokens).unwrap();
 | 
			
		||||
            assert_eq!(expected, actual);
 | 
			
		||||
 | 
			
		||||
            // Inspect its output in more detail.
 | 
			
		||||
            assert_eq!(actual.inner.kind, VariableKind::Const);
 | 
			
		||||
            assert_eq!(actual.start, 0);
 | 
			
		||||
            assert_eq!(actual.declarations.len(), 1);
 | 
			
		||||
            let decl = actual.declarations.pop().unwrap();
 | 
			
		||||
            let decl = &actual.declaration;
 | 
			
		||||
            assert_eq!(decl.id.name, "myVar");
 | 
			
		||||
            let Expr::Literal(value) = decl.inner.init else {
 | 
			
		||||
            let Expr::Literal(value) = &decl.inner.init else {
 | 
			
		||||
                panic!("value should be a literal")
 | 
			
		||||
            };
 | 
			
		||||
            assert_eq!(value.end, test.len());
 | 
			
		||||
@ -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]
 | 
			
		||||
    fn zero_param_function() {
 | 
			
		||||
        let code = r#"
 | 
			
		||||
 | 
			
		||||
@ -1,245 +1,241 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 3893
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 143,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 15,
 | 
			
		||||
            "name": "boxSketch",
 | 
			
		||||
            "start": 6,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "body": [
 | 
			
		||||
              {
 | 
			
		||||
                "arguments": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "elements": [
 | 
			
		||||
                      {
 | 
			
		||||
                        "end": 34,
 | 
			
		||||
                        "raw": "0",
 | 
			
		||||
                        "start": 33,
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "value": 0.0
 | 
			
		||||
                      },
 | 
			
		||||
                      {
 | 
			
		||||
                        "end": 37,
 | 
			
		||||
                        "raw": "0",
 | 
			
		||||
                        "start": 36,
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "value": 0.0
 | 
			
		||||
                      }
 | 
			
		||||
                    ],
 | 
			
		||||
                    "end": 38,
 | 
			
		||||
                    "start": 32,
 | 
			
		||||
                    "type": "ArrayExpression",
 | 
			
		||||
                    "type": "ArrayExpression"
 | 
			
		||||
                  }
 | 
			
		||||
                ],
 | 
			
		||||
                "callee": {
 | 
			
		||||
                  "end": 31,
 | 
			
		||||
                  "name": "startSketchAt",
 | 
			
		||||
                  "start": 18,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "end": 39,
 | 
			
		||||
                "start": 18,
 | 
			
		||||
                "type": "CallExpression",
 | 
			
		||||
                "type": "CallExpression"
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                "arguments": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "elements": [
 | 
			
		||||
                      {
 | 
			
		||||
                        "end": 54,
 | 
			
		||||
                        "raw": "0",
 | 
			
		||||
                        "start": 53,
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "value": 0.0
 | 
			
		||||
                      },
 | 
			
		||||
                      {
 | 
			
		||||
                        "end": 58,
 | 
			
		||||
                        "raw": "10",
 | 
			
		||||
                        "start": 56,
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "value": 10.0
 | 
			
		||||
                      }
 | 
			
		||||
                    ],
 | 
			
		||||
                    "end": 59,
 | 
			
		||||
                    "start": 52,
 | 
			
		||||
                    "type": "ArrayExpression",
 | 
			
		||||
                    "type": "ArrayExpression"
 | 
			
		||||
                  },
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 62,
 | 
			
		||||
                    "start": 61,
 | 
			
		||||
                    "type": "PipeSubstitution",
 | 
			
		||||
                    "type": "PipeSubstitution"
 | 
			
		||||
                  }
 | 
			
		||||
                ],
 | 
			
		||||
                "callee": {
 | 
			
		||||
                  "end": 51,
 | 
			
		||||
                  "name": "line",
 | 
			
		||||
                  "start": 47,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "end": 63,
 | 
			
		||||
                "start": 47,
 | 
			
		||||
                "type": "CallExpression",
 | 
			
		||||
                "type": "CallExpression"
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                "arguments": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "elements": [
 | 
			
		||||
                      {
 | 
			
		||||
                        "argument": {
 | 
			
		||||
                          "end": 88,
 | 
			
		||||
                          "raw": "5",
 | 
			
		||||
                          "start": 87,
 | 
			
		||||
                          "type": "Literal",
 | 
			
		||||
                          "type": "Literal",
 | 
			
		||||
                          "value": 5.0
 | 
			
		||||
                        },
 | 
			
		||||
                        "end": 88,
 | 
			
		||||
                        "operator": "-",
 | 
			
		||||
                        "start": 86,
 | 
			
		||||
                        "type": "UnaryExpression",
 | 
			
		||||
                        "type": "UnaryExpression"
 | 
			
		||||
                      },
 | 
			
		||||
                      {
 | 
			
		||||
                        "end": 91,
 | 
			
		||||
                        "raw": "5",
 | 
			
		||||
                        "start": 90,
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "value": 5.0
 | 
			
		||||
                      }
 | 
			
		||||
                    ],
 | 
			
		||||
                    "end": 92,
 | 
			
		||||
                    "start": 85,
 | 
			
		||||
                    "type": "ArrayExpression",
 | 
			
		||||
                    "type": "ArrayExpression"
 | 
			
		||||
                  },
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 95,
 | 
			
		||||
                    "start": 94,
 | 
			
		||||
                    "type": "PipeSubstitution",
 | 
			
		||||
                    "type": "PipeSubstitution"
 | 
			
		||||
                  }
 | 
			
		||||
                ],
 | 
			
		||||
                "callee": {
 | 
			
		||||
                  "end": 84,
 | 
			
		||||
                  "name": "tangentialArc",
 | 
			
		||||
                  "start": 71,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "end": 96,
 | 
			
		||||
                "start": 71,
 | 
			
		||||
                "type": "CallExpression",
 | 
			
		||||
                "type": "CallExpression"
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                "arguments": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "elements": [
 | 
			
		||||
                      {
 | 
			
		||||
                        "end": 111,
 | 
			
		||||
                        "raw": "5",
 | 
			
		||||
                        "start": 110,
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "value": 5.0
 | 
			
		||||
                      },
 | 
			
		||||
                      {
 | 
			
		||||
                        "argument": {
 | 
			
		||||
                          "end": 116,
 | 
			
		||||
                          "raw": "15",
 | 
			
		||||
                          "start": 114,
 | 
			
		||||
                          "type": "Literal",
 | 
			
		||||
                          "type": "Literal",
 | 
			
		||||
                          "value": 15.0
 | 
			
		||||
                        },
 | 
			
		||||
                        "end": 116,
 | 
			
		||||
                        "operator": "-",
 | 
			
		||||
                        "start": 113,
 | 
			
		||||
                        "type": "UnaryExpression",
 | 
			
		||||
                        "type": "UnaryExpression"
 | 
			
		||||
                      }
 | 
			
		||||
                    ],
 | 
			
		||||
                    "end": 117,
 | 
			
		||||
                    "start": 109,
 | 
			
		||||
                    "type": "ArrayExpression",
 | 
			
		||||
                    "type": "ArrayExpression"
 | 
			
		||||
                  },
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 120,
 | 
			
		||||
                    "start": 119,
 | 
			
		||||
                    "type": "PipeSubstitution",
 | 
			
		||||
                    "type": "PipeSubstitution"
 | 
			
		||||
                  }
 | 
			
		||||
                ],
 | 
			
		||||
                "callee": {
 | 
			
		||||
                  "end": 108,
 | 
			
		||||
                  "name": "line",
 | 
			
		||||
                  "start": 104,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "end": 121,
 | 
			
		||||
                "start": 104,
 | 
			
		||||
                "type": "CallExpression",
 | 
			
		||||
                "type": "CallExpression"
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                "arguments": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 139,
 | 
			
		||||
                    "raw": "10",
 | 
			
		||||
                    "start": 137,
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "value": 10.0
 | 
			
		||||
                  },
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 142,
 | 
			
		||||
                    "start": 141,
 | 
			
		||||
                    "type": "PipeSubstitution",
 | 
			
		||||
                    "type": "PipeSubstitution"
 | 
			
		||||
                  }
 | 
			
		||||
                ],
 | 
			
		||||
                "callee": {
 | 
			
		||||
                  "end": 136,
 | 
			
		||||
                  "name": "extrude",
 | 
			
		||||
                  "start": 129,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "end": 143,
 | 
			
		||||
                "start": 129,
 | 
			
		||||
                "type": "CallExpression",
 | 
			
		||||
                "type": "CallExpression"
 | 
			
		||||
              }
 | 
			
		||||
            ],
 | 
			
		||||
            "end": 143,
 | 
			
		||||
            "start": 18,
 | 
			
		||||
            "type": "PipeExpression",
 | 
			
		||||
            "type": "PipeExpression"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 143,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 15,
 | 
			
		||||
          "name": "boxSketch",
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "body": [
 | 
			
		||||
            {
 | 
			
		||||
              "arguments": [
 | 
			
		||||
                {
 | 
			
		||||
                  "elements": [
 | 
			
		||||
                    {
 | 
			
		||||
                      "end": 34,
 | 
			
		||||
                      "raw": "0",
 | 
			
		||||
                      "start": 33,
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "value": 0.0
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                      "end": 37,
 | 
			
		||||
                      "raw": "0",
 | 
			
		||||
                      "start": 36,
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "value": 0.0
 | 
			
		||||
                    }
 | 
			
		||||
                  ],
 | 
			
		||||
                  "end": 38,
 | 
			
		||||
                  "start": 32,
 | 
			
		||||
                  "type": "ArrayExpression",
 | 
			
		||||
                  "type": "ArrayExpression"
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "callee": {
 | 
			
		||||
                "end": 31,
 | 
			
		||||
                "name": "startSketchAt",
 | 
			
		||||
                "start": 18,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "end": 39,
 | 
			
		||||
              "start": 18,
 | 
			
		||||
              "type": "CallExpression",
 | 
			
		||||
              "type": "CallExpression"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "arguments": [
 | 
			
		||||
                {
 | 
			
		||||
                  "elements": [
 | 
			
		||||
                    {
 | 
			
		||||
                      "end": 54,
 | 
			
		||||
                      "raw": "0",
 | 
			
		||||
                      "start": 53,
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "value": 0.0
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                      "end": 58,
 | 
			
		||||
                      "raw": "10",
 | 
			
		||||
                      "start": 56,
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "value": 10.0
 | 
			
		||||
                    }
 | 
			
		||||
                  ],
 | 
			
		||||
                  "end": 59,
 | 
			
		||||
                  "start": 52,
 | 
			
		||||
                  "type": "ArrayExpression",
 | 
			
		||||
                  "type": "ArrayExpression"
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 62,
 | 
			
		||||
                  "start": 61,
 | 
			
		||||
                  "type": "PipeSubstitution",
 | 
			
		||||
                  "type": "PipeSubstitution"
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "callee": {
 | 
			
		||||
                "end": 51,
 | 
			
		||||
                "name": "line",
 | 
			
		||||
                "start": 47,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "end": 63,
 | 
			
		||||
              "start": 47,
 | 
			
		||||
              "type": "CallExpression",
 | 
			
		||||
              "type": "CallExpression"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "arguments": [
 | 
			
		||||
                {
 | 
			
		||||
                  "elements": [
 | 
			
		||||
                    {
 | 
			
		||||
                      "argument": {
 | 
			
		||||
                        "end": 88,
 | 
			
		||||
                        "raw": "5",
 | 
			
		||||
                        "start": 87,
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "value": 5.0
 | 
			
		||||
                      },
 | 
			
		||||
                      "end": 88,
 | 
			
		||||
                      "operator": "-",
 | 
			
		||||
                      "start": 86,
 | 
			
		||||
                      "type": "UnaryExpression",
 | 
			
		||||
                      "type": "UnaryExpression"
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                      "end": 91,
 | 
			
		||||
                      "raw": "5",
 | 
			
		||||
                      "start": 90,
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "value": 5.0
 | 
			
		||||
                    }
 | 
			
		||||
                  ],
 | 
			
		||||
                  "end": 92,
 | 
			
		||||
                  "start": 85,
 | 
			
		||||
                  "type": "ArrayExpression",
 | 
			
		||||
                  "type": "ArrayExpression"
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 95,
 | 
			
		||||
                  "start": 94,
 | 
			
		||||
                  "type": "PipeSubstitution",
 | 
			
		||||
                  "type": "PipeSubstitution"
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "callee": {
 | 
			
		||||
                "end": 84,
 | 
			
		||||
                "name": "tangentialArc",
 | 
			
		||||
                "start": 71,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "end": 96,
 | 
			
		||||
              "start": 71,
 | 
			
		||||
              "type": "CallExpression",
 | 
			
		||||
              "type": "CallExpression"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "arguments": [
 | 
			
		||||
                {
 | 
			
		||||
                  "elements": [
 | 
			
		||||
                    {
 | 
			
		||||
                      "end": 111,
 | 
			
		||||
                      "raw": "5",
 | 
			
		||||
                      "start": 110,
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "value": 5.0
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                      "argument": {
 | 
			
		||||
                        "end": 116,
 | 
			
		||||
                        "raw": "15",
 | 
			
		||||
                        "start": 114,
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "value": 15.0
 | 
			
		||||
                      },
 | 
			
		||||
                      "end": 116,
 | 
			
		||||
                      "operator": "-",
 | 
			
		||||
                      "start": 113,
 | 
			
		||||
                      "type": "UnaryExpression",
 | 
			
		||||
                      "type": "UnaryExpression"
 | 
			
		||||
                    }
 | 
			
		||||
                  ],
 | 
			
		||||
                  "end": 117,
 | 
			
		||||
                  "start": 109,
 | 
			
		||||
                  "type": "ArrayExpression",
 | 
			
		||||
                  "type": "ArrayExpression"
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 120,
 | 
			
		||||
                  "start": 119,
 | 
			
		||||
                  "type": "PipeSubstitution",
 | 
			
		||||
                  "type": "PipeSubstitution"
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "callee": {
 | 
			
		||||
                "end": 108,
 | 
			
		||||
                "name": "line",
 | 
			
		||||
                "start": 104,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "end": 121,
 | 
			
		||||
              "start": 104,
 | 
			
		||||
              "type": "CallExpression",
 | 
			
		||||
              "type": "CallExpression"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "arguments": [
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 139,
 | 
			
		||||
                  "raw": "10",
 | 
			
		||||
                  "start": 137,
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "value": 10.0
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 142,
 | 
			
		||||
                  "start": 141,
 | 
			
		||||
                  "type": "PipeSubstitution",
 | 
			
		||||
                  "type": "PipeSubstitution"
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "callee": {
 | 
			
		||||
                "end": 136,
 | 
			
		||||
                "name": "extrude",
 | 
			
		||||
                "start": 129,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "end": 143,
 | 
			
		||||
              "start": 129,
 | 
			
		||||
              "type": "CallExpression",
 | 
			
		||||
              "type": "CallExpression"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "end": 143,
 | 
			
		||||
          "start": 18,
 | 
			
		||||
          "type": "PipeExpression",
 | 
			
		||||
          "type": "PipeExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 6,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 143,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,39 +1,35 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 3963
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 17,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 8,
 | 
			
		||||
            "name": "sg",
 | 
			
		||||
            "start": 6,
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 17,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 8,
 | 
			
		||||
          "name": "sg",
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "argument": {
 | 
			
		||||
            "end": 17,
 | 
			
		||||
            "name": "scale",
 | 
			
		||||
            "start": 12,
 | 
			
		||||
            "type": "Identifier",
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "argument": {
 | 
			
		||||
              "end": 17,
 | 
			
		||||
              "name": "scale",
 | 
			
		||||
              "start": 12,
 | 
			
		||||
              "type": "Identifier",
 | 
			
		||||
              "type": "Identifier"
 | 
			
		||||
            },
 | 
			
		||||
            "end": 17,
 | 
			
		||||
            "operator": "-",
 | 
			
		||||
            "start": 11,
 | 
			
		||||
            "type": "UnaryExpression",
 | 
			
		||||
            "type": "UnaryExpression"
 | 
			
		||||
          },
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "end": 17,
 | 
			
		||||
          "operator": "-",
 | 
			
		||||
          "start": 11,
 | 
			
		||||
          "type": "UnaryExpression",
 | 
			
		||||
          "type": "UnaryExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 6,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 17,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,48 +1,44 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 3965
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 23,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 13,
 | 
			
		||||
            "name": "myArray",
 | 
			
		||||
            "start": 6,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "end": 23,
 | 
			
		||||
            "endElement": {
 | 
			
		||||
              "end": 22,
 | 
			
		||||
              "raw": "10",
 | 
			
		||||
              "start": 20,
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "value": 10.0
 | 
			
		||||
            },
 | 
			
		||||
            "endInclusive": true,
 | 
			
		||||
            "start": 16,
 | 
			
		||||
            "startElement": {
 | 
			
		||||
              "end": 18,
 | 
			
		||||
              "raw": "0",
 | 
			
		||||
              "start": 17,
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "value": 0.0
 | 
			
		||||
            },
 | 
			
		||||
            "type": "ArrayRangeExpression",
 | 
			
		||||
            "type": "ArrayRangeExpression"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 23,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 13,
 | 
			
		||||
          "name": "myArray",
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "end": 23,
 | 
			
		||||
          "endElement": {
 | 
			
		||||
            "end": 22,
 | 
			
		||||
            "raw": "10",
 | 
			
		||||
            "start": 20,
 | 
			
		||||
            "type": "Literal",
 | 
			
		||||
            "type": "Literal",
 | 
			
		||||
            "value": 10.0
 | 
			
		||||
          },
 | 
			
		||||
          "endInclusive": true,
 | 
			
		||||
          "start": 16,
 | 
			
		||||
          "startElement": {
 | 
			
		||||
            "end": 18,
 | 
			
		||||
            "raw": "0",
 | 
			
		||||
            "start": 17,
 | 
			
		||||
            "type": "Literal",
 | 
			
		||||
            "type": "Literal",
 | 
			
		||||
            "value": 0.0
 | 
			
		||||
          },
 | 
			
		||||
          "type": "ArrayRangeExpression",
 | 
			
		||||
          "type": "ArrayRangeExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 6,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 23,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,52 +1,48 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 3966
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 57,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 24,
 | 
			
		||||
            "name": "firstPrimeNumber",
 | 
			
		||||
            "start": 8,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "body": {
 | 
			
		||||
              "body": [
 | 
			
		||||
                {
 | 
			
		||||
                  "argument": {
 | 
			
		||||
                    "end": 51,
 | 
			
		||||
                    "raw": "2",
 | 
			
		||||
                    "start": 50,
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "value": 2.0
 | 
			
		||||
                  },
 | 
			
		||||
                  "end": 51,
 | 
			
		||||
                  "start": 43,
 | 
			
		||||
                  "type": "ReturnStatement",
 | 
			
		||||
                  "type": "ReturnStatement"
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "end": 57,
 | 
			
		||||
              "start": 33
 | 
			
		||||
            },
 | 
			
		||||
            "end": 57,
 | 
			
		||||
            "params": [],
 | 
			
		||||
            "start": 27,
 | 
			
		||||
            "type": "FunctionExpression",
 | 
			
		||||
            "type": "FunctionExpression"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 57,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 24,
 | 
			
		||||
          "name": "firstPrimeNumber",
 | 
			
		||||
          "start": 8,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "body": {
 | 
			
		||||
            "body": [
 | 
			
		||||
              {
 | 
			
		||||
                "argument": {
 | 
			
		||||
                  "end": 51,
 | 
			
		||||
                  "raw": "2",
 | 
			
		||||
                  "start": 50,
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "value": 2.0
 | 
			
		||||
                },
 | 
			
		||||
                "end": 51,
 | 
			
		||||
                "start": 43,
 | 
			
		||||
                "type": "ReturnStatement",
 | 
			
		||||
                "type": "ReturnStatement"
 | 
			
		||||
              }
 | 
			
		||||
            ],
 | 
			
		||||
            "end": 57,
 | 
			
		||||
            "start": 33
 | 
			
		||||
          },
 | 
			
		||||
          "end": 57,
 | 
			
		||||
          "params": [],
 | 
			
		||||
          "start": 27,
 | 
			
		||||
          "type": "FunctionExpression",
 | 
			
		||||
          "type": "FunctionExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 8,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 57,
 | 
			
		||||
      "kind": "fn",
 | 
			
		||||
      "start": 5,
 | 
			
		||||
 | 
			
		||||
@ -1,61 +1,58 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 49,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 8,
 | 
			
		||||
            "name": "thing",
 | 
			
		||||
            "start": 3,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "body": {
 | 
			
		||||
              "body": [
 | 
			
		||||
                {
 | 
			
		||||
                  "argument": {
 | 
			
		||||
                    "end": 43,
 | 
			
		||||
                    "raw": "true",
 | 
			
		||||
                    "start": 39,
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "value": true
 | 
			
		||||
                  },
 | 
			
		||||
                  "end": 43,
 | 
			
		||||
                  "start": 32,
 | 
			
		||||
                  "type": "ReturnStatement",
 | 
			
		||||
                  "type": "ReturnStatement"
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "end": 49,
 | 
			
		||||
              "start": 22
 | 
			
		||||
            },
 | 
			
		||||
            "end": 49,
 | 
			
		||||
            "params": [
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 49,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 8,
 | 
			
		||||
          "name": "thing",
 | 
			
		||||
          "start": 3,
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "body": {
 | 
			
		||||
            "body": [
 | 
			
		||||
              {
 | 
			
		||||
                "type": "Parameter",
 | 
			
		||||
                "identifier": {
 | 
			
		||||
                  "end": 17,
 | 
			
		||||
                  "name": "param",
 | 
			
		||||
                  "start": 12,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                }
 | 
			
		||||
                "argument": {
 | 
			
		||||
                  "end": 43,
 | 
			
		||||
                  "raw": "true",
 | 
			
		||||
                  "start": 39,
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "value": true
 | 
			
		||||
                },
 | 
			
		||||
                "end": 43,
 | 
			
		||||
                "start": 32,
 | 
			
		||||
                "type": "ReturnStatement",
 | 
			
		||||
                "type": "ReturnStatement"
 | 
			
		||||
              }
 | 
			
		||||
            ],
 | 
			
		||||
            "start": 11,
 | 
			
		||||
            "type": "FunctionExpression",
 | 
			
		||||
            "type": "FunctionExpression"
 | 
			
		||||
            "end": 49,
 | 
			
		||||
            "start": 22
 | 
			
		||||
          },
 | 
			
		||||
          "start": 3,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "end": 49,
 | 
			
		||||
          "params": [
 | 
			
		||||
            {
 | 
			
		||||
              "type": "Parameter",
 | 
			
		||||
              "identifier": {
 | 
			
		||||
                "end": 17,
 | 
			
		||||
                "name": "param",
 | 
			
		||||
                "start": 12,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "start": 11,
 | 
			
		||||
          "type": "FunctionExpression",
 | 
			
		||||
          "type": "FunctionExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 3,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 49,
 | 
			
		||||
      "kind": "fn",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,237 +1,233 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 3981
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 165,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 14,
 | 
			
		||||
            "name": "mySketch",
 | 
			
		||||
            "start": 6,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "body": [
 | 
			
		||||
              {
 | 
			
		||||
                "arguments": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "elements": [
 | 
			
		||||
                      {
 | 
			
		||||
                        "end": 33,
 | 
			
		||||
                        "raw": "0",
 | 
			
		||||
                        "start": 32,
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "value": 0.0
 | 
			
		||||
                      },
 | 
			
		||||
                      {
 | 
			
		||||
                        "end": 35,
 | 
			
		||||
                        "raw": "0",
 | 
			
		||||
                        "start": 34,
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "value": 0.0
 | 
			
		||||
                      }
 | 
			
		||||
                    ],
 | 
			
		||||
                    "end": 36,
 | 
			
		||||
                    "start": 31,
 | 
			
		||||
                    "type": "ArrayExpression",
 | 
			
		||||
                    "type": "ArrayExpression"
 | 
			
		||||
                  }
 | 
			
		||||
                ],
 | 
			
		||||
                "callee": {
 | 
			
		||||
                  "end": 30,
 | 
			
		||||
                  "name": "startSketchAt",
 | 
			
		||||
                  "start": 17,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "end": 37,
 | 
			
		||||
                "start": 17,
 | 
			
		||||
                "type": "CallExpression",
 | 
			
		||||
                "type": "CallExpression"
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                "arguments": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "elements": [
 | 
			
		||||
                      {
 | 
			
		||||
                        "end": 58,
 | 
			
		||||
                        "raw": "0",
 | 
			
		||||
                        "start": 57,
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "value": 0.0
 | 
			
		||||
                      },
 | 
			
		||||
                      {
 | 
			
		||||
                        "end": 61,
 | 
			
		||||
                        "raw": "1",
 | 
			
		||||
                        "start": 60,
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "value": 1.0
 | 
			
		||||
                      }
 | 
			
		||||
                    ],
 | 
			
		||||
                    "end": 62,
 | 
			
		||||
                    "start": 56,
 | 
			
		||||
                    "type": "ArrayExpression",
 | 
			
		||||
                    "type": "ArrayExpression"
 | 
			
		||||
                  },
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 65,
 | 
			
		||||
                    "start": 64,
 | 
			
		||||
                    "type": "PipeSubstitution",
 | 
			
		||||
                    "type": "PipeSubstitution"
 | 
			
		||||
                  },
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 74,
 | 
			
		||||
                    "start": 67,
 | 
			
		||||
                    "type": "TagDeclarator",
 | 
			
		||||
                    "type": "TagDeclarator",
 | 
			
		||||
                    "value": "myPath"
 | 
			
		||||
                  }
 | 
			
		||||
                ],
 | 
			
		||||
                "callee": {
 | 
			
		||||
                  "end": 55,
 | 
			
		||||
                  "name": "lineTo",
 | 
			
		||||
                  "start": 49,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "end": 75,
 | 
			
		||||
                "start": 49,
 | 
			
		||||
                "type": "CallExpression",
 | 
			
		||||
                "type": "CallExpression"
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                "arguments": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "elements": [
 | 
			
		||||
                      {
 | 
			
		||||
                        "end": 96,
 | 
			
		||||
                        "raw": "1",
 | 
			
		||||
                        "start": 95,
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "value": 1.0
 | 
			
		||||
                      },
 | 
			
		||||
                      {
 | 
			
		||||
                        "end": 99,
 | 
			
		||||
                        "raw": "1",
 | 
			
		||||
                        "start": 98,
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "value": 1.0
 | 
			
		||||
                      }
 | 
			
		||||
                    ],
 | 
			
		||||
                    "end": 100,
 | 
			
		||||
                    "start": 94,
 | 
			
		||||
                    "type": "ArrayExpression",
 | 
			
		||||
                    "type": "ArrayExpression"
 | 
			
		||||
                  },
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 103,
 | 
			
		||||
                    "start": 102,
 | 
			
		||||
                    "type": "PipeSubstitution",
 | 
			
		||||
                    "type": "PipeSubstitution"
 | 
			
		||||
                  }
 | 
			
		||||
                ],
 | 
			
		||||
                "callee": {
 | 
			
		||||
                  "end": 93,
 | 
			
		||||
                  "name": "lineTo",
 | 
			
		||||
                  "start": 87,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "end": 104,
 | 
			
		||||
                "start": 87,
 | 
			
		||||
                "type": "CallExpression",
 | 
			
		||||
                "type": "CallExpression"
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                "arguments": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "elements": [
 | 
			
		||||
                      {
 | 
			
		||||
                        "end": 125,
 | 
			
		||||
                        "raw": "1",
 | 
			
		||||
                        "start": 124,
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "value": 1.0
 | 
			
		||||
                      },
 | 
			
		||||
                      {
 | 
			
		||||
                        "end": 128,
 | 
			
		||||
                        "raw": "0",
 | 
			
		||||
                        "start": 127,
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "value": 0.0
 | 
			
		||||
                      }
 | 
			
		||||
                    ],
 | 
			
		||||
                    "end": 129,
 | 
			
		||||
                    "start": 123,
 | 
			
		||||
                    "type": "ArrayExpression",
 | 
			
		||||
                    "type": "ArrayExpression"
 | 
			
		||||
                  },
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 132,
 | 
			
		||||
                    "start": 131,
 | 
			
		||||
                    "type": "PipeSubstitution",
 | 
			
		||||
                    "type": "PipeSubstitution"
 | 
			
		||||
                  },
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 144,
 | 
			
		||||
                    "start": 134,
 | 
			
		||||
                    "type": "TagDeclarator",
 | 
			
		||||
                    "type": "TagDeclarator",
 | 
			
		||||
                    "value": "rightPath"
 | 
			
		||||
                  }
 | 
			
		||||
                ],
 | 
			
		||||
                "callee": {
 | 
			
		||||
                  "end": 122,
 | 
			
		||||
                  "name": "lineTo",
 | 
			
		||||
                  "start": 116,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "end": 145,
 | 
			
		||||
                "start": 116,
 | 
			
		||||
                "type": "CallExpression",
 | 
			
		||||
                "type": "CallExpression"
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                "arguments": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 164,
 | 
			
		||||
                    "start": 163,
 | 
			
		||||
                    "type": "PipeSubstitution",
 | 
			
		||||
                    "type": "PipeSubstitution"
 | 
			
		||||
                  }
 | 
			
		||||
                ],
 | 
			
		||||
                "callee": {
 | 
			
		||||
                  "end": 162,
 | 
			
		||||
                  "name": "close",
 | 
			
		||||
                  "start": 157,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "end": 165,
 | 
			
		||||
                "start": 157,
 | 
			
		||||
                "type": "CallExpression",
 | 
			
		||||
                "type": "CallExpression"
 | 
			
		||||
              }
 | 
			
		||||
            ],
 | 
			
		||||
            "end": 165,
 | 
			
		||||
            "start": 17,
 | 
			
		||||
            "type": "PipeExpression",
 | 
			
		||||
            "type": "PipeExpression"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 165,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 14,
 | 
			
		||||
          "name": "mySketch",
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "body": [
 | 
			
		||||
            {
 | 
			
		||||
              "arguments": [
 | 
			
		||||
                {
 | 
			
		||||
                  "elements": [
 | 
			
		||||
                    {
 | 
			
		||||
                      "end": 33,
 | 
			
		||||
                      "raw": "0",
 | 
			
		||||
                      "start": 32,
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "value": 0.0
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                      "end": 35,
 | 
			
		||||
                      "raw": "0",
 | 
			
		||||
                      "start": 34,
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "value": 0.0
 | 
			
		||||
                    }
 | 
			
		||||
                  ],
 | 
			
		||||
                  "end": 36,
 | 
			
		||||
                  "start": 31,
 | 
			
		||||
                  "type": "ArrayExpression",
 | 
			
		||||
                  "type": "ArrayExpression"
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "callee": {
 | 
			
		||||
                "end": 30,
 | 
			
		||||
                "name": "startSketchAt",
 | 
			
		||||
                "start": 17,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "end": 37,
 | 
			
		||||
              "start": 17,
 | 
			
		||||
              "type": "CallExpression",
 | 
			
		||||
              "type": "CallExpression"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "arguments": [
 | 
			
		||||
                {
 | 
			
		||||
                  "elements": [
 | 
			
		||||
                    {
 | 
			
		||||
                      "end": 58,
 | 
			
		||||
                      "raw": "0",
 | 
			
		||||
                      "start": 57,
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "value": 0.0
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                      "end": 61,
 | 
			
		||||
                      "raw": "1",
 | 
			
		||||
                      "start": 60,
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "value": 1.0
 | 
			
		||||
                    }
 | 
			
		||||
                  ],
 | 
			
		||||
                  "end": 62,
 | 
			
		||||
                  "start": 56,
 | 
			
		||||
                  "type": "ArrayExpression",
 | 
			
		||||
                  "type": "ArrayExpression"
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 65,
 | 
			
		||||
                  "start": 64,
 | 
			
		||||
                  "type": "PipeSubstitution",
 | 
			
		||||
                  "type": "PipeSubstitution"
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 74,
 | 
			
		||||
                  "start": 67,
 | 
			
		||||
                  "type": "TagDeclarator",
 | 
			
		||||
                  "type": "TagDeclarator",
 | 
			
		||||
                  "value": "myPath"
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "callee": {
 | 
			
		||||
                "end": 55,
 | 
			
		||||
                "name": "lineTo",
 | 
			
		||||
                "start": 49,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "end": 75,
 | 
			
		||||
              "start": 49,
 | 
			
		||||
              "type": "CallExpression",
 | 
			
		||||
              "type": "CallExpression"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "arguments": [
 | 
			
		||||
                {
 | 
			
		||||
                  "elements": [
 | 
			
		||||
                    {
 | 
			
		||||
                      "end": 96,
 | 
			
		||||
                      "raw": "1",
 | 
			
		||||
                      "start": 95,
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "value": 1.0
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                      "end": 99,
 | 
			
		||||
                      "raw": "1",
 | 
			
		||||
                      "start": 98,
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "value": 1.0
 | 
			
		||||
                    }
 | 
			
		||||
                  ],
 | 
			
		||||
                  "end": 100,
 | 
			
		||||
                  "start": 94,
 | 
			
		||||
                  "type": "ArrayExpression",
 | 
			
		||||
                  "type": "ArrayExpression"
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 103,
 | 
			
		||||
                  "start": 102,
 | 
			
		||||
                  "type": "PipeSubstitution",
 | 
			
		||||
                  "type": "PipeSubstitution"
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "callee": {
 | 
			
		||||
                "end": 93,
 | 
			
		||||
                "name": "lineTo",
 | 
			
		||||
                "start": 87,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "end": 104,
 | 
			
		||||
              "start": 87,
 | 
			
		||||
              "type": "CallExpression",
 | 
			
		||||
              "type": "CallExpression"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "arguments": [
 | 
			
		||||
                {
 | 
			
		||||
                  "elements": [
 | 
			
		||||
                    {
 | 
			
		||||
                      "end": 125,
 | 
			
		||||
                      "raw": "1",
 | 
			
		||||
                      "start": 124,
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "value": 1.0
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                      "end": 128,
 | 
			
		||||
                      "raw": "0",
 | 
			
		||||
                      "start": 127,
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "value": 0.0
 | 
			
		||||
                    }
 | 
			
		||||
                  ],
 | 
			
		||||
                  "end": 129,
 | 
			
		||||
                  "start": 123,
 | 
			
		||||
                  "type": "ArrayExpression",
 | 
			
		||||
                  "type": "ArrayExpression"
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 132,
 | 
			
		||||
                  "start": 131,
 | 
			
		||||
                  "type": "PipeSubstitution",
 | 
			
		||||
                  "type": "PipeSubstitution"
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 144,
 | 
			
		||||
                  "start": 134,
 | 
			
		||||
                  "type": "TagDeclarator",
 | 
			
		||||
                  "type": "TagDeclarator",
 | 
			
		||||
                  "value": "rightPath"
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "callee": {
 | 
			
		||||
                "end": 122,
 | 
			
		||||
                "name": "lineTo",
 | 
			
		||||
                "start": 116,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "end": 145,
 | 
			
		||||
              "start": 116,
 | 
			
		||||
              "type": "CallExpression",
 | 
			
		||||
              "type": "CallExpression"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "arguments": [
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 164,
 | 
			
		||||
                  "start": 163,
 | 
			
		||||
                  "type": "PipeSubstitution",
 | 
			
		||||
                  "type": "PipeSubstitution"
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "callee": {
 | 
			
		||||
                "end": 162,
 | 
			
		||||
                "name": "close",
 | 
			
		||||
                "start": 157,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "end": 165,
 | 
			
		||||
              "start": 157,
 | 
			
		||||
              "type": "CallExpression",
 | 
			
		||||
              "type": "CallExpression"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "end": 165,
 | 
			
		||||
          "start": 17,
 | 
			
		||||
          "type": "PipeExpression",
 | 
			
		||||
          "type": "PipeExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 6,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 165,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,135 +1,131 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 3989
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 70,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 14,
 | 
			
		||||
            "name": "mySketch",
 | 
			
		||||
            "start": 6,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "body": [
 | 
			
		||||
              {
 | 
			
		||||
                "arguments": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "elements": [
 | 
			
		||||
                      {
 | 
			
		||||
                        "end": 33,
 | 
			
		||||
                        "raw": "0",
 | 
			
		||||
                        "start": 32,
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "value": 0.0
 | 
			
		||||
                      },
 | 
			
		||||
                      {
 | 
			
		||||
                        "end": 35,
 | 
			
		||||
                        "raw": "0",
 | 
			
		||||
                        "start": 34,
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "value": 0.0
 | 
			
		||||
                      }
 | 
			
		||||
                    ],
 | 
			
		||||
                    "end": 36,
 | 
			
		||||
                    "start": 31,
 | 
			
		||||
                    "type": "ArrayExpression",
 | 
			
		||||
                    "type": "ArrayExpression"
 | 
			
		||||
                  }
 | 
			
		||||
                ],
 | 
			
		||||
                "callee": {
 | 
			
		||||
                  "end": 30,
 | 
			
		||||
                  "name": "startSketchAt",
 | 
			
		||||
                  "start": 17,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "end": 37,
 | 
			
		||||
                "start": 17,
 | 
			
		||||
                "type": "CallExpression",
 | 
			
		||||
                "type": "CallExpression"
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                "arguments": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "elements": [
 | 
			
		||||
                      {
 | 
			
		||||
                        "end": 50,
 | 
			
		||||
                        "raw": "1",
 | 
			
		||||
                        "start": 49,
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "value": 1.0
 | 
			
		||||
                      },
 | 
			
		||||
                      {
 | 
			
		||||
                        "end": 53,
 | 
			
		||||
                        "raw": "1",
 | 
			
		||||
                        "start": 52,
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "value": 1.0
 | 
			
		||||
                      }
 | 
			
		||||
                    ],
 | 
			
		||||
                    "end": 54,
 | 
			
		||||
                    "start": 48,
 | 
			
		||||
                    "type": "ArrayExpression",
 | 
			
		||||
                    "type": "ArrayExpression"
 | 
			
		||||
                  },
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 57,
 | 
			
		||||
                    "start": 56,
 | 
			
		||||
                    "type": "PipeSubstitution",
 | 
			
		||||
                    "type": "PipeSubstitution"
 | 
			
		||||
                  }
 | 
			
		||||
                ],
 | 
			
		||||
                "callee": {
 | 
			
		||||
                  "end": 47,
 | 
			
		||||
                  "name": "lineTo",
 | 
			
		||||
                  "start": 41,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "end": 58,
 | 
			
		||||
                "start": 41,
 | 
			
		||||
                "type": "CallExpression",
 | 
			
		||||
                "type": "CallExpression"
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                "arguments": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 69,
 | 
			
		||||
                    "start": 68,
 | 
			
		||||
                    "type": "PipeSubstitution",
 | 
			
		||||
                    "type": "PipeSubstitution"
 | 
			
		||||
                  }
 | 
			
		||||
                ],
 | 
			
		||||
                "callee": {
 | 
			
		||||
                  "end": 67,
 | 
			
		||||
                  "name": "close",
 | 
			
		||||
                  "start": 62,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "end": 70,
 | 
			
		||||
                "start": 62,
 | 
			
		||||
                "type": "CallExpression",
 | 
			
		||||
                "type": "CallExpression"
 | 
			
		||||
              }
 | 
			
		||||
            ],
 | 
			
		||||
            "end": 70,
 | 
			
		||||
            "start": 17,
 | 
			
		||||
            "type": "PipeExpression",
 | 
			
		||||
            "type": "PipeExpression"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 70,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 14,
 | 
			
		||||
          "name": "mySketch",
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "body": [
 | 
			
		||||
            {
 | 
			
		||||
              "arguments": [
 | 
			
		||||
                {
 | 
			
		||||
                  "elements": [
 | 
			
		||||
                    {
 | 
			
		||||
                      "end": 33,
 | 
			
		||||
                      "raw": "0",
 | 
			
		||||
                      "start": 32,
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "value": 0.0
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                      "end": 35,
 | 
			
		||||
                      "raw": "0",
 | 
			
		||||
                      "start": 34,
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "value": 0.0
 | 
			
		||||
                    }
 | 
			
		||||
                  ],
 | 
			
		||||
                  "end": 36,
 | 
			
		||||
                  "start": 31,
 | 
			
		||||
                  "type": "ArrayExpression",
 | 
			
		||||
                  "type": "ArrayExpression"
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "callee": {
 | 
			
		||||
                "end": 30,
 | 
			
		||||
                "name": "startSketchAt",
 | 
			
		||||
                "start": 17,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "end": 37,
 | 
			
		||||
              "start": 17,
 | 
			
		||||
              "type": "CallExpression",
 | 
			
		||||
              "type": "CallExpression"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "arguments": [
 | 
			
		||||
                {
 | 
			
		||||
                  "elements": [
 | 
			
		||||
                    {
 | 
			
		||||
                      "end": 50,
 | 
			
		||||
                      "raw": "1",
 | 
			
		||||
                      "start": 49,
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "value": 1.0
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                      "end": 53,
 | 
			
		||||
                      "raw": "1",
 | 
			
		||||
                      "start": 52,
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "value": 1.0
 | 
			
		||||
                    }
 | 
			
		||||
                  ],
 | 
			
		||||
                  "end": 54,
 | 
			
		||||
                  "start": 48,
 | 
			
		||||
                  "type": "ArrayExpression",
 | 
			
		||||
                  "type": "ArrayExpression"
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 57,
 | 
			
		||||
                  "start": 56,
 | 
			
		||||
                  "type": "PipeSubstitution",
 | 
			
		||||
                  "type": "PipeSubstitution"
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "callee": {
 | 
			
		||||
                "end": 47,
 | 
			
		||||
                "name": "lineTo",
 | 
			
		||||
                "start": 41,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "end": 58,
 | 
			
		||||
              "start": 41,
 | 
			
		||||
              "type": "CallExpression",
 | 
			
		||||
              "type": "CallExpression"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "arguments": [
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 69,
 | 
			
		||||
                  "start": 68,
 | 
			
		||||
                  "type": "PipeSubstitution",
 | 
			
		||||
                  "type": "PipeSubstitution"
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "callee": {
 | 
			
		||||
                "end": 67,
 | 
			
		||||
                "name": "close",
 | 
			
		||||
                "start": 62,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "end": 70,
 | 
			
		||||
              "start": 62,
 | 
			
		||||
              "type": "CallExpression",
 | 
			
		||||
              "type": "CallExpression"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "end": 70,
 | 
			
		||||
          "start": 17,
 | 
			
		||||
          "type": "PipeExpression",
 | 
			
		||||
          "type": "PipeExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 6,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 70,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,46 +1,42 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 3993
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 30,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 11,
 | 
			
		||||
            "name": "myBox",
 | 
			
		||||
            "start": 6,
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 30,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 11,
 | 
			
		||||
          "name": "myBox",
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "arguments": [
 | 
			
		||||
            {
 | 
			
		||||
              "end": 29,
 | 
			
		||||
              "name": "p",
 | 
			
		||||
              "start": 28,
 | 
			
		||||
              "type": "Identifier",
 | 
			
		||||
              "type": "Identifier"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "callee": {
 | 
			
		||||
            "end": 27,
 | 
			
		||||
            "name": "startSketchAt",
 | 
			
		||||
            "start": 14,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "arguments": [
 | 
			
		||||
              {
 | 
			
		||||
                "end": 29,
 | 
			
		||||
                "name": "p",
 | 
			
		||||
                "start": 28,
 | 
			
		||||
                "type": "Identifier",
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              }
 | 
			
		||||
            ],
 | 
			
		||||
            "callee": {
 | 
			
		||||
              "end": 27,
 | 
			
		||||
              "name": "startSketchAt",
 | 
			
		||||
              "start": 14,
 | 
			
		||||
              "type": "Identifier"
 | 
			
		||||
            },
 | 
			
		||||
            "end": 30,
 | 
			
		||||
            "start": 14,
 | 
			
		||||
            "type": "CallExpression",
 | 
			
		||||
            "type": "CallExpression"
 | 
			
		||||
          },
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "end": 30,
 | 
			
		||||
          "start": 14,
 | 
			
		||||
          "type": "CallExpression",
 | 
			
		||||
          "type": "CallExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 6,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 30,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,83 +1,79 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 3994
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 29,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 11,
 | 
			
		||||
            "name": "myBox",
 | 
			
		||||
            "start": 6,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "body": [
 | 
			
		||||
              {
 | 
			
		||||
                "arguments": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 17,
 | 
			
		||||
                    "raw": "1",
 | 
			
		||||
                    "start": 16,
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "value": 1.0
 | 
			
		||||
                  }
 | 
			
		||||
                ],
 | 
			
		||||
                "callee": {
 | 
			
		||||
                  "end": 15,
 | 
			
		||||
                  "name": "f",
 | 
			
		||||
                  "start": 14,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "end": 18,
 | 
			
		||||
                "start": 14,
 | 
			
		||||
                "type": "CallExpression",
 | 
			
		||||
                "type": "CallExpression"
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                "arguments": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 25,
 | 
			
		||||
                    "raw": "2",
 | 
			
		||||
                    "start": 24,
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "value": 2.0
 | 
			
		||||
                  },
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 28,
 | 
			
		||||
                    "start": 27,
 | 
			
		||||
                    "type": "PipeSubstitution",
 | 
			
		||||
                    "type": "PipeSubstitution"
 | 
			
		||||
                  }
 | 
			
		||||
                ],
 | 
			
		||||
                "callee": {
 | 
			
		||||
                  "end": 23,
 | 
			
		||||
                  "name": "g",
 | 
			
		||||
                  "start": 22,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "end": 29,
 | 
			
		||||
                "start": 22,
 | 
			
		||||
                "type": "CallExpression",
 | 
			
		||||
                "type": "CallExpression"
 | 
			
		||||
              }
 | 
			
		||||
            ],
 | 
			
		||||
            "end": 29,
 | 
			
		||||
            "start": 14,
 | 
			
		||||
            "type": "PipeExpression",
 | 
			
		||||
            "type": "PipeExpression"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 29,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 11,
 | 
			
		||||
          "name": "myBox",
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "body": [
 | 
			
		||||
            {
 | 
			
		||||
              "arguments": [
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 17,
 | 
			
		||||
                  "raw": "1",
 | 
			
		||||
                  "start": 16,
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "value": 1.0
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "callee": {
 | 
			
		||||
                "end": 15,
 | 
			
		||||
                "name": "f",
 | 
			
		||||
                "start": 14,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "end": 18,
 | 
			
		||||
              "start": 14,
 | 
			
		||||
              "type": "CallExpression",
 | 
			
		||||
              "type": "CallExpression"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "arguments": [
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 25,
 | 
			
		||||
                  "raw": "2",
 | 
			
		||||
                  "start": 24,
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "value": 2.0
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 28,
 | 
			
		||||
                  "start": 27,
 | 
			
		||||
                  "type": "PipeSubstitution",
 | 
			
		||||
                  "type": "PipeSubstitution"
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "callee": {
 | 
			
		||||
                "end": 23,
 | 
			
		||||
                "name": "g",
 | 
			
		||||
                "start": 22,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "end": 29,
 | 
			
		||||
              "start": 22,
 | 
			
		||||
              "type": "CallExpression",
 | 
			
		||||
              "type": "CallExpression"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "end": 29,
 | 
			
		||||
          "start": 14,
 | 
			
		||||
          "type": "PipeExpression",
 | 
			
		||||
          "type": "PipeExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 6,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 29,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,97 +1,93 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 3995
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 49,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 11,
 | 
			
		||||
            "name": "myBox",
 | 
			
		||||
            "start": 6,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "body": [
 | 
			
		||||
              {
 | 
			
		||||
                "arguments": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 29,
 | 
			
		||||
                    "name": "p",
 | 
			
		||||
                    "start": 28,
 | 
			
		||||
                    "type": "Identifier",
 | 
			
		||||
                    "type": "Identifier"
 | 
			
		||||
                  }
 | 
			
		||||
                ],
 | 
			
		||||
                "callee": {
 | 
			
		||||
                  "end": 27,
 | 
			
		||||
                  "name": "startSketchAt",
 | 
			
		||||
                  "start": 14,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "end": 30,
 | 
			
		||||
                "start": 14,
 | 
			
		||||
                "type": "CallExpression",
 | 
			
		||||
                "type": "CallExpression"
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                "arguments": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "elements": [
 | 
			
		||||
                      {
 | 
			
		||||
                        "end": 41,
 | 
			
		||||
                        "raw": "0",
 | 
			
		||||
                        "start": 40,
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "value": 0.0
 | 
			
		||||
                      },
 | 
			
		||||
                      {
 | 
			
		||||
                        "end": 44,
 | 
			
		||||
                        "name": "l",
 | 
			
		||||
                        "start": 43,
 | 
			
		||||
                        "type": "Identifier",
 | 
			
		||||
                        "type": "Identifier"
 | 
			
		||||
                      }
 | 
			
		||||
                    ],
 | 
			
		||||
                    "end": 45,
 | 
			
		||||
                    "start": 39,
 | 
			
		||||
                    "type": "ArrayExpression",
 | 
			
		||||
                    "type": "ArrayExpression"
 | 
			
		||||
                  },
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 48,
 | 
			
		||||
                    "start": 47,
 | 
			
		||||
                    "type": "PipeSubstitution",
 | 
			
		||||
                    "type": "PipeSubstitution"
 | 
			
		||||
                  }
 | 
			
		||||
                ],
 | 
			
		||||
                "callee": {
 | 
			
		||||
                  "end": 38,
 | 
			
		||||
                  "name": "line",
 | 
			
		||||
                  "start": 34,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "end": 49,
 | 
			
		||||
                "start": 34,
 | 
			
		||||
                "type": "CallExpression",
 | 
			
		||||
                "type": "CallExpression"
 | 
			
		||||
              }
 | 
			
		||||
            ],
 | 
			
		||||
            "end": 49,
 | 
			
		||||
            "start": 14,
 | 
			
		||||
            "type": "PipeExpression",
 | 
			
		||||
            "type": "PipeExpression"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 49,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 11,
 | 
			
		||||
          "name": "myBox",
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "body": [
 | 
			
		||||
            {
 | 
			
		||||
              "arguments": [
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 29,
 | 
			
		||||
                  "name": "p",
 | 
			
		||||
                  "start": 28,
 | 
			
		||||
                  "type": "Identifier",
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "callee": {
 | 
			
		||||
                "end": 27,
 | 
			
		||||
                "name": "startSketchAt",
 | 
			
		||||
                "start": 14,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "end": 30,
 | 
			
		||||
              "start": 14,
 | 
			
		||||
              "type": "CallExpression",
 | 
			
		||||
              "type": "CallExpression"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "arguments": [
 | 
			
		||||
                {
 | 
			
		||||
                  "elements": [
 | 
			
		||||
                    {
 | 
			
		||||
                      "end": 41,
 | 
			
		||||
                      "raw": "0",
 | 
			
		||||
                      "start": 40,
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "value": 0.0
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                      "end": 44,
 | 
			
		||||
                      "name": "l",
 | 
			
		||||
                      "start": 43,
 | 
			
		||||
                      "type": "Identifier",
 | 
			
		||||
                      "type": "Identifier"
 | 
			
		||||
                    }
 | 
			
		||||
                  ],
 | 
			
		||||
                  "end": 45,
 | 
			
		||||
                  "start": 39,
 | 
			
		||||
                  "type": "ArrayExpression",
 | 
			
		||||
                  "type": "ArrayExpression"
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 48,
 | 
			
		||||
                  "start": 47,
 | 
			
		||||
                  "type": "PipeSubstitution",
 | 
			
		||||
                  "type": "PipeSubstitution"
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "callee": {
 | 
			
		||||
                "end": 38,
 | 
			
		||||
                "name": "line",
 | 
			
		||||
                "start": 34,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "end": 49,
 | 
			
		||||
              "start": 34,
 | 
			
		||||
              "type": "CallExpression",
 | 
			
		||||
              "type": "CallExpression"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "end": 49,
 | 
			
		||||
          "start": 14,
 | 
			
		||||
          "type": "PipeExpression",
 | 
			
		||||
          "type": "PipeExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 6,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 49,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,63 +1,59 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 4001
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 37,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 14,
 | 
			
		||||
            "name": "mySketch",
 | 
			
		||||
            "start": 6,
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 37,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 14,
 | 
			
		||||
          "name": "mySketch",
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "arguments": [
 | 
			
		||||
            {
 | 
			
		||||
              "elements": [
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 33,
 | 
			
		||||
                  "raw": "0",
 | 
			
		||||
                  "start": 32,
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "value": 0.0
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 35,
 | 
			
		||||
                  "raw": "0",
 | 
			
		||||
                  "start": 34,
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "value": 0.0
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "end": 36,
 | 
			
		||||
              "start": 31,
 | 
			
		||||
              "type": "ArrayExpression",
 | 
			
		||||
              "type": "ArrayExpression"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "callee": {
 | 
			
		||||
            "end": 30,
 | 
			
		||||
            "name": "startSketchAt",
 | 
			
		||||
            "start": 17,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "arguments": [
 | 
			
		||||
              {
 | 
			
		||||
                "elements": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 33,
 | 
			
		||||
                    "raw": "0",
 | 
			
		||||
                    "start": 32,
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "value": 0.0
 | 
			
		||||
                  },
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 35,
 | 
			
		||||
                    "raw": "0",
 | 
			
		||||
                    "start": 34,
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "value": 0.0
 | 
			
		||||
                  }
 | 
			
		||||
                ],
 | 
			
		||||
                "end": 36,
 | 
			
		||||
                "start": 31,
 | 
			
		||||
                "type": "ArrayExpression",
 | 
			
		||||
                "type": "ArrayExpression"
 | 
			
		||||
              }
 | 
			
		||||
            ],
 | 
			
		||||
            "callee": {
 | 
			
		||||
              "end": 30,
 | 
			
		||||
              "name": "startSketchAt",
 | 
			
		||||
              "start": 17,
 | 
			
		||||
              "type": "Identifier"
 | 
			
		||||
            },
 | 
			
		||||
            "end": 37,
 | 
			
		||||
            "start": 17,
 | 
			
		||||
            "type": "CallExpression",
 | 
			
		||||
            "type": "CallExpression"
 | 
			
		||||
          },
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "end": 37,
 | 
			
		||||
          "start": 17,
 | 
			
		||||
          "type": "CallExpression",
 | 
			
		||||
          "type": "CallExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 6,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 37,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,165 +1,161 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 4005
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 107,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 14,
 | 
			
		||||
            "name": "cylinder",
 | 
			
		||||
            "start": 6,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "body": [
 | 
			
		||||
              {
 | 
			
		||||
                "arguments": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 35,
 | 
			
		||||
                    "raw": "'XY'",
 | 
			
		||||
                    "start": 31,
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "value": "XY"
 | 
			
		||||
                  }
 | 
			
		||||
                ],
 | 
			
		||||
                "callee": {
 | 
			
		||||
                  "end": 30,
 | 
			
		||||
                  "name": "startSketchOn",
 | 
			
		||||
                  "start": 17,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "end": 36,
 | 
			
		||||
                "start": 17,
 | 
			
		||||
                "type": "CallExpression",
 | 
			
		||||
                "type": "CallExpression"
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                "arguments": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 81,
 | 
			
		||||
                    "properties": [
 | 
			
		||||
                      {
 | 
			
		||||
                        "end": 67,
 | 
			
		||||
                        "key": {
 | 
			
		||||
                          "end": 59,
 | 
			
		||||
                          "name": "center",
 | 
			
		||||
                          "start": 53,
 | 
			
		||||
                          "type": "Identifier"
 | 
			
		||||
                        },
 | 
			
		||||
                        "start": 53,
 | 
			
		||||
                        "type": "ObjectProperty",
 | 
			
		||||
                        "value": {
 | 
			
		||||
                          "elements": [
 | 
			
		||||
                            {
 | 
			
		||||
                              "end": 63,
 | 
			
		||||
                              "raw": "0",
 | 
			
		||||
                              "start": 62,
 | 
			
		||||
                              "type": "Literal",
 | 
			
		||||
                              "type": "Literal",
 | 
			
		||||
                              "value": 0.0
 | 
			
		||||
                            },
 | 
			
		||||
                            {
 | 
			
		||||
                              "end": 66,
 | 
			
		||||
                              "raw": "0",
 | 
			
		||||
                              "start": 65,
 | 
			
		||||
                              "type": "Literal",
 | 
			
		||||
                              "type": "Literal",
 | 
			
		||||
                              "value": 0.0
 | 
			
		||||
                            }
 | 
			
		||||
                          ],
 | 
			
		||||
                          "end": 67,
 | 
			
		||||
                          "start": 61,
 | 
			
		||||
                          "type": "ArrayExpression",
 | 
			
		||||
                          "type": "ArrayExpression"
 | 
			
		||||
                        }
 | 
			
		||||
                      },
 | 
			
		||||
                      {
 | 
			
		||||
                        "end": 79,
 | 
			
		||||
                        "key": {
 | 
			
		||||
                          "end": 75,
 | 
			
		||||
                          "name": "radius",
 | 
			
		||||
                          "start": 69,
 | 
			
		||||
                          "type": "Identifier"
 | 
			
		||||
                        },
 | 
			
		||||
                        "start": 69,
 | 
			
		||||
                        "type": "ObjectProperty",
 | 
			
		||||
                        "value": {
 | 
			
		||||
                          "end": 79,
 | 
			
		||||
                          "raw": "22",
 | 
			
		||||
                          "start": 77,
 | 
			
		||||
                          "type": "Literal",
 | 
			
		||||
                          "type": "Literal",
 | 
			
		||||
                          "value": 22.0
 | 
			
		||||
                        }
 | 
			
		||||
                      }
 | 
			
		||||
                    ],
 | 
			
		||||
                    "start": 51,
 | 
			
		||||
                    "type": "ObjectExpression",
 | 
			
		||||
                    "type": "ObjectExpression"
 | 
			
		||||
                  },
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 84,
 | 
			
		||||
                    "start": 83,
 | 
			
		||||
                    "type": "PipeSubstitution",
 | 
			
		||||
                    "type": "PipeSubstitution"
 | 
			
		||||
                  }
 | 
			
		||||
                ],
 | 
			
		||||
                "callee": {
 | 
			
		||||
                  "end": 50,
 | 
			
		||||
                  "name": "circle",
 | 
			
		||||
                  "start": 44,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "end": 85,
 | 
			
		||||
                "start": 44,
 | 
			
		||||
                "type": "CallExpression",
 | 
			
		||||
                "type": "CallExpression"
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                "arguments": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 103,
 | 
			
		||||
                    "raw": "14",
 | 
			
		||||
                    "start": 101,
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "value": 14.0
 | 
			
		||||
                  },
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 106,
 | 
			
		||||
                    "start": 105,
 | 
			
		||||
                    "type": "PipeSubstitution",
 | 
			
		||||
                    "type": "PipeSubstitution"
 | 
			
		||||
                  }
 | 
			
		||||
                ],
 | 
			
		||||
                "callee": {
 | 
			
		||||
                  "end": 100,
 | 
			
		||||
                  "name": "extrude",
 | 
			
		||||
                  "start": 93,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "end": 107,
 | 
			
		||||
                "start": 93,
 | 
			
		||||
                "type": "CallExpression",
 | 
			
		||||
                "type": "CallExpression"
 | 
			
		||||
              }
 | 
			
		||||
            ],
 | 
			
		||||
            "end": 107,
 | 
			
		||||
            "start": 17,
 | 
			
		||||
            "type": "PipeExpression",
 | 
			
		||||
            "type": "PipeExpression"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 107,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 14,
 | 
			
		||||
          "name": "cylinder",
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "body": [
 | 
			
		||||
            {
 | 
			
		||||
              "arguments": [
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 35,
 | 
			
		||||
                  "raw": "'XY'",
 | 
			
		||||
                  "start": 31,
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "value": "XY"
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "callee": {
 | 
			
		||||
                "end": 30,
 | 
			
		||||
                "name": "startSketchOn",
 | 
			
		||||
                "start": 17,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "end": 36,
 | 
			
		||||
              "start": 17,
 | 
			
		||||
              "type": "CallExpression",
 | 
			
		||||
              "type": "CallExpression"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "arguments": [
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 81,
 | 
			
		||||
                  "properties": [
 | 
			
		||||
                    {
 | 
			
		||||
                      "end": 67,
 | 
			
		||||
                      "key": {
 | 
			
		||||
                        "end": 59,
 | 
			
		||||
                        "name": "center",
 | 
			
		||||
                        "start": 53,
 | 
			
		||||
                        "type": "Identifier"
 | 
			
		||||
                      },
 | 
			
		||||
                      "start": 53,
 | 
			
		||||
                      "type": "ObjectProperty",
 | 
			
		||||
                      "value": {
 | 
			
		||||
                        "elements": [
 | 
			
		||||
                          {
 | 
			
		||||
                            "end": 63,
 | 
			
		||||
                            "raw": "0",
 | 
			
		||||
                            "start": 62,
 | 
			
		||||
                            "type": "Literal",
 | 
			
		||||
                            "type": "Literal",
 | 
			
		||||
                            "value": 0.0
 | 
			
		||||
                          },
 | 
			
		||||
                          {
 | 
			
		||||
                            "end": 66,
 | 
			
		||||
                            "raw": "0",
 | 
			
		||||
                            "start": 65,
 | 
			
		||||
                            "type": "Literal",
 | 
			
		||||
                            "type": "Literal",
 | 
			
		||||
                            "value": 0.0
 | 
			
		||||
                          }
 | 
			
		||||
                        ],
 | 
			
		||||
                        "end": 67,
 | 
			
		||||
                        "start": 61,
 | 
			
		||||
                        "type": "ArrayExpression",
 | 
			
		||||
                        "type": "ArrayExpression"
 | 
			
		||||
                      }
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                      "end": 79,
 | 
			
		||||
                      "key": {
 | 
			
		||||
                        "end": 75,
 | 
			
		||||
                        "name": "radius",
 | 
			
		||||
                        "start": 69,
 | 
			
		||||
                        "type": "Identifier"
 | 
			
		||||
                      },
 | 
			
		||||
                      "start": 69,
 | 
			
		||||
                      "type": "ObjectProperty",
 | 
			
		||||
                      "value": {
 | 
			
		||||
                        "end": 79,
 | 
			
		||||
                        "raw": "22",
 | 
			
		||||
                        "start": 77,
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "value": 22.0
 | 
			
		||||
                      }
 | 
			
		||||
                    }
 | 
			
		||||
                  ],
 | 
			
		||||
                  "start": 51,
 | 
			
		||||
                  "type": "ObjectExpression",
 | 
			
		||||
                  "type": "ObjectExpression"
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 84,
 | 
			
		||||
                  "start": 83,
 | 
			
		||||
                  "type": "PipeSubstitution",
 | 
			
		||||
                  "type": "PipeSubstitution"
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "callee": {
 | 
			
		||||
                "end": 50,
 | 
			
		||||
                "name": "circle",
 | 
			
		||||
                "start": 44,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "end": 85,
 | 
			
		||||
              "start": 44,
 | 
			
		||||
              "type": "CallExpression",
 | 
			
		||||
              "type": "CallExpression"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "arguments": [
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 103,
 | 
			
		||||
                  "raw": "14",
 | 
			
		||||
                  "start": 101,
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "value": 14.0
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 106,
 | 
			
		||||
                  "start": 105,
 | 
			
		||||
                  "type": "PipeSubstitution",
 | 
			
		||||
                  "type": "PipeSubstitution"
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "callee": {
 | 
			
		||||
                "end": 100,
 | 
			
		||||
                "name": "extrude",
 | 
			
		||||
                "start": 93,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "end": 107,
 | 
			
		||||
              "start": 93,
 | 
			
		||||
              "type": "CallExpression",
 | 
			
		||||
              "type": "CallExpression"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "end": 107,
 | 
			
		||||
          "start": 17,
 | 
			
		||||
          "type": "PipeExpression",
 | 
			
		||||
          "type": "PipeExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 6,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 107,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,87 +1,84 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 49,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 4,
 | 
			
		||||
            "name": "f",
 | 
			
		||||
            "start": 3,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "body": {
 | 
			
		||||
              "body": [
 | 
			
		||||
                {
 | 
			
		||||
                  "argument": {
 | 
			
		||||
                    "arguments": [
 | 
			
		||||
                      {
 | 
			
		||||
                        "end": 41,
 | 
			
		||||
                        "name": "angle",
 | 
			
		||||
                        "start": 36,
 | 
			
		||||
                        "type": "Identifier",
 | 
			
		||||
                        "type": "Identifier"
 | 
			
		||||
                      },
 | 
			
		||||
                      {
 | 
			
		||||
                        "end": 46,
 | 
			
		||||
                        "raw": "360",
 | 
			
		||||
                        "start": 43,
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "value": 360.0
 | 
			
		||||
                      }
 | 
			
		||||
                    ],
 | 
			
		||||
                    "callee": {
 | 
			
		||||
                      "end": 35,
 | 
			
		||||
                      "name": "default",
 | 
			
		||||
                      "start": 28,
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 49,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 4,
 | 
			
		||||
          "name": "f",
 | 
			
		||||
          "start": 3,
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "body": {
 | 
			
		||||
            "body": [
 | 
			
		||||
              {
 | 
			
		||||
                "argument": {
 | 
			
		||||
                  "arguments": [
 | 
			
		||||
                    {
 | 
			
		||||
                      "end": 41,
 | 
			
		||||
                      "name": "angle",
 | 
			
		||||
                      "start": 36,
 | 
			
		||||
                      "type": "Identifier",
 | 
			
		||||
                      "type": "Identifier"
 | 
			
		||||
                    },
 | 
			
		||||
                    "end": 47,
 | 
			
		||||
                    {
 | 
			
		||||
                      "end": 46,
 | 
			
		||||
                      "raw": "360",
 | 
			
		||||
                      "start": 43,
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "value": 360.0
 | 
			
		||||
                    }
 | 
			
		||||
                  ],
 | 
			
		||||
                  "callee": {
 | 
			
		||||
                    "end": 35,
 | 
			
		||||
                    "name": "default",
 | 
			
		||||
                    "start": 28,
 | 
			
		||||
                    "type": "CallExpression",
 | 
			
		||||
                    "type": "CallExpression"
 | 
			
		||||
                    "type": "Identifier"
 | 
			
		||||
                  },
 | 
			
		||||
                  "end": 47,
 | 
			
		||||
                  "start": 21,
 | 
			
		||||
                  "type": "ReturnStatement",
 | 
			
		||||
                  "type": "ReturnStatement"
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "end": 49,
 | 
			
		||||
              "start": 19
 | 
			
		||||
            },
 | 
			
		||||
            "end": 49,
 | 
			
		||||
            "params": [
 | 
			
		||||
              {
 | 
			
		||||
                "type": "Parameter",
 | 
			
		||||
                "identifier": {
 | 
			
		||||
                  "end": 13,
 | 
			
		||||
                  "name": "angle",
 | 
			
		||||
                  "start": 8,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                  "start": 28,
 | 
			
		||||
                  "type": "CallExpression",
 | 
			
		||||
                  "type": "CallExpression"
 | 
			
		||||
                },
 | 
			
		||||
                "default_value": {
 | 
			
		||||
                  "type": "KclNone",
 | 
			
		||||
                  "type": "KclNone",
 | 
			
		||||
                  "__private": "KCL_NONE_ID"
 | 
			
		||||
                }
 | 
			
		||||
                "end": 47,
 | 
			
		||||
                "start": 21,
 | 
			
		||||
                "type": "ReturnStatement",
 | 
			
		||||
                "type": "ReturnStatement"
 | 
			
		||||
              }
 | 
			
		||||
            ],
 | 
			
		||||
            "start": 7,
 | 
			
		||||
            "type": "FunctionExpression",
 | 
			
		||||
            "type": "FunctionExpression"
 | 
			
		||||
            "end": 49,
 | 
			
		||||
            "start": 19
 | 
			
		||||
          },
 | 
			
		||||
          "start": 3,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "end": 49,
 | 
			
		||||
          "params": [
 | 
			
		||||
            {
 | 
			
		||||
              "type": "Parameter",
 | 
			
		||||
              "identifier": {
 | 
			
		||||
                "end": 13,
 | 
			
		||||
                "name": "angle",
 | 
			
		||||
                "start": 8,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "default_value": {
 | 
			
		||||
                "type": "KclNone",
 | 
			
		||||
                "type": "KclNone",
 | 
			
		||||
                "__private": "KCL_NONE_ID"
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "start": 7,
 | 
			
		||||
          "type": "FunctionExpression",
 | 
			
		||||
          "type": "FunctionExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 3,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 49,
 | 
			
		||||
      "kind": "fn",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,78 +1,74 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 4007
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 91,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 11,
 | 
			
		||||
            "name": "numbers",
 | 
			
		||||
            "start": 4,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "elements": [
 | 
			
		||||
              {
 | 
			
		||||
                "end": 29,
 | 
			
		||||
                "raw": "1",
 | 
			
		||||
                "start": 28,
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "value": 1.0
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                "end": 80,
 | 
			
		||||
                "raw": "3",
 | 
			
		||||
                "start": 79,
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "value": 3.0
 | 
			
		||||
              }
 | 
			
		||||
            ],
 | 
			
		||||
            "end": 91,
 | 
			
		||||
            "nonCodeMeta": {
 | 
			
		||||
              "nonCodeNodes": {
 | 
			
		||||
                "1": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 48,
 | 
			
		||||
                    "start": 43,
 | 
			
		||||
                    "type": "NonCodeNode",
 | 
			
		||||
                    "value": {
 | 
			
		||||
                      "type": "blockComment",
 | 
			
		||||
                      "value": "A,",
 | 
			
		||||
                      "style": "line"
 | 
			
		||||
                    }
 | 
			
		||||
                  }
 | 
			
		||||
                ],
 | 
			
		||||
                "2": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 66,
 | 
			
		||||
                    "start": 61,
 | 
			
		||||
                    "type": "NonCodeNode",
 | 
			
		||||
                    "value": {
 | 
			
		||||
                      "type": "blockComment",
 | 
			
		||||
                      "value": "B,",
 | 
			
		||||
                      "style": "line"
 | 
			
		||||
                    }
 | 
			
		||||
                  }
 | 
			
		||||
                ]
 | 
			
		||||
              },
 | 
			
		||||
              "startNodes": []
 | 
			
		||||
            },
 | 
			
		||||
            "start": 14,
 | 
			
		||||
            "type": "ArrayExpression",
 | 
			
		||||
            "type": "ArrayExpression"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 91,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 11,
 | 
			
		||||
          "name": "numbers",
 | 
			
		||||
          "start": 4,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "elements": [
 | 
			
		||||
            {
 | 
			
		||||
              "end": 29,
 | 
			
		||||
              "raw": "1",
 | 
			
		||||
              "start": 28,
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "value": 1.0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "end": 80,
 | 
			
		||||
              "raw": "3",
 | 
			
		||||
              "start": 79,
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "value": 3.0
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "end": 91,
 | 
			
		||||
          "nonCodeMeta": {
 | 
			
		||||
            "nonCodeNodes": {
 | 
			
		||||
              "1": [
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 48,
 | 
			
		||||
                  "start": 43,
 | 
			
		||||
                  "type": "NonCodeNode",
 | 
			
		||||
                  "value": {
 | 
			
		||||
                    "type": "blockComment",
 | 
			
		||||
                    "value": "A,",
 | 
			
		||||
                    "style": "line"
 | 
			
		||||
                  }
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "2": [
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 66,
 | 
			
		||||
                  "start": 61,
 | 
			
		||||
                  "type": "NonCodeNode",
 | 
			
		||||
                  "value": {
 | 
			
		||||
                    "type": "blockComment",
 | 
			
		||||
                    "value": "B,",
 | 
			
		||||
                    "style": "line"
 | 
			
		||||
                  }
 | 
			
		||||
                }
 | 
			
		||||
              ]
 | 
			
		||||
            },
 | 
			
		||||
            "startNodes": []
 | 
			
		||||
          },
 | 
			
		||||
          "start": 14,
 | 
			
		||||
          "type": "ArrayExpression",
 | 
			
		||||
          "type": "ArrayExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 4,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 91,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,78 +1,74 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 4016
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 91,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 11,
 | 
			
		||||
            "name": "numbers",
 | 
			
		||||
            "start": 4,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "elements": [
 | 
			
		||||
              {
 | 
			
		||||
                "end": 29,
 | 
			
		||||
                "raw": "1",
 | 
			
		||||
                "start": 28,
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "value": 1.0
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                "end": 44,
 | 
			
		||||
                "raw": "2",
 | 
			
		||||
                "start": 43,
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "value": 2.0
 | 
			
		||||
              }
 | 
			
		||||
            ],
 | 
			
		||||
            "end": 91,
 | 
			
		||||
            "nonCodeMeta": {
 | 
			
		||||
              "nonCodeNodes": {
 | 
			
		||||
                "2": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 63,
 | 
			
		||||
                    "start": 58,
 | 
			
		||||
                    "type": "NonCodeNode",
 | 
			
		||||
                    "value": {
 | 
			
		||||
                      "type": "blockComment",
 | 
			
		||||
                      "value": "A,",
 | 
			
		||||
                      "style": "line"
 | 
			
		||||
                    }
 | 
			
		||||
                  }
 | 
			
		||||
                ],
 | 
			
		||||
                "3": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 81,
 | 
			
		||||
                    "start": 76,
 | 
			
		||||
                    "type": "NonCodeNode",
 | 
			
		||||
                    "value": {
 | 
			
		||||
                      "type": "blockComment",
 | 
			
		||||
                      "value": "B,",
 | 
			
		||||
                      "style": "line"
 | 
			
		||||
                    }
 | 
			
		||||
                  }
 | 
			
		||||
                ]
 | 
			
		||||
              },
 | 
			
		||||
              "startNodes": []
 | 
			
		||||
            },
 | 
			
		||||
            "start": 14,
 | 
			
		||||
            "type": "ArrayExpression",
 | 
			
		||||
            "type": "ArrayExpression"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 91,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 11,
 | 
			
		||||
          "name": "numbers",
 | 
			
		||||
          "start": 4,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "elements": [
 | 
			
		||||
            {
 | 
			
		||||
              "end": 29,
 | 
			
		||||
              "raw": "1",
 | 
			
		||||
              "start": 28,
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "value": 1.0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "end": 44,
 | 
			
		||||
              "raw": "2",
 | 
			
		||||
              "start": 43,
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "value": 2.0
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "end": 91,
 | 
			
		||||
          "nonCodeMeta": {
 | 
			
		||||
            "nonCodeNodes": {
 | 
			
		||||
              "2": [
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 63,
 | 
			
		||||
                  "start": 58,
 | 
			
		||||
                  "type": "NonCodeNode",
 | 
			
		||||
                  "value": {
 | 
			
		||||
                    "type": "blockComment",
 | 
			
		||||
                    "value": "A,",
 | 
			
		||||
                    "style": "line"
 | 
			
		||||
                  }
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "3": [
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 81,
 | 
			
		||||
                  "start": 76,
 | 
			
		||||
                  "type": "NonCodeNode",
 | 
			
		||||
                  "value": {
 | 
			
		||||
                    "type": "blockComment",
 | 
			
		||||
                    "value": "B,",
 | 
			
		||||
                    "style": "line"
 | 
			
		||||
                  }
 | 
			
		||||
                }
 | 
			
		||||
              ]
 | 
			
		||||
            },
 | 
			
		||||
            "startNodes": []
 | 
			
		||||
          },
 | 
			
		||||
          "start": 14,
 | 
			
		||||
          "type": "ArrayExpression",
 | 
			
		||||
          "type": "ArrayExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 4,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 91,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,88 +1,84 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 4025
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 80,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 9,
 | 
			
		||||
            "name": "props",
 | 
			
		||||
            "start": 4,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "end": 80,
 | 
			
		||||
            "nonCodeMeta": {
 | 
			
		||||
              "nonCodeNodes": {
 | 
			
		||||
                "1": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 52,
 | 
			
		||||
                    "start": 44,
 | 
			
		||||
                    "type": "NonCodeNode",
 | 
			
		||||
                    "value": {
 | 
			
		||||
                      "type": "blockComment",
 | 
			
		||||
                      "value": "b: 2,",
 | 
			
		||||
                      "style": "line"
 | 
			
		||||
                    }
 | 
			
		||||
                  }
 | 
			
		||||
                ]
 | 
			
		||||
              },
 | 
			
		||||
              "startNodes": []
 | 
			
		||||
            },
 | 
			
		||||
            "properties": [
 | 
			
		||||
              {
 | 
			
		||||
                "end": 30,
 | 
			
		||||
                "key": {
 | 
			
		||||
                  "end": 27,
 | 
			
		||||
                  "name": "a",
 | 
			
		||||
                  "start": 26,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "start": 26,
 | 
			
		||||
                "type": "ObjectProperty",
 | 
			
		||||
                "value": {
 | 
			
		||||
                  "end": 30,
 | 
			
		||||
                  "raw": "1",
 | 
			
		||||
                  "start": 29,
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "value": 1.0
 | 
			
		||||
                }
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                "end": 69,
 | 
			
		||||
                "key": {
 | 
			
		||||
                  "end": 66,
 | 
			
		||||
                  "name": "c",
 | 
			
		||||
                  "start": 65,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "start": 65,
 | 
			
		||||
                "type": "ObjectProperty",
 | 
			
		||||
                "value": {
 | 
			
		||||
                  "end": 69,
 | 
			
		||||
                  "raw": "3",
 | 
			
		||||
                  "start": 68,
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "value": 3.0
 | 
			
		||||
                }
 | 
			
		||||
              }
 | 
			
		||||
            ],
 | 
			
		||||
            "start": 12,
 | 
			
		||||
            "type": "ObjectExpression",
 | 
			
		||||
            "type": "ObjectExpression"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 80,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 9,
 | 
			
		||||
          "name": "props",
 | 
			
		||||
          "start": 4,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "end": 80,
 | 
			
		||||
          "nonCodeMeta": {
 | 
			
		||||
            "nonCodeNodes": {
 | 
			
		||||
              "1": [
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 52,
 | 
			
		||||
                  "start": 44,
 | 
			
		||||
                  "type": "NonCodeNode",
 | 
			
		||||
                  "value": {
 | 
			
		||||
                    "type": "blockComment",
 | 
			
		||||
                    "value": "b: 2,",
 | 
			
		||||
                    "style": "line"
 | 
			
		||||
                  }
 | 
			
		||||
                }
 | 
			
		||||
              ]
 | 
			
		||||
            },
 | 
			
		||||
            "startNodes": []
 | 
			
		||||
          },
 | 
			
		||||
          "properties": [
 | 
			
		||||
            {
 | 
			
		||||
              "end": 30,
 | 
			
		||||
              "key": {
 | 
			
		||||
                "end": 27,
 | 
			
		||||
                "name": "a",
 | 
			
		||||
                "start": 26,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "start": 26,
 | 
			
		||||
              "type": "ObjectProperty",
 | 
			
		||||
              "value": {
 | 
			
		||||
                "end": 30,
 | 
			
		||||
                "raw": "1",
 | 
			
		||||
                "start": 29,
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "value": 1.0
 | 
			
		||||
              }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "end": 69,
 | 
			
		||||
              "key": {
 | 
			
		||||
                "end": 66,
 | 
			
		||||
                "name": "c",
 | 
			
		||||
                "start": 65,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "start": 65,
 | 
			
		||||
              "type": "ObjectProperty",
 | 
			
		||||
              "value": {
 | 
			
		||||
                "end": 69,
 | 
			
		||||
                "raw": "3",
 | 
			
		||||
                "start": 68,
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "value": 3.0
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "start": 12,
 | 
			
		||||
          "type": "ObjectExpression",
 | 
			
		||||
          "type": "ObjectExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 4,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 80,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,88 +1,84 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 4033
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 79,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 9,
 | 
			
		||||
            "name": "props",
 | 
			
		||||
            "start": 4,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "end": 79,
 | 
			
		||||
            "nonCodeMeta": {
 | 
			
		||||
              "nonCodeNodes": {
 | 
			
		||||
                "1": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 52,
 | 
			
		||||
                    "start": 44,
 | 
			
		||||
                    "type": "NonCodeNode",
 | 
			
		||||
                    "value": {
 | 
			
		||||
                      "type": "blockComment",
 | 
			
		||||
                      "value": "b: 2,",
 | 
			
		||||
                      "style": "line"
 | 
			
		||||
                    }
 | 
			
		||||
                  }
 | 
			
		||||
                ]
 | 
			
		||||
              },
 | 
			
		||||
              "startNodes": []
 | 
			
		||||
            },
 | 
			
		||||
            "properties": [
 | 
			
		||||
              {
 | 
			
		||||
                "end": 30,
 | 
			
		||||
                "key": {
 | 
			
		||||
                  "end": 27,
 | 
			
		||||
                  "name": "a",
 | 
			
		||||
                  "start": 26,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "start": 26,
 | 
			
		||||
                "type": "ObjectProperty",
 | 
			
		||||
                "value": {
 | 
			
		||||
                  "end": 30,
 | 
			
		||||
                  "raw": "1",
 | 
			
		||||
                  "start": 29,
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "value": 1.0
 | 
			
		||||
                }
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                "end": 69,
 | 
			
		||||
                "key": {
 | 
			
		||||
                  "end": 66,
 | 
			
		||||
                  "name": "c",
 | 
			
		||||
                  "start": 65,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "start": 65,
 | 
			
		||||
                "type": "ObjectProperty",
 | 
			
		||||
                "value": {
 | 
			
		||||
                  "end": 69,
 | 
			
		||||
                  "raw": "3",
 | 
			
		||||
                  "start": 68,
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "value": 3.0
 | 
			
		||||
                }
 | 
			
		||||
              }
 | 
			
		||||
            ],
 | 
			
		||||
            "start": 12,
 | 
			
		||||
            "type": "ObjectExpression",
 | 
			
		||||
            "type": "ObjectExpression"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 79,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 9,
 | 
			
		||||
          "name": "props",
 | 
			
		||||
          "start": 4,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "end": 79,
 | 
			
		||||
          "nonCodeMeta": {
 | 
			
		||||
            "nonCodeNodes": {
 | 
			
		||||
              "1": [
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 52,
 | 
			
		||||
                  "start": 44,
 | 
			
		||||
                  "type": "NonCodeNode",
 | 
			
		||||
                  "value": {
 | 
			
		||||
                    "type": "blockComment",
 | 
			
		||||
                    "value": "b: 2,",
 | 
			
		||||
                    "style": "line"
 | 
			
		||||
                  }
 | 
			
		||||
                }
 | 
			
		||||
              ]
 | 
			
		||||
            },
 | 
			
		||||
            "startNodes": []
 | 
			
		||||
          },
 | 
			
		||||
          "properties": [
 | 
			
		||||
            {
 | 
			
		||||
              "end": 30,
 | 
			
		||||
              "key": {
 | 
			
		||||
                "end": 27,
 | 
			
		||||
                "name": "a",
 | 
			
		||||
                "start": 26,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "start": 26,
 | 
			
		||||
              "type": "ObjectProperty",
 | 
			
		||||
              "value": {
 | 
			
		||||
                "end": 30,
 | 
			
		||||
                "raw": "1",
 | 
			
		||||
                "start": 29,
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "value": 1.0
 | 
			
		||||
              }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "end": 69,
 | 
			
		||||
              "key": {
 | 
			
		||||
                "end": 66,
 | 
			
		||||
                "name": "c",
 | 
			
		||||
                "start": 65,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "start": 65,
 | 
			
		||||
              "type": "ObjectProperty",
 | 
			
		||||
              "value": {
 | 
			
		||||
                "end": 69,
 | 
			
		||||
                "raw": "3",
 | 
			
		||||
                "start": 68,
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "value": 3.0
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "start": 12,
 | 
			
		||||
          "type": "ObjectExpression",
 | 
			
		||||
          "type": "ObjectExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 4,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 79,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,84 +1,80 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 3902
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 36,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 11,
 | 
			
		||||
            "name": "myVar",
 | 
			
		||||
            "start": 6,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "arguments": [
 | 
			
		||||
              {
 | 
			
		||||
                "end": 19,
 | 
			
		||||
                "raw": "5",
 | 
			
		||||
                "start": 18,
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "value": 5.0
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                "argument": {
 | 
			
		||||
                  "arguments": [
 | 
			
		||||
                    {
 | 
			
		||||
                      "end": 31,
 | 
			
		||||
                      "raw": "5",
 | 
			
		||||
                      "start": 30,
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "value": 5.0
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                      "end": 34,
 | 
			
		||||
                      "raw": "4",
 | 
			
		||||
                      "start": 33,
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "value": 4.0
 | 
			
		||||
                    }
 | 
			
		||||
                  ],
 | 
			
		||||
                  "callee": {
 | 
			
		||||
                    "end": 29,
 | 
			
		||||
                    "name": "legLen",
 | 
			
		||||
                    "start": 23,
 | 
			
		||||
                    "type": "Identifier"
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 36,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 11,
 | 
			
		||||
          "name": "myVar",
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "arguments": [
 | 
			
		||||
            {
 | 
			
		||||
              "end": 19,
 | 
			
		||||
              "raw": "5",
 | 
			
		||||
              "start": 18,
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "value": 5.0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "argument": {
 | 
			
		||||
                "arguments": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 31,
 | 
			
		||||
                    "raw": "5",
 | 
			
		||||
                    "start": 30,
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "value": 5.0
 | 
			
		||||
                  },
 | 
			
		||||
                  "end": 35,
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 34,
 | 
			
		||||
                    "raw": "4",
 | 
			
		||||
                    "start": 33,
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "value": 4.0
 | 
			
		||||
                  }
 | 
			
		||||
                ],
 | 
			
		||||
                "callee": {
 | 
			
		||||
                  "end": 29,
 | 
			
		||||
                  "name": "legLen",
 | 
			
		||||
                  "start": 23,
 | 
			
		||||
                  "type": "CallExpression",
 | 
			
		||||
                  "type": "CallExpression"
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "end": 35,
 | 
			
		||||
                "operator": "-",
 | 
			
		||||
                "start": 22,
 | 
			
		||||
                "type": "UnaryExpression",
 | 
			
		||||
                "type": "UnaryExpression"
 | 
			
		||||
              }
 | 
			
		||||
            ],
 | 
			
		||||
            "callee": {
 | 
			
		||||
              "end": 17,
 | 
			
		||||
              "name": "min",
 | 
			
		||||
              "start": 14,
 | 
			
		||||
              "type": "Identifier"
 | 
			
		||||
            },
 | 
			
		||||
            "end": 36,
 | 
			
		||||
                "start": 23,
 | 
			
		||||
                "type": "CallExpression",
 | 
			
		||||
                "type": "CallExpression"
 | 
			
		||||
              },
 | 
			
		||||
              "end": 35,
 | 
			
		||||
              "operator": "-",
 | 
			
		||||
              "start": 22,
 | 
			
		||||
              "type": "UnaryExpression",
 | 
			
		||||
              "type": "UnaryExpression"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "callee": {
 | 
			
		||||
            "end": 17,
 | 
			
		||||
            "name": "min",
 | 
			
		||||
            "start": 14,
 | 
			
		||||
            "type": "CallExpression",
 | 
			
		||||
            "type": "CallExpression"
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "end": 36,
 | 
			
		||||
          "start": 14,
 | 
			
		||||
          "type": "CallExpression",
 | 
			
		||||
          "type": "CallExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 6,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 36,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,122 +1,118 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 4041
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 132,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 16,
 | 
			
		||||
            "name": "sketch001",
 | 
			
		||||
            "start": 7,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "body": [
 | 
			
		||||
              {
 | 
			
		||||
                "arguments": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 37,
 | 
			
		||||
                    "raw": "'XY'",
 | 
			
		||||
                    "start": 33,
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "value": "XY"
 | 
			
		||||
                  }
 | 
			
		||||
                ],
 | 
			
		||||
                "callee": {
 | 
			
		||||
                  "end": 32,
 | 
			
		||||
                  "name": "startSketchOn",
 | 
			
		||||
                  "start": 19,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "end": 38,
 | 
			
		||||
                "start": 19,
 | 
			
		||||
                "type": "CallExpression",
 | 
			
		||||
                "type": "CallExpression"
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                "arguments": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 131,
 | 
			
		||||
                    "start": 130,
 | 
			
		||||
                    "type": "PipeSubstitution",
 | 
			
		||||
                    "type": "PipeSubstitution"
 | 
			
		||||
                  }
 | 
			
		||||
                ],
 | 
			
		||||
                "callee": {
 | 
			
		||||
                  "end": 129,
 | 
			
		||||
                  "name": "startProfileAt",
 | 
			
		||||
                  "start": 115,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "end": 132,
 | 
			
		||||
                "start": 115,
 | 
			
		||||
                "type": "CallExpression",
 | 
			
		||||
                "type": "CallExpression"
 | 
			
		||||
              }
 | 
			
		||||
            ],
 | 
			
		||||
            "end": 132,
 | 
			
		||||
            "nonCodeMeta": {
 | 
			
		||||
              "nonCodeNodes": {
 | 
			
		||||
                "0": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 52,
 | 
			
		||||
                    "start": 41,
 | 
			
		||||
                    "type": "NonCodeNode",
 | 
			
		||||
                    "value": {
 | 
			
		||||
                      "type": "blockComment",
 | 
			
		||||
                      "value": "|> arc({",
 | 
			
		||||
                      "style": "line"
 | 
			
		||||
                    }
 | 
			
		||||
                  },
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 74,
 | 
			
		||||
                    "start": 55,
 | 
			
		||||
                    "type": "NonCodeNode",
 | 
			
		||||
                    "value": {
 | 
			
		||||
                      "type": "blockComment",
 | 
			
		||||
                      "value": "angleEnd: 270,",
 | 
			
		||||
                      "style": "line"
 | 
			
		||||
                    }
 | 
			
		||||
                  },
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 98,
 | 
			
		||||
                    "start": 77,
 | 
			
		||||
                    "type": "NonCodeNode",
 | 
			
		||||
                    "value": {
 | 
			
		||||
                      "type": "blockComment",
 | 
			
		||||
                      "value": "angleStart: 450,",
 | 
			
		||||
                      "style": "line"
 | 
			
		||||
                    }
 | 
			
		||||
                  },
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 109,
 | 
			
		||||
                    "start": 101,
 | 
			
		||||
                    "type": "NonCodeNode",
 | 
			
		||||
                    "value": {
 | 
			
		||||
                      "type": "blockComment",
 | 
			
		||||
                      "value": "}, %)",
 | 
			
		||||
                      "style": "line"
 | 
			
		||||
                    }
 | 
			
		||||
                  }
 | 
			
		||||
                ]
 | 
			
		||||
              },
 | 
			
		||||
              "startNodes": []
 | 
			
		||||
            },
 | 
			
		||||
            "start": 19,
 | 
			
		||||
            "type": "PipeExpression",
 | 
			
		||||
            "type": "PipeExpression"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 132,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 16,
 | 
			
		||||
          "name": "sketch001",
 | 
			
		||||
          "start": 7,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "body": [
 | 
			
		||||
            {
 | 
			
		||||
              "arguments": [
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 37,
 | 
			
		||||
                  "raw": "'XY'",
 | 
			
		||||
                  "start": 33,
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "value": "XY"
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "callee": {
 | 
			
		||||
                "end": 32,
 | 
			
		||||
                "name": "startSketchOn",
 | 
			
		||||
                "start": 19,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "end": 38,
 | 
			
		||||
              "start": 19,
 | 
			
		||||
              "type": "CallExpression",
 | 
			
		||||
              "type": "CallExpression"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "arguments": [
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 131,
 | 
			
		||||
                  "start": 130,
 | 
			
		||||
                  "type": "PipeSubstitution",
 | 
			
		||||
                  "type": "PipeSubstitution"
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "callee": {
 | 
			
		||||
                "end": 129,
 | 
			
		||||
                "name": "startProfileAt",
 | 
			
		||||
                "start": 115,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "end": 132,
 | 
			
		||||
              "start": 115,
 | 
			
		||||
              "type": "CallExpression",
 | 
			
		||||
              "type": "CallExpression"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "end": 132,
 | 
			
		||||
          "nonCodeMeta": {
 | 
			
		||||
            "nonCodeNodes": {
 | 
			
		||||
              "0": [
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 52,
 | 
			
		||||
                  "start": 41,
 | 
			
		||||
                  "type": "NonCodeNode",
 | 
			
		||||
                  "value": {
 | 
			
		||||
                    "type": "blockComment",
 | 
			
		||||
                    "value": "|> arc({",
 | 
			
		||||
                    "style": "line"
 | 
			
		||||
                  }
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 74,
 | 
			
		||||
                  "start": 55,
 | 
			
		||||
                  "type": "NonCodeNode",
 | 
			
		||||
                  "value": {
 | 
			
		||||
                    "type": "blockComment",
 | 
			
		||||
                    "value": "angleEnd: 270,",
 | 
			
		||||
                    "style": "line"
 | 
			
		||||
                  }
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 98,
 | 
			
		||||
                  "start": 77,
 | 
			
		||||
                  "type": "NonCodeNode",
 | 
			
		||||
                  "value": {
 | 
			
		||||
                    "type": "blockComment",
 | 
			
		||||
                    "value": "angleStart: 450,",
 | 
			
		||||
                    "style": "line"
 | 
			
		||||
                  }
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 109,
 | 
			
		||||
                  "start": 101,
 | 
			
		||||
                  "type": "NonCodeNode",
 | 
			
		||||
                  "value": {
 | 
			
		||||
                    "type": "blockComment",
 | 
			
		||||
                    "value": "}, %)",
 | 
			
		||||
                    "style": "line"
 | 
			
		||||
                  }
 | 
			
		||||
                }
 | 
			
		||||
              ]
 | 
			
		||||
            },
 | 
			
		||||
            "startNodes": []
 | 
			
		||||
          },
 | 
			
		||||
          "start": 19,
 | 
			
		||||
          "type": "PipeExpression",
 | 
			
		||||
          "type": "PipeExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 7,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 132,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 1,
 | 
			
		||||
 | 
			
		||||
@ -1,77 +1,61 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 4052
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 31,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 11,
 | 
			
		||||
          "name": "my14",
 | 
			
		||||
          "start": 7,
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "end": 31,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 11,
 | 
			
		||||
            "name": "my14",
 | 
			
		||||
            "start": 7,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          "left": {
 | 
			
		||||
            "end": 19,
 | 
			
		||||
            "left": {
 | 
			
		||||
              "end": 15,
 | 
			
		||||
              "raw": "4",
 | 
			
		||||
              "start": 14,
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "value": 4.0
 | 
			
		||||
            },
 | 
			
		||||
            "operator": "^",
 | 
			
		||||
            "right": {
 | 
			
		||||
              "end": 19,
 | 
			
		||||
              "raw": "2",
 | 
			
		||||
              "start": 18,
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "value": 2.0
 | 
			
		||||
            },
 | 
			
		||||
            "start": 14,
 | 
			
		||||
            "type": "BinaryExpression",
 | 
			
		||||
            "type": "BinaryExpression"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
          "operator": "-",
 | 
			
		||||
          "right": {
 | 
			
		||||
            "end": 31,
 | 
			
		||||
            "left": {
 | 
			
		||||
              "end": 19,
 | 
			
		||||
              "end": 27,
 | 
			
		||||
              "left": {
 | 
			
		||||
                "end": 15,
 | 
			
		||||
                "raw": "4",
 | 
			
		||||
                "start": 14,
 | 
			
		||||
                "end": 23,
 | 
			
		||||
                "raw": "3",
 | 
			
		||||
                "start": 22,
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "value": 4.0
 | 
			
		||||
                "value": 3.0
 | 
			
		||||
              },
 | 
			
		||||
              "operator": "^",
 | 
			
		||||
              "right": {
 | 
			
		||||
                "end": 19,
 | 
			
		||||
                "raw": "2",
 | 
			
		||||
                "start": 18,
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "value": 2.0
 | 
			
		||||
              },
 | 
			
		||||
              "start": 14,
 | 
			
		||||
              "type": "BinaryExpression",
 | 
			
		||||
              "type": "BinaryExpression"
 | 
			
		||||
            },
 | 
			
		||||
            "operator": "-",
 | 
			
		||||
            "right": {
 | 
			
		||||
              "end": 31,
 | 
			
		||||
              "left": {
 | 
			
		||||
                "end": 27,
 | 
			
		||||
                "left": {
 | 
			
		||||
                  "end": 23,
 | 
			
		||||
                  "raw": "3",
 | 
			
		||||
                  "start": 22,
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "value": 3.0
 | 
			
		||||
                },
 | 
			
		||||
                "operator": "^",
 | 
			
		||||
                "right": {
 | 
			
		||||
                  "end": 27,
 | 
			
		||||
                  "raw": "2",
 | 
			
		||||
                  "start": 26,
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "value": 2.0
 | 
			
		||||
                },
 | 
			
		||||
                "start": 22,
 | 
			
		||||
                "type": "BinaryExpression",
 | 
			
		||||
                "type": "BinaryExpression"
 | 
			
		||||
              },
 | 
			
		||||
              "operator": "*",
 | 
			
		||||
              "right": {
 | 
			
		||||
                "end": 31,
 | 
			
		||||
                "raw": "2",
 | 
			
		||||
                "start": 30,
 | 
			
		||||
                "start": 26,
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "value": 2.0
 | 
			
		||||
@ -80,14 +64,26 @@ snapshot_kind: text
 | 
			
		||||
              "type": "BinaryExpression",
 | 
			
		||||
              "type": "BinaryExpression"
 | 
			
		||||
            },
 | 
			
		||||
            "start": 14,
 | 
			
		||||
            "operator": "*",
 | 
			
		||||
            "right": {
 | 
			
		||||
              "end": 31,
 | 
			
		||||
              "raw": "2",
 | 
			
		||||
              "start": 30,
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "value": 2.0
 | 
			
		||||
            },
 | 
			
		||||
            "start": 22,
 | 
			
		||||
            "type": "BinaryExpression",
 | 
			
		||||
            "type": "BinaryExpression"
 | 
			
		||||
          },
 | 
			
		||||
          "start": 7,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "start": 14,
 | 
			
		||||
          "type": "BinaryExpression",
 | 
			
		||||
          "type": "BinaryExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 7,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 31,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 1,
 | 
			
		||||
 | 
			
		||||
@ -1,81 +1,77 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 4058
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 74,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 7,
 | 
			
		||||
            "name": "x",
 | 
			
		||||
            "start": 6,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "cond": {
 | 
			
		||||
              "end": 17,
 | 
			
		||||
              "raw": "true",
 | 
			
		||||
              "start": 13,
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "value": true
 | 
			
		||||
            },
 | 
			
		||||
            "digest": null,
 | 
			
		||||
            "else_ifs": [],
 | 
			
		||||
            "end": 74,
 | 
			
		||||
            "final_else": {
 | 
			
		||||
              "body": [
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 64,
 | 
			
		||||
                  "expression": {
 | 
			
		||||
                    "end": 64,
 | 
			
		||||
                    "raw": "4",
 | 
			
		||||
                    "start": 63,
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "value": 4.0
 | 
			
		||||
                  },
 | 
			
		||||
                  "start": 63,
 | 
			
		||||
                  "type": "ExpressionStatement",
 | 
			
		||||
                  "type": "ExpressionStatement"
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "end": 73,
 | 
			
		||||
              "start": 63
 | 
			
		||||
            },
 | 
			
		||||
            "start": 10,
 | 
			
		||||
            "then_val": {
 | 
			
		||||
              "body": [
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 33,
 | 
			
		||||
                  "expression": {
 | 
			
		||||
                    "end": 33,
 | 
			
		||||
                    "raw": "3",
 | 
			
		||||
                    "start": 32,
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "value": 3.0
 | 
			
		||||
                  },
 | 
			
		||||
                  "start": 32,
 | 
			
		||||
                  "type": "ExpressionStatement",
 | 
			
		||||
                  "type": "ExpressionStatement"
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "end": 42,
 | 
			
		||||
              "start": 32
 | 
			
		||||
            },
 | 
			
		||||
            "type": "IfExpression",
 | 
			
		||||
            "type": "IfExpression"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 74,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 7,
 | 
			
		||||
          "name": "x",
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "cond": {
 | 
			
		||||
            "end": 17,
 | 
			
		||||
            "raw": "true",
 | 
			
		||||
            "start": 13,
 | 
			
		||||
            "type": "Literal",
 | 
			
		||||
            "type": "Literal",
 | 
			
		||||
            "value": true
 | 
			
		||||
          },
 | 
			
		||||
          "digest": null,
 | 
			
		||||
          "else_ifs": [],
 | 
			
		||||
          "end": 74,
 | 
			
		||||
          "final_else": {
 | 
			
		||||
            "body": [
 | 
			
		||||
              {
 | 
			
		||||
                "end": 64,
 | 
			
		||||
                "expression": {
 | 
			
		||||
                  "end": 64,
 | 
			
		||||
                  "raw": "4",
 | 
			
		||||
                  "start": 63,
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "value": 4.0
 | 
			
		||||
                },
 | 
			
		||||
                "start": 63,
 | 
			
		||||
                "type": "ExpressionStatement",
 | 
			
		||||
                "type": "ExpressionStatement"
 | 
			
		||||
              }
 | 
			
		||||
            ],
 | 
			
		||||
            "end": 73,
 | 
			
		||||
            "start": 63
 | 
			
		||||
          },
 | 
			
		||||
          "start": 10,
 | 
			
		||||
          "then_val": {
 | 
			
		||||
            "body": [
 | 
			
		||||
              {
 | 
			
		||||
                "end": 33,
 | 
			
		||||
                "expression": {
 | 
			
		||||
                  "end": 33,
 | 
			
		||||
                  "raw": "3",
 | 
			
		||||
                  "start": 32,
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "value": 3.0
 | 
			
		||||
                },
 | 
			
		||||
                "start": 32,
 | 
			
		||||
                "type": "ExpressionStatement",
 | 
			
		||||
                "type": "ExpressionStatement"
 | 
			
		||||
              }
 | 
			
		||||
            ],
 | 
			
		||||
            "end": 42,
 | 
			
		||||
            "start": 32
 | 
			
		||||
          },
 | 
			
		||||
          "type": "IfExpression",
 | 
			
		||||
          "type": "IfExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 6,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 74,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,129 +1,125 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 4066
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 121,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 7,
 | 
			
		||||
            "name": "x",
 | 
			
		||||
            "start": 6,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 121,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 7,
 | 
			
		||||
          "name": "x",
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "cond": {
 | 
			
		||||
            "end": 17,
 | 
			
		||||
            "raw": "true",
 | 
			
		||||
            "start": 13,
 | 
			
		||||
            "type": "Literal",
 | 
			
		||||
            "type": "Literal",
 | 
			
		||||
            "value": true
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "cond": {
 | 
			
		||||
              "end": 17,
 | 
			
		||||
              "raw": "true",
 | 
			
		||||
              "start": 13,
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "value": true
 | 
			
		||||
            },
 | 
			
		||||
            "digest": null,
 | 
			
		||||
            "else_ifs": [
 | 
			
		||||
              {
 | 
			
		||||
                "cond": {
 | 
			
		||||
                  "arguments": [
 | 
			
		||||
                    {
 | 
			
		||||
                      "end": 63,
 | 
			
		||||
                      "name": "radius",
 | 
			
		||||
                      "start": 57,
 | 
			
		||||
                      "type": "Identifier",
 | 
			
		||||
                      "type": "Identifier"
 | 
			
		||||
                    }
 | 
			
		||||
                  ],
 | 
			
		||||
                  "callee": {
 | 
			
		||||
                    "end": 56,
 | 
			
		||||
                    "name": "func",
 | 
			
		||||
                    "start": 52,
 | 
			
		||||
          "digest": null,
 | 
			
		||||
          "else_ifs": [
 | 
			
		||||
            {
 | 
			
		||||
              "cond": {
 | 
			
		||||
                "arguments": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 63,
 | 
			
		||||
                    "name": "radius",
 | 
			
		||||
                    "start": 57,
 | 
			
		||||
                    "type": "Identifier",
 | 
			
		||||
                    "type": "Identifier"
 | 
			
		||||
                  },
 | 
			
		||||
                  "end": 64,
 | 
			
		||||
                  }
 | 
			
		||||
                ],
 | 
			
		||||
                "callee": {
 | 
			
		||||
                  "end": 56,
 | 
			
		||||
                  "name": "func",
 | 
			
		||||
                  "start": 52,
 | 
			
		||||
                  "type": "CallExpression",
 | 
			
		||||
                  "type": "CallExpression"
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "digest": null,
 | 
			
		||||
                "end": 90,
 | 
			
		||||
                "start": 44,
 | 
			
		||||
                "then_val": {
 | 
			
		||||
                  "body": [
 | 
			
		||||
                    {
 | 
			
		||||
                "end": 64,
 | 
			
		||||
                "start": 52,
 | 
			
		||||
                "type": "CallExpression",
 | 
			
		||||
                "type": "CallExpression"
 | 
			
		||||
              },
 | 
			
		||||
              "digest": null,
 | 
			
		||||
              "end": 90,
 | 
			
		||||
              "start": 44,
 | 
			
		||||
              "then_val": {
 | 
			
		||||
                "body": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 80,
 | 
			
		||||
                    "expression": {
 | 
			
		||||
                      "end": 80,
 | 
			
		||||
                      "expression": {
 | 
			
		||||
                        "end": 80,
 | 
			
		||||
                        "raw": "4",
 | 
			
		||||
                        "start": 79,
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "type": "Literal",
 | 
			
		||||
                        "value": 4.0
 | 
			
		||||
                      },
 | 
			
		||||
                      "raw": "4",
 | 
			
		||||
                      "start": 79,
 | 
			
		||||
                      "type": "ExpressionStatement",
 | 
			
		||||
                      "type": "ExpressionStatement"
 | 
			
		||||
                    }
 | 
			
		||||
                  ],
 | 
			
		||||
                  "end": 89,
 | 
			
		||||
                  "start": 65
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "value": 4.0
 | 
			
		||||
                    },
 | 
			
		||||
                    "start": 79,
 | 
			
		||||
                    "type": "ExpressionStatement",
 | 
			
		||||
                    "type": "ExpressionStatement"
 | 
			
		||||
                  }
 | 
			
		||||
                ],
 | 
			
		||||
                "end": 89,
 | 
			
		||||
                "start": 65
 | 
			
		||||
              },
 | 
			
		||||
              "type": "ElseIf"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "end": 121,
 | 
			
		||||
          "final_else": {
 | 
			
		||||
            "body": [
 | 
			
		||||
              {
 | 
			
		||||
                "end": 111,
 | 
			
		||||
                "expression": {
 | 
			
		||||
                  "end": 111,
 | 
			
		||||
                  "raw": "5",
 | 
			
		||||
                  "start": 110,
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "value": 5.0
 | 
			
		||||
                },
 | 
			
		||||
                "type": "ElseIf"
 | 
			
		||||
                "start": 110,
 | 
			
		||||
                "type": "ExpressionStatement",
 | 
			
		||||
                "type": "ExpressionStatement"
 | 
			
		||||
              }
 | 
			
		||||
            ],
 | 
			
		||||
            "end": 121,
 | 
			
		||||
            "final_else": {
 | 
			
		||||
              "body": [
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 111,
 | 
			
		||||
                  "expression": {
 | 
			
		||||
                    "end": 111,
 | 
			
		||||
                    "raw": "5",
 | 
			
		||||
                    "start": 110,
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "value": 5.0
 | 
			
		||||
                  },
 | 
			
		||||
                  "start": 110,
 | 
			
		||||
                  "type": "ExpressionStatement",
 | 
			
		||||
                  "type": "ExpressionStatement"
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "end": 120,
 | 
			
		||||
              "start": 110
 | 
			
		||||
            },
 | 
			
		||||
            "start": 10,
 | 
			
		||||
            "then_val": {
 | 
			
		||||
              "body": [
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 33,
 | 
			
		||||
                  "expression": {
 | 
			
		||||
                    "end": 33,
 | 
			
		||||
                    "raw": "3",
 | 
			
		||||
                    "start": 32,
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "value": 3.0
 | 
			
		||||
                  },
 | 
			
		||||
                  "start": 32,
 | 
			
		||||
                  "type": "ExpressionStatement",
 | 
			
		||||
                  "type": "ExpressionStatement"
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "end": 42,
 | 
			
		||||
              "start": 32
 | 
			
		||||
            },
 | 
			
		||||
            "type": "IfExpression",
 | 
			
		||||
            "type": "IfExpression"
 | 
			
		||||
            "end": 120,
 | 
			
		||||
            "start": 110
 | 
			
		||||
          },
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "start": 10,
 | 
			
		||||
          "then_val": {
 | 
			
		||||
            "body": [
 | 
			
		||||
              {
 | 
			
		||||
                "end": 33,
 | 
			
		||||
                "expression": {
 | 
			
		||||
                  "end": 33,
 | 
			
		||||
                  "raw": "3",
 | 
			
		||||
                  "start": 32,
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "value": 3.0
 | 
			
		||||
                },
 | 
			
		||||
                "start": 32,
 | 
			
		||||
                "type": "ExpressionStatement",
 | 
			
		||||
                "type": "ExpressionStatement"
 | 
			
		||||
              }
 | 
			
		||||
            ],
 | 
			
		||||
            "end": 42,
 | 
			
		||||
            "start": 32
 | 
			
		||||
          },
 | 
			
		||||
          "type": "IfExpression",
 | 
			
		||||
          "type": "IfExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 6,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 121,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,48 +1,44 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 4076
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 14,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 5,
 | 
			
		||||
            "name": "x",
 | 
			
		||||
            "start": 4,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "end": 14,
 | 
			
		||||
            "left": {
 | 
			
		||||
              "end": 9,
 | 
			
		||||
              "raw": "3",
 | 
			
		||||
              "start": 8,
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "value": 3.0
 | 
			
		||||
            },
 | 
			
		||||
            "operator": "==",
 | 
			
		||||
            "right": {
 | 
			
		||||
              "end": 14,
 | 
			
		||||
              "raw": "3",
 | 
			
		||||
              "start": 13,
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "value": 3.0
 | 
			
		||||
            },
 | 
			
		||||
            "start": 8,
 | 
			
		||||
            "type": "BinaryExpression",
 | 
			
		||||
            "type": "BinaryExpression"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 14,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 5,
 | 
			
		||||
          "name": "x",
 | 
			
		||||
          "start": 4,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "end": 14,
 | 
			
		||||
          "left": {
 | 
			
		||||
            "end": 9,
 | 
			
		||||
            "raw": "3",
 | 
			
		||||
            "start": 8,
 | 
			
		||||
            "type": "Literal",
 | 
			
		||||
            "type": "Literal",
 | 
			
		||||
            "value": 3.0
 | 
			
		||||
          },
 | 
			
		||||
          "operator": "==",
 | 
			
		||||
          "right": {
 | 
			
		||||
            "end": 14,
 | 
			
		||||
            "raw": "3",
 | 
			
		||||
            "start": 13,
 | 
			
		||||
            "type": "Literal",
 | 
			
		||||
            "type": "Literal",
 | 
			
		||||
            "value": 3.0
 | 
			
		||||
          },
 | 
			
		||||
          "start": 8,
 | 
			
		||||
          "type": "BinaryExpression",
 | 
			
		||||
          "type": "BinaryExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 4,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 14,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,48 +1,44 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 4077
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 14,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 5,
 | 
			
		||||
            "name": "x",
 | 
			
		||||
            "start": 4,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "end": 14,
 | 
			
		||||
            "left": {
 | 
			
		||||
              "end": 9,
 | 
			
		||||
              "raw": "3",
 | 
			
		||||
              "start": 8,
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "value": 3.0
 | 
			
		||||
            },
 | 
			
		||||
            "operator": "!=",
 | 
			
		||||
            "right": {
 | 
			
		||||
              "end": 14,
 | 
			
		||||
              "raw": "3",
 | 
			
		||||
              "start": 13,
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "value": 3.0
 | 
			
		||||
            },
 | 
			
		||||
            "start": 8,
 | 
			
		||||
            "type": "BinaryExpression",
 | 
			
		||||
            "type": "BinaryExpression"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 14,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 5,
 | 
			
		||||
          "name": "x",
 | 
			
		||||
          "start": 4,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "end": 14,
 | 
			
		||||
          "left": {
 | 
			
		||||
            "end": 9,
 | 
			
		||||
            "raw": "3",
 | 
			
		||||
            "start": 8,
 | 
			
		||||
            "type": "Literal",
 | 
			
		||||
            "type": "Literal",
 | 
			
		||||
            "value": 3.0
 | 
			
		||||
          },
 | 
			
		||||
          "operator": "!=",
 | 
			
		||||
          "right": {
 | 
			
		||||
            "end": 14,
 | 
			
		||||
            "raw": "3",
 | 
			
		||||
            "start": 13,
 | 
			
		||||
            "type": "Literal",
 | 
			
		||||
            "type": "Literal",
 | 
			
		||||
            "value": 3.0
 | 
			
		||||
          },
 | 
			
		||||
          "start": 8,
 | 
			
		||||
          "type": "BinaryExpression",
 | 
			
		||||
          "type": "BinaryExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 4,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 14,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,33 +1,29 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 4078
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 5,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 1,
 | 
			
		||||
            "name": "x",
 | 
			
		||||
            "start": 0,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "end": 5,
 | 
			
		||||
            "raw": "4",
 | 
			
		||||
            "start": 4,
 | 
			
		||||
            "type": "Literal",
 | 
			
		||||
            "type": "Literal",
 | 
			
		||||
            "value": 4.0
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 5,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 1,
 | 
			
		||||
          "name": "x",
 | 
			
		||||
          "start": 0,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "end": 5,
 | 
			
		||||
          "raw": "4",
 | 
			
		||||
          "start": 4,
 | 
			
		||||
          "type": "Literal",
 | 
			
		||||
          "type": "Literal",
 | 
			
		||||
          "value": 4.0
 | 
			
		||||
        },
 | 
			
		||||
        "start": 0,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 5,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,87 +1,83 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 4079
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 42,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 9,
 | 
			
		||||
            "name": "obj",
 | 
			
		||||
            "start": 6,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "end": 42,
 | 
			
		||||
            "properties": [
 | 
			
		||||
              {
 | 
			
		||||
                "end": 30,
 | 
			
		||||
                "key": {
 | 
			
		||||
                  "end": 19,
 | 
			
		||||
                  "name": "center",
 | 
			
		||||
                  "start": 13,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "start": 13,
 | 
			
		||||
                "type": "ObjectProperty",
 | 
			
		||||
                "value": {
 | 
			
		||||
                  "elements": [
 | 
			
		||||
                    {
 | 
			
		||||
                      "end": 25,
 | 
			
		||||
                      "raw": "10",
 | 
			
		||||
                      "start": 23,
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "value": 10.0
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                      "end": 29,
 | 
			
		||||
                      "raw": "10",
 | 
			
		||||
                      "start": 27,
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "value": 10.0
 | 
			
		||||
                    }
 | 
			
		||||
                  ],
 | 
			
		||||
                  "end": 30,
 | 
			
		||||
                  "start": 22,
 | 
			
		||||
                  "type": "ArrayExpression",
 | 
			
		||||
                  "type": "ArrayExpression"
 | 
			
		||||
                }
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                "end": 41,
 | 
			
		||||
                "key": {
 | 
			
		||||
                  "end": 38,
 | 
			
		||||
                  "name": "radius",
 | 
			
		||||
                  "start": 32,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "start": 32,
 | 
			
		||||
                "type": "ObjectProperty",
 | 
			
		||||
                "value": {
 | 
			
		||||
                  "end": 41,
 | 
			
		||||
                  "raw": "5",
 | 
			
		||||
                  "start": 40,
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "value": 5.0
 | 
			
		||||
                }
 | 
			
		||||
              }
 | 
			
		||||
            ],
 | 
			
		||||
            "start": 12,
 | 
			
		||||
            "type": "ObjectExpression",
 | 
			
		||||
            "type": "ObjectExpression"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 42,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 9,
 | 
			
		||||
          "name": "obj",
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "end": 42,
 | 
			
		||||
          "properties": [
 | 
			
		||||
            {
 | 
			
		||||
              "end": 30,
 | 
			
		||||
              "key": {
 | 
			
		||||
                "end": 19,
 | 
			
		||||
                "name": "center",
 | 
			
		||||
                "start": 13,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "start": 13,
 | 
			
		||||
              "type": "ObjectProperty",
 | 
			
		||||
              "value": {
 | 
			
		||||
                "elements": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 25,
 | 
			
		||||
                    "raw": "10",
 | 
			
		||||
                    "start": 23,
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "value": 10.0
 | 
			
		||||
                  },
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 29,
 | 
			
		||||
                    "raw": "10",
 | 
			
		||||
                    "start": 27,
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "value": 10.0
 | 
			
		||||
                  }
 | 
			
		||||
                ],
 | 
			
		||||
                "end": 30,
 | 
			
		||||
                "start": 22,
 | 
			
		||||
                "type": "ArrayExpression",
 | 
			
		||||
                "type": "ArrayExpression"
 | 
			
		||||
              }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "end": 41,
 | 
			
		||||
              "key": {
 | 
			
		||||
                "end": 38,
 | 
			
		||||
                "name": "radius",
 | 
			
		||||
                "start": 32,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "start": 32,
 | 
			
		||||
              "type": "ObjectProperty",
 | 
			
		||||
              "value": {
 | 
			
		||||
                "end": 41,
 | 
			
		||||
                "raw": "5",
 | 
			
		||||
                "start": 40,
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "value": 5.0
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "start": 12,
 | 
			
		||||
          "type": "ObjectExpression",
 | 
			
		||||
          "type": "ObjectExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 6,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 42,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,33 +1,29 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 4080
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 5,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 1,
 | 
			
		||||
            "name": "x",
 | 
			
		||||
            "start": 0,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "end": 5,
 | 
			
		||||
            "raw": "3",
 | 
			
		||||
            "start": 4,
 | 
			
		||||
            "type": "Literal",
 | 
			
		||||
            "type": "Literal",
 | 
			
		||||
            "value": 3.0
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 5,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 1,
 | 
			
		||||
          "name": "x",
 | 
			
		||||
          "start": 0,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "end": 5,
 | 
			
		||||
          "raw": "3",
 | 
			
		||||
          "start": 4,
 | 
			
		||||
          "type": "Literal",
 | 
			
		||||
          "type": "Literal",
 | 
			
		||||
          "value": 3.0
 | 
			
		||||
        },
 | 
			
		||||
        "start": 0,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 5,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
@ -35,64 +31,62 @@ snapshot_kind: text
 | 
			
		||||
      "type": "VariableDeclaration"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 30,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 17,
 | 
			
		||||
            "name": "obj",
 | 
			
		||||
            "start": 14,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "end": 30,
 | 
			
		||||
            "properties": [
 | 
			
		||||
              {
 | 
			
		||||
                "end": 23,
 | 
			
		||||
                "key": {
 | 
			
		||||
                  "end": 23,
 | 
			
		||||
                  "name": "x",
 | 
			
		||||
                  "start": 22,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "start": 22,
 | 
			
		||||
                "type": "ObjectProperty",
 | 
			
		||||
                "value": {
 | 
			
		||||
                  "end": 23,
 | 
			
		||||
                  "name": "x",
 | 
			
		||||
                  "start": 22,
 | 
			
		||||
                  "type": "Identifier",
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                }
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                "end": 29,
 | 
			
		||||
                "key": {
 | 
			
		||||
                  "end": 26,
 | 
			
		||||
                  "name": "y",
 | 
			
		||||
                  "start": 25,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "start": 25,
 | 
			
		||||
                "type": "ObjectProperty",
 | 
			
		||||
                "value": {
 | 
			
		||||
                  "end": 29,
 | 
			
		||||
                  "raw": "4",
 | 
			
		||||
                  "start": 28,
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "value": 4.0
 | 
			
		||||
                }
 | 
			
		||||
              }
 | 
			
		||||
            ],
 | 
			
		||||
            "start": 20,
 | 
			
		||||
            "type": "ObjectExpression",
 | 
			
		||||
            "type": "ObjectExpression"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 30,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 17,
 | 
			
		||||
          "name": "obj",
 | 
			
		||||
          "start": 14,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "end": 30,
 | 
			
		||||
          "properties": [
 | 
			
		||||
            {
 | 
			
		||||
              "end": 23,
 | 
			
		||||
              "key": {
 | 
			
		||||
                "end": 23,
 | 
			
		||||
                "name": "x",
 | 
			
		||||
                "start": 22,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "start": 22,
 | 
			
		||||
              "type": "ObjectProperty",
 | 
			
		||||
              "value": {
 | 
			
		||||
                "end": 23,
 | 
			
		||||
                "name": "x",
 | 
			
		||||
                "start": 22,
 | 
			
		||||
                "type": "Identifier",
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "end": 29,
 | 
			
		||||
              "key": {
 | 
			
		||||
                "end": 26,
 | 
			
		||||
                "name": "y",
 | 
			
		||||
                "start": 25,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "start": 25,
 | 
			
		||||
              "type": "ObjectProperty",
 | 
			
		||||
              "value": {
 | 
			
		||||
                "end": 29,
 | 
			
		||||
                "raw": "4",
 | 
			
		||||
                "start": 28,
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "value": 4.0
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "start": 20,
 | 
			
		||||
          "type": "ObjectExpression",
 | 
			
		||||
          "type": "ObjectExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 14,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 30,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 14,
 | 
			
		||||
 | 
			
		||||
@ -1,84 +1,80 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 3904
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 35,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 11,
 | 
			
		||||
            "name": "myVar",
 | 
			
		||||
            "start": 6,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "arguments": [
 | 
			
		||||
              {
 | 
			
		||||
                "argument": {
 | 
			
		||||
                  "arguments": [
 | 
			
		||||
                    {
 | 
			
		||||
                      "end": 27,
 | 
			
		||||
                      "raw": "5",
 | 
			
		||||
                      "start": 26,
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "value": 5.0
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                      "end": 30,
 | 
			
		||||
                      "raw": "4",
 | 
			
		||||
                      "start": 29,
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "type": "Literal",
 | 
			
		||||
                      "value": 4.0
 | 
			
		||||
                    }
 | 
			
		||||
                  ],
 | 
			
		||||
                  "callee": {
 | 
			
		||||
                    "end": 25,
 | 
			
		||||
                    "name": "legLen",
 | 
			
		||||
                    "start": 19,
 | 
			
		||||
                    "type": "Identifier"
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 35,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 11,
 | 
			
		||||
          "name": "myVar",
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "arguments": [
 | 
			
		||||
            {
 | 
			
		||||
              "argument": {
 | 
			
		||||
                "arguments": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 27,
 | 
			
		||||
                    "raw": "5",
 | 
			
		||||
                    "start": 26,
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "value": 5.0
 | 
			
		||||
                  },
 | 
			
		||||
                  "end": 31,
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 30,
 | 
			
		||||
                    "raw": "4",
 | 
			
		||||
                    "start": 29,
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "value": 4.0
 | 
			
		||||
                  }
 | 
			
		||||
                ],
 | 
			
		||||
                "callee": {
 | 
			
		||||
                  "end": 25,
 | 
			
		||||
                  "name": "legLen",
 | 
			
		||||
                  "start": 19,
 | 
			
		||||
                  "type": "CallExpression",
 | 
			
		||||
                  "type": "CallExpression"
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "end": 31,
 | 
			
		||||
                "operator": "-",
 | 
			
		||||
                "start": 18,
 | 
			
		||||
                "type": "UnaryExpression",
 | 
			
		||||
                "type": "UnaryExpression"
 | 
			
		||||
                "start": 19,
 | 
			
		||||
                "type": "CallExpression",
 | 
			
		||||
                "type": "CallExpression"
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                "end": 34,
 | 
			
		||||
                "raw": "5",
 | 
			
		||||
                "start": 33,
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "value": 5.0
 | 
			
		||||
              }
 | 
			
		||||
            ],
 | 
			
		||||
            "callee": {
 | 
			
		||||
              "end": 17,
 | 
			
		||||
              "name": "min",
 | 
			
		||||
              "start": 14,
 | 
			
		||||
              "type": "Identifier"
 | 
			
		||||
              "end": 31,
 | 
			
		||||
              "operator": "-",
 | 
			
		||||
              "start": 18,
 | 
			
		||||
              "type": "UnaryExpression",
 | 
			
		||||
              "type": "UnaryExpression"
 | 
			
		||||
            },
 | 
			
		||||
            "end": 35,
 | 
			
		||||
            {
 | 
			
		||||
              "end": 34,
 | 
			
		||||
              "raw": "5",
 | 
			
		||||
              "start": 33,
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "value": 5.0
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "callee": {
 | 
			
		||||
            "end": 17,
 | 
			
		||||
            "name": "min",
 | 
			
		||||
            "start": 14,
 | 
			
		||||
            "type": "CallExpression",
 | 
			
		||||
            "type": "CallExpression"
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "end": 35,
 | 
			
		||||
          "start": 14,
 | 
			
		||||
          "type": "CallExpression",
 | 
			
		||||
          "type": "CallExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 6,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 35,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,84 +1,80 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 3905
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 36,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 11,
 | 
			
		||||
            "name": "myVar",
 | 
			
		||||
            "start": 6,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "body": [
 | 
			
		||||
              {
 | 
			
		||||
                "end": 19,
 | 
			
		||||
                "left": {
 | 
			
		||||
                  "end": 15,
 | 
			
		||||
                  "raw": "5",
 | 
			
		||||
                  "start": 14,
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "value": 5.0
 | 
			
		||||
                },
 | 
			
		||||
                "operator": "+",
 | 
			
		||||
                "right": {
 | 
			
		||||
                  "end": 19,
 | 
			
		||||
                  "raw": "6",
 | 
			
		||||
                  "start": 18,
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "value": 6.0
 | 
			
		||||
                },
 | 
			
		||||
                "start": 14,
 | 
			
		||||
                "type": "BinaryExpression",
 | 
			
		||||
                "type": "BinaryExpression"
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                "arguments": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 32,
 | 
			
		||||
                    "raw": "45",
 | 
			
		||||
                    "start": 30,
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "value": 45.0
 | 
			
		||||
                  },
 | 
			
		||||
                  {
 | 
			
		||||
                    "end": 35,
 | 
			
		||||
                    "start": 34,
 | 
			
		||||
                    "type": "PipeSubstitution",
 | 
			
		||||
                    "type": "PipeSubstitution"
 | 
			
		||||
                  }
 | 
			
		||||
                ],
 | 
			
		||||
                "callee": {
 | 
			
		||||
                  "end": 29,
 | 
			
		||||
                  "name": "myFunc",
 | 
			
		||||
                  "start": 23,
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "end": 36,
 | 
			
		||||
                "start": 23,
 | 
			
		||||
                "type": "CallExpression",
 | 
			
		||||
                "type": "CallExpression"
 | 
			
		||||
              }
 | 
			
		||||
            ],
 | 
			
		||||
            "end": 36,
 | 
			
		||||
            "start": 14,
 | 
			
		||||
            "type": "PipeExpression",
 | 
			
		||||
            "type": "PipeExpression"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 36,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 11,
 | 
			
		||||
          "name": "myVar",
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "body": [
 | 
			
		||||
            {
 | 
			
		||||
              "end": 19,
 | 
			
		||||
              "left": {
 | 
			
		||||
                "end": 15,
 | 
			
		||||
                "raw": "5",
 | 
			
		||||
                "start": 14,
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "value": 5.0
 | 
			
		||||
              },
 | 
			
		||||
              "operator": "+",
 | 
			
		||||
              "right": {
 | 
			
		||||
                "end": 19,
 | 
			
		||||
                "raw": "6",
 | 
			
		||||
                "start": 18,
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "value": 6.0
 | 
			
		||||
              },
 | 
			
		||||
              "start": 14,
 | 
			
		||||
              "type": "BinaryExpression",
 | 
			
		||||
              "type": "BinaryExpression"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "arguments": [
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 32,
 | 
			
		||||
                  "raw": "45",
 | 
			
		||||
                  "start": 30,
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "value": 45.0
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                  "end": 35,
 | 
			
		||||
                  "start": 34,
 | 
			
		||||
                  "type": "PipeSubstitution",
 | 
			
		||||
                  "type": "PipeSubstitution"
 | 
			
		||||
                }
 | 
			
		||||
              ],
 | 
			
		||||
              "callee": {
 | 
			
		||||
                "end": 29,
 | 
			
		||||
                "name": "myFunc",
 | 
			
		||||
                "start": 23,
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "end": 36,
 | 
			
		||||
              "start": 23,
 | 
			
		||||
              "type": "CallExpression",
 | 
			
		||||
              "type": "CallExpression"
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "end": 36,
 | 
			
		||||
          "start": 14,
 | 
			
		||||
          "type": "PipeExpression",
 | 
			
		||||
          "type": "PipeExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 6,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 36,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,53 +1,49 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 3915
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 27,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 7,
 | 
			
		||||
          "name": "x",
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "end": 27,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 7,
 | 
			
		||||
            "name": "x",
 | 
			
		||||
            "start": 6,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "end": 27,
 | 
			
		||||
            "left": {
 | 
			
		||||
              "argument": {
 | 
			
		||||
                "end": 15,
 | 
			
		||||
                "name": "leg2",
 | 
			
		||||
                "start": 11,
 | 
			
		||||
                "type": "Identifier",
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
          "left": {
 | 
			
		||||
            "argument": {
 | 
			
		||||
              "end": 15,
 | 
			
		||||
              "operator": "-",
 | 
			
		||||
              "start": 10,
 | 
			
		||||
              "type": "UnaryExpression",
 | 
			
		||||
              "type": "UnaryExpression"
 | 
			
		||||
            },
 | 
			
		||||
            "operator": "+",
 | 
			
		||||
            "right": {
 | 
			
		||||
              "end": 27,
 | 
			
		||||
              "name": "thickness",
 | 
			
		||||
              "start": 18,
 | 
			
		||||
              "name": "leg2",
 | 
			
		||||
              "start": 11,
 | 
			
		||||
              "type": "Identifier",
 | 
			
		||||
              "type": "Identifier"
 | 
			
		||||
            },
 | 
			
		||||
            "end": 15,
 | 
			
		||||
            "operator": "-",
 | 
			
		||||
            "start": 10,
 | 
			
		||||
            "type": "BinaryExpression",
 | 
			
		||||
            "type": "BinaryExpression"
 | 
			
		||||
            "type": "UnaryExpression",
 | 
			
		||||
            "type": "UnaryExpression"
 | 
			
		||||
          },
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "operator": "+",
 | 
			
		||||
          "right": {
 | 
			
		||||
            "end": 27,
 | 
			
		||||
            "name": "thickness",
 | 
			
		||||
            "start": 18,
 | 
			
		||||
            "type": "Identifier",
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "start": 10,
 | 
			
		||||
          "type": "BinaryExpression",
 | 
			
		||||
          "type": "BinaryExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 6,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 27,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,63 +1,59 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 3906
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 18,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 5,
 | 
			
		||||
          "name": "x",
 | 
			
		||||
          "start": 4,
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "end": 18,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 5,
 | 
			
		||||
            "name": "x",
 | 
			
		||||
            "start": 4,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          "left": {
 | 
			
		||||
            "end": 9,
 | 
			
		||||
            "raw": "1",
 | 
			
		||||
            "start": 8,
 | 
			
		||||
            "type": "Literal",
 | 
			
		||||
            "type": "Literal",
 | 
			
		||||
            "value": 1.0
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
          "operator": "*",
 | 
			
		||||
          "right": {
 | 
			
		||||
            "end": 18,
 | 
			
		||||
            "left": {
 | 
			
		||||
              "end": 9,
 | 
			
		||||
              "raw": "1",
 | 
			
		||||
              "start": 8,
 | 
			
		||||
              "end": 14,
 | 
			
		||||
              "raw": "3",
 | 
			
		||||
              "start": 13,
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "value": 1.0
 | 
			
		||||
              "value": 3.0
 | 
			
		||||
            },
 | 
			
		||||
            "operator": "*",
 | 
			
		||||
            "operator": "-",
 | 
			
		||||
            "right": {
 | 
			
		||||
              "end": 18,
 | 
			
		||||
              "left": {
 | 
			
		||||
                "end": 14,
 | 
			
		||||
                "raw": "3",
 | 
			
		||||
                "start": 13,
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "value": 3.0
 | 
			
		||||
              },
 | 
			
		||||
              "operator": "-",
 | 
			
		||||
              "right": {
 | 
			
		||||
                "end": 18,
 | 
			
		||||
                "raw": "4",
 | 
			
		||||
                "start": 17,
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "value": 4.0
 | 
			
		||||
              },
 | 
			
		||||
              "start": 13,
 | 
			
		||||
              "type": "BinaryExpression",
 | 
			
		||||
              "type": "BinaryExpression"
 | 
			
		||||
              "raw": "4",
 | 
			
		||||
              "start": 17,
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "value": 4.0
 | 
			
		||||
            },
 | 
			
		||||
            "start": 8,
 | 
			
		||||
            "start": 13,
 | 
			
		||||
            "type": "BinaryExpression",
 | 
			
		||||
            "type": "BinaryExpression"
 | 
			
		||||
          },
 | 
			
		||||
          "start": 4,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "start": 8,
 | 
			
		||||
          "type": "BinaryExpression",
 | 
			
		||||
          "type": "BinaryExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 4,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 18,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,33 +1,29 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 3907
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 11,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 7,
 | 
			
		||||
            "name": "x",
 | 
			
		||||
            "start": 6,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "end": 11,
 | 
			
		||||
            "raw": "1",
 | 
			
		||||
            "start": 10,
 | 
			
		||||
            "type": "Literal",
 | 
			
		||||
            "type": "Literal",
 | 
			
		||||
            "value": 1.0
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 11,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 7,
 | 
			
		||||
          "name": "x",
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "end": 11,
 | 
			
		||||
          "raw": "1",
 | 
			
		||||
          "start": 10,
 | 
			
		||||
          "type": "Literal",
 | 
			
		||||
          "type": "Literal",
 | 
			
		||||
          "value": 1.0
 | 
			
		||||
        },
 | 
			
		||||
        "start": 6,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 11,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,64 +1,60 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 3908
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 58,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 4,
 | 
			
		||||
            "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"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 58,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 4,
 | 
			
		||||
          "name": "x",
 | 
			
		||||
          "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,
 | 
			
		||||
      "kind": "fn",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,71 +1,67 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 3916
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 26,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 9,
 | 
			
		||||
            "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"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 26,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 9,
 | 
			
		||||
          "name": "obj",
 | 
			
		||||
          "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,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
@ -73,55 +69,53 @@ snapshot_kind: text
 | 
			
		||||
      "type": "VariableDeclaration"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 55,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 43,
 | 
			
		||||
            "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"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 55,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 43,
 | 
			
		||||
          "name": "height",
 | 
			
		||||
          "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,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 31,
 | 
			
		||||
 | 
			
		||||
@ -1,71 +1,67 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 3921
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 26,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 9,
 | 
			
		||||
            "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"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 26,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 9,
 | 
			
		||||
          "name": "obj",
 | 
			
		||||
          "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,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
@ -73,56 +69,54 @@ snapshot_kind: text
 | 
			
		||||
      "type": "VariableDeclaration"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 59,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 44,
 | 
			
		||||
            "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"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 59,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 44,
 | 
			
		||||
          "name": "height",
 | 
			
		||||
          "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,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 32,
 | 
			
		||||
 | 
			
		||||
@ -1,71 +1,67 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 3926
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 26,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 9,
 | 
			
		||||
            "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"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 26,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 9,
 | 
			
		||||
          "name": "obj",
 | 
			
		||||
          "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,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
@ -73,56 +69,54 @@ snapshot_kind: text
 | 
			
		||||
      "type": "VariableDeclaration"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 58,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 43,
 | 
			
		||||
          "name": "height",
 | 
			
		||||
          "start": 37,
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "end": 58,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 43,
 | 
			
		||||
            "name": "height",
 | 
			
		||||
            "start": 37,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "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"
 | 
			
		||||
              },
 | 
			
		||||
          "left": {
 | 
			
		||||
            "computed": false,
 | 
			
		||||
            "end": 54,
 | 
			
		||||
            "object": {
 | 
			
		||||
              "end": 49,
 | 
			
		||||
              "name": "obj",
 | 
			
		||||
              "start": 46,
 | 
			
		||||
              "type": "MemberExpression",
 | 
			
		||||
              "type": "MemberExpression"
 | 
			
		||||
              "type": "Identifier",
 | 
			
		||||
              "type": "Identifier"
 | 
			
		||||
            },
 | 
			
		||||
            "operator": "-",
 | 
			
		||||
            "right": {
 | 
			
		||||
              "end": 58,
 | 
			
		||||
              "raw": "1",
 | 
			
		||||
              "start": 57,
 | 
			
		||||
            "property": {
 | 
			
		||||
              "end": 53,
 | 
			
		||||
              "raw": "\"a\"",
 | 
			
		||||
              "start": 50,
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "value": 1.0
 | 
			
		||||
              "value": "a"
 | 
			
		||||
            },
 | 
			
		||||
            "start": 46,
 | 
			
		||||
            "type": "BinaryExpression",
 | 
			
		||||
            "type": "BinaryExpression"
 | 
			
		||||
            "type": "MemberExpression",
 | 
			
		||||
            "type": "MemberExpression"
 | 
			
		||||
          },
 | 
			
		||||
          "start": 37,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "operator": "-",
 | 
			
		||||
          "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,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 31,
 | 
			
		||||
 | 
			
		||||
@ -1,71 +1,67 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 3931
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 26,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 9,
 | 
			
		||||
            "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"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 26,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 9,
 | 
			
		||||
          "name": "obj",
 | 
			
		||||
          "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,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
@ -73,72 +69,70 @@ snapshot_kind: text
 | 
			
		||||
      "type": "VariableDeclaration"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 63,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 43,
 | 
			
		||||
            "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"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 63,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 43,
 | 
			
		||||
          "name": "height",
 | 
			
		||||
          "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,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 31,
 | 
			
		||||
 | 
			
		||||
@ -5,62 +5,60 @@ expression: actual
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 21,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 3,
 | 
			
		||||
            "name": "val",
 | 
			
		||||
            "start": 0,
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 21,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 3,
 | 
			
		||||
          "name": "val",
 | 
			
		||||
          "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"
 | 
			
		||||
          },
 | 
			
		||||
          "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"
 | 
			
		||||
            },
 | 
			
		||||
            "end": 21,
 | 
			
		||||
            "start": 6,
 | 
			
		||||
            "type": "CallExpressionKw",
 | 
			
		||||
            "type": "CallExpressionKw",
 | 
			
		||||
            "unlabeled": null
 | 
			
		||||
          },
 | 
			
		||||
          "start": 0,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "end": 21,
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "CallExpressionKw",
 | 
			
		||||
          "type": "CallExpressionKw",
 | 
			
		||||
          "unlabeled": null
 | 
			
		||||
        },
 | 
			
		||||
        "start": 0,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 21,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -5,54 +5,52 @@ expression: actual
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 18,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 3,
 | 
			
		||||
            "name": "val",
 | 
			
		||||
            "start": 0,
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 18,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 3,
 | 
			
		||||
          "name": "val",
 | 
			
		||||
          "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"
 | 
			
		||||
          },
 | 
			
		||||
          "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"
 | 
			
		||||
            },
 | 
			
		||||
            "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,
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "CallExpressionKw",
 | 
			
		||||
          "type": "CallExpressionKw",
 | 
			
		||||
          "unlabeled": {
 | 
			
		||||
            "end": 11,
 | 
			
		||||
            "name": "x",
 | 
			
		||||
            "start": 10,
 | 
			
		||||
            "type": "Identifier",
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "start": 0,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 18,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,71 +1,67 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 3936
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 26,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 9,
 | 
			
		||||
            "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"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 26,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 9,
 | 
			
		||||
          "name": "obj",
 | 
			
		||||
          "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,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
@ -73,72 +69,70 @@ snapshot_kind: text
 | 
			
		||||
      "type": "VariableDeclaration"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 63,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 43,
 | 
			
		||||
            "name": "height",
 | 
			
		||||
            "start": 37,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "elements": [
 | 
			
		||||
              {
 | 
			
		||||
                "end": 59,
 | 
			
		||||
                "left": {
 | 
			
		||||
                  "computed": false,
 | 
			
		||||
                  "end": 55,
 | 
			
		||||
                  "object": {
 | 
			
		||||
                    "end": 50,
 | 
			
		||||
                    "name": "obj",
 | 
			
		||||
                    "start": 47,
 | 
			
		||||
                    "type": "Identifier",
 | 
			
		||||
                    "type": "Identifier"
 | 
			
		||||
                  },
 | 
			
		||||
                  "property": {
 | 
			
		||||
                    "end": 54,
 | 
			
		||||
                    "raw": "\"a\"",
 | 
			
		||||
                    "start": 51,
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "value": "a"
 | 
			
		||||
                  },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 63,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 43,
 | 
			
		||||
          "name": "height",
 | 
			
		||||
          "start": 37,
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "elements": [
 | 
			
		||||
            {
 | 
			
		||||
              "end": 59,
 | 
			
		||||
              "left": {
 | 
			
		||||
                "computed": false,
 | 
			
		||||
                "end": 55,
 | 
			
		||||
                "object": {
 | 
			
		||||
                  "end": 50,
 | 
			
		||||
                  "name": "obj",
 | 
			
		||||
                  "start": 47,
 | 
			
		||||
                  "type": "MemberExpression",
 | 
			
		||||
                  "type": "MemberExpression"
 | 
			
		||||
                  "type": "Identifier",
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "operator": "-",
 | 
			
		||||
                "right": {
 | 
			
		||||
                  "end": 59,
 | 
			
		||||
                  "raw": "1",
 | 
			
		||||
                  "start": 58,
 | 
			
		||||
                "property": {
 | 
			
		||||
                  "end": 54,
 | 
			
		||||
                  "raw": "\"a\"",
 | 
			
		||||
                  "start": 51,
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "value": 1.0
 | 
			
		||||
                  "value": "a"
 | 
			
		||||
                },
 | 
			
		||||
                "start": 47,
 | 
			
		||||
                "type": "BinaryExpression",
 | 
			
		||||
                "type": "BinaryExpression"
 | 
			
		||||
                "type": "MemberExpression",
 | 
			
		||||
                "type": "MemberExpression"
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                "end": 62,
 | 
			
		||||
                "raw": "0",
 | 
			
		||||
                "start": 61,
 | 
			
		||||
              "operator": "-",
 | 
			
		||||
              "right": {
 | 
			
		||||
                "end": 59,
 | 
			
		||||
                "raw": "1",
 | 
			
		||||
                "start": 58,
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "value": 0.0
 | 
			
		||||
              }
 | 
			
		||||
            ],
 | 
			
		||||
            "end": 63,
 | 
			
		||||
            "start": 46,
 | 
			
		||||
            "type": "ArrayExpression",
 | 
			
		||||
            "type": "ArrayExpression"
 | 
			
		||||
          },
 | 
			
		||||
          "start": 37,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
                "value": 1.0
 | 
			
		||||
              },
 | 
			
		||||
              "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,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 31,
 | 
			
		||||
 | 
			
		||||
@ -1,71 +1,67 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 3941
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 26,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 9,
 | 
			
		||||
            "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"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 26,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 9,
 | 
			
		||||
          "name": "obj",
 | 
			
		||||
          "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,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
@ -73,72 +69,70 @@ snapshot_kind: text
 | 
			
		||||
      "type": "VariableDeclaration"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 62,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 43,
 | 
			
		||||
            "name": "height",
 | 
			
		||||
            "start": 37,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "elements": [
 | 
			
		||||
              {
 | 
			
		||||
                "end": 58,
 | 
			
		||||
                "left": {
 | 
			
		||||
                  "computed": false,
 | 
			
		||||
                  "end": 55,
 | 
			
		||||
                  "object": {
 | 
			
		||||
                    "end": 50,
 | 
			
		||||
                    "name": "obj",
 | 
			
		||||
                    "start": 47,
 | 
			
		||||
                    "type": "Identifier",
 | 
			
		||||
                    "type": "Identifier"
 | 
			
		||||
                  },
 | 
			
		||||
                  "property": {
 | 
			
		||||
                    "end": 54,
 | 
			
		||||
                    "raw": "\"a\"",
 | 
			
		||||
                    "start": 51,
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "type": "Literal",
 | 
			
		||||
                    "value": "a"
 | 
			
		||||
                  },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 62,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 43,
 | 
			
		||||
          "name": "height",
 | 
			
		||||
          "start": 37,
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "elements": [
 | 
			
		||||
            {
 | 
			
		||||
              "end": 58,
 | 
			
		||||
              "left": {
 | 
			
		||||
                "computed": false,
 | 
			
		||||
                "end": 55,
 | 
			
		||||
                "object": {
 | 
			
		||||
                  "end": 50,
 | 
			
		||||
                  "name": "obj",
 | 
			
		||||
                  "start": 47,
 | 
			
		||||
                  "type": "MemberExpression",
 | 
			
		||||
                  "type": "MemberExpression"
 | 
			
		||||
                  "type": "Identifier",
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "operator": "-",
 | 
			
		||||
                "right": {
 | 
			
		||||
                  "end": 58,
 | 
			
		||||
                  "raw": "1",
 | 
			
		||||
                  "start": 57,
 | 
			
		||||
                "property": {
 | 
			
		||||
                  "end": 54,
 | 
			
		||||
                  "raw": "\"a\"",
 | 
			
		||||
                  "start": 51,
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "value": 1.0
 | 
			
		||||
                  "value": "a"
 | 
			
		||||
                },
 | 
			
		||||
                "start": 47,
 | 
			
		||||
                "type": "BinaryExpression",
 | 
			
		||||
                "type": "BinaryExpression"
 | 
			
		||||
                "type": "MemberExpression",
 | 
			
		||||
                "type": "MemberExpression"
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                "end": 61,
 | 
			
		||||
                "raw": "0",
 | 
			
		||||
                "start": 60,
 | 
			
		||||
              "operator": "-",
 | 
			
		||||
              "right": {
 | 
			
		||||
                "end": 58,
 | 
			
		||||
                "raw": "1",
 | 
			
		||||
                "start": 57,
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "value": 0.0
 | 
			
		||||
              }
 | 
			
		||||
            ],
 | 
			
		||||
            "end": 62,
 | 
			
		||||
            "start": 46,
 | 
			
		||||
            "type": "ArrayExpression",
 | 
			
		||||
            "type": "ArrayExpression"
 | 
			
		||||
          },
 | 
			
		||||
          "start": 37,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
                "value": 1.0
 | 
			
		||||
              },
 | 
			
		||||
              "start": 47,
 | 
			
		||||
              "type": "BinaryExpression",
 | 
			
		||||
              "type": "BinaryExpression"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "end": 61,
 | 
			
		||||
              "raw": "0",
 | 
			
		||||
              "start": 60,
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "value": 0.0
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "end": 62,
 | 
			
		||||
          "start": 46,
 | 
			
		||||
          "type": "ArrayExpression",
 | 
			
		||||
          "type": "ArrayExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 37,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 62,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 31,
 | 
			
		||||
 | 
			
		||||
@ -1,61 +1,57 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 3946
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 24,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 12,
 | 
			
		||||
            "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"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 24,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 12,
 | 
			
		||||
          "name": "height",
 | 
			
		||||
          "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,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,63 +1,59 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 3947
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 21,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 9,
 | 
			
		||||
          "name": "six",
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "end": 21,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 9,
 | 
			
		||||
            "name": "six",
 | 
			
		||||
            "start": 6,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "end": 21,
 | 
			
		||||
          "left": {
 | 
			
		||||
            "end": 17,
 | 
			
		||||
            "left": {
 | 
			
		||||
              "end": 17,
 | 
			
		||||
              "left": {
 | 
			
		||||
                "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
 | 
			
		||||
              },
 | 
			
		||||
              "end": 13,
 | 
			
		||||
              "raw": "1",
 | 
			
		||||
              "start": 12,
 | 
			
		||||
              "type": "BinaryExpression",
 | 
			
		||||
              "type": "BinaryExpression"
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "value": 1.0
 | 
			
		||||
            },
 | 
			
		||||
            "operator": "+",
 | 
			
		||||
            "right": {
 | 
			
		||||
              "end": 21,
 | 
			
		||||
              "raw": "3",
 | 
			
		||||
              "start": 20,
 | 
			
		||||
              "end": 17,
 | 
			
		||||
              "raw": "2",
 | 
			
		||||
              "start": 16,
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "value": 3.0
 | 
			
		||||
              "value": 2.0
 | 
			
		||||
            },
 | 
			
		||||
            "start": 12,
 | 
			
		||||
            "type": "BinaryExpression",
 | 
			
		||||
            "type": "BinaryExpression"
 | 
			
		||||
          },
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "operator": "+",
 | 
			
		||||
          "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,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,63 +1,59 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 3948
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 22,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 10,
 | 
			
		||||
          "name": "five",
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "end": 22,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 10,
 | 
			
		||||
            "name": "five",
 | 
			
		||||
            "start": 6,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "end": 22,
 | 
			
		||||
          "left": {
 | 
			
		||||
            "end": 18,
 | 
			
		||||
            "left": {
 | 
			
		||||
              "end": 18,
 | 
			
		||||
              "left": {
 | 
			
		||||
                "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
 | 
			
		||||
              },
 | 
			
		||||
              "end": 14,
 | 
			
		||||
              "raw": "3",
 | 
			
		||||
              "start": 13,
 | 
			
		||||
              "type": "BinaryExpression",
 | 
			
		||||
              "type": "BinaryExpression"
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "value": 3.0
 | 
			
		||||
            },
 | 
			
		||||
            "operator": "+",
 | 
			
		||||
            "operator": "*",
 | 
			
		||||
            "right": {
 | 
			
		||||
              "end": 22,
 | 
			
		||||
              "raw": "2",
 | 
			
		||||
              "start": 21,
 | 
			
		||||
              "end": 18,
 | 
			
		||||
              "raw": "1",
 | 
			
		||||
              "start": 17,
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "value": 2.0
 | 
			
		||||
              "value": 1.0
 | 
			
		||||
            },
 | 
			
		||||
            "start": 13,
 | 
			
		||||
            "type": "BinaryExpression",
 | 
			
		||||
            "type": "BinaryExpression"
 | 
			
		||||
          },
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "operator": "+",
 | 
			
		||||
          "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,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,63 +1,59 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 3949
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 30,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 12,
 | 
			
		||||
            "name": "height",
 | 
			
		||||
            "start": 6,
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "elements": [
 | 
			
		||||
              {
 | 
			
		||||
                "computed": false,
 | 
			
		||||
                "end": 25,
 | 
			
		||||
                "object": {
 | 
			
		||||
                  "end": 20,
 | 
			
		||||
                  "name": "obj",
 | 
			
		||||
                  "start": 17,
 | 
			
		||||
                  "type": "Identifier",
 | 
			
		||||
                  "type": "Identifier"
 | 
			
		||||
                },
 | 
			
		||||
                "property": {
 | 
			
		||||
                  "end": 24,
 | 
			
		||||
                  "raw": "\"a\"",
 | 
			
		||||
                  "start": 21,
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "type": "Literal",
 | 
			
		||||
                  "value": "a"
 | 
			
		||||
                },
 | 
			
		||||
                "start": 17,
 | 
			
		||||
                "type": "MemberExpression",
 | 
			
		||||
                "type": "MemberExpression"
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                "end": 28,
 | 
			
		||||
                "raw": "0",
 | 
			
		||||
                "start": 27,
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "value": 0.0
 | 
			
		||||
              }
 | 
			
		||||
            ],
 | 
			
		||||
            "end": 30,
 | 
			
		||||
            "start": 15,
 | 
			
		||||
            "type": "ArrayExpression",
 | 
			
		||||
            "type": "ArrayExpression"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 30,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 12,
 | 
			
		||||
          "name": "height",
 | 
			
		||||
          "start": 6,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "elements": [
 | 
			
		||||
            {
 | 
			
		||||
              "computed": false,
 | 
			
		||||
              "end": 25,
 | 
			
		||||
              "object": {
 | 
			
		||||
                "end": 20,
 | 
			
		||||
                "name": "obj",
 | 
			
		||||
                "start": 17,
 | 
			
		||||
                "type": "Identifier",
 | 
			
		||||
                "type": "Identifier"
 | 
			
		||||
              },
 | 
			
		||||
              "property": {
 | 
			
		||||
                "end": 24,
 | 
			
		||||
                "raw": "\"a\"",
 | 
			
		||||
                "start": 21,
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "type": "Literal",
 | 
			
		||||
                "value": "a"
 | 
			
		||||
              },
 | 
			
		||||
              "start": 17,
 | 
			
		||||
              "type": "MemberExpression",
 | 
			
		||||
              "type": "MemberExpression"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "end": 28,
 | 
			
		||||
              "raw": "0",
 | 
			
		||||
              "start": 27,
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "type": "Literal",
 | 
			
		||||
              "value": 0.0
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "end": 30,
 | 
			
		||||
          "start": 15,
 | 
			
		||||
          "type": "ArrayExpression",
 | 
			
		||||
          "type": "ArrayExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 6,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 30,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
 | 
			
		||||
@ -1,71 +1,67 @@
 | 
			
		||||
---
 | 
			
		||||
source: kcl/src/parsing/parser.rs
 | 
			
		||||
assertion_line: 3950
 | 
			
		||||
expression: actual
 | 
			
		||||
snapshot_kind: text
 | 
			
		||||
---
 | 
			
		||||
{
 | 
			
		||||
  "body": [
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
          "end": 26,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 9,
 | 
			
		||||
            "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"
 | 
			
		||||
          },
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 26,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 9,
 | 
			
		||||
          "name": "obj",
 | 
			
		||||
          "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,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 0,
 | 
			
		||||
@ -73,41 +69,39 @@ snapshot_kind: text
 | 
			
		||||
      "type": "VariableDeclaration"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "declarations": [
 | 
			
		||||
        {
 | 
			
		||||
      "declaration": {
 | 
			
		||||
        "end": 54,
 | 
			
		||||
        "id": {
 | 
			
		||||
          "end": 43,
 | 
			
		||||
          "name": "height",
 | 
			
		||||
          "start": 37,
 | 
			
		||||
          "type": "Identifier"
 | 
			
		||||
        },
 | 
			
		||||
        "init": {
 | 
			
		||||
          "computed": false,
 | 
			
		||||
          "end": 54,
 | 
			
		||||
          "id": {
 | 
			
		||||
            "end": 43,
 | 
			
		||||
            "name": "height",
 | 
			
		||||
            "start": 37,
 | 
			
		||||
          "object": {
 | 
			
		||||
            "end": 49,
 | 
			
		||||
            "name": "obj",
 | 
			
		||||
            "start": 46,
 | 
			
		||||
            "type": "Identifier",
 | 
			
		||||
            "type": "Identifier"
 | 
			
		||||
          },
 | 
			
		||||
          "init": {
 | 
			
		||||
            "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,
 | 
			
		||||
            "type": "MemberExpression",
 | 
			
		||||
            "type": "MemberExpression"
 | 
			
		||||
          "property": {
 | 
			
		||||
            "end": 53,
 | 
			
		||||
            "raw": "\"a\"",
 | 
			
		||||
            "start": 50,
 | 
			
		||||
            "type": "Literal",
 | 
			
		||||
            "type": "Literal",
 | 
			
		||||
            "value": "a"
 | 
			
		||||
          },
 | 
			
		||||
          "start": 37,
 | 
			
		||||
          "type": "VariableDeclarator"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
          "start": 46,
 | 
			
		||||
          "type": "MemberExpression",
 | 
			
		||||
          "type": "MemberExpression"
 | 
			
		||||
        },
 | 
			
		||||
        "start": 37,
 | 
			
		||||
        "type": "VariableDeclarator"
 | 
			
		||||
      },
 | 
			
		||||
      "end": 54,
 | 
			
		||||
      "kind": "const",
 | 
			
		||||
      "start": 31,
 | 
			
		||||
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user