using Microsoft.CodeAnalysis; namespace Lua.SourceGenerator; internal static class SymbolExtensions { public static bool ContainsAttribute(this ISymbol symbol, INamedTypeSymbol attribtue) { return symbol.GetAttributes().Any(x => SymbolEqualityComparer.Default.Equals(x.AttributeClass, attribtue)); } public static AttributeData? GetAttribute(this ISymbol symbol, INamedTypeSymbol attribtue) { return symbol.GetAttributes().FirstOrDefault(x => SymbolEqualityComparer.Default.Equals(x.AttributeClass, attribtue)); } public static IEnumerable GetAllMembers(this INamedTypeSymbol symbol, bool withoutOverride = true) { // Iterate Parent -> Derived if (symbol.BaseType != null) { foreach (var item in GetAllMembers(symbol.BaseType)) { // override item already iterated in parent type if (!withoutOverride || !item.IsOverride) { yield return item; } } } foreach (var item in symbol.GetMembers()) { if (!withoutOverride || !item.IsOverride) { yield return item; } } } }