SyntaxReceiver.cs 1.6 KB

123456789101112131415161718192021222324252627282930313233
  1. using System.Collections.Generic;
  2. using Microsoft.CodeAnalysis;
  3. using Microsoft.CodeAnalysis.CSharp.Syntax;
  4. namespace System.Linq.Async.SourceGenerator
  5. {
  6. internal sealed class SyntaxReceiver : ISyntaxReceiver
  7. {
  8. public List<MethodDeclarationSyntax> CandidateMethods { get; } = new();
  9. public List<ClassDeclarationSyntax> CandidateAsyncEnumerableClasses { get; } = new();
  10. public List<AttributeSyntax> CandidateGenerateDeprecatedDuplicatesAttributes { get; } = new();
  11. public void OnVisitSyntaxNode(SyntaxNode syntaxNode)
  12. {
  13. if (syntaxNode is MethodDeclarationSyntax { AttributeLists: { Count: >0 } } methodDeclarationSyntax)
  14. {
  15. CandidateMethods.Add(methodDeclarationSyntax);
  16. }
  17. else if (syntaxNode is ClassDeclarationSyntax { Identifier.Text: "AsyncEnumerable" } classDeclarationSyntax)
  18. {
  19. CandidateAsyncEnumerableClasses.Add(classDeclarationSyntax);
  20. }
  21. else if (syntaxNode is AttributeSyntax generateDeprecatedAttribute &&
  22. (generateDeprecatedAttribute.Parent is AttributeListSyntax { Target.Identifier.Text: "assembly" }) &&
  23. (generateDeprecatedAttribute.Name is IdentifierNameSyntax { Identifier.Text: "DuplicateAsyncEnumerableAsAsyncEnumerableDeprecated" } ||
  24. generateDeprecatedAttribute.Name is QualifiedNameSyntax { Right: IdentifierNameSyntax { Identifier.Text: "DuplicateAsyncEnumerableAsAsyncEnumerableDeprecated" } }))
  25. {
  26. CandidateGenerateDeprecatedDuplicatesAttributes.Add(generateDeprecatedAttribute);
  27. }
  28. }
  29. }
  30. }