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

17
src/Generator/Passes/IgnoreSystemDeclarationsPass.cs

@ -44,12 +44,25 @@ namespace CppSharp.Passes
case "basic_string": case "basic_string":
case "allocator": case "allocator":
case "char_traits": case "char_traits":
@class.GenerationKind = GenerationKind.Generate;
foreach (var specialization in from s in @class.Specializations
where !s.Arguments.Any(a =>
s.UnsupportedTemplateArgument(a, Context.TypeMaps))
let arg = s.Arguments[0].Type.Type.Desugar()
where arg.IsPrimitiveType(PrimitiveType.Char)
select s)
{
specialization.GenerationKind = GenerationKind.Generate;
InternalizeSpecializationsInFields(specialization);
}
break;
case "optional":
case "vector":
@class.GenerationKind = GenerationKind.Generate; @class.GenerationKind = GenerationKind.Generate;
foreach (var specialization in from s in @class.Specializations foreach (var specialization in from s in @class.Specializations
where !s.Arguments.Any(a => where !s.Arguments.Any(a =>
s.UnsupportedTemplateArgument(a, Context.TypeMaps)) s.UnsupportedTemplateArgument(a, Context.TypeMaps))
let arg = s.Arguments[0].Type.Type.Desugar()
where arg.IsPrimitiveType(PrimitiveType.Char)
select s) select s)
{ {
specialization.GenerationKind = GenerationKind.Generate; specialization.GenerationKind = GenerationKind.Generate;

1
src/Generator/Passes/SymbolsCodeGenerator.cs

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

Loading…
Cancel
Save