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."); }
/// <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("}"); } }
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())); }
void CheckDocumentation(EnumerationSignature enm) { CheckDocumentation(enm.FullyQualifiedName, enm.Documentation); foreach (var enmValue in enm.Values) { CheckDocumentation(enmValue.FullyQualifiedName, enmValue.Documentation); } }
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); }