Skip to content

Commit 6c2cbb9

Browse files
Error decomposing feature add
1 parent 65ccaef commit 6c2cbb9

5 files changed

Lines changed: 111 additions & 39 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"printableName": "Cache Web Terminal",
66
"description": "Web-based terminal emulator for Caché administering.",
77
"author": "ZitRo",
8-
"version": "4.2.3",
8+
"version": "4.2.4",
99
"gaID": "UA-83005064-2",
1010
"releaseNumber": 26,
1111
"scripts": {

src/client/js/parser/grammar.js

Lines changed: 32 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -509,8 +509,8 @@ rule("postCondition").split(
509509

510510
rule("doArgument").split(
511511
char({ value: "^", class: "global" }).branch().split(
512-
char({ type: "routine", class: "global" }),
513-
any
512+
char({ value: "%", type: "routine", class: "global" }),
513+
any()
514514
).id({ type: "routine", class: "global" }).split(
515515
char({ value: ".", type: "routine", class: "global" }).merge(),
516516
any()
@@ -624,38 +624,37 @@ rule("classStatic").split(
624624
).exit().end();
625625

626626
rule("function").char({ value: "$", class: "keyword" }).split(
627-
char({ value: "$", class: "keyword" }).split(
628-
char({ value: "$", class: "keyword" }),
629-
any()
630-
),
627+
id([
628+
{ CI, class: "keyword", value: "data" },
629+
{ CI, class: "keyword", value: "explode" },
630+
{ CI, class: "keyword", value: "extract" },
631+
{ CI, class: "keyword", value: "get" },
632+
{ CI, class: "keyword", value: "increment" },
633+
{ CI, class: "keyword", value: "isobject" },
634+
{ CI, class: "keyword", value: "isvaliddouble" },
635+
{ CI, class: "keyword", value: "isvalidnum" },
636+
{ CI, class: "keyword", value: "lb" },
637+
{ CI, class: "keyword", value: "length" },
638+
{ CI, class: "keyword", value: "listbuild" },
639+
{ CI, class: "keyword", value: "listdata" },
640+
{ CI, class: "keyword", value: "listfind" },
641+
{ CI, class: "keyword", value: "listfromstring" },
642+
{ CI, class: "keyword", value: "listget" },
643+
{ CI, class: "keyword", value: "listlength" },
644+
{ CI, class: "keyword", value: "listnext" },
645+
{ CI, class: "keyword", value: "listsame" },
646+
{ CI, class: "keyword", value: "listtostring" },
647+
{ CI, class: "keyword", value: "listvalid" },
648+
{ CI, class: "keyword", value: "list" },
649+
{ CI, class: "keyword", value: "order" },
650+
{ CI, class: "keyword", value: "piece" },
651+
{ CI, class: "keyword", value: "replace" },
652+
{ CI, class: "keyword", value: "random" },
653+
{ CI, class: "keyword" }
654+
]),
655+
char({ value: "$", class: "keyword" }).id({ class: "keyword" }),
631656
any()
632-
).id([
633-
{ CI, class: "keyword", value: "data" },
634-
{ CI, class: "keyword", value: "explode" },
635-
{ CI, class: "keyword", value: "get" },
636-
{ CI, class: "keyword", value: "increment" },
637-
{ CI, class: "keyword", value: "isobject" },
638-
{ CI, class: "keyword", value: "isvaliddouble" },
639-
{ CI, class: "keyword", value: "isvalidnum" },
640-
{ CI, class: "keyword", value: "lb" },
641-
{ CI, class: "keyword", value: "length" },
642-
{ CI, class: "keyword", value: "listbuild" },
643-
{ CI, class: "keyword", value: "listdata" },
644-
{ CI, class: "keyword", value: "listfind" },
645-
{ CI, class: "keyword", value: "listfromstring" },
646-
{ CI, class: "keyword", value: "listget" },
647-
{ CI, class: "keyword", value: "listlength" },
648-
{ CI, class: "keyword", value: "listnext" },
649-
{ CI, class: "keyword", value: "listsame" },
650-
{ CI, class: "keyword", value: "listtostring" },
651-
{ CI, class: "keyword", value: "listvalid" },
652-
{ CI, class: "keyword", value: "list" },
653-
{ CI, class: "keyword", value: "order" },
654-
{ CI, class: "keyword", value: "piece" },
655-
{ CI, class: "keyword", value: "replace" },
656-
{ CI, class: "keyword", value: "random" },
657-
{ CI, class: "keyword" }
658-
]).split(
657+
).split(
659658
char("(").call("argumentList").char(")"),
660659
any()
661660
).exit().end();

src/client/js/server/handlers.js

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,37 @@ export function prompt (namespace) {
2727
});
2828
}
2929

30+
function cleanCWTLabel (string) {
31+
let s = string.replace(/(\w+(?:\+[0-9]+)?\^(?:\w\.?)+)/, "\x1b[(special)m$1\x1b[0m")
32+
.replace(/^(<.*>)/, `\x1b[31m$1\x1b[0m`),
33+
ss = s.replace(/z\w+\+[0-9]+\^WebTerminal\.\w+\.[0-9]+/, "");
34+
return {
35+
string: ss,
36+
internal: ss.length !== s.length
37+
};
38+
}
39+
3040
export function execError (message = "") {
31-
output.printAsync(
32-
message.replace(/^(<.*>)/, `\x1b[31m$1\x1b[0m`)
33-
.replace(/zLoop\+[0-9]+\^WebTerminal\.Core\.[0-9]+/, "") + "\r\n"
34-
);
41+
let textToPrint = [""];
42+
if (typeof message === "object") {
43+
let label = cleanCWTLabel(message["zerror"] || "?");
44+
textToPrint.push(label.string);
45+
if (!label.internal) {
46+
let source = message.source.split(/\n/g);
47+
for (let line = 0; line < source.length; line++) {
48+
let e = line === message.line;
49+
textToPrint.push(
50+
`\x1b[${ e ? "(wrong)" : "(special)" }m${ e ? "╠" : "║" }\x1b[0m`
51+
+ (e ? "\x1b[(wrong)m" : "")
52+
+ source[line]
53+
+ (e ? "\x1b[0m" : "")
54+
);
55+
}
56+
}
57+
} else {
58+
textToPrint.push(cleanCWTLabel(message).string);
59+
}
60+
output.printAsync(textToPrint.join("\r\n") + "\r\n");
3561
}
3662

3763
export function error (message = "") {
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
Class WebTerminal.ErrorDecomposer
2+
{
3+
4+
Parameter LINES As %Numeric = 5;
5+
6+
/// Takes $ZERROR function result.
7+
/// Returns either simple string or %ZEN.proxyObject representing the error details.
8+
ClassMethod DecomposeError (err As %String = "")
9+
{
10+
return:($FIND(err, "<") '= 2) err
11+
set startPos = $FIND(err, ">")
12+
return:(startPos = 0) err
13+
set spacePos = $FIND(err, " ") - 1
14+
return:(spacePos = startPos) err
15+
set label = $EXTRACT(err, startPos, $case(spacePos = 0, 1:999, :spacePos-1))
16+
return:(label = "") err
17+
try {
18+
set obj = ##class(%ZEN.proxyObject).%New()
19+
set obj.zerror = err
20+
set plusPos = $FIND(label, "+")
21+
set cPos = $FIND(label, "^")
22+
if (plusPos = 0) || (cPos = 0) {
23+
set obj.source = $TEXT(@label)
24+
set obj.line = 0
25+
return obj
26+
}
27+
set line = +$EXTRACT(label, plusPos, cPos - 2)
28+
set part1 = $EXTRACT(label, 1, plusPos - 1)
29+
set part2 = $EXTRACT(label, cPos - 1, *)
30+
set range = ..#LINES \ 2
31+
set obj.source = ""
32+
set obj.line = 0
33+
for i=line-range:1:line+range {
34+
continue:(i < 1)
35+
set label = part1 _ i _ part2
36+
set text = $TEXT(@label)
37+
set:(text '= "") obj.source = obj.source _ $case(obj.source = "", 1: "", :$C(10)) _ text
38+
set:((text '= "") && (i < line)) obj.line = obj.line + 1
39+
}
40+
return obj
41+
} catch (e) {
42+
return err
43+
}
44+
return err
45+
}
46+
47+
}

src/cls/WebTerminal/Handlers.cls

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ loop
6565
set client.childNamespace = $LISTGET(chunk, 1)
6666
set err = $LISTGET(chunk, 2)
6767
if (err '= "") {
68-
do client.Send("execError", err)
68+
do client.Send("execError", ##class(ErrorDecomposer).DecomposeError(err))
6969
}
7070
quit // break for cycle
7171
} else { // unknown response - just send it to the client

0 commit comments

Comments
 (0)