using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp.Syntax; using System.Collections.Generic; namespace XFEExtension.NetCore.Analyzer.Generator { /// /// 查找带特性的字段声明,并为常量表达式代码生成流程提供候选字段。 /// [Generator] public class ConstExpressionAutoGenerator : ISourceGenerator { /// /// 执行源生成流程并遍历语法接收器收集到的候选字段。 /// /// 当前源生成任务的执行上下文。 public void Execute(GeneratorExecutionContext context) { if (!(context.SyntaxReceiver is FieldSyntaxReceiver receiver)) return; foreach (var field in receiver.CandidateFields) { // TODO: 解析字段的初始值,执行方法并获取返回值 // TODO: 在新的部分类中生成一个const常量,其值为方法的返回值 } } /// /// 初始化源生成器,并注册用于收集带特性字段的语法接收器。 /// /// 用于注册语法通知的生成器初始化上下文。 public void Initialize(GeneratorInitializationContext context) { context.RegisterForSyntaxNotifications(() => new FieldSyntaxReceiver()); } } class FieldSyntaxReceiver : ISyntaxReceiver { /// /// 获取扫描期间收集到的带特性字段声明。 /// public List CandidateFields { get; } = new List(); /// /// 检查访问到的语法节点,并收集包含特性列表的字段声明。 /// /// 当前访问的语法节点。 public void OnVisitSyntaxNode(SyntaxNode syntaxNode) { if (syntaxNode is FieldDeclarationSyntax fieldDeclarationSyntax && fieldDeclarationSyntax.AttributeLists.Count > 0) { CandidateFields.Add(fieldDeclarationSyntax); } } } }