Exemplo n.º 1
0
        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
                   ));
        }
Exemplo n.º 2
0
        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
                   ));
        }