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);
}
}
}
}