import { toolTips } from 'lang/langHelpers' import { Selections } from 'lib/selections' import { Program, Value, VariableDeclarator } from '../../lang/wasm' import { getNodePathFromSourceRange, getNodeFromPath, } from '../../lang/queryAst' import { isSketchVariablesLinked } from '../../lang/std/sketchConstraints' import { transformSecondarySketchLinesTagFirst, getTransformInfos, PathToNodeMap, TransformInfo, } from '../../lang/std/sketchcombos' import { kclManager } from 'lib/singletons' import { err } from 'lib/trap' export function setEqualLengthInfo({ selectionRanges, }: { selectionRanges: Selections }): | { transforms: TransformInfo[] enabled: boolean } | Error { const paths = selectionRanges.codeBasedSelections.map(({ range }) => getNodePathFromSourceRange(kclManager.ast, range) ) const _nodes = paths.map((pathToNode) => { const tmp = getNodeFromPath(kclManager.ast, pathToNode) if (err(tmp)) return tmp return tmp.node }) const _err1 = _nodes.find(err) if (err(_err1)) return _err1 const nodes = _nodes as Value[] const _varDecs = paths.map((pathToNode) => { const tmp = getNodeFromPath( kclManager.ast, pathToNode, 'VariableDeclarator' ) if (err(tmp)) return tmp return tmp.node }) const _err2 = _varDecs.find(err) if (err(_err2)) return _err2 const varDecs = _varDecs as VariableDeclarator[] const primaryLine = varDecs[0] const secondaryVarDecs = varDecs.slice(1) const isOthersLinkedToPrimary = secondaryVarDecs.every((secondary) => isSketchVariablesLinked(secondary, primaryLine, kclManager.ast) ) const isAllTooltips = nodes.every( (node) => node?.type === 'CallExpression' && toolTips.includes(node.callee.name as any) ) const transforms = getTransformInfos( { ...selectionRanges, codeBasedSelections: selectionRanges.codeBasedSelections.slice(1), }, kclManager.ast, 'equalLength' ) if (err(transforms)) return transforms const enabled = !!secondaryVarDecs.length && isAllTooltips && isOthersLinkedToPrimary && transforms.every(Boolean) return { enabled, transforms } } export function applyConstraintEqualLength({ selectionRanges, }: { selectionRanges: Selections }): | { modifiedAst: Program pathToNodeMap: PathToNodeMap } | Error { const info = setEqualLengthInfo({ selectionRanges }) if (err(info)) return info const { transforms } = info const transform = transformSecondarySketchLinesTagFirst({ ast: kclManager.ast, selectionRanges, transformInfos: transforms, programMemory: kclManager.programMemory, }) if (err(transform)) return transform const { modifiedAst, pathToNodeMap } = transform return { modifiedAst, pathToNodeMap } }