// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. #nullable disable using System; using System.Linq; using Microsoft.CodeAnalysis.Diagnostics.Analyzers.NamingStyles; using Roslyn.Utilities; namespace Microsoft.CodeAnalysis.CodeGeneration; internal readonly struct ParameterName : IEquatable<ParameterName> { /// <summary> /// The name the underlying naming system came up with based on the argument itself. /// This might be a name like "_value". We pass this along because it can help /// later parts of the GenerateConstructor process when doing things like field hookup. /// </summary> public readonly string NameBasedOnArgument; /// <summary> /// The name we think should actually be used for this parameter. This will include /// stripping the name of things like underscores. /// </summary> public readonly string BestNameForParameter; public ParameterName(string nameBasedOnArgument, bool isFixed, bool tryMakeCamelCase = true) { NameBasedOnArgument = nameBasedOnArgument; if (isFixed) { // If the parameter name is fixed, we have to accept it as is. BestNameForParameter = NameBasedOnArgument; } else { // Otherwise, massage it a bit to be a more suitable match for how people actually writing parameters. var trimmed = nameBasedOnArgument.TrimStart('_'); BestNameForParameter = trimmed.Length > 0 ? tryMakeCamelCase ? trimmed.ToCamelCase() : trimmed : nameBasedOnArgument; } } public ParameterName(string nameBasedOnArgument, bool isFixed, NamingRule parameterNamingRule) { NameBasedOnArgument = nameBasedOnArgument; if (isFixed) { // If the parameter name is fixed, we have to accept it as is. BestNameForParameter = NameBasedOnArgument; } else { // Otherwise, massage it a bit to be a more suitable match for // how people actually writing parameters. BestNameForParameter = parameterNamingRule.NamingStyle.MakeCompliant(nameBasedOnArgument).First(); } } public override bool Equals(object obj) => Equals((ParameterName)obj); public bool Equals(ParameterName other) => NameBasedOnArgument.Equals(other.NameBasedOnArgument); public override int GetHashCode() => NameBasedOnArgument.GetHashCode(); } |