Browse Source

Support some `std::optional/vector` methods

pull/1904/head
duckdoom5 4 months ago
parent
commit
0534dba050
  1. 49
      src/CppParser/Parser.cpp
  2. 13
      src/Generator/Passes/IgnoreSystemDeclarationsPass.cs
  3. 1
      src/Generator/Passes/SymbolsCodeGenerator.cs

49
src/CppParser/Parser.cpp

@ -157,6 +157,8 @@ Parser::Parser(CppParserOptions* Opts) @@ -157,6 +157,8 @@ Parser::Parser(CppParserOptions* Opts)
{
supportedStdTypes.insert("allocator");
supportedStdTypes.insert("basic_string");
supportedStdTypes.insert("optional");
supportedStdTypes.insert("vector");
}
LayoutField Parser::WalkVTablePointer(Class* Class,
@ -1011,15 +1013,44 @@ bool Parser::IsSupported(const clang::CXXMethodDecl* MD) @@ -1011,15 +1013,44 @@ bool Parser::IsSupported(const clang::CXXMethodDecl* MD)
{
using namespace clang;
return !c->getSourceManager().isInSystemHeader(MD->getBeginLoc()) ||
(isa<CXXConstructorDecl>(MD) && MD->getNumParams() == 0) ||
isa<CXXDestructorDecl>(MD) ||
(MD->getDeclName().isIdentifier() &&
((MD->getName() == "data" && MD->getNumParams() == 0 && MD->isConst()) ||
(MD->getName() == "assign" && MD->getNumParams() == 1 &&
MD->parameters()[0]->getType()->isPointerType())) &&
supportedStdTypes.find(MD->getParent()->getName().str()) !=
supportedStdTypes.end());
if (!c->getSourceManager().isInSystemHeader(MD->getBeginLoc()))
return true;
if (isa<CXXConstructorDecl>(MD))
return MD->getNumParams() == 0;
if (isa<CXXDestructorDecl>(MD))
return true;
if (!MD->getDeclName().isIdentifier())
return false;
if (supportedStdTypes.find(MD->getParent()->getName().str()) == supportedStdTypes.end())
return false;
switch (MD->getNumParams())
{
case 0:
{
if (!MD->isConst())
return false;
return MD->getName() == "data" ||
MD->getName() == "has_value" ||
MD->getName() == "value";
}
case 1:
{
if (!MD->parameters()[0]->getType()->isPointerType())
return false;
return MD->getName() == "assign";
}
default:
{
return false;
}
}
}
static RecordArgABI GetRecordArgABI(

13
src/Generator/Passes/IgnoreSystemDeclarationsPass.cs

@ -56,6 +56,19 @@ namespace CppSharp.Passes @@ -56,6 +56,19 @@ namespace CppSharp.Passes
InternalizeSpecializationsInFields(specialization);
}
break;
case "optional":
case "vector":
@class.GenerationKind = GenerationKind.Generate;
foreach (var specialization in from s in @class.Specializations
where !s.Arguments.Any(a =>
s.UnsupportedTemplateArgument(a, Context.TypeMaps))
select s)
{
specialization.GenerationKind = GenerationKind.Generate;
InternalizeSpecializationsInFields(specialization);
}
break;
}
return true;
}

1
src/Generator/Passes/SymbolsCodeGenerator.cs

@ -34,6 +34,7 @@ namespace CppSharp.Passes @@ -34,6 +34,7 @@ namespace CppSharp.Passes
WriteLine("#define _LIBCPP_HIDE_FROM_ABI");
NewLine();
WriteLine("#include <string>");
WriteLine("#include <optional>");
}
else
foreach (var header in TranslationUnit.Module.Headers)

Loading…
Cancel
Save