private static void HandleConstructor(SyntaxNodeAnalysisContext context) { if (context.IsExcludedFromAnalysis()) { return; } if (context.Node is ConstructorDeclarationSyntax constructorDeclaration && context.ContainingSymbol is IMethodSymbol ctor) { if (!ctor.IsStatic && ctor.DeclaredAccessibility == Accessibility.Private) { return; } using (var pooled = CtorWalker.Borrow(constructorDeclaration, context.SemanticModel, context.CancellationToken)) { if (pooled.Unassigned.Any()) { context.ReportDiagnostic( Diagnostic.Create( Descriptor, constructorDeclaration.Identifier.GetLocation(), string.Join(Environment.NewLine, pooled.Unassigned))); } } } }
private static void Handle(SyntaxNodeAnalysisContext context) { if (!context.IsExcludedFromAnalysis() && context.Node is ConstructorDeclarationSyntax constructorDeclaration) { using (var walker = CtorWalker.Borrow(constructorDeclaration, context.SemanticModel, context.CancellationToken)) { if (constructorDeclaration.ParameterList is ParameterListSyntax parameterList && parameterList.Parameters.Count > 0) { foreach (var parameter in parameterList.Parameters) { if (ShouldRename(parameter, walker, context, out var name)) { var properties = ImmutableDictionary.CreateRange(new[] { new KeyValuePair <string, string>("Name", name), }); context.ReportDiagnostic(Diagnostic.Create(GU0003CtorParameterNamesShouldMatch.Descriptor, parameter.Identifier.GetLocation(), properties)); } } foreach (var assignment in walker.Assignments) { if (constructorDeclaration.Contains(assignment) && TryGetIdentifier(assignment.Left, out var left)) { if (TryGetIdentifier(assignment.Right, out var right) && parameterList.Parameters.TryFirst(x => x.Identifier.ValueText == right.Identifier.ValueText, out var parameter) && !parameter.Modifiers.Any(SyntaxKind.ParamsKeyword) && walker.Assignments.TrySingle(x => x.Right is IdentifierNameSyntax id && id.Identifier.ValueText == parameter.Identifier.ValueText, out _) && context.SemanticModel.TryGetSymbol(left, context.CancellationToken, out ISymbol leftSymbol)) { foreach (var argument in walker.Arguments) { if (argument.Parent is ArgumentListSyntax al && al.Parent is InvocationExpressionSyntax invocation && invocation.TryGetMethodName(out var methodName) && methodName == "nameof") { continue; } if (ShouldUseParameter(context, leftSymbol, argument.Expression)) { var properties = ImmutableDictionary.CreateRange(new[] { new KeyValuePair <string, string>("Name", parameter.Identifier.ValueText), }); context.ReportDiagnostic(Diagnostic.Create(GU0014PreferParameter.Descriptor, argument.Expression.GetLocation(), properties)); } } foreach (var invocation in walker.Invocations) { if (ShouldUseParameter(context, leftSymbol, invocation.Expression)) { var properties = ImmutableDictionary.CreateRange(new[] { new KeyValuePair <string, string>("Name", parameter.Identifier.ValueText), }); context.ReportDiagnostic(Diagnostic.Create(GU0014PreferParameter.Descriptor, invocation.Expression.GetLocation(), properties)); } } foreach (var memberAccess in walker.MemberAccesses) { if (ShouldUseParameter(context, leftSymbol, memberAccess.Expression)) { var properties = ImmutableDictionary.CreateRange(new[] { new KeyValuePair <string, string>("Name", parameter.Identifier.ValueText), }); context.ReportDiagnostic(Diagnostic.Create(GU0014PreferParameter.Descriptor, memberAccess.Expression.GetLocation(), properties)); } } foreach (var conditionalAccess in walker.ConditionalAccesses) { if (ShouldUseParameter(context, leftSymbol, conditionalAccess.Expression)) { var properties = ImmutableDictionary.CreateRange(new[] { new KeyValuePair <string, string>("Name", parameter.Identifier.ValueText), }); context.ReportDiagnostic(Diagnostic.Create(GU0014PreferParameter.Descriptor, conditionalAccess.Expression.GetLocation(), properties)); } } foreach (var binaryExpression in walker.BinaryExpressionSyntaxes) { if (ShouldUseParameter(context, leftSymbol, binaryExpression.Left)) { var properties = ImmutableDictionary.CreateRange(new[] { new KeyValuePair <string, string>("Name", parameter.Identifier.ValueText), }); context.ReportDiagnostic(Diagnostic.Create(GU0014PreferParameter.Descriptor, binaryExpression.Left.GetLocation(), properties)); } if (ShouldUseParameter(context, leftSymbol, binaryExpression.Right)) { var properties = ImmutableDictionary.CreateRange(new[] { new KeyValuePair <string, string>("Name", parameter.Identifier.ValueText), }); context.ReportDiagnostic(Diagnostic.Create(GU0014PreferParameter.Descriptor, binaryExpression.Right.GetLocation(), properties)); } } } } } } if (walker.Unassigned.Count > 0) { context.ReportDiagnostic(Diagnostic.Create(GU0004AssignAllReadOnlyMembers.Descriptor, constructorDeclaration.Identifier.GetLocation(), string.Join(Environment.NewLine, walker.Unassigned))); } } } }