mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-04-01 02:56:44 +08:00
- 实现 BindNodeSignalGenerator 用于生成节点信号绑定与解绑逻辑 - 实现 GetNodeGenerator 用于生成 Godot 节点获取注入逻辑 - 添加 BindNodeSignalDiagnostics 提供详细的诊断错误信息 - 集成到 AnalyzerReleases.Unshipped.md 追踪新的分析规则 - 支持 [BindNodeSignal] 属性的方法自动生成事件绑定代码 - 支持 [GetNode] 属性的字段自动生成节点获取代码 - 提供生命周期方法集成的智能提示和验证功能
49 lines
2.0 KiB
C#
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;
|
|
}
|
|
} |