/// <summary> /// Returns first or a modified version of first with common tuple names from both types. /// </summary> internal static TypeSymbol MergeTupleNames(TypeSymbol first, TypeSymbol second) { if (first.Equals(second, TypeCompareKind.AllIgnoreOptions & ~TypeCompareKind.IgnoreTupleNames) || !first.ContainsTupleNames()) { return first; } Debug.Assert(first.ContainsTuple()); ImmutableArray<string> names1 = CSharpCompilation.TupleNamesEncoder.Encode(first); ImmutableArray<string> names2 = CSharpCompilation.TupleNamesEncoder.Encode(second); ImmutableArray<string> mergedNames; if (names1.IsDefault || names2.IsDefault) { mergedNames = default(ImmutableArray<string>); } else { Debug.Assert(names1.Length == names2.Length); mergedNames = names1.ZipAsArray(names2, (n1, n2) => string.CompareOrdinal(n1, n2) == 0 ? n1 : null); if (mergedNames.All(n => n == null)) { mergedNames = default(ImmutableArray<string>); } } return TupleTypeDecoder.DecodeTupleTypesIfApplicable(first, mergedNames); }
/// <summary> /// Takes the names from the two types, finds the common names, and applies them onto the target. /// </summary> internal static TypeSymbol MergeTupleNames(TypeSymbol first, TypeSymbol second, TypeSymbol target, AssemblySymbol corLibrary) { if (!target.ContainsTuple() || first.Equals(second, TypeCompareKind.IgnoreCustomModifiersAndArraySizesAndLowerBounds | TypeCompareKind.IgnoreDynamic) || !target.ContainsTupleNames()) { return target; } ImmutableArray<string> names1 = CSharpCompilation.TupleNamesEncoder.Encode(first); ImmutableArray<string> names2 = CSharpCompilation.TupleNamesEncoder.Encode(second); ImmutableArray<string> mergedNames; if (names1.IsDefault || names2.IsDefault) { mergedNames = default(ImmutableArray<string>); } else { Debug.Assert(names1.Length == names2.Length); mergedNames = names1.ZipAsArray(names2, (n1, n2) => string.CompareOrdinal(n1, n2) == 0 ? n1 : null); if (mergedNames.All(n => n == null)) { mergedNames = default(ImmutableArray<string>); } } return TupleTypeDecoder.DecodeTupleTypesIfApplicable(target, corLibrary, mergedNames); }