|
18 | 18 | using static ClangSharp.Interop.CXUnaryOperatorKind;
|
19 | 19 | using static ClangSharp.Interop.CXEvalResultKind;
|
20 | 20 | using static ClangSharp.Interop.CXTypeKind;
|
| 21 | +using ClangSharp.Interop; |
21 | 22 |
|
22 | 23 | namespace ClangSharp;
|
23 | 24 |
|
@@ -822,13 +823,33 @@ void VisitCtorInitializers(CXXConstructorDecl cxxConstructorDecl, int firstCtorI
|
822 | 823 | memberInitName = GetRemappedCursorName(declRefExpr.Decl);
|
823 | 824 | }
|
824 | 825 |
|
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 | + } |
826 | 842 |
|
827 | 843 | var memberRefTypeName = GetRemappedTypeName(memberRef, context: null, memberRef.Type, out var memberRefNativeTypeName);
|
828 | 844 |
|
| 845 | + _ = _context.AddLast((cxxConstructorDecl, skipInitializer)); |
829 | 846 | UncheckStmt(memberRefTypeName, memberInit);
|
| 847 | + _context.RemoveLast(); |
830 | 848 |
|
831 |
| - _outputBuilder.EndConstructorInitializer(); |
| 849 | + if (!skipInitializer) |
| 850 | + { |
| 851 | + _outputBuilder.EndConstructorInitializer(); |
| 852 | + } |
832 | 853 | }
|
833 | 854 | }
|
834 | 855 | }
|
@@ -1083,15 +1104,32 @@ private void VisitIndirectFieldDecl(IndirectFieldDecl indirectFieldDecl)
|
1083 | 1104 |
|
1084 | 1105 | if (isFixedSizedBuffer)
|
1085 | 1106 | {
|
| 1107 | + var arraySize = IsType<ConstantArrayType>(indirectFieldDecl, type, out var constantArrayType) ? constantArrayType.Size : 0; |
| 1108 | + arraySize = Math.Max(arraySize, 1); |
| 1109 | + |
1086 | 1110 | if (isSupportedFixedSizedBufferType)
|
1087 | 1111 | {
|
1088 | 1112 | code.Write("[0], ");
|
1089 |
| - code.Write(Math.Max(IsType<ConstantArrayType>(indirectFieldDecl, type, out var constantArrayType) ? constantArrayType.Size : 0, 1)); |
| 1113 | + code.Write(arraySize); |
1090 | 1114 | code.Write(')');
|
1091 | 1115 | }
|
1092 |
| - else if (!_config.GenerateLatestCode) |
| 1116 | + else if (!_config.GenerateLatestCode || arraySize == 1) |
1093 | 1117 | {
|
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(')'); |
1095 | 1133 | }
|
1096 | 1134 | }
|
1097 | 1135 | else
|
@@ -1639,11 +1677,9 @@ private void VisitRecordDecl(RecordDecl recordDecl)
|
1639 | 1677 | var cxxBaseSpecifier = cxxRecordDecl.Bases[index];
|
1640 | 1678 | var baseCxxRecordDecl = GetRecordDecl(cxxBaseSpecifier);
|
1641 | 1679 |
|
1642 |
| - if (HasField(baseCxxRecordDecl)) |
| 1680 | + if (HasField(baseCxxRecordDecl) && !IsBaseExcluded(cxxRecordDecl, baseCxxRecordDecl, cxxBaseSpecifier, out var baseFieldName)) |
1643 | 1681 | {
|
1644 | 1682 | var parent = GetRemappedCursorName(baseCxxRecordDecl);
|
1645 |
| - var baseFieldName = GetAnonymousName(cxxBaseSpecifier, "Base"); |
1646 |
| - baseFieldName = GetRemappedName(baseFieldName, cxxBaseSpecifier, tryRemapOperatorName: true, out var wasRemapped, skipUsing: true); |
1647 | 1683 |
|
1648 | 1684 | var fieldDesc = new FieldDesc {
|
1649 | 1685 | AccessSpecifier = GetAccessSpecifier(baseCxxRecordDecl, matchStar: true),
|
@@ -1771,14 +1807,22 @@ private void VisitRecordDecl(RecordDecl recordDecl)
|
1771 | 1807 | {
|
1772 | 1808 | foreach (var cxxConstructorDecl in cxxRecordDecl.Ctors)
|
1773 | 1809 | {
|
1774 |
| - Visit(cxxConstructorDecl); |
1775 |
| - _outputBuilder.WriteDivider(); |
| 1810 | + if (!IsExcluded(cxxConstructorDecl)) |
| 1811 | + { |
| 1812 | + Visit(cxxConstructorDecl); |
| 1813 | + _outputBuilder.WriteDivider(); |
| 1814 | + } |
1776 | 1815 | }
|
1777 | 1816 |
|
1778 |
| - if (cxxRecordDecl.HasUserDeclaredDestructor && !cxxRecordDecl.Destructor.IsVirtual) |
| 1817 | + if (cxxRecordDecl.HasUserDeclaredDestructor) |
1779 | 1818 | {
|
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 | + } |
1782 | 1826 | }
|
1783 | 1827 |
|
1784 | 1828 | if (hasVtbl || hasBaseVtbl)
|
@@ -3714,14 +3758,14 @@ private bool IsConstant(string targetTypeName, Expr initExpr)
|
3714 | 3758 | case CX_StmtClass_CStyleCastExpr:
|
3715 | 3759 | case CX_StmtClass_CXXStaticCastExpr:
|
3716 | 3760 | case CX_StmtClass_CXXFunctionalCastExpr:
|
| 3761 | + case CX_StmtClass_CXXConstCastExpr: |
| 3762 | + case CX_StmtClass_CXXDynamicCastExpr: |
| 3763 | + case CX_StmtClass_CXXReinterpretCastExpr: |
3717 | 3764 | {
|
3718 | 3765 | var cxxFunctionalCastExpr = (ExplicitCastExpr)initExpr;
|
3719 | 3766 | return IsConstant(targetTypeName, cxxFunctionalCastExpr.SubExprAsWritten);
|
3720 | 3767 | }
|
3721 | 3768 |
|
3722 |
| - // case CX_StmtClass_CXXConstCastExpr: |
3723 |
| - // case CX_StmtClass_CXXDynamicCastExpr: |
3724 |
| - // case CX_StmtClass_CXXReinterpretCastExpr: |
3725 | 3769 | // case CX_StmtClass_ObjCBridgedCastExpr:
|
3726 | 3770 |
|
3727 | 3771 | case CX_StmtClass_ImplicitCastExpr:
|
|
0 commit comments