
File: rust/compiler/rustc_expand/src/errors.rs
在Rust编译器的源代码中,rust/compiler/rustc_expand/src/errors.rs文件的作用是定义了各种错误类型和帮助信息,这些错误和帮助信息用于扩展宏时的错误处理和用户提示。
下面对每个struct进行一一介绍:
-
NoSyntaxVarsExprRepeat:在语法变量表达式重复时发生的错误。 -
MustRepeatOnce:在宏中必须至少重复一次的错误。 -
CountRepetitionMisplaced:重复计数放置错误的错误。 -
MetaVarExprUnrecognizedVar:在宏中无法识别元变量表达式变量的错误。 -
VarStillRepeating:重复变量还在重复时发生的错误。 -
MetaVarsDifSeqMatchers:宏元变量与不同序列匹配器冲突的错误。 -
ResolveRelativePath:解析相对路径时发生的错误。 -
MacroConstStability:宏常量的稳定性错误。 -
MacroBodyStability:宏体的稳定性错误。 -
AttrNoArguments:属性没有参数时发生的错误。 -
NotAMetaItem:不是元素项时发生的错误。 -
OnlyOneWord:只有一个单词时发生的错误。 -
CannotBeNameOfMacro:无法作为宏名称的错误。 -
ArgumentNotAttributes:参数不是属性时发生的错误。 -
AttributesWrongForm:属性形式错误时发生的错误。 -
AttributeMetaItem:属性元项时发生的错误。 -
AttributeSingleWord:属性只有一个单词时发生的错误。 -
HelperAttributeNameInvalid:助手属性名称无效时发生的错误。 -
ExpectedCommaInList:在列表中预期逗号时发生的错误。 -
OnlyOneArgument:只有一个参数时发生的错误。 -
TakesNoArguments:不带参数时发生的错误。 -
FeatureIncludedInEdition:特性包含在版本中发生的错误。 -
FeatureRemoved:特性已被删除的错误。 -
FeatureRemovedReason:特性被删除的原因错误。 -
FeatureNotAllowed:不允许使用特性时发生的错误。 -
RecursionLimitReached:递归限制达到时发生的错误。 -
MalformedFeatureAttribute:特性属性格式错误时发生的错误。 -
RemoveExprNotSupported:不支持的删除表达式错误。 -
WrongFragmentKind:错误的片段类型时发生的错误。 -
UnsupportedKeyValue:不支持的键值对错误。
下面对每个enum进行一一介绍:
-
MalformedFeatureAttributeHelp:特性属性格式错误的帮助信息。 -
InvalidCfg:无效的配置信息的帮助信息。
这些struct和enum的目的是为了在扩展宏过程中对错误引发和用户提示进行合理分类和处理,使错误信息更准确和易于理解。
File: rust/compiler/rustc_expand/src/proc_macro.rs
在Rust编译器源代码中,rust/compiler/rustc_expand/src/proc_macro.rs
文件的作用是实现与过程宏相关的功能。过程宏是Rust中的一种编译时插件,可以在编译过程中处理、转换Rust代码。
接下来,让我们逐个介绍 CrossbeamMessagePipe<T>
, BangProcMacro
, AttrProcMacro
, DeriveProcMacro
这几个结构体的作用:
-
CrossbeamMessagePipe<T>
结构体是用于实现过程宏中的通信管道。过程宏在编译器内部运行,并可以与编译器通信,通过这个管道进行数据交互。 -
BangProcMacro
结构体表示一个过程宏,该过程宏被称为"Bang"宏,它以感叹号(!
)作为标识符的前缀。这种宏通常被用于代码生成或执行一些在编译时无法做到的动态操作。 -
AttrProcMacro
结构体表示一个过程宏,该过程宏被称为"Attr"宏,它以 #[...] 形式出现在代码中。这种宏通常用于为结构体、函数或其他代码实体添加注解或属性。 -
DeriveProcMacro
结构体表示一个过程宏,它用于为Rust的自动派生特性提供支持。派生宏会自动为用户定义的结构体或枚举实现一些常用的trait,例如Debug
、Clone
等。
这些结构体是为了实现过程宏的不同类型和功能而创建的。它们在编译器中起到了扮演不同过程宏角色的作用,以便于对代码进行解析、转换和生成。
File: rust/compiler/rustc_expand/src/mbe/quoted.rs
在Rust源代码中,rust/compiler/rustc_expand/src/mbe/quoted.rs
这个文件的作用是处理带有语法引用(quote!
宏)的宏展开。
宏展开是在编译过程中将宏调用转换为相应的代码片段。Rust提供了一个非常强大的宏系统,允许开发者使用quote!
宏来进行代码生成。这个文件的作用是负责解析和处理quote!
宏中的语法引用。
语法引用是一个宏中的特殊符号,例如$x
或$y:ty
。这些符号表示被引用的代码片段,它们被称为“引用号”。在编译过程中,这些引用号需要被替换为具体的代码,然后才能生成最终的代码片段。quoted.rs
文件中的代码就是负责解析这些引用号,并处理它们的替换逻辑。
具体来说,quoted.rs
中的核心结构是Quoter
和QuotedTokens
。Quoter
用于管理当前正在解析的语法引用,它可以将引用号类似一个栈的结构进行管理。QuotedTokens
则表示一个完整的quote!
宏展开结果,其中包含了所有被替换后的代码片段。
解析引用号的过程包括两个阶段:解析和替换。首先,在解析阶段,quoted.rs
会根据引用号的语法规则和上下文信息,将其解析为具体的代码片段,例如标识符、表达式、类型等。然后,在替换阶段,quoted.rs
会将解析后的代码替换到相应的位置,并递归地处理嵌套的引用号。
同时,quoted.rs
还提供了一些其他工具函数,用于处理引用号的格式化、比较以及生成错误报告等功能。
总而言之,quoted.rs
文件在Rust编译器中扮演着非常重要的角色,它是解析和处理带有语法引用的quote!
宏展开的核心部分,确保了宏的正确展开和生成最终的代码。
File: rust/compiler/rustc_expand/src/mbe/macro_rules.rs
该文件的作用是实现宏规则的解析和展开。它是Rust编译器的扩展部分之一,负责处理宏规则并将其扩展为相应的代码。
-
ParserAnyMacro<'a>
:这个struct表示任意宏的解析器。它具有new
函数用于创建一个新的解析器实例,并提供一些方法来解析宏规则中的不同部分。 -
MacroRulesMacroExpander
:这个struct表示宏规则的展开器。它负责将宏规则中的语法树转换为相应的代码,并执行相应的展开操作。 -
NoopTracker
:这个struct是一个空的宏跟踪器,它在展开宏时不会产生任何输出。 -
FirstSets<'tt>
:这个struct用于计算宏规则中每个非终结符的FIRST
集合。FIRST
集合表示该非终结符能够以何种终结符开头。 -
TokenSet<'tt>
:这个struct表示一个由TokenTrees
组成的集合,用于表示宏语法中可以接受的终结符。
这些trait的作用如下:
-
Tracker<'matcher>
:这个trait表示宏展开时的跟踪器。它定义了一些在展开宏时可能调用的方法,用于跟踪宏的展开过程。
这些enum的作用如下:
-
CanRetry
:这个enum表示宏展开时尝试的状态。它可以是Retry
表示展开失败后可以重试,也可以是CannotRetry
表示展开失败后不能重试。 -
TtHandle<'tt>
:这个enum表示TokenTree
的句柄,它在宏展开过程中表示宏语法中的一个部分。 -
IsInFollow
:这个enum表示一个宏是否跟随在另一个宏的后面。
总的来说,这些结构体和枚举类型组成了一个用于解析和展开宏规则的框架,为Rust编译器提供了处理宏的重要功能。
File: rust/compiler/rustc_expand/src/mbe/diagnostics.rs
在Rust源代码中,rust/compiler/rustc_expand/src/mbe/diagnostics.rs
文件的作用是实现宏展开过程中的诊断信息收集和展示的功能。具体来说,该文件包含了用于处理和生成宏展开过程中的诊断信息的结构体、枚举和函数。
CollectTrackerAndEmitter
是一个结构体,实现了一个宏展开过程的诊断跟踪器和错误信息发射器。它接收一个 BestFailure
类型的错误信息和一个 FailureForwarder
类型的错误信息转发器,然后将这些错误信息进行收集并提供给其他部分进行进一步处理。
BestFailure
结构体是用于表示最佳匹配的诊断错误信息的类型,它有多个字段来描述错误的位置、信息和级别等。
FailureForwarder
结构体是一个错误信息转发器,用于将错误信息记录到一个集合中,以便在后续的宏展开过程中进行查询和处理。
ExplainDocComment
是一个枚举类型,用于表示文档注释(doc comment)解析的结果。它包含了多个变体,用于表示不同类型的文档注释解析结果,例如解析成功、解析失败、不支持的注释类型等。
总体而言,rust/compiler/rustc_expand/src/mbe/diagnostics.rs
文件的作用是提供一个机制,用于处理和生成宏展开过程中的诊断信息,方便开发者在宏展开过程中及时发现和处理错误。
File: rust/compiler/rustc_expand/src/mbe/macro_check.rs
文件路径:rust/compiler/rustc_expand/src/mbe/macro_check.rs
作用: 该文件的作用是执行宏展开过程中的检查操作。在Rust中,宏展开是一种通过宏定义生成代码的方式。在宏展开过程中,需要进行一些语义上的检查,以确保生成的代码是合法的。
详细介绍:
-
BinderInfo:
-
该结构体存储了宏展开过程中的绑定信息。宏展开过程中,可能会引入新的绑定变量,BinderInfo用于追踪这些绑定信息。
-
-