GFramework/GFramework.SourceGenerators.Common/Extensions/GeneratedMethodConflictExtensions.cs
GeWuYou 6fa4580893 feat(generator): 添加 BindNodeSignal 和 GetNode 源代码生成器
- 实现 BindNodeSignalGenerator 用于生成节点信号绑定与解绑逻辑
- 实现 GetNodeGenerator 用于生成 Godot 节点获取注入逻辑
- 添加 BindNodeSignalDiagnostics 提供详细的诊断错误信息
- 集成到 AnalyzerReleases.Unshipped.md 追踪新的分析规则
- 支持 [BindNodeSignal] 属性的方法自动生成事件绑定代码
- 支持 [GetNode] 属性的字段自动生成节点获取代码
- 提供生命周期方法集成的智能提示和验证功能
2026-03-31 11:11:23 +08:00

49 lines
2.0 KiB
C#

using GFramework.SourceGenerators.Common.Diagnostics;
namespace GFramework.SourceGenerators.Common.Extensions;
/// <summary>
/// 提供生成方法名冲突校验的通用扩展。
/// </summary>
public static class GeneratedMethodConflictExtensions
{
/// <summary>
/// 检查目标类型上是否已存在与生成器保留方法同名的零参数方法,并在冲突时报告统一诊断。
/// </summary>
/// <param name="typeSymbol">待校验的目标类型。</param>
/// <param name="context">源代码生成上下文。</param>
/// <param name="fallbackLocation">当冲突成员缺少源码位置时使用的后备位置。</param>
/// <param name="generatedMethodNames">生成器将保留的零参数方法名集合。</param>
/// <returns>若发现任一冲突则返回 <c>true</c>。</returns>
public static bool ReportGeneratedMethodConflicts(
this INamedTypeSymbol typeSymbol,
SourceProductionContext context,
Location fallbackLocation,
params string[] generatedMethodNames)
{
var hasConflict = false;
foreach (var generatedMethodName in generatedMethodNames.Distinct(StringComparer.Ordinal))
{
var conflictingMethod = typeSymbol.GetMembers()
.OfType<IMethodSymbol>()
.FirstOrDefault(method =>
!method.IsImplicitlyDeclared &&
string.Equals(method.Name, generatedMethodName, StringComparison.Ordinal) &&
method.Parameters.Length == 0 &&
method.TypeParameters.Length == 0);
if (conflictingMethod is null)
continue;
context.ReportDiagnostic(Diagnostic.Create(
CommonDiagnostics.GeneratedMethodNameConflict,
conflictingMethod.Locations.FirstOrDefault() ?? fallbackLocation,
typeSymbol.Name,
generatedMethodName));
hasConflict = true;
}
return hasConflict;
}
}