private ApiProfileOverride CoalesceOverrides([NotNull] string profileName, [NotNull] VersionRange versionRange) { var profileOverrides = GetOverridesInRange(profileName, versionRange).OrderBy(o => o.Versions).ToList(); var enums = new Dictionary <string, EnumerationOverride>(); foreach (var profileOverride in profileOverrides) { foreach (var enumeration in profileOverride.AddedEnumerations) { var directTokens = new List <TokenSignature>(); directTokens.AddRange(enumeration.DirectTokens); var useTokens = new List <UseTokenOverride>(); useTokens.AddRange(enumeration.UseTokens); var reuseEnumerations = new List <ReuseEnumerationOverride>(); reuseEnumerations.AddRange(enumeration.ReuseEnumerations); var otherProfiles = profileOverrides.Where(p => p.Versions > profileOverride.Versions); var otherEnums = otherProfiles.SelectMany(p => p.AddedEnumerations).Where(p => p.Name == enumeration.Name); foreach (var otherEnum in otherEnums) { directTokens.AddRange(otherEnum.DirectTokens); useTokens.AddRange(otherEnum.UseTokens); reuseEnumerations.AddRange(otherEnum.ReuseEnumerations); } if (!enums.TryGetValue(enumeration.Name, out var targetEnum)) { targetEnum = new EnumerationOverride(enumeration.Name); enums.Add(enumeration.Name, enumeration); } targetEnum.DirectTokens = directTokens.DistinctBy(t => t.Name).ToList(); targetEnum.UseTokens = useTokens.DistinctBy(t => t.Token).ToList(); targetEnum.ReuseEnumerations = reuseEnumerations.DistinctBy(t => t.Enumeration).ToList(); } } var removals = new List <RemoveOverride>(); var replacedFunctions = new List <FunctionOverride>(); foreach (var profileOverride in profileOverrides) { foreach (var function in profileOverride.RemovedFunctions) { if (removals.Any(f => Utilities.GetNameVariations(function).Contains(f.Name))) { throw new InvalidOperationException ( "Duplicate removal redefinition in overrides detected" + " - generator error or schema change." ); } removals.Add(function); } foreach (var function in profileOverride.ReplacedFunctions) { if (replacedFunctions.Any(f => f.HasSameSignatureAs(function) && f.BaseExtension == function.BaseExtension)) { throw new InvalidOperationException ( "Duplicate replaced function redefinition in overrides detected" + " - generator error or schema change." ); } replacedFunctions.Add(function); } } return(new ApiProfileOverride ( profileName, versionRange, enums.Values.ToList(), replacedFunctions, removals )); }
private ApiProfileOverride TrimDeprecatedOverrides ( [NotNull] ApiProfileOverride coalescedOverrides, [NotNull] string baseProfileName ) { var coalescedBaseProfile = CoalesceProfile(baseProfileName, coalescedOverrides.Versions); var deprecatedTokens = coalescedBaseProfile.Enumerations .SelectMany(e => e.Tokens) .Where(t => t.IsDeprecated) .Where(t => t.DeprecatedIn < coalescedOverrides.Versions.Maximum) .ToList(); var deprecatedFunctions = coalescedBaseProfile.NativeSignatures .Where(f => f.IsDeprecated) .Where(t => t.DeprecatedIn < coalescedOverrides.Versions.Maximum) .ToList(); var newEnumerations = new List <EnumerationOverride>(); foreach (var addedEnumeration in coalescedOverrides.AddedEnumerations) { var newDirectTokens = new List <TokenSignature>(); foreach (var directToken in addedEnumeration.DirectTokens) { if (deprecatedTokens.Any(dt => dt.Name == directToken.Name)) { continue; } newDirectTokens.Add(directToken); } var newUseTokens = new List <UseTokenOverride>(); foreach (var useToken in addedEnumeration.UseTokens) { if (deprecatedTokens.Any(dt => dt.Name == useToken.Token)) { continue; } newUseTokens.Add(useToken); } var newEnumeration = new EnumerationOverride ( addedEnumeration.Name, newDirectTokens, newUseTokens, addedEnumeration.ReuseEnumerations ); newEnumerations.Add(newEnumeration); } var newFunctionReplacements = new List <FunctionOverride>(); foreach (var functionReplacement in coalescedOverrides.ReplacedFunctions) { var nameVariations = Utilities.GetNameVariations(functionReplacement); var isReplacementDeprecated = nameVariations.Any(variation => deprecatedFunctions.Any(df => df.Name == variation)); if (!isReplacementDeprecated) { newFunctionReplacements.Add(functionReplacement); } } var newFunctionRemovals = new List <RemoveOverride>(); foreach (var functionRemoval in coalescedOverrides.RemovedFunctions) { var nameVariations = Utilities.GetNameVariations(functionRemoval); var isReplacementDeprecated = nameVariations.Any(variation => deprecatedFunctions.Any(df => df.Name == variation)); if (!isReplacementDeprecated) { newFunctionRemovals.Add(functionRemoval); } } return(new ApiProfileOverride ( coalescedOverrides.Name, coalescedOverrides.Versions, newEnumerations, newFunctionReplacements, newFunctionRemovals )); }