Avoid cloning Name when looking up function and class types (#14092)

This commit is contained in:
Micha Reiser 2024-11-04 15:52:59 +01:00 committed by GitHub
parent a7a78f939c
commit bc0586d922
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 27 additions and 4 deletions

1
Cargo.lock generated
View file

@ -2638,6 +2638,7 @@ dependencies = [
"ruff_source_file",
"ruff_text_size",
"rustc-hash 2.0.0",
"salsa",
"schemars",
"serde",
]

View file

@ -13,7 +13,7 @@ license = { workspace = true }
[dependencies]
ruff_db = { workspace = true }
ruff_index = { workspace = true }
ruff_python_ast = { workspace = true }
ruff_python_ast = { workspace = true, features = ["salsa"] }
ruff_python_stdlib = { workspace = true }
ruff_source_file = { workspace = true }
ruff_text_size = { workspace = true }

View file

@ -856,7 +856,7 @@ impl<'db> TypeInferenceBuilder<'db> {
};
let function_ty = Type::FunctionLiteral(FunctionType::new(
self.db,
name.id.clone(),
&*name.id,
function_kind,
definition,
decorator_tys,
@ -965,7 +965,7 @@ impl<'db> TypeInferenceBuilder<'db> {
let class_ty = Type::ClassLiteral(ClassType::new(
self.db,
name.id.clone(),
&*name.id,
definition,
body_scope,
maybe_known_class,

View file

@ -26,13 +26,20 @@ is-macro = { workspace = true }
itertools = { workspace = true }
memchr = { workspace = true }
rustc-hash = { workspace = true }
salsa = { workspace = true, optional = true }
schemars = { workspace = true, optional = true }
serde = { workspace = true, optional = true }
[features]
schemars = ["dep:schemars"]
cache = ["dep:ruff_cache", "dep:ruff_macros"]
serde = ["dep:serde", "ruff_text_size/serde", "dep:ruff_cache", "compact_str/serde"]
serde = [
"dep:serde",
"ruff_text_size/serde",
"dep:ruff_cache",
"compact_str/serde",
]
salsa = ["dep:salsa"]
[lints]
workspace = true

View file

@ -205,6 +205,21 @@ impl schemars::JsonSchema for Name {
}
}
#[cfg(feature = "salsa")]
impl salsa::plumbing::interned::Lookup<Name> for &str {
fn hash<H: Hasher>(&self, h: &mut H) {
std::hash::Hash::hash(self, h);
}
fn eq(&self, data: &Name) -> bool {
self == data
}
fn into_owned(self) -> Name {
Name::new(self)
}
}
/// A representation of a qualified name, like `typing.List`.
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct QualifiedName<'a>(SegmentsVec<'a>);