This is an example of how to use CodeGen class.
#include "Printer.h"
using namespace std;
#if defined (__GNUG__) || defined (__clang__)
#pragma GCC diagnostic ignored "-Wswitch"
#endif
void Printer::end (
const Root& ast)
{
out_.close ();
}
void Printer::print_type (
const Type& t)
{
static const char* const basic_types [(size_t)BasicType::ANY + 1] = {
"boolean",
"octet",
"char",
"wchar",
"unsigned short",
"unsigned long",
"unsigned longlong",
"short",
"long",
"long long",
"float",
"double",
"long double",
"Object",
"ValueBase",
"any"
};
case Type::Kind::BASIC_TYPE:
break;
case Type::Kind::NAMED_TYPE:
break;
case Type::Kind::STRING:
case Type::Kind::WSTRING:
out_ << (t.
tkind () == Type::Kind::STRING ?
"string" :
"wstring");
break;
case Type::Kind::FIXED:
out_ << "fixed";
break;
case Type::Kind::SEQUENCE: {
out_ << "sequence <";
print_type (seq);
out_ <<
", " << seq.
bound ();
out_ << '>';
} break;
case Type::Kind::ARRAY: {
print_type (arr);
for (auto dim : arr.dimensions ()) {
out_ << '[' << dim << ']';
}
} break;
default:
assert (false);
}
}
void Printer::leaf (
const Include& item)
{
out_ <<
"#include <" << item.
file ().string () <<
">\n";
else
out_ <<
"#include \"" << item.
file ().string () <<
"\"\n";
}
void Printer::leaf (
const Native& item)
{
out_ <<
"native " << item.
name () <<
";\n";
}
void Printer::leaf (
const TypeDef& item)
{
out_ << "typedef ";
print_type (item);
out_ <<
' ' << item.
name () <<
";\n";
}
void Printer::leaf (
const Constant& item)
{
out_ << "const ";
print_type (item);
out_ <<
' ' << item.
name ();
if (item.
vtype () != Variant::VT::EMPTY) {
out_ << " = ";
if (item.
vtype () == Variant::VT::WSTRING)
out_ << 'L';
if (item.
vtype () == Variant::VT::FIXED)
out_ << 'D';
}
out_ <<";\n";
}
{
out_.empty_line ();
out_ <<
"module " << item.
name () <<
" {\n\n";
}
{
out_ << "};\n\n";
}
{
case InterfaceKind::ABSTRACT:
out_ << "abstract ";
break;
case InterfaceKind::LOCAL:
out_ << "local ";
break;
case InterfaceKind::PSEUDO:
out_ << "pseudo ";
break;
}
}
{
print_interface_kind (item);
out_ <<
"interface " << item.
name () <<
";\n";
}
{
out_.empty_line ();
print_interface_kind (item);
out_ <<
"interface " << item.
name ();
if (!item.
bases ().empty ()) {
out_ << " :\n";
out_.indent ();
auto base = item.
bases ().begin ();
out_ << (*base)->name ();
++base;
for (; base != item.
bases ().end (); ++base) {
out_ << ",\n";
out_ << (*base)->name ();
}
out_.unindent ();
}
out_ << '\n';
out_ << "{\n";
out_.indent ();
}
{
complex_end ();
}
void Printer::constructed_begin (
const char* type,
const NamedItem& item)
{
out_.empty_line ();
out_ << type << item.
name () <<
" {\n";
out_.indent ();
}
void Printer::complex_end ()
{
out_.unindent ();
out_ << "};\n\n";
}
{
out_ << "oneway void";
else if (item.
tkind () == Type::Kind::VOID)
out_ << "void";
else
print_type (item);
print_op_base (item);
out_ << " context (\"";
out_ << *s;
for (++s; s != item.
context ().end (); ++s) {
out_ << "\", \"" << *s;
}
out_ << "\")";
}
out_ << ";\n";
}
{
out_ <<
' ' << item.
name () <<
" (";
if (!item.empty ()) {
auto param = item.begin ();
print (**param);
for (++param; param != item.end (); ++param) {
out_ << ", ";
print (**param);
}
}
out_ << ')';
if (!item.
raises ().empty ()) {
out_ << " raises ";
}
}
void Printer::print (
const Raises& raises)
{
auto ex = raises.begin ();
out_ << '(' << (*ex)->name ();
for (++ex; ex != raises.end (); ++ex) {
out_ << ", " << (*ex)->name ();
}
out_ << ')';
}
{
const char* att = "in";
case Parameter::Attribute::OUT:
att = "out";
break;
case Parameter::Attribute::INOUT:
att = "inout";
break;
}
out_ << att << ' ';
print_type (p);
out_ <<
' ' << p.
name ();
}
{
out_ << "readonly attribute ";
print_type (item);
out_ <<
' ' << item.
name ();
out_ << " raises ";
}
} else {
out_ << "attribute ";
print_type (item);
out_ <<
' ' << item.
name ();
out_ << " getraises ";
}
out_ << " setraises ";
}
}
out_ << ";\n";
}
{
constructed_begin (item.
kind () == Item::Kind::EXCEPTION ?
"exception " :
"struct ", item);
for (auto m : item) {
print_type (*m);
out_ << ' ' << m->name () << ";\n";
}
complex_end ();
}
{
constructed (item);
}
{
out_ <<
"struct " << item.
name () <<
";\n";
}
void Printer::leaf (
const Struct& item)
{
constructed (item);
}
{
out_ <<
"union " << item.
name () <<
";\n";
}
void Printer::leaf (
const Union& item)
{
out_ <<
"union " << item.
name () <<
" switch (";
out_ << ") {\n";
out_.indent ();
for (auto el : item) {
if (!el->is_default ()) {
for (const auto& label : el->labels ()) {
out_ << "case " << label.to_string () << ":\n";
}
} else
out_ << "default:\n";
out_.indent ();
print_type (*el);
out_ << ' ' << el->name () << ";\n";
out_.unindent ();
}
complex_end ();
}
void Printer::leaf (
const Enum& item)
{
constructed_begin ("enum ", item);
auto it = item.begin ();
for (++it; it != item.end (); ++it) {
out_ << ",\n";
out_ << (*it)->name ();
}
out_ << endl;
complex_end ();
}
{
out_ << "abstract ";
out_ <<
"valuetype " << item.
name () <<
";\n";
}
{
case ValueType::Modifier::ABSTRACT:
out_ << "abstract ";
break;
case ValueType::Modifier::CUSTOM:
out_ << "custom ";
break;
}
out_ <<
"valuetype " << item.
name ();
if (!item.
bases ().empty ()) {
out_ << ":\n";
out_.indent ();
auto base = item.
bases ().begin ();
out_ << (*base)->name ();
++base;
for (; base != item.
bases ().end (); ++base) {
out_ << ",\n";
out_ << (*base)->name ();
}
out_.unindent ();
}
out_ << "supports\n";
out_.indent ();
if (item.
modifier () == ValueType::Modifier::TRUNCATABLE)
out_ << "truncatable ";
out_ << (*base)->name ();
++base;
for (; base != item.
supports ().end (); ++base) {
out_ << ",\n";
out_ << (*base)->name ();
}
out_.unindent ();
}
out_ << '\n';
out_ << "{\n";
out_.indent ();
}
{
complex_end ();
}
{
out_ << "public ";
else
out_ << "private ";
print_type (item);
out_ <<
' ' << item.
name () <<
";\n";
}
{
out_ << "factory ";
print_op_base (item);
out_ << ";\n";
}
void Printer::leaf (
const ValueBox& item)
{
out_ <<
"valuetype " << item.
name () <<
' ';
print_type (item);
out_ << ";\n";
}
The array type descriptor.
bool readonly() const noexcept
const Raises & getraises() const noexcept
const Raises & setraises() const noexcept
const std::filesystem::path & file() const noexcept
Returns the name of included IDL file.
bool system() const noexcept
const Interfaces & bases() const noexcept
Kind interface_kind() const noexcept
Kind kind() const noexcept
const Identifier & name() const noexcept
std::string qualified_name() const
const Identifier & name() const noexcept
const Raises & raises() const noexcept
const Context & context() const noexcept
bool oneway() const noexcept
Attribute attribute() const noexcept
The sequence type descriptor.
Dim bound() const noexcept
bool is_public() const noexcept
Kind tkind() const noexcept
const Array & array() const noexcept
uint16_t fixed_digits() const noexcept
BasicType basic_type() const noexcept
uint16_t fixed_scale() const noexcept
const NamedItem & named_type() const noexcept
const Sequence & sequence() const noexcept
Dim string_bound() const noexcept
const Type & discriminator_type() const noexcept
bool is_abstract() const noexcept
const ValueTypes & bases() const noexcept
Modifier modifier() const noexcept
const Interfaces & supports() const noexcept
VT vtype() const noexcept
std::string to_string() const
Abstract Syntax Tree namespace.