1
1
package io .joern .pysrc2cpg
2
2
3
- import io .shiftleft .codepropertygraph .generated .nodes
4
- import io .shiftleft .codepropertygraph .generated .nodes .{NewClosureBinding , NewIdentifier , NewLocal , NewMethod , NewNode }
3
+ import io .joern .pysrc2cpg .ContextStack .transferLineColInfo
5
4
import io .joern .pysrc2cpg .memop ._
5
+ import io .shiftleft .codepropertygraph .generated .nodes
6
+ import io .shiftleft .codepropertygraph .generated .nodes ._
6
7
import org .slf4j .LoggerFactory
7
8
8
9
import scala .collection .mutable
9
10
10
11
object ContextStack {
11
12
private val logger = LoggerFactory .getLogger(getClass)
13
+
14
+ def transferLineColInfo (src : NewIdentifier , tgt : NewLocal ): Unit = {
15
+ src.lineNumber match {
16
+ // If there are multiple occurrences and the local is already set, ignore later updates
17
+ case Some (srcLineNo) if tgt.lineNumber.isEmpty || ! tgt.lineNumber.exists(_ < srcLineNo) =>
18
+ tgt.lineNumber(src.lineNumber)
19
+ tgt.columnNumber(src.columnNumber)
20
+ case _ =>
21
+ }
22
+ }
12
23
}
13
24
14
25
class ContextStack {
@@ -156,6 +167,7 @@ class ContextStack {
156
167
! moduleMethodContext.get.variables.contains(name)
157
168
) {
158
169
val localNode = createLocal(name, None )
170
+ transferLineColInfo(identifier, localNode)
159
171
createAstEdge(localNode, moduleMethodContext.get.methodBlockNode.get, moduleMethodContext.get.order.getAndInc)
160
172
moduleMethodContext.get.variables.put(name, localNode)
161
173
}
@@ -202,7 +214,8 @@ class ContextStack {
202
214
} else if (memOp == Store ) {
203
215
var variableNode = lookupVariableInMethod(name, contextStack)
204
216
if (variableNode.isEmpty) {
205
- val localNode = createLocal(name, None )
217
+ val localNode = createLocal(name, None )
218
+ transferLineColInfo(identifier, localNode)
206
219
val enclosingMethodContext = findEnclosingMethodContext(contextStack)
207
220
createAstEdge(localNode, enclosingMethodContext.methodBlockNode.get, enclosingMethodContext.order.getAndInc)
208
221
enclosingMethodContext.variables.put(name, localNode)
@@ -253,6 +266,7 @@ class ContextStack {
253
266
if (! contextHasVariable) {
254
267
if (context != moduleMethodContext.get) {
255
268
val localNode = createLocal(name, Some (closureBindingId))
269
+ transferLineColInfo(identifier, localNode)
256
270
createAstEdge(localNode, methodContext.methodBlockNode.get, methodContext.order.getAndInc)
257
271
methodContext.variables.put(name, localNode)
258
272
} else {
@@ -262,6 +276,7 @@ class ContextStack {
262
276
// For example this happens when there are wildcard imports directly into the
263
277
// modules namespace.
264
278
val localNode = createLocal(name, None )
279
+ transferLineColInfo(identifier, localNode)
265
280
createAstEdge(localNode, methodContext.methodBlockNode.get, methodContext.order.getAndInc)
266
281
methodContext.variables.put(name, localNode)
267
282
}
0 commit comments