using Microsoft.CodeAnalysis;

namespace ICSharpCode.Decompiler.Generators;

public static class RoslynHelpers
{
	public static IEnumerable<INamedTypeSymbol> GetTopLevelTypes(this IAssemblySymbol assembly)
	{
		foreach (var ns in TreeTraversal.PreOrder(assembly.GlobalNamespace, ns => ns.GetNamespaceMembers()))
		{
			foreach (var t in ns.GetTypeMembers())
			{
				yield return t;
			}
		}
	}

	public static bool IsDerivedFrom(this INamedTypeSymbol type, INamedTypeSymbol baseType)
	{
		INamedTypeSymbol? t = type;

		while (t != null)
		{
			if (SymbolEqualityComparer.Default.Equals(t, baseType))
				return true;

			t = t.BaseType;
		}

		return false;
	}
}