Skip to content

Commit a875795

Browse files
committed
Move Ty
1 parent 3686530 commit a875795

36 files changed

+1602
-1515
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/ra_hir/src/code_model.rs

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@ use std::sync::Arc;
66

77
use hir_def::{
88
adt::VariantData,
9+
body::{Body, BodySourceMap},
910
builtin_type::BuiltinType,
1011
docs::Documentation,
12+
expr::{BindingAnnotation, Pat, PatId},
1113
per_ns::PerNs,
1214
resolver::HasResolver,
1315
type_ref::{Mutability, TypeRef},
@@ -20,12 +22,12 @@ use hir_expand::{
2022
name::{self, AsName},
2123
AstId, MacroDefId,
2224
};
25+
use hir_ty::expr::ExprValidator;
2326
use ra_db::{CrateId, Edition, FileId, FilePosition};
2427
use ra_syntax::{ast, AstNode, SyntaxNode};
2528

2629
use crate::{
2730
db::{DefDatabase, HirDatabase},
28-
expr::{BindingAnnotation, Body, BodySourceMap, ExprValidator, Pat, PatId},
2931
ty::display::HirFormatter,
3032
ty::{
3133
self, InEnvironment, InferenceResult, TraitEnvironment, TraitRef, Ty, TyDefId, TypeCtor,
@@ -353,8 +355,8 @@ impl Struct {
353355
.map(|(id, _)| StructField { parent: self.into(), id })
354356
}
355357

356-
pub fn ty(self, db: &impl HirDatabase) -> Ty {
357-
db.ty(self.id.into())
358+
pub fn ty(self, db: &impl HirDatabase) -> Type {
359+
Type::from_def(db, self.id.module(db).krate, self.id)
358360
}
359361

360362
pub fn constructor_ty(self, db: &impl HirDatabase) -> Ty {
@@ -380,8 +382,8 @@ impl Union {
380382
Module { id: self.id.module(db) }
381383
}
382384

383-
pub fn ty(self, db: &impl HirDatabase) -> Ty {
384-
db.ty(self.id.into())
385+
pub fn ty(self, db: &impl HirDatabase) -> Type {
386+
Type::from_def(db, self.id.module(db).krate, self.id)
385387
}
386388

387389
pub fn fields(self, db: &impl HirDatabase) -> Vec<StructField> {
@@ -441,8 +443,8 @@ impl Enum {
441443
.map(|(id, _)| EnumVariant { parent: self, id })
442444
}
443445

444-
pub fn ty(self, db: &impl HirDatabase) -> Ty {
445-
db.ty(self.id.into())
446+
pub fn ty(self, db: &impl HirDatabase) -> Type {
447+
Type::from_def(db, self.id.module(db).krate, self.id)
446448
}
447449
}
448450

@@ -640,7 +642,7 @@ impl Function {
640642
pub fn diagnostics(self, db: &impl HirDatabase, sink: &mut DiagnosticSink) {
641643
let infer = self.infer(db);
642644
infer.add_diagnostics(db, self.id, sink);
643-
let mut validator = ExprValidator::new(self, infer, sink);
645+
let mut validator = ExprValidator::new(self.id, infer, sink);
644646
validator.validate_body(db);
645647
}
646648
}
@@ -946,13 +948,12 @@ impl ImplBlock {
946948
db.impl_data(self.id).target_type.clone()
947949
}
948950

949-
pub fn target_ty(&self, db: &impl HirDatabase) -> Ty {
950-
Ty::from_hir(db, &self.id.resolver(db), &self.target_type(db))
951-
}
952-
953-
pub fn target_trait_ref(&self, db: &impl HirDatabase) -> Option<TraitRef> {
954-
let target_ty = self.target_ty(db);
955-
TraitRef::from_hir(db, &self.id.resolver(db), &self.target_trait(db)?, Some(target_ty))
951+
pub fn target_ty(&self, db: &impl HirDatabase) -> Type {
952+
let impl_data = db.impl_data(self.id);
953+
let resolver = self.id.resolver(db);
954+
let environment = TraitEnvironment::lower(db, &resolver);
955+
let ty = Ty::from_hir(db, &resolver, &impl_data.target_type);
956+
Type { krate: self.id.module(db).krate, ty: InEnvironment { value: ty, environment } }
956957
}
957958

958959
pub fn items(&self, db: &impl DefDatabase) -> Vec<AssocItem> {
@@ -1130,6 +1131,22 @@ impl Type {
11301131
Some(adt.into())
11311132
}
11321133

1134+
// FIXME: provide required accessors such that it becomes implementable from outside.
1135+
pub fn is_equal_for_find_impls(&self, other: &Type) -> bool {
1136+
match (&self.ty.value, &other.ty.value) {
1137+
(Ty::Apply(a_original_ty), Ty::Apply(ty::ApplicationTy { ctor, parameters })) => {
1138+
match ctor {
1139+
TypeCtor::Ref(..) => match parameters.as_single() {
1140+
Ty::Apply(a_ty) => a_original_ty.ctor == a_ty.ctor,
1141+
_ => false,
1142+
},
1143+
_ => a_original_ty.ctor == *ctor,
1144+
}
1145+
}
1146+
_ => false,
1147+
}
1148+
}
1149+
11331150
fn derived(&self, ty: Ty) -> Type {
11341151
Type {
11351152
krate: self.krate,

crates/ra_hir/src/db.rs

Lines changed: 6 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,5 @@
11
//! FIXME: write short doc here
22
3-
use std::sync::Arc;
4-
5-
use hir_def::{DefWithBodyId, GenericDefId, ImplId, LocalStructFieldId, TraitId, VariantId};
6-
use ra_arena::map::ArenaMap;
7-
use ra_db::{salsa, CrateId};
8-
9-
use crate::ty::{
10-
method_resolution::CrateImplBlocks,
11-
traits::{AssocTyValue, Impl},
12-
CallableDef, FnSig, GenericPredicate, InferenceResult, Substs, Ty, TyDefId, TypeCtor,
13-
ValueTyDefId,
14-
};
15-
163
pub use hir_def::db::{
174
BodyQuery, BodyWithSourceMapQuery, ConstDataQuery, CrateDefMapQuery, CrateLangItemsQuery,
185
DefDatabase, DefDatabaseStorage, DocumentationQuery, EnumDataQuery, ExprScopesQuery,
@@ -24,104 +11,12 @@ pub use hir_expand::db::{
2411
AstDatabase, AstDatabaseStorage, AstIdMapQuery, MacroArgQuery, MacroDefQuery, MacroExpandQuery,
2512
ParseMacroQuery,
2613
};
27-
28-
#[salsa::query_group(HirDatabaseStorage)]
29-
#[salsa::requires(salsa::Database)]
30-
pub trait HirDatabase: DefDatabase {
31-
#[salsa::invoke(crate::ty::infer_query)]
32-
fn infer(&self, def: DefWithBodyId) -> Arc<InferenceResult>;
33-
34-
#[salsa::invoke(crate::ty::ty_query)]
35-
fn ty(&self, def: TyDefId) -> Ty;
36-
37-
#[salsa::invoke(crate::ty::value_ty_query)]
38-
fn value_ty(&self, def: ValueTyDefId) -> Ty;
39-
40-
#[salsa::invoke(crate::ty::field_types_query)]
41-
fn field_types(&self, var: VariantId) -> Arc<ArenaMap<LocalStructFieldId, Ty>>;
42-
43-
#[salsa::invoke(crate::ty::callable_item_sig)]
44-
fn callable_item_signature(&self, def: CallableDef) -> FnSig;
45-
46-
#[salsa::invoke(crate::ty::generic_predicates_for_param_query)]
47-
fn generic_predicates_for_param(
48-
&self,
49-
def: GenericDefId,
50-
param_idx: u32,
51-
) -> Arc<[GenericPredicate]>;
52-
53-
#[salsa::invoke(crate::ty::generic_predicates_query)]
54-
fn generic_predicates(&self, def: GenericDefId) -> Arc<[GenericPredicate]>;
55-
56-
#[salsa::invoke(crate::ty::generic_defaults_query)]
57-
fn generic_defaults(&self, def: GenericDefId) -> Substs;
58-
59-
#[salsa::invoke(crate::ty::method_resolution::CrateImplBlocks::impls_in_crate_query)]
60-
fn impls_in_crate(&self, krate: CrateId) -> Arc<CrateImplBlocks>;
61-
62-
#[salsa::invoke(crate::ty::traits::impls_for_trait_query)]
63-
fn impls_for_trait(&self, krate: CrateId, trait_: TraitId) -> Arc<[ImplId]>;
64-
65-
/// This provides the Chalk trait solver instance. Because Chalk always
66-
/// works from a specific crate, this query is keyed on the crate; and
67-
/// because Chalk does its own internal caching, the solver is wrapped in a
68-
/// Mutex and the query does an untracked read internally, to make sure the
69-
/// cached state is thrown away when input facts change.
70-
#[salsa::invoke(crate::ty::traits::trait_solver_query)]
71-
fn trait_solver(&self, krate: CrateId) -> crate::ty::traits::TraitSolver;
72-
73-
// Interned IDs for Chalk integration
74-
#[salsa::interned]
75-
fn intern_type_ctor(&self, type_ctor: TypeCtor) -> crate::ty::TypeCtorId;
76-
#[salsa::interned]
77-
fn intern_chalk_impl(&self, impl_: Impl) -> crate::ty::traits::GlobalImplId;
78-
#[salsa::interned]
79-
fn intern_assoc_ty_value(
80-
&self,
81-
assoc_ty_value: AssocTyValue,
82-
) -> crate::ty::traits::AssocTyValueId;
83-
84-
#[salsa::invoke(crate::ty::traits::chalk::associated_ty_data_query)]
85-
fn associated_ty_data(
86-
&self,
87-
id: chalk_ir::TypeId,
88-
) -> Arc<chalk_rust_ir::AssociatedTyDatum<chalk_ir::family::ChalkIr>>;
89-
90-
#[salsa::invoke(crate::ty::traits::chalk::trait_datum_query)]
91-
fn trait_datum(
92-
&self,
93-
krate: CrateId,
94-
trait_id: chalk_ir::TraitId,
95-
) -> Arc<chalk_rust_ir::TraitDatum<chalk_ir::family::ChalkIr>>;
96-
97-
#[salsa::invoke(crate::ty::traits::chalk::struct_datum_query)]
98-
fn struct_datum(
99-
&self,
100-
krate: CrateId,
101-
struct_id: chalk_ir::StructId,
102-
) -> Arc<chalk_rust_ir::StructDatum<chalk_ir::family::ChalkIr>>;
103-
104-
#[salsa::invoke(crate::ty::traits::chalk::impl_datum_query)]
105-
fn impl_datum(
106-
&self,
107-
krate: CrateId,
108-
impl_id: chalk_ir::ImplId,
109-
) -> Arc<chalk_rust_ir::ImplDatum<chalk_ir::family::ChalkIr>>;
110-
111-
#[salsa::invoke(crate::ty::traits::chalk::associated_ty_value_query)]
112-
fn associated_ty_value(
113-
&self,
114-
krate: CrateId,
115-
id: chalk_rust_ir::AssociatedTyValueId,
116-
) -> Arc<chalk_rust_ir::AssociatedTyValue<chalk_ir::family::ChalkIr>>;
117-
118-
#[salsa::invoke(crate::ty::traits::trait_solve_query)]
119-
fn trait_solve(
120-
&self,
121-
krate: CrateId,
122-
goal: crate::ty::Canonical<crate::ty::InEnvironment<crate::ty::Obligation>>,
123-
) -> Option<crate::ty::traits::Solution>;
124-
}
14+
pub use hir_ty::db::{
15+
AssociatedTyDataQuery, CallableItemSignatureQuery, FieldTypesQuery, GenericDefaultsQuery,
16+
GenericPredicatesQuery, HirDatabase, HirDatabaseStorage, ImplDatumQuery, ImplsForTraitQuery,
17+
ImplsInCrateQuery, InferQuery, StructDatumQuery, TraitDatumQuery, TraitSolveQuery, TyQuery,
18+
ValueTyQuery,
19+
};
12520

12621
#[test]
12722
fn hir_database_is_object_safe() {

crates/ra_hir/src/diagnostics.rs

Lines changed: 1 addition & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -1,93 +1,4 @@
11
//! FIXME: write short doc here
2-
3-
use std::any::Any;
4-
5-
use hir_expand::HirFileId;
6-
use ra_syntax::{ast, AstNode, AstPtr, SyntaxNodePtr};
7-
8-
use crate::{db::AstDatabase, Name, Source};
9-
102
pub use hir_def::diagnostics::UnresolvedModule;
113
pub use hir_expand::diagnostics::{AstDiagnostic, Diagnostic, DiagnosticSink};
12-
13-
#[derive(Debug)]
14-
pub struct NoSuchField {
15-
pub file: HirFileId,
16-
pub field: AstPtr<ast::RecordField>,
17-
}
18-
19-
impl Diagnostic for NoSuchField {
20-
fn message(&self) -> String {
21-
"no such field".to_string()
22-
}
23-
24-
fn source(&self) -> Source<SyntaxNodePtr> {
25-
Source { file_id: self.file, value: self.field.into() }
26-
}
27-
28-
fn as_any(&self) -> &(dyn Any + Send + 'static) {
29-
self
30-
}
31-
}
32-
33-
#[derive(Debug)]
34-
pub struct MissingFields {
35-
pub file: HirFileId,
36-
pub field_list: AstPtr<ast::RecordFieldList>,
37-
pub missed_fields: Vec<Name>,
38-
}
39-
40-
impl Diagnostic for MissingFields {
41-
fn message(&self) -> String {
42-
use std::fmt::Write;
43-
let mut message = String::from("Missing structure fields:\n");
44-
for field in &self.missed_fields {
45-
write!(message, "- {}\n", field).unwrap();
46-
}
47-
message
48-
}
49-
fn source(&self) -> Source<SyntaxNodePtr> {
50-
Source { file_id: self.file, value: self.field_list.into() }
51-
}
52-
fn as_any(&self) -> &(dyn Any + Send + 'static) {
53-
self
54-
}
55-
}
56-
57-
impl AstDiagnostic for MissingFields {
58-
type AST = ast::RecordFieldList;
59-
60-
fn ast(&self, db: &impl AstDatabase) -> Self::AST {
61-
let root = db.parse_or_expand(self.source().file_id).unwrap();
62-
let node = self.source().value.to_node(&root);
63-
ast::RecordFieldList::cast(node).unwrap()
64-
}
65-
}
66-
67-
#[derive(Debug)]
68-
pub struct MissingOkInTailExpr {
69-
pub file: HirFileId,
70-
pub expr: AstPtr<ast::Expr>,
71-
}
72-
73-
impl Diagnostic for MissingOkInTailExpr {
74-
fn message(&self) -> String {
75-
"wrap return expression in Ok".to_string()
76-
}
77-
fn source(&self) -> Source<SyntaxNodePtr> {
78-
Source { file_id: self.file, value: self.expr.into() }
79-
}
80-
fn as_any(&self) -> &(dyn Any + Send + 'static) {
81-
self
82-
}
83-
}
84-
85-
impl AstDiagnostic for MissingOkInTailExpr {
86-
type AST = ast::Expr;
87-
88-
fn ast(&self, db: &impl AstDatabase) -> Self::AST {
89-
let root = db.parse_or_expand(self.file).unwrap();
90-
let node = self.source().value.to_node(&root);
91-
ast::Expr::cast(node).unwrap()
92-
}
93-
}
4+
pub use hir_ty::diagnostics::{MissingFields, MissingOkInTailExpr, NoSuchField};

crates/ra_hir/src/lib.rs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,28 +32,20 @@ pub mod db;
3232
pub mod source_binder;
3333

3434
mod ty;
35-
mod expr;
3635
pub mod diagnostics;
37-
mod util;
3836

3937
mod from_id;
4038
mod code_model;
4139

4240
pub mod from_source;
4341

44-
#[cfg(test)]
45-
mod test_db;
46-
#[cfg(test)]
47-
mod marks;
48-
4942
pub use crate::{
5043
code_model::{
5144
src::HasSource, Adt, AssocItem, AttrDef, Const, Container, Crate, CrateDependency,
5245
DefWithBody, Docs, Enum, EnumVariant, FieldSource, Function, GenericDef, GenericParam,
5346
HasAttrs, ImplBlock, Import, Local, MacroDef, Module, ModuleDef, ModuleSource, ScopeDef,
5447
Static, Struct, StructField, Trait, Type, TypeAlias, Union, VariantDef,
5548
},
56-
expr::ExprScopes,
5749
from_source::FromSource,
5850
source_binder::{PathResolution, ScopeEntryWithSyntax, SourceAnalyzer},
5951
ty::{
@@ -64,6 +56,7 @@ pub use crate::{
6456
};
6557

6658
pub use hir_def::{
59+
body::scope::ExprScopes,
6760
builtin_type::BuiltinType,
6861
docs::Documentation,
6962
path::{Path, PathKind},

0 commit comments

Comments
 (0)