Respect attribute chains when resolving builtin call paths (#9309)

## Summary

When resolving `dict.__dict__`, we were discarding the `.__dict__`
segment when computing the call path.

## Test Plan

`cargo test`
This commit is contained in:
Charlie Marsh 2023-12-29 11:13:24 -04:00 committed by GitHub
parent ec88acc291
commit 00f3c7d1d5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 26 additions and 3 deletions

View file

@ -15,7 +15,7 @@ use crate::analyze::type_inference::{PythonType, ResolvedPythonType};
use crate::model::SemanticModel;
use crate::{Binding, BindingKind};
#[derive(Copy, Clone)]
#[derive(Debug, Copy, Clone)]
pub enum Callable {
Bool,
Cast,
@ -26,7 +26,7 @@ pub enum Callable {
MypyExtension,
}
#[derive(Copy, Clone)]
#[derive(Debug, Copy, Clone)]
pub enum SubscriptKind {
/// A subscript of the form `typing.Literal["foo", "bar"]`, i.e., a literal.
Literal,

View file

@ -707,7 +707,20 @@ impl<'a> SemanticModel<'a> {
};
Some(resolved)
}
BindingKind::Builtin => Some(smallvec!["", head.id.as_str()]),
BindingKind::Builtin => {
if value.is_name_expr() {
// Ex) `dict`
Some(smallvec!["", head.id.as_str()])
} else {
// Ex) `dict.__dict__`
let value_path = collect_call_path(value)?;
Some(
std::iter::once("")
.chain(value_path.iter().copied())
.collect(),
)
}
}
BindingKind::ClassDefinition(_) | BindingKind::FunctionDefinition(_) => {
let value_path = collect_call_path(value)?;
let resolved: CallPath = self