Browse Source

Rewrite GenerateEnumFromMacros to search through multiple translation units.

pull/1316/merge
João Matos 6 years ago committed by João Matos
parent
commit
285f3f6ee0
  1. 28
      src/Generator/Library.cs

28
src/Generator/Library.cs

@ -149,8 +149,14 @@ namespace CppSharp
var pattern = string.Join("|", macros); var pattern = string.Join("|", macros);
var regex = new Regex(pattern); var regex = new Regex(pattern);
int maxItems = 0;
TranslationUnit unitToAttach = null;
ulong maxValue = 0;
foreach (var unit in context.TranslationUnits) foreach (var unit in context.TranslationUnits)
{ {
int numItems = 0;
foreach (var macro in unit.PreprocessedEntities.OfType<MacroDefinition>()) foreach (var macro in unit.PreprocessedEntities.OfType<MacroDefinition>())
{ {
var match = regex.Match(macro.Name); var match = regex.Match(macro.Name);
@ -159,25 +165,29 @@ namespace CppSharp
if (macro.Enumeration != null) if (macro.Enumeration != null)
continue; continue;
// Skip this macro if the enum already has an item with same entry. // Skip this macro if the enum already has an item with same name.
if (@enum.Items.Exists(it => it.Name == macro.Name)) if (@enum.Items.Exists(it => it.Name == macro.Name))
continue; continue;
// Set the namespace to the namespace we found the 1st item in
if (@enum.Namespace == null)
@enum.Namespace = unit;
var item = @enum.GenerateEnumItemFromMacro(macro); var item = @enum.GenerateEnumItemFromMacro(macro);
@enum.AddItem(item); @enum.AddItem(item);
macro.Enumeration = @enum; macro.Enumeration = @enum;
maxValue = Math.Max(maxValue, item.Value);
numItems++;
} }
if (@enum.Items.Count > 0) if (numItems > maxItems)
{ {
unit.Declarations.Add(@enum); maxItems = numItems;
break; unitToAttach = unit;
}
} }
if (@enum.Items.Count > 0)
{
@enum.Namespace = unitToAttach;
unitToAttach.Declarations.Add(@enum);
} }
return @enum; return @enum;

Loading…
Cancel
Save