private static TMemberDeclarationSyntax WithExtraAttributes()

in src/PublicToInternalGenerator/PublicToInternalGenerator.cs [99:150]


  private static TMemberDeclarationSyntax WithExtraAttributes<TMemberDeclarationSyntax>(TMemberDeclarationSyntax node)
    where TMemberDeclarationSyntax : MemberDeclarationSyntax
  {
    var lists = node.AttributeLists;
    var hasAttributeLists = lists.Any();

    var embeddedAttributeSyntax = SyntaxFactory.Attribute(
      SyntaxFactory.AliasQualifiedName(
        SyntaxFactory.IdentifierName("global"),
        SyntaxFactory.IdentifierName("Microsoft.CodeAnalysis.EmbeddedAttribute")));

    var generatedCodeAttributeSyntax = SyntaxFactory.Attribute(
      SyntaxFactory.AliasQualifiedName(
        SyntaxFactory.IdentifierName("global"),
        SyntaxFactory.IdentifierName("System.CodeDom.Compiler.GeneratedCodeAttribute")))
      .WithArgumentList(
        SyntaxFactory.AttributeArgumentList(
          SyntaxFactory.SeparatedList<AttributeArgumentSyntax>([
            SyntaxFactory.AttributeArgument(
              SyntaxFactory.LiteralExpression(
                SyntaxKind.StringLiteralExpression, SyntaxFactory.Literal("JetBrains.Annotations"))),
            SyntaxFactory.AttributeArgument(
              SyntaxFactory.LiteralExpression(
                SyntaxKind.StringLiteralExpression, SyntaxFactory.Literal("42.42.42.42")))
          ])));

    var embeddedAttributeList = SyntaxFactory
      .AttributeList(SyntaxFactory.SeparatedList([embeddedAttributeSyntax]))
      .WithLeadingTrivia(SyntaxFactory.Space, SyntaxFactory.Space)
      .WithTrailingTrivia(SyntaxFactory.ElasticCarriageReturnLineFeed);

    var generatedCodeAttributeList = SyntaxFactory
      .AttributeList(SyntaxFactory.SeparatedList([generatedCodeAttributeSyntax]))
      .WithLeadingTrivia(SyntaxFactory.Space, SyntaxFactory.Space)
      .WithTrailingTrivia(SyntaxFactory.ElasticCarriageReturnLineFeed);

    lists = lists.Add(embeddedAttributeList).Add(generatedCodeAttributeList);

    if (!hasAttributeLists)
    {
      var leadingTrivia = node.GetLeadingTrivia();
      var leadingWhitespace = leadingTrivia.LastOrDefault(x => x.IsKind(SyntaxKind.WhitespaceTrivia));

      return (TMemberDeclarationSyntax)
        node.WithoutLeadingTrivia()
            .WithLeadingTrivia(leadingWhitespace)
            .WithAttributeLists(lists)
            .WithLeadingTrivia(leadingTrivia);
    }

    return (TMemberDeclarationSyntax)node.WithAttributeLists(lists);
  }