mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-29 14:33:29 +00:00
Merge #2338
2338: Remove old hir::generics module r=matklad a=matklad Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
commit
0630bbabfc
12 changed files with 139 additions and 181 deletions
|
@ -27,7 +27,6 @@ use ra_syntax::ast::{self, NameOwner, TypeAscriptionOwner};
|
||||||
use crate::{
|
use crate::{
|
||||||
db::{AstDatabase, DefDatabase, HirDatabase},
|
db::{AstDatabase, DefDatabase, HirDatabase},
|
||||||
expr::{BindingAnnotation, Body, BodySourceMap, ExprValidator, Pat, PatId},
|
expr::{BindingAnnotation, Body, BodySourceMap, ExprValidator, Pat, PatId},
|
||||||
generics::{GenericDef, HasGenericParams},
|
|
||||||
ids::{
|
ids::{
|
||||||
AstItemDef, ConstId, EnumId, FunctionId, MacroDefId, StaticId, StructId, TraitId,
|
AstItemDef, ConstId, EnumId, FunctionId, MacroDefId, StaticId, StructId, TraitId,
|
||||||
TypeAliasId,
|
TypeAliasId,
|
||||||
|
@ -835,7 +834,7 @@ impl Trait {
|
||||||
// lifetime problems, but since there usually shouldn't be more than a
|
// lifetime problems, but since there usually shouldn't be more than a
|
||||||
// few direct traits this should be fine (we could even use some kind of
|
// few direct traits this should be fine (we could even use some kind of
|
||||||
// SmallVec if performance is a concern)
|
// SmallVec if performance is a concern)
|
||||||
self.generic_params(db)
|
db.generic_params(self.id.into())
|
||||||
.where_predicates
|
.where_predicates
|
||||||
.iter()
|
.iter()
|
||||||
.filter_map(|pred| match &pred.type_ref {
|
.filter_map(|pred| match &pred.type_ref {
|
||||||
|
@ -975,16 +974,6 @@ pub enum AssocItem {
|
||||||
// casting them, and somehow making the constructors private, which would be annoying.
|
// casting them, and somehow making the constructors private, which would be annoying.
|
||||||
impl_froms!(AssocItem: Function, Const, TypeAlias);
|
impl_froms!(AssocItem: Function, Const, TypeAlias);
|
||||||
|
|
||||||
impl From<AssocItem> for crate::generics::GenericDef {
|
|
||||||
fn from(item: AssocItem) -> Self {
|
|
||||||
match item {
|
|
||||||
AssocItem::Function(f) => f.into(),
|
|
||||||
AssocItem::Const(c) => c.into(),
|
|
||||||
AssocItem::TypeAlias(t) => t.into(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl AssocItem {
|
impl AssocItem {
|
||||||
pub fn module(self, db: &impl DefDatabase) -> Module {
|
pub fn module(self, db: &impl DefDatabase) -> Module {
|
||||||
match self {
|
match self {
|
||||||
|
@ -1004,6 +993,39 @@ impl AssocItem {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)]
|
||||||
|
pub enum GenericDef {
|
||||||
|
Function(Function),
|
||||||
|
Adt(Adt),
|
||||||
|
Trait(Trait),
|
||||||
|
TypeAlias(TypeAlias),
|
||||||
|
ImplBlock(ImplBlock),
|
||||||
|
// enum variants cannot have generics themselves, but their parent enums
|
||||||
|
// can, and this makes some code easier to write
|
||||||
|
EnumVariant(EnumVariant),
|
||||||
|
// consts can have type parameters from their parents (i.e. associated consts of traits)
|
||||||
|
Const(Const),
|
||||||
|
}
|
||||||
|
impl_froms!(
|
||||||
|
GenericDef: Function,
|
||||||
|
Adt(Struct, Enum, Union),
|
||||||
|
Trait,
|
||||||
|
TypeAlias,
|
||||||
|
ImplBlock,
|
||||||
|
EnumVariant,
|
||||||
|
Const
|
||||||
|
);
|
||||||
|
|
||||||
|
impl From<AssocItem> for GenericDef {
|
||||||
|
fn from(item: AssocItem) -> Self {
|
||||||
|
match item {
|
||||||
|
AssocItem::Function(f) => f.into(),
|
||||||
|
AssocItem::Const(c) => c.into(),
|
||||||
|
AssocItem::TypeAlias(t) => t.into(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
|
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
|
||||||
pub struct Local {
|
pub struct Local {
|
||||||
pub(crate) parent: DefWithBody,
|
pub(crate) parent: DefWithBody,
|
||||||
|
|
|
@ -8,7 +8,6 @@ use ra_syntax::SmolStr;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
debug::HirDebugDatabase,
|
debug::HirDebugDatabase,
|
||||||
generics::GenericDef,
|
|
||||||
ids,
|
ids,
|
||||||
lang_item::{LangItemTarget, LangItems},
|
lang_item::{LangItemTarget, LangItems},
|
||||||
ty::{
|
ty::{
|
||||||
|
@ -18,8 +17,8 @@ use crate::{
|
||||||
TypeCtor,
|
TypeCtor,
|
||||||
},
|
},
|
||||||
type_alias::TypeAliasData,
|
type_alias::TypeAliasData,
|
||||||
Const, ConstData, Crate, DefWithBody, FnData, Function, ImplBlock, Module, Static, StructField,
|
Const, ConstData, Crate, DefWithBody, FnData, Function, GenericDef, ImplBlock, Module, Static,
|
||||||
Trait, TypeAlias,
|
StructField, Trait, TypeAlias,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub use hir_def::db::{
|
pub use hir_def::db::{
|
||||||
|
|
|
@ -9,8 +9,9 @@ use hir_def::{
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
ty::TypableDef, Adt, AssocItem, Const, Crate, DefWithBody, EnumVariant, Function, GenericDef,
|
ty::{CallableDef, TypableDef},
|
||||||
ModuleDef, Static, TypeAlias,
|
Adt, AssocItem, Const, Crate, DefWithBody, EnumVariant, Function, GenericDef, ModuleDef,
|
||||||
|
Static, TypeAlias,
|
||||||
};
|
};
|
||||||
|
|
||||||
impl From<ra_db::CrateId> for Crate {
|
impl From<ra_db::CrateId> for Crate {
|
||||||
|
@ -206,3 +207,15 @@ impl From<Adt> for GenericDefId {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<CallableDef> for GenericDefId {
|
||||||
|
fn from(def: CallableDef) -> Self {
|
||||||
|
match def {
|
||||||
|
CallableDef::Function(it) => it.id.into(),
|
||||||
|
CallableDef::Struct(it) => it.id.into(),
|
||||||
|
CallableDef::EnumVariant(it) => {
|
||||||
|
EnumVariantId { parent: it.parent.id, local_id: it.id }.into()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,54 +0,0 @@
|
||||||
//! Temp module to wrap hir_def::generics
|
|
||||||
use std::sync::Arc;
|
|
||||||
|
|
||||||
use crate::{
|
|
||||||
db::DefDatabase, Adt, Const, Container, Enum, EnumVariant, Function, ImplBlock, Struct, Trait,
|
|
||||||
TypeAlias, Union,
|
|
||||||
};
|
|
||||||
|
|
||||||
pub use hir_def::generics::{GenericParam, GenericParams, WherePredicate};
|
|
||||||
|
|
||||||
#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)]
|
|
||||||
pub enum GenericDef {
|
|
||||||
Function(Function),
|
|
||||||
Adt(Adt),
|
|
||||||
Trait(Trait),
|
|
||||||
TypeAlias(TypeAlias),
|
|
||||||
ImplBlock(ImplBlock),
|
|
||||||
// enum variants cannot have generics themselves, but their parent enums
|
|
||||||
// can, and this makes some code easier to write
|
|
||||||
EnumVariant(EnumVariant),
|
|
||||||
// consts can have type parameters from their parents (i.e. associated consts of traits)
|
|
||||||
Const(Const),
|
|
||||||
}
|
|
||||||
impl_froms!(
|
|
||||||
GenericDef: Function,
|
|
||||||
Adt(Struct, Enum, Union),
|
|
||||||
Trait,
|
|
||||||
TypeAlias,
|
|
||||||
ImplBlock,
|
|
||||||
EnumVariant,
|
|
||||||
Const
|
|
||||||
);
|
|
||||||
|
|
||||||
impl From<Container> for GenericDef {
|
|
||||||
fn from(c: Container) -> Self {
|
|
||||||
match c {
|
|
||||||
Container::Trait(trait_) => trait_.into(),
|
|
||||||
Container::ImplBlock(impl_block) => impl_block.into(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub trait HasGenericParams: Copy {
|
|
||||||
fn generic_params(self, db: &impl DefDatabase) -> Arc<GenericParams>;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T> HasGenericParams for T
|
|
||||||
where
|
|
||||||
T: Into<GenericDef> + Copy,
|
|
||||||
{
|
|
||||||
fn generic_params(self, db: &impl DefDatabase) -> Arc<GenericParams> {
|
|
||||||
db.generic_params(self.into().into())
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -37,7 +37,6 @@ mod ty;
|
||||||
mod impl_block;
|
mod impl_block;
|
||||||
mod expr;
|
mod expr;
|
||||||
mod lang_item;
|
mod lang_item;
|
||||||
pub mod generics;
|
|
||||||
pub mod diagnostics;
|
pub mod diagnostics;
|
||||||
mod util;
|
mod util;
|
||||||
|
|
||||||
|
@ -57,13 +56,12 @@ pub use crate::{
|
||||||
docs::{DocDef, Docs, Documentation},
|
docs::{DocDef, Docs, Documentation},
|
||||||
src::{HasBodySource, HasSource},
|
src::{HasBodySource, HasSource},
|
||||||
Adt, AssocItem, Const, ConstData, Container, Crate, CrateDependency, DefWithBody, Enum,
|
Adt, AssocItem, Const, ConstData, Container, Crate, CrateDependency, DefWithBody, Enum,
|
||||||
EnumVariant, FieldSource, FnData, Function, GenericParam, HasBody, ImplBlock, Local,
|
EnumVariant, FieldSource, FnData, Function, GenericDef, GenericParam, HasBody, ImplBlock,
|
||||||
MacroDef, Module, ModuleDef, ModuleSource, ScopeDef, Static, Struct, StructField, Trait,
|
Local, MacroDef, Module, ModuleDef, ModuleSource, ScopeDef, Static, Struct, StructField,
|
||||||
TypeAlias, Union, VariantDef,
|
Trait, TypeAlias, Union, VariantDef,
|
||||||
},
|
},
|
||||||
expr::ExprScopes,
|
expr::ExprScopes,
|
||||||
from_source::FromSource,
|
from_source::FromSource,
|
||||||
generics::GenericDef,
|
|
||||||
ids::{HirFileId, MacroCallId, MacroCallLoc, MacroDefId, MacroFile},
|
ids::{HirFileId, MacroCallId, MacroCallLoc, MacroDefId, MacroFile},
|
||||||
source_binder::{PathResolution, ScopeEntryWithSyntax, SourceAnalyzer},
|
source_binder::{PathResolution, ScopeEntryWithSyntax, SourceAnalyzer},
|
||||||
ty::{
|
ty::{
|
||||||
|
|
|
@ -17,12 +17,11 @@ use std::ops::Deref;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::{fmt, iter, mem};
|
use std::{fmt, iter, mem};
|
||||||
|
|
||||||
|
use hir_def::{generics::GenericParams, AdtId};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
db::HirDatabase,
|
db::HirDatabase, expr::ExprId, util::make_mut_slice, Adt, Crate, DefWithBody, FloatTy,
|
||||||
expr::ExprId,
|
GenericDef, IntTy, Mutability, Name, Trait, TypeAlias, Uncertain,
|
||||||
generics::{GenericParams, HasGenericParams},
|
|
||||||
util::make_mut_slice,
|
|
||||||
Adt, Crate, DefWithBody, FloatTy, IntTy, Mutability, Name, Trait, TypeAlias, Uncertain,
|
|
||||||
};
|
};
|
||||||
use display::{HirDisplay, HirFormatter};
|
use display::{HirDisplay, HirFormatter};
|
||||||
|
|
||||||
|
@ -131,15 +130,15 @@ impl TypeCtor {
|
||||||
| TypeCtor::Closure { .. } // 1 param representing the signature of the closure
|
| TypeCtor::Closure { .. } // 1 param representing the signature of the closure
|
||||||
=> 1,
|
=> 1,
|
||||||
TypeCtor::Adt(adt) => {
|
TypeCtor::Adt(adt) => {
|
||||||
let generic_params = adt.generic_params(db);
|
let generic_params = db.generic_params(AdtId::from(adt).into());
|
||||||
generic_params.count_params_including_parent()
|
generic_params.count_params_including_parent()
|
||||||
}
|
}
|
||||||
TypeCtor::FnDef(callable) => {
|
TypeCtor::FnDef(callable) => {
|
||||||
let generic_params = callable.generic_params(db);
|
let generic_params = db.generic_params(callable.into());
|
||||||
generic_params.count_params_including_parent()
|
generic_params.count_params_including_parent()
|
||||||
}
|
}
|
||||||
TypeCtor::AssociatedType(type_alias) => {
|
TypeCtor::AssociatedType(type_alias) => {
|
||||||
let generic_params = type_alias.generic_params(db);
|
let generic_params = db.generic_params(type_alias.id.into());
|
||||||
generic_params.count_params_including_parent()
|
generic_params.count_params_including_parent()
|
||||||
}
|
}
|
||||||
TypeCtor::FnPtr { num_args } => num_args as usize + 1,
|
TypeCtor::FnPtr { num_args } => num_args as usize + 1,
|
||||||
|
@ -168,7 +167,7 @@ impl TypeCtor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn as_generic_def(self) -> Option<crate::generics::GenericDef> {
|
pub fn as_generic_def(self) -> Option<crate::GenericDef> {
|
||||||
match self {
|
match self {
|
||||||
TypeCtor::Bool
|
TypeCtor::Bool
|
||||||
| TypeCtor::Char
|
| TypeCtor::Char
|
||||||
|
@ -348,8 +347,9 @@ impl Substs {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn build_for_def(db: &impl HirDatabase, def: impl HasGenericParams) -> SubstsBuilder {
|
pub fn build_for_def(db: &impl HirDatabase, def: impl Into<GenericDef>) -> SubstsBuilder {
|
||||||
let params = def.generic_params(db);
|
let def = def.into();
|
||||||
|
let params = db.generic_params(def.into());
|
||||||
let param_count = params.count_params_including_parent();
|
let param_count = params.count_params_including_parent();
|
||||||
Substs::builder(param_count)
|
Substs::builder(param_count)
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@ use hir_expand::name;
|
||||||
use log::{info, warn};
|
use log::{info, warn};
|
||||||
|
|
||||||
use super::{traits::Solution, Canonical, Substs, Ty, TypeWalk};
|
use super::{traits::Solution, Canonical, Substs, Ty, TypeWalk};
|
||||||
use crate::{db::HirDatabase, generics::HasGenericParams};
|
use crate::db::HirDatabase;
|
||||||
|
|
||||||
const AUTODEREF_RECURSION_LIMIT: usize = 10;
|
const AUTODEREF_RECURSION_LIMIT: usize = 10;
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ fn deref_by_trait(
|
||||||
};
|
};
|
||||||
let target = deref_trait.associated_type_by_name(db, &name::TARGET_TYPE)?;
|
let target = deref_trait.associated_type_by_name(db, &name::TARGET_TYPE)?;
|
||||||
|
|
||||||
let generic_params = target.generic_params(db);
|
let generic_params = db.generic_params(target.id.into());
|
||||||
if generic_params.count_params_including_parent() != 1 {
|
if generic_params.count_params_including_parent() != 1 {
|
||||||
// the Target type + Deref trait should only have one generic parameter,
|
// the Target type + Deref trait should only have one generic parameter,
|
||||||
// namely Deref's Self type
|
// namely Deref's Self type
|
||||||
|
|
|
@ -5,6 +5,7 @@ use std::sync::Arc;
|
||||||
|
|
||||||
use hir_def::{
|
use hir_def::{
|
||||||
builtin_type::Signedness,
|
builtin_type::Signedness,
|
||||||
|
generics::GenericParams,
|
||||||
path::{GenericArg, GenericArgs},
|
path::{GenericArg, GenericArgs},
|
||||||
resolver::resolver_for_expr,
|
resolver::resolver_for_expr,
|
||||||
};
|
};
|
||||||
|
@ -13,7 +14,6 @@ use hir_expand::name;
|
||||||
use crate::{
|
use crate::{
|
||||||
db::HirDatabase,
|
db::HirDatabase,
|
||||||
expr::{Array, BinaryOp, Expr, ExprId, Literal, Statement, UnaryOp},
|
expr::{Array, BinaryOp, Expr, ExprId, Literal, Statement, UnaryOp},
|
||||||
generics::{GenericParams, HasGenericParams},
|
|
||||||
ty::{
|
ty::{
|
||||||
autoderef, method_resolution, op, CallableDef, InferTy, IntTy, Mutability, Namespace,
|
autoderef, method_resolution, op, CallableDef, InferTy, IntTy, Mutability, Namespace,
|
||||||
Obligation, ProjectionPredicate, ProjectionTy, Substs, TraitRef, Ty, TypeCtor, TypeWalk,
|
Obligation, ProjectionPredicate, ProjectionTy, Substs, TraitRef, Ty, TypeCtor, TypeWalk,
|
||||||
|
@ -534,7 +534,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
|
||||||
(
|
(
|
||||||
ty,
|
ty,
|
||||||
self.db.type_for_def(func.into(), Namespace::Values),
|
self.db.type_for_def(func.into(), Namespace::Values),
|
||||||
Some(func.generic_params(self.db)),
|
Some(self.db.generic_params(func.id.into())),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
None => (receiver_ty, Ty::Unknown, None),
|
None => (receiver_ty, Ty::Unknown, None),
|
||||||
|
@ -645,7 +645,9 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
|
||||||
if let Some(trait_) = f.parent_trait(self.db) {
|
if let Some(trait_) = f.parent_trait(self.db) {
|
||||||
// construct a TraitDef
|
// construct a TraitDef
|
||||||
let substs = a_ty.parameters.prefix(
|
let substs = a_ty.parameters.prefix(
|
||||||
trait_.generic_params(self.db).count_params_including_parent(),
|
self.db
|
||||||
|
.generic_params(trait_.id.into())
|
||||||
|
.count_params_including_parent(),
|
||||||
);
|
);
|
||||||
self.obligations.push(Obligation::Trait(TraitRef { trait_, substs }));
|
self.obligations.push(Obligation::Trait(TraitRef { trait_, substs }));
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,6 @@ use hir_def::{
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
db::HirDatabase,
|
db::HirDatabase,
|
||||||
generics::HasGenericParams,
|
|
||||||
ty::{method_resolution, Namespace, Substs, Ty, TypableDef, TypeWalk},
|
ty::{method_resolution, Namespace, Substs, Ty, TypableDef, TypeWalk},
|
||||||
AssocItem, Container, Function, Name, Path,
|
AssocItem, Container, Function, Name, Path,
|
||||||
};
|
};
|
||||||
|
@ -230,7 +229,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
|
||||||
if let ValueNs::FunctionId(func) = def {
|
if let ValueNs::FunctionId(func) = def {
|
||||||
let func = Function::from(*func);
|
let func = Function::from(*func);
|
||||||
// We only do the infer if parent has generic params
|
// We only do the infer if parent has generic params
|
||||||
let gen = func.generic_params(self.db);
|
let gen = self.db.generic_params(func.id.into());
|
||||||
if gen.count_parent_params() == 0 {
|
if gen.count_parent_params() == 0 {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,10 +10,11 @@ use std::sync::Arc;
|
||||||
|
|
||||||
use hir_def::{
|
use hir_def::{
|
||||||
builtin_type::{BuiltinFloat, BuiltinInt, BuiltinType},
|
builtin_type::{BuiltinFloat, BuiltinInt, BuiltinType},
|
||||||
|
generics::WherePredicate,
|
||||||
path::{GenericArg, PathSegment},
|
path::{GenericArg, PathSegment},
|
||||||
resolver::{HasResolver, Resolver, TypeNs},
|
resolver::{HasResolver, Resolver, TypeNs},
|
||||||
type_ref::{TypeBound, TypeRef},
|
type_ref::{TypeBound, TypeRef},
|
||||||
GenericDefId,
|
AdtId, GenericDefId,
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
|
@ -22,15 +23,13 @@ use super::{
|
||||||
};
|
};
|
||||||
use crate::{
|
use crate::{
|
||||||
db::HirDatabase,
|
db::HirDatabase,
|
||||||
generics::HasGenericParams,
|
|
||||||
generics::{GenericDef, WherePredicate},
|
|
||||||
ty::{
|
ty::{
|
||||||
primitive::{FloatTy, IntTy, Uncertain},
|
primitive::{FloatTy, IntTy, Uncertain},
|
||||||
Adt,
|
Adt,
|
||||||
},
|
},
|
||||||
util::make_mut_slice,
|
util::make_mut_slice,
|
||||||
Const, Enum, EnumVariant, Function, ImplBlock, ModuleDef, Path, Static, Struct, StructField,
|
Const, Enum, EnumVariant, Function, GenericDef, ImplBlock, ModuleDef, Path, Static, Struct,
|
||||||
Trait, TypeAlias, Union, VariantDef,
|
StructField, Trait, TypeAlias, Union, VariantDef,
|
||||||
};
|
};
|
||||||
|
|
||||||
// FIXME: this is only really used in `type_for_def`, which contains a bunch of
|
// FIXME: this is only really used in `type_for_def`, which contains a bunch of
|
||||||
|
@ -342,7 +341,7 @@ pub(super) fn substs_from_path_segment(
|
||||||
add_self_param: bool,
|
add_self_param: bool,
|
||||||
) -> Substs {
|
) -> Substs {
|
||||||
let mut substs = Vec::new();
|
let mut substs = Vec::new();
|
||||||
let def_generics = def_generic.map(|def| def.generic_params(db));
|
let def_generics = def_generic.map(|def| db.generic_params(def.into()));
|
||||||
|
|
||||||
let (parent_param_count, param_count) =
|
let (parent_param_count, param_count) =
|
||||||
def_generics.map_or((0, 0), |g| (g.count_parent_params(), g.params.len()));
|
def_generics.map_or((0, 0), |g| (g.count_parent_params(), g.params.len()));
|
||||||
|
@ -443,7 +442,7 @@ impl TraitRef {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn for_trait(db: &impl HirDatabase, trait_: Trait) -> TraitRef {
|
pub(crate) fn for_trait(db: &impl HirDatabase, trait_: Trait) -> TraitRef {
|
||||||
let substs = Substs::identity(&trait_.generic_params(db));
|
let substs = Substs::identity(&db.generic_params(trait_.id.into()));
|
||||||
TraitRef { trait_, substs }
|
TraitRef { trait_, substs }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -611,7 +610,7 @@ pub(crate) fn generic_predicates_query(
|
||||||
/// Resolve the default type params from generics
|
/// Resolve the default type params from generics
|
||||||
pub(crate) fn generic_defaults_query(db: &impl HirDatabase, def: GenericDef) -> Substs {
|
pub(crate) fn generic_defaults_query(db: &impl HirDatabase, def: GenericDef) -> Substs {
|
||||||
let resolver = GenericDefId::from(def).resolver(db);
|
let resolver = GenericDefId::from(def).resolver(db);
|
||||||
let generic_params = def.generic_params(db);
|
let generic_params = db.generic_params(def.into());
|
||||||
|
|
||||||
let defaults = generic_params
|
let defaults = generic_params
|
||||||
.params_including_parent()
|
.params_including_parent()
|
||||||
|
@ -633,7 +632,7 @@ fn fn_sig_for_fn(db: &impl HirDatabase, def: Function) -> FnSig {
|
||||||
/// Build the declared type of a function. This should not need to look at the
|
/// Build the declared type of a function. This should not need to look at the
|
||||||
/// function body.
|
/// function body.
|
||||||
fn type_for_fn(db: &impl HirDatabase, def: Function) -> Ty {
|
fn type_for_fn(db: &impl HirDatabase, def: Function) -> Ty {
|
||||||
let generics = def.generic_params(db);
|
let generics = db.generic_params(def.id.into());
|
||||||
let substs = Substs::identity(&generics);
|
let substs = Substs::identity(&generics);
|
||||||
Ty::apply(TypeCtor::FnDef(def.into()), substs)
|
Ty::apply(TypeCtor::FnDef(def.into()), substs)
|
||||||
}
|
}
|
||||||
|
@ -716,7 +715,7 @@ fn type_for_struct_constructor(db: &impl HirDatabase, def: Struct) -> Ty {
|
||||||
if struct_data.variant_data.fields().is_none() {
|
if struct_data.variant_data.fields().is_none() {
|
||||||
return type_for_adt(db, def); // Unit struct
|
return type_for_adt(db, def); // Unit struct
|
||||||
}
|
}
|
||||||
let generics = def.generic_params(db);
|
let generics = db.generic_params(def.id.into());
|
||||||
let substs = Substs::identity(&generics);
|
let substs = Substs::identity(&generics);
|
||||||
Ty::apply(TypeCtor::FnDef(def.into()), substs)
|
Ty::apply(TypeCtor::FnDef(def.into()), substs)
|
||||||
}
|
}
|
||||||
|
@ -732,7 +731,7 @@ fn fn_sig_for_enum_variant_constructor(db: &impl HirDatabase, def: EnumVariant)
|
||||||
.iter()
|
.iter()
|
||||||
.map(|(_, field)| Ty::from_hir(db, &resolver, &field.type_ref))
|
.map(|(_, field)| Ty::from_hir(db, &resolver, &field.type_ref))
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
let generics = def.parent_enum(db).generic_params(db);
|
let generics = db.generic_params(def.parent_enum(db).id.into());
|
||||||
let substs = Substs::identity(&generics);
|
let substs = Substs::identity(&generics);
|
||||||
let ret = type_for_adt(db, def.parent_enum(db)).subst(&substs);
|
let ret = type_for_adt(db, def.parent_enum(db)).subst(&substs);
|
||||||
FnSig::from_params_and_return(params, ret)
|
FnSig::from_params_and_return(params, ret)
|
||||||
|
@ -744,18 +743,20 @@ fn type_for_enum_variant_constructor(db: &impl HirDatabase, def: EnumVariant) ->
|
||||||
if var_data.fields().is_none() {
|
if var_data.fields().is_none() {
|
||||||
return type_for_adt(db, def.parent_enum(db)); // Unit variant
|
return type_for_adt(db, def.parent_enum(db)); // Unit variant
|
||||||
}
|
}
|
||||||
let generics = def.parent_enum(db).generic_params(db);
|
let generics = db.generic_params(def.parent_enum(db).id.into());
|
||||||
let substs = Substs::identity(&generics);
|
let substs = Substs::identity(&generics);
|
||||||
Ty::apply(TypeCtor::FnDef(def.into()), substs)
|
Ty::apply(TypeCtor::FnDef(def.into()), substs)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn type_for_adt(db: &impl HirDatabase, adt: impl Into<Adt> + HasGenericParams) -> Ty {
|
fn type_for_adt(db: &impl HirDatabase, adt: impl Into<Adt>) -> Ty {
|
||||||
let generics = adt.generic_params(db);
|
let adt = adt.into();
|
||||||
Ty::apply(TypeCtor::Adt(adt.into()), Substs::identity(&generics))
|
let adt_id: AdtId = adt.into();
|
||||||
|
let generics = db.generic_params(adt_id.into());
|
||||||
|
Ty::apply(TypeCtor::Adt(adt), Substs::identity(&generics))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn type_for_type_alias(db: &impl HirDatabase, t: TypeAlias) -> Ty {
|
fn type_for_type_alias(db: &impl HirDatabase, t: TypeAlias) -> Ty {
|
||||||
let generics = t.generic_params(db);
|
let generics = db.generic_params(t.id.into());
|
||||||
let resolver = t.id.resolver(db);
|
let resolver = t.id.resolver(db);
|
||||||
let type_ref = t.type_ref(db);
|
let type_ref = t.type_ref(db);
|
||||||
let substs = Substs::identity(&generics);
|
let substs = Substs::identity(&generics);
|
||||||
|
|
|
@ -16,10 +16,9 @@ use ra_db::salsa::{InternId, InternKey};
|
||||||
use super::{AssocTyValue, Canonical, ChalkContext, Impl, Obligation};
|
use super::{AssocTyValue, Canonical, ChalkContext, Impl, Obligation};
|
||||||
use crate::{
|
use crate::{
|
||||||
db::HirDatabase,
|
db::HirDatabase,
|
||||||
generics::{GenericDef, HasGenericParams},
|
|
||||||
ty::display::HirDisplay,
|
ty::display::HirDisplay,
|
||||||
ty::{ApplicationTy, GenericPredicate, ProjectionTy, Substs, TraitRef, Ty, TypeCtor, TypeWalk},
|
ty::{ApplicationTy, GenericPredicate, ProjectionTy, Substs, TraitRef, Ty, TypeCtor, TypeWalk},
|
||||||
Crate, HasBody, ImplBlock, Trait, TypeAlias,
|
Crate, GenericDef, HasBody, ImplBlock, Trait, TypeAlias,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// This represents a trait whose name we could not resolve.
|
/// This represents a trait whose name we could not resolve.
|
||||||
|
@ -509,7 +508,7 @@ pub(crate) fn associated_ty_data_query(
|
||||||
Some(crate::Container::Trait(t)) => t,
|
Some(crate::Container::Trait(t)) => t,
|
||||||
_ => panic!("associated type not in trait"),
|
_ => panic!("associated type not in trait"),
|
||||||
};
|
};
|
||||||
let generic_params = type_alias.generic_params(db);
|
let generic_params = db.generic_params(type_alias.id.into());
|
||||||
let bound_data = chalk_rust_ir::AssociatedTyDatumBound {
|
let bound_data = chalk_rust_ir::AssociatedTyDatumBound {
|
||||||
// FIXME add bounds and where clauses
|
// FIXME add bounds and where clauses
|
||||||
bounds: vec![],
|
bounds: vec![],
|
||||||
|
@ -550,7 +549,7 @@ pub(crate) fn trait_datum_query(
|
||||||
}
|
}
|
||||||
let trait_: Trait = from_chalk(db, trait_id);
|
let trait_: Trait = from_chalk(db, trait_id);
|
||||||
debug!("trait {:?} = {:?}", trait_id, trait_.name(db));
|
debug!("trait {:?} = {:?}", trait_id, trait_.name(db));
|
||||||
let generic_params = trait_.generic_params(db);
|
let generic_params = db.generic_params(trait_.id.into());
|
||||||
let bound_vars = Substs::bound_vars(&generic_params);
|
let bound_vars = Substs::bound_vars(&generic_params);
|
||||||
let flags = chalk_rust_ir::TraitFlags {
|
let flags = chalk_rust_ir::TraitFlags {
|
||||||
auto: trait_.is_auto(db),
|
auto: trait_.is_auto(db),
|
||||||
|
@ -594,7 +593,7 @@ pub(crate) fn struct_datum_query(
|
||||||
let where_clauses = type_ctor
|
let where_clauses = type_ctor
|
||||||
.as_generic_def()
|
.as_generic_def()
|
||||||
.map(|generic_def| {
|
.map(|generic_def| {
|
||||||
let generic_params = generic_def.generic_params(db);
|
let generic_params = db.generic_params(generic_def.into());
|
||||||
let bound_vars = Substs::bound_vars(&generic_params);
|
let bound_vars = Substs::bound_vars(&generic_params);
|
||||||
convert_where_clauses(db, generic_def, &bound_vars)
|
convert_where_clauses(db, generic_def, &bound_vars)
|
||||||
})
|
})
|
||||||
|
@ -634,7 +633,7 @@ fn impl_block_datum(
|
||||||
impl_id: ImplId,
|
impl_id: ImplId,
|
||||||
impl_block: ImplBlock,
|
impl_block: ImplBlock,
|
||||||
) -> Option<Arc<ImplDatum<ChalkIr>>> {
|
) -> Option<Arc<ImplDatum<ChalkIr>>> {
|
||||||
let generic_params = impl_block.generic_params(db);
|
let generic_params = db.generic_params(impl_block.id.into());
|
||||||
let bound_vars = Substs::bound_vars(&generic_params);
|
let bound_vars = Substs::bound_vars(&generic_params);
|
||||||
let trait_ref = impl_block.target_trait_ref(db)?.subst(&bound_vars);
|
let trait_ref = impl_block.target_trait_ref(db)?.subst(&bound_vars);
|
||||||
let trait_ = trait_ref.trait_;
|
let trait_ = trait_ref.trait_;
|
||||||
|
@ -786,7 +785,7 @@ fn type_alias_associated_ty_value(
|
||||||
let assoc_ty = trait_
|
let assoc_ty = trait_
|
||||||
.associated_type_by_name(db, &type_alias.name(db))
|
.associated_type_by_name(db, &type_alias.name(db))
|
||||||
.expect("assoc ty value should not exist"); // validated when building the impl data as well
|
.expect("assoc ty value should not exist"); // validated when building the impl data as well
|
||||||
let generic_params = impl_block.generic_params(db);
|
let generic_params = db.generic_params(impl_block.id.into());
|
||||||
let bound_vars = Substs::bound_vars(&generic_params);
|
let bound_vars = Substs::bound_vars(&generic_params);
|
||||||
let ty = db.type_for_def(type_alias.into(), crate::ty::Namespace::Types).subst(&bound_vars);
|
let ty = db.type_for_def(type_alias.into(), crate::ty::Namespace::Types).subst(&bound_vars);
|
||||||
let value_bound = chalk_rust_ir::AssociatedTyValueBound { ty: ty.to_chalk(db) };
|
let value_bound = chalk_rust_ir::AssociatedTyValueBound { ty: ty.to_chalk(db) };
|
||||||
|
|
|
@ -18,7 +18,7 @@ use crate::{
|
||||||
path::{Path, PathKind},
|
path::{Path, PathKind},
|
||||||
AdtId, AstItemDef, ConstId, ContainerId, CrateModuleId, DefWithBodyId, EnumId, EnumVariantId,
|
AdtId, AstItemDef, ConstId, ContainerId, CrateModuleId, DefWithBodyId, EnumId, EnumVariantId,
|
||||||
FunctionId, GenericDefId, ImplId, Lookup, ModuleDefId, ModuleId, StaticId, StructId, TraitId,
|
FunctionId, GenericDefId, ImplId, Lookup, ModuleDefId, ModuleId, StaticId, StructId, TraitId,
|
||||||
TypeAliasId, UnionId,
|
TypeAliasId,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Debug, Clone, Default)]
|
#[derive(Debug, Clone, Default)]
|
||||||
|
@ -369,47 +369,6 @@ impl Resolver {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Resolver {
|
|
||||||
pub(crate) fn push_scope(mut self, scope: Scope) -> Resolver {
|
|
||||||
self.scopes.push(scope);
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn push_generic_params_scope(
|
|
||||||
self,
|
|
||||||
db: &impl DefDatabase2,
|
|
||||||
def: GenericDefId,
|
|
||||||
) -> Resolver {
|
|
||||||
let params = db.generic_params(def);
|
|
||||||
if params.params.is_empty() {
|
|
||||||
self
|
|
||||||
} else {
|
|
||||||
self.push_scope(Scope::GenericParams { def, params })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn push_impl_block_scope(self, impl_block: ImplId) -> Resolver {
|
|
||||||
self.push_scope(Scope::ImplBlockScope(impl_block))
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn push_module_scope(
|
|
||||||
self,
|
|
||||||
crate_def_map: Arc<CrateDefMap>,
|
|
||||||
module_id: CrateModuleId,
|
|
||||||
) -> Resolver {
|
|
||||||
self.push_scope(Scope::ModuleScope(ModuleItemMap { crate_def_map, module_id }))
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn push_expr_scope(
|
|
||||||
self,
|
|
||||||
owner: DefWithBodyId,
|
|
||||||
expr_scopes: Arc<ExprScopes>,
|
|
||||||
scope_id: ScopeId,
|
|
||||||
) -> Resolver {
|
|
||||||
self.push_scope(Scope::ExprScope(ExprScope { owner, expr_scopes, scope_id }))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub enum ScopeDef {
|
pub enum ScopeDef {
|
||||||
PerNs(PerNs),
|
PerNs(PerNs),
|
||||||
ImplSelfType(ImplId),
|
ImplSelfType(ImplId),
|
||||||
|
@ -489,6 +448,43 @@ pub fn resolver_for_scope(
|
||||||
r
|
r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Resolver {
|
||||||
|
fn push_scope(mut self, scope: Scope) -> Resolver {
|
||||||
|
self.scopes.push(scope);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
fn push_generic_params_scope(self, db: &impl DefDatabase2, def: GenericDefId) -> Resolver {
|
||||||
|
let params = db.generic_params(def);
|
||||||
|
if params.params.is_empty() {
|
||||||
|
self
|
||||||
|
} else {
|
||||||
|
self.push_scope(Scope::GenericParams { def, params })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn push_impl_block_scope(self, impl_block: ImplId) -> Resolver {
|
||||||
|
self.push_scope(Scope::ImplBlockScope(impl_block))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn push_module_scope(
|
||||||
|
self,
|
||||||
|
crate_def_map: Arc<CrateDefMap>,
|
||||||
|
module_id: CrateModuleId,
|
||||||
|
) -> Resolver {
|
||||||
|
self.push_scope(Scope::ModuleScope(ModuleItemMap { crate_def_map, module_id }))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn push_expr_scope(
|
||||||
|
self,
|
||||||
|
owner: DefWithBodyId,
|
||||||
|
expr_scopes: Arc<ExprScopes>,
|
||||||
|
scope_id: ScopeId,
|
||||||
|
) -> Resolver {
|
||||||
|
self.push_scope(Scope::ExprScope(ExprScope { owner, expr_scopes, scope_id }))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub trait HasResolver {
|
pub trait HasResolver {
|
||||||
/// Builds a resolver for type references inside this def.
|
/// Builds a resolver for type references inside this def.
|
||||||
fn resolver(self, db: &impl DefDatabase2) -> Resolver;
|
fn resolver(self, db: &impl DefDatabase2) -> Resolver;
|
||||||
|
@ -507,9 +503,10 @@ impl HasResolver for TraitId {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl HasResolver for AdtId {
|
impl<T: Into<AdtId>> HasResolver for T {
|
||||||
fn resolver(self, db: &impl DefDatabase2) -> Resolver {
|
fn resolver(self, db: &impl DefDatabase2) -> Resolver {
|
||||||
let module = match self {
|
let def = self.into();
|
||||||
|
let module = match def {
|
||||||
AdtId::StructId(it) => it.0.module(db),
|
AdtId::StructId(it) => it.0.module(db),
|
||||||
AdtId::UnionId(it) => it.0.module(db),
|
AdtId::UnionId(it) => it.0.module(db),
|
||||||
AdtId::EnumId(it) => it.module(db),
|
AdtId::EnumId(it) => it.module(db),
|
||||||
|
@ -517,26 +514,8 @@ impl HasResolver for AdtId {
|
||||||
|
|
||||||
module
|
module
|
||||||
.resolver(db)
|
.resolver(db)
|
||||||
.push_generic_params_scope(db, self.into())
|
.push_generic_params_scope(db, def.into())
|
||||||
.push_scope(Scope::AdtScope(self.into()))
|
.push_scope(Scope::AdtScope(def))
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl HasResolver for StructId {
|
|
||||||
fn resolver(self, db: &impl DefDatabase2) -> Resolver {
|
|
||||||
AdtId::from(self).resolver(db)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl HasResolver for UnionId {
|
|
||||||
fn resolver(self, db: &impl DefDatabase2) -> Resolver {
|
|
||||||
AdtId::from(self).resolver(db)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl HasResolver for EnumId {
|
|
||||||
fn resolver(self, db: &impl DefDatabase2) -> Resolver {
|
|
||||||
AdtId::from(self).resolver(db)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue