diff --git a/generation/scraper/ConstantsScraper.rsp b/generation/scraper/ConstantsScraper.rsp index aa8b8a73a..c524ca23a 100644 --- a/generation/scraper/ConstantsScraper.rsp +++ b/generation/scraper/ConstantsScraper.rsp @@ -111,3 +111,4 @@ PROC_THREAD_ATTRIBUTE_CHILD_PROCESS_POLICY PROC_THREAD_ATTRIBUTE_DESKTOP_APP_POLICY CSBFT_LOG CSBFT_PATCH_FILE +WinUSB_TestGuid diff --git a/sources/PartitionUtilsLib/ConstantsScraper.cs b/sources/PartitionUtilsLib/ConstantsScraper.cs index 8d2f13645..729cb9706 100644 --- a/sources/PartitionUtilsLib/ConstantsScraper.cs +++ b/sources/PartitionUtilsLib/ConstantsScraper.cs @@ -46,6 +46,7 @@ private class ConstantsScraperImpl : IDisposable private Dictionary withTypes; private Dictionary> enumMemberNameToEnumObj; + private Dictionary exclusionNamesToPartitions; public ConstantsScraperImpl() { @@ -62,12 +63,13 @@ public void ScrapeConstants( { this.requiredNamespaces = new WildcardDictionary(requiredNamespaces); this.withTypes = withTypes; + this.exclusionNamesToPartitions = exclusionNamesToPartitions; this.repoRoot = Path.GetFullPath(repoRoot); this.LoadEnumObjectsFromJsonFiles(enumJsonFiles, renames); - this.ScrapeConstantsFromTraversedFiles(exclusionNamesToPartitions); + this.ScrapeConstantsFromTraversedFiles(); this.WriteEnumsAndRemaps(remaps); } @@ -233,7 +235,7 @@ private void AddConstantValue(string originalNamespace, string type, string name this.writtenConstants[name] = valueText; } - private void AddConstantGuid(string defineGuidKeyword, string originalNamespace, string line) + private void AddConstantGuid(string defineGuidKeyword, string originalNamespace, string line, string partitionName) { int firstComma = line.IndexOf(','); string name = line.Substring(0, firstComma).Trim(); @@ -242,6 +244,11 @@ private void AddConstantGuid(string defineGuidKeyword, string originalNamespace, return; } + if (this.ShouldExclude(name, partitionName)) + { + return; + } + string args = line.Substring(firstComma + 1).Trim(); int closeParen = args.IndexOf(')'); args = args.Substring(0, closeParen); @@ -256,6 +263,8 @@ private void AddConstantGuid(string defineGuidKeyword, string originalNamespace, { writer.AddGuid(name, args); } + + this.writtenConstants[name] = args; } private void AddConstantInteger(string originalNamespace, string nativeTypeName, string name, string valueText) @@ -335,8 +344,31 @@ private void LoadEnumObjectsFromJsonFiles(string[] enumJsonFiles, Dictionary exclusionNamesToPartitions) + private bool ShouldExclude(string constName, string currentPartitionName) + { + // If it's in the exclusion list see if we should ignore it based on the + // current partition + if (exclusionNamesToPartitions.TryGetValue(constName, out var partitions)) + { + if (partitions == null) + { + return true; + } + + string[] parts = partitions.Split(';'); + foreach (var part in parts) + { + if (StringComparer.OrdinalIgnoreCase.Equals(part, currentPartitionName)) + { + return true; + } + } + } + + return false; + } + + private void ScrapeConstantsFromTraversedFiles() { var autoReplacements = GetAutoValueReplacements(); @@ -397,7 +429,7 @@ private void ScrapeConstantsFromTraversedFiles( if (continuation.EndsWith(';')) { processingGuidMultiLine = false; - this.AddConstantGuid(defineGuidKeyword, currentNamespace, continuation); + this.AddConstantGuid(defineGuidKeyword, currentNamespace, continuation, partInfo.Name); continuation = null; } @@ -414,7 +446,7 @@ private void ScrapeConstantsFromTraversedFiles( line = StripComments(line).Trim(); if (line.EndsWith(';')) { - this.AddConstantGuid(defineGuidKeyword, currentNamespace, line); + this.AddConstantGuid(defineGuidKeyword, currentNamespace, line, partInfo.Name); } else { @@ -435,27 +467,9 @@ private void ScrapeConstantsFromTraversedFiles( string name = defineMatch.Groups[1].Value; - // If it's in the exclusion list see if we should ignore it based on the - // current partition - if (exclusionNamesToPartitions.TryGetValue(name, out var partitions)) + if (this.ShouldExclude(name, partInfo.Name)) { - bool shouldIgnore = partitions == null; - if (!shouldIgnore) - { - string[] parts = partitions.Split(';'); - foreach (var part in parts) - { - if (StringComparer.OrdinalIgnoreCase.Equals(part, partInfo.Name)) - { - shouldIgnore = true; - } - } - } - - if (shouldIgnore) - { - continue; - } + continue; } // Get rid of trailing comments diff --git a/sources/WinmdUtils/Program.cs b/sources/WinmdUtils/Program.cs index d48eace2e..44d449103 100644 --- a/sources/WinmdUtils/Program.cs +++ b/sources/WinmdUtils/Program.cs @@ -219,15 +219,18 @@ public static int ShowDuplicateConstants(FileInfo winmd, IConsole console) { using WinmdUtils w1 = WinmdUtils.LoadFromFile(winmd.FullName); Dictionary> nameToNamespace = new Dictionary>(); - foreach (var constant in w1.GetConstants()) + foreach (ClassInfo apiClass in w1.GetTypes().Where(t => t is ClassInfo && t.Name == "Apis")) { - if (!nameToNamespace.TryGetValue(constant.Name, out var namespaces)) + foreach (var field in apiClass.Fields) { - namespaces = new List(); - nameToNamespace[constant.Name] = namespaces; - } + if (!nameToNamespace.TryGetValue(field.Name, out var namespaces)) + { + namespaces = new List(); + nameToNamespace[field.Name] = namespaces; + } - namespaces.Add(constant.Namespace); + namespaces.Add(apiClass.Namespace); + } } bool dupsFound = false;