Compare commits
6 Commits
v1.0.1
...
achalmers/
Author | SHA1 | Date | |
---|---|---|---|
dec538590a | |||
9523eef52c | |||
20ae39dec3 | |||
8ebba16796 | |||
038de47e5d | |||
61563bee97 |
@ -20,7 +20,7 @@ describe('testing AST', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 0,
|
start: 0,
|
||||||
end: 1,
|
end: 1,
|
||||||
value: 5,
|
value: { type: 'i_integer', data: 5 },
|
||||||
raw: '5',
|
raw: '5',
|
||||||
},
|
},
|
||||||
operator: '+',
|
operator: '+',
|
||||||
@ -28,7 +28,7 @@ describe('testing AST', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 3,
|
start: 3,
|
||||||
end: 4,
|
end: 4,
|
||||||
value: 6,
|
value: { type: 'i_integer', data: 6 },
|
||||||
raw: '6',
|
raw: '6',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -58,7 +58,7 @@ describe('testing AST', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 14,
|
start: 14,
|
||||||
end: 15,
|
end: 15,
|
||||||
value: 5,
|
value: { type: 'i_integer', data: 5 },
|
||||||
raw: '5',
|
raw: '5',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -92,7 +92,7 @@ const newVar = myVar + 1
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 14,
|
start: 14,
|
||||||
end: 15,
|
end: 15,
|
||||||
value: 5,
|
value: { type: 'i_integer', data: 5 },
|
||||||
raw: '5',
|
raw: '5',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -129,7 +129,7 @@ const newVar = myVar + 1
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 39,
|
start: 39,
|
||||||
end: 40,
|
end: 40,
|
||||||
value: 1,
|
value: { type: 'i_integer', data: 1 },
|
||||||
raw: '1',
|
raw: '1',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -320,14 +320,14 @@ const myVar = funcN(1, 2)`
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 58,
|
start: 58,
|
||||||
end: 59,
|
end: 59,
|
||||||
value: 1,
|
value: { data: 1, type: 'i_integer' },
|
||||||
raw: '1',
|
raw: '1',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 61,
|
start: 61,
|
||||||
end: 62,
|
end: 62,
|
||||||
value: 2,
|
value: { data: 2, type: 'i_integer' },
|
||||||
raw: '2',
|
raw: '2',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@ -390,14 +390,14 @@ describe('testing pipe operator special', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 32,
|
start: 32,
|
||||||
end: 33,
|
end: 33,
|
||||||
value: 0,
|
value: { type: 'i_integer', data: 0 },
|
||||||
raw: '0',
|
raw: '0',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 35,
|
start: 35,
|
||||||
end: 36,
|
end: 36,
|
||||||
value: 0,
|
value: { type: 'i_integer', data: 0 },
|
||||||
raw: '0',
|
raw: '0',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@ -426,14 +426,14 @@ describe('testing pipe operator special', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 52,
|
start: 52,
|
||||||
end: 53,
|
end: 53,
|
||||||
value: 2,
|
value: { type: 'i_integer', data: 2 },
|
||||||
raw: '2',
|
raw: '2',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 55,
|
start: 55,
|
||||||
end: 56,
|
end: 56,
|
||||||
value: 3,
|
value: { type: 'i_integer', data: 3 },
|
||||||
raw: '3',
|
raw: '3',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@ -478,14 +478,14 @@ describe('testing pipe operator special', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 81,
|
start: 81,
|
||||||
end: 82,
|
end: 82,
|
||||||
value: 0,
|
value: { type: 'i_integer', data: 0 },
|
||||||
raw: '0',
|
raw: '0',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 84,
|
start: 84,
|
||||||
end: 85,
|
end: 85,
|
||||||
value: 1,
|
value: { type: 'i_integer', data: 1 },
|
||||||
raw: '1',
|
raw: '1',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@ -505,7 +505,7 @@ describe('testing pipe operator special', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 93,
|
start: 93,
|
||||||
end: 101,
|
end: 101,
|
||||||
value: 'myPath',
|
value: { type: 'string', data: 'myPath' },
|
||||||
raw: '"myPath"',
|
raw: '"myPath"',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -536,14 +536,14 @@ describe('testing pipe operator special', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 121,
|
start: 121,
|
||||||
end: 122,
|
end: 122,
|
||||||
value: 1,
|
value: { type: 'i_integer', data: 1 },
|
||||||
raw: '1',
|
raw: '1',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 124,
|
start: 124,
|
||||||
end: 125,
|
end: 125,
|
||||||
value: 1,
|
value: { type: 'i_integer', data: 1 },
|
||||||
raw: '1',
|
raw: '1',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@ -568,7 +568,7 @@ describe('testing pipe operator special', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 139,
|
start: 139,
|
||||||
end: 141,
|
end: 141,
|
||||||
value: 45,
|
value: { type: 'i_integer', data: 45 },
|
||||||
raw: '45',
|
raw: '45',
|
||||||
},
|
},
|
||||||
{ type: 'PipeSubstitution', start: 143, end: 144 },
|
{ type: 'PipeSubstitution', start: 143, end: 144 },
|
||||||
@ -619,7 +619,7 @@ describe('testing pipe operator special', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 14,
|
start: 14,
|
||||||
end: 15,
|
end: 15,
|
||||||
value: 5,
|
value: { type: 'i_integer', data: 5 },
|
||||||
raw: '5',
|
raw: '5',
|
||||||
},
|
},
|
||||||
operator: '+',
|
operator: '+',
|
||||||
@ -627,7 +627,7 @@ describe('testing pipe operator special', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 18,
|
start: 18,
|
||||||
end: 19,
|
end: 19,
|
||||||
value: 6,
|
value: { type: 'i_integer', data: 6 },
|
||||||
raw: '6',
|
raw: '6',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -646,7 +646,7 @@ describe('testing pipe operator special', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 30,
|
start: 30,
|
||||||
end: 32,
|
end: 32,
|
||||||
value: 45,
|
value: { type: 'i_integer', data: 45 },
|
||||||
raw: '45',
|
raw: '45',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -696,14 +696,14 @@ describe('testing pipe operator special', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 12,
|
start: 12,
|
||||||
end: 13,
|
end: 13,
|
||||||
value: 1,
|
value: { type: 'i_integer', data: 1 },
|
||||||
raw: '1',
|
raw: '1',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 15,
|
start: 15,
|
||||||
end: 18,
|
end: 18,
|
||||||
value: '2',
|
value: { type: 'string', data: '2' },
|
||||||
raw: "'2'",
|
raw: "'2'",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -720,7 +720,7 @@ describe('testing pipe operator special', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 27,
|
start: 27,
|
||||||
end: 28,
|
end: 28,
|
||||||
value: 4,
|
value: { type: 'i_integer', data: 4 },
|
||||||
raw: '4',
|
raw: '4',
|
||||||
},
|
},
|
||||||
operator: '+',
|
operator: '+',
|
||||||
@ -728,7 +728,7 @@ describe('testing pipe operator special', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 31,
|
start: 31,
|
||||||
end: 32,
|
end: 32,
|
||||||
value: 5,
|
value: { type: 'i_integer', data: 5 },
|
||||||
raw: '5',
|
raw: '5',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -766,7 +766,7 @@ describe('testing pipe operator special', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 14,
|
start: 14,
|
||||||
end: 15,
|
end: 15,
|
||||||
value: 3,
|
value: { type: 'i_integer', data: 3 },
|
||||||
raw: '3',
|
raw: '3',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -807,7 +807,7 @@ describe('testing pipe operator special', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 34,
|
start: 34,
|
||||||
end: 39,
|
end: 39,
|
||||||
value: 'str',
|
value: { type: 'string', data: 'str' },
|
||||||
raw: "'str'",
|
raw: "'str'",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -825,7 +825,7 @@ describe('testing pipe operator special', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 47,
|
start: 47,
|
||||||
end: 48,
|
end: 48,
|
||||||
value: 2,
|
value: { type: 'i_integer', data: 2 },
|
||||||
raw: '2',
|
raw: '2',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -864,7 +864,7 @@ describe('testing pipe operator special', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 77,
|
start: 77,
|
||||||
end: 78,
|
end: 78,
|
||||||
value: 4,
|
value: { type: 'i_integer', data: 4 },
|
||||||
raw: '4',
|
raw: '4',
|
||||||
},
|
},
|
||||||
operator: '+',
|
operator: '+',
|
||||||
@ -872,7 +872,7 @@ describe('testing pipe operator special', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 81,
|
start: 81,
|
||||||
end: 82,
|
end: 82,
|
||||||
value: 5,
|
value: { type: 'i_integer', data: 5 },
|
||||||
raw: '5',
|
raw: '5',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -940,7 +940,7 @@ describe('testing pipe operator special', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 27,
|
start: 27,
|
||||||
end: 34,
|
end: 34,
|
||||||
value: 'value',
|
value: { type: 'string', data: 'value' },
|
||||||
raw: "'value'",
|
raw: "'value'",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -998,14 +998,14 @@ describe('testing pipe operator special', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 18,
|
start: 18,
|
||||||
end: 19,
|
end: 19,
|
||||||
value: 1,
|
value: { type: 'i_integer', data: 1 },
|
||||||
raw: '1',
|
raw: '1',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 21,
|
start: 21,
|
||||||
end: 24,
|
end: 24,
|
||||||
value: '2',
|
value: { type: 'string', data: '2' },
|
||||||
raw: "'2'",
|
raw: "'2'",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@ -1120,7 +1120,7 @@ describe('testing pipe operator special', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 20,
|
start: 20,
|
||||||
end: 25,
|
end: 25,
|
||||||
value: 'two',
|
value: { type: 'string', data: 'two' },
|
||||||
raw: '"two"',
|
raw: '"two"',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -1169,7 +1169,7 @@ describe('testing pipe operator special', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 16,
|
start: 16,
|
||||||
end: 21,
|
end: 21,
|
||||||
value: 'one',
|
value: { type: 'string', data: 'one' },
|
||||||
raw: '"one"',
|
raw: '"one"',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -1215,7 +1215,7 @@ describe('nests binary expressions correctly', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 11,
|
start: 11,
|
||||||
end: 12,
|
end: 12,
|
||||||
value: 1,
|
value: { type: 'i_integer', data: 1 },
|
||||||
raw: '1',
|
raw: '1',
|
||||||
},
|
},
|
||||||
operator: '+',
|
operator: '+',
|
||||||
@ -1223,7 +1223,7 @@ describe('nests binary expressions correctly', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 15,
|
start: 15,
|
||||||
end: 16,
|
end: 16,
|
||||||
value: 2,
|
value: { type: 'i_integer', data: 2 },
|
||||||
raw: '2',
|
raw: '2',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -1263,7 +1263,7 @@ describe('nests binary expressions correctly', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 11,
|
start: 11,
|
||||||
end: 12,
|
end: 12,
|
||||||
value: 1,
|
value: { type: 'i_integer', data: 1 },
|
||||||
raw: '1',
|
raw: '1',
|
||||||
},
|
},
|
||||||
operator: '*',
|
operator: '*',
|
||||||
@ -1271,7 +1271,7 @@ describe('nests binary expressions correctly', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 15,
|
start: 15,
|
||||||
end: 16,
|
end: 16,
|
||||||
value: 2,
|
value: { type: 'i_integer', data: 2 },
|
||||||
raw: '2',
|
raw: '2',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -1280,7 +1280,7 @@ describe('nests binary expressions correctly', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 19,
|
start: 19,
|
||||||
end: 20,
|
end: 20,
|
||||||
value: 3,
|
value: { type: 'i_integer', data: 3 },
|
||||||
raw: '3',
|
raw: '3',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -1316,7 +1316,7 @@ describe('nests binary expressions correctly', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 11,
|
start: 11,
|
||||||
end: 12,
|
end: 12,
|
||||||
value: 1,
|
value: { type: 'i_integer', data: 1 },
|
||||||
raw: '1',
|
raw: '1',
|
||||||
},
|
},
|
||||||
operator: '+',
|
operator: '+',
|
||||||
@ -1328,7 +1328,7 @@ describe('nests binary expressions correctly', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 15,
|
start: 15,
|
||||||
end: 16,
|
end: 16,
|
||||||
value: 2,
|
value: { type: 'i_integer', data: 2 },
|
||||||
raw: '2',
|
raw: '2',
|
||||||
},
|
},
|
||||||
operator: '*',
|
operator: '*',
|
||||||
@ -1336,7 +1336,7 @@ describe('nests binary expressions correctly', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 19,
|
start: 19,
|
||||||
end: 20,
|
end: 20,
|
||||||
value: 3,
|
value: { type: 'i_integer', data: 3 },
|
||||||
raw: '3',
|
raw: '3',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -1360,7 +1360,7 @@ describe('nests binary expressions correctly', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 11,
|
start: 11,
|
||||||
end: 12,
|
end: 12,
|
||||||
value: 1,
|
value: { type: 'i_integer', data: 1 },
|
||||||
raw: '1',
|
raw: '1',
|
||||||
},
|
},
|
||||||
operator: '+',
|
operator: '+',
|
||||||
@ -1368,7 +1368,7 @@ describe('nests binary expressions correctly', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 15,
|
start: 15,
|
||||||
end: 16,
|
end: 16,
|
||||||
value: 2,
|
value: { type: 'i_integer', data: 2 },
|
||||||
raw: '2',
|
raw: '2',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -1377,7 +1377,7 @@ describe('nests binary expressions correctly', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 19,
|
start: 19,
|
||||||
end: 20,
|
end: 20,
|
||||||
value: 3,
|
value: { type: 'i_integer', data: 3 },
|
||||||
raw: '3',
|
raw: '3',
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
@ -1397,7 +1397,7 @@ describe('nests binary expressions correctly', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 11,
|
start: 11,
|
||||||
end: 12,
|
end: 12,
|
||||||
value: 1,
|
value: { type: 'i_integer', data: 1 },
|
||||||
raw: '1',
|
raw: '1',
|
||||||
},
|
},
|
||||||
operator: '*',
|
operator: '*',
|
||||||
@ -1405,7 +1405,7 @@ describe('nests binary expressions correctly', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 15,
|
start: 15,
|
||||||
end: 16,
|
end: 16,
|
||||||
value: 2,
|
value: { type: 'i_integer', data: 2 },
|
||||||
raw: '2',
|
raw: '2',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -1414,7 +1414,7 @@ describe('nests binary expressions correctly', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 19,
|
start: 19,
|
||||||
end: 20,
|
end: 20,
|
||||||
value: 3,
|
value: { type: 'i_integer', data: 3 },
|
||||||
raw: '3',
|
raw: '3',
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
@ -1433,7 +1433,13 @@ describe('nests binary expressions correctly', () => {
|
|||||||
operator: '+',
|
operator: '+',
|
||||||
start: 11,
|
start: 11,
|
||||||
end: 30,
|
end: 30,
|
||||||
left: { type: 'Literal', value: 1, raw: '1', start: 11, end: 12 },
|
left: {
|
||||||
|
type: 'Literal',
|
||||||
|
value: { type: 'i_integer', data: 1 },
|
||||||
|
raw: '1',
|
||||||
|
start: 11,
|
||||||
|
end: 12,
|
||||||
|
},
|
||||||
right: {
|
right: {
|
||||||
type: 'BinaryExpression',
|
type: 'BinaryExpression',
|
||||||
operator: '/',
|
operator: '/',
|
||||||
@ -1444,26 +1450,50 @@ describe('nests binary expressions correctly', () => {
|
|||||||
operator: '*',
|
operator: '*',
|
||||||
start: 15,
|
start: 15,
|
||||||
end: 25,
|
end: 25,
|
||||||
left: { type: 'Literal', value: 2, raw: '2', start: 15, end: 16 },
|
left: {
|
||||||
|
type: 'Literal',
|
||||||
|
value: { type: 'i_integer', data: 2 },
|
||||||
|
raw: '2',
|
||||||
|
start: 15,
|
||||||
|
end: 16,
|
||||||
|
},
|
||||||
right: {
|
right: {
|
||||||
type: 'BinaryExpression',
|
type: 'BinaryExpression',
|
||||||
operator: '-',
|
operator: '-',
|
||||||
start: 20,
|
start: 20,
|
||||||
end: 25,
|
end: 25,
|
||||||
left: { type: 'Literal', value: 3, raw: '3', start: 20, end: 21 },
|
left: {
|
||||||
|
type: 'Literal',
|
||||||
|
value: { type: 'i_integer', data: 3 },
|
||||||
|
raw: '3',
|
||||||
|
start: 20,
|
||||||
|
end: 21,
|
||||||
|
},
|
||||||
right: {
|
right: {
|
||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
value: 4,
|
value: { type: 'i_integer', data: 4 },
|
||||||
raw: '4',
|
raw: '4',
|
||||||
start: 24,
|
start: 24,
|
||||||
end: 25,
|
end: 25,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
right: { type: 'Literal', value: 5, raw: '5', start: 29, end: 30 },
|
right: {
|
||||||
|
type: 'Literal',
|
||||||
|
value: { type: 'i_integer', data: 5 },
|
||||||
|
raw: '5',
|
||||||
|
start: 29,
|
||||||
|
end: 30,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
right: { type: 'Literal', value: 6, raw: '6', start: 33, end: 34 },
|
right: {
|
||||||
|
type: 'Literal',
|
||||||
|
value: { type: 'i_integer', data: 6 },
|
||||||
|
raw: '6',
|
||||||
|
start: 33,
|
||||||
|
end: 34,
|
||||||
|
},
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@ -1481,7 +1511,7 @@ const key = 'c'`
|
|||||||
value: {
|
value: {
|
||||||
type: 'blockComment',
|
type: 'blockComment',
|
||||||
style: 'line',
|
style: 'line',
|
||||||
value: 'this is a comment',
|
value: { type: 'string', data: 'this is a comment' },
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
const { nonCodeMeta } = parse(code)
|
const { nonCodeMeta } = parse(code)
|
||||||
@ -1564,8 +1594,20 @@ describe('test UnaryExpression', () => {
|
|||||||
end: 26,
|
end: 26,
|
||||||
callee: { type: 'Identifier', start: 15, end: 18, name: 'min' },
|
callee: { type: 'Identifier', start: 15, end: 18, name: 'min' },
|
||||||
arguments: [
|
arguments: [
|
||||||
{ type: 'Literal', start: 19, end: 20, value: 4, raw: '4' },
|
{
|
||||||
{ type: 'Literal', start: 22, end: 25, value: 100, raw: '100' },
|
type: 'Literal',
|
||||||
|
start: 19,
|
||||||
|
end: 20,
|
||||||
|
value: { type: 'i_integer', data: 4 },
|
||||||
|
raw: '4',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'Literal',
|
||||||
|
start: 22,
|
||||||
|
end: 25,
|
||||||
|
value: { type: 'i_integer', data: 100 },
|
||||||
|
raw: '100',
|
||||||
|
},
|
||||||
],
|
],
|
||||||
function: expect.any(Object),
|
function: expect.any(Object),
|
||||||
optional: false,
|
optional: false,
|
||||||
@ -1585,21 +1627,45 @@ describe('testing nested call expressions', () => {
|
|||||||
end: 40,
|
end: 40,
|
||||||
callee: { type: 'Identifier', start: 14, end: 17, name: 'min' },
|
callee: { type: 'Identifier', start: 14, end: 17, name: 'min' },
|
||||||
arguments: [
|
arguments: [
|
||||||
{ type: 'Literal', start: 18, end: 21, value: 100, raw: '100' },
|
{
|
||||||
|
type: 'Literal',
|
||||||
|
start: 18,
|
||||||
|
end: 21,
|
||||||
|
value: { type: 'i_integer', data: 100 },
|
||||||
|
raw: '100',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
type: 'BinaryExpression',
|
type: 'BinaryExpression',
|
||||||
operator: '+',
|
operator: '+',
|
||||||
start: 23,
|
start: 23,
|
||||||
end: 39,
|
end: 39,
|
||||||
left: { type: 'Literal', value: 1, raw: '1', start: 23, end: 24 },
|
left: {
|
||||||
|
type: 'Literal',
|
||||||
|
value: { type: 'i_integer', data: 1 },
|
||||||
|
raw: '1',
|
||||||
|
start: 23,
|
||||||
|
end: 24,
|
||||||
|
},
|
||||||
right: {
|
right: {
|
||||||
type: 'CallExpression',
|
type: 'CallExpression',
|
||||||
start: 27,
|
start: 27,
|
||||||
end: 39,
|
end: 39,
|
||||||
callee: { type: 'Identifier', start: 27, end: 33, name: 'legLen' },
|
callee: { type: 'Identifier', start: 27, end: 33, name: 'legLen' },
|
||||||
arguments: [
|
arguments: [
|
||||||
{ type: 'Literal', start: 34, end: 35, value: 5, raw: '5' },
|
{
|
||||||
{ type: 'Literal', start: 37, end: 38, value: 3, raw: '3' },
|
type: 'Literal',
|
||||||
|
start: 34,
|
||||||
|
end: 35,
|
||||||
|
value: { type: 'i_integer', data: 5 },
|
||||||
|
raw: '5',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'Literal',
|
||||||
|
start: 37,
|
||||||
|
end: 38,
|
||||||
|
value: { type: 'i_integer', data: 3 },
|
||||||
|
raw: '3',
|
||||||
|
},
|
||||||
],
|
],
|
||||||
function: expect.any(Object),
|
function: expect.any(Object),
|
||||||
optional: false,
|
optional: false,
|
||||||
@ -1633,7 +1699,7 @@ describe('should recognise callExpresions in binaryExpressions', () => {
|
|||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 16,
|
start: 16,
|
||||||
end: 23,
|
end: 23,
|
||||||
value: 'seg02',
|
value: { type: 'string', data: 'seg02' },
|
||||||
raw: "'seg02'",
|
raw: "'seg02'",
|
||||||
},
|
},
|
||||||
{ type: 'PipeSubstitution', start: 25, end: 26 },
|
{ type: 'PipeSubstitution', start: 25, end: 26 },
|
||||||
@ -1641,7 +1707,13 @@ describe('should recognise callExpresions in binaryExpressions', () => {
|
|||||||
function: expect.any(Object),
|
function: expect.any(Object),
|
||||||
optional: false,
|
optional: false,
|
||||||
},
|
},
|
||||||
right: { type: 'Literal', value: 1, raw: '1', start: 30, end: 31 },
|
right: {
|
||||||
|
type: 'Literal',
|
||||||
|
value: { type: 'i_integer', data: 1 },
|
||||||
|
raw: '1',
|
||||||
|
start: 30,
|
||||||
|
end: 31,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{ type: 'PipeSubstitution', start: 33, end: 34 },
|
{ type: 'PipeSubstitution', start: 33, end: 34 },
|
||||||
])
|
])
|
||||||
|
@ -21,7 +21,7 @@ describe('Testing createLiteral', () => {
|
|||||||
it('should create a literal', () => {
|
it('should create a literal', () => {
|
||||||
const result = createLiteral(5)
|
const result = createLiteral(5)
|
||||||
expect(result.type).toBe('Literal')
|
expect(result.type).toBe('Literal')
|
||||||
expect(result.value).toBe(5)
|
expect(result.value.data).toBe(5)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
describe('Testing createIdentifier', () => {
|
describe('Testing createIdentifier', () => {
|
||||||
@ -38,7 +38,7 @@ describe('Testing createCallExpression', () => {
|
|||||||
expect(result.callee.type).toBe('Identifier')
|
expect(result.callee.type).toBe('Identifier')
|
||||||
expect(result.callee.name).toBe('myFunc')
|
expect(result.callee.name).toBe('myFunc')
|
||||||
expect(result.arguments[0].type).toBe('Literal')
|
expect(result.arguments[0].type).toBe('Literal')
|
||||||
expect((result.arguments[0] as any).value).toBe(5)
|
expect((result.arguments[0] as any).value.data).toBe(5)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
describe('Testing createObjectExpression', () => {
|
describe('Testing createObjectExpression', () => {
|
||||||
@ -50,7 +50,7 @@ describe('Testing createObjectExpression', () => {
|
|||||||
expect(result.properties[0].type).toBe('ObjectProperty')
|
expect(result.properties[0].type).toBe('ObjectProperty')
|
||||||
expect(result.properties[0].key.name).toBe('myProp')
|
expect(result.properties[0].key.name).toBe('myProp')
|
||||||
expect(result.properties[0].value.type).toBe('Literal')
|
expect(result.properties[0].value.type).toBe('Literal')
|
||||||
expect((result.properties[0].value as any).value).toBe(5)
|
expect((result.properties[0].value as any).value.data).toBe(5)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
describe('Testing createArrayExpression', () => {
|
describe('Testing createArrayExpression', () => {
|
||||||
@ -58,7 +58,7 @@ describe('Testing createArrayExpression', () => {
|
|||||||
const result = createArrayExpression([createLiteral(5)])
|
const result = createArrayExpression([createLiteral(5)])
|
||||||
expect(result.type).toBe('ArrayExpression')
|
expect(result.type).toBe('ArrayExpression')
|
||||||
expect(result.elements[0].type).toBe('Literal')
|
expect(result.elements[0].type).toBe('Literal')
|
||||||
expect((result.elements[0] as any).value).toBe(5)
|
expect((result.elements[0] as any).value.data).toBe(5)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
describe('Testing createPipeSubstitution', () => {
|
describe('Testing createPipeSubstitution', () => {
|
||||||
@ -75,7 +75,7 @@ describe('Testing createVariableDeclaration', () => {
|
|||||||
expect(result.declarations[0].id.type).toBe('Identifier')
|
expect(result.declarations[0].id.type).toBe('Identifier')
|
||||||
expect(result.declarations[0].id.name).toBe('myVar')
|
expect(result.declarations[0].id.name).toBe('myVar')
|
||||||
expect(result.declarations[0].init.type).toBe('Literal')
|
expect(result.declarations[0].init.type).toBe('Literal')
|
||||||
expect((result.declarations[0].init as any).value).toBe(5)
|
expect((result.declarations[0].init as any).value.data).toBe(5)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
describe('Testing createPipeExpression', () => {
|
describe('Testing createPipeExpression', () => {
|
||||||
@ -83,7 +83,7 @@ describe('Testing createPipeExpression', () => {
|
|||||||
const result = createPipeExpression([createLiteral(5)])
|
const result = createPipeExpression([createLiteral(5)])
|
||||||
expect(result.type).toBe('PipeExpression')
|
expect(result.type).toBe('PipeExpression')
|
||||||
expect(result.body[0].type).toBe('Literal')
|
expect(result.body[0].type).toBe('Literal')
|
||||||
expect((result.body[0] as any).value).toBe(5)
|
expect((result.body[0] as any).value.data).toBe(5)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -440,11 +440,15 @@ export function splitPathAtPipeExpression(pathToNode: PathToNode): {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function createLiteral(value: string | number): Literal {
|
export function createLiteral(value: string | number): Literal {
|
||||||
|
const literalValue =
|
||||||
|
typeof value === 'string'
|
||||||
|
? ({ type: 'string', data: value } as const)
|
||||||
|
: ({ type: 'fractional', data: value } as const)
|
||||||
return {
|
return {
|
||||||
type: 'Literal',
|
type: 'Literal',
|
||||||
start: 0,
|
start: 0,
|
||||||
end: 0,
|
end: 0,
|
||||||
value,
|
value: literalValue,
|
||||||
raw: `${value}`,
|
raw: `${value}`,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -641,7 +645,7 @@ export function giveSketchFnCallTag(
|
|||||||
const isTagExisting = !!firstArg.tag
|
const isTagExisting = !!firstArg.tag
|
||||||
const tagValue = (firstArg.tag ||
|
const tagValue = (firstArg.tag ||
|
||||||
createLiteral(tag || findUniqueName(ast, 'seg', 2))) as Literal
|
createLiteral(tag || findUniqueName(ast, 'seg', 2))) as Literal
|
||||||
const tagStr = String(tagValue.value)
|
const tagStr = String(tagValue.value.data)
|
||||||
const newFirstArg = createFirstArg(
|
const newFirstArg = createFirstArg(
|
||||||
primaryCallExp.callee.name as ToolTip,
|
primaryCallExp.callee.name as ToolTip,
|
||||||
firstArg.val,
|
firstArg.val,
|
||||||
|
@ -1426,7 +1426,7 @@ export function transformAstSketchLines({
|
|||||||
referenceSegName ||
|
referenceSegName ||
|
||||||
(_referencedSegmentNameVal &&
|
(_referencedSegmentNameVal &&
|
||||||
_referencedSegmentNameVal.type === 'Literal' &&
|
_referencedSegmentNameVal.type === 'Literal' &&
|
||||||
String(_referencedSegmentNameVal.value)) ||
|
String(_referencedSegmentNameVal.value.data)) ||
|
||||||
''
|
''
|
||||||
const [varValA, varValB] = Array.isArray(val) ? val : [val, val]
|
const [varValA, varValB] = Array.isArray(val) ? val : [val, val]
|
||||||
|
|
||||||
|
@ -7,14 +7,18 @@ use parse_display::{Display, FromStr};
|
|||||||
use schemars::JsonSchema;
|
use schemars::JsonSchema;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use serde_json::Map;
|
use serde_json::Map;
|
||||||
|
use serde_json::Value as JValue;
|
||||||
use tower_lsp::lsp_types::{CompletionItem, CompletionItemKind, DocumentSymbol, Range as LspRange, SymbolKind};
|
use tower_lsp::lsp_types::{CompletionItem, CompletionItemKind, DocumentSymbol, Range as LspRange, SymbolKind};
|
||||||
|
|
||||||
|
pub use self::literal_value::LiteralValue;
|
||||||
use crate::{
|
use crate::{
|
||||||
errors::{KclError, KclErrorDetails},
|
errors::{KclError, KclErrorDetails},
|
||||||
executor::{ExecutorContext, MemoryItem, Metadata, PipeInfo, ProgramMemory, SourceRange, UserVal},
|
executor::{ExecutorContext, MemoryItem, Metadata, PipeInfo, ProgramMemory, SourceRange, UserVal},
|
||||||
parser::PIPE_OPERATOR,
|
parser::PIPE_OPERATOR,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
mod literal_value;
|
||||||
|
|
||||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)]
|
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)]
|
||||||
#[ts(export)]
|
#[ts(export)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
@ -1312,24 +1316,18 @@ impl VariableDeclarator {
|
|||||||
pub struct Literal {
|
pub struct Literal {
|
||||||
pub start: usize,
|
pub start: usize,
|
||||||
pub end: usize,
|
pub end: usize,
|
||||||
pub value: serde_json::Value,
|
pub value: LiteralValue,
|
||||||
pub raw: String,
|
pub raw: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl_value_meta!(Literal);
|
impl_value_meta!(Literal);
|
||||||
|
|
||||||
impl From<Literal> for Value {
|
|
||||||
fn from(literal: Literal) -> Self {
|
|
||||||
Value::Literal(Box::new(literal))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Literal {
|
impl Literal {
|
||||||
pub fn new(value: serde_json::Value) -> Self {
|
pub fn new(value: LiteralValue) -> Self {
|
||||||
Self {
|
Self {
|
||||||
start: 0,
|
start: 0,
|
||||||
end: 0,
|
end: 0,
|
||||||
raw: value.to_string(),
|
raw: JValue::from(value.clone()).to_string(),
|
||||||
value,
|
value,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1343,11 +1341,19 @@ impl Literal {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn recast(&self) -> String {
|
fn recast(&self) -> String {
|
||||||
if let serde_json::Value::String(value) = &self.value {
|
match self.value {
|
||||||
let quote = if self.raw.trim().starts_with('"') { '"' } else { '\'' };
|
LiteralValue::Fractional(x) => {
|
||||||
format!("{}{}{}", quote, value, quote)
|
if x.fract() == 0.0 {
|
||||||
} else {
|
format!("{x:?}")
|
||||||
self.value.to_string()
|
} else {
|
||||||
|
self.raw.clone()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LiteralValue::IInteger(_) => self.raw.clone(),
|
||||||
|
LiteralValue::String(ref s) => {
|
||||||
|
let quote = if self.raw.trim().starts_with('"') { '"' } else { '\'' };
|
||||||
|
format!("{quote}{s}{quote}")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1355,7 +1361,7 @@ impl Literal {
|
|||||||
impl From<Literal> for MemoryItem {
|
impl From<Literal> for MemoryItem {
|
||||||
fn from(literal: Literal) -> Self {
|
fn from(literal: Literal) -> Self {
|
||||||
MemoryItem::UserVal(UserVal {
|
MemoryItem::UserVal(UserVal {
|
||||||
value: literal.value.clone(),
|
value: JValue::from(literal.value.clone()),
|
||||||
meta: vec![Metadata {
|
meta: vec![Metadata {
|
||||||
source_range: literal.into(),
|
source_range: literal.into(),
|
||||||
}],
|
}],
|
||||||
@ -1366,7 +1372,7 @@ impl From<Literal> for MemoryItem {
|
|||||||
impl From<&Box<Literal>> for MemoryItem {
|
impl From<&Box<Literal>> for MemoryItem {
|
||||||
fn from(literal: &Box<Literal>) -> Self {
|
fn from(literal: &Box<Literal>) -> Self {
|
||||||
MemoryItem::UserVal(UserVal {
|
MemoryItem::UserVal(UserVal {
|
||||||
value: literal.value.clone(),
|
value: JValue::from(literal.value.clone()),
|
||||||
meta: vec![Metadata {
|
meta: vec![Metadata {
|
||||||
source_range: literal.into(),
|
source_range: literal.into(),
|
||||||
}],
|
}],
|
||||||
@ -1967,17 +1973,21 @@ impl MemberExpression {
|
|||||||
LiteralIdentifier::Identifier(identifier) => identifier.name.to_string(),
|
LiteralIdentifier::Identifier(identifier) => identifier.name.to_string(),
|
||||||
LiteralIdentifier::Literal(literal) => {
|
LiteralIdentifier::Literal(literal) => {
|
||||||
let value = literal.value.clone();
|
let value = literal.value.clone();
|
||||||
// Parse this as a string.
|
match value {
|
||||||
if let serde_json::Value::String(string) = value {
|
LiteralValue::IInteger(x) if x >= 0 => return self.get_result_array(memory, x as usize),
|
||||||
string
|
LiteralValue::IInteger(x) => {
|
||||||
} else if let serde_json::Value::Number(_) = &value {
|
return Err(KclError::Syntax(KclErrorDetails {
|
||||||
// It can also be a number if we are getting a member of an array.
|
source_ranges: vec![self.into()],
|
||||||
return self.get_result_array(memory, parse_json_number_as_usize(&value, self.into())?);
|
message: format!("invalid index: {x}"),
|
||||||
} else {
|
}))
|
||||||
return Err(KclError::Semantic(KclErrorDetails {
|
}
|
||||||
message: format!("Expected string literal or number for property name, found {:?}", value),
|
LiteralValue::Fractional(x) => {
|
||||||
source_ranges: vec![literal.into()],
|
return Err(KclError::Syntax(KclErrorDetails {
|
||||||
}));
|
source_ranges: vec![self.into()],
|
||||||
|
message: format!("invalid index: {x}"),
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
LiteralValue::String(s) => s,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -2209,22 +2219,6 @@ pub fn parse_json_number_as_f64(j: &serde_json::Value, source_range: SourceRange
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn parse_json_number_as_usize(j: &serde_json::Value, source_range: SourceRange) -> Result<usize, KclError> {
|
|
||||||
if let serde_json::Value::Number(n) = &j {
|
|
||||||
Ok(n.as_i64().ok_or_else(|| {
|
|
||||||
KclError::Syntax(KclErrorDetails {
|
|
||||||
source_ranges: vec![source_range],
|
|
||||||
message: format!("Invalid index: {}", j),
|
|
||||||
})
|
|
||||||
})? as usize)
|
|
||||||
} else {
|
|
||||||
Err(KclError::Syntax(KclErrorDetails {
|
|
||||||
source_ranges: vec![source_range],
|
|
||||||
message: format!("Invalid index: {}", j),
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn parse_json_value_as_string(j: &serde_json::Value) -> Option<String> {
|
pub fn parse_json_value_as_string(j: &serde_json::Value) -> Option<String> {
|
||||||
if let serde_json::Value::String(n) = &j {
|
if let serde_json::Value::String(n) = &j {
|
||||||
Some(n.clone())
|
Some(n.clone())
|
||||||
@ -3289,4 +3283,40 @@ const thickness = sqrt(distance * p * FOS * 6 / (sigmaAllow * width))"#;
|
|||||||
let recasted = program.recast(&Default::default(), 0);
|
let recasted = program.recast(&Default::default(), 0);
|
||||||
assert_eq!(recasted.trim(), some_program_string);
|
assert_eq!(recasted.trim(), some_program_string);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn recast_literal() {
|
||||||
|
use winnow::Parser;
|
||||||
|
for (i, (raw, expected, reason)) in [
|
||||||
|
(
|
||||||
|
"5.0",
|
||||||
|
"5.0",
|
||||||
|
"fractional numbers should stay fractional, i.e. don't reformat this to '5'",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"5",
|
||||||
|
"5",
|
||||||
|
"integers should stay integral, i.e. don't reformat this to '5.0'",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"5.0000000",
|
||||||
|
"5.0",
|
||||||
|
"if the number is f64 but not fractional, use its canonical format",
|
||||||
|
),
|
||||||
|
("5.1", "5.1", "straightforward case works"),
|
||||||
|
]
|
||||||
|
.into_iter()
|
||||||
|
.enumerate()
|
||||||
|
{
|
||||||
|
let tokens = crate::token::lexer(raw);
|
||||||
|
let literal = crate::parser::parser_impl::unsigned_number_literal
|
||||||
|
.parse(&tokens)
|
||||||
|
.unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
literal.recast(),
|
||||||
|
expected,
|
||||||
|
"failed test {i}, which is testing that {reason}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
70
src/wasm-lib/kcl/src/ast/types/literal_value.rs
Normal file
70
src/wasm-lib/kcl/src/ast/types/literal_value.rs
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
use schemars::JsonSchema;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use serde_json::Value as JValue;
|
||||||
|
|
||||||
|
use super::{Literal, Value};
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)]
|
||||||
|
#[ts(export)]
|
||||||
|
#[serde(tag = "type", content = "data", rename_all = "snake_case")]
|
||||||
|
pub enum LiteralValue {
|
||||||
|
IInteger(i64),
|
||||||
|
Fractional(f64),
|
||||||
|
String(String),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<Literal> for Value {
|
||||||
|
fn from(literal: Literal) -> Self {
|
||||||
|
Value::Literal(Box::new(literal))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<LiteralValue> for JValue {
|
||||||
|
fn from(value: LiteralValue) -> Self {
|
||||||
|
match value {
|
||||||
|
LiteralValue::IInteger(x) => x.into(),
|
||||||
|
LiteralValue::Fractional(x) => x.into(),
|
||||||
|
LiteralValue::String(x) => x.into(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<f64> for LiteralValue {
|
||||||
|
fn from(value: f64) -> Self {
|
||||||
|
Self::Fractional(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<i64> for LiteralValue {
|
||||||
|
fn from(value: i64) -> Self {
|
||||||
|
Self::IInteger(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<String> for LiteralValue {
|
||||||
|
fn from(value: String) -> Self {
|
||||||
|
Self::String(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<u32> for LiteralValue {
|
||||||
|
fn from(value: u32) -> Self {
|
||||||
|
Self::IInteger(value as i64)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl From<u16> for LiteralValue {
|
||||||
|
fn from(value: u16) -> Self {
|
||||||
|
Self::IInteger(value as i64)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl From<u8> for LiteralValue {
|
||||||
|
fn from(value: u8) -> Self {
|
||||||
|
Self::IInteger(value as i64)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl From<&'static str> for LiteralValue {
|
||||||
|
fn from(value: &'static str) -> Self {
|
||||||
|
// TODO: Make this Cow<str>
|
||||||
|
Self::String(value.to_owned())
|
||||||
|
}
|
||||||
|
}
|
@ -1,7 +1,7 @@
|
|||||||
use crate::{ast::types::Program, errors::KclError, token::Token};
|
use crate::{ast::types::Program, errors::KclError, token::Token};
|
||||||
|
|
||||||
mod math;
|
mod math;
|
||||||
mod parser_impl;
|
pub(crate) mod parser_impl;
|
||||||
|
|
||||||
pub const PIPE_SUBSTITUTION_OPERATOR: &str = "%";
|
pub const PIPE_SUBSTITUTION_OPERATOR: &str = "%";
|
||||||
pub const PIPE_OPERATOR: &str = "|>";
|
pub const PIPE_OPERATOR: &str = "|>";
|
||||||
|
@ -94,7 +94,7 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn parse_and_evaluate() {
|
fn parse_and_evaluate() {
|
||||||
/// Make a literal
|
/// Make a literal
|
||||||
fn lit(n: u8) -> BinaryPart {
|
fn lit(n: i64) -> BinaryPart {
|
||||||
BinaryPart::Literal(Box::new(Literal {
|
BinaryPart::Literal(Box::new(Literal {
|
||||||
start: 0,
|
start: 0,
|
||||||
end: 0,
|
end: 0,
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
use serde_json::{Number as JNumber, Value as JValue};
|
|
||||||
use winnow::{
|
use winnow::{
|
||||||
combinator::{alt, delimited, opt, peek, preceded, repeat, separated0, terminated},
|
combinator::{alt, delimited, opt, peek, preceded, repeat, separated0, terminated},
|
||||||
dispatch,
|
dispatch,
|
||||||
@ -10,10 +9,10 @@ use winnow::{
|
|||||||
use crate::{
|
use crate::{
|
||||||
ast::types::{
|
ast::types::{
|
||||||
ArrayExpression, BinaryExpression, BinaryOperator, BinaryPart, BodyItem, CallExpression, CommentStyle,
|
ArrayExpression, BinaryExpression, BinaryOperator, BinaryPart, BodyItem, CallExpression, CommentStyle,
|
||||||
ExpressionStatement, FunctionExpression, Identifier, Literal, LiteralIdentifier, MemberExpression,
|
ExpressionStatement, FunctionExpression, Identifier, Literal, LiteralIdentifier, LiteralValue,
|
||||||
MemberObject, NonCodeMeta, NonCodeNode, NonCodeValue, ObjectExpression, ObjectProperty, PipeExpression,
|
MemberExpression, MemberObject, NonCodeMeta, NonCodeNode, NonCodeValue, ObjectExpression, ObjectProperty,
|
||||||
PipeSubstitution, Program, ReturnStatement, UnaryExpression, UnaryOperator, Value, VariableDeclaration,
|
PipeExpression, PipeSubstitution, Program, ReturnStatement, UnaryExpression, UnaryOperator, Value,
|
||||||
VariableDeclarator, VariableKind,
|
VariableDeclaration, VariableDeclarator, VariableKind,
|
||||||
},
|
},
|
||||||
errors::{KclError, KclErrorDetails},
|
errors::{KclError, KclErrorDetails},
|
||||||
executor::SourceRange,
|
executor::SourceRange,
|
||||||
@ -216,7 +215,7 @@ pub fn string_literal(i: TokenSlice) -> PResult<Literal> {
|
|||||||
.try_map(|token: Token| match token.token_type {
|
.try_map(|token: Token| match token.token_type {
|
||||||
TokenType::String => {
|
TokenType::String => {
|
||||||
let s = token.value[1..token.value.len() - 1].to_string();
|
let s = token.value[1..token.value.len() - 1].to_string();
|
||||||
Ok((JValue::String(s), token))
|
Ok((LiteralValue::from(s), token))
|
||||||
}
|
}
|
||||||
_ => Err(KclError::Syntax(KclErrorDetails {
|
_ => Err(KclError::Syntax(KclErrorDetails {
|
||||||
source_ranges: token.as_source_ranges(),
|
source_ranges: token.as_source_ranges(),
|
||||||
@ -234,12 +233,12 @@ pub fn string_literal(i: TokenSlice) -> PResult<Literal> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Parse a KCL literal number, with no - sign.
|
/// Parse a KCL literal number, with no - sign.
|
||||||
fn unsigned_number_literal(i: TokenSlice) -> PResult<Literal> {
|
pub(crate) fn unsigned_number_literal(i: TokenSlice) -> PResult<Literal> {
|
||||||
let (value, token) = any
|
let (value, token) = any
|
||||||
.try_map(|token: Token| match token.token_type {
|
.try_map(|token: Token| match token.token_type {
|
||||||
TokenType::Number => {
|
TokenType::Number => {
|
||||||
if let Ok(x) = token.value.parse::<i64>() {
|
if let Ok(x) = token.value.parse::<u64>() {
|
||||||
return Ok((JValue::Number(JNumber::from(x)), token));
|
return Ok((LiteralValue::IInteger(x as i64), token));
|
||||||
}
|
}
|
||||||
let x: f64 = token.value.parse().map_err(|_| {
|
let x: f64 = token.value.parse().map_err(|_| {
|
||||||
KclError::Syntax(KclErrorDetails {
|
KclError::Syntax(KclErrorDetails {
|
||||||
@ -248,13 +247,7 @@ fn unsigned_number_literal(i: TokenSlice) -> PResult<Literal> {
|
|||||||
})
|
})
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
match JNumber::from_f64(x) {
|
Ok((LiteralValue::Fractional(x), token))
|
||||||
Some(n) => Ok((JValue::Number(n), token)),
|
|
||||||
None => Err(KclError::Syntax(KclErrorDetails {
|
|
||||||
source_ranges: token.as_source_ranges(),
|
|
||||||
message: format!("Invalid float: {}", token.value),
|
|
||||||
})),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
_ => Err(KclError::Syntax(KclErrorDetails {
|
_ => Err(KclError::Syntax(KclErrorDetails {
|
||||||
source_ranges: token.as_source_ranges(),
|
source_ranges: token.as_source_ranges(),
|
||||||
@ -404,10 +397,11 @@ fn integer_range(i: TokenSlice) -> PResult<Vec<Value>> {
|
|||||||
let (_token1, ceiling) = integer.parse_next(i)?;
|
let (_token1, ceiling) = integer.parse_next(i)?;
|
||||||
Ok((floor..=ceiling)
|
Ok((floor..=ceiling)
|
||||||
.map(|num| {
|
.map(|num| {
|
||||||
|
let num = num as i64;
|
||||||
Value::Literal(Box::new(Literal {
|
Value::Literal(Box::new(Literal {
|
||||||
start: token0.start,
|
start: token0.start,
|
||||||
end: token0.end,
|
end: token0.end,
|
||||||
value: JValue::Number(num.into()),
|
value: num.into(),
|
||||||
raw: num.to_string(),
|
raw: num.to_string(),
|
||||||
}))
|
}))
|
||||||
})
|
})
|
||||||
@ -1459,7 +1453,7 @@ const mySk1 = startSketchAt([0, 0])"#;
|
|||||||
argument: Value::Literal(Box::new(Literal {
|
argument: Value::Literal(Box::new(Literal {
|
||||||
start: 32,
|
start: 32,
|
||||||
end: 33,
|
end: 33,
|
||||||
value: JValue::Number(JNumber::from(2)),
|
value: 2u32.into(),
|
||||||
raw: "2".to_owned(),
|
raw: "2".to_owned(),
|
||||||
})),
|
})),
|
||||||
})],
|
})],
|
||||||
@ -1614,7 +1608,7 @@ const mySk1 = startSketchAt([0, 0])"#;
|
|||||||
BinaryPart::Literal(Box::new(Literal {
|
BinaryPart::Literal(Box::new(Literal {
|
||||||
start: 9,
|
start: 9,
|
||||||
end: 10,
|
end: 10,
|
||||||
value: JValue::Number(JNumber::from(3)),
|
value: 3u32.into(),
|
||||||
raw: "3".to_owned(),
|
raw: "3".to_owned(),
|
||||||
}))
|
}))
|
||||||
);
|
);
|
||||||
@ -1774,11 +1768,11 @@ const mySk1 = startSketchAt([0, 0])"#;
|
|||||||
let BinaryPart::Literal(left) = actual.left else {
|
let BinaryPart::Literal(left) = actual.left else {
|
||||||
panic!("should be expression");
|
panic!("should be expression");
|
||||||
};
|
};
|
||||||
assert_eq!(left.value, serde_json::Value::Number(1.into()));
|
assert_eq!(left.value, 1u32.into());
|
||||||
let BinaryPart::Literal(right) = actual.right else {
|
let BinaryPart::Literal(right) = actual.right else {
|
||||||
panic!("should be expression");
|
panic!("should be expression");
|
||||||
};
|
};
|
||||||
assert_eq!(right.value, serde_json::Value::Number(2.into()));
|
assert_eq!(right.value, 2u32.into());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1957,12 +1951,10 @@ const mySk1 = startSketchAt([0, 0])"#;
|
|||||||
let parsed_literal = literal.parse(&tokens).unwrap();
|
let parsed_literal = literal.parse(&tokens).unwrap();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
parsed_literal.value,
|
parsed_literal.value,
|
||||||
JValue::String(
|
"
|
||||||
"
|
|
||||||
// a comment
|
// a comment
|
||||||
"
|
"
|
||||||
.to_owned()
|
.into()
|
||||||
)
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2067,13 +2059,13 @@ const mySk1 = startSketchAt([0, 0])"#;
|
|||||||
left: BinaryPart::Literal(Box::new(Literal {
|
left: BinaryPart::Literal(Box::new(Literal {
|
||||||
start: 0,
|
start: 0,
|
||||||
end: 1,
|
end: 1,
|
||||||
value: serde_json::Value::Number(serde_json::Number::from(5)),
|
value: 5u32.into(),
|
||||||
raw: "5".to_owned(),
|
raw: "5".to_owned(),
|
||||||
})),
|
})),
|
||||||
right: BinaryPart::Literal(Box::new(Literal {
|
right: BinaryPart::Literal(Box::new(Literal {
|
||||||
start: 4,
|
start: 4,
|
||||||
end: 7,
|
end: 7,
|
||||||
value: serde_json::Value::String("a".to_owned()),
|
value: "a".into(),
|
||||||
raw: r#""a""#.to_owned(),
|
raw: r#""a""#.to_owned(),
|
||||||
})),
|
})),
|
||||||
};
|
};
|
||||||
@ -2180,14 +2172,14 @@ const mySk1 = startSketchAt([0, 0])"#;
|
|||||||
left: BinaryPart::Literal(Box::new(Literal {
|
left: BinaryPart::Literal(Box::new(Literal {
|
||||||
start: 0,
|
start: 0,
|
||||||
end: 1,
|
end: 1,
|
||||||
value: serde_json::Value::Number(serde_json::Number::from(5)),
|
value: 5u32.into(),
|
||||||
raw: "5".to_string(),
|
raw: "5".to_string(),
|
||||||
})),
|
})),
|
||||||
operator: BinaryOperator::Add,
|
operator: BinaryOperator::Add,
|
||||||
right: BinaryPart::Literal(Box::new(Literal {
|
right: BinaryPart::Literal(Box::new(Literal {
|
||||||
start: 3,
|
start: 3,
|
||||||
end: 4,
|
end: 4,
|
||||||
value: serde_json::Value::Number(serde_json::Number::from(6)),
|
value: 6u32.into(),
|
||||||
raw: "6".to_string(),
|
raw: "6".to_string(),
|
||||||
})),
|
})),
|
||||||
})),
|
})),
|
||||||
@ -2466,67 +2458,67 @@ e
|
|||||||
Value::Literal(Box::new(Literal {
|
Value::Literal(Box::new(Literal {
|
||||||
start: 17,
|
start: 17,
|
||||||
end: 18,
|
end: 18,
|
||||||
value: 0.into(),
|
value: 0u32.into(),
|
||||||
raw: "0".to_string(),
|
raw: "0".to_string(),
|
||||||
})),
|
})),
|
||||||
Value::Literal(Box::new(Literal {
|
Value::Literal(Box::new(Literal {
|
||||||
start: 17,
|
start: 17,
|
||||||
end: 18,
|
end: 18,
|
||||||
value: 1.into(),
|
value: 1u32.into(),
|
||||||
raw: "1".to_string(),
|
raw: "1".to_string(),
|
||||||
})),
|
})),
|
||||||
Value::Literal(Box::new(Literal {
|
Value::Literal(Box::new(Literal {
|
||||||
start: 17,
|
start: 17,
|
||||||
end: 18,
|
end: 18,
|
||||||
value: 2.into(),
|
value: 2u32.into(),
|
||||||
raw: "2".to_string(),
|
raw: "2".to_string(),
|
||||||
})),
|
})),
|
||||||
Value::Literal(Box::new(Literal {
|
Value::Literal(Box::new(Literal {
|
||||||
start: 17,
|
start: 17,
|
||||||
end: 18,
|
end: 18,
|
||||||
value: 3.into(),
|
value: 3u32.into(),
|
||||||
raw: "3".to_string(),
|
raw: "3".to_string(),
|
||||||
})),
|
})),
|
||||||
Value::Literal(Box::new(Literal {
|
Value::Literal(Box::new(Literal {
|
||||||
start: 17,
|
start: 17,
|
||||||
end: 18,
|
end: 18,
|
||||||
value: 4.into(),
|
value: 4u32.into(),
|
||||||
raw: "4".to_string(),
|
raw: "4".to_string(),
|
||||||
})),
|
})),
|
||||||
Value::Literal(Box::new(Literal {
|
Value::Literal(Box::new(Literal {
|
||||||
start: 17,
|
start: 17,
|
||||||
end: 18,
|
end: 18,
|
||||||
value: 5.into(),
|
value: 5u32.into(),
|
||||||
raw: "5".to_string(),
|
raw: "5".to_string(),
|
||||||
})),
|
})),
|
||||||
Value::Literal(Box::new(Literal {
|
Value::Literal(Box::new(Literal {
|
||||||
start: 17,
|
start: 17,
|
||||||
end: 18,
|
end: 18,
|
||||||
value: 6.into(),
|
value: 6u32.into(),
|
||||||
raw: "6".to_string(),
|
raw: "6".to_string(),
|
||||||
})),
|
})),
|
||||||
Value::Literal(Box::new(Literal {
|
Value::Literal(Box::new(Literal {
|
||||||
start: 17,
|
start: 17,
|
||||||
end: 18,
|
end: 18,
|
||||||
value: 7.into(),
|
value: 7u32.into(),
|
||||||
raw: "7".to_string(),
|
raw: "7".to_string(),
|
||||||
})),
|
})),
|
||||||
Value::Literal(Box::new(Literal {
|
Value::Literal(Box::new(Literal {
|
||||||
start: 17,
|
start: 17,
|
||||||
end: 18,
|
end: 18,
|
||||||
value: 8.into(),
|
value: 8u32.into(),
|
||||||
raw: "8".to_string(),
|
raw: "8".to_string(),
|
||||||
})),
|
})),
|
||||||
Value::Literal(Box::new(Literal {
|
Value::Literal(Box::new(Literal {
|
||||||
start: 17,
|
start: 17,
|
||||||
end: 18,
|
end: 18,
|
||||||
value: 9.into(),
|
value: 9u32.into(),
|
||||||
raw: "9".to_string(),
|
raw: "9".to_string(),
|
||||||
})),
|
})),
|
||||||
Value::Literal(Box::new(Literal {
|
Value::Literal(Box::new(Literal {
|
||||||
start: 17,
|
start: 17,
|
||||||
end: 18,
|
end: 18,
|
||||||
value: 10.into(),
|
value: 10u32.into(),
|
||||||
raw: "10".to_string(),
|
raw: "10".to_string(),
|
||||||
})),
|
})),
|
||||||
],
|
],
|
||||||
|
Reference in New Issue
Block a user