| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- using Microsoft.CodeAnalysis;
- using Microsoft.CodeAnalysis.CSharp;
- using Microsoft.CodeAnalysis.CSharp.Syntax;
- using System.Collections.Generic;
- using System.Linq;
- namespace Ryujinx.Horizon.Generators.Hipc
- {
- class HipcSyntaxReceiver : ISyntaxReceiver
- {
- public List<CommandInterface> CommandInterfaces { get; }
- public HipcSyntaxReceiver()
- {
- CommandInterfaces = new List<CommandInterface>();
- }
- public void OnVisitSyntaxNode(SyntaxNode syntaxNode)
- {
- if (syntaxNode is ClassDeclarationSyntax classDeclaration)
- {
- if (!classDeclaration.Modifiers.Any(SyntaxKind.PartialKeyword) || classDeclaration.BaseList == null)
- {
- return;
- }
- CommandInterface commandInterface = new CommandInterface(classDeclaration);
- foreach (var memberDeclaration in classDeclaration.Members)
- {
- if (memberDeclaration is MethodDeclarationSyntax methodDeclaration)
- {
- VisitMethod(commandInterface, methodDeclaration);
- }
- }
- CommandInterfaces.Add(commandInterface);
- }
- }
- private void VisitMethod(CommandInterface commandInterface, MethodDeclarationSyntax methodDeclaration)
- {
- string attributeName = HipcGenerator.CommandAttributeName.Replace("Attribute", string.Empty);
- if (methodDeclaration.AttributeLists.Count != 0)
- {
- foreach (var attributeList in methodDeclaration.AttributeLists)
- {
- if (attributeList.Attributes.Any(x => x.Name.ToString().Contains(attributeName)))
- {
- commandInterface.CommandImplementations.Add(methodDeclaration);
- break;
- }
- }
- }
- }
- }
- }
|