[Python] tsg-parser fails to extract generic base class relations

Abierto
#22,298 2 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
3/5
Tiempo estimado
1-2 días
Aptitud para principiantes
55/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Tranquilo
Stack tecnológico
python
Área
compilers

Línea de trabajo

Empieza reproduciendo la salida de v2.26.2 tsg-python para class Bar(list[int]): pass y, a continuación, rastrea cómo gestiona el parser el nodo Subscript al construir las bases de la clase. El trabajo estará terminado cuando la base genérica produzca una arista bases y CodeQL reconozca la relación Bar -> list[int], mientras el caso no genérico existente siga intacto.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

question

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.

Lenguaje dominante
CodeQL
Estrellas
10.1k
Forks
2.1k
Merge medio
2 d 10 h
PR fusionados (30 d)
134

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de github/codeql

Todos los issues de github/codeql

Issues similares

Más issues de Compilers

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.