diff --git a/src/Snap.Hutao/Snap.Hutao.SourceGeneration/UniversalAnalyzer.cs b/src/Snap.Hutao/Snap.Hutao.SourceGeneration/UniversalAnalyzer.cs
index 64516026..27507021 100644
--- a/src/Snap.Hutao/Snap.Hutao.SourceGeneration/UniversalAnalyzer.cs
+++ b/src/Snap.Hutao/Snap.Hutao.SourceGeneration/UniversalAnalyzer.cs
@@ -50,6 +50,7 @@ internal sealed class UniversalAnalyzer : DiagnosticAnalyzer
context.RegisterSyntaxNodeAction(HandleTypeDeclaration, types);
context.RegisterSyntaxNodeAction(HandleMethodDeclaration, SyntaxKind.MethodDeclaration);
+ context.RegisterSyntaxNodeAction(HandleConstructorDeclaration, SyntaxKind.ConstructorDeclaration);
}
private void HandleTypeDeclaration(SyntaxNodeAnalysisContext context)
@@ -133,6 +134,35 @@ internal sealed class UniversalAnalyzer : DiagnosticAnalyzer
}
}
+ private void HandleConstructorDeclaration(SyntaxNodeAnalysisContext context)
+ {
+ ConstructorDeclarationSyntax constructorSyntax = (ConstructorDeclarationSyntax)context.Node;
+
+ foreach (ParameterSyntax parameter in constructorSyntax.ParameterList.Parameters)
+ {
+ if (context.SemanticModel.GetDeclaredSymbol(parameter) is IParameterSymbol symbol)
+ {
+ if (IsBuiltInType(symbol.Type))
+ {
+ continue;
+ }
+
+ // 跳过 CancellationToken
+ if (symbol.Type.ToDisplayString() == "System.Threading.CancellationToken")
+ {
+ continue;
+ }
+
+ if (symbol.Type.IsReadOnly && symbol.RefKind == RefKind.None)
+ {
+ Location location = parameter.GetLocation();
+ Diagnostic diagnostic = Diagnostic.Create(readOnlyStructRefDescriptor, location, symbol.Type);
+ context.ReportDiagnostic(diagnostic);
+ }
+ }
+ }
+ }
+
private bool IsBuiltInType(ITypeSymbol symbol)
{
return symbol.SpecialType switch
diff --git a/src/Snap.Hutao/Snap.Hutao/App.xaml b/src/Snap.Hutao/Snap.Hutao/App.xaml
index 44b56ba5..5d2c689c 100644
--- a/src/Snap.Hutao/Snap.Hutao/App.xaml
+++ b/src/Snap.Hutao/Snap.Hutao/App.xaml
@@ -53,7 +53,9 @@
3
-
+ 0
+ 0
+ 0