From 5632c5c246946cb4051f1e53588a4de881d7cedf Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Sat, 4 Jun 2022 18:14:27 +0000 Subject: [PATCH] add KissError.hx --- src/kiss/KissError.hx | 70 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/kiss/KissError.hx diff --git a/src/kiss/KissError.hx b/src/kiss/KissError.hx new file mode 100644 index 0000000..80b111a --- /dev/null +++ b/src/kiss/KissError.hx @@ -0,0 +1,70 @@ +package kiss; + +import kiss.Reader; +import kiss.List; + +using kiss.Stream; +using kiss.Reader; + +enum ErrorType { + CantCompile; + CompileWarning; + AssertionFail; +} + +// Internal Kiss errors +class KissError { + var exps:List; + var message:String; + + function new(exps:Array, message:String) { + this.exps = exps; + this.message = message; + } + + public static function fromExp(exp:ReaderExp, message:String) { + return new KissError([exp], message); + } + + public static function fromExpStr(pos:Position, expStr:String, message:String) { + switch (Reader.read(Stream.fromString(expStr), Kiss.defaultKissState())) { + case Some(exp): + return fromExp({pos: pos, def: exp.def}, message); + default: + throw 'bad'; // TODO better message + } + } + + public static function fromArgs(exps:Array, message:String) { + return new KissError(exps, message); + } + + public function toString(type = CantCompile) { + var posPrefix = switch (exps.length) { + case 1: + exps[0].pos.toPrint(); + default: + var firstPos = exps[0].pos.toPrint(); + var lastPos = exps[-1].pos.toPrint(); + var justLineAndColumnIdx = lastPos.indexOf(":") + 1; + firstPos + '-' + lastPos.substr(justLineAndColumnIdx); + } + + var typePrefix = switch (type) { + case CantCompile: + "Kiss compilation failed"; + case CompileWarning: + "Kiss compilation warning"; + case AssertionFail: + "Assertion failed"; + }; + + return '$posPrefix: $typePrefix: $message' + + "\nFrom:" + + [for (exp in exps) exp.def.toString()].toString(); + } + + public static function warnFromExp(exp:ReaderExp, message:String) { + Prelude.print(new KissError([exp], message).toString(CompileWarning)); + } +}