mod common;
mod file;
mod chain_extension;
mod contract;
mod contract_ref;
mod environment;
mod error;
mod event;
mod ink_e2e_test;
mod ink_test;
mod message;
mod storage_item;
mod trait_definition;
use ink_analyzer_ir::syntax::TextRange;
use ink_analyzer_ir::InkFile;
use itertools::Itertools;
use crate::analysis::text_edit;
use crate::{Action, TextEdit, Version};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Diagnostic {
pub message: String,
pub range: TextRange,
pub severity: Severity,
pub quickfixes: Option<Vec<Action>>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Severity {
Error,
Warning,
}
pub fn diagnostics(file: &InkFile, version: Version) -> Vec<Diagnostic> {
let mut results = Vec::new();
file::diagnostics(&mut results, file, version);
results
.into_iter()
.unique_by(|item| {
let quickfix_edits: Option<Vec<TextEdit>> = item
.quickfixes
.as_ref()
.map(|it| it.iter().flat_map(|it| it.edits.clone()).collect());
(item.range, item.severity, quickfix_edits)
})
.map(|diagnostic| Diagnostic {
quickfixes: diagnostic.quickfixes.map(|fixes| {
fixes
.into_iter()
.map(|action| Action {
edits: text_edit::format_edits(action.edits.into_iter(), file).collect(),
..action
})
.collect()
}),
..diagnostic
})
.collect()
}