Add a way to resolve certain assists

This commit is contained in:
Kirill Bulatov 2021-05-03 17:08:09 +03:00
parent eb741e895f
commit e5cdcb8b12
10 changed files with 178 additions and 92 deletions

View file

@ -87,7 +87,7 @@ pub use crate::{
},
};
pub use hir::{Documentation, Semantics};
pub use ide_assists::{Assist, AssistConfig, AssistId, AssistKind};
pub use ide_assists::{Assist, AssistConfig, AssistId, AssistKind, AssistResolveStrategy};
pub use ide_completion::{
CompletionConfig, CompletionItem, CompletionItemKind, CompletionRelevance, ImportEdit,
InsertTextFormat,
@ -518,12 +518,13 @@ impl Analysis {
pub fn assists(
&self,
config: &AssistConfig,
resolve: bool,
resolve: AssistResolveStrategy,
frange: FileRange,
) -> Cancelable<Vec<Assist>> {
self.with_db(|db| {
let ssr_assists = ssr::ssr_assists(db, resolve, frange);
let mut acc = Assist::get(db, config, resolve, frange);
ssr::add_ssr_assist(db, &mut acc, resolve, frange);
acc.extend(ssr_assists.into_iter());
acc
})
}
@ -532,7 +533,7 @@ impl Analysis {
pub fn diagnostics(
&self,
config: &DiagnosticsConfig,
resolve: bool,
resolve: AssistResolveStrategy,
file_id: FileId,
) -> Cancelable<Vec<Diagnostic>> {
self.with_db(|db| diagnostics::diagnostics(db, config, resolve, file_id))
@ -543,7 +544,7 @@ impl Analysis {
&self,
assist_config: &AssistConfig,
diagnostics_config: &DiagnosticsConfig,
resolve: bool,
resolve: AssistResolveStrategy,
frange: FileRange,
) -> Cancelable<Vec<Assist>> {
let include_fixes = match &assist_config.allowed {
@ -552,17 +553,21 @@ impl Analysis {
};
self.with_db(|db| {
let mut res = Assist::get(db, assist_config, resolve, frange);
ssr::add_ssr_assist(db, &mut res, resolve, frange);
let ssr_assists = ssr::ssr_assists(db, resolve, frange);
let diagnostic_assists = if include_fixes {
diagnostics::diagnostics(db, diagnostics_config, resolve, frange.file_id)
.into_iter()
.filter_map(|it| it.fix)
.filter(|it| it.target.intersect(frange.range).is_some())
.collect()
} else {
Vec::new()
};
let mut res = Assist::get(db, assist_config, resolve, frange);
res.extend(ssr_assists.into_iter());
res.extend(diagnostic_assists.into_iter());
if include_fixes {
res.extend(
diagnostics::diagnostics(db, diagnostics_config, resolve, frange.file_id)
.into_iter()
.filter_map(|it| it.fix)
.filter(|it| it.target.intersect(frange.range).is_some()),
);
}
res
})
}