Skip to content

Commit 742e662

Browse files
Add source mappings for all nodes on parse()
1 parent 0e777bf commit 742e662

21 files changed

+532
-85
lines changed

src/expression/node/AccessorNode.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,9 @@ export const createAccessorNode = /* #__PURE__ */ factory(name, dependencies, ({
136136
* @return {AccessorNode}
137137
*/
138138
clone () {
139-
return new AccessorNode(this.object, this.index)
139+
const cloned = new AccessorNode(this.object, this.index)
140+
cloned.sources = this.sources
141+
return cloned
140142
}
141143

142144
/**

src/expression/node/ArrayNode.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,9 @@ export const createArrayNode = /* #__PURE__ */ factory(name, dependencies, ({ No
9494
* @return {ArrayNode}
9595
*/
9696
clone () {
97-
return new ArrayNode(this.items.slice(0))
97+
const cloned = new ArrayNode(this.items.slice(0))
98+
cloned.sources = this.sources
99+
return cloned
98100
}
99101

100102
/**

src/expression/node/AssignmentNode.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,9 @@ export const createAssignmentNode = /* #__PURE__ */ factory(name, dependencies,
231231
* @return {AssignmentNode}
232232
*/
233233
clone () {
234-
return new AssignmentNode(this.object, this.index, this.value)
234+
const cloned = new AssignmentNode(this.object, this.index, this.value)
235+
cloned.sources = this.sources
236+
return cloned
235237
}
236238

237239
/**

src/expression/node/BlockNode.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,9 @@ export const createBlockNode = /* #__PURE__ */ factory(name, dependencies, ({ Re
119119
}
120120
})
121121

122-
return new BlockNode(blocks)
122+
const cloned = new BlockNode(blocks)
123+
cloned.sources = this.sources
124+
return cloned
123125
}
124126

125127
/**

src/expression/node/ConditionalNode.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,9 @@ export const createConditionalNode = /* #__PURE__ */ factory(name, dependencies,
121121
* @return {ConditionalNode}
122122
*/
123123
clone () {
124-
return new ConditionalNode(this.condition, this.trueExpr, this.falseExpr)
124+
const cloned = new ConditionalNode(this.condition, this.trueExpr, this.falseExpr)
125+
cloned.sources = this.sources
126+
return cloned
125127
}
126128

127129
/**

src/expression/node/ConstantNode.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,9 @@ export const createConstantNode = /* #__PURE__ */ factory(name, dependencies, ({
7575
* @return {ConstantNode}
7676
*/
7777
clone () {
78-
return new ConstantNode(this.value)
78+
const cloned = new ConstantNode(this.value)
79+
cloned.sources = this.sources
80+
return cloned
7981
}
8082

8183
/**

src/expression/node/FunctionAssignmentNode.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,10 @@ export const createFunctionAssignmentNode = /* #__PURE__ */ factory(name, depend
149149
* @return {FunctionAssignmentNode}
150150
*/
151151
clone () {
152-
return new FunctionAssignmentNode(
152+
const cloned = new FunctionAssignmentNode(
153153
this.name, this.params.slice(0), this.expr)
154+
cloned.sources = this.sources
155+
return cloned
154156
}
155157

156158
/**

src/expression/node/FunctionNode.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,9 @@ export const createFunctionNode = /* #__PURE__ */ factory(name, dependencies, ({
310310
* @return {FunctionNode}
311311
*/
312312
clone () {
313-
return new FunctionNode(this.fn, this.args.slice(0))
313+
const cloned = new FunctionNode(this.fn, this.args.slice(0))
314+
cloned.sources = this.sources
315+
return cloned
314316
}
315317

316318
/**

src/expression/node/IndexNode.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,9 @@ export const createIndexNode = /* #__PURE__ */ factory(name, dependencies, ({ No
141141
* @return {IndexNode}
142142
*/
143143
clone () {
144-
return new IndexNode(this.dimensions.slice(0), this.dotNotation)
144+
const cloned = new IndexNode(this.dimensions.slice(0), this.dotNotation)
145+
cloned.sources = this.sources
146+
return cloned
145147
}
146148

147149
/**

src/expression/node/Node.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ export const createNode = /* #__PURE__ */ factory(name, dependencies, ({ mathWit
2323
}
2424

2525
class Node {
26+
sources = []
27+
2628
get type () { return 'Node' }
2729
get isNode () { return true }
2830

@@ -204,6 +206,15 @@ export const createNode = /* #__PURE__ */ factory(name, dependencies, ({ mathWit
204206
throw new Error('Cannot clone a Node interface')
205207
}
206208

209+
/**
210+
* Set the source indices mapping this node back to its
211+
* location in the original source string
212+
* @param {SourceMapping[]} sources - the data mapping this node back to its source string
213+
*/
214+
setSources (sources) {
215+
this.sources = sources
216+
}
217+
207218
/**
208219
* Create a deep clone of this node
209220
* @return {Node}

0 commit comments

Comments
 (0)