locateExtrudeDeclarator > locateVariableWithCallOrPipe
This commit is contained in:
		@ -16,7 +16,7 @@ import {
 | 
			
		||||
  getNodeFromPath,
 | 
			
		||||
  hasSketchPipeBeenExtruded,
 | 
			
		||||
  traverse,
 | 
			
		||||
  locateExtrudeDeclarator,
 | 
			
		||||
  locateVariableWithCallOrPipe,
 | 
			
		||||
} from '@src/lang/queryAst'
 | 
			
		||||
import { getNodePathFromSourceRange } from '@src/lang/queryAstNodePathUtils'
 | 
			
		||||
import type { Artifact } from '@src/lang/std/artifactGraph'
 | 
			
		||||
@ -165,12 +165,12 @@ export async function modifyAstWithEdgeTreatmentAndTag(
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    // Locate the extrude call
 | 
			
		||||
    const locatedExtrudeDeclarator = locateExtrudeDeclarator(
 | 
			
		||||
    const locatedExtrudeDeclarator = locateVariableWithCallOrPipe(
 | 
			
		||||
      clonedAst,
 | 
			
		||||
      pathToExtrudeNode
 | 
			
		||||
    )
 | 
			
		||||
    if (err(locatedExtrudeDeclarator)) return locatedExtrudeDeclarator
 | 
			
		||||
    const { extrudeDeclarator } = locatedExtrudeDeclarator
 | 
			
		||||
    const { variableDeclarator } = locatedExtrudeDeclarator
 | 
			
		||||
 | 
			
		||||
    // Modify the extrude expression to include this edge treatment expression
 | 
			
		||||
    // CallExpression - no edge treatment
 | 
			
		||||
@ -178,33 +178,33 @@ export async function modifyAstWithEdgeTreatmentAndTag(
 | 
			
		||||
 | 
			
		||||
    let pathToEdgeTreatmentNode: PathToNode
 | 
			
		||||
 | 
			
		||||
    if (extrudeDeclarator.init.type === 'CallExpressionKw') {
 | 
			
		||||
    if (variableDeclarator.init.type === 'CallExpressionKw') {
 | 
			
		||||
      // 1. case when no edge treatment exists
 | 
			
		||||
 | 
			
		||||
      // modify ast with new edge treatment call by mutating the extrude node
 | 
			
		||||
      extrudeDeclarator.init = createPipeExpression([
 | 
			
		||||
        extrudeDeclarator.init,
 | 
			
		||||
      variableDeclarator.init = createPipeExpression([
 | 
			
		||||
        variableDeclarator.init,
 | 
			
		||||
        edgeTreatmentCall,
 | 
			
		||||
      ])
 | 
			
		||||
 | 
			
		||||
      // get path to the edge treatment node
 | 
			
		||||
      pathToEdgeTreatmentNode = getPathToNodeOfEdgeTreatmentLiteral(
 | 
			
		||||
        pathToExtrudeNode,
 | 
			
		||||
        extrudeDeclarator,
 | 
			
		||||
        variableDeclarator,
 | 
			
		||||
        firstTag,
 | 
			
		||||
        parameters
 | 
			
		||||
      )
 | 
			
		||||
      pathToEdgeTreatmentNodes.push(pathToEdgeTreatmentNode)
 | 
			
		||||
    } else if (extrudeDeclarator.init.type === 'PipeExpression') {
 | 
			
		||||
    } else if (variableDeclarator.init.type === 'PipeExpression') {
 | 
			
		||||
      // 2. case when edge treatment exists or extrude in sketch pipe
 | 
			
		||||
 | 
			
		||||
      // mutate the extrude node with the new edge treatment call
 | 
			
		||||
      extrudeDeclarator.init.body.push(edgeTreatmentCall)
 | 
			
		||||
      variableDeclarator.init.body.push(edgeTreatmentCall)
 | 
			
		||||
 | 
			
		||||
      // get path to the edge treatment node
 | 
			
		||||
      pathToEdgeTreatmentNode = getPathToNodeOfEdgeTreatmentLiteral(
 | 
			
		||||
        pathToExtrudeNode,
 | 
			
		||||
        extrudeDeclarator,
 | 
			
		||||
        variableDeclarator,
 | 
			
		||||
        firstTag,
 | 
			
		||||
        parameters
 | 
			
		||||
      )
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
import type { Node } from '@rust/kcl-lib/bindings/Node'
 | 
			
		||||
 | 
			
		||||
import type { PathToNode, Program } from '@src/lang/wasm'
 | 
			
		||||
import { locateExtrudeDeclarator } from '@src/lang/queryAst'
 | 
			
		||||
import { locateVariableWithCallOrPipe } from '@src/lang/queryAst'
 | 
			
		||||
import { err } from '@src/lib/trap'
 | 
			
		||||
 | 
			
		||||
export function deleteNodeInExtrudePipe(
 | 
			
		||||
@ -13,14 +13,14 @@ export function deleteNodeInExtrudePipe(
 | 
			
		||||
    return new Error("Couldn't find node to delete in ast")
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const lookup = locateExtrudeDeclarator(ast, node)
 | 
			
		||||
  const lookup = locateVariableWithCallOrPipe(ast, node)
 | 
			
		||||
  if (err(lookup)) {
 | 
			
		||||
    return lookup
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (lookup.extrudeDeclarator.init.type !== 'PipeExpression') {
 | 
			
		||||
  if (lookup.variableDeclarator.init.type !== 'PipeExpression') {
 | 
			
		||||
    return new Error("Couldn't find node to delete in looked up extrusion")
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  lookup.extrudeDeclarator.init.body.splice(node[pipeIndex][0], 1)
 | 
			
		||||
  lookup.variableDeclarator.init.body.splice(node[pipeIndex][0], 1)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -7,7 +7,7 @@ import {
 | 
			
		||||
  createPipeExpression,
 | 
			
		||||
  createPipeSubstitution,
 | 
			
		||||
} from '@src/lang/create'
 | 
			
		||||
import { locateExtrudeDeclarator } from '@src/lang/queryAst'
 | 
			
		||||
import { locateVariableWithCallOrPipe } from '@src/lang/queryAst'
 | 
			
		||||
import type { PathToNode, Program } from '@src/lang/wasm'
 | 
			
		||||
import { COMMAND_APPEARANCE_COLOR_DEFAULT } from '@src/lib/commandBarConfigs/modelingCommandConfig'
 | 
			
		||||
import { err } from '@src/lib/trap'
 | 
			
		||||
@ -24,12 +24,12 @@ export function setAppearance({
 | 
			
		||||
  const modifiedAst = structuredClone(ast)
 | 
			
		||||
 | 
			
		||||
  // Locate the call (not necessarily an extrude here)
 | 
			
		||||
  const result = locateExtrudeDeclarator(modifiedAst, nodeToEdit)
 | 
			
		||||
  const result = locateVariableWithCallOrPipe(modifiedAst, nodeToEdit)
 | 
			
		||||
  if (err(result)) {
 | 
			
		||||
    return result
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const declarator = result.extrudeDeclarator
 | 
			
		||||
  const declarator = result.variableDeclarator
 | 
			
		||||
  const call = createCallExpressionStdLibKw(
 | 
			
		||||
    'appearance',
 | 
			
		||||
    createPipeSubstitution(),
 | 
			
		||||
 | 
			
		||||
@ -1175,36 +1175,36 @@ export function getSketchSelectionsFromOperation(
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function locateExtrudeDeclarator(
 | 
			
		||||
  node: Program,
 | 
			
		||||
  pathToExtrudeNode: PathToNode
 | 
			
		||||
): { extrudeDeclarator: VariableDeclarator; shallowPath: PathToNode } | Error {
 | 
			
		||||
  const nodeOfExtrudeCall = getNodeFromPath<VariableDeclaration>(
 | 
			
		||||
    node,
 | 
			
		||||
    pathToExtrudeNode,
 | 
			
		||||
export function locateVariableWithCallOrPipe(
 | 
			
		||||
  ast: Program,
 | 
			
		||||
  pathToNode: PathToNode
 | 
			
		||||
): { variableDeclarator: VariableDeclarator; shallowPath: PathToNode } | Error {
 | 
			
		||||
  const variableDeclarationNode = getNodeFromPath<VariableDeclaration>(
 | 
			
		||||
    ast,
 | 
			
		||||
    pathToNode,
 | 
			
		||||
    'VariableDeclaration'
 | 
			
		||||
  )
 | 
			
		||||
  if (err(nodeOfExtrudeCall)) return nodeOfExtrudeCall
 | 
			
		||||
  if (err(variableDeclarationNode)) return variableDeclarationNode
 | 
			
		||||
 | 
			
		||||
  const { node: extrudeVarDecl } = nodeOfExtrudeCall
 | 
			
		||||
  const extrudeDeclarator = extrudeVarDecl.declaration
 | 
			
		||||
  if (!extrudeDeclarator) {
 | 
			
		||||
    return new Error('Extrude Declarator not found.')
 | 
			
		||||
  const { node: variableDecl } = variableDeclarationNode
 | 
			
		||||
  const variableDeclarator = variableDecl.declaration
 | 
			
		||||
  if (!variableDeclarator) {
 | 
			
		||||
    return new Error('Variable Declarator not found.')
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const extrudeInit = extrudeDeclarator?.init
 | 
			
		||||
  if (!extrudeInit) {
 | 
			
		||||
    return new Error('Extrude Init not found.')
 | 
			
		||||
  const initializer = variableDeclarator?.init
 | 
			
		||||
  if (!initializer) {
 | 
			
		||||
    return new Error('Initializer not found.')
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (
 | 
			
		||||
    extrudeInit.type !== 'CallExpressionKw' &&
 | 
			
		||||
    extrudeInit.type !== 'PipeExpression'
 | 
			
		||||
    initializer.type !== 'CallExpressionKw' &&
 | 
			
		||||
    initializer.type !== 'PipeExpression'
 | 
			
		||||
  ) {
 | 
			
		||||
    return new Error('Extrude must be a PipeExpression or CallExpressionKw')
 | 
			
		||||
    return new Error('Initializer must be a PipeExpression or CallExpressionKw')
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return { extrudeDeclarator, shallowPath: nodeOfExtrudeCall.shallowPath }
 | 
			
		||||
  return { variableDeclarator, shallowPath: variableDeclarationNode.shallowPath }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function findImportNodeAndAlias(
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user