Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide/src/lib.rs')
-rw-r--r--crates/ide/src/lib.rs45
1 files changed, 34 insertions, 11 deletions
diff --git a/crates/ide/src/lib.rs b/crates/ide/src/lib.rs
index 2609457573..930eaf2262 100644
--- a/crates/ide/src/lib.rs
+++ b/crates/ide/src/lib.rs
@@ -67,13 +67,13 @@ use ide_db::{
FxHashMap, FxIndexSet, LineIndexDatabase,
base_db::{
CrateOrigin, CrateWorkspaceData, Env, FileSet, RootQueryDb, SourceDatabase, VfsPath,
- salsa::Cancelled,
+ salsa::{Cancelled, Database},
},
prime_caches, symbol_index,
};
use ide_db::{MiniCore, ra_fixture::RaFixtureAnalysis};
use macros::UpmapFromRaFixture;
-use syntax::{SourceFile, ast};
+use syntax::{AstNode, SourceFile, ast};
use triomphe::Arc;
use view_memory_layout::{RecursiveMemoryLayout, view_memory_layout};
@@ -199,8 +199,13 @@ impl AnalysisHost {
pub fn per_query_memory_usage(&mut self) -> Vec<(String, profile::Bytes, usize)> {
self.db.per_query_memory_usage()
}
- pub fn request_cancellation(&mut self) {
- self.db.request_cancellation();
+ pub fn trigger_cancellation(&mut self) {
+ self.db.trigger_cancellation();
+ }
+ pub fn trigger_garbage_collection(&mut self) {
+ self.db.trigger_lru_eviction();
+ // SAFETY: `trigger_lru_eviction` triggers cancellation, so all running queries were canceled.
+ unsafe { hir::collect_ty_garbage() };
}
pub fn raw_database(&self) -> &RootDatabase {
&self.db
@@ -254,6 +259,7 @@ impl Analysis {
TryFrom::try_from(&*std::env::current_dir().unwrap().as_path().to_string_lossy())
.unwrap(),
);
+ let crate_attrs = Vec::new();
cfg_options.insert_atom(sym::test);
crate_graph.add_crate_root(
file_id,
@@ -264,6 +270,7 @@ impl Analysis {
None,
Env::default(),
CrateOrigin::Local { repo: None, name: None },
+ crate_attrs,
false,
proc_macro_cwd,
Arc::new(CrateWorkspaceData {
@@ -332,7 +339,8 @@ impl Analysis {
pub fn parse(&self, file_id: FileId) -> Cancellable<SourceFile> {
// FIXME edition
self.with_db(|db| {
- let editioned_file_id_wrapper = EditionedFileId::current_edition(&self.db, file_id);
+ let editioned_file_id_wrapper =
+ EditionedFileId::current_edition_guess_origin(&self.db, file_id);
db.parse(editioned_file_id_wrapper).tree()
})
@@ -361,7 +369,7 @@ impl Analysis {
/// supported).
pub fn matching_brace(&self, position: FilePosition) -> Cancellable<Option<TextSize>> {
self.with_db(|db| {
- let file_id = EditionedFileId::current_edition(&self.db, position.file_id);
+ let file_id = EditionedFileId::current_edition_guess_origin(&self.db, position.file_id);
let parse = db.parse(file_id);
let file = parse.tree();
matching_brace::matching_brace(&file, position.offset)
@@ -422,7 +430,7 @@ impl Analysis {
pub fn join_lines(&self, config: &JoinLinesConfig, frange: FileRange) -> Cancellable<TextEdit> {
self.with_db(|db| {
let editioned_file_id_wrapper =
- EditionedFileId::current_edition(&self.db, frange.file_id);
+ EditionedFileId::current_edition_guess_origin(&self.db, frange.file_id);
let parse = db.parse(editioned_file_id_wrapper);
join_lines::join_lines(config, &parse.tree(), frange.range)
})
@@ -463,7 +471,8 @@ impl Analysis {
) -> Cancellable<Vec<StructureNode>> {
// FIXME: Edition
self.with_db(|db| {
- let editioned_file_id_wrapper = EditionedFileId::current_edition(&self.db, file_id);
+ let editioned_file_id_wrapper =
+ EditionedFileId::current_edition_guess_origin(&self.db, file_id);
let source_file = db.parse(editioned_file_id_wrapper).tree();
file_structure::file_structure(&source_file, config)
})
@@ -494,7 +503,8 @@ impl Analysis {
/// Returns the set of folding ranges.
pub fn folding_ranges(&self, file_id: FileId) -> Cancellable<Vec<Fold>> {
self.with_db(|db| {
- let editioned_file_id_wrapper = EditionedFileId::current_edition(&self.db, file_id);
+ let editioned_file_id_wrapper =
+ EditionedFileId::current_edition_guess_origin(&self.db, file_id);
folding_ranges::folding_ranges(&db.parse(editioned_file_id_wrapper).tree())
})
@@ -642,7 +652,7 @@ impl Analysis {
/// Returns crates that this file belongs to.
pub fn transitive_rev_deps(&self, crate_id: Crate) -> Cancellable<Vec<Crate>> {
- self.with_db(|db| Vec::from_iter(db.transitive_rev_deps(crate_id)))
+ self.with_db(|db| Vec::from_iter(crate_id.transitive_rev_deps(db)))
}
/// Returns crates that this file *might* belong to.
@@ -848,8 +858,9 @@ impl Analysis {
&self,
file_id: FileId,
new_name_stem: &str,
+ config: &RenameConfig,
) -> Cancellable<Option<SourceChange>> {
- self.with_db(|db| rename::will_rename_file(db, file_id, new_name_stem))
+ self.with_db(|db| rename::will_rename_file(db, file_id, new_name_stem, config))
}
pub fn structural_search_replace(
@@ -900,6 +911,18 @@ impl Analysis {
self.with_db(|db| view_memory_layout(db, position))
}
+ pub fn get_failed_obligations(&self, offset: TextSize, file_id: FileId) -> Cancellable<String> {
+ self.with_db(|db| {
+ let sema = Semantics::new(db);
+ let source_file = sema.parse_guess_edition(file_id);
+
+ let Some(token) = source_file.syntax().token_at_offset(offset).next() else {
+ return String::new();
+ };
+ sema.get_failed_obligations(token).unwrap_or_default()
+ })
+ }
+
pub fn editioned_file_id_to_vfs(&self, file_id: hir::EditionedFileId) -> FileId {
file_id.file_id(&self.db)
}