From af2d783b38d6ee476e170287acbcc8e26cd54e14 Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Fri, 20 Oct 2023 10:23:45 +0200 Subject: [PATCH] Python: More examples of things to handle in find-subclass --- .../library-tests/FindSubclass/Find.expected | 6 ++++ .../FindSubclass/find_subclass_test.py | 32 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/python/ql/test/experimental/library-tests/FindSubclass/Find.expected b/python/ql/test/experimental/library-tests/FindSubclass/Find.expected index eb0696c61ca..d30384a0aef 100644 --- a/python/ql/test/experimental/library-tests/FindSubclass/Find.expected +++ b/python/ql/test/experimental/library-tests/FindSubclass/Find.expected @@ -1,4 +1,10 @@ +| flask.MethodView~Subclass | find_subclass_test | Member[MethodView] | +| flask.MethodView~Subclass | find_subclass_test | Member[clash] | | flask.View~Subclass | find_subclass_test | Member[A] | | flask.View~Subclass | find_subclass_test | Member[B] | +| flask.View~Subclass | find_subclass_test | Member[ViewAliasInExcept] | +| flask.View~Subclass | find_subclass_test | Member[ViewAliasInTry] | | flask.View~Subclass | find_subclass_test | Member[ViewAlias] | | flask.View~Subclass | find_subclass_test | Member[View] | +| flask.View~Subclass | find_subclass_test | Member[clash3] | +| flask.View~Subclass | find_subclass_test | Member[complete_module_alias] | diff --git a/python/ql/test/experimental/library-tests/FindSubclass/find_subclass_test.py b/python/ql/test/experimental/library-tests/FindSubclass/find_subclass_test.py index 3f4f7dbf8b8..afcd1806c94 100644 --- a/python/ql/test/experimental/library-tests/FindSubclass/find_subclass_test.py +++ b/python/ql/test/experimental/library-tests/FindSubclass/find_subclass_test.py @@ -8,3 +8,35 @@ class B(A): ViewAlias = View + +try: + from flask.views import View as ViewAliasInTry +except: + from flask.views import View as ViewAliasInExcept + + +if cond: + from flask.views import View as clash # $ MISSING +else: + from flask.views import MethodView as clash # $ SPURIOUS: MethodView + +if cond: + from flask.views import View as clash2 # $ MISSING +else: + from flask.views import MethodView as clash2 # $ MISSING +print(clash2) + +if cond: + from flask.views import View as clash3 +else: + from flask.views import MethodView as clash3 # $ MISSING + print(clash3) + +import flask.views as containing_module_alias # $ MISSING +# now `find_subclass_test.containing_module_alias.View` is an alias of flask.views.View + +# NOTE: this is not valid code, since View is not a module... but it could be in some cases, like for xml.etree.ElementTree, which is actually not a class but a module 😕 +import flask.views.View as complete_module_alias + +def wrapper(): + return View # $ MISSING