Skip to content

Commit fceb204

Browse files
committed
Fixed the generated C# for members of types nested in templates.
Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent cdc2e73 commit fceb204

File tree

26 files changed

+211
-64
lines changed

26 files changed

+211
-64
lines changed

src/AST/ClassExtensions.cs

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -148,21 +148,36 @@ public static IEnumerable<TranslationUnit> GetGenerated(this IEnumerable<Transla
148148
return units.Where(u => u.IsGenerated && (u.HasDeclarations || u.IsSystemHeader) && u.IsValid);
149149
}
150150

151-
public static List<ClassTemplateSpecialization> GetSpecializationsToGenerate(
152-
this Class classTemplate)
151+
public static IEnumerable<Class> GetSpecializedClassesToGenerate(
152+
this Class dependentClass)
153153
{
154-
if (classTemplate.HasDependentValueFieldInLayout())
155-
return classTemplate.Specializations;
154+
IEnumerable<Class> specializedClasses = GetSpecializedClassesOf(dependentClass);
155+
if (!specializedClasses.Any() || dependentClass.HasDependentValueFieldInLayout())
156+
return specializedClasses;
156157

157-
var specializations = new List<ClassTemplateSpecialization>();
158-
var specialization = classTemplate.Specializations.FirstOrDefault(s => !s.Ignore);
158+
var specializations = new List<Class>();
159+
var specialization = specializedClasses.FirstOrDefault(s => s.IsGenerated);
159160
if (specialization == null)
160-
specializations.Add(classTemplate.Specializations[0]);
161+
specializations.Add(specializedClasses.First());
161162
else
162163
specializations.Add(specialization);
163164
return specializations;
164165
}
165166

167+
private static IEnumerable<Class> GetSpecializedClassesOf(this Class dependentClass)
168+
{
169+
if (dependentClass.IsTemplate)
170+
return dependentClass.Specializations;
171+
172+
Class template = dependentClass.Namespace as Class;
173+
if (template == null || !template.IsTemplate)
174+
// just one level of nesting supported for the time being
175+
return Enumerable.Empty<Class>();
176+
177+
return template.Specializations.SelectMany(s => s.Classes.Where(
178+
c => c.Name == dependentClass.Name)).ToList();
179+
}
180+
166181
public static bool HasDependentValueFieldInLayout(this Class @class)
167182
{
168183
if (@class.Fields.Any(f => IsValueDependent(f.Type)))

src/CLI/Generator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ public void Setup(Driver driver)
189189
driverOptions.CompileCode = options.Compile;
190190
driverOptions.OutputDir = options.OutputDir;
191191
driverOptions.CheckSymbols = options.CheckSymbols;
192-
driverOptions.UnityBuild = options.UnityBuild;
192+
parserOptions.UnityBuild = options.UnityBuild;
193193
driverOptions.Verbose = options.Verbose;
194194
}
195195

src/CppParser/AST.cpp

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,8 @@ Namespace* DeclarationContext::FindCreateNamespace(const std::string& Name)
350350
return _namespace;
351351
}
352352

353-
Class* DeclarationContext::FindClass(const std::string& Name, bool IsComplete)
353+
Class* DeclarationContext::FindClass(const void* OriginalPtr,
354+
const std::string& Name, bool IsComplete)
354355
{
355356
if (Name.empty()) return nullptr;
356357

@@ -359,8 +360,9 @@ Class* DeclarationContext::FindClass(const std::string& Name, bool IsComplete)
359360
if (entries.size() == 1)
360361
{
361362
auto _class = std::find_if(Classes.begin(), Classes.end(),
362-
[&](Class* klass) { return klass->name == Name &&
363-
(klass->isIncomplete == !IsComplete); });
363+
[OriginalPtr, Name, IsComplete](Class* klass) {
364+
return (OriginalPtr && klass->originalPtr == OriginalPtr) ||
365+
(klass->name == Name && klass->isIncomplete == !IsComplete); });
364366

365367
return _class != Classes.end() ? *_class : nullptr;
366368
}
@@ -374,10 +376,10 @@ Class* DeclarationContext::FindClass(const std::string& Name, bool IsComplete)
374376
if (!_namespace)
375377
return nullptr;
376378

377-
return _namespace->FindClass(className, IsComplete);
379+
return _namespace->FindClass(OriginalPtr, className, IsComplete);
378380
}
379381

380-
Class* DeclarationContext::CreateClass(std::string Name, bool IsComplete)
382+
Class* DeclarationContext::CreateClass(const std::string& Name, bool IsComplete)
381383
{
382384
auto _class = new Class();
383385
_class->name = Name;
@@ -387,10 +389,10 @@ Class* DeclarationContext::CreateClass(std::string Name, bool IsComplete)
387389
return _class;
388390
}
389391

390-
Class* DeclarationContext::FindClass(const std::string& Name, bool IsComplete,
391-
bool Create)
392+
Class* DeclarationContext::FindClass(const void* OriginalPtr,
393+
const std::string& Name, bool IsComplete, bool Create)
392394
{
393-
auto _class = FindClass(Name, IsComplete);
395+
auto _class = FindClass(OriginalPtr, Name, IsComplete);
394396

395397
if (!_class)
396398
{

src/CppParser/AST.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -516,9 +516,9 @@ class CS_API DeclarationContext : public Declaration
516516
CS_IGNORE Namespace* FindNamespace(const std::vector<std::string>&);
517517
CS_IGNORE Namespace* FindCreateNamespace(const std::string& Name);
518518

519-
CS_IGNORE Class* CreateClass(std::string Name, bool IsComplete);
520-
CS_IGNORE Class* FindClass(const std::string& Name, bool IsComplete);
521-
CS_IGNORE Class* FindClass(const std::string& Name, bool IsComplete,
519+
CS_IGNORE Class* CreateClass(const std::string& Name, bool IsComplete);
520+
CS_IGNORE Class* FindClass(const void* OriginalPtr, const std::string& Name, bool IsComplete);
521+
CS_IGNORE Class* FindClass(const void* OriginalPtr, const std::string& Name, bool IsComplete,
522522
bool Create);
523523

524524
CS_IGNORE template<typename T> T* FindTemplate(const std::string& USR);

src/CppParser/Bindings/CLI/CppParser.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,16 @@ void CppSharp::Parser::CppParserOptions::Verbose::set(bool value)
480480
((::CppSharp::CppParser::CppParserOptions*)NativePtr)->verbose = value;
481481
}
482482

483+
bool CppSharp::Parser::CppParserOptions::UnityBuild::get()
484+
{
485+
return ((::CppSharp::CppParser::CppParserOptions*)NativePtr)->unityBuild;
486+
}
487+
488+
void CppSharp::Parser::CppParserOptions::UnityBuild::set(bool value)
489+
{
490+
((::CppSharp::CppParser::CppParserOptions*)NativePtr)->unityBuild = value;
491+
}
492+
483493
unsigned int CppSharp::Parser::CppParserOptions::ArgumentsCount::get()
484494
{
485495
auto __ret = ((::CppSharp::CppParser::CppParserOptions*)NativePtr)->getArgumentsCount();

src/CppParser/Bindings/CLI/CppParser.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,12 @@ namespace CppSharp
187187
void set(bool);
188188
}
189189

190+
property bool UnityBuild
191+
{
192+
bool get();
193+
void set(bool);
194+
}
195+
190196
property unsigned int ArgumentsCount
191197
{
192198
unsigned int get();

src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/CppSharp.CppParser.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18051,7 +18051,7 @@ protected Parser(void* native, bool skipVTables = false)
1805118051

1805218052
public unsafe partial class CppParserOptions : IDisposable
1805318053
{
18054-
[StructLayout(LayoutKind.Explicit, Size = 148)]
18054+
[StructLayout(LayoutKind.Explicit, Size = 152)]
1805518055
public partial struct __Internal
1805618056
{
1805718057
[FieldOffset(0)]
@@ -18108,6 +18108,9 @@ public partial struct __Internal
1810818108
[FieldOffset(147)]
1810918109
internal byte verbose;
1811018110

18111+
[FieldOffset(148)]
18112+
internal byte unityBuild;
18113+
1811118114
[SuppressUnmanagedCodeSecurity]
1811218115
[DllImport("CppSharp.CppParser", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
1811318116
EntryPoint="_ZN8CppSharp9CppParser16CppParserOptionsC2Ev")]
@@ -18638,6 +18641,19 @@ public bool Verbose
1863818641
}
1863918642
}
1864018643

18644+
public bool UnityBuild
18645+
{
18646+
get
18647+
{
18648+
return ((global::CppSharp.Parser.CppParserOptions.__Internal*) __Instance)->unityBuild != 0;
18649+
}
18650+
18651+
set
18652+
{
18653+
((global::CppSharp.Parser.CppParserOptions.__Internal*) __Instance)->unityBuild = (byte) (value ? 1 : 0);
18654+
}
18655+
}
18656+
1864118657
public uint ArgumentsCount
1864218658
{
1864318659
get

src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/CppSharp.CppParser.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18051,7 +18051,7 @@ protected Parser(void* native, bool skipVTables = false)
1805118051

1805218052
public unsafe partial class CppParserOptions : IDisposable
1805318053
{
18054-
[StructLayout(LayoutKind.Explicit, Size = 184)]
18054+
[StructLayout(LayoutKind.Explicit, Size = 188)]
1805518055
public partial struct __Internal
1805618056
{
1805718057
[FieldOffset(0)]
@@ -18108,6 +18108,9 @@ public partial struct __Internal
1810818108
[FieldOffset(183)]
1810918109
internal byte verbose;
1811018110

18111+
[FieldOffset(184)]
18112+
internal byte unityBuild;
18113+
1811118114
[SuppressUnmanagedCodeSecurity]
1811218115
[DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.ThisCall,
1811318116
EntryPoint="??0CppParserOptions@CppParser@CppSharp@@QAE@XZ")]
@@ -18638,6 +18641,19 @@ public bool Verbose
1863818641
}
1863918642
}
1864018643

18644+
public bool UnityBuild
18645+
{
18646+
get
18647+
{
18648+
return ((global::CppSharp.Parser.CppParserOptions.__Internal*) __Instance)->unityBuild != 0;
18649+
}
18650+
18651+
set
18652+
{
18653+
((global::CppSharp.Parser.CppParserOptions.__Internal*) __Instance)->unityBuild = (byte) (value ? 1 : 0);
18654+
}
18655+
}
18656+
1864118657
public uint ArgumentsCount
1864218658
{
1864318659
get

src/CppParser/Bindings/CSharp/x86_64-apple-darwin12.4.0/CppSharp.CppParser.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18050,7 +18050,7 @@ protected Parser(void* native, bool skipVTables = false)
1805018050

1805118051
public unsafe partial class CppParserOptions : IDisposable
1805218052
{
18053-
[StructLayout(LayoutKind.Explicit, Size = 288)]
18053+
[StructLayout(LayoutKind.Explicit, Size = 296)]
1805418054
public partial struct __Internal
1805518055
{
1805618056
[FieldOffset(0)]
@@ -18107,6 +18107,9 @@ public partial struct __Internal
1810718107
[FieldOffset(287)]
1810818108
internal byte verbose;
1810918109

18110+
[FieldOffset(288)]
18111+
internal byte unityBuild;
18112+
1811018113
[SuppressUnmanagedCodeSecurity]
1811118114
[DllImport("CppSharp.CppParser", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
1811218115
EntryPoint="_ZN8CppSharp9CppParser16CppParserOptionsC2Ev")]
@@ -18637,6 +18640,19 @@ public bool Verbose
1863718640
}
1863818641
}
1863918642

18643+
public bool UnityBuild
18644+
{
18645+
get
18646+
{
18647+
return ((global::CppSharp.Parser.CppParserOptions.__Internal*) __Instance)->unityBuild != 0;
18648+
}
18649+
18650+
set
18651+
{
18652+
((global::CppSharp.Parser.CppParserOptions.__Internal*) __Instance)->unityBuild = (byte) (value ? 1 : 0);
18653+
}
18654+
}
18655+
1864018656
public uint ArgumentsCount
1864118657
{
1864218658
get

src/CppParser/Bindings/CSharp/x86_64-linux-gnu-cxx11abi/CppSharp.CppParser.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18050,7 +18050,7 @@ protected Parser(void* native, bool skipVTables = false)
1805018050

1805118051
public unsafe partial class CppParserOptions : IDisposable
1805218052
{
18053-
[StructLayout(LayoutKind.Explicit, Size = 312)]
18053+
[StructLayout(LayoutKind.Explicit, Size = 320)]
1805418054
public partial struct __Internal
1805518055
{
1805618056
[FieldOffset(0)]
@@ -18107,6 +18107,9 @@ public partial struct __Internal
1810718107
[FieldOffset(311)]
1810818108
internal byte verbose;
1810918109

18110+
[FieldOffset(312)]
18111+
internal byte unityBuild;
18112+
1811018113
[SuppressUnmanagedCodeSecurity]
1811118114
[DllImport("CppSharp.CppParser", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
1811218115
EntryPoint="_ZN8CppSharp9CppParser16CppParserOptionsC2Ev")]
@@ -18637,6 +18640,19 @@ public bool Verbose
1863718640
}
1863818641
}
1863918642

18643+
public bool UnityBuild
18644+
{
18645+
get
18646+
{
18647+
return ((global::CppSharp.Parser.CppParserOptions.__Internal*) __Instance)->unityBuild != 0;
18648+
}
18649+
18650+
set
18651+
{
18652+
((global::CppSharp.Parser.CppParserOptions.__Internal*) __Instance)->unityBuild = (byte) (value ? 1 : 0);
18653+
}
18654+
}
18655+
1864018656
public uint ArgumentsCount
1864118657
{
1864218658
get

0 commit comments

Comments
 (0)