Fix indentation for wrapped array and object expressions, within pipe bodies (#77)
This commit is contained in:
@ -303,6 +303,34 @@ describe('testing call Expressions in BinaryExpressions and UnaryExpressions', (
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('it recasts wrapped object expressions in pipe bodies with correct indentation', () => {
|
||||||
|
it('with a single line', () => {
|
||||||
|
const code = `const part001 = startSketchAt([-0.01, -0.08])
|
||||||
|
|> line({ to: [0.62, 4.15], tag: 'seg01' }, %)
|
||||||
|
|> line([2.77, -1.24], %)
|
||||||
|
|> angledLineThatIntersects({
|
||||||
|
angle: 201,
|
||||||
|
offset: -1.35,
|
||||||
|
intersectTag: 'seg01'
|
||||||
|
}, %)
|
||||||
|
|> line([-0.42, -1.72], %)
|
||||||
|
show(part001)`
|
||||||
|
const { ast } = code2ast(code)
|
||||||
|
const recasted = recast(ast)
|
||||||
|
expect(recasted).toBe(code)
|
||||||
|
})
|
||||||
|
it('recasts wrapped object expressions NOT in pipe body correctly', () => {
|
||||||
|
const code = `angledLineThatIntersects({
|
||||||
|
angle: 201,
|
||||||
|
offset: -1.35,
|
||||||
|
intersectTag: 'seg01'
|
||||||
|
}, %)`
|
||||||
|
const { ast } = code2ast(code)
|
||||||
|
const recasted = recast(ast)
|
||||||
|
expect(recasted).toBe(code)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
// helpers
|
// helpers
|
||||||
|
|
||||||
function code2ast(code: string): { ast: Program; tokens: Token[] } {
|
function code2ast(code: string): { ast: Program; tokens: Token[] } {
|
||||||
|
@ -118,7 +118,8 @@ ${indentation}]`
|
|||||||
|
|
||||||
function recastObjectExpression(
|
function recastObjectExpression(
|
||||||
expression: ObjectExpression,
|
expression: ObjectExpression,
|
||||||
indentation = ''
|
indentation = '',
|
||||||
|
isInPipeExpression = false
|
||||||
): string {
|
): string {
|
||||||
const flatRecast = `{ ${expression.properties
|
const flatRecast = `{ ${expression.properties
|
||||||
.map((prop) => `${prop.key.name}: ${recastValue(prop.value)}`)
|
.map((prop) => `${prop.key.name}: ${recastValue(prop.value)}`)
|
||||||
@ -130,7 +131,7 @@ function recastObjectExpression(
|
|||||||
${_indentation}${expression.properties
|
${_indentation}${expression.properties
|
||||||
.map((prop) => `${prop.key.name}: ${recastValue(prop.value)}`)
|
.map((prop) => `${prop.key.name}: ${recastValue(prop.value)}`)
|
||||||
.join(`,\n${_indentation}`)}
|
.join(`,\n${_indentation}`)}
|
||||||
}`
|
${isInPipeExpression ? ' ' : ''}}`
|
||||||
}
|
}
|
||||||
return flatRecast
|
return flatRecast
|
||||||
}
|
}
|
||||||
@ -159,14 +160,19 @@ function recastLiteral(literal: Literal): string {
|
|||||||
|
|
||||||
function recastCallExpression(
|
function recastCallExpression(
|
||||||
expression: CallExpression,
|
expression: CallExpression,
|
||||||
indentation = ''
|
indentation = '',
|
||||||
|
isInPipeExpression = false
|
||||||
): string {
|
): string {
|
||||||
return `${expression.callee.name}(${expression.arguments
|
return `${expression.callee.name}(${expression.arguments
|
||||||
.map((arg) => recastArgument(arg, indentation))
|
.map((arg) => recastArgument(arg, indentation, isInPipeExpression))
|
||||||
.join(', ')})`
|
.join(', ')})`
|
||||||
}
|
}
|
||||||
|
|
||||||
function recastArgument(argument: Value, indentation = ''): string {
|
function recastArgument(
|
||||||
|
argument: Value,
|
||||||
|
indentation = '',
|
||||||
|
isInPipeExpression = false
|
||||||
|
): string {
|
||||||
if (argument.type === 'Literal') {
|
if (argument.type === 'Literal') {
|
||||||
return recastLiteral(argument)
|
return recastLiteral(argument)
|
||||||
} else if (argument.type === 'Identifier') {
|
} else if (argument.type === 'Identifier') {
|
||||||
@ -176,7 +182,7 @@ function recastArgument(argument: Value, indentation = ''): string {
|
|||||||
} else if (argument.type === 'ArrayExpression') {
|
} else if (argument.type === 'ArrayExpression') {
|
||||||
return recastArrayExpression(argument, indentation)
|
return recastArrayExpression(argument, indentation)
|
||||||
} else if (argument.type === 'ObjectExpression') {
|
} else if (argument.type === 'ObjectExpression') {
|
||||||
return recastObjectExpression(argument)
|
return recastObjectExpression(argument, indentation, isInPipeExpression)
|
||||||
} else if (argument.type === 'CallExpression') {
|
} else if (argument.type === 'CallExpression') {
|
||||||
return recastCallExpression(argument)
|
return recastCallExpression(argument)
|
||||||
} else if (argument.type === 'FunctionExpression') {
|
} else if (argument.type === 'FunctionExpression') {
|
||||||
@ -212,13 +218,18 @@ function recastMemberExpression(
|
|||||||
return expression.object.name + keyString
|
return expression.object.name + keyString
|
||||||
}
|
}
|
||||||
|
|
||||||
function recastValue(node: Value, indentation = ''): string {
|
function recastValue(
|
||||||
|
node: Value,
|
||||||
|
_indentation = '',
|
||||||
|
isInPipeExpression = false
|
||||||
|
): string {
|
||||||
|
const indentation = _indentation + (isInPipeExpression ? ' ' : '')
|
||||||
if (node.type === 'BinaryExpression') {
|
if (node.type === 'BinaryExpression') {
|
||||||
return recastBinaryExpression(node)
|
return recastBinaryExpression(node)
|
||||||
} else if (node.type === 'ArrayExpression') {
|
} else if (node.type === 'ArrayExpression') {
|
||||||
return recastArrayExpression(node, indentation)
|
return recastArrayExpression(node, indentation)
|
||||||
} else if (node.type === 'ObjectExpression') {
|
} else if (node.type === 'ObjectExpression') {
|
||||||
return recastObjectExpression(node, indentation)
|
return recastObjectExpression(node, indentation, isInPipeExpression)
|
||||||
} else if (node.type === 'MemberExpression') {
|
} else if (node.type === 'MemberExpression') {
|
||||||
return recastMemberExpression(node, indentation)
|
return recastMemberExpression(node, indentation)
|
||||||
} else if (node.type === 'Literal') {
|
} else if (node.type === 'Literal') {
|
||||||
@ -226,7 +237,7 @@ function recastValue(node: Value, indentation = ''): string {
|
|||||||
} else if (node.type === 'FunctionExpression') {
|
} else if (node.type === 'FunctionExpression') {
|
||||||
return recastFunction(node)
|
return recastFunction(node)
|
||||||
} else if (node.type === 'CallExpression') {
|
} else if (node.type === 'CallExpression') {
|
||||||
return recastCallExpression(node, indentation)
|
return recastCallExpression(node, indentation, isInPipeExpression)
|
||||||
} else if (node.type === 'Identifier') {
|
} else if (node.type === 'Identifier') {
|
||||||
return node.name
|
return node.name
|
||||||
} else if (node.type === 'PipeExpression') {
|
} else if (node.type === 'PipeExpression') {
|
||||||
@ -243,7 +254,7 @@ function recastPipeExpression(expression: PipeExpression): string {
|
|||||||
let str = ''
|
let str = ''
|
||||||
let indentation = ' '
|
let indentation = ' '
|
||||||
let maybeLineBreak = '\n'
|
let maybeLineBreak = '\n'
|
||||||
str = recastValue(statement, indentation)
|
str = recastValue(statement, indentation, true)
|
||||||
if (
|
if (
|
||||||
expression.nonCodeMeta?.[index]?.value &&
|
expression.nonCodeMeta?.[index]?.value &&
|
||||||
expression.nonCodeMeta?.[index].value !== ' '
|
expression.nonCodeMeta?.[index].value !== ' '
|
||||||
|
@ -52,20 +52,20 @@ describe('testing swaping out sketch calls with xLine/xLineTo', () => {
|
|||||||
` |> lineTo({ to: [1, 1], tag: 'abc1' }, %)`,
|
` |> lineTo({ to: [1, 1], tag: 'abc1' }, %)`,
|
||||||
` |> line({ to: [-2.04, -0.7], tag: 'abc2' }, %)`,
|
` |> line({ to: [-2.04, -0.7], tag: 'abc2' }, %)`,
|
||||||
` |> angledLine({`,
|
` |> angledLine({`,
|
||||||
` angle: 157,`,
|
` angle: 157,`,
|
||||||
` length: 1.69,`,
|
` length: 1.69,`,
|
||||||
` tag: 'abc3'`,
|
` tag: 'abc3'`,
|
||||||
`}, %)`,
|
` }, %)`,
|
||||||
` |> angledLineOfXLength({`,
|
` |> angledLineOfXLength({`,
|
||||||
` angle: 217,`,
|
` angle: 217,`,
|
||||||
` length: 0.86,`,
|
` length: 0.86,`,
|
||||||
` tag: 'abc4'`,
|
` tag: 'abc4'`,
|
||||||
`}, %)`,
|
` }, %)`,
|
||||||
` |> angledLineOfYLength({`,
|
` |> angledLineOfYLength({`,
|
||||||
` angle: 104,`,
|
` angle: 104,`,
|
||||||
` length: 1.58,`,
|
` length: 1.58,`,
|
||||||
` tag: 'abc5'`,
|
` tag: 'abc5'`,
|
||||||
`}, %)`,
|
` }, %)`,
|
||||||
` |> angledLineToX({ angle: 55, to: -2.89, tag: 'abc6' }, %)`,
|
` |> angledLineToX({ angle: 55, to: -2.89, tag: 'abc6' }, %)`,
|
||||||
` |> angledLineToY({ angle: 330, to: 2.53, tag: 'abc7' }, %)`,
|
` |> angledLineToY({ angle: 330, to: 2.53, tag: 'abc7' }, %)`,
|
||||||
` |> xLine({ length: 1.47, tag: 'abc8' }, %)`,
|
` |> xLine({ length: 1.47, tag: 'abc8' }, %)`,
|
||||||
@ -137,10 +137,10 @@ describe('testing swaping out sketch calls with xLine/xLineTo', () => {
|
|||||||
inputCode: bigExample,
|
inputCode: bigExample,
|
||||||
callToSwap: [
|
callToSwap: [
|
||||||
`angledLine({`,
|
`angledLine({`,
|
||||||
` angle: 157,`,
|
` angle: 157,`,
|
||||||
` length: 1.69,`,
|
` length: 1.69,`,
|
||||||
` tag: 'abc3'`,
|
` tag: 'abc3'`,
|
||||||
`}, %)`,
|
` }, %)`,
|
||||||
].join('\n'),
|
].join('\n'),
|
||||||
constraintType: 'horizontal',
|
constraintType: 'horizontal',
|
||||||
})
|
})
|
||||||
@ -165,10 +165,10 @@ describe('testing swaping out sketch calls with xLine/xLineTo', () => {
|
|||||||
inputCode: bigExample,
|
inputCode: bigExample,
|
||||||
callToSwap: [
|
callToSwap: [
|
||||||
`angledLineOfXLength({`,
|
`angledLineOfXLength({`,
|
||||||
` angle: 217,`,
|
` angle: 217,`,
|
||||||
` length: 0.86,`,
|
` length: 0.86,`,
|
||||||
` tag: 'abc4'`,
|
` tag: 'abc4'`,
|
||||||
`}, %)`,
|
` }, %)`,
|
||||||
].join('\n'),
|
].join('\n'),
|
||||||
constraintType: 'horizontal',
|
constraintType: 'horizontal',
|
||||||
})
|
})
|
||||||
@ -194,10 +194,10 @@ describe('testing swaping out sketch calls with xLine/xLineTo', () => {
|
|||||||
inputCode: bigExample,
|
inputCode: bigExample,
|
||||||
callToSwap: [
|
callToSwap: [
|
||||||
`angledLineOfYLength({`,
|
`angledLineOfYLength({`,
|
||||||
` angle: 104,`,
|
` angle: 104,`,
|
||||||
` length: 1.58,`,
|
` length: 1.58,`,
|
||||||
` tag: 'abc5'`,
|
` tag: 'abc5'`,
|
||||||
`}, %)`,
|
` }, %)`,
|
||||||
].join('\n'),
|
].join('\n'),
|
||||||
constraintType: 'vertical',
|
constraintType: 'vertical',
|
||||||
})
|
})
|
||||||
|
@ -124,64 +124,64 @@ const myAng2 = 134
|
|||||||
const part001 = startSketchAt([0, 0])
|
const part001 = startSketchAt([0, 0])
|
||||||
|> line({ to: [1, 3.82], tag: 'seg01' }, %) // ln-should-get-tag
|
|> line({ to: [1, 3.82], tag: 'seg01' }, %) // ln-should-get-tag
|
||||||
|> angledLineToX([
|
|> angledLineToX([
|
||||||
-angleToMatchLengthX('seg01', myVar, %),
|
-angleToMatchLengthX('seg01', myVar, %),
|
||||||
myVar
|
myVar
|
||||||
], %) // ln-lineTo-xAbsolute should use angleToMatchLengthX helper
|
], %) // ln-lineTo-xAbsolute should use angleToMatchLengthX helper
|
||||||
|> angledLineToY([
|
|> angledLineToY([
|
||||||
-angleToMatchLengthY('seg01', myVar, %),
|
-angleToMatchLengthY('seg01', myVar, %),
|
||||||
myVar
|
myVar
|
||||||
], %) // ln-lineTo-yAbsolute should use angleToMatchLengthY helper
|
], %) // ln-lineTo-yAbsolute should use angleToMatchLengthY helper
|
||||||
|> angledLine([45, segLen('seg01', %)], %) // ln-lineTo-free should become angledLine
|
|> angledLine([45, segLen('seg01', %)], %) // ln-lineTo-free should become angledLine
|
||||||
|> angledLine([45, segLen('seg01', %)], %) // ln-angledLineToX-free should become angledLine
|
|> angledLine([45, segLen('seg01', %)], %) // ln-angledLineToX-free should become angledLine
|
||||||
|> angledLine([myAng, segLen('seg01', %)], %) // ln-angledLineToX-angle should become angledLine
|
|> angledLine([myAng, segLen('seg01', %)], %) // ln-angledLineToX-angle should become angledLine
|
||||||
|> angledLineToX([
|
|> angledLineToX([
|
||||||
angleToMatchLengthX('seg01', myVar2, %),
|
angleToMatchLengthX('seg01', myVar2, %),
|
||||||
myVar2
|
myVar2
|
||||||
], %) // ln-angledLineToX-xAbsolute should use angleToMatchLengthX to get angle
|
], %) // ln-angledLineToX-xAbsolute should use angleToMatchLengthX to get angle
|
||||||
|> angledLine([315, segLen('seg01', %)], %) // ln-angledLineToY-free should become angledLine
|
|> angledLine([315, segLen('seg01', %)], %) // ln-angledLineToY-free should become angledLine
|
||||||
|> angledLine([myAng2, segLen('seg01', %)], %) // ln-angledLineToY-angle should become angledLine
|
|> angledLine([myAng2, segLen('seg01', %)], %) // ln-angledLineToY-angle should become angledLine
|
||||||
|> angledLineToY([
|
|> angledLineToY([
|
||||||
angleToMatchLengthY('seg01', myVar3, %),
|
angleToMatchLengthY('seg01', myVar3, %),
|
||||||
myVar3
|
myVar3
|
||||||
], %) // ln-angledLineToY-yAbsolute should use angleToMatchLengthY to get angle
|
], %) // ln-angledLineToY-yAbsolute should use angleToMatchLengthY to get angle
|
||||||
|> line([
|
|> line([
|
||||||
min(segLen('seg01', %), myVar),
|
min(segLen('seg01', %), myVar),
|
||||||
legLen(segLen('seg01', %), myVar)
|
legLen(segLen('seg01', %), myVar)
|
||||||
], %) // ln-should use legLen for y
|
], %) // ln-should use legLen for y
|
||||||
|> line([
|
|> line([
|
||||||
min(segLen('seg01', %), myVar),
|
min(segLen('seg01', %), myVar),
|
||||||
-legLen(segLen('seg01', %), myVar)
|
-legLen(segLen('seg01', %), myVar)
|
||||||
], %) // ln-legLen but negative
|
], %) // ln-legLen but negative
|
||||||
|> angledLine([248, segLen('seg01', %)], %) // ln-should become angledLine
|
|> angledLine([248, segLen('seg01', %)], %) // ln-should become angledLine
|
||||||
|> angledLine([myVar, segLen('seg01', %)], %) // ln-use segLen for secound arg
|
|> angledLine([myVar, segLen('seg01', %)], %) // ln-use segLen for secound arg
|
||||||
|> angledLine([45, segLen('seg01', %)], %) // ln-segLen again
|
|> angledLine([45, segLen('seg01', %)], %) // ln-segLen again
|
||||||
|> angledLine([54, segLen('seg01', %)], %) // ln-should be transformed to angledLine
|
|> angledLine([54, segLen('seg01', %)], %) // ln-should be transformed to angledLine
|
||||||
|> angledLineOfXLength([
|
|> angledLineOfXLength([
|
||||||
legAngX(segLen('seg01', %), myVar),
|
legAngX(segLen('seg01', %), myVar),
|
||||||
min(segLen('seg01', %), myVar)
|
min(segLen('seg01', %), myVar)
|
||||||
], %) // ln-should use legAngX to calculate angle
|
], %) // ln-should use legAngX to calculate angle
|
||||||
|> angledLineOfXLength([
|
|> angledLineOfXLength([
|
||||||
180 + legAngX(segLen('seg01', %), myVar),
|
180 + legAngX(segLen('seg01', %), myVar),
|
||||||
min(segLen('seg01', %), myVar)
|
min(segLen('seg01', %), myVar)
|
||||||
], %) // ln-same as above but should have + 180 to match original quadrant
|
], %) // ln-same as above but should have + 180 to match original quadrant
|
||||||
|> line([
|
|> line([
|
||||||
legLen(segLen('seg01', %), myVar),
|
legLen(segLen('seg01', %), myVar),
|
||||||
min(segLen('seg01', %), myVar)
|
min(segLen('seg01', %), myVar)
|
||||||
], %) // ln-legLen again but yRelative
|
], %) // ln-legLen again but yRelative
|
||||||
|> line([
|
|> line([
|
||||||
-legLen(segLen('seg01', %), myVar),
|
-legLen(segLen('seg01', %), myVar),
|
||||||
min(segLen('seg01', %), myVar)
|
min(segLen('seg01', %), myVar)
|
||||||
], %) // ln-negative legLen yRelative
|
], %) // ln-negative legLen yRelative
|
||||||
|> angledLine([58, segLen('seg01', %)], %) // ln-angledLineOfYLength-free should become angledLine
|
|> angledLine([58, segLen('seg01', %)], %) // ln-angledLineOfYLength-free should become angledLine
|
||||||
|> angledLine([myAng, segLen('seg01', %)], %) // ln-angledLineOfYLength-angle should become angledLine
|
|> angledLine([myAng, segLen('seg01', %)], %) // ln-angledLineOfYLength-angle should become angledLine
|
||||||
|> angledLineOfXLength([
|
|> angledLineOfXLength([
|
||||||
legAngY(segLen('seg01', %), myVar),
|
legAngY(segLen('seg01', %), myVar),
|
||||||
min(segLen('seg01', %), myVar)
|
min(segLen('seg01', %), myVar)
|
||||||
], %) // ln-angledLineOfYLength-yRelative use legAngY
|
], %) // ln-angledLineOfYLength-yRelative use legAngY
|
||||||
|> angledLineOfXLength([
|
|> angledLineOfXLength([
|
||||||
270 + legAngY(segLen('seg01', %), myVar),
|
270 + legAngY(segLen('seg01', %), myVar),
|
||||||
min(segLen('seg01', %), myVar)
|
min(segLen('seg01', %), myVar)
|
||||||
], %) // ln-angledLineOfYLength-yRelative with angle > 90 use binExp
|
], %) // ln-angledLineOfYLength-yRelative with angle > 90 use binExp
|
||||||
|> xLine(segLen('seg01', %), %) // ln-xLine-free should sub in segLen
|
|> xLine(segLen('seg01', %), %) // ln-xLine-free should sub in segLen
|
||||||
|> yLine(segLen('seg01', %), %) // ln-yLine-free should sub in segLen
|
|> yLine(segLen('seg01', %), %) // ln-yLine-free should sub in segLen
|
||||||
|> xLine(segLen('seg01', %), %) // ln-xLineTo-free should convert to xLine
|
|> xLine(segLen('seg01', %), %) // ln-xLineTo-free should convert to xLine
|
||||||
@ -380,9 +380,9 @@ show(part001)`
|
|||||||
'setVertDistance'
|
'setVertDistance'
|
||||||
)
|
)
|
||||||
expect(expectedCode).toContain(`|> lineTo([
|
expect(expectedCode).toContain(`|> lineTo([
|
||||||
lastSegX(%) + myVar,
|
lastSegX(%) + myVar,
|
||||||
segEndY('seg01', %) + 2.93
|
segEndY('seg01', %) + 2.93
|
||||||
], %) // xRelative`)
|
], %) // xRelative`)
|
||||||
})
|
})
|
||||||
it('testing for yRelative to horizontal distance', () => {
|
it('testing for yRelative to horizontal distance', () => {
|
||||||
const expectedCode = helperThing(
|
const expectedCode = helperThing(
|
||||||
@ -391,9 +391,9 @@ show(part001)`
|
|||||||
'setHorzDistance'
|
'setHorzDistance'
|
||||||
)
|
)
|
||||||
expect(expectedCode).toContain(`|> lineTo([
|
expect(expectedCode).toContain(`|> lineTo([
|
||||||
segEndX('seg01', %) + 2.6,
|
segEndX('seg01', %) + 2.6,
|
||||||
lastSegY(%) + myVar
|
lastSegY(%) + myVar
|
||||||
], %) // yRelative`)
|
], %) // yRelative`)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
Reference in New Issue
Block a user