Skip to content

Commit 954a0cf

Browse files
committed
Resolve names matching those of system functions
Fixes #1602. Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent 359cc90 commit 954a0cf

File tree

13 files changed

+127
-69
lines changed

13 files changed

+127
-69
lines changed

src/Generator/Generators/C/CCodeGenerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ public virtual string GenerateEnumSpecifier(Enumeration @enum)
152152
if (IsCLIGenerator)
153153
{
154154
if (@enum.Modifiers.HasFlag(Enumeration.EnumModifiers.Flags))
155-
WriteLine("[System::Flags]");
155+
WriteLine("[::System::Flags]");
156156

157157
// A nested class cannot have an assembly access specifier as part
158158
// of its declaration.

src/Generator/Generators/C/CppMarshal.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ public void WriteClassInstance(Class @class, string instance)
272272
Context.Return.Write($"({instance} == nullptr) ? nullptr : {MemoryAllocOperator} ");
273273

274274
Context.Return.Write($"{QualifiedIdentifier(@class)}(");
275-
Context.Return.Write($"(::{@class.QualifiedOriginalName}*)");
275+
Context.Return.Write($"({(@class.IsUnion ? "union" : "struct")} ::{@class.QualifiedOriginalName}*)");
276276
Context.Return.Write($"{instance})");
277277
}
278278

@@ -409,7 +409,7 @@ public override bool VisitPointerType(PointerType pointer, TypeQualifiers quals)
409409
Context.Parameter.Usage == ParameterUsage.InOut;
410410

411411
Context.ArgumentPrefix.Write("&");
412-
Context.Return.Write($"(::{@enum.QualifiedOriginalName}){0}{Context.Parameter.Name}",
412+
Context.Return.Write($"(enum ::{@enum.QualifiedOriginalName}){0}{Context.Parameter.Name}",
413413
isRef ? string.Empty : "*");
414414
return true;
415415
}
@@ -511,7 +511,7 @@ public override bool VisitTypedefType(TypedefType typedef, TypeQualifiers quals)
511511
PrimitiveType primitive;
512512
if (decl.Type.IsPrimitiveType(out primitive))
513513
{
514-
Context.Return.Write($"(::{typedef.Declaration.QualifiedOriginalName})");
514+
Context.Return.Write($"(typedef ::{typedef.Declaration.QualifiedOriginalName})");
515515
}
516516

517517
return decl.Type.Visit(this);
@@ -588,15 +588,15 @@ private void MarshalRefClass(Class @class)
588588
&& method.Conversion == MethodConversionKind.FunctionToInstanceMethod
589589
&& Context.ParameterIndex == 0)
590590
{
591-
Context.Return.Write($"(::{@class.QualifiedOriginalName}*)");
591+
Context.Return.Write($"({(@class.IsUnion ? "union" : "struct")} ::{@class.QualifiedOriginalName}*)");
592592
Context.Return.Write(Helpers.InstanceIdentifier);
593593
return;
594594
}
595595

596596
var paramType = Context.Parameter.Type.Desugar();
597597
var isPointer = paramType.SkipPointerRefs().IsPointer();
598598
var deref = isPointer ? "->" : ".";
599-
var instance = $"(::{@class.QualifiedOriginalName}*)" +
599+
var instance = $"({(@class.IsUnion ? "union" : "struct")} ::{@class.QualifiedOriginalName}*)" +
600600
$"{Context.Parameter.Name}{deref}{Helpers.InstanceIdentifier}";
601601

602602
if (isPointer)
@@ -654,7 +654,7 @@ public override bool VisitTypedefDecl(TypedefDecl typedef)
654654

655655
public override bool VisitEnumDecl(Enumeration @enum)
656656
{
657-
Context.Return.Write("(::{0}){1}", @enum.QualifiedOriginalName,
657+
Context.Return.Write("(enum ::{0}){1}", @enum.QualifiedOriginalName,
658658
Context.Parameter.Name);
659659
return true;
660660
}

src/Generator/Generators/C/CppSources.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ public virtual void GenerateClassConstructor(Class @class, bool withOwnNativeIns
294294
{
295295
Write($"{QualifiedIdentifier(@class)}::{@class.Name}(");
296296

297-
var nativeType = $"::{@class.QualifiedOriginalName}*";
297+
var nativeType = $"{(@class.IsUnion ? "union" : "struct")} ::{@class.QualifiedOriginalName}*";
298298
//WriteLine($"{nativeType} {ClassCtorInstanceParamIdentifier})");
299299
WriteLine(!withOwnNativeInstanceParam ? $"{nativeType} {ClassCtorInstanceParamIdentifier})" :
300300
$"{nativeType} {ClassCtorInstanceParamIdentifier}, bool ownNativeInstance)");
@@ -413,7 +413,8 @@ public override bool VisitMethodDecl(Method method)
413413
PushBlock(BlockKind.ConstructorBody, @class);
414414

415415
var @params = GenerateFunctionParamsMarshal(method.Parameters, method);
416-
Write($"{Helpers.InstanceIdentifier} = new ::{method.Namespace.QualifiedOriginalName}(");
416+
Write($@"{Helpers.InstanceIdentifier} = new {(@class.IsUnion ? "union" : "struct")} ::{
417+
method.Namespace.QualifiedOriginalName}(");
417418
GenerateFunctionParams(@params);
418419
WriteLine(");");
419420

@@ -492,7 +493,7 @@ public void GenerateFunctionCall(Function function)
492493
var field = property?.Field;
493494
if (field != null)
494495
{
495-
Write($"((::{@class.QualifiedOriginalName}*){Helpers.InstanceIdentifier})->");
496+
Write($"(({(@class.IsUnion ? "union" : "struct")} ::{@class.QualifiedOriginalName}*){Helpers.InstanceIdentifier})->");
496497
Write($"{field.OriginalName}");
497498

498499
var isGetter = property.GetMethod == method;
@@ -510,7 +511,7 @@ public void GenerateFunctionCall(Function function)
510511
else
511512
{
512513
if (IsNativeMethod(function))
513-
Write($"((::{@class.QualifiedOriginalName}*){Helpers.InstanceIdentifier})->");
514+
Write($"(({(@class.IsUnion ? "union" : "struct")} ::{@class.QualifiedOriginalName}*){Helpers.InstanceIdentifier})->");
514515

515516
Write($"{base.GetMethodIdentifier(function, TypePrinterContextKind.Native)}(");
516517
}

src/Generator/Generators/CLI/CLIHeaders.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -262,10 +262,10 @@ public void GenerateClass(Class @class)
262262
GenerateDeclContext(@class);
263263
Unindent();
264264

265-
var nativeType = string.Format("::{0}*", @class.QualifiedOriginalName);
265+
string nativeType = $"{(@class.IsUnion ? "union" : "struct")} ::{@class.QualifiedOriginalName}*";
266266

267267
if (CLIGenerator.ShouldGenerateClassNativeField(@class))
268-
GenerateClassNativeField(@class, nativeType);
268+
GenerateClassNativeField(nativeType);
269269

270270
GenerateClassConstructors(@class, nativeType);
271271

@@ -303,15 +303,15 @@ public void GenerateClass(Class @class)
303303
WriteLine("};");
304304
}
305305

306-
public void GenerateClassNativeField(Class @class, string nativeType)
306+
public void GenerateClassNativeField(string nativeType)
307307
{
308308
WriteLineIndent("property {0} NativePtr;", nativeType);
309309

310310
Indent();
311-
WriteLine("property System::IntPtr {0}", Helpers.InstanceIdentifier);
311+
WriteLine("property ::System::IntPtr {0}", Helpers.InstanceIdentifier);
312312
WriteOpenBraceAndIndent();
313-
WriteLine("virtual System::IntPtr get();");
314-
WriteLine("virtual void set(System::IntPtr instance);");
313+
WriteLine("virtual ::System::IntPtr get();");
314+
WriteLine("virtual void set(::System::IntPtr instance);");
315315
UnindentAndWriteCloseBrace();
316316
NewLine();
317317

@@ -455,7 +455,7 @@ private void GenerateField(Class @class, Field field)
455455

456456
GenerateDeclarationCommon(field);
457457
if (@class.IsUnion)
458-
WriteLine("[System::Runtime::InteropServices::FieldOffset({0})]",
458+
WriteLine("[::System::Runtime::InteropServices::FieldOffset({0})]",
459459
@class.Layout.Fields.Single(f => f.FieldPtr == field.OriginalPtr).Offset);
460460
WriteLine("{0} {1};", field.Type, field.Name);
461461

@@ -575,8 +575,8 @@ public void GenerateClassVariables(Class @class)
575575
public override void GenerateClassSpecifier(Class @class)
576576
{
577577
if (@class.IsUnion)
578-
WriteLine("[System::Runtime::InteropServices::StructLayout({0})]",
579-
"System::Runtime::InteropServices::LayoutKind::Explicit");
578+
WriteLine("[::System::Runtime::InteropServices::StructLayout({0})]",
579+
"::System::Runtime::InteropServices::LayoutKind::Explicit");
580580

581581
// Nested types cannot have visibility modifiers in C++/CLI.
582582
var isTopLevel = @class.Namespace is TranslationUnit ||
@@ -760,8 +760,8 @@ public bool GenerateTypedef(TypedefNameDecl typedef)
760760
: ((FunctionType)attributedType).CallingConvention;
761761
var interopCallConv = callingConvention.ToInteropCallConv();
762762
if (interopCallConv != System.Runtime.InteropServices.CallingConvention.Winapi)
763-
WriteLine("[System::Runtime::InteropServices::UnmanagedFunctionPointer" +
764-
"(System::Runtime::InteropServices::CallingConvention::{0})] ",
763+
WriteLine("[::System::Runtime::InteropServices::UnmanagedFunctionPointer" +
764+
"(::System::Runtime::InteropServices::CallingConvention::{0})] ",
765765
interopCallConv);
766766

767767
var visibility = !insideClass ? "public " : string.Empty;

src/Generator/Generators/CLI/CLIMarshal.cs

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,9 @@ public override bool VisitFunctionType(FunctionType function, TypeQualifiers qua
8383
var delegateType = function.ToString();
8484

8585
Context.Return.Write("safe_cast<{0}>(", delegateType + "^");
86-
Context.Return.Write("System::Runtime::InteropServices::Marshal::");
86+
Context.Return.Write("::System::Runtime::InteropServices::Marshal::");
8787
Context.Return.Write("GetDelegateForFunctionPointer(");
88-
Context.Return.Write("System::IntPtr({0}), {1}::typeid))", Context.ReturnVarName,
88+
Context.Return.Write("::System::IntPtr({0}), {1}::typeid))", Context.ReturnVarName,
8989
delegateType.TrimEnd('^'));
9090

9191
return true;
@@ -223,9 +223,9 @@ public override bool VisitTypedefType(TypedefType typedef, TypeQualifiers quals)
223223
if (decl.Type.IsPointerTo(out function))
224224
{
225225
Context.Return.Write($"{Context.ReturnVarName} == nullptr ? nullptr : safe_cast<{typedef}>(");
226-
Context.Return.Write("System::Runtime::InteropServices::Marshal::");
226+
Context.Return.Write("::System::Runtime::InteropServices::Marshal::");
227227
Context.Return.Write("GetDelegateForFunctionPointer(");
228-
Context.Return.Write("IntPtr({0}), {1}::typeid))",Context.ReturnVarName,
228+
Context.Return.Write("::System::IntPtr({0}), {1}::typeid))", Context.ReturnVarName,
229229
typedef.ToString().TrimEnd('^'));
230230
return true;
231231
}
@@ -280,8 +280,7 @@ public override bool VisitClassDecl(Class @class)
280280
if (@class.IsRefType && needsCopy)
281281
{
282282
var name = Generator.GeneratedIdentifier(Context.ReturnVarName);
283-
Context.Before.WriteLine("auto {0} = new ::{1}({2});", name,
284-
@class.QualifiedOriginalName, Context.ReturnVarName);
283+
Context.Before.WriteLine($"auto {name} = new {(@class.IsUnion ? "union" : "struct")} ::{@class.QualifiedOriginalName}({Context.ReturnVarName});");
285284
instance = name;
286285

287286
ownNativeInstance = true;
@@ -306,7 +305,7 @@ public void WriteClassInstance(Class @class, string instance, bool ownNativeInst
306305
instance);
307306

308307
Context.Return.Write("::{0}(", QualifiedIdentifier(@class));
309-
Context.Return.Write("(::{0}*)", @class.QualifiedOriginalName);
308+
Context.Return.Write($"({(@class.IsUnion ? "union" : "struct")} ::{@class.QualifiedOriginalName}*)");
310309
Context.Return.Write("{0}{1})", instance, ownNativeInstance ? ", true" : "");
311310
}
312311

@@ -449,7 +448,7 @@ public override bool VisitArrayType(ArrayType array, TypeQualifiers quals)
449448

450449
supportBefore.WriteLine($"if ({Context.Parameter.Name}->Length != {array.Size})");
451450
supportBefore.WriteOpenBraceAndIndent();
452-
supportBefore.WriteLine($"throw gcnew System::InvalidOperationException(\"Source array size must equal destination array size.\");");
451+
supportBefore.WriteLine($"throw gcnew ::System::InvalidOperationException(\"Source array size must equal destination array size.\");");
453452
supportBefore.UnindentAndWriteCloseBrace();
454453

455454
string nativeVal = string.Empty;
@@ -494,7 +493,7 @@ public bool VisitDelegateType(string type)
494493

495494
var sb = new StringBuilder();
496495
sb.AppendFormat("static_cast<{0}>(", type);
497-
sb.Append("System::Runtime::InteropServices::Marshal::");
496+
sb.Append("::System::Runtime::InteropServices::Marshal::");
498497
sb.Append("GetFunctionPointerForDelegate(");
499498
sb.AppendFormat("{0}).ToPointer())", Context.Parameter.Name);
500499
Context.Return.Write(sb.ToString());
@@ -529,7 +528,7 @@ public override bool VisitPointerType(PointerType pointer, TypeQualifiers quals)
529528
ArgumentPrefix.Write("&");
530529
}
531530

532-
Context.Return.Write("(::{0}){1}{2}", @enum.QualifiedOriginalName,
531+
Context.Return.Write("(enum ::{0}){1}{2}", @enum.QualifiedOriginalName,
533532
isRef ? string.Empty : "*", Context.Parameter.Name);
534533
return true;
535534
}
@@ -728,12 +727,12 @@ private void MarshalRefClass(Class @class)
728727
&& method.Conversion == MethodConversionKind.FunctionToInstanceMethod
729728
&& Context.ParameterIndex == 0)
730729
{
731-
Context.Return.Write("(::{0}*)", @class.QualifiedOriginalName);
730+
Context.Return.Write($"({(@class.IsUnion ? "union" : "struct")} ::{@class.QualifiedOriginalName}*)");
732731
Context.Return.Write("NativePtr");
733732
return;
734733
}
735734

736-
Context.Return.Write("(::{0}*)", @class.QualifiedOriginalName);
735+
Context.Return.Write($"({(@class.IsUnion ? "union" : "struct")} ::{@class.QualifiedOriginalName}*)");
737736
Context.Return.Write("{0}->NativePtr", Context.Parameter.Name);
738737
}
739738

@@ -858,7 +857,7 @@ public override bool VisitTypedefDecl(TypedefDecl typedef)
858857

859858
public override bool VisitEnumDecl(Enumeration @enum)
860859
{
861-
Context.Return.Write("(::{0}){1}", @enum.QualifiedOriginalName,
860+
Context.Return.Write("(enum ::{0}){1}", @enum.QualifiedOriginalName,
862861
Context.Parameter.Name);
863862
return true;
864863
}

0 commit comments

Comments
 (0)