add utils is_inside_always_const_context
This commit is contained in:
parent
aff0e6d6d3
commit
b161dc659c
@ -50,6 +50,8 @@ declare_lint_pass!(DefaultNumericFallback => [DEFAULT_NUMERIC_FALLBACK]);
|
|||||||
impl<'tcx> LateLintPass<'tcx> for DefaultNumericFallback {
|
impl<'tcx> LateLintPass<'tcx> for DefaultNumericFallback {
|
||||||
fn check_body(&mut self, cx: &LateContext<'tcx>, body: &'tcx Body<'_>) {
|
fn check_body(&mut self, cx: &LateContext<'tcx>, body: &'tcx Body<'_>) {
|
||||||
let hir = cx.tcx.hir();
|
let hir = cx.tcx.hir();
|
||||||
|
// NOTE: this is different from `clippy_utils::is_inside_always_const_context`.
|
||||||
|
// Inline const supports type inference.
|
||||||
let is_parent_const = matches!(
|
let is_parent_const = matches!(
|
||||||
hir.body_const_context(hir.body_owner_def_id(body.id())),
|
hir.body_const_context(hir.body_owner_def_id(body.id())),
|
||||||
Some(ConstContext::Const { inline: false } | ConstContext::Static(_))
|
Some(ConstContext::Const { inline: false } | ConstContext::Static(_))
|
||||||
|
@ -100,10 +100,10 @@ use rustc_hir::hir_id::{HirIdMap, HirIdSet};
|
|||||||
use rustc_hir::intravisit::{walk_expr, FnKind, Visitor};
|
use rustc_hir::intravisit::{walk_expr, FnKind, Visitor};
|
||||||
use rustc_hir::LangItem::{OptionNone, OptionSome, ResultErr, ResultOk};
|
use rustc_hir::LangItem::{OptionNone, OptionSome, ResultErr, ResultOk};
|
||||||
use rustc_hir::{
|
use rustc_hir::{
|
||||||
self as hir, def, Arm, ArrayLen, BindingMode, Block, BlockCheckMode, Body, ByRef, Closure, Destination, Expr,
|
self as hir, def, Arm, ArrayLen, BindingMode, Block, BlockCheckMode, Body, ByRef, Closure, ConstContext,
|
||||||
ExprField, ExprKind, FnDecl, FnRetTy, GenericArgs, HirId, Impl, ImplItem, ImplItemKind, ImplItemRef, Item,
|
Destination, Expr, ExprField, ExprKind, FnDecl, FnRetTy, GenericArgs, HirId, Impl, ImplItem, ImplItemKind,
|
||||||
ItemKind, LangItem, LetStmt, MatchSource, Mutability, Node, OwnerId, Param, Pat, PatKind, Path, PathSegment,
|
ImplItemRef, Item, ItemKind, LangItem, LetStmt, MatchSource, Mutability, Node, OwnerId, Param, Pat, PatKind, Path,
|
||||||
PrimTy, QPath, Stmt, StmtKind, TraitItem, TraitItemKind, TraitItemRef, TraitRef, TyKind, UnOp,
|
PathSegment, PrimTy, QPath, Stmt, StmtKind, TraitItem, TraitItemKind, TraitItemRef, TraitRef, TyKind, UnOp,
|
||||||
};
|
};
|
||||||
use rustc_lexer::{tokenize, TokenKind};
|
use rustc_lexer::{tokenize, TokenKind};
|
||||||
use rustc_lint::{LateContext, Level, Lint, LintContext};
|
use rustc_lint::{LateContext, Level, Lint, LintContext};
|
||||||
@ -208,7 +208,10 @@ pub fn local_is_initialized(cx: &LateContext<'_>, local: HirId) -> bool {
|
|||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns `true` if the given `NodeId` is inside a constant context
|
/// Returns `true` if the given `HirId` is inside a constant context.
|
||||||
|
///
|
||||||
|
/// This is the same as `is_inside_always_const_context`, but also includes
|
||||||
|
/// `const fn`.
|
||||||
///
|
///
|
||||||
/// # Example
|
/// # Example
|
||||||
///
|
///
|
||||||
@ -221,6 +224,24 @@ pub fn in_constant(cx: &LateContext<'_>, id: HirId) -> bool {
|
|||||||
cx.tcx.hir().is_inside_const_context(id)
|
cx.tcx.hir().is_inside_const_context(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns `true` if the given `HirId` is inside an always constant context.
|
||||||
|
///
|
||||||
|
/// This context includes:
|
||||||
|
/// * const/static items
|
||||||
|
/// * const blocks (or inline consts)
|
||||||
|
/// * associated constants
|
||||||
|
pub fn is_inside_always_const_context(tcx: TyCtxt<'_>, hir_id: HirId) -> bool {
|
||||||
|
use ConstContext::{Const, ConstFn, Static};
|
||||||
|
let hir = tcx.hir();
|
||||||
|
let Some(ctx) = hir.body_const_context(hir.enclosing_body_owner(hir_id)) else {
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
match ctx {
|
||||||
|
ConstFn => false,
|
||||||
|
Static(_) | Const { inline: _ } => true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Checks if a `Res` refers to a constructor of a `LangItem`
|
/// Checks if a `Res` refers to a constructor of a `LangItem`
|
||||||
/// For example, use this to check whether a function call or a pattern is `Some(..)`.
|
/// For example, use this to check whether a function call or a pattern is `Some(..)`.
|
||||||
pub fn is_res_lang_ctor(cx: &LateContext<'_>, res: Res, lang_item: LangItem) -> bool {
|
pub fn is_res_lang_ctor(cx: &LateContext<'_>, res: Res, lang_item: LangItem) -> bool {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user