Program Listing for File exception.h#

Return to documentation for file (sdv_idl_compiler\exception.h)

#ifndef EXCEPTION_H
#define EXCEPTION_H

#include "logger.h"
#include "token.h"
#include <exception>
#include <sstream>
#include <cassert>
#include <filesystem>
#include <iostream>

// Forward declaration
class CParser;

struct CCompileException : public sdv::idl::XCompileError
{
    friend class CParser;

public:
    CCompileException(const sdv::idl::XCompileError& rxCompileError);

    template <class... TAdditionalReason>
    explicit CCompileException(const char* szReason, TAdditionalReason... tAdditionalReasons);

    template <class... TAdditionalReason>
    explicit CCompileException(const CToken& rtoken, const char* szReason, TAdditionalReason... tAdditionalReasons);

    template <class... TAdditionalReason>
    explicit CCompileException(const std::filesystem::path& rpath, const CToken& rtoken,
        const char* szReason, TAdditionalReason... tAdditionalReasons);

     std::string GetPath() const;

    std::string GetReason() const;

    uint32_t GetLineNo() const;

    uint32_t GetColNo() const;

    std::string GetToken() const;

    std::string GetLine() const;

private:
    void SetPath(const std::filesystem::path& rpath);

    void SetLocation(const CToken& rtoken);
};

template <class TParam>
void AddParamListToString(std::stringstream& rsstream, TParam param)
{
    rsstream << param;
}

template <class TParam, class... TAdditionalParams>
void AddParamListToString(std::stringstream& rsstream, TParam param, TAdditionalParams... tAdditionalParams)
{
    rsstream << param;
    AddParamListToString(rsstream, tAdditionalParams...);
}

template <class... TAdditionalReason>
CCompileException::CCompileException(const char* szReason, TAdditionalReason... tAdditionalReasons) : sdv::idl::XCompileError{}
{
    assert(szReason);
    if (szReason)
    {
        std::stringstream sstream;
        AddParamListToString(sstream, szReason, tAdditionalReasons...);
        ssReason = sstream.str();
    }
    CLog log;
    log << "EXCEPTION: " << ssReason << std::endl;
}

template <class... TAdditionalReason>
CCompileException::CCompileException(const CToken& rtoken, const char* szReason, TAdditionalReason... tAdditionalReasons) :
    sdv::idl::XCompileError{}
{
    assert(szReason);
    if (szReason)
    {
        std::stringstream sstream;
        AddParamListToString(sstream, szReason, tAdditionalReasons...);
        ssReason = sstream.str();
    }
    SetLocation(rtoken);
    CLog log;
    log << "EXCEPTION " << "[" << GetLineNo() << ", " << GetColNo() << "]: " << ssReason << std::endl;
}

template <class... TAdditionalReason>
CCompileException::CCompileException(const std::filesystem::path& rpath, const CToken& rtoken,
    const char* szReason, TAdditionalReason... tAdditionalReasons) :
    CCompileException::CCompileException(rtoken, szReason, tAdditionalReasons...)
{
    assert(szReason);
    if (szReason)
    {
        std::stringstream sstream;
        AddParamListToString(sstream, szReason, tAdditionalReasons...);
        ssReason = sstream.str();
    }
    SetLocation(rtoken);
    ssFile = rpath.generic_u8string();
    CLog log;
    log << "EXCEPTION " << rpath.generic_u8string() << " [" << GetLineNo() << ", " << GetColNo() << "]: " << ssReason << std::endl;
}

#endif // !defined EXCEPTION_H