Look up a symbol from a module. Return None if no matching symbol could be bound.
(self, node: MypyFile, name: str)
| 6780 | return None |
| 6781 | |
| 6782 | def get_module_symbol(self, node: MypyFile, name: str) -> SymbolTableNode | None: |
| 6783 | """Look up a symbol from a module. |
| 6784 | |
| 6785 | Return None if no matching symbol could be bound. |
| 6786 | """ |
| 6787 | module = node.fullname |
| 6788 | names = node.names |
| 6789 | sym = names.get(name) |
| 6790 | if not sym: |
| 6791 | fullname = module + "." + name |
| 6792 | if fullname in self.modules and self.is_visible_import(module, fullname): |
| 6793 | sym = SymbolTableNode(GDEF, self.modules[fullname]) |
| 6794 | elif self.is_incomplete_namespace(module): |
| 6795 | self.record_incomplete_ref() |
| 6796 | elif "__getattr__" in names: |
| 6797 | gvar = self.create_getattr_var(names["__getattr__"], name, fullname) |
| 6798 | if gvar: |
| 6799 | sym = SymbolTableNode(GDEF, gvar) |
| 6800 | elif self.is_missing_module(fullname): |
| 6801 | # We use the fullname of the original definition so that we can |
| 6802 | # detect whether two names refer to the same thing. |
| 6803 | var_type = AnyType(TypeOfAny.from_unimported_type) |
| 6804 | v = Var(name, type=var_type) |
| 6805 | v._fullname = fullname |
| 6806 | sym = SymbolTableNode(GDEF, v) |
| 6807 | elif sym.module_hidden: |
| 6808 | sym = None |
| 6809 | return sym |
| 6810 | |
| 6811 | def is_visible_import(self, base_id: str, id: str) -> bool: |
| 6812 | # TODO: can we reuse SCC-level tracking from build.py instead? |
no test coverage detected