mirror of https://github.com/mono/CppSharp.git
c-sharpdotnetmonobindingsbridgecclangcpluspluscppsharpglueinteropparserparsingpinvokeswigsyntax-treevisitorsxamarinxamarin-bindings
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
2.9 KiB
91 lines
2.9 KiB
#pragma once |
|
|
|
#include <llvm/Support/raw_ostream.h> |
|
#include <llvm/ADT/SmallString.h> |
|
#include <llvm/ADT/ArrayRef.h> |
|
#include <clang/AST/APValue.h> |
|
#include <clang/AST/Type.h> |
|
#include <clang/AST/ASTContext.h> |
|
|
|
namespace CppSharp { namespace CppParser { |
|
struct APValuePrinter |
|
{ |
|
clang::ASTContext &ctx; |
|
clang::raw_ostream &out; |
|
|
|
bool Print(clang::APValue &value, clang::QualType type) |
|
{ |
|
using namespace clang; |
|
|
|
switch (value.getKind()) |
|
{ |
|
case APValue::Int: |
|
if (type->isBooleanType()) |
|
out << (value.getInt().getBoolValue() ? "true" : "false"); |
|
else |
|
out << value.getInt(); |
|
return true; |
|
case APValue::Float: |
|
{ |
|
SmallString<50> str; |
|
value.getFloat().toString(str); |
|
out << str.str().str(); |
|
return true; |
|
} |
|
case APValue::Vector: |
|
{ |
|
out << '{'; |
|
const auto elementType = type->castAs<clang::VectorType>()->getElementType(); |
|
if (!Print(value.getVectorElt(0), elementType)) |
|
return false; |
|
for (unsigned i = 1; i != value.getVectorLength(); ++i) |
|
{ |
|
out << ", "; |
|
Print(value.getVectorElt(i), elementType); |
|
} |
|
out << '}'; |
|
return true; |
|
} |
|
case APValue::Array: |
|
{ |
|
const auto *arrayType = ctx.getAsArrayType(type); |
|
const auto elementType = arrayType->getElementType(); |
|
out << '{'; |
|
if (unsigned n = value.getArrayInitializedElts()) |
|
{ |
|
if (!Print(value.getArrayInitializedElt(0), elementType)) |
|
return false; |
|
for (unsigned i = 1; i != n; ++i) |
|
{ |
|
out << ", "; |
|
Print(value.getArrayInitializedElt(i), elementType); |
|
} |
|
} |
|
out << '}'; |
|
return true; |
|
} |
|
case APValue::LValue: |
|
{ |
|
auto base = value.getLValueBase(); |
|
|
|
if (const ValueDecl *VD = base.dyn_cast<const ValueDecl *>()) |
|
{ |
|
out << *VD; |
|
return true; |
|
} |
|
else if (TypeInfoLValue TI = base.dyn_cast<TypeInfoLValue>()) |
|
return false; |
|
else if (DynamicAllocLValue DA = base.dyn_cast<DynamicAllocLValue>()) |
|
return false; |
|
else |
|
{ |
|
base.get<const clang::Expr *>()->printPretty(out, nullptr, ctx.getPrintingPolicy()); |
|
return true; |
|
} |
|
} |
|
} |
|
|
|
return false; |
|
} |
|
}; |
|
} }
|