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