From 2b77361d89f9d1061c45ab6838d79c15d1dcc466 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Fri, 6 Dec 2013 19:03:02 +0200 Subject: [PATCH 1/3] Reverted the hack about filling the empty names of parameters explicitly for function types. Added tests for this regression and another one caused by the changed around the introduction of FunctionType.Arguments. Signed-off-by: Dimitar Dobrev --- src/Generator/Passes/CleanInvalidDeclNamesPass.cs | 8 -------- tests/Basic/Basic.cpp | 2 +- tests/Basic/Basic.cs | 6 ++++++ tests/Basic/Basic.h | 4 ++-- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/Generator/Passes/CleanInvalidDeclNamesPass.cs b/src/Generator/Passes/CleanInvalidDeclNamesPass.cs index 4672c9dd..6c7ab372 100644 --- a/src/Generator/Passes/CleanInvalidDeclNamesPass.cs +++ b/src/Generator/Passes/CleanInvalidDeclNamesPass.cs @@ -71,14 +71,6 @@ namespace CppSharp.Passes return base.VisitFunctionDecl(function); } - public override bool VisitFunctionType(FunctionType function, TypeQualifiers quals) - { - foreach (var arg in function.Parameters) - arg.Visit(this); - - return base.VisitFunctionType(function, quals); - } - public override bool VisitTypedefDecl(TypedefDecl typedef) { var @class = typedef.Namespace.FindClass(typedef.Name); diff --git a/tests/Basic/Basic.cpp b/tests/Basic/Basic.cpp index fc951cc8..056e1dd4 100644 --- a/tests/Basic/Basic.cpp +++ b/tests/Basic/Basic.cpp @@ -168,7 +168,7 @@ Bar indirectReturn() return Bar(); } -int ImplementsAbstractFoo::pureFunction() +int ImplementsAbstractFoo::pureFunction(int i) { return 5; } diff --git a/tests/Basic/Basic.cs b/tests/Basic/Basic.cs index 1739df90..6326e208 100644 --- a/tests/Basic/Basic.cs +++ b/tests/Basic/Basic.cs @@ -11,6 +11,12 @@ namespace CppSharp.Tests public Basic(GeneratorKind kind) : base("Basic", kind) { + + } + + public override void SetupPasses(Driver driver) + { + driver.Options.GenerateAbstractImpls = true; } public override void Preprocess(Driver driver, ASTContext lib) diff --git a/tests/Basic/Basic.h b/tests/Basic/Basic.h index b1b45707..47436670 100644 --- a/tests/Basic/Basic.h +++ b/tests/Basic/Basic.h @@ -111,7 +111,7 @@ public: class DLL_API AbstractFoo { public: - virtual int pureFunction() = 0; + virtual int pureFunction(int i) = 0; virtual int pureFunction1() = 0; virtual int pureFunction2() = 0; typedef void (*QTextStreamFunction)(int &); @@ -120,7 +120,7 @@ public: class DLL_API ImplementsAbstractFoo : public AbstractFoo { public: - virtual int pureFunction(); + virtual int pureFunction(int i); virtual int pureFunction1(); virtual int pureFunction2(); }; From f6e04537449c498d16b1af074c8af083d4a94203 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Fri, 6 Dec 2013 19:07:49 +0200 Subject: [PATCH 2/3] Revert "Fixed function types to provide qualified argument types in the AST." This reverts commit 70122b05680eb8f15b5396205f7f31f4ef900bac. Signed-off-by: Dimitar Dobrev --- src/AST/ASTVisitor.cs | 4 +- src/AST/Function.cs | 4 +- src/AST/Type.cs | 3 -- src/CppParser/AST.h | 4 +- src/CppParser/Bindings/CLI/AST.cpp | 36 ---------------- src/CppParser/Bindings/CLI/AST.h | 9 ---- src/CppParser/Bindings/CSharp/AST.cs | 43 ------------------- src/CppParser/Parser.cpp | 13 +----- .../Generators/CLI/CLITypePrinter.cs | 2 +- .../Generators/CSharp/CSharpTypePrinter.cs | 2 +- src/Parser/Parser.cpp | 13 ------ 11 files changed, 9 insertions(+), 124 deletions(-) diff --git a/src/AST/ASTVisitor.cs b/src/AST/ASTVisitor.cs index 4d716547..2d016559 100644 --- a/src/AST/ASTVisitor.cs +++ b/src/AST/ASTVisitor.cs @@ -95,8 +95,8 @@ namespace CppSharp.AST function.ReturnType.Visit(this); if (Options.VisitFunctionParameters) - foreach (var arg in function.Arguments) - arg.Visit(this); + foreach (var param in function.Parameters) + param.Visit(this); return true; } diff --git a/src/AST/Function.cs b/src/AST/Function.cs index ea467e02..32d2ded4 100644 --- a/src/AST/Function.cs +++ b/src/AST/Function.cs @@ -187,8 +187,8 @@ namespace CppSharp.AST CallingConvention = this.CallingConvention, ReturnType = this.ReturnType }; - var argTypes = Parameters.Select(parameter => parameter.QualifiedType); - functionType.Arguments.AddRange(argTypes); + functionType.Parameters.AddRange(Parameters); + ReplaceIndirectReturnParamWithRegular(functionType); var pointerType = new PointerType { QualifiedPointee = new QualifiedType(functionType) }; return new QualifiedType(pointerType); } diff --git a/src/AST/Type.cs b/src/AST/Type.cs index 4847a138..f9edad52 100644 --- a/src/AST/Type.cs +++ b/src/AST/Type.cs @@ -313,15 +313,12 @@ namespace CppSharp.AST public QualifiedType ReturnType; // Argument types. - public List Arguments; - public List Parameters; public CallingConvention CallingConvention { get; set; } public FunctionType() { - Arguments = new List(); Parameters = new List(); } diff --git a/src/CppParser/AST.h b/src/CppParser/AST.h index ad6f1d1f..7240eb9f 100644 --- a/src/CppParser/AST.h +++ b/src/CppParser/AST.h @@ -22,8 +22,8 @@ #define VECTOR(type, name) \ std::vector name; \ - type get##name (unsigned i) { return name[i]; } \ - unsigned get##name##Count () { return name.size(); } + type get##name(unsigned i) { return name[i]; } \ + unsigned get##name##Count() { return name.size(); } namespace CppSharp { namespace CppParser { namespace AST { diff --git a/src/CppParser/Bindings/CLI/AST.cpp b/src/CppParser/Bindings/CLI/AST.cpp index 856321a5..0a5129b0 100644 --- a/src/CppParser/Bindings/CLI/AST.cpp +++ b/src/CppParser/Bindings/CLI/AST.cpp @@ -226,19 +226,6 @@ CppSharp::Parser::AST::FunctionType::FunctionType(System::IntPtr native) auto __native = (::CppSharp::CppParser::AST::FunctionType*)native.ToPointer(); } -CppSharp::Parser::AST::QualifiedType^ CppSharp::Parser::AST::FunctionType::getArguments(unsigned int i) -{ - auto __ret = ((::CppSharp::CppParser::AST::FunctionType*)NativePtr)->getArguments(i); - auto ____ret = new ::CppSharp::CppParser::AST::QualifiedType(__ret); - return gcnew CppSharp::Parser::AST::QualifiedType((::CppSharp::CppParser::AST::QualifiedType*)____ret); -} - -unsigned int CppSharp::Parser::AST::FunctionType::getArgumentsCount() -{ - auto __ret = ((::CppSharp::CppParser::AST::FunctionType*)NativePtr)->getArgumentsCount(); - return __ret; -} - CppSharp::Parser::AST::Parameter^ CppSharp::Parser::AST::FunctionType::getParameters(unsigned int i) { auto __ret = ((::CppSharp::CppParser::AST::FunctionType*)NativePtr)->getParameters(i); @@ -278,29 +265,6 @@ void CppSharp::Parser::AST::FunctionType::CallingConvention::set(CppSharp::Parse ((::CppSharp::CppParser::AST::FunctionType*)NativePtr)->CallingConvention = (::CppSharp::CppParser::AST::CallingConvention)value; } -System::Collections::Generic::List^ CppSharp::Parser::AST::FunctionType::Arguments::get() -{ - auto _tmpArguments = gcnew System::Collections::Generic::List(); - for(auto _element : ((::CppSharp::CppParser::AST::FunctionType*)NativePtr)->Arguments) - { - auto ___element = new ::CppSharp::CppParser::AST::QualifiedType(_element); - auto _marshalElement = gcnew CppSharp::Parser::AST::QualifiedType((::CppSharp::CppParser::AST::QualifiedType*)___element); - _tmpArguments->Add(_marshalElement); - } - return _tmpArguments; -} - -void CppSharp::Parser::AST::FunctionType::Arguments::set(System::Collections::Generic::List^ value) -{ - auto _tmpvalue = std::vector<::CppSharp::CppParser::AST::QualifiedType>(); - for each(CppSharp::Parser::AST::QualifiedType^ _element in value) - { - auto _marshalElement = *(::CppSharp::CppParser::AST::QualifiedType*)_element->NativePtr; - _tmpvalue.push_back(_marshalElement); - } - ((::CppSharp::CppParser::AST::FunctionType*)NativePtr)->Arguments = _tmpvalue; -} - System::Collections::Generic::List^ CppSharp::Parser::AST::FunctionType::Parameters::get() { auto _tmpParameters = gcnew System::Collections::Generic::List(); diff --git a/src/CppParser/Bindings/CLI/AST.h b/src/CppParser/Bindings/CLI/AST.h index 9e0c2a43..6304ea4b 100644 --- a/src/CppParser/Bindings/CLI/AST.h +++ b/src/CppParser/Bindings/CLI/AST.h @@ -359,20 +359,11 @@ namespace CppSharp CppSharp::Parser::AST::CallingConvention get(); void set(CppSharp::Parser::AST::CallingConvention); } - property System::Collections::Generic::List^ Arguments - { - System::Collections::Generic::List^ get(); - void set(System::Collections::Generic::List^); - } property System::Collections::Generic::List^ Parameters { System::Collections::Generic::List^ get(); void set(System::Collections::Generic::List^); } - CppSharp::Parser::AST::QualifiedType^ getArguments(unsigned int i); - - unsigned int getArgumentsCount(); - CppSharp::Parser::AST::Parameter^ getParameters(unsigned int i); unsigned int getParametersCount(); diff --git a/src/CppParser/Bindings/CSharp/AST.cs b/src/CppParser/Bindings/CSharp/AST.cs index 2f84710e..1162df40 100644 --- a/src/CppParser/Bindings/CSharp/AST.cs +++ b/src/CppParser/Bindings/CSharp/AST.cs @@ -632,9 +632,6 @@ namespace CppSharp [FieldOffset(12)] public CppSharp.Parser.AST.CallingConvention CallingConvention; - [FieldOffset(16)] - public Std.Vector Arguments; - [FieldOffset(28)] public Std.Vector Parameters; @@ -648,16 +645,6 @@ namespace CppSharp EntryPoint="??0FunctionType@AST@CppParser@CppSharp@@QAE@ABU0123@@Z")] internal static extern global::System.IntPtr FunctionType_2(global::System.IntPtr instance, global::System.IntPtr _0); - [SuppressUnmanagedCodeSecurity] - [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.ThisCall, - EntryPoint="?getArguments@FunctionType@AST@CppParser@CppSharp@@QAE?AUQualifiedType@234@I@Z")] - internal static extern void getArguments_0(global::System.IntPtr instance, global::System.IntPtr __return, uint i); - - [SuppressUnmanagedCodeSecurity] - [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.ThisCall, - EntryPoint="?getArgumentsCount@FunctionType@AST@CppParser@CppSharp@@QAEIXZ")] - internal static extern uint getArgumentsCount_0(global::System.IntPtr instance); - [SuppressUnmanagedCodeSecurity] [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.ThisCall, EntryPoint="?getParameters@FunctionType@AST@CppParser@CppSharp@@QAEPAUParameter@234@I@Z")] @@ -709,21 +696,6 @@ namespace CppSharp base.Dispose(disposing); } - public CppSharp.Parser.AST.QualifiedType getArguments(uint i) - { - var __ret = new CppSharp.Parser.AST.QualifiedType.Internal(); - Internal.getArguments_0(__Instance, new IntPtr(&__ret), i); - var __instance = Marshal.AllocHGlobal(8); - CppSharp.Runtime.Helpers.memcpy(__instance, new IntPtr(&__ret), new UIntPtr(8)); - return new CppSharp.Parser.AST.QualifiedType(__instance); - } - - public uint getArgumentsCount() - { - var __ret = Internal.getArgumentsCount_0(__Instance); - return __ret; - } - public CppSharp.Parser.AST.Parameter getParameters(uint i) { var __ret = Internal.getParameters_0(__Instance, i); @@ -770,21 +742,6 @@ namespace CppSharp } } - public Std.Vector Arguments - { - get - { - var __ptr = (Internal*)__Instance.ToPointer(); - return new Std.Vector(__ptr->Arguments); - } - - set - { - var __ptr = (Internal*)__Instance.ToPointer(); - __ptr->Arguments = value.Internal; - } - } - public Std.Vector Parameters { get diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index 013cdaa3..0e8d2206 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -1270,17 +1270,6 @@ Type* Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL, WalkType(FP->getResultType(), &RL)); F->CallingConvention = ConvertCallConv(FP->getCallConv()); - for (auto I = FP->arg_type_begin(), E = FP->arg_type_end(); I != E; - ++I) - { - auto Arg = *I; - auto Ty = GetQualifiedType(Arg, WalkType(Arg)); - F->Arguments.push_back(Ty); - } - - if (!FTL) - goto SkipParameters; - for (unsigned i = 0; i < FP->getNumArgs(); ++i) { auto PVD = FTL.getArg(i); @@ -1297,7 +1286,7 @@ Type* Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL, F->Parameters.push_back(FA); } - SkipParameters: + return F; Ty = F; break; diff --git a/src/Generator/Generators/CLI/CLITypePrinter.cs b/src/Generator/Generators/CLI/CLITypePrinter.cs index 2c714058..22e16ac2 100644 --- a/src/Generator/Generators/CLI/CLITypePrinter.cs +++ b/src/Generator/Generators/CLI/CLITypePrinter.cs @@ -58,7 +58,7 @@ namespace CppSharp.Generators.CLI public string VisitFunctionType(FunctionType function, TypeQualifiers quals) { - var arguments = function.Arguments; + var arguments = function.Parameters; var returnType = function.ReturnType; var args = string.Empty; diff --git a/src/Generator/Generators/CSharp/CSharpTypePrinter.cs b/src/Generator/Generators/CSharp/CSharpTypePrinter.cs index dbe77df5..fe009928 100644 --- a/src/Generator/Generators/CSharp/CSharpTypePrinter.cs +++ b/src/Generator/Generators/CSharp/CSharpTypePrinter.cs @@ -129,7 +129,7 @@ namespace CppSharp.Generators.CSharp public CSharpTypePrinterResult VisitFunctionType(FunctionType function, TypeQualifiers quals) { - var arguments = function.Arguments; + var arguments = function.Parameters; var returnType = function.ReturnType; var args = string.Empty; diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index a5f4f11a..b2480e3a 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -1382,17 +1382,6 @@ CppSharp::AST::Type^ Parser::WalkType(clang::QualType QualType, clang::TypeLoc* WalkType(FP->getResultType(), &RL)); F->CallingConvention = ConvertCallConv(FP->getCallConv()); - for (auto I = FP->arg_type_begin(), E = FP->arg_type_end(); I != E; - ++I) - { - auto Arg = *I; - auto Ty = GetQualifiedType(Arg, WalkType(Arg)); - F->Arguments->Add(Ty); - } - - if (!FTL) - goto SkipParameters; - for (unsigned i = 0; i < FP->getNumArgs(); ++i) { auto PVD = FTL.getArg(i); @@ -1408,8 +1397,6 @@ CppSharp::AST::Type^ Parser::WalkType(clang::QualType QualType, clang::TypeLoc* F->Parameters->Add(FA); } - SkipParameters: - Ty = F; break; } From df99550a39b1b37cec2293697160b5353edcdd26 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Fri, 6 Dec 2013 19:11:47 +0200 Subject: [PATCH 3/3] Fixed the parsing of function prototypes in cases where the Clang type locator is not available. Signed-off-by: Dimitar Dobrev --- src/CppParser/AST.h | 4 ++-- src/CppParser/Parser.cpp | 22 ++++++++++++++-------- src/Parser/Parser.cpp | 20 ++++++++++++++------ tests/Basic/Basic.Tests.cs | 2 +- tests/Basic/Basic.cs | 5 ++++- 5 files changed, 35 insertions(+), 18 deletions(-) diff --git a/src/CppParser/AST.h b/src/CppParser/AST.h index 7240eb9f..ad6f1d1f 100644 --- a/src/CppParser/AST.h +++ b/src/CppParser/AST.h @@ -22,8 +22,8 @@ #define VECTOR(type, name) \ std::vector name; \ - type get##name(unsigned i) { return name[i]; } \ - unsigned get##name##Count() { return name.size(); } + type get##name (unsigned i) { return name[i]; } \ + unsigned get##name##Count () { return name.size(); } namespace CppSharp { namespace CppParser { namespace AST { diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index 0e8d2206..6974b58f 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -1272,18 +1272,24 @@ Type* Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL, for (unsigned i = 0; i < FP->getNumArgs(); ++i) { - auto PVD = FTL.getArg(i); - auto FA = new Parameter(); - HandleDeclaration(PVD, FA); + if (FTL) + { + auto PVD = FTL.getArg(i); - auto PTL = PVD->getTypeSourceInfo()->getTypeLoc(); + HandleDeclaration(PVD, FA); - FA->Name = PVD->getNameAsString(); - FA->QualifiedType = GetQualifiedType(PVD->getType(), - WalkType(PVD->getType(), &PTL)); + auto PTL = PVD->getTypeSourceInfo()->getTypeLoc(); - F->Parameters.push_back(FA); + FA->Name = PVD->getNameAsString(); + FA->QualifiedType = GetQualifiedType(PVD->getType(), WalkType(PVD->getType(), &PTL)); + } + else + { + auto Arg = FP->getArgType(i); + FA->Name = ""; + FA->QualifiedType = GetQualifiedType(Arg, WalkType(Arg)); + } } return F; diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index b2480e3a..20e4f56c 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -1384,16 +1384,24 @@ CppSharp::AST::Type^ Parser::WalkType(clang::QualType QualType, clang::TypeLoc* for (unsigned i = 0; i < FP->getNumArgs(); ++i) { - auto PVD = FTL.getArg(i); - auto FA = gcnew CppSharp::AST::Parameter(); - HandleDeclaration(PVD, FA); + if (FTL) + { + auto PVD = FTL.getArg(i); - auto PTL = PVD->getTypeSourceInfo()->getTypeLoc(); + HandleDeclaration(PVD, FA); - FA->Name = marshalString(PVD->getNameAsString()); - FA->QualifiedType = GetQualifiedType(PVD->getType(), WalkType(PVD->getType(), &PTL)); + auto PTL = PVD->getTypeSourceInfo()->getTypeLoc(); + FA->Name = marshalString(PVD->getNameAsString()); + FA->QualifiedType = GetQualifiedType(PVD->getType(), WalkType(PVD->getType(), &PTL)); + } + else + { + auto Arg = FP->getArgType(i); + FA->Name = ""; + FA->QualifiedType = GetQualifiedType(Arg, WalkType(Arg)); + } F->Parameters->Add(FA); } diff --git a/tests/Basic/Basic.Tests.cs b/tests/Basic/Basic.Tests.cs index 4b825e49..2b22b1d7 100644 --- a/tests/Basic/Basic.Tests.cs +++ b/tests/Basic/Basic.Tests.cs @@ -111,7 +111,7 @@ public class BasicTests { var returnsAbstractFoo = new ReturnsAbstractFoo(); var abstractFoo = returnsAbstractFoo.getFoo(); - Assert.AreEqual(abstractFoo.pureFunction(), 5); + Assert.AreEqual(abstractFoo.pureFunction(1), 5); Assert.AreEqual(abstractFoo.pureFunction1(), 10); Assert.AreEqual(abstractFoo.pureFunction2(), 15); } diff --git a/tests/Basic/Basic.cs b/tests/Basic/Basic.cs index 6326e208..af8a76fc 100644 --- a/tests/Basic/Basic.cs +++ b/tests/Basic/Basic.cs @@ -16,7 +16,10 @@ namespace CppSharp.Tests public override void SetupPasses(Driver driver) { - driver.Options.GenerateAbstractImpls = true; + if (driver.Options.IsCSharpGenerator) + { + driver.Options.GenerateAbstractImpls = true; + } } public override void Preprocess(Driver driver, ASTContext lib)