Working with typed base classes in Python (see #22291) I realised that the toolchain seems to drop generic base classes (e.g. list[int] in class Bar(list[int]):) at some point. That is, in the example code
class Foo(list): pass
class Bar(list[int]): pass
CodeQL knows the Foo -> list relation but not the Bar -> list[int] relation.
As far as I could trace it, the relation is already lost in the tsg-python parser. Using the v2.26.2 toolchain, the source code class Bar(list): pass produces the following tsg-python output (assignment nodes removed for brevity):
node 4
_kind: "Name"
_location: [0, 10, 0, 14]
ctx: "load"
variable: "list"
node 5
_kind: "ClassExpr"
_location: [0, 0, 0, 21]
_location_end: [0, 16]
inner_scope: [graph node 6]
name: "Bar"
edge 5 -> 4
bases: 0
node 6
_kind: "Class"
_location: [0, 0, 0, 21]
_location_end: [0, 16]
name: "Bar"
edge 6 -> 1
body: 0
Now if the code is extended for a generic subscription as class Bar(list[int]): pass produces the following tsg-python output (assignment nodes removed for brevity):
node 4
_kind: "Name"
_location: [0, 10, 0, 14]
ctx: "load"
variable: "list"
node 5
_kind: "Name"
_location: [0, 15, 0, 18]
ctx: "load"
variable: "int"
node 6
_kind: "Subscript"
_location: [0, 10, 0, 19]
ctx: "load"
index: [graph node 5]
value: [graph node 4]
node 7
_kind: "ClassExpr"
_location: [0, 0, 0, 26]
_location_end: [0, 21]
inner_scope: [graph node 8]
name: "Bar"
node 8
_kind: "Class"
_location: [0, 0, 0, 26]
_location_end: [0, 21]
name: "Bar"
edge 8 -> 1
body: 0
Notice that the type subscription is parsed (nodes 4, 5, 6) but the edge n -> m node for the bases: 0 relation is absent.
Working with typed base classes in Python (see #22291) I realised that the toolchain seems to drop generic base classes (e.g.
list[int]inclass Bar(list[int]):) at some point. That is, in the example codeCodeQL knows the
Foo->listrelation but not theBar->list[int]relation.As far as I could trace it, the relation is already lost in the
tsg-pythonparser. Using the v2.26.2 toolchain, the source codeclass Bar(list): passproduces the followingtsg-pythonoutput (assignment nodes removed for brevity):Now if the code is extended for a generic subscription as
class Bar(list[int]): passproduces the followingtsg-pythonoutput (assignment nodes removed for brevity):Notice that the type subscription is parsed (nodes
4,5,6) but theedge n -> mnode for thebases: 0relation is absent.