Merge pull request #15655 from yoff/python/support-model-editor

Python: Support model editor
This commit is contained in:
Rasmus Wriedt Larsen
2024-07-02 16:28:58 +02:00
committed by GitHub
18 changed files with 468 additions and 1 deletions

View File

@@ -0,0 +1,22 @@
| MyPackage/Foo.py:1:1:1:9 | Class C1 | MyPackage | Foo.C1 | | | false | Foo.py | | Class |
| MyPackage/Foo.py:2:5:2:17 | Function m1 | MyPackage | Foo.C1 | m1 | (self) | true | Foo.py | source | InstanceMethod |
| MyPackage/Foo.py:5:5:5:20 | Function m2 | MyPackage | Foo.C1 | m2 | (self,x) | true | Foo.py | source | InstanceMethod |
| MyPackage/Foo.py:9:5:9:14 | Function m3 | MyPackage | Foo.C1 | m3 | (x) | true | Foo.py | summary | StaticMethod |
| MyPackage/Foo.py:13:5:13:19 | Function m4 | MyPackage | Foo.C1 | m4 | (cls,x) | true | Foo.py | summary | ClassMethod |
| MyPackage/Foo.py:16:1:16:13 | Class C2 | MyPackage | Foo.C2 | | | false | Foo.py | | Class |
| MyPackage/Foo.py:17:5:17:17 | Function m1 | MyPackage | Foo.C2 | m1 | (self) | false | Foo.py | | InstanceMethod |
| MyPackage/Foo.py:20:5:20:27 | Function c2only_m1 | MyPackage | Foo.C2 | c2only_m1 | (self,x) | false | Foo.py | | InstanceMethod |
| MyPackage/Foo.py:23:1:23:9 | Class C3 | MyPackage | Foo.C3 | | | false | Foo.py | | Class |
| MyPackage/Foo.py:24:5:24:26 | Function get_C2_instance | MyPackage | Foo.C3 | get_C2_instance | () | false | Foo.py | | InstanceMethod |
| MyPackage/Foo.py:31:1:31:38 | Function top_level_function | MyPackage | Foo | top_level_function | (x,y,z:) | false | Foo.py | | Function |
| MyPackage/Foo.py:34:1:34:42 | Function func_with_fancy_args | MyPackage | Foo | func_with_fancy_args | () | false | Foo.py | | Function |
| MyPackage/ModuleWithAll.py:2:1:2:10 | Class Foo | MyPackage | ModuleWithAll.Foo | | | false | ModuleWithAll.py | | Class |
| MyPackage/ModuleWithAll.py:3:1:3:10 | Class Bar | MyPackage | ModuleWithAll.Bar | | | false | ModuleWithAll.py | | Class |
| NotPackage/not_in_pacakge_lib.py:1:1:1:34 | Function not_in_pacakge_lib_func | NotPackage | | not_in_pacakge_lib_func | (x,y) | false | not_in_pacakge_lib.py | | Function |
| NotPackage/not_in_pacakge_lib.py:1:1:1:34 | Function not_in_pacakge_lib_func | NotPackage | not_in_pacakge_lib | not_in_pacakge_lib_func | (x,y) | false | not_in_pacakge_lib.py | | Function |
| NotPackage/not_in_pacakge_lib.py:1:1:1:34 | Function not_in_pacakge_lib_func | not_in_pacakge_lib | | not_in_pacakge_lib_func | (x,y) | false | not_in_pacakge_lib.py | | Function |
| NotPackage/not_in_pacakge_lib.py:1:1:1:34 | Function not_in_pacakge_lib_func | not_in_pacakge_lib | not_in_pacakge_lib | not_in_pacakge_lib_func | (x,y) | false | not_in_pacakge_lib.py | | Function |
| NotPackage/not_in_package_script.py:5:1:5:37 | Function not_in_package_script_func | NotPackage | not_in_package_script | not_in_package_script_func | (x,y) | false | not_in_package_script.py | | Function |
| NotPackage/possibly_lib.py:4:1:4:28 | Function possibly_lib_func | NotPackage | possibly_lib | possibly_lib_func | (x,y) | false | possibly_lib.py | | Function |
| TopLevel.py:3:1:3:38 | Function top_level_function | TopLevel | | top_level_function | (x,y,z:) | false | TopLevel.py | | Function |
| not-valid-package/not_in_pacakge_lib_copy.py:1:1:1:34 | Function not_in_pacakge_lib_func | not_in_pacakge_lib_copy | | not_in_pacakge_lib_func | (x,y) | false | not_in_pacakge_lib_copy.py | | Function |

View File

@@ -0,0 +1,24 @@
extensions:
- addsTo:
pack: codeql/python-all
extensible: sourceModel
data:
# Test short form of type column
- ["MyPackage.Foo.C1","Member[m1].ReturnValue","remote"]
# Test long form of type column
- ["MyPackage","Member[Foo].Member[C1].Instance.Member[m2].ReturnValue","remote"]
- addsTo:
pack: codeql/python-all
extensible: summaryModel
data:
# Test short form of type column
- ["MyPackage.Foo.C1!","Member[m3]","Argument[0]","ReturnValue","value"]
# Test long form of type column
- ["MyPackage","Member[Foo].Member[C1].Member[m4]","Argument[0]","ReturnValue","value"]
- addsTo:
pack: codeql/python-all
extensible: typeModel
data:
- ["MyPackage.Foo.C2","MyPackage","Member[Foo].Member[C3].Member[get_C2_instance].ReturnValue"]

View File

@@ -0,0 +1 @@
utils/modeleditor/FrameworkModeEndpoints.ql

View File

@@ -0,0 +1,35 @@
class C1:
def m1(self):
print("C1.m1()")
def m2(self, x):
return x
@staticmethod
def m3(x):
return x
@classmethod
def m4(cls, x):
return x
class C2(C1):
def m1(self):
print("C2.m1()")
def c2only_m1(self, x):
return x
class C3:
def get_C2_instance():
return C2()
class C3nested:
def m5(self, x):
return x
def top_level_function(x, /, y, *, z):
return [x, y, z]
def func_with_fancy_args(*args, **kwargs):
return args, kwargs

View File

@@ -0,0 +1,3 @@
__all__ = ['Foo']
class Foo: pass
class Bar: pass

View File

@@ -0,0 +1,2 @@
def not_in_pacakge_lib_func(x, y):
return x + y

View File

@@ -0,0 +1,10 @@
#!/usr/bin/env python
import not_in_pacakge_lib
def not_in_package_script_func(x, y):
return x + y
if __name__ == "__main__":
print(not_in_pacakge_lib.not_in_pacakge_lib_func(1, 2))
print(not_in_package_script_func(3, 4))

View File

@@ -0,0 +1,5 @@
# model editor should allow modeling the functions defined in this file, even when the
# file is not imported explicitly.
def possibly_lib_func(x, y):
return x + y

View File

@@ -0,0 +1,11 @@
from MyPackage import Foo, ModuleWithAll
def top_level_function(x, /, y, *, z):
return [x, y, z]
top_level_value = Foo.C1()
iC2 = Foo.C3.get_C2_instance()
f = ModuleWithAll.Foo()
b = ModuleWithAll.Bar()

View File

@@ -0,0 +1,2 @@
def not_in_pacakge_lib_func(x, y):
return x + y

View File

@@ -0,0 +1,10 @@
#!/usr/bin/env python
import not_in_pacakge_lib_copy
def not_in_package_script_func(x, y):
return x + y
if __name__ == "__main__":
print(not_in_pacakge_lib_copy.not_in_pacakge_lib_func(1, 2))
print(not_in_package_script_func(3, 4))

View File

@@ -0,0 +1,5 @@
# model editor should allow modeling the functions defined in this file, even when the
# file is not imported explicitly.
def possibly_lib_func(x, y):
return x + y

View File

@@ -0,0 +1 @@
semmle-extractor-options: -R .