diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index 4c90c7e5..53b06e3b 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -70,6 +70,8 @@ void* IgnorePtr = reinterpret_cast(0x1); Parser::Parser(CppParserOptions* Opts) : lib(Opts->ASTContext), opts(Opts), index(0) { + supportedStdTypes.insert("allocator"); + supportedStdTypes.insert("basic_string"); } LayoutField Parser::WalkVTablePointer(Class* Class, @@ -821,14 +823,14 @@ Class* Parser::WalkRecordCXX(const clang::CXXRecordDecl* Record) static int I = 0; static bool IsRecordValid(const clang::RecordDecl* RC, - std::vector& Visited) + std::unordered_set& Visited) { using namespace clang; - if (std::find(Visited.begin(), Visited.end(), RC) != Visited.end()) + if (Visited.find(RC) != Visited.end()) return true; - Visited.push_back(RC); + Visited.insert(RC); if (RC->isInvalidDecl()) return false; for (auto Field : RC->fields()) @@ -845,7 +847,7 @@ static bool IsRecordValid(const clang::RecordDecl* RC, static bool IsRecordValid(const clang::RecordDecl* RC) { - std::vector Visited; + std::unordered_set Visited; return IsRecordValid(RC, Visited); } @@ -881,6 +883,23 @@ static bool HasLayout(const clang::RecordDecl* Record) return true; } +bool Parser::IsSupported(const clang::RecordDecl* RD) +{ + return !c->getSourceManager().isInSystemHeader(RD->getLocStart()) || + supportedStdTypes.find(RD->getName()) != supportedStdTypes.end(); +} + +bool Parser::IsSupported(const clang::CXXMethodDecl* MD) +{ + using namespace clang; + + return !c->getSourceManager().isInSystemHeader(MD->getLocStart()) || + isa(MD) || isa(MD) || + (MD->getName() == "c_str" && + supportedStdTypes.find(MD->getParent()->getName()) != + supportedStdTypes.end()); +} + void Parser::WalkRecord(const clang::RecordDecl* Record, Class* RC) { using namespace clang; @@ -920,11 +939,15 @@ void Parser::WalkRecord(const clang::RecordDecl* Record, Class* RC) ReadClassLayout(RC, Record, CharUnits(), true); } - for(auto it = Record->decls_begin(); it != Record->decls_end(); ++it) - { - auto D = *it; + for (auto FD : Record->fields()) + WalkFieldCXX(FD, RC); + + if (!IsSupported(Record)) + return; - switch(D->getKind()) + for (auto D : Record->decls()) + { + switch (D->getKind()) { case Decl::CXXConstructor: case Decl::CXXDestructor: @@ -932,13 +955,8 @@ void Parser::WalkRecord(const clang::RecordDecl* Record, Class* RC) case Decl::CXXMethod: { auto MD = cast(D); - WalkMethodCXX(MD); - break; - } - case Decl::Field: - { - auto FD = cast(D); - WalkFieldCXX(FD, RC); + if (IsSupported(MD)) + WalkMethodCXX(MD); break; } case Decl::AccessSpec: @@ -954,6 +972,7 @@ void Parser::WalkRecord(const clang::RecordDecl* Record, Class* RC) RC->Specifiers.push_back(AccessDecl); break; } + case Decl::Field: // fields already handled case Decl::IndirectField: // FIXME: Handle indirect fields break; case Decl::CXXRecord: diff --git a/src/CppParser/Parser.h b/src/CppParser/Parser.h index 2f85375c..d3d47558 100644 --- a/src/CppParser/Parser.h +++ b/src/CppParser/Parser.h @@ -21,6 +21,7 @@ #include "CppParser.h" #include +#include namespace clang { namespace CodeGen { @@ -59,6 +60,8 @@ public: ParserTargetInfo* GetTargetInfo(); private: + bool IsSupported(const clang::RecordDecl* RD); + bool IsSupported(const clang::CXXMethodDecl* MD); // AST traversers void WalkAST(); Declaration* WalkDeclaration(const clang::Decl* D); @@ -143,6 +146,12 @@ private: void HandleComments(const clang::Decl* D, Declaration* Decl); void HandleDiagnostics(ParserResult* res); + ParserResultKind ReadSymbols(llvm::StringRef File, + llvm::object::basic_symbol_iterator Begin, + llvm::object::basic_symbol_iterator End, + CppSharp::CppParser::NativeLibrary*& NativeLib); + Declaration* GetDeclarationFromFriend(clang::NamedDecl* FriendDecl); + int index; CppSharp::CppParser::AST::ASTContext* lib; CppParserOptions* opts; @@ -153,12 +162,7 @@ private: std::unordered_map walkedTypeTemplateParameters; std::unordered_map walkedTemplateTemplateParameters; std::unordered_map walkedNonTypeTemplateParameters; - - ParserResultKind ReadSymbols(llvm::StringRef File, - llvm::object::basic_symbol_iterator Begin, - llvm::object::basic_symbol_iterator End, - CppSharp::CppParser::NativeLibrary*& NativeLib); - Declaration* GetDeclarationFromFriend(clang::NamedDecl* FriendDecl); + std::unordered_set supportedStdTypes; }; } } \ No newline at end of file diff --git a/src/Generator.Tests/AST/TestAST.cs b/src/Generator.Tests/AST/TestAST.cs index 4a7a2f59..3bed5441 100644 --- a/src/Generator.Tests/AST/TestAST.cs +++ b/src/Generator.Tests/AST/TestAST.cs @@ -303,13 +303,13 @@ namespace CppSharp.Generator.Tests.AST [Test] public void TestLineNumber() { - Assert.AreEqual(72, AstContext.FindClass("HiddenInNamespace").First().LineNumberStart); + Assert.AreEqual(70, AstContext.FindClass("HiddenInNamespace").First().LineNumberStart); } [Test] public void TestLineNumberOfFriend() { - Assert.AreEqual(95, AstContext.FindFunction("operator+").First().LineNumberStart); + Assert.AreEqual(93, AstContext.FindFunction("operator+").First().LineNumberStart); } static string StripWindowsNewLines(string text) @@ -350,7 +350,7 @@ namespace CppSharp.Generator.Tests.AST [Test] public void TestMacroLineNumber() { - Assert.AreEqual(105, AstContext.FindClass("HasAmbiguousFunctions").First().Specifiers.Last().LineNumberStart); + Assert.AreEqual(103, AstContext.FindClass("HasAmbiguousFunctions").First().Specifiers.Last().LineNumberStart); } [Test] @@ -576,30 +576,5 @@ namespace CppSharp.Generator.Tests.AST var @classC = AstContext.FindClass("ClassC").First(); Assert.That(@classC.Redeclarations.Count, Is.EqualTo(2)); } - - [Test] - public void TestRemovalOfUnusedStdTypes() - { - new IgnoreSystemDeclarationsPass { Context = Driver.Context }.VisitASTContext(AstContext); - if (Platform.IsWindows) - { - Assert.That(AstContext.GetEnumWithMatchingItem("_ALLOC_MASK").Ignore, Is.True); - Assert.That(AstContext.FindClass("_Ctypevec").First().Ignore, Is.True); - return; - } - if (Platform.IsLinux) - { - Assert.That(AstContext.GetEnumWithMatchingItem("PTHREAD_RWLOCK_PREFER_READER_NP").Ignore, Is.True); - Assert.That(AstContext.FindClass("pthread_mutex_t").First().Ignore, Is.True); - return; - - } - if (Platform.IsMacOS) - { - Assert.That(AstContext.GetEnumWithMatchingItem("__n_words").Ignore, Is.True); - Assert.That(AstContext.FindClass("__darwin_fp_control").First().Ignore, Is.True); - return; - } - } } } diff --git a/tests/Native/AST.h b/tests/Native/AST.h index 8f4dea4b..41dc2db2 100644 --- a/tests/Native/AST.h +++ b/tests/Native/AST.h @@ -1,5 +1,3 @@ -#include - #define Q_SIGNALS protected // Tests assignment of AST.Parameter properties