public static IList <string> GenerateParameterNames( this SemanticModel semanticModel, IEnumerable <AttributeArgumentSyntax> arguments, IList <string> reservedNames = null) { reservedNames = reservedNames ?? SpecializedCollections.EmptyList <string>(); // We can't change the names of named parameters. Any other names we're flexible on. var isFixed = reservedNames.Select(s => true).Concat( arguments.Select(a => a.NameEquals != null)).ToList(); var parameterNames = reservedNames.Concat( arguments.Select(semanticModel.GenerateNameForArgument)).ToList(); return(NameGenerator.EnsureUniqueness(parameterNames, isFixed).Skip(reservedNames.Count).ToList()); }
public static IMethodSymbol EnsureNonConflictingNames( this IMethodSymbol method, INamedTypeSymbol containingType, CancellationToken cancellationToken) { // The method's type parameters may conflict with the type parameters in the type // we're generating into. In that case, rename them. var parameterNames = NameGenerator.EnsureUniqueness( method.Parameters.Select(p => p.Name).ToList(), isCaseSensitive: true); var outerTypeParameterNames = containingType.GetAllTypeParameters() .Select(tp => tp.Name) .Concat(method.Name) .Concat(containingType.Name); var unusableNames = parameterNames.Concat(outerTypeParameterNames).ToSet(StringComparer.Ordinal); var newTypeParameterNames = NameGenerator.EnsureUniqueness( method.TypeParameters.Select(tp => tp.Name).ToList(), n => !unusableNames.Contains(n)); var updatedMethod = method.RenameTypeParameters(newTypeParameterNames); return(updatedMethod.RenameParameters(parameterNames)); }