/ src / Ryujinx.Horizon.Kernel.Generators / SyscallSyntaxReceiver.cs
SyscallSyntaxReceiver.cs
 1  using Microsoft.CodeAnalysis;
 2  using Microsoft.CodeAnalysis.CSharp.Syntax;
 3  using System.Collections.Generic;
 4  using System.Linq;
 5  
 6  namespace Ryujinx.Horizon.Kernel.Generators
 7  {
 8      class SyscallSyntaxReceiver : ISyntaxReceiver
 9      {
10          public List<MethodDeclarationSyntax> SvcImplementations { get; }
11  
12          public SyscallSyntaxReceiver()
13          {
14              SvcImplementations = new List<MethodDeclarationSyntax>();
15          }
16  
17          public void OnVisitSyntaxNode(SyntaxNode syntaxNode)
18          {
19              if (!(syntaxNode is ClassDeclarationSyntax classDeclaration) || classDeclaration.AttributeLists.Count == 0)
20              {
21                  return;
22              }
23  
24              if (!classDeclaration.AttributeLists.Any(attributeList =>
25                      attributeList.Attributes.Any(x => x.Name.GetText().ToString() == "SvcImpl")))
26              {
27                  return;
28              }
29  
30              foreach (var memberDeclaration in classDeclaration.Members)
31              {
32                  if (memberDeclaration is MethodDeclarationSyntax methodDeclaration)
33                  {
34                      VisitMethod(methodDeclaration);
35                  }
36              }
37          }
38  
39          private void VisitMethod(MethodDeclarationSyntax methodDeclaration)
40          {
41              if (methodDeclaration.AttributeLists.Count == 0)
42              {
43                  return;
44              }
45  
46              if (methodDeclaration.AttributeLists.Any(attributeList =>
47                      attributeList.Attributes.Any(x => x.Name.GetText().ToString() == "Svc")))
48              {
49                  SvcImplementations.Add(methodDeclaration);
50              }
51          }
52      }
53  }