Skip to content

Commit 0b99682

Browse files
committed
Consistent class/struct keywords fixed for cases where wrapper class would contain members from several different translation units.
1 parent 1165b30 commit 0b99682

File tree

1 file changed

+26
-2
lines changed

1 file changed

+26
-2
lines changed

src/Generator/Generators/CSharp/CSharpSources.cs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,27 @@ public override bool VisitDeclContext(DeclarationContext context)
203203
return true;
204204
}
205205

206+
private IEnumerable<Class> EnumerateClasses()
207+
{
208+
foreach (var tu in TranslationUnits)
209+
{
210+
foreach (var cls in EnumerateClasses(tu))
211+
yield return cls;
212+
}
213+
}
214+
215+
private IEnumerable<Class> EnumerateClasses(DeclarationContext context)
216+
{
217+
foreach (var cls in context.Classes)
218+
yield return cls;
219+
220+
foreach (var ns in context.Namespaces)
221+
{
222+
foreach (var cls in EnumerateClasses(ns))
223+
yield return cls;
224+
}
225+
}
226+
206227
void GenerateNamespaceFunctionsAndVariables(DeclarationContext context)
207228
{
208229
var hasGlobalVariables = !(context is Class) && context.Variables.Any(
@@ -213,8 +234,11 @@ void GenerateNamespaceFunctionsAndVariables(DeclarationContext context)
213234

214235
PushBlock(BlockKind.Functions);
215236
var parentName = SafeIdentifier(context.TranslationUnit.FileNameWithoutExtension);
216-
var @class = context.Classes.Find(c => c.Name == parentName);
217-
var keyword = @class != null && @class.IsValueType ? "struct" : "class";
237+
238+
var keyword = "class";
239+
var classes = EnumerateClasses().ToList();
240+
if (classes.FindAll(cls => cls.IsValueType && cls.Name == parentName && context.QualifiedLogicalName == cls.Namespace.QualifiedLogicalName).Any())
241+
keyword = "struct";
218242
WriteLine($"public unsafe partial {keyword} {parentName}");
219243
WriteStartBraceIndent();
220244

0 commit comments

Comments
 (0)