use cairo_lang_filesystem::ids::SmolStrId;
use cairo_lang_syntax::node::ast::Modifier;
use cairo_lang_syntax::node::{Terminal, TypedSyntaxNode};
use salsa::Database;
use crate::Mutability;
use crate::diagnostic::SemanticDiagnosticKind::RedundantModifier;
use crate::diagnostic::{SemanticDiagnostics, SemanticDiagnosticsBuilder};
pub fn compute_mutability<'db>(
diagnostics: &mut SemanticDiagnostics<'db>,
db: &'db dyn Database,
modifier_list: impl IntoIterator<Item = Modifier<'db>>,
) -> Mutability {
let mut mutability = Mutability::Immutable;
for modifier in modifier_list {
match mutability {
Mutability::Immutable => {
mutability = match modifier {
Modifier::Ref(_) => Mutability::Reference,
Modifier::Mut(_) => Mutability::Mutable,
};
}
Mutability::Mutable | Mutability::Reference => match modifier {
Modifier::Ref(terminal) => {
diagnostics.report(
terminal.stable_ptr(db),
RedundantModifier {
current_modifier: terminal.text(db),
previous_modifier: SmolStrId::from(
db,
get_relevant_modifier(&mutability),
),
},
);
}
Modifier::Mut(terminal) => {
diagnostics.report(
terminal.stable_ptr(db),
RedundantModifier {
current_modifier: terminal.text(db),
previous_modifier: SmolStrId::from(
db,
get_relevant_modifier(&mutability),
),
},
);
}
},
}
}
mutability
}
pub fn get_relevant_modifier(mutability: &Mutability) -> &'static str {
match mutability {
Mutability::Immutable => "",
Mutability::Mutable => "mut",
Mutability::Reference => "ref",
}
}