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 }