示例#1
0
        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);
        }
示例#2
0
        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);
        }