Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
a4f8d3d
Start of XML output
Perksey Feb 26, 2021
a31cf58
Continuation of XML output
Perksey Feb 28, 2021
52a599b
Add Rider stuff to the .gitignore
Perksey Mar 1, 2021
97d0bc5
Start breaking the ice on COM
Perksey Mar 1, 2021
4d616d9
Finished(?) structs with COM helpers
Perksey Mar 2, 2021
f2f9c60
It builds!
Perksey Mar 6, 2021
b731d68
Change to om
Perksey Mar 6, 2021
6abed31
Fix NRE
Perksey Mar 6, 2021
5839eaa
Initial set of fixes
Perksey Mar 12, 2021
5067c52
C# fixes
Perksey Mar 14, 2021
f02ea2f
XML fixes
Perksey Mar 14, 2021
c68af8d
Internalise
Perksey Mar 14, 2021
45d6fd8
Internalise OutputBuilderFactory
Perksey Mar 14, 2021
1159f39
Fix some tests
Perksey Mar 15, 2021
13a791a
Be more stern with our dividers
Perksey Mar 15, 2021
ae28f46
Continued
Perksey Mar 15, 2021
442e42a
Revert "Continued"
Perksey Mar 15, 2021
a4c191f
Try hacking something together
Perksey Mar 15, 2021
53c2750
Move
Perksey Mar 15, 2021
150d692
Try again
Perksey Mar 15, 2021
4e7a0f0
Boolean logic is failing me
Perksey Mar 15, 2021
6442664
Somewhat hacky fix but it makes sense
Perksey Mar 15, 2021
32ddd9a
ConstantDesc
Perksey Mar 15, 2021
c53ad60
FieldDesc
Perksey Mar 15, 2021
bdb75fb
Flags
Perksey Mar 15, 2021
f11382c
Update FunctionOrDelegateDesc.cs
Perksey Mar 16, 2021
a8f1191
Update FunctionOrDelegateDesc.cs
Perksey Mar 16, 2021
398708e
Update StructDesc.cs
Perksey Mar 16, 2021
a4b16f4
Accessibility enums?
Perksey Mar 16, 2021
3194999
Calling convention enum
Perksey Mar 17, 2021
f44fd1a
Merge remote-tracking branch 'origin/master' into feature/xml
tannergooding Mar 17, 2021
5c874f6
Set vtbl methods as unsafe by default
Perksey Mar 19, 2021
fe47eac
Ensure "unsafe" is inserted for standalone delegates
tannergooding Mar 20, 2021
1c6f0d3
Merge remote-tracking branch 'origin/master' into feature/xml
tannergooding Mar 20, 2021
c13e4ea
Ensure unsafe isn't emitted on the method class due to vtbl helper me…
tannergooding Mar 20, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,9 @@ obj/
###############################################################################
.vs/
*.csproj.user

###############################################################################
# Rider
###############################################################################
.idea/
*.DotSettings.user
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace ClangSharp.Abstractions
{
public enum AccessSpecifier : byte
{
None,
Public,
Protected,
ProtectedInternal,
Internal,
PrivateProtected,
Private
}
}
11 changes: 11 additions & 0 deletions sources/ClangSharp.PInvokeGenerator/Abstractions/ConstantDesc.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace ClangSharp.Abstractions
{
internal struct ConstantDesc
{
public AccessSpecifier AccessSpecifier { get; set; }
public string TypeName { get; set; }
public string EscapedName { get; set; }
public string NativeTypeName { get; set; }
public ConstantKind Kind { get; set; }
}
}
14 changes: 14 additions & 0 deletions sources/ClangSharp.PInvokeGenerator/Abstractions/ConstantKind.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using System;

namespace ClangSharp.Abstractions
{
[Flags]
internal enum ConstantKind
{
None = 0,
ReadOnly = 1 << 0,
Enumerator = 1 << 1,
PrimitiveConstant = 1 << 2,
NonPrimitiveConstant = 1 << 3
}
}
12 changes: 12 additions & 0 deletions sources/ClangSharp.PInvokeGenerator/Abstractions/FieldDesc.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace ClangSharp.Abstractions
{
internal struct FieldDesc
{
public AccessSpecifier AccessSpecifier { get; set; }
public string NativeTypeName { get; set; }
public string EscapedName { get; set; }
public int? Offset { get; set; }
public bool NeedsNewKeyword { get; set; }
public string InheritedFrom { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
using System;
using System.Runtime.InteropServices;

namespace ClangSharp.Abstractions
{
internal struct FunctionOrDelegateDesc<TCustomAttrGeneratorData>
{
public AccessSpecifier AccessSpecifier { get; set; }
public string NativeTypeName { get; set; }
public string EscapedName { get; set; }
public string EntryPoint { get; set; }
public string LibraryPath { get; set; }
public CallingConvention CallingConvention { get; set; }
public FunctionOrDelegateFlags Flags { get; set; }

public bool IsVirtual
{
get => (Flags & FunctionOrDelegateFlags.IsVirtual) != 0;
set => Flags =
value ? Flags | FunctionOrDelegateFlags.IsVirtual : Flags & ~FunctionOrDelegateFlags.IsVirtual;
}

public bool IsDllImport
{
get => (Flags & FunctionOrDelegateFlags.IsDllImport) != 0;
set => Flags = value
? Flags | FunctionOrDelegateFlags.IsDllImport
: Flags & ~FunctionOrDelegateFlags.IsDllImport;
}

public bool HasFnPtrCodeGen
{
get => (Flags & FunctionOrDelegateFlags.HasFnPtrCodeGen) != 0;
set => Flags = value
? Flags | FunctionOrDelegateFlags.HasFnPtrCodeGen
: Flags & ~FunctionOrDelegateFlags.HasFnPtrCodeGen;
}

public bool IsAggressivelyInlined
{
get => (Flags & FunctionOrDelegateFlags.IsAggressivelyInlined) != 0;
set => Flags = value
? Flags | FunctionOrDelegateFlags.IsAggressivelyInlined
: Flags & ~FunctionOrDelegateFlags.IsAggressivelyInlined;
}

public bool SetLastError
{
get => (Flags & FunctionOrDelegateFlags.SetLastError) != 0;
set => Flags = value
? Flags | FunctionOrDelegateFlags.SetLastError
: Flags & ~FunctionOrDelegateFlags.SetLastError;
}

public bool IsCxx
{
get => (Flags & FunctionOrDelegateFlags.IsCxx) != 0;
set => Flags = value ? Flags | FunctionOrDelegateFlags.IsCxx : Flags & ~FunctionOrDelegateFlags.IsCxx;
}

public bool NeedsNewKeyword
{
get => (Flags & FunctionOrDelegateFlags.NeedsNewKeyword) != 0;
set => Flags = value
? Flags | FunctionOrDelegateFlags.NeedsNewKeyword
: Flags & ~FunctionOrDelegateFlags.NeedsNewKeyword;
}

public bool IsUnsafe
{
get => (Flags & FunctionOrDelegateFlags.IsUnsafe) != 0;
set => Flags = value ? Flags | FunctionOrDelegateFlags.IsUnsafe : Flags & ~FunctionOrDelegateFlags.IsUnsafe;
}

public bool IsCtxCxxRecord
{
get => (Flags & FunctionOrDelegateFlags.IsCtxCxxRecord) != 0;
set => Flags = value
? Flags | FunctionOrDelegateFlags.IsCtxCxxRecord
: Flags & ~FunctionOrDelegateFlags.IsCtxCxxRecord;
}

public bool IsCxxRecordCtxUnsafe
{
get => (Flags & FunctionOrDelegateFlags.IsCxxRecordCtxUnsafe) != 0;
set => Flags = value
? Flags | FunctionOrDelegateFlags.IsCxxRecordCtxUnsafe
: Flags & ~FunctionOrDelegateFlags.IsCxxRecordCtxUnsafe;
}

public bool IsMemberFunction
{
get => (Flags & FunctionOrDelegateFlags.IsMemberFunction) != 0;
set => Flags = value
? Flags | FunctionOrDelegateFlags.IsMemberFunction
: Flags & ~FunctionOrDelegateFlags.IsMemberFunction;
}

public bool? IsStatic
{
get => (Flags & FunctionOrDelegateFlags.IsStatic) != 0 ? true :
(Flags & FunctionOrDelegateFlags.IsNotStatic) != 0 ? false : null;
set => Flags = value switch
{
// true - static, false - not static, null - infer
true => Flags | FunctionOrDelegateFlags.IsStatic & ~FunctionOrDelegateFlags.IsNotStatic,
false => Flags & ~FunctionOrDelegateFlags.IsStatic | FunctionOrDelegateFlags.IsNotStatic,
null => Flags & ~FunctionOrDelegateFlags.IsStatic & ~FunctionOrDelegateFlags.IsNotStatic
};
}

public Action<TCustomAttrGeneratorData> WriteCustomAttrs { get; set; }
public TCustomAttrGeneratorData CustomAttrGeneratorData { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace ClangSharp.Abstractions
{
internal partial interface IOutputBuilder
{
void WriteDivider(bool force = false);
void SuppressDivider();

void WriteCustomAttribute(string attribute);
void WriteIid(string iidName, string iidValue);
void EmitUsingDirective(string directive);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
using System;
using System.Collections.Generic;
using ClangSharp.CSharp;

namespace ClangSharp.Abstractions
{
internal partial interface IOutputBuilder
{
void BeginInnerValue();
void EndInnerValue();

void BeginInnerCast();
void WriteCastType(string targetTypeName);
void EndInnerCast();

void BeginUnchecked();
void EndUnchecked();

void BeginConstant(in ConstantDesc desc);
void BeginConstantValue(bool isGetOnlyProperty = false);
void WriteConstantValue(long value);
void WriteConstantValue(ulong value);
void EndConstantValue();
void EndConstant(bool isConstant);

void BeginEnum(AccessSpecifier accessSpecifier, string typeName, string escapedName, string nativeTypeName);
void EndEnum();

void BeginField(in FieldDesc desc);
void WriteFixedCountField(string typeName, string escapedName, string fixedName, string count);
void WriteRegularField(string typeName, string escapedName);
void EndField(bool isBodyless = true);

void BeginFunctionOrDelegate<TCustomAttrGeneratorData>(in FunctionOrDelegateDesc<TCustomAttrGeneratorData> info,
ref bool isMethodClassUnsafe);
void WriteReturnType(string typeString);
void BeginFunctionInnerPrototype(string escapedName);
void BeginParameter<TCustomAttrGeneratorData>(in ParameterDesc<TCustomAttrGeneratorData> info);
void BeginParameterDefault();
void EndParameterDefault();
void EndParameter();
void WriteParameterSeparator();
void EndFunctionInnerPrototype();
void BeginConstructorInitializer(string memberRefName, string memberInitName);
void EndConstructorInitializer();
void BeginBody(bool isExpressionBody = false);
void BeginConstructorInitializers();
void EndConstructorInitializers();
void BeginInnerFunctionBody();
void EndInnerFunctionBody();
void EndBody(bool isExpressionBody = false);
void EndFunctionOrDelegate(bool isVirtual, bool isBodyless);

void BeginStruct<TCustomAttrGeneratorData>(in StructDesc<TCustomAttrGeneratorData> info);
void BeginExplicitVtbl();
void EndExplicitVtbl();
void EndStruct();

void EmitCompatibleCodeSupport();
void EmitFnPtrSupport();
void EmitSystemSupport();

CSharpOutputBuilder BeginCSharpCode();
void EndCSharpCode(CSharpOutputBuilder output);

void BeginGetter(bool aggressivelyInlined);
void EndGetter();
void BeginSetter(bool aggressivelyInlined);
void EndSetter();

void BeginIndexer(AccessSpecifier accessSpecifier, bool isUnsafe);
void WriteIndexer(string typeName);
void BeginIndexerParameters();
void EndIndexerParameters();
void EndIndexer();

void BeginDereference();
void EndDereference();
}
}
11 changes: 11 additions & 0 deletions sources/ClangSharp.PInvokeGenerator/Abstractions/IOutputBuilder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using System.Collections.Generic;

namespace ClangSharp.Abstractions
{
internal partial interface IOutputBuilder
{
bool IsTestOutput { get; }
string Name { get; }
string Extension { get; }
}
}
15 changes: 15 additions & 0 deletions sources/ClangSharp.PInvokeGenerator/Abstractions/ParameterDesc.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;

namespace ClangSharp.Abstractions
{
internal struct ParameterDesc<TCustomAttrGeneratorData>
{
public string Type { get; set; }
public string Name { get; set; }
public string NativeTypeName { get; set; }
public IEnumerable<string> CppAttributes { get; set; }
public Action<TCustomAttrGeneratorData> WriteCustomAttrs { get; set; }
public TCustomAttrGeneratorData CustomAttrGeneratorData { get; set; }
}
}
31 changes: 31 additions & 0 deletions sources/ClangSharp.PInvokeGenerator/Abstractions/StructDesc.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using System;
using System.Runtime.InteropServices;

namespace ClangSharp.Abstractions
{
internal struct StructDesc<TCustomAttrGeneratorData>
{
public AccessSpecifier AccessSpecifier { get; set; }
public string EscapedName { get; set; }
public string NativeType { get; set; }
public string NativeInheritance { get; set; }
public StructLayoutAttribute Layout { get; set; }
public Guid? Uuid { get; set; }
public StructFlags Flags { get; set; }

public bool IsUnsafe
{
get => (Flags & StructFlags.IsUnsafe) != 0;
set => Flags = value ? Flags | StructFlags.IsUnsafe : Flags & ~StructFlags.IsUnsafe;
}

public bool HasVtbl
{
get => (Flags & StructFlags.HasVtbl) != 0;
set => Flags = value ? Flags | StructFlags.HasVtbl : Flags & ~StructFlags.HasVtbl;
}

public Action<TCustomAttrGeneratorData> WriteCustomAttrs { get; set; }
public TCustomAttrGeneratorData CustomAttrGeneratorData { get; set; }
}
}
11 changes: 11 additions & 0 deletions sources/ClangSharp.PInvokeGenerator/Abstractions/StructFlags.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using System;

namespace ClangSharp.Abstractions
{
[Flags]
public enum StructFlags
{
IsUnsafe = 1 << 0,
HasVtbl = 1 << 1
}
}
Loading