Skip to content

Commit b37095c

Browse files
committed
Improve codegen for a few expression kinds
1 parent 6a53e4e commit b37095c

File tree

21 files changed

+474
-241
lines changed

21 files changed

+474
-241
lines changed

sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.VisitDecl.cs

Lines changed: 60 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
using static ClangSharp.Interop.CXUnaryOperatorKind;
1919
using static ClangSharp.Interop.CXEvalResultKind;
2020
using static ClangSharp.Interop.CXTypeKind;
21+
using ClangSharp.Interop;
2122

2223
namespace ClangSharp;
2324

@@ -822,13 +823,33 @@ void VisitCtorInitializers(CXXConstructorDecl cxxConstructorDecl, int firstCtorI
822823
memberInitName = GetRemappedCursorName(declRefExpr.Decl);
823824
}
824825

825-
_outputBuilder.BeginConstructorInitializer(memberRefName, memberInitName);
826+
var skipInitializer = false;
827+
var typeName = "";
828+
829+
if (memberInit is InitListExpr initListExpr)
830+
{
831+
typeName = GetRemappedTypeName(initListExpr, context: null, initListExpr.Type, out _);
832+
}
833+
834+
if (string.Equals(memberRefName, typeName, StringComparison.Ordinal))
835+
{
836+
skipInitializer = true;
837+
}
838+
else
839+
{
840+
_outputBuilder.BeginConstructorInitializer(memberRefName, memberInitName);
841+
}
826842

827843
var memberRefTypeName = GetRemappedTypeName(memberRef, context: null, memberRef.Type, out var memberRefNativeTypeName);
828844

845+
_ = _context.AddLast((cxxConstructorDecl, skipInitializer));
829846
UncheckStmt(memberRefTypeName, memberInit);
847+
_context.RemoveLast();
830848

831-
_outputBuilder.EndConstructorInitializer();
849+
if (!skipInitializer)
850+
{
851+
_outputBuilder.EndConstructorInitializer();
852+
}
832853
}
833854
}
834855
}
@@ -1083,15 +1104,32 @@ private void VisitIndirectFieldDecl(IndirectFieldDecl indirectFieldDecl)
10831104

10841105
if (isFixedSizedBuffer)
10851106
{
1107+
var arraySize = IsType<ConstantArrayType>(indirectFieldDecl, type, out var constantArrayType) ? constantArrayType.Size : 0;
1108+
arraySize = Math.Max(arraySize, 1);
1109+
10861110
if (isSupportedFixedSizedBufferType)
10871111
{
10881112
code.Write("[0], ");
1089-
code.Write(Math.Max(IsType<ConstantArrayType>(indirectFieldDecl, type, out var constantArrayType) ? constantArrayType.Size : 0, 1));
1113+
code.Write(arraySize);
10901114
code.Write(')');
10911115
}
1092-
else if (!_config.GenerateLatestCode)
1116+
else if (!_config.GenerateLatestCode || arraySize == 1)
10931117
{
1094-
code.Write(".AsSpan()");
1118+
code.Write(".AsSpan(");
1119+
1120+
if (arraySize == 1)
1121+
{
1122+
if (TryGetRemappedValue(indirectFieldDecl, _config.WithLengths, out var length))
1123+
{
1124+
code.Write(length);
1125+
}
1126+
else
1127+
{
1128+
AddDiagnostic(DiagnosticLevel.Warning, $"Found variable length array: '{GetCursorQualifiedName(indirectFieldDecl)}'. Please specify the length using `--with-length <string>`.", indirectFieldDecl);
1129+
}
1130+
}
1131+
1132+
code.Write(')');
10951133
}
10961134
}
10971135
else
@@ -1639,11 +1677,9 @@ private void VisitRecordDecl(RecordDecl recordDecl)
16391677
var cxxBaseSpecifier = cxxRecordDecl.Bases[index];
16401678
var baseCxxRecordDecl = GetRecordDecl(cxxBaseSpecifier);
16411679

1642-
if (HasField(baseCxxRecordDecl))
1680+
if (HasField(baseCxxRecordDecl) && !IsBaseExcluded(cxxRecordDecl, baseCxxRecordDecl, cxxBaseSpecifier, out var baseFieldName))
16431681
{
16441682
var parent = GetRemappedCursorName(baseCxxRecordDecl);
1645-
var baseFieldName = GetAnonymousName(cxxBaseSpecifier, "Base");
1646-
baseFieldName = GetRemappedName(baseFieldName, cxxBaseSpecifier, tryRemapOperatorName: true, out var wasRemapped, skipUsing: true);
16471683

16481684
var fieldDesc = new FieldDesc {
16491685
AccessSpecifier = GetAccessSpecifier(baseCxxRecordDecl, matchStar: true),
@@ -1771,14 +1807,22 @@ private void VisitRecordDecl(RecordDecl recordDecl)
17711807
{
17721808
foreach (var cxxConstructorDecl in cxxRecordDecl.Ctors)
17731809
{
1774-
Visit(cxxConstructorDecl);
1775-
_outputBuilder.WriteDivider();
1810+
if (!IsExcluded(cxxConstructorDecl))
1811+
{
1812+
Visit(cxxConstructorDecl);
1813+
_outputBuilder.WriteDivider();
1814+
}
17761815
}
17771816

1778-
if (cxxRecordDecl.HasUserDeclaredDestructor && !cxxRecordDecl.Destructor.IsVirtual)
1817+
if (cxxRecordDecl.HasUserDeclaredDestructor)
17791818
{
1780-
Visit(cxxRecordDecl.Destructor);
1781-
_outputBuilder.WriteDivider();
1819+
var cxxDestructorDecl = cxxRecordDecl.Destructor;
1820+
1821+
if (!cxxDestructorDecl.IsVirtual && !IsExcluded(cxxDestructorDecl))
1822+
{
1823+
Visit(cxxDestructorDecl);
1824+
_outputBuilder.WriteDivider();
1825+
}
17821826
}
17831827

17841828
if (hasVtbl || hasBaseVtbl)
@@ -3714,14 +3758,14 @@ private bool IsConstant(string targetTypeName, Expr initExpr)
37143758
case CX_StmtClass_CStyleCastExpr:
37153759
case CX_StmtClass_CXXStaticCastExpr:
37163760
case CX_StmtClass_CXXFunctionalCastExpr:
3761+
case CX_StmtClass_CXXConstCastExpr:
3762+
case CX_StmtClass_CXXDynamicCastExpr:
3763+
case CX_StmtClass_CXXReinterpretCastExpr:
37173764
{
37183765
var cxxFunctionalCastExpr = (ExplicitCastExpr)initExpr;
37193766
return IsConstant(targetTypeName, cxxFunctionalCastExpr.SubExprAsWritten);
37203767
}
37213768

3722-
// case CX_StmtClass_CXXConstCastExpr:
3723-
// case CX_StmtClass_CXXDynamicCastExpr:
3724-
// case CX_StmtClass_CXXReinterpretCastExpr:
37253769
// case CX_StmtClass_ObjCBridgedCastExpr:
37263770

37273771
case CX_StmtClass_ImplicitCastExpr:

0 commit comments

Comments
 (0)