static void AddNamesForTypeWorker(ITypeSymbol receiverTypeSymbol, PooledHashSet <string> builder) { if (receiverTypeSymbol is ITypeParameterSymbol typeParameter) { foreach (var constraintType in typeParameter.ConstraintTypes) { AddNamesForTypeWorker(constraintType, builder); } } else { builder.Add(GetReceiverTypeName(receiverTypeSymbol)); builder.AddRange(receiverTypeSymbol.GetBaseTypes().Select(t => t.MetadataName)); builder.AddRange(receiverTypeSymbol.GetAllInterfacesIncludingThis().Select(t => t.MetadataName)); // interface doesn't inherit from object, but is implicitly convertible to object type. if (receiverTypeSymbol.IsInterfaceType()) { builder.Add(nameof(Object)); } } }