use alloc::borrow::ToOwned;
use alloc::boxed::Box;
use alloc::format;
use alloc::string::{String, ToString};
use alloc::vec;
use alloc::vec::Vec;
use rustc_macros::{Decodable, Encodable, StableHash};
use crate::rustc_middle::ty::{Ty, TyCtxt, TypingEnv};
#[derive(Clone, Copy, PartialEq, Debug, Decodable, Encodable, StableHash)]
pub struct UsageSummary(u8);
bitflags::bitflags! {
impl UsageSummary: u8 {
const DROP = 1 << 0;
const SHARED_BORROW = 1 << 1;
const MUTATE = 1 << 2;
const CAPTURE = 1 << 3;
}
}
#[derive(Clone, Copy, PartialEq, Debug, Decodable, Encodable, StableHash)]
pub struct DeducedParamAttrs {
pub usage: UsageSummary,
}
impl DeducedParamAttrs {
#[inline]
pub fn is_default(self) -> bool {
self.usage.contains(UsageSummary::MUTATE | UsageSummary::CAPTURE)
}
pub fn read_only<'tcx>(
&self,
tcx: TyCtxt<'tcx>,
typing_env: TypingEnv<'tcx>,
ty: Ty<'tcx>,
) -> bool {
if self.usage.contains(UsageSummary::MUTATE) {
return false;
}
if self.usage.contains(UsageSummary::DROP) && ty.needs_drop(tcx, typing_env) {
return false;
}
if self.usage.contains(UsageSummary::SHARED_BORROW) && !ty.is_freeze(tcx, typing_env) {
return false;
}
true
}
pub fn captures_none<'tcx>(
&self,
tcx: TyCtxt<'tcx>,
typing_env: TypingEnv<'tcx>,
ty: Ty<'tcx>,
) -> bool {
if self.usage.contains(UsageSummary::CAPTURE) {
return false;
}
if self.usage.contains(UsageSummary::DROP) && ty.needs_drop(tcx, typing_env) {
return false;
}
true
}
}