diff --git a/python/ql/test/experimental/import-resolution/ModuleExport.expected b/python/ql/test/experimental/import-resolution/ModuleExport.expected new file mode 100644 index 00000000000..6733a9e378a --- /dev/null +++ b/python/ql/test/experimental/import-resolution/ModuleExport.expected @@ -0,0 +1,232 @@ +| attr_clash.__init__ | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| attr_clash.__init__ | __file__ | attr_clash/__init__.py:2:7:2:14 | ControlFlowNode for __file__ | +| attr_clash.__init__ | __file__ | attr_clash/__init__.py:6:6:6:13 | ControlFlowNode for __file__ | +| attr_clash.__init__ | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| attr_clash.__init__ | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| attr_clash.__init__ | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| attr_clash.__init__ | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| attr_clash.__init__ | clashing_attr | attr_clash/__init__.py:4:17:4:31 | ControlFlowNode for Str | +| attr_clash.__init__ | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| attr_clash.__init__ | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| attr_clash.__init__ | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| attr_clash.__init__ | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| attr_clash.__init__ | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| attr_clash.clashing_attr | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| attr_clash.clashing_attr | __file__ | attr_clash/clashing_attr.py:2:7:2:14 | ControlFlowNode for __file__ | +| attr_clash.clashing_attr | __file__ | attr_clash/clashing_attr.py:4:6:4:13 | ControlFlowNode for __file__ | +| attr_clash.clashing_attr | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| attr_clash.clashing_attr | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| attr_clash.clashing_attr | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| attr_clash.clashing_attr | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| attr_clash.clashing_attr | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| attr_clash.clashing_attr | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| attr_clash.clashing_attr | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| attr_clash.clashing_attr | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| attr_clash.clashing_attr | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| attr_clash.non_clashing_submodule | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| attr_clash.non_clashing_submodule | __file__ | attr_clash/non_clashing_submodule.py:2:7:2:14 | ControlFlowNode for __file__ | +| attr_clash.non_clashing_submodule | __file__ | attr_clash/non_clashing_submodule.py:4:6:4:13 | ControlFlowNode for __file__ | +| attr_clash.non_clashing_submodule | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| attr_clash.non_clashing_submodule | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| attr_clash.non_clashing_submodule | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| attr_clash.non_clashing_submodule | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| attr_clash.non_clashing_submodule | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| attr_clash.non_clashing_submodule | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| attr_clash.non_clashing_submodule | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| attr_clash.non_clashing_submodule | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| attr_clash.non_clashing_submodule | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| bar | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| bar | __file__ | bar.py:2:7:2:14 | ControlFlowNode for __file__ | +| bar | __file__ | bar.py:6:6:6:13 | ControlFlowNode for __file__ | +| bar | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| bar | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| bar | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| bar | bar_attr | bar.py:4:12:4:21 | ControlFlowNode for Str | +| bar | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| bar | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| bar | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| bar | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| bar | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| bar | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| foo | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| foo | __file__ | foo.py:2:7:2:14 | ControlFlowNode for __file__ | +| foo | __file__ | foo.py:14:6:14:13 | ControlFlowNode for __file__ | +| foo | __private_foo_attr | foo.py:8:22:8:41 | ControlFlowNode for Str | +| foo | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| foo | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| foo | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| foo | bar_reexported | foo.py:11:8:11:10 | ControlFlowNode for ImportExpr | +| foo | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| foo | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| foo | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| foo | foo_attr | foo.py:5:12:5:21 | ControlFlowNode for Str | +| foo | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| foo | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| foo | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| if_then_else | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| if_then_else | __file__ | if_then_else.py:2:7:2:14 | ControlFlowNode for __file__ | +| if_then_else | __file__ | if_then_else.py:16:6:16:13 | ControlFlowNode for __file__ | +| if_then_else | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| if_then_else | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| if_then_else | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| if_then_else | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| if_then_else | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| if_then_else | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| if_then_else | if_then_else_defined | if_then_else.py:7:28:7:39 | ControlFlowNode for Str | +| if_then_else | if_then_else_defined | if_then_else.py:12:32:12:47 | ControlFlowNode for Str | +| if_then_else | if_then_else_defined | if_then_else.py:14:32:14:47 | ControlFlowNode for Str | +| if_then_else | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| if_then_else | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| if_then_else | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| if_then_else_refined | SOURCE | if_then_else_refined.py:6:1:6:15 | ControlFlowNode for ClassExpr | +| if_then_else_refined | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| if_then_else_refined | __file__ | if_then_else_refined.py:4:7:4:14 | ControlFlowNode for __file__ | +| if_then_else_refined | __file__ | if_then_else_refined.py:19:6:19:13 | ControlFlowNode for __file__ | +| if_then_else_refined | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| if_then_else_refined | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| if_then_else_refined | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| if_then_else_refined | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| if_then_else_refined | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| if_then_else_refined | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| if_then_else_refined | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| if_then_else_refined | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| if_then_else_refined | src | if_then_else_refined.py:11:11:11:16 | ControlFlowNode for SOURCE | +| if_then_else_refined | src | if_then_else_refined.py:13:11:13:16 | ControlFlowNode for SOURCE | +| if_then_else_refined | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| main | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| main | __file__ | main.py:24:7:24:14 | ControlFlowNode for __file__ | +| main | __file__ | main.py:103:6:103:13 | ControlFlowNode for __file__ | +| main | __file__ | package/subpackage2/__init__.py:2:7:2:14 | ControlFlowNode for __file__ | +| main | __file__ | package/subpackage2/__init__.py:6:6:6:13 | ControlFlowNode for __file__ | +| main | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| main | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| main | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| main | aliased_subpackage | main.py:54:6:54:12 | ControlFlowNode for ImportExpr | +| main | aliased_subpackage | main.py:54:21:54:52 | ControlFlowNode for ImportMember | +| main | aliased_subpackage | main.py:65:8:65:25 | ControlFlowNode for ImportExpr | +| main | bar_attr | main.py:42:6:42:8 | ControlFlowNode for ImportExpr | +| main | bar_attr | main.py:42:17:42:24 | ControlFlowNode for ImportMember | +| main | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| main | clashing_attr | main.py:83:6:83:15 | ControlFlowNode for ImportExpr | +| main | clashing_attr | main.py:83:24:83:36 | ControlFlowNode for ImportMember | +| main | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| main | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| main | foo | main.py:27:8:27:10 | ControlFlowNode for ImportExpr | +| main | foo_alias | main.py:34:8:34:10 | ControlFlowNode for ImportExpr | +| main | if_then_else_defined | main.py:93:6:93:17 | ControlFlowNode for ImportExpr | +| main | if_then_else_defined | main.py:93:26:93:45 | ControlFlowNode for ImportMember | +| main | if_then_else_refined | main.py:100:8:100:27 | ControlFlowNode for ImportExpr | +| main | local_import | main.py:57:1:57:19 | ControlFlowNode for FunctionExpr | +| main | namespace_module_attr | main.py:79:10:79:43 | ControlFlowNode for ImportExpr | +| main | namespace_module_attr | main.py:79:52:79:72 | ControlFlowNode for ImportMember | +| main | non_clashing_submodule | main.py:83:6:83:15 | ControlFlowNode for ImportExpr | +| main | non_clashing_submodule | main.py:83:39:83:60 | ControlFlowNode for ImportMember | +| main | package | main.py:69:8:69:25 | ControlFlowNode for ImportExpr | +| main | package | main.py:73:8:73:35 | ControlFlowNode for ImportExpr | +| main | package_attr_alias | main.py:50:6:50:12 | ControlFlowNode for ImportExpr | +| main | package_attr_alias | main.py:50:21:50:54 | ControlFlowNode for ImportMember | +| main | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| main | print_function | main.py:21:6:21:15 | ControlFlowNode for ImportExpr | +| main | print_function | main.py:21:24:21:37 | ControlFlowNode for ImportMember | +| main | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| main | refined | main.py:97:8:97:14 | ControlFlowNode for ImportExpr | +| main | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| main | subpackage2_attr | package/subpackage2/__init__.py:4:20:4:37 | ControlFlowNode for Str | +| main | subpackage_attr | main.py:46:6:46:23 | ControlFlowNode for ImportExpr | +| main | subpackage_attr | main.py:46:32:46:46 | ControlFlowNode for ImportMember | +| main | sys | main.py:22:8:22:10 | ControlFlowNode for ImportExpr | +| namespace_package.namespace_module | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| namespace_package.namespace_module | __file__ | namespace_package/namespace_module.py:2:7:2:14 | ControlFlowNode for __file__ | +| namespace_package.namespace_module | __file__ | namespace_package/namespace_module.py:6:6:6:13 | ControlFlowNode for __file__ | +| namespace_package.namespace_module | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| namespace_package.namespace_module | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| namespace_package.namespace_module | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| namespace_package.namespace_module | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| namespace_package.namespace_module | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| namespace_package.namespace_module | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| namespace_package.namespace_module | namespace_module_attr | namespace_package/namespace_module.py:4:25:4:47 | ControlFlowNode for Str | +| namespace_package.namespace_module | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| namespace_package.namespace_module | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| namespace_package.namespace_module | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| package.__init__ | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| package.__init__ | __file__ | package/__init__.py:2:7:2:14 | ControlFlowNode for __file__ | +| package.__init__ | __file__ | package/__init__.py:7:6:7:13 | ControlFlowNode for __file__ | +| package.__init__ | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| package.__init__ | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| package.__init__ | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| package.__init__ | attr_used_in_subpackage | package/__init__.py:4:27:4:51 | ControlFlowNode for Str | +| package.__init__ | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| package.__init__ | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| package.__init__ | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| package.__init__ | package_attr | package/__init__.py:5:16:5:29 | ControlFlowNode for Str | +| package.__init__ | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| package.__init__ | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| package.__init__ | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| package.subpackage2.__init__ | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| package.subpackage2.__init__ | __file__ | package/subpackage2/__init__.py:2:7:2:14 | ControlFlowNode for __file__ | +| package.subpackage2.__init__ | __file__ | package/subpackage2/__init__.py:6:6:6:13 | ControlFlowNode for __file__ | +| package.subpackage2.__init__ | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| package.subpackage2.__init__ | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| package.subpackage2.__init__ | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| package.subpackage2.__init__ | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| package.subpackage2.__init__ | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| package.subpackage2.__init__ | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| package.subpackage2.__init__ | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| package.subpackage2.__init__ | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| package.subpackage2.__init__ | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| package.subpackage2.__init__ | subpackage2_attr | package/subpackage2/__init__.py:4:20:4:37 | ControlFlowNode for Str | +| package.subpackage.__init__ | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| package.subpackage.__init__ | __file__ | package/subpackage/__init__.py:2:7:2:14 | ControlFlowNode for __file__ | +| package.subpackage.__init__ | __file__ | package/subpackage/__init__.py:14:6:14:13 | ControlFlowNode for __file__ | +| package.subpackage.__init__ | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| package.subpackage.__init__ | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| package.subpackage.__init__ | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| package.subpackage.__init__ | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| package.subpackage.__init__ | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| package.subpackage.__init__ | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| package.subpackage.__init__ | imported_attr | package/subpackage/__init__.py:7:6:7:7 | ControlFlowNode for ImportExpr | +| package.subpackage.__init__ | imported_attr | package/subpackage/__init__.py:7:16:7:55 | ControlFlowNode for ImportMember | +| package.subpackage.__init__ | irrelevant_attr | package/subpackage/__init__.py:11:6:11:15 | ControlFlowNode for ImportExpr | +| package.subpackage.__init__ | irrelevant_attr | package/subpackage/__init__.py:11:24:11:38 | ControlFlowNode for ImportMember | +| package.subpackage.__init__ | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| package.subpackage.__init__ | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| package.subpackage.__init__ | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| package.subpackage.__init__ | subpackage_attr | package/subpackage/__init__.py:4:19:4:35 | ControlFlowNode for Str | +| package.subpackage.submodule | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| package.subpackage.submodule | __file__ | package/subpackage/submodule.py:2:7:2:14 | ControlFlowNode for __file__ | +| package.subpackage.submodule | __file__ | package/subpackage/submodule.py:7:6:7:13 | ControlFlowNode for __file__ | +| package.subpackage.submodule | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| package.subpackage.submodule | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| package.subpackage.submodule | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| package.subpackage.submodule | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| package.subpackage.submodule | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| package.subpackage.submodule | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| package.subpackage.submodule | irrelevant_attr | package/subpackage/submodule.py:5:19:5:35 | ControlFlowNode for Str | +| package.subpackage.submodule | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| package.subpackage.submodule | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| package.subpackage.submodule | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| package.subpackage.submodule | submodule_attr | package/subpackage/submodule.py:4:18:4:33 | ControlFlowNode for Str | +| refined | SOURCE | refined.py:4:1:4:21 | ControlFlowNode for ClassExpr | +| refined | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| refined | __file__ | refined.py:2:7:2:14 | ControlFlowNode for __file__ | +| refined | __file__ | refined.py:14:6:14:13 | ControlFlowNode for __file__ | +| refined | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| refined | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| refined | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| refined | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| refined | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| refined | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| refined | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| refined | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| refined | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| trace | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| trace | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| trace | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| trace | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| trace | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| trace | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| trace | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| trace | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| trace | print_function | trace.py:1:6:1:15 | ControlFlowNode for ImportExpr | +| trace | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| trace | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | diff --git a/python/ql/test/experimental/import-resolution/ModuleExport.ql b/python/ql/test/experimental/import-resolution/ModuleExport.ql new file mode 100644 index 00000000000..9d45b0ec8d0 --- /dev/null +++ b/python/ql/test/experimental/import-resolution/ModuleExport.ql @@ -0,0 +1,9 @@ +import python +import semmle.python.dataflow.new.DataFlow +import semmle.python.dataflow.new.internal.ImportResolution + +from Module m, string name, DataFlow::Node defn +where + ImportResolution::module_export(m, name, defn) and + exists(m.getLocation().getFile().getRelativePath()) +select m.getName(), name, defn