Exemple #1
0
        private string GetEnumUsageString([NotNull] EnumerationSignature enumeration)
        {
            var functions = _enumerationUsages[enumeration]
                            .Select
                            (
                f =>
                $"{_generatorSettings.ClassName}{(f.Extension != "Core" ? "." + f.Extension : string.Empty)}.{f.Name}"
                            )
                            .Distinct()
                            .ToList();

            if (functions.Count >= 3)
            {
                var additionalReference = functions.Count - 2 > 1
                    ? "functions"
                    : "function";

                return($"Used in {functions.Take(2).Humanize()}, as well as {(functions.Count - 2).ToString()} " +
                       $"other {additionalReference}.");
            }

            if (functions.Count >= 1)
            {
                return($"Used in {functions.Humanize()}.");
            }

            return("Not used directly.");
        }
Exemple #2
0
        /// <summary>
        /// Writes an enum to a file.
        /// </summary>
        /// <param name="enum">The enum to write.</param>
        /// <param name="file">The file to write to.</param>
        /// <param name="ns">The namespace of this enum.</param>
        /// <param name="prefix">The constant prefix for the profile.</param>
        public static void WriteEnum(EnumerationSignature @enum, string file, string ns, string prefix)
        {
            using (var sw = new StreamWriter(File.Open(file, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite)))
            {
                sw.WriteLine("// <auto-generated />");
                sw.WriteLine(EmbeddedResources.LicenseText(Path.GetFileName(file)));
                sw.WriteLine("using System;");
                sw.WriteLine();
                sw.WriteLine("namespace " + ns);
                sw.WriteLine("{");
                sw.WriteLine("    /// <summary>");
                sw.Write("    /// An OpenGL enum");
                if (@enum.Tokens.Any())
                {
                    sw.Write(" containing values ");
                    sw.Write(@enum.Tokens.OrderBy(x => x.Value).FirstOrDefault()?.Value);
                    sw.Write(" through ");
                    sw.Write(@enum.Tokens.OrderBy(x => x.Value).LastOrDefault()?.Value);
                }

                sw.WriteLine(".");
                sw.WriteLine("    /// </summary>");
                sw.WriteLine("    public enum " + @enum.Name);
                sw.WriteLine("    {");
                WriteTokens(sw, @enum.Tokens, prefix);
                sw.WriteLine("    }");
                sw.WriteLine("}");
            }
        }
Exemple #3
0
        private ApiProfile CoalesceProfile([NotNull] string profileName, [NotNull] VersionRange versionRange)
        {
            var profiles = GetProfilesInRange(profileName, versionRange).OrderBy(p => p.Versions).ToList();

            // Pre-bake stage: collect enums from the various profiles and union them together
            var enums = new Dictionary <string, EnumerationSignature>();

            foreach (var profile in profiles)
            {
                // Pre-bake any enumeration in the profile which hasn't already been pre-baked by a previous profile
                foreach (var enumeration in profile.Enumerations.Where(e => enums.Keys.All(k => k != e.Name)))
                {
                    var tokens = new List <TokenSignature>();
                    tokens.AddRange(enumeration.Tokens);

                    var otherProfiles = profiles.Where(p => p.Versions > profile.Versions);
                    var otherEnums    = otherProfiles.SelectMany(p => p.Enumerations).Where(p => p.Name == enumeration.Name);

                    foreach (var otherEnum in otherEnums)
                    {
                        tokens.AddRange(otherEnum.Tokens);
                    }

                    if (!enums.TryGetValue(enumeration.Name, out var targetEnum))
                    {
                        targetEnum = new EnumerationSignature(enumeration.Name);
                        enums.Add(enumeration.Name, enumeration);
                    }

                    targetEnum.Tokens = tokens.DistinctBy(t => t.Name).ToList();
                }
            }

            // Pre-bake stage: collect functions
            var functions = new Dictionary <string, FunctionSignature>();

            foreach (var profile in profiles)
            {
                // Pre-bake any function in the profile which hasn't already been pre-baked by a previous profile
                foreach (var function in profile.NativeSignatures)
                {
                    if (functions.ContainsKey(function.Name))
                    {
                        Debug.WriteLine
                        (
                            $"Function redefinition of \"{function.Name}\" in profile \"{profile.GetFriendlyName()} " +
                            $"v{profile.Versions}\" detected - replacing existing definition."
                        );

                        functions[function.Name] = function;
                        continue;
                    }

                    functions.Add(function.Name, function);
                }
            }

            return(new ApiProfile(profileName, versionRange, functions.Values.ToList(), enums.Values.ToList()));
        }
Exemple #4
0
 void CheckDocumentation(EnumerationSignature enm)
 {
     CheckDocumentation(enm.FullyQualifiedName, enm.Documentation);
     foreach (var enmValue in enm.Values)
     {
         CheckDocumentation(enmValue.FullyQualifiedName, enmValue.Documentation);
     }
 }
Exemple #5
0
        private void WriteEnumerationFile
        (
            [NotNull] string enumOutputDirectory,
            [NotNull] EnumerationSignature enumeration
        )
        {
            var tempEnumFilePath = Path.GetTempFileName();

            using (var outputFile = File.Open(tempEnumFilePath, FileMode.OpenOrCreate))
            {
                using (var sw = new SourceWriter(new StreamWriter(outputFile)))
                {
                    sw.WriteLine(EmbeddedResources.LicenseText);
                    sw.WriteLineNoTabs();

                    if (enumeration.IsFlagEnum)
                    {
                        sw.WriteLine("using System;");
                        sw.WriteLineNoTabs();
                    }

                    sw.WriteLine("// ReSharper disable InconsistentNaming");
                    sw.WriteLine("#pragma warning disable SA1139 // Use literal suffix notation instead of casting");
                    sw.WriteLineNoTabs();

                    sw.WriteLine($"namespace {_generatorSettings.Namespace}");
                    using (sw.BeginBlock())
                    {
                        // Document which functions use this enum.
                        sw.WriteLine("/// <summary>");
                        sw.WriteLine($"/// {GetEnumUsageString(enumeration)}");
                        sw.WriteLine("/// </summary>");

                        if (enumeration.IsFlagEnum)
                        {
                            sw.WriteLine("[Flags]");
                        }

                        sw.WriteLine($"public enum {enumeration.Name}");
                        using (sw.BeginBlock())
                        {
                            WriteTokens(sw, enumeration.Tokens);
                        }
                    }
                }
            }

            var outputEnumPath = Path.Combine(enumOutputDirectory, $"{enumeration.Name}.cs");

            if (File.Exists(outputEnumPath))
            {
                File.Delete(outputEnumPath);
            }

            File.Move(tempEnumFilePath, outputEnumPath);
        }