Skip to content

Commit

Permalink
feat(variable-assignment): enable assigning multiple variables in one…
Browse files Browse the repository at this point in the history
… clause
  • Loading branch information
kantord committed Oct 18, 2018
1 parent 889bd12 commit fc202a2
Show file tree
Hide file tree
Showing 7 changed files with 321 additions and 69 deletions.
209 changes: 193 additions & 16 deletions src/__tests__/__snapshots__/interpreter.test.js.snap
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ exports[`interpreter correct target code $ 1`] = `"(function(_) { return (functi

exports[`interpreter correct target code $ 2`] = `"(function(_) { return (function(input) { return input})})"`;

exports[`interpreter correct target code ($x + $foobar | [$, $foobar]) where $x = 3 $foobar = ($x + 1) 1`] = `"(function(_) { return (function(input) { return ((function() {_ = _.assign('x', (3), _); _ = _.assign('foobar', ((_.get('x')+1)), _); return (((function (input) {return [input, _.get('foobar')]})(_.get('x')+_.get('foobar'))))})())})})"`;

exports[`interpreter correct target code (3 + $foobar | [$, $foobar]) where $foobar = $ 1`] = `"(function(_) { return (function(input) { return ((function() {_ = _.assign('foobar', (input), _); return (((function (input) {return [input, _.get('foobar')]})(3+_.get('foobar'))))})())})})"`;

exports[`interpreter correct target code (8 + 3.14) * 2 1`] = `"(function(_) { return (function(input) { return (8+3.14)*2})})"`;
Expand Down Expand Up @@ -607,6 +609,173 @@ Object {
}
`;

exports[`interpreter correct target tree ($x + $foobar | [$, $foobar]) where $x = 3 $foobar = ($x + 1) 1`] = `
Object {
"status": true,
"value": Object {
"end": Object {
"column": 62,
"line": 1,
"offset": 61,
},
"name": "assignment",
"start": Object {
"column": 1,
"line": 1,
"offset": 0,
},
"value": Object {
"assignments": Array [
Array [
Object {
"name": "identifier",
"value": "x",
},
Object {
"name": "primitive",
"value": "3",
},
],
Array [
Object {
"name": "identifier",
"value": "foobar",
},
Object {
"name": "parentheses",
"value": Object {
"name": "binaryOperation",
"value": Array [
Object {
"end": Object {
"column": 58,
"line": 1,
"offset": 57,
},
"name": "variable",
"start": Object {
"column": 55,
"line": 1,
"offset": 54,
},
"value": "$x",
},
Object {
"end": Object {
"column": 59,
"line": 1,
"offset": 58,
},
"name": "primitive",
"start": Object {
"column": 58,
"line": 1,
"offset": 57,
},
"value": "+",
},
Object {
"name": "primitive",
"value": "1",
},
],
},
},
],
],
"program": Object {
"name": "parentheses",
"value": Object {
"name": "pipe",
"value": Object {
"left": Object {
"name": "binaryOperation",
"value": Array [
Object {
"end": Object {
"column": 5,
"line": 1,
"offset": 4,
},
"name": "variable",
"start": Object {
"column": 2,
"line": 1,
"offset": 1,
},
"value": "$x",
},
Object {
"end": Object {
"column": 6,
"line": 1,
"offset": 5,
},
"name": "primitive",
"start": Object {
"column": 5,
"line": 1,
"offset": 4,
},
"value": "+",
},
Object {
"end": Object {
"column": 15,
"line": 1,
"offset": 14,
},
"name": "variable",
"start": Object {
"column": 7,
"line": 1,
"offset": 6,
},
"value": "$foobar",
},
],
},
"right": Object {
"end": Object {
"column": 29,
"line": 1,
"offset": 28,
},
"name": "list",
"start": Object {
"column": 17,
"line": 1,
"offset": 16,
},
"value": Array [
Object {
"name": "input",
"value": "$",
},
Object {
"end": Object {
"column": 28,
"line": 1,
"offset": 27,
},
"name": "variable",
"start": Object {
"column": 21,
"line": 1,
"offset": 20,
},
"value": "$foobar",
},
],
},
},
},
},
},
},
}
`;

exports[`interpreter correct target tree (3 + $foobar | [$, $foobar]) where $foobar = $ 1`] = `
Object {
"status": true,
Expand All @@ -623,10 +792,18 @@ Object {
"offset": 0,
},
"value": Object {
"name": Object {
"name": "identifier",
"value": "foobar",
},
"assignments": Array [
Array [
Object {
"name": "identifier",
"value": "foobar",
},
Object {
"name": "input",
"value": "$",
},
],
],
"program": Object {
"name": "parentheses",
"value": Object {
Expand Down Expand Up @@ -705,10 +882,6 @@ Object {
},
},
},
"value": Object {
"name": "input",
"value": "$",
},
},
},
}
Expand Down Expand Up @@ -3406,10 +3579,18 @@ Object {
"offset": 0,
},
"value": Object {
"name": Object {
"name": "identifier",
"value": "foobar",
},
"assignments": Array [
Array [
Object {
"name": "identifier",
"value": "foobar",
},
Object {
"name": "primitive",
"value": "4",
},
],
],
"program": Object {
"name": "binaryOperation",
"value": Array [
Expand Down Expand Up @@ -3447,10 +3628,6 @@ Object {
},
],
},
"value": Object {
"name": "primitive",
"value": "4",
},
},
},
}
Expand Down
5 changes: 5 additions & 0 deletions src/__tests__/interpreter.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,11 @@ const tests = [
sourceCode: `(3 + $foobar | [$, $foobar]) where $foobar = $`,
input: 4,
output: [7, 4]
},
{
sourceCode: `($x + $foobar | [$, $foobar]) where $x = 3 $foobar = ($x + 1)`,
input: 4,
output: [7, 4]
}
]

Expand Down
32 changes: 23 additions & 9 deletions src/generators/__tests__/assignment.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,19 +25,33 @@ describe('assignment generator', () => {
assignment((): string => '3 + 4')({
name: 'assignment',
value: {
value: {
name: 'parentheses',
value: x
},
name: {
name: 'primitive',
value: 'a34234'
},
assignments: [
[
{
name: 'primitive',
value: 'a34234'
},
{
name: 'parentheses',
value: x
}
],
[
{
name: 'primitive',
value: 'a'
},
{
name: 'parentheses',
value: x
}
]
],
program: x
}
})
).toEqual(
"((function() {_ = _.assign('a34234', (3 + 4), _); return (3 + 4)})())"
"((function() {_ = _.assign('a34234', (3 + 4), _); _ = _.assign('a', (3 + 4), _); return (3 + 4)})())"
)
})
})
22 changes: 17 additions & 5 deletions src/generators/assignment.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,26 @@
import type {
NodeType,
AssignmentNodeType,
GeneratedCodeType
GeneratedCodeType,
AssignmentsType,
AssignmentType
} from '../types'

export default (
Generator: NodeType => GeneratedCodeType
): (AssignmentNodeType => GeneratedCodeType) => ({
value
}: AssignmentNodeType): GeneratedCodeType =>
`((function() {_ = _.assign('${value.name.value}', (${Generator(
value.value
)}), _); return (${Generator(value.program)})})())`
}: AssignmentNodeType): GeneratedCodeType => {
const compileOneAssignment = (
assignment: AssignmentType
): GeneratedCodeType =>
`_ = _.assign('${assignment[0].value}', (${Generator(assignment[1])}), _)`

const compileAssignments = (
assignments: AssignmentsType
): GeneratedCodeType => assignments.map(compileOneAssignment).join('; ')

return `((function() {${compileAssignments(
value.assignments
)}; return (${Generator(value.program)})})())`
}
Loading

0 comments on commit fc202a2

Please sign in to comment.