Fix constraint checking in line

This commit is contained in:
Adam Chalmers
2025-01-10 15:50:08 -06:00
committed by Nick Cameron
parent ecec739632
commit 72f84c3a8f
3 changed files with 30 additions and 29 deletions

View File

@ -68,8 +68,8 @@ import { Node } from 'wasm-lib/kcl/bindings/Node'
import { findKwArg, findKwArgAny, findKwArgAnyIndex } from 'lang/util'
export const ARG_TAG = 'tag'
const ARG_END = 'end'
const ARG_END_ABSOLUTE = 'endAbsolute'
export const ARG_END = 'end'
export const ARG_END_ABSOLUTE = 'endAbsolute'
const STRAIGHT_SEGMENT_ERR = new Error(
'Invalid input, expected "straight-segment"'

View File

@ -524,7 +524,6 @@ part001 = startSketchOn('XY')
['// base selection', '// yRelative'],
'setHorzDistance'
)
// ADAM here
expect(expectedCode).toContain(`|> line(%, endAbsolute = [
segEndX(seg01) + 2.6,
lastSegY(%) + myVar
@ -575,7 +574,7 @@ async function helperThing(
}
describe('testing getConstraintLevelFromSourceRange', () => {
it('should divide up lines into free, partial and fully contrained', () => {
it.only('should divide up lines into free, partial and fully contrained', () => {
const code = `baseLength = 3
baseThick = 1
armThick = 0.5

View File

@ -50,6 +50,8 @@ import {
getArgForEnd,
replaceSketchLine,
ARG_TAG,
ARG_END,
ARG_END_ABSOLUTE,
getConstraintInfoKw,
} from './sketch'
import {
@ -58,7 +60,7 @@ import {
} from './sketchConstraints'
import { getAngle, roundOff, normaliseAngle } from '../../lib/utils'
import { Node } from 'wasm-lib/kcl/bindings/Node'
import { findKwArg } from 'lang/util'
import { findKwArg, findKwArgAny } from 'lang/util'
export type LineInputsType =
| 'xAbsolute'
@ -1871,7 +1873,7 @@ export function transformAstSketchLines({
return
}
}
const segMeta = getSketchSegmentFromPathToNode(sketch, ast, _pathToNode) // ADAM: HERE
const segMeta = getSketchSegmentFromPathToNode(sketch, ast, _pathToNode)
if (err(segMeta)) return segMeta
const seg = segMeta.segment
@ -1984,36 +1986,36 @@ export function getConstraintLevelFromSourceRange(
): Error | { range: [number, number]; level: ConstraintLevel } {
if (err(ast)) return ast
let partsOfCallNode = (() => {
const nodeMeta = getNodeFromPath<Node<CallExpression>>(
ast,
getNodePathFromSourceRange(ast, cursorRange),
'CallExpression'
)
const path = getNodePathFromSourceRange(ast, cursorRange)
const nodeMeta = getNodeFromPath<
Node<CallExpression> | Node<CallExpressionKw>
>(ast, path, ['CallExpression', 'CallExpressionKw'])
if (err(nodeMeta)) return nodeMeta
const { node: sketchFnExp } = nodeMeta
const name = sketchFnExp?.callee?.name as ToolTip
const range: [number, number] = [sketchFnExp.start, sketchFnExp.end]
const firstArg = getFirstArg(sketchFnExp)
const firstArg = (() => {
switch (nodeMeta.node.type) {
case 'CallExpression':
return getFirstArg(nodeMeta.node)
case 'CallExpressionKw':
const arg = findKwArgAny([ARG_END, ARG_END_ABSOLUTE], nodeMeta.node)
if (arg === undefined) {
return new Error('unexpected call expression: ' + name)
}
const val =
arg.type == 'ArrayExpression' && arg.elements.length == 2
? (arg.elements as [Expr, Expr])
: arg
return {
val,
tag: findKwArg(ARG_TAG, nodeMeta.node),
}
}
})()
return { name, range, firstArg }
})()
const partsOfCallKwNode = () => {
const nodeMeta = getNodeFromPath<Node<CallExpressionKw>>(
ast,
getNodePathFromSourceRange(ast, cursorRange),
'CallExpressionKw'
)
if (err(nodeMeta)) return nodeMeta
const { node: sketchFnExp } = nodeMeta
const name = sketchFnExp?.callee?.name as ToolTip
const range: [number, number] = [sketchFnExp.start, sketchFnExp.end]
const firstArg = getArgForEnd(sketchFnExp)
return { name, range, firstArg }
}
if (err(partsOfCallNode)) {
partsOfCallNode = partsOfCallKwNode()
}
if (err(partsOfCallNode)) return partsOfCallNode
const { name, range, firstArg } = partsOfCallNode
if (!toolTips.includes(name)) return { level: 'free', range: range }