diff --git a/python/ql/lib/semmle/python/Import.qll b/python/ql/lib/semmle/python/Import.qll index e8a7facccad..2f7fae95539 100644 --- a/python/ql/lib/semmle/python/Import.qll +++ b/python/ql/lib/semmle/python/Import.qll @@ -17,6 +17,10 @@ private predicate valid_module_name(string name) { exists(Module m | m.getName() = name) or exists(Builtin cmod | cmod.getClass() = Builtin::special("ModuleType") and cmod.getName() = name) + or + // Namespace packages may not have a corresponding Module entity, + // but their names are still valid for the purpose of import resolution. + name = moduleNameFromFile(any(Folder f)) } /** An artificial expression representing an import */ diff --git a/python/ql/test/experimental/import-resolution-namespace-relative/pkg/helper.py b/python/ql/test/experimental/import-resolution-namespace-relative/pkg/helper.py index 43167b8cfa7..b9407161e08 100644 --- a/python/ql/test/experimental/import-resolution-namespace-relative/pkg/helper.py +++ b/python/ql/test/experimental/import-resolution-namespace-relative/pkg/helper.py @@ -1,2 +1,2 @@ def process(value): - sink(value) #$ MISSING: prints=source + sink(value) #$ prints=source