Esempio n. 1
0
        private static void CheckCommandParameterProperties(
            SymbolAnalysisContext context,
            IReadOnlyList <IPropertySymbol> properties)
        {
            var parameters = properties
                             .Select(p =>
            {
                var attribute = p
                                .GetAttributes()
                                .First(a => KnownSymbols.IsCommandParameterAttribute(a.AttributeClass));

                var order = attribute
                            .ConstructorArguments
                            .Select(a => a.Value)
                            .FirstOrDefault() as int?;

                var name = attribute
                           .NamedArguments
                           .Where(a => a.Key == "Name")
                           .Select(a => a.Value.Value)
                           .FirstOrDefault() as string;

                var converter = attribute
                                .NamedArguments
                                .Where(a => a.Key == "Converter")
                                .Select(a => a.Value.Value)
                                .Cast <ITypeSymbol?>()
                                .FirstOrDefault();

                var validators = attribute
                                 .NamedArguments
                                 .Where(a => a.Key == "Validators")
                                 .SelectMany(a => a.Value.Values)
                                 .Select(c => c.Value)
                                 .Cast <ITypeSymbol>()
                                 .ToArray();

                return(new
                {
                    Property = p,
                    Order = order,
                    Name = name,
                    Converter = converter,
                    Validators = validators
                });
            })
                             .ToArray();

            // Duplicate order
            var duplicateOrderParameters = parameters
                                           .Where(p => p.Order != null)
                                           .GroupBy(p => p.Order)
                                           .Where(g => g.Count() > 1)
                                           .SelectMany(g => g.AsEnumerable())
                                           .ToArray();

            foreach (var parameter in duplicateOrderParameters)
            {
                context.ReportDiagnostic(Diagnostic.Create(
                                             DiagnosticDescriptors.CliFx0021, parameter.Property.Locations.First()
                                             ));
            }

            // Duplicate name
            var duplicateNameParameters = parameters
                                          .Where(p => !string.IsNullOrWhiteSpace(p.Name))
                                          .GroupBy(p => p.Name, StringComparer.OrdinalIgnoreCase)
                                          .Where(g => g.Count() > 1)
                                          .SelectMany(g => g.AsEnumerable())
                                          .ToArray();

            foreach (var parameter in duplicateNameParameters)
            {
                context.ReportDiagnostic(Diagnostic.Create(
                                             DiagnosticDescriptors.CliFx0022, parameter.Property.Locations.First()
                                             ));
            }

            // Multiple non-scalar
            var nonScalarParameters = parameters
                                      .Where(p => !IsScalarType(p.Property.Type))
                                      .ToArray();

            if (nonScalarParameters.Length > 1)
            {
                foreach (var parameter in nonScalarParameters)
                {
                    context.ReportDiagnostic(Diagnostic.Create(
                                                 DiagnosticDescriptors.CliFx0023, parameter.Property.Locations.First()
                                                 ));
                }
            }

            // Non-last non-scalar
            var nonLastNonScalarParameter = parameters
                                            .OrderByDescending(a => a.Order)
                                            .Skip(1)
                                            .LastOrDefault(p => !IsScalarType(p.Property.Type));

            if (nonLastNonScalarParameter != null)
            {
                context.ReportDiagnostic(Diagnostic.Create(
                                             DiagnosticDescriptors.CliFx0024, nonLastNonScalarParameter.Property.Locations.First()
                                             ));
            }

            // Invalid converter
            var invalidConverterParameters = parameters
                                             .Where(p =>
                                                    p.Converter != null &&
                                                    !p.Converter.AllInterfaces.Any(KnownSymbols.IsArgumentValueConverterInterface))
                                             .ToArray();

            foreach (var parameter in invalidConverterParameters)
            {
                context.ReportDiagnostic(Diagnostic.Create(
                                             DiagnosticDescriptors.CliFx0025, parameter.Property.Locations.First()
                                             ));
            }

            // Invalid validators
            var invalidValidatorsParameters = parameters
                                              .Where(p => !p.Validators.All(v => v.AllInterfaces.Any(KnownSymbols.IsArgumentValueValidatorInterface)))
                                              .ToArray();

            foreach (var parameter in invalidValidatorsParameters)
            {
                context.ReportDiagnostic(Diagnostic.Create(
                                             DiagnosticDescriptors.CliFx0026, parameter.Property.Locations.First()
                                             ));
            }
        }