Skip to main content

Module macros

Module macros 

Source
Expand description

A bunch of methods and structures more or less related to resolving macros and interface provided by Resolver to macro expander.

Re-exportsΒ§

use std::mem; πŸ”’
use std::sync::Arc; πŸ”’
use rustc_ast as ast; πŸ”’
use rustc_ast::Crate; πŸ”’
use rustc_ast::DelegationSuffixes; πŸ”’
use rustc_ast::NodeId; πŸ”’
use rustc_ast_pretty::pprust; πŸ”’
use rustc_attr_ir::Attribute; πŸ”’
use rustc_attr_ir::AttributeKind; πŸ”’
use rustc_attr_ir::CfgEntry; πŸ”’
use rustc_attr_ir::StabilityLevel; πŸ”’
use rustc_attr_ir::StrippedCfgItem; πŸ”’
use rustc_attr_parsing::AttributeParser; πŸ”’
use rustc_data_structures::sync::RwLock; πŸ”’
use rustc_errors::Applicability; πŸ”’
use rustc_errors::StashKey; πŸ”’
use rustc_expand::base::Annotatable; πŸ”’
use rustc_expand::base::DeriveResolution; πŸ”’
use rustc_expand::base::Indeterminate; πŸ”’
use rustc_expand::base::ResolverExpand; πŸ”’
use rustc_expand::base::SyntaxExtension; πŸ”’
use rustc_expand::base::SyntaxExtensionKind; πŸ”’
use rustc_expand::compile_declarative_macro; πŸ”’
use rustc_expand::expand::AstFragment; πŸ”’
use rustc_expand::expand::AstFragmentKind; πŸ”’
use rustc_expand::expand::Invocation; πŸ”’
use rustc_expand::expand::InvocationKind; πŸ”’
use rustc_expand::expand::SupportsMacroExpansion; πŸ”’
use rustc_hir::def::DefKind; πŸ”’
use rustc_hir::def::MacroKinds; πŸ”’
use rustc_hir::def::Namespace; πŸ”’
use rustc_hir::def::NonMacroAttrKind; πŸ”’
use rustc_hir::def_id::CrateNum; πŸ”’
use rustc_hir::def_id::DefId; πŸ”’
use rustc_hir::def_id::LocalDefId; πŸ”’
use rustc_lint_defs::builtin::LEGACY_DERIVE_HELPERS; πŸ”’
use rustc_lint_defs::builtin::OUT_OF_SCOPE_MACRO_CALLS; πŸ”’
use rustc_lint_defs::builtin::UNUSED_MACRO_RULES; πŸ”’
use rustc_lint_defs::builtin::UNUSED_MACROS; πŸ”’
use rustc_middle::middle::stability; πŸ”’
use rustc_middle::ty::RegisteredTools; πŸ”’
use rustc_middle::ty::TyCtxt; πŸ”’
use rustc_session::Session; πŸ”’
use rustc_session::diagnostics::feature_err; πŸ”’
use rustc_span::def_id::ModId; πŸ”’
use rustc_span::edition::Edition; πŸ”’
use rustc_span::hygiene; πŸ”’
use rustc_span::hygiene::AstPass; πŸ”’
use rustc_span::hygiene::ExpnData; πŸ”’
use rustc_span::hygiene::ExpnKind; πŸ”’
use rustc_span::hygiene::LocalExpnId; πŸ”’
use rustc_span::hygiene::MacroKind; πŸ”’
use rustc_span::DUMMY_SP; πŸ”’
use rustc_span::Ident; πŸ”’
use rustc_span::Span; πŸ”’
use rustc_span::Symbol; πŸ”’
use rustc_span::kw; πŸ”’
use rustc_span::sym; πŸ”’
use crate::def_collector::collect_definitions; πŸ”’
use crate::diagnostics; πŸ”’
use crate::diagnostics::AddAsNonDerive; πŸ”’
use crate::diagnostics::CannotDetermineMacroResolution; πŸ”’
use crate::diagnostics::CannotFindIdentInThisScope; πŸ”’
use crate::diagnostics::MacroExpectedFound; πŸ”’
use crate::diagnostics::RemoveSurroundingDerive; πŸ”’
use crate::hygiene::Macros20NormalizedSyntaxContext; πŸ”’
use crate::imports::Import; πŸ”’
use crate::BindingKey; πŸ”’
use crate::CmResolver; πŸ”’
use crate::Decl; πŸ”’
use crate::DeclKind; πŸ”’
use crate::DeriveData; πŸ”’
use crate::Determinacy; πŸ”’
use crate::Finalize; πŸ”’
use crate::IdentKey; πŸ”’
use crate::InvocationParent; πŸ”’
use crate::ModuleKind; πŸ”’
use crate::ModuleOrUniformRoot; πŸ”’
use crate::ParentScope; πŸ”’
use crate::PathResult; πŸ”’
use crate::Res; πŸ”’
use crate::ResolutionError; πŸ”’
use crate::Resolver; πŸ”’
use crate::ScopeSet; πŸ”’
use crate::Segment; πŸ”’
use crate::Used; πŸ”’
use crate::Namespace::*; πŸ”’

StructsΒ§

MacroRulesDecl πŸ”’
Name declaration produced by a macro_rules item definition. Not modularized, can shadow previous macro_rules definitions, etc.

EnumsΒ§

MacroRulesScope πŸ”’
The scope introduced by a macro_rules! macro. This starts at the macro’s definition and ends at the end of the macro’s parent module (named or unnamed), or even further if it escapes with #[macro_use]. Some macro invocations need to introduce macro_rules scopes too because they can potentially expand into macro definitions.

ConstantsΒ§

PREDEFINED_TOOLS πŸ”’

FunctionsΒ§

fast_print_path πŸ”’
registered_attr_tools πŸ”’
registered_lint_tools πŸ”’
registered_lint_tools_ast
sub_namespace_match πŸ”’
Macro namespace is separated into two sub-namespaces, one for bang macros and one for attribute-like macros (attributes, derives). We ignore resolutions from one sub-namespace when searching names in scope for another.

Type AliasesΒ§

MacroRulesScopeRef πŸ”’
macro_rules! scopes are always kept by reference and inside a cell. The reason is that we update scopes with value MacroRulesScope::Invocation(invoc_id) in-place after invoc_id gets expanded. This helps to avoid uncontrollable growth of macro_rules! scope chains, which usually grow linearly with the number of macro invocations in a module (including derives) and hurt performance.