private bool TryFindMatchingField( ImmutableArray <TArgumentSyntax> arguments, ImmutableArray <TAttributeArgumentSyntax>?attributeArguments, ImmutableArray <ParameterName> parameterNames, ImmutableArray <ITypeSymbol> parameterTypes, int index, Dictionary <string, ISymbol> parameterToExistingFieldMap, Dictionary <string, string> parameterToNewFieldMap, bool caseSensitive, out ImmutableArray <ParameterName> newParameterNames) { var parameterName = parameterNames[index]; var parameterType = parameterTypes[index]; var isFixed = _service.IsNamedArgument(arguments[index]); var newParameterNamesList = parameterNames.ToList(); // For non-out parameters, see if there's already a field there with the same name. // If so, and it has a compatible type, then we can just assign to that field. // Otherwise, we'll need to choose a different name for this member so that it // doesn't conflict with something already in the type. First check the current type // for a matching field. If so, defer to it. var comparison = caseSensitive ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase; foreach (var type in _state.TypeToGenerateIn.GetBaseTypesAndThis()) { var ignoreAccessibility = type.Equals(_state.TypeToGenerateIn); var symbol = type.GetMembers() .FirstOrDefault(s => s.Name.Equals(parameterName.NameBasedOnArgument, comparison)); if (symbol != null) { if (ignoreAccessibility || IsSymbolAccessible(symbol)) { if (IsViableFieldOrProperty(parameterType, symbol)) { // Ok! We can just the existing field. parameterToExistingFieldMap[parameterName.BestNameForParameter] = symbol; } else { // Uh-oh. Now we have a problem. We can't assign this parameter to // this field. So we need to create a new field. Find a name not in // use so we can assign to that. var newFieldName = NameGenerator.EnsureUniqueness( attributeArguments != null ? _service.GenerateNameForArgument(_document.SemanticModel, attributeArguments.Value[index], _cancellationToken) : _service.GenerateNameForArgument(_document.SemanticModel, arguments[index], _cancellationToken), GetUnavailableMemberNames().Concat(parameterToNewFieldMap.Values)); if (isFixed) { // Can't change the parameter name, so map the existing parameter // name to the new field name. parameterToNewFieldMap[parameterName.NameBasedOnArgument] = newFieldName; } else { // Can change the parameter name, so do so. var newParameterName = new ParameterName(newFieldName, isFixed: false); newParameterNamesList[index] = newParameterName; parameterToNewFieldMap[newParameterName.BestNameForParameter] = newFieldName; } } newParameterNames = newParameterNamesList.ToImmutableArray(); return(true); } } } newParameterNames = newParameterNamesList.ToImmutableArray(); return(false); }