public static void Create()
        {
            var diagnostic = DuplicatedAttributeDiagnostic.Create(
                SyntaxFactory.ClassDeclaration("A"), SyntaxFactory.ClassDeclaration("B"));

            Assert.Multiple(() =>
            {
                Assert.That(diagnostic.GetMessage(), Is.EqualTo(DuplicatedAttributeDiagnostic.Message));
                Assert.That(diagnostic.Descriptor.Title.ToString(CultureInfo.CurrentCulture), Is.EqualTo(DuplicatedAttributeDiagnostic.Title));
                Assert.That(diagnostic.Id, Is.EqualTo(DuplicatedAttributeDiagnostic.Id));
                Assert.That(diagnostic.Severity, Is.EqualTo(DiagnosticSeverity.Warning));
                Assert.That(diagnostic.Descriptor.Category, Is.EqualTo(DescriptorConstants.Usage));
            });
        }
Beispiel #2
0
        private static void ValidatePairs(SyntaxNode currentNode, INamedTypeSymbol source, INamedTypeSymbol destination,
                                          Maps.Builder maps)
        {
            var key = (source, destination);

            if (maps.ContainsKey(key))
            {
                var diagnostics = maps[key].diagnostics.ToList();
                diagnostics.Add(DuplicatedAttributeDiagnostic.Create(currentNode, maps[key].node));
                maps[key] = (diagnostics.ToImmutableArray(), maps[key].node, maps[key].maps);
            }
            else
            {
                var diagnostics = ImmutableArray.CreateBuilder <Diagnostic>();

                if (!destination.Constructors.Any(_ => _.DeclaredAccessibility == Accessibility.Public && _.Parameters.Length == 0))
                {
                    diagnostics.Add(NoArgumentConstructorDiagnostic.Create(currentNode));
                }

                var propertyMaps = ImmutableArray.CreateBuilder <string>();

                var destinationProperties = destination.GetMembers().OfType <IPropertySymbol>()
                                            .Where(_ => _.SetMethod is not null &&
                                                   (_.SetMethod.DeclaredAccessibility == Accessibility.Public ||
                                                    (destination.ContainingAssembly.ExposesInternalsTo(source.ContainingAssembly) && _.SetMethod.DeclaredAccessibility == Accessibility.Friend)))
                                            .ToList();

                foreach (var sourceProperty in source.GetMembers().OfType <IPropertySymbol>()
                         .Where(_ => _.GetMethod is not null &&
                                (_.GetMethod.DeclaredAccessibility == Accessibility.Public ||
                                 (source.ContainingAssembly.ExposesInternalsTo(destination.ContainingAssembly) && _.GetMethod.DeclaredAccessibility == Accessibility.Friend))))
                {
                    var destinationProperty = destinationProperties.FirstOrDefault(
                        _ => _.Name == sourceProperty.Name &&
                        _.Type.Equals(sourceProperty.Type, SymbolEqualityComparer.Default) &&
                        (sourceProperty.NullableAnnotation != NullableAnnotation.Annotated ||
                         sourceProperty.NullableAnnotation == NullableAnnotation.Annotated && _.NullableAnnotation == NullableAnnotation.Annotated));

                    if (destinationProperty is not null)
                    {
                        propertyMaps.Add($"{destinationProperty.Name} = self.{sourceProperty.Name},");
                        destinationProperties.Remove(destinationProperty);
                    }
                    else
                    {
                        diagnostics.Add(NoMatchDiagnostic.Create(sourceProperty, "source", source));
                    }
                }

                foreach (var remainingDestinationProperty in destinationProperties)
                {
                    diagnostics.Add(NoMatchDiagnostic.Create(remainingDestinationProperty, "destination", destination));
                }

                if (propertyMaps.Count == 0)
                {
                    diagnostics.Add(NoPropertyMapsFoundDiagnostic.Create(currentNode));
                }

                maps.Add((source, destination), (diagnostics.ToImmutable(), currentNode, propertyMaps.ToImmutable()));
            }
        }