xo-expression2/src/expression2/SetupExpression2.cpp
2026-03-26 15:05:30 -04:00

151 lines
5.9 KiB
C++

/** @file SetupExpression2.cpp
*
* @author Roland Conybeare, Jan 2026
**/
#include "SetupExpression2.hpp"
#include <xo/expression2/DefineExpr.hpp>
#include <xo/expression2/Variable.hpp>
#include <xo/expression2/Typename.hpp>
#include <xo/expression2/VarRef.hpp>
#include <xo/expression2/Constant.hpp>
#include <xo/expression2/ApplyExpr.hpp>
#include <xo/expression2/LambdaExpr.hpp>
#include <xo/expression2/IfElseExpr.hpp>
#include <xo/expression2/SequenceExpr.hpp>
#include <xo/expression2/detail/IGCObject_DSequenceExpr.hpp>
#include <xo/expression2/detail/IPrintable_DSequenceExpr.hpp>
#include <xo/expression2/GlobalSymtab.hpp>
#include <xo/expression2/LocalSymtab.hpp>
#include <xo/alloc2/gc/AGCObject.hpp>
#include <xo/printable2/detail/APrintable.hpp>
#include <xo/facet/FacetRegistry.hpp>
#include <xo/indentlog/scope.hpp>
namespace xo {
using xo::mm::AGCObject;
using xo::print::APrintable;
using xo::facet::FacetRegistry;
using xo::facet::TypeRegistry;
using xo::facet::typeseq;
using xo::facet::impl_for;
namespace scm {
bool
SetupExpression2::register_facets()
{
scope log(XO_DEBUG(true));
// Expression
// +- Constant
// +- Variable
// +- VarRef
// +- DefineExpr
// +- ApplyExpr
// +- LambdaExpr
// +- IfElseExpr
// \- SequenceExpr
FacetRegistry::register_impl<AExpression, DConstant>();
FacetRegistry::register_impl<AGCObject, DConstant>();
FacetRegistry::register_impl<APrintable, DConstant>();
FacetRegistry::register_impl<AExpression, DVariable>();
FacetRegistry::register_impl<AGCObject, DVariable>();
FacetRegistry::register_impl<APrintable, DVariable>();
FacetRegistry::register_impl<AExpression, DVarRef>();
FacetRegistry::register_impl<AGCObject, DVarRef>();
FacetRegistry::register_impl<APrintable, DVarRef>();
FacetRegistry::register_impl<AExpression, DDefineExpr>();
FacetRegistry::register_impl<AGCObject, DDefineExpr>();
FacetRegistry::register_impl<APrintable, DDefineExpr>();
FacetRegistry::register_impl<AExpression, DApplyExpr>();
FacetRegistry::register_impl<AGCObject, DApplyExpr>();
FacetRegistry::register_impl<APrintable, DApplyExpr>();
FacetRegistry::register_impl<AExpression, DLambdaExpr>();
FacetRegistry::register_impl<AGCObject, DLambdaExpr>();
FacetRegistry::register_impl<APrintable, DLambdaExpr>();
FacetRegistry::register_impl<AExpression, DIfElseExpr>();
FacetRegistry::register_impl<AGCObject, DIfElseExpr>();
FacetRegistry::register_impl<APrintable, DIfElseExpr>();
FacetRegistry::register_impl<AExpression, DSequenceExpr>();
FacetRegistry::register_impl<AGCObject, DSequenceExpr>();
FacetRegistry::register_impl<APrintable, DSequenceExpr>();
// Typename
FacetRegistry::register_impl<AGCObject, DTypename>();
FacetRegistry::register_impl<APrintable, DTypename>();
// SymbolTable
// +- LocalSymtab
// \- GlobalSymtab
FacetRegistry::register_impl<ASymbolTable, DLocalSymtab>();
FacetRegistry::register_impl<AGCObject, DLocalSymtab>();
FacetRegistry::register_impl<APrintable, DLocalSymtab>();
FacetRegistry::register_impl<ASymbolTable, DGlobalSymtab>();
FacetRegistry::register_impl<AGCObject, DGlobalSymtab>();
FacetRegistry::register_impl<APrintable, DGlobalSymtab>();
// until we register facets
TypeRegistry::register_type<DGlobalSymtab>();
TypeRegistry::register_type<DGlobalSymtab::repr_type>();
log && log(xtag("DUniqueString.tseq", typeseq::id<DUniqueString>()));
log && log(xtag("DDefineExpr.tseq", typeseq::id<DDefineExpr>()));
log && log(xtag("DVariable.tseq", typeseq::id<DVariable>()));
log && log(xtag("DTypename.tseq", typeseq::id<DTypename>()));
log && log(xtag("DVarRef.tseq", typeseq::id<DVarRef>()));
log && log(xtag("DConstant.tseq", typeseq::id<DConstant>()));
log && log(xtag("DApplyExpr.tseq", typeseq::id<DApplyExpr>()));
log && log(xtag("DLambdaExpr.tseq", typeseq::id<DLambdaExpr>()));
log && log(xtag("DIfElseExpr.tseq", typeseq::id<DIfElseExpr>()));
log && log(xtag("DSequenceExpr.tseq", typeseq::id<DSequenceExpr>()));
log && log(xtag("DGlobalSymtab.tseq", typeseq::id<DGlobalSymtab>()));
log && log(xtag("DLocalSymtab.tseq", typeseq::id<DLocalSymtab>()));
log && log(xtag("AExpression.tseq", typeseq::id<AExpression>()));
log && log(xtag("ASymbolTable.tseq", typeseq::id<ASymbolTable>()));
return true;
}
bool
SetupExpression2::register_types(obj<ACollector> gc)
{
scope log(XO_DEBUG(true));
bool ok = true;
ok &= gc.install_type(impl_for<AGCObject, DConstant>());
ok &= gc.install_type(impl_for<AGCObject, DVariable>());
ok &= gc.install_type(impl_for<AGCObject, DTypename>());
ok &= gc.install_type(impl_for<AGCObject, DVarRef>());
ok &= gc.install_type(impl_for<AGCObject, DDefineExpr>());
ok &= gc.install_type(impl_for<AGCObject, DApplyExpr>());
ok &= gc.install_type(impl_for<AGCObject, DLambdaExpr>());
ok &= gc.install_type(impl_for<AGCObject, DIfElseExpr>());
ok &= gc.install_type(impl_for<AGCObject, DSequenceExpr>());
ok &= gc.install_type(impl_for<AGCObject, DLocalSymtab>());
ok &= gc.install_type(impl_for<AGCObject, DGlobalSymtab>());
return ok;
} } /*namespace scm*/
} /*namespace xo*/
/* end SetupExpression2.cpp */