diff options
author | Ben Burdette <bburdette@gmail.com> | 2020-03-24 11:21:35 -0600 |
---|---|---|
committer | Ben Burdette <bburdette@gmail.com> | 2020-03-24 11:21:35 -0600 |
commit | 0166e7ab6d1d4530e9d6d9562693a58ab54c36ba (patch) | |
tree | b0bc6679386153dd2786f2a3cfdaf7f425a2c9f4 /src | |
parent | 4171ab4bbd95e9bb4b9d6c6e8c143002d92b0c06 (diff) |
MkNixCode, MkErrLine approach
Diffstat (limited to 'src')
-rw-r--r-- | src/libutil/error.cc | 6 | ||||
-rw-r--r-- | src/libutil/error.hh | 187 |
2 files changed, 175 insertions, 18 deletions
diff --git a/src/libutil/error.cc b/src/libutil/error.cc index 81c1f1805..f258d6a83 100644 --- a/src/libutil/error.cc +++ b/src/libutil/error.cc @@ -94,7 +94,11 @@ void print_error(ErrorInfo &einfo) level_string = "warning:"; // TODO make yellow. break; } - } + default: + { + level_string = "wat:"; + break; + }} int ndl = level_string.length() + 3 + einfo.name.length() + einfo.program.length(); int dashwidth = errwidth - 3 ? 3 : 80 - ndl; diff --git a/src/libutil/error.hh b/src/libutil/error.hh index 69776eb8c..9449540af 100644 --- a/src/libutil/error.hh +++ b/src/libutil/error.hh @@ -3,6 +3,7 @@ #include "types.hh" #include <string> #include <optional> +#include <iostream> using std::string; using std::optional; @@ -16,35 +17,171 @@ enum ErrLevel class ColumnRange { public: - unsigned int start; - unsigned int len; + unsigned int start; + unsigned int len; }; +class ErrorInfo; + +// ------------------------------------------------- +// forward declarations before ErrLine. +template <class T> +class AddLineNumber; + +template <class T> +class AddColumnRange; + +template <class T> +class AddLOC; + class ErrLine { public: - int lineNumber; - optional<ColumnRange> columnRange; - optional<string> prevLineOfCode; - string errLineOfCode; - optional<string> nextLineOfCode; + int lineNumber; + optional<ColumnRange> columnRange; + optional<string> prevLineOfCode; + string errLineOfCode; + optional<string> nextLineOfCode; + + friend AddLineNumber<ErrLine>; + friend AddColumnRange<ErrLine>; + friend AddLOC<ErrLine>; + ErrLine& GetEL() { return *this; } + private: + ErrLine() {} +}; + +template <class T> +class AddLineNumber : public T +{ + public: + T& lineNumber(int lineNumber) { + GetEL().lineNumber = lineNumber; + return *this; + } + protected: + ErrLine& GetEL() { return T::GetEL(); } +}; + +template <class T> +class AddColumnRange : public T +{ + public: + T& columnRange(unsigned int start, unsigned int len) { + GetEL().columnRange = { start, len }; + return *this; + } + protected: + ErrLine& GetEL() { return T::GetEL(); } +}; + +template <class T> +class AddLOC : public T +{ + public: + T& linesOfCode(optional<string> prevloc, string loc, optional<string> nextloc) { + GetEL().prevLineOfCode = prevloc; + GetEL().errLineOfCode = loc; + GetEL().nextLineOfCode = nextloc; + return *this; + } + protected: + ErrLine& GetEL() { return T::GetEL(); } }; +typedef AddLineNumber<AddColumnRange<AddLOC<ErrLine>>> MkErrLine; +MkErrLine mkErrLine; + + +// ------------------------------------------------- +// NixCode. + +template <class T> +class AddNixFile; + +template <class T> +class AddErrLine; + class NixCode { public: - optional<string> nixFile; - optional<ErrLine> errLine; + optional<string> nixFile; + optional<ErrLine> errLine; + + friend AddNixFile<NixCode>; + friend AddErrLine<NixCode>; + friend ErrorInfo; + NixCode& GetNC() { return *this; } + private: + NixCode() {} +}; + +template <class T> +class AddNixFile : public T +{ + public: + T& nixFile(string filename) { + GetNC().nixFile = filename; + return *this; + } + protected: + NixCode& GetNC() { return T::GetNC(); } +}; + +template <class T> +class AddErrLine : public T +{ + public: + T& errLine(ErrLine errline) { + GetNC().errLine = errline; + return *this; + } + protected: + NixCode& GetNC() { return T::GetNC(); } }; +typedef AddNixFile<AddErrLine<NixCode>> MkNixCode; + +// ------------------------------------------------- +// ErrorInfo. + +template <class T> +class AddName; + +template <class T> +class AddDescription; + +template <class T> +class AddNixCode; class ErrorInfo { public: - ErrLevel level; - string name; - string description; - string program; - optional<NixCode> nixCode; - string hint; - ErrorInfo& GetEI() { return *this; } + ErrLevel level; + string name; + string description; + string program; + optional<NixCode> nixCode; + string hint; + ErrorInfo& GetEI() { return *this; } + + // give these access to the private constructor, + // when they are direct descendants. + friend AddName<ErrorInfo>; + friend AddDescription<ErrorInfo>; + friend AddNixCode<ErrorInfo>; + + protected: + ErrorInfo(ErrLevel level) { this->level = level; } +}; + +class EIError : public ErrorInfo +{ + protected: + EIError() : ErrorInfo(elError) {} +}; + +class EIWarning : public ErrorInfo +{ + protected: + EIWarning() : ErrorInfo(elWarning) {} }; template <class T> @@ -71,7 +208,23 @@ class AddDescription : private T ErrorInfo& GetEI() { return T::GetEI(); } }; -typedef AddName<AddDescription<ErrorInfo>> StandardError; +template <class T> +class AddNixCode : private T +{ + public: + T& nixcode(const NixCode &nixcode){ + GetEI().nixCode = nixcode; + return *this; + } + protected: + ErrorInfo& GetEI() { return T::GetEI(); } +}; + +typedef AddName<AddDescription<EIError>> StandardError; +typedef AddName<AddDescription<EIWarning>> StandardWarning; + +typedef AddName<AddDescription<AddNixCode<EIError>>> MkNixError; +typedef AddName<AddDescription<AddNixCode<EIWarning>>> MkNixWarning; string showErrLine(ErrLine &errLine); |