protected override void Initialize(SonarAnalysisContext context) { context.RegisterSyntaxNodeActionInNonGenerated( c => { var parameter = (ParameterSyntax)c.Node; if (!parameter.AttributeLists.Any()) { return; } var attributes = AttributeSyntaxSymbolMapping.GetAttributesForParameter(parameter, c.SemanticModel) .ToList(); var defaultParameterValueAttribute = attributes .FirstOrDefault(a => a.Symbol.IsInType(KnownType.System_Runtime_InteropServices_DefaultParameterValueAttribute)); if (defaultParameterValueAttribute == null) { return; } var optionalAttribute = attributes .FirstOrDefault(a => a.Symbol.IsInType(KnownType.System_Runtime_InteropServices_OptionalAttribute)); if (optionalAttribute == null) { c.ReportDiagnostic(Diagnostic.Create(Rule, defaultParameterValueAttribute.SyntaxNode.GetLocation())); } }, SyntaxKind.Parameter); }
protected override void Initialize(SonarAnalysisContext context) { context.RegisterSyntaxNodeActionInNonGenerated( c => { var parameter = (ParameterSyntax)c.Node; if (!parameter.AttributeLists.Any() || !parameter.Modifiers.Any(m => m.IsKind(SyntaxKind.RefKeyword) || m.IsKind(SyntaxKind.OutKeyword))) { return; } var optionalAttribute = AttributeSyntaxSymbolMapping.GetAttributesForParameter(parameter, c.SemanticModel) .FirstOrDefault(a => a.Symbol.IsInType(KnownType.System_Runtime_InteropServices_OptionalAttribute)); if (optionalAttribute != null) { var refKind = parameter.Modifiers.Any(SyntaxKind.OutKeyword) ? "out" : "ref"; c.ReportDiagnosticWhenActive(Diagnostic.Create(rule, optionalAttribute.SyntaxNode.GetLocation(), refKind)); } }, SyntaxKind.Parameter); }