Skip to content

Commit 1e0ec26

Browse files
authored
Merge pull request #559 from ElektroKill/sort-exported-type-table
Sort `ExportedType` table when writing to comply with new ECMA Augments
2 parents 006c640 + 080d759 commit 1e0ec26

File tree

1 file changed

+32
-2
lines changed

1 file changed

+32
-2
lines changed

src/DotNet/Writer/Metadata.cs

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1811,9 +1811,39 @@ void InitializeVTableFixups() {
18111811
void AddExportedTypes() {
18121812
using var _ = errorContext.SetSource("exported types");
18131813
var exportedTypes = module.ExportedTypes;
1814-
int count = exportedTypes.Count;
1814+
1815+
var nestedTypeDict = new Dictionary<ExportedType, List<ExportedType>>();
1816+
for (var i = 0; i < exportedTypes.Count; i++) {
1817+
var exportedType = exportedTypes[i];
1818+
if (exportedType.Implementation is not ExportedType decl)
1819+
continue;
1820+
if (!nestedTypeDict.TryGetValue(decl, out var nestedTypes))
1821+
nestedTypes = nestedTypeDict[decl] = new List<ExportedType>();
1822+
nestedTypes.Add(exportedType);
1823+
}
1824+
1825+
var sortedTypes = new List<ExportedType>(exportedTypes.Count);
1826+
var visited = new Dictionary<ExportedType, bool>();
1827+
var stack = new Stack<IEnumerator<ExportedType>>();
1828+
stack.Push(exportedTypes.GetEnumerator());
1829+
while (stack.Count > 0) {
1830+
var enumerator = stack.Pop();
1831+
while (enumerator.MoveNext()) {
1832+
var type = enumerator.Current;
1833+
if (visited.ContainsKey(type))
1834+
continue;
1835+
visited[type] = true;
1836+
sortedTypes.Add(type);
1837+
if (nestedTypeDict.TryGetValue(type, out var nested) && nested.Count > 0) {
1838+
stack.Push(enumerator);
1839+
enumerator = nested.GetEnumerator();
1840+
}
1841+
}
1842+
}
1843+
1844+
int count = sortedTypes.Count;
18151845
for (int i = 0; i < count; i++)
1816-
AddExportedType(exportedTypes[i]);
1846+
AddExportedType(sortedTypes[i]);
18171847
}
18181848

18191849
/// <summary>

0 commit comments

Comments
 (0)