@jdeighan/coffee-utils 7.0.48 → 7.0.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/arrow.coffee +40 -4
- package/src/arrow.js +46 -5
- package/src/call_stack.coffee +37 -42
- package/src/call_stack.js +42 -42
- package/src/coffee_utils.coffee +12 -0
- package/src/coffee_utils.js +11 -0
- package/src/debug_utils.coffee +117 -123
- package/src/debug_utils.js +150 -124
- package/src/log_utils.coffee +47 -24
- package/src/log_utils.js +46 -25
package/package.json
CHANGED
package/src/arrow.coffee
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# arrow.coffee
|
|
2
2
|
|
|
3
|
+
import {undef, OL, setCharsAt} from '@jdeighan/coffee-utils'
|
|
4
|
+
|
|
5
|
+
# --- We use spaces here because Windows Terminal handles TAB chars badly
|
|
6
|
+
|
|
3
7
|
export vbar = '│' # unicode 2502
|
|
4
8
|
export hbar = '─' # unicode 2500
|
|
5
9
|
export corner = '└' # unicode 2514
|
|
@@ -8,18 +12,22 @@ export space = ' '
|
|
|
8
12
|
|
|
9
13
|
export oneIndent = vbar + space + space + space
|
|
10
14
|
export arrow = corner + hbar + arrowhead + space
|
|
11
|
-
export
|
|
15
|
+
export clearIndent = space + space + space + space
|
|
12
16
|
|
|
13
17
|
# ---------------------------------------------------------------------------
|
|
14
18
|
|
|
15
19
|
export getPrefix = (level, option='none') ->
|
|
16
20
|
|
|
17
|
-
if level==0
|
|
21
|
+
if level==0
|
|
22
|
+
if (option == 'object')
|
|
23
|
+
return clearIndent
|
|
24
|
+
else
|
|
25
|
+
return ''
|
|
18
26
|
switch option
|
|
19
27
|
when 'withArrow'
|
|
20
28
|
result = oneIndent.repeat(level-1) + arrow
|
|
21
|
-
when '
|
|
22
|
-
result = oneIndent.repeat(level
|
|
29
|
+
when 'object'
|
|
30
|
+
result = oneIndent.repeat(level) + clearIndent
|
|
23
31
|
when 'none'
|
|
24
32
|
result = oneIndent.repeat(level)
|
|
25
33
|
else
|
|
@@ -27,3 +35,31 @@ export getPrefix = (level, option='none') ->
|
|
|
27
35
|
if result.length % 4 != 0
|
|
28
36
|
throw new Error("getPrefix(): Bad prefix '#{result}'")
|
|
29
37
|
return result
|
|
38
|
+
|
|
39
|
+
# ---------------------------------------------------------------------------
|
|
40
|
+
|
|
41
|
+
export addArrow = (prefix) ->
|
|
42
|
+
|
|
43
|
+
# console.log "in addArrow(#{OL(prefix)})"
|
|
44
|
+
pos = prefix.lastIndexOf(vbar)
|
|
45
|
+
# console.log "pos = #{pos}"
|
|
46
|
+
if (pos == -1)
|
|
47
|
+
result = prefix
|
|
48
|
+
else
|
|
49
|
+
result = setCharsAt(prefix, pos, arrow)
|
|
50
|
+
# console.log "result = #{OL(result)}"
|
|
51
|
+
return result
|
|
52
|
+
|
|
53
|
+
# ---------------------------------------------------------------------------
|
|
54
|
+
|
|
55
|
+
export removeLastVbar = (prefix) ->
|
|
56
|
+
|
|
57
|
+
# console.log "in removeLastVbar(#{OL(prefix)})"
|
|
58
|
+
pos = prefix.lastIndexOf(vbar)
|
|
59
|
+
# console.log "pos = #{pos}"
|
|
60
|
+
if (pos == -1)
|
|
61
|
+
result = prefix
|
|
62
|
+
else
|
|
63
|
+
result = setCharsAt(prefix, pos, ' ')
|
|
64
|
+
# console.log "result = #{OL(result)}"
|
|
65
|
+
return result
|
package/src/arrow.js
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
// Generated by CoffeeScript 2.7.0
|
|
2
|
-
// arrow.coffee
|
|
2
|
+
// arrow.coffee
|
|
3
|
+
import {
|
|
4
|
+
undef,
|
|
5
|
+
OL,
|
|
6
|
+
setCharsAt
|
|
7
|
+
} from '@jdeighan/coffee-utils';
|
|
8
|
+
|
|
9
|
+
// --- We use spaces here because Windows Terminal handles TAB chars badly
|
|
3
10
|
export var vbar = '│'; // unicode 2502
|
|
4
11
|
|
|
5
12
|
export var hbar = '─'; // unicode 2500
|
|
@@ -14,20 +21,24 @@ export var oneIndent = vbar + space + space + space;
|
|
|
14
21
|
|
|
15
22
|
export var arrow = corner + hbar + arrowhead + space;
|
|
16
23
|
|
|
17
|
-
export var
|
|
24
|
+
export var clearIndent = space + space + space + space;
|
|
18
25
|
|
|
19
26
|
// ---------------------------------------------------------------------------
|
|
20
27
|
export var getPrefix = function(level, option = 'none') {
|
|
21
28
|
var result;
|
|
22
29
|
if (level === 0) {
|
|
23
|
-
|
|
30
|
+
if (option === 'object') {
|
|
31
|
+
return clearIndent;
|
|
32
|
+
} else {
|
|
33
|
+
return '';
|
|
34
|
+
}
|
|
24
35
|
}
|
|
25
36
|
switch (option) {
|
|
26
37
|
case 'withArrow':
|
|
27
38
|
result = oneIndent.repeat(level - 1) + arrow;
|
|
28
39
|
break;
|
|
29
|
-
case '
|
|
30
|
-
result = oneIndent.repeat(level
|
|
40
|
+
case 'object':
|
|
41
|
+
result = oneIndent.repeat(level) + clearIndent;
|
|
31
42
|
break;
|
|
32
43
|
case 'none':
|
|
33
44
|
result = oneIndent.repeat(level);
|
|
@@ -40,3 +51,33 @@ export var getPrefix = function(level, option = 'none') {
|
|
|
40
51
|
}
|
|
41
52
|
return result;
|
|
42
53
|
};
|
|
54
|
+
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
export var addArrow = function(prefix) {
|
|
57
|
+
var pos, result;
|
|
58
|
+
// console.log "in addArrow(#{OL(prefix)})"
|
|
59
|
+
pos = prefix.lastIndexOf(vbar);
|
|
60
|
+
// console.log "pos = #{pos}"
|
|
61
|
+
if (pos === -1) {
|
|
62
|
+
result = prefix;
|
|
63
|
+
} else {
|
|
64
|
+
result = setCharsAt(prefix, pos, arrow);
|
|
65
|
+
}
|
|
66
|
+
// console.log "result = #{OL(result)}"
|
|
67
|
+
return result;
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
// ---------------------------------------------------------------------------
|
|
71
|
+
export var removeLastVbar = function(prefix) {
|
|
72
|
+
var pos, result;
|
|
73
|
+
// console.log "in removeLastVbar(#{OL(prefix)})"
|
|
74
|
+
pos = prefix.lastIndexOf(vbar);
|
|
75
|
+
// console.log "pos = #{pos}"
|
|
76
|
+
if (pos === -1) {
|
|
77
|
+
result = prefix;
|
|
78
|
+
} else {
|
|
79
|
+
result = setCharsAt(prefix, pos, ' ');
|
|
80
|
+
}
|
|
81
|
+
// console.log "result = #{OL(result)}"
|
|
82
|
+
return result;
|
|
83
|
+
};
|
package/src/call_stack.coffee
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# call_stack.coffee
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
undef, defined, croak, assert, isBoolean, escapeStr,
|
|
5
|
+
} from '@jdeighan/coffee-utils'
|
|
4
6
|
import {log, LOG} from '@jdeighan/coffee-utils/log'
|
|
5
7
|
import {getPrefix} from '@jdeighan/coffee-utils/arrow'
|
|
6
8
|
|
|
@@ -19,7 +21,8 @@ export class CallStack
|
|
|
19
21
|
|
|
20
22
|
constructor: () ->
|
|
21
23
|
|
|
22
|
-
@
|
|
24
|
+
@lStack = []
|
|
25
|
+
@level = 0
|
|
23
26
|
|
|
24
27
|
# ........................................................................
|
|
25
28
|
|
|
@@ -27,81 +30,73 @@ export class CallStack
|
|
|
27
30
|
|
|
28
31
|
if doDebugStack
|
|
29
32
|
LOG "RESET STACK"
|
|
30
|
-
|
|
31
33
|
@lStack = []
|
|
32
34
|
@level = 0
|
|
33
35
|
return
|
|
34
36
|
|
|
35
37
|
# ........................................................................
|
|
36
38
|
|
|
37
|
-
|
|
39
|
+
enter: (funcName, isLogged=false) ->
|
|
38
40
|
|
|
39
|
-
|
|
41
|
+
if doDebugStack
|
|
42
|
+
LOG "[--> CALL #{funcName}]"
|
|
43
|
+
|
|
44
|
+
@lStack.push({funcName, isLogged})
|
|
40
45
|
if isLogged
|
|
41
46
|
@level += 1
|
|
42
47
|
return
|
|
43
48
|
|
|
44
49
|
# ........................................................................
|
|
50
|
+
# --- if stack is empty, log the error, but continue
|
|
45
51
|
|
|
46
|
-
|
|
52
|
+
returnFrom: (fName) ->
|
|
47
53
|
|
|
48
|
-
|
|
54
|
+
if doDebugStack
|
|
55
|
+
LOG "[<-- BACK #{fName}]"
|
|
56
|
+
|
|
57
|
+
if @lStack.length == 0
|
|
58
|
+
LOG "ERROR: returnFrom('#{funcName}') but stack is empty"
|
|
59
|
+
return
|
|
60
|
+
|
|
61
|
+
{funcName, isLogged} = @lStack.pop()
|
|
49
62
|
if isLogged && (@level > 0)
|
|
50
63
|
@level -= 1
|
|
64
|
+
|
|
65
|
+
# --- This should do nothing
|
|
51
66
|
while (funcName != fName) && (@lStack.length > 0)
|
|
52
67
|
LOG "[MISSING RETURN FROM #{funcName} (return from #{fName})]"
|
|
53
|
-
{funcName,
|
|
68
|
+
{funcName, isLogged} = @lStack.pop()
|
|
54
69
|
if isLogged && (@level > 0)
|
|
55
70
|
@level -= 1
|
|
56
71
|
|
|
57
|
-
if funcName
|
|
58
|
-
return hInfo
|
|
59
|
-
else
|
|
72
|
+
if funcName != fName
|
|
60
73
|
@dump()
|
|
61
74
|
LOG "BAD BAD BAD BAD returnFrom('#{fName}')"
|
|
62
|
-
|
|
75
|
+
return
|
|
63
76
|
|
|
64
77
|
# ........................................................................
|
|
65
|
-
# ........................................................................
|
|
66
|
-
|
|
67
|
-
call: (funcName, hInfo, isLogged=undef) ->
|
|
68
78
|
|
|
69
|
-
|
|
70
|
-
mainPre = getPrefix(@level)
|
|
79
|
+
getLevel: () ->
|
|
71
80
|
|
|
72
|
-
|
|
73
|
-
prefix = ' '.repeat(@lStack.length)
|
|
74
|
-
LOG "#{prefix}[--> CALL #{funcName}]"
|
|
75
|
-
|
|
76
|
-
@addCall funcName, hInfo, isLogged
|
|
77
|
-
auxPre = getPrefix(@level)
|
|
78
|
-
return [mainPre, auxPre, undef]
|
|
81
|
+
return @level
|
|
79
82
|
|
|
80
83
|
# ........................................................................
|
|
81
84
|
|
|
82
|
-
|
|
85
|
+
curFunc: () ->
|
|
83
86
|
|
|
84
|
-
|
|
85
|
-
|
|
87
|
+
if (@lStack.length == 0)
|
|
88
|
+
return 'main'
|
|
89
|
+
else
|
|
90
|
+
return @lStack[@lStack.length - 1].funcName
|
|
86
91
|
|
|
87
92
|
# ........................................................................
|
|
88
93
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
# --- Prefixes are based on level before stack adjustment
|
|
92
|
-
mainPre = getPrefix(@level, 'withArrow')
|
|
93
|
-
auxPre = getPrefix(@level, 'returnVal')
|
|
94
|
-
|
|
95
|
-
if @lStack.length == 0
|
|
96
|
-
LOG "returnFrom('#{funcName}') but stack is empty"
|
|
97
|
-
return [mainPre, auxPre, undef]
|
|
98
|
-
|
|
99
|
-
hInfo = @removeCall(funcName)
|
|
100
|
-
if doDebugStack
|
|
101
|
-
prefix = ' '.repeat(@lStack.length)
|
|
102
|
-
LOG "#{prefix}[<-- BACK #{funcName}]"
|
|
94
|
+
isActive: (fName) ->
|
|
103
95
|
|
|
104
|
-
|
|
96
|
+
for h in @lStack
|
|
97
|
+
if (h.funcName == fName)
|
|
98
|
+
return true
|
|
99
|
+
return false
|
|
105
100
|
|
|
106
101
|
# ........................................................................
|
|
107
102
|
# ........................................................................
|
package/src/call_stack.js
CHANGED
|
@@ -4,8 +4,11 @@ var doDebugStack;
|
|
|
4
4
|
|
|
5
5
|
import {
|
|
6
6
|
undef,
|
|
7
|
+
defined,
|
|
7
8
|
croak,
|
|
8
|
-
assert
|
|
9
|
+
assert,
|
|
10
|
+
isBoolean,
|
|
11
|
+
escapeStr
|
|
9
12
|
} from '@jdeighan/coffee-utils';
|
|
10
13
|
|
|
11
14
|
import {
|
|
@@ -27,7 +30,8 @@ export var debugStack = function(flag = true) {
|
|
|
27
30
|
// ---------------------------------------------------------------------------
|
|
28
31
|
export var CallStack = class CallStack {
|
|
29
32
|
constructor() {
|
|
30
|
-
this.
|
|
33
|
+
this.lStack = [];
|
|
34
|
+
this.level = 0;
|
|
31
35
|
}
|
|
32
36
|
|
|
33
37
|
// ........................................................................
|
|
@@ -40,74 +44,70 @@ export var CallStack = class CallStack {
|
|
|
40
44
|
}
|
|
41
45
|
|
|
42
46
|
// ........................................................................
|
|
43
|
-
|
|
44
|
-
|
|
47
|
+
enter(funcName, isLogged = false) {
|
|
48
|
+
if (doDebugStack) {
|
|
49
|
+
LOG(`[--> CALL ${funcName}]`);
|
|
50
|
+
}
|
|
51
|
+
this.lStack.push({funcName, isLogged});
|
|
45
52
|
if (isLogged) {
|
|
46
53
|
this.level += 1;
|
|
47
54
|
}
|
|
48
55
|
}
|
|
49
56
|
|
|
50
57
|
// ........................................................................
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
58
|
+
// --- if stack is empty, log the error, but continue
|
|
59
|
+
returnFrom(fName) {
|
|
60
|
+
var funcName, isLogged;
|
|
61
|
+
if (doDebugStack) {
|
|
62
|
+
LOG(`[<-- BACK ${fName}]`);
|
|
63
|
+
}
|
|
64
|
+
if (this.lStack.length === 0) {
|
|
65
|
+
LOG(`ERROR: returnFrom('${funcName}') but stack is empty`);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
({funcName, isLogged} = this.lStack.pop());
|
|
54
69
|
if (isLogged && (this.level > 0)) {
|
|
55
70
|
this.level -= 1;
|
|
56
71
|
}
|
|
72
|
+
// --- This should do nothing
|
|
57
73
|
while ((funcName !== fName) && (this.lStack.length > 0)) {
|
|
58
74
|
LOG(`[MISSING RETURN FROM ${funcName} (return from ${fName})]`);
|
|
59
|
-
({funcName,
|
|
75
|
+
({funcName, isLogged} = this.lStack.pop());
|
|
60
76
|
if (isLogged && (this.level > 0)) {
|
|
61
77
|
this.level -= 1;
|
|
62
78
|
}
|
|
63
79
|
}
|
|
64
|
-
if (funcName
|
|
65
|
-
return hInfo;
|
|
66
|
-
} else {
|
|
80
|
+
if (funcName !== fName) {
|
|
67
81
|
this.dump();
|
|
68
82
|
LOG(`BAD BAD BAD BAD returnFrom('${fName}')`);
|
|
69
|
-
return undef;
|
|
70
83
|
}
|
|
71
84
|
}
|
|
72
85
|
|
|
73
86
|
// ........................................................................
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
var auxPre, mainPre, prefix;
|
|
77
|
-
assert(isLogged !== undef, "CallStack.call(): 3 args required");
|
|
78
|
-
mainPre = getPrefix(this.level);
|
|
79
|
-
if (doDebugStack) {
|
|
80
|
-
prefix = ' '.repeat(this.lStack.length);
|
|
81
|
-
LOG(`${prefix}[--> CALL ${funcName}]`);
|
|
82
|
-
}
|
|
83
|
-
this.addCall(funcName, hInfo, isLogged);
|
|
84
|
-
auxPre = getPrefix(this.level);
|
|
85
|
-
return [mainPre, auxPre, undef];
|
|
87
|
+
getLevel() {
|
|
88
|
+
return this.level;
|
|
86
89
|
}
|
|
87
90
|
|
|
88
91
|
// ........................................................................
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
92
|
+
curFunc() {
|
|
93
|
+
if (this.lStack.length === 0) {
|
|
94
|
+
return 'main';
|
|
95
|
+
} else {
|
|
96
|
+
return this.lStack[this.lStack.length - 1].funcName;
|
|
97
|
+
}
|
|
93
98
|
}
|
|
94
99
|
|
|
95
100
|
// ........................................................................
|
|
96
|
-
|
|
97
|
-
var
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
}
|
|
105
|
-
hInfo = this.removeCall(funcName);
|
|
106
|
-
if (doDebugStack) {
|
|
107
|
-
prefix = ' '.repeat(this.lStack.length);
|
|
108
|
-
LOG(`${prefix}[<-- BACK ${funcName}]`);
|
|
101
|
+
isActive(fName) {
|
|
102
|
+
var h, j, len, ref;
|
|
103
|
+
ref = this.lStack;
|
|
104
|
+
for (j = 0, len = ref.length; j < len; j++) {
|
|
105
|
+
h = ref[j];
|
|
106
|
+
if (h.funcName === fName) {
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
109
|
}
|
|
110
|
-
return
|
|
110
|
+
return false;
|
|
111
111
|
}
|
|
112
112
|
|
|
113
113
|
// ........................................................................
|
package/src/coffee_utils.coffee
CHANGED
|
@@ -503,3 +503,15 @@ export className = (aClass) ->
|
|
|
503
503
|
export range = (n) ->
|
|
504
504
|
|
|
505
505
|
return [0..n-1]
|
|
506
|
+
|
|
507
|
+
# ---------------------------------------------------------------------------
|
|
508
|
+
|
|
509
|
+
export setCharsAt = (str, pos, str2) ->
|
|
510
|
+
|
|
511
|
+
assert (pos >= 0), "negative pos #{pos} not allowed"
|
|
512
|
+
assert (pos < str.length), "pos #{pos} not in #{OL(str)}"
|
|
513
|
+
if (pos + str2.length >= str.length)
|
|
514
|
+
return str.substring(0, pos) + str2
|
|
515
|
+
else
|
|
516
|
+
return str.substring(0, pos) + str2 + str.substring(pos + str2.length)
|
|
517
|
+
|
package/src/coffee_utils.js
CHANGED
|
@@ -543,3 +543,14 @@ export var range = function(n) {
|
|
|
543
543
|
return results;
|
|
544
544
|
}).apply(this);
|
|
545
545
|
};
|
|
546
|
+
|
|
547
|
+
// ---------------------------------------------------------------------------
|
|
548
|
+
export var setCharsAt = function(str, pos, str2) {
|
|
549
|
+
assert(pos >= 0, `negative pos ${pos} not allowed`);
|
|
550
|
+
assert(pos < str.length, `pos ${pos} not in ${OL(str)}`);
|
|
551
|
+
if (pos + str2.length >= str.length) {
|
|
552
|
+
return str.substring(0, pos) + str2;
|
|
553
|
+
} else {
|
|
554
|
+
return str.substring(0, pos) + str2 + str.substring(pos + str2.length);
|
|
555
|
+
}
|
|
556
|
+
};
|