diff --git a/src/AST/Enumeration.cs b/src/AST/Enumeration.cs index d5aa9df4..d2418f62 100644 --- a/src/AST/Enumeration.cs +++ b/src/AST/Enumeration.cs @@ -6,7 +6,7 @@ namespace CppSharp.AST /// /// Represents a C/C++ enumeration declaration. /// - public class Enumeration : Declaration + public class Enumeration : DeclarationContext { [Flags] public enum EnumModifiers diff --git a/src/AST/Function.cs b/src/AST/Function.cs index eea1d2f5..12533f1d 100644 --- a/src/AST/Function.cs +++ b/src/AST/Function.cs @@ -88,7 +88,10 @@ namespace CppSharp.AST public enum FunctionSynthKind { None, - NonMemberOperator + NonMemberOperator, + ComplementOperator, + AbstractImplCall, + DefaultValueOverload } public class Function : Declaration, ITypedDecl, IMangledDecl @@ -109,7 +112,7 @@ namespace CppSharp.AST Parameters = new List(); ReturnType = function.ReturnType; IsReturnIndirect = function.IsReturnIndirect; - Parameters.AddRange(function.Parameters); + Parameters.AddRange(function.Parameters.Select(p => new Parameter(p))); IsVariadic = function.IsVariadic; IsInline = function.IsInline; IsPure = function.IsPure; diff --git a/src/AST/Method.cs b/src/AST/Method.cs index f55afb42..85d532fa 100644 --- a/src/AST/Method.cs +++ b/src/AST/Method.cs @@ -86,7 +86,6 @@ namespace CppSharp.AST IsVirtual = method.IsVirtual; IsConst = method.IsConst; IsImplicit = method.IsImplicit; - IsSynthetized = method.IsSynthetized; IsOverride = method.IsOverride; IsProxy = method.IsProxy; Kind = method.Kind; @@ -94,6 +93,7 @@ namespace CppSharp.AST IsCopyConstructor = method.IsCopyConstructor; IsMoveConstructor = method.IsMoveConstructor; Conversion = method.Conversion; + SynthKind = method.SynthKind; } public Method(Function function) @@ -109,7 +109,7 @@ namespace CppSharp.AST public bool IsConst { get; set; } public bool IsImplicit { get; set; } public bool IsExplicit { get; set; } - public bool IsSynthetized { get; set; } + public bool IsSynthetized { get { return SynthKind != FunctionSynthKind.None; } } public bool IsOverride { get; set; } public bool IsProxy { get; set; } diff --git a/src/CppParser/AST.cpp b/src/CppParser/AST.cpp index 36fd629c..b2577696 100644 --- a/src/CppParser/AST.cpp +++ b/src/CppParser/AST.cpp @@ -450,7 +450,7 @@ Method::Method() // Enumeration -Enumeration::Enumeration() : Declaration(DeclarationKind::Enumeration), +Enumeration::Enumeration() : DeclarationContext(DeclarationKind::Enumeration), Modifiers((EnumModifiers)0), Type(0), BuiltinType(0) {} DEF_VECTOR(Enumeration, Enumeration::Item, Items) diff --git a/src/CppParser/AST.h b/src/CppParser/AST.h index ccdae25e..163f1ce4 100644 --- a/src/CppParser/AST.h +++ b/src/CppParser/AST.h @@ -548,7 +548,7 @@ struct CS_API Method : public Function QualifiedType ConversionType; }; -struct CS_API Enumeration : public Declaration +struct CS_API Enumeration : public DeclarationContext { DECLARE_DECL_KIND(Enumeration, Enumeration) diff --git a/src/CppParser/Bindings/CLI/AST.cpp b/src/CppParser/Bindings/CLI/AST.cpp index 93b3c404..4aa7df9c 100644 --- a/src/CppParser/Bindings/CLI/AST.cpp +++ b/src/CppParser/Bindings/CLI/AST.cpp @@ -1855,18 +1855,18 @@ void CppSharp::Parser::AST::Enumeration::Item::Value::set(unsigned long long val } CppSharp::Parser::AST::Enumeration::Enumeration(::CppSharp::CppParser::AST::Enumeration* native) - : CppSharp::Parser::AST::Declaration((::CppSharp::CppParser::AST::Declaration*)native) + : CppSharp::Parser::AST::DeclarationContext((::CppSharp::CppParser::AST::DeclarationContext*)native) { } CppSharp::Parser::AST::Enumeration::Enumeration(System::IntPtr native) - : CppSharp::Parser::AST::Declaration(native) + : CppSharp::Parser::AST::DeclarationContext(native) { auto __native = (::CppSharp::CppParser::AST::Enumeration*)native.ToPointer(); } CppSharp::Parser::AST::Enumeration::Enumeration() - : CppSharp::Parser::AST::Declaration((::CppSharp::CppParser::AST::Declaration*)nullptr) + : CppSharp::Parser::AST::DeclarationContext((::CppSharp::CppParser::AST::DeclarationContext*)nullptr) { NativePtr = new ::CppSharp::CppParser::AST::Enumeration(); } diff --git a/src/CppParser/Bindings/CLI/AST.h b/src/CppParser/Bindings/CLI/AST.h index fdf9123a..39e79da1 100644 --- a/src/CppParser/Bindings/CLI/AST.h +++ b/src/CppParser/Bindings/CLI/AST.h @@ -1325,7 +1325,7 @@ namespace CppSharp } }; - public ref class Enumeration : CppSharp::Parser::AST::Declaration + public ref class Enumeration : CppSharp::Parser::AST::DeclarationContext { public: diff --git a/src/CppParser/Bindings/CSharp/i686-pc-win32/AST.cs b/src/CppParser/Bindings/CSharp/i686-pc-win32/AST.cs index 87f57f0e..f0cdecb2 100644 --- a/src/CppParser/Bindings/CSharp/i686-pc-win32/AST.cs +++ b/src/CppParser/Bindings/CSharp/i686-pc-win32/AST.cs @@ -4222,9 +4222,9 @@ namespace CppSharp } } - public unsafe partial class Enumeration : CppSharp.Parser.AST.Declaration, IDisposable + public unsafe partial class Enumeration : CppSharp.Parser.AST.DeclarationContext, IDisposable { - [StructLayout(LayoutKind.Explicit, Size = 144)] + [StructLayout(LayoutKind.Explicit, Size = 240)] public new struct Internal { [FieldOffset(0)] @@ -4257,13 +4257,16 @@ namespace CppSharp [FieldOffset(92)] public void* OriginalPtr; - [FieldOffset(120)] + [FieldOffset(212)] + public bool IsAnonymous; + + [FieldOffset(216)] public CppSharp.Parser.AST.Enumeration.EnumModifiers Modifiers; - [FieldOffset(124)] + [FieldOffset(220)] public global::System.IntPtr Type; - [FieldOffset(128)] + [FieldOffset(224)] public global::System.IntPtr BuiltinType; [SuppressUnmanagedCodeSecurity] @@ -4447,7 +4450,7 @@ namespace CppSharp public Enumeration() : this(IntPtr.Zero) { - __Instance = Marshal.AllocHGlobal(144); + __Instance = Marshal.AllocHGlobal(240); Internal.ctor_0(__Instance); } diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index e3e74a62..de9a8c53 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -1349,6 +1349,12 @@ DeclarationContext* Parser::GetNamespace(clang::Decl* D, DC = WalkClassTemplatePartialSpecialization(CTPSpec); continue; } + case Decl::Enum: + { + auto CTPSpec = cast(Ctx); + DC = WalkEnum(CTPSpec); + continue; + } default: { StringRef Kind = Ctx->getDeclKindName(); @@ -2006,24 +2012,28 @@ Enumeration* Parser::WalkEnum(clang::EnumDecl* ED) E->IsIncomplete = false; for(auto it = ED->enumerator_begin(); it != ED->enumerator_end(); ++it) { - clang::EnumConstantDecl* ECD = (*it); + E->Items.push_back(*WalkEnumItem(*it)); + } - auto EnumItem = Enumeration::Item(); - HandleDeclaration(ECD, &EnumItem); + return E; +} - EnumItem.Name = ECD->getNameAsString(); - auto Value = ECD->getInitVal(); - EnumItem.Value = Value.isSigned() ? Value.getSExtValue() - : Value.getZExtValue(); +Enumeration::Item* Parser::WalkEnumItem(clang::EnumConstantDecl* ECD) +{ + auto EnumItem = new Enumeration::Item(); + HandleDeclaration(ECD, EnumItem); - std::string Text; - if (GetDeclText(ECD->getSourceRange(), Text)) - EnumItem.Expression = Text; + EnumItem->Name = ECD->getNameAsString(); + auto Value = ECD->getInitVal(); + EnumItem->Value = Value.isSigned() ? Value.getSExtValue() + : Value.getZExtValue(); + EnumItem->_Namespace = GetNamespace(ECD); - E->Items.push_back(EnumItem); - } + std::string Text; + if (GetDeclText(ECD->getSourceRange(), Text)) + EnumItem->Expression = Text; - return E; + return EnumItem; } //-----------------------------------// @@ -2615,10 +2625,16 @@ Declaration* Parser::WalkDeclaration(clang::Decl* D, } case Decl::Enum: { - EnumDecl* ED = cast(D); + auto ED = cast(D); Decl = WalkEnum(ED); break; } + case Decl::EnumConstant: + { + auto ED = cast(D); + Decl = WalkEnumItem(ED); + break; + } case Decl::Function: { FunctionDecl* FD = cast(D); @@ -2685,9 +2701,17 @@ Declaration* Parser::WalkDeclaration(clang::Decl* D, NS->Variables.push_back(static_cast(Decl)); break; } + case Decl::CXXConstructor: + { + auto MD = cast(D); + Decl = WalkMethodCXX(MD); + + auto NS = GetNamespace(MD); + Decl->_Namespace = NS; + break; + } // Ignore these declarations since they must have been declared in // a class already. - case Decl::CXXConstructor: case Decl::CXXDestructor: case Decl::CXXConversion: case Decl::CXXMethod: diff --git a/src/CppParser/Parser.h b/src/CppParser/Parser.h index 3da7670b..8af48158 100644 --- a/src/CppParser/Parser.h +++ b/src/CppParser/Parser.h @@ -63,6 +63,7 @@ protected: bool IgnoreSystemDecls = true, bool CanBeDefinition = false); Declaration* WalkDeclarationDef(clang::Decl* D); Enumeration* WalkEnum(clang::EnumDecl* ED); + Enumeration::Item* WalkEnumItem(clang::EnumConstantDecl* ECD); Function* WalkFunction(clang::FunctionDecl* FD, bool IsDependent = false, bool AddToNamespace = true); Class* GetRecord(clang::RecordDecl* Record, bool& IsComplete); diff --git a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs index 062745db..fb4c598f 100644 --- a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs +++ b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs @@ -471,13 +471,14 @@ namespace CppSharp.Generators.CSharp PopBlock(NewLineKind.BeforeNextBlock); } - private ISet GatherClassInternalFunctions(Class @class) + private IEnumerable GatherClassInternalFunctions(Class @class) { var functions = new HashSet(); Action tryAddOverload = method => { - if (method.IsSynthetized) + if (method.SynthKind != FunctionSynthKind.NonMemberOperator && + method.SynthKind != FunctionSynthKind.None) return; if (method.IsProxy) @@ -884,9 +885,9 @@ namespace CppSharp.Generators.CSharp var method = function as Method; if (method != null && method.OperatorKind == CXXOperatorKind.Subscript) { - if (method.IsOverride && method.IsSynthetized) + if (method.SynthKind == FunctionSynthKind.AbstractImplCall) { - GenerateVirtualTableFunctionCall(method, @class); + GenerateAbstractImplCall(method, @class); } else { @@ -1010,8 +1011,8 @@ namespace CppSharp.Generators.CSharp NewLine(); WriteStartBraceIndent(); var method = function as Method; - if (method != null && method.IsOverride && method.IsSynthetized) - GenerateVirtualTableFunctionCall(method, @class); + if (method != null && method.SynthKind == FunctionSynthKind.AbstractImplCall) + GenerateAbstractImplCall(method, @class); else GenerateInternalFunctionCall(function, function.Parameters, returnType.Type); } @@ -1886,7 +1887,7 @@ namespace CppSharp.Generators.CSharp var hasBaseClass = @class.HasBaseClass && @class.BaseClass.IsRefType; if (hasBaseClass) WriteLineIndent(": base(native{0})", - @class.Methods.Any(m => !m.IsPure && m.IsOverride && m.IsSynthetized) ? + @class.Methods.Any(m => m.SynthKind == FunctionSynthKind.AbstractImplCall) ? ", true" : string.Empty); WriteStartBraceIndent(); @@ -2043,9 +2044,9 @@ namespace CppSharp.Generators.CSharp { GenerateOperator(method, @class); } - else if (method.IsOverride && method.IsSynthetized) + else if (method.SynthKind == FunctionSynthKind.AbstractImplCall) { - GenerateVirtualTableFunctionCall(method, @class); + GenerateAbstractImplCall(method, @class); } else { @@ -2101,14 +2102,14 @@ namespace CppSharp.Generators.CSharp } } - private void GenerateVirtualTableFunctionCall(Method method, Class @class) + private void GenerateAbstractImplCall(Method method, Class @class) { string delegateId; - Write(GetVirtualCallDelegate(method, @class, out delegateId)); + Write(GetAbstractCallDelegate(method, @class, out delegateId)); GenerateFunctionCall(delegateId, method.Parameters, method); } - public string GetVirtualCallDelegate(Method method, Class @class, + public string GetAbstractCallDelegate(Method method, Class @class, out string delegateId) { var virtualCallBuilder = new StringBuilder(); @@ -2129,7 +2130,7 @@ namespace CppSharp.Generators.CSharp private void GenerateOperator(Method method, Class @class) { - if (method.IsSynthetized) + if (method.SynthKind == FunctionSynthKind.ComplementOperator) { if (method.Kind == CXXMethodKind.Conversion) { diff --git a/src/Generator/Passes/CheckOperatorsOverloads.cs b/src/Generator/Passes/CheckOperatorsOverloads.cs index d5bfbf23..e35fdd12 100644 --- a/src/Generator/Passes/CheckOperatorsOverloads.cs +++ b/src/Generator/Passes/CheckOperatorsOverloads.cs @@ -140,7 +140,7 @@ namespace CppSharp.Passes { Name = Operators.GetOperatorIdentifier(missingKind), Namespace = @class, - IsSynthetized = true, + SynthKind = FunctionSynthKind.ComplementOperator, Kind = CXXMethodKind.Operator, OperatorKind = missingKind, ReturnType = op.ReturnType, diff --git a/src/Generator/Passes/ConstructorToConversionOperatorPass.cs b/src/Generator/Passes/ConstructorToConversionOperatorPass.cs index 42682dab..b43bb40e 100644 --- a/src/Generator/Passes/ConstructorToConversionOperatorPass.cs +++ b/src/Generator/Passes/ConstructorToConversionOperatorPass.cs @@ -1,7 +1,6 @@ using System.Linq; using CppSharp.AST; using CppSharp.AST.Extensions; -using CppSharp.Generators; namespace CppSharp.Passes { @@ -45,7 +44,7 @@ namespace CppSharp.Passes Name = Operators.GetOperatorIdentifier(operatorKind), Namespace = castFromClass, Kind = CXXMethodKind.Conversion, - IsSynthetized = true, + SynthKind = FunctionSynthKind.ComplementOperator, ConversionType = qualifiedCastToType, ReturnType = qualifiedCastToType }; diff --git a/src/Generator/Passes/GenerateAbstractImplementationsPass.cs b/src/Generator/Passes/GenerateAbstractImplementationsPass.cs index 507108f3..9469b58a 100644 --- a/src/Generator/Passes/GenerateAbstractImplementationsPass.cs +++ b/src/Generator/Passes/GenerateAbstractImplementationsPass.cs @@ -70,7 +70,7 @@ namespace CppSharp.Passes OriginalFunction = method, IsPure = false, IsOverride = true, - IsSynthetized = true + SynthKind = FunctionSynthKind.AbstractImplCall }); internalImpl.Layout = new ClassLayout(@class.Layout); diff --git a/src/Generator/Passes/ObjectOverridesPass.cs b/src/Generator/Passes/ObjectOverridesPass.cs index d43ae74c..bdcf5ad4 100644 --- a/src/Generator/Passes/ObjectOverridesPass.cs +++ b/src/Generator/Passes/ObjectOverridesPass.cs @@ -119,7 +119,7 @@ namespace CppSharp Name = "ToString", Namespace = @class, ReturnType = new QualifiedType(stringType), - IsSynthetized = true, + SynthKind = FunctionSynthKind.NonMemberOperator, IsOverride = true, IsProxy = true }; @@ -144,7 +144,7 @@ namespace CppSharp Namespace = @class, ReturnType = new QualifiedType(new BuiltinType(PrimitiveType.Bool)), Parameters = new List { methodEqualsParam }, - IsSynthetized = true, + SynthKind = FunctionSynthKind.ComplementOperator, IsOverride = true, IsProxy = true }; @@ -155,7 +155,7 @@ namespace CppSharp Name = "GetHashCode", Namespace = @class, ReturnType = new QualifiedType(new BuiltinType(PrimitiveType.Int)), - IsSynthetized = true, + SynthKind = FunctionSynthKind.ComplementOperator, IsOverride = true, IsProxy = true };