Пример #1
0
        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());
        }
Пример #2
0
        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));
        }