Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir/src/semantics.rs')
-rw-r--r--crates/hir/src/semantics.rs23
1 files changed, 21 insertions, 2 deletions
diff --git a/crates/hir/src/semantics.rs b/crates/hir/src/semantics.rs
index 6d6e08100b..3acbf81ada 100644
--- a/crates/hir/src/semantics.rs
+++ b/crates/hir/src/semantics.rs
@@ -28,13 +28,13 @@ use hir_expand::{
mod_path::{ModPath, PathKind},
name::AsName,
};
-use hir_ty::diagnostics::unsafe_operations_for_body;
+use hir_ty::diagnostics::{unsafe_operations, unsafe_operations_for_body};
use intern::{Interned, Symbol, sym};
use itertools::Itertools;
use rustc_hash::{FxHashMap, FxHashSet};
use smallvec::{SmallVec, smallvec};
use span::{Edition, FileId, SyntaxContext};
-use stdx::TupleExt;
+use stdx::{TupleExt, always};
use syntax::{
AstNode, AstToken, Direction, SyntaxKind, SyntaxNode, SyntaxNodePtr, SyntaxToken, TextRange,
TextSize,
@@ -1765,6 +1765,25 @@ impl<'db> SemanticsImpl<'db> {
res
}
+ pub fn get_unsafe_ops_for_unsafe_block(&self, block: ast::BlockExpr) -> Vec<ExprOrPatSource> {
+ always!(block.unsafe_token().is_some());
+ let block = self.wrap_node_infile(ast::Expr::from(block));
+ let Some(def) = self.body_for(block.syntax()) else { return Vec::new() };
+ let def = def.into();
+ let (body, source_map) = self.db.body_with_source_map(def);
+ let infer = self.db.infer(def);
+ let Some(ExprOrPatId::ExprId(block)) = source_map.node_expr(block.as_ref()) else {
+ return Vec::new();
+ };
+ let mut res = Vec::default();
+ unsafe_operations(self.db, &infer, def, &body, block, &mut |node, _| {
+ if let Ok(node) = source_map.expr_or_pat_syntax(node) {
+ res.push(node);
+ }
+ });
+ res
+ }
+
pub fn is_unsafe_macro_call(&self, macro_call: &ast::MacroCall) -> bool {
let Some(mac) = self.resolve_macro_call(macro_call) else { return false };
if mac.is_asm_like(self.db) {