@jdeighan/coffee-utils 11.0.3 → 11.0.5
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 +4 -4
- package/src/Section.coffee +1 -1
- package/src/Section.js +4 -4
- package/src/SectionMap.coffee +3 -2
- package/src/SectionMap.js +8 -5
- package/src/block.coffee +2 -32
- package/src/block.js +17 -44
- package/src/fs.coffee +2 -1
- package/src/fs.js +4 -1
- package/src/fsa.coffee +3 -2
- package/src/fsa.js +8 -5
- package/src/svelte.coffee +2 -1
- package/src/svelte.js +5 -2
- package/src/utils.coffee +20 -310
- package/src/utils.js +87 -366
- package/src/arrow.coffee +0 -65
- package/src/arrow.js +0 -83
- package/src/debug.coffee +0 -300
- package/src/debug.js +0 -329
- package/src/log.coffee +0 -186
- package/src/log.js +0 -206
- package/src/stack.coffee +0 -169
- package/src/stack.js +0 -191
package/src/arrow.js
DELETED
@@ -1,83 +0,0 @@
|
|
1
|
-
// Generated by CoffeeScript 2.7.0
|
2
|
-
// arrow.coffee
|
3
|
-
import {
|
4
|
-
assert
|
5
|
-
} from '@jdeighan/exceptions';
|
6
|
-
|
7
|
-
import {
|
8
|
-
undef,
|
9
|
-
OL,
|
10
|
-
setCharsAt
|
11
|
-
} from '@jdeighan/coffee-utils';
|
12
|
-
|
13
|
-
// --- We use spaces here because Windows Terminal handles TAB chars badly
|
14
|
-
export var vbar = '│'; // unicode 2502
|
15
|
-
|
16
|
-
export var hbar = '─'; // unicode 2500
|
17
|
-
|
18
|
-
export var corner = '└'; // unicode 2514
|
19
|
-
|
20
|
-
export var arrowhead = '>';
|
21
|
-
|
22
|
-
export var space = ' ';
|
23
|
-
|
24
|
-
export var dot = '.';
|
25
|
-
|
26
|
-
export var oneIndent = vbar + space + space + space;
|
27
|
-
|
28
|
-
export var arrow = corner + hbar + arrowhead + space;
|
29
|
-
|
30
|
-
export var clearIndent = space + space + space + space;
|
31
|
-
|
32
|
-
export var dotIndent = dot + space + space + space;
|
33
|
-
|
34
|
-
// ---------------------------------------------------------------------------
|
35
|
-
export var prefix = function(level, option = 'none') {
|
36
|
-
switch (option) {
|
37
|
-
case 'withArrow':
|
38
|
-
if (level === 0) {
|
39
|
-
return arrow;
|
40
|
-
} else {
|
41
|
-
return oneIndent.repeat(level - 1) + arrow;
|
42
|
-
}
|
43
|
-
break;
|
44
|
-
case 'noLastVbar':
|
45
|
-
assert(level >= 1, `prefix(), noLastVbar but level=${OL(level)}`);
|
46
|
-
return oneIndent.repeat(level - 1) + clearIndent;
|
47
|
-
case 'noLast2Vbars':
|
48
|
-
assert(level >= 2, `prefix(), noLast2Vbars but level=${OL(level)}`);
|
49
|
-
return oneIndent.repeat(level - 2) + clearIndent + clearIndent;
|
50
|
-
case 'dotLastVbar':
|
51
|
-
assert(level >= 1, `prefix(), dotLastVbar but level=${OL(level)}`);
|
52
|
-
return oneIndent.repeat(level - 1) + dotIndent;
|
53
|
-
case 'dotLast2Vbars':
|
54
|
-
assert(level >= 2, `prefix(), dotLast2Vbars but level=${OL(level)}`);
|
55
|
-
return oneIndent.repeat(level - 2) + dotIndent + clearIndent;
|
56
|
-
default:
|
57
|
-
return oneIndent.repeat(level);
|
58
|
-
}
|
59
|
-
};
|
60
|
-
|
61
|
-
// ---------------------------------------------------------------------------
|
62
|
-
export var addArrow = function(prefix) {
|
63
|
-
var pos, result;
|
64
|
-
pos = prefix.lastIndexOf(vbar);
|
65
|
-
if (pos === -1) {
|
66
|
-
result = prefix;
|
67
|
-
} else {
|
68
|
-
result = setCharsAt(prefix, pos, arrow);
|
69
|
-
}
|
70
|
-
return result;
|
71
|
-
};
|
72
|
-
|
73
|
-
// ---------------------------------------------------------------------------
|
74
|
-
export var removeLastVbar = function(prefix) {
|
75
|
-
var pos, result;
|
76
|
-
pos = prefix.lastIndexOf(vbar);
|
77
|
-
if (pos === -1) {
|
78
|
-
result = prefix;
|
79
|
-
} else {
|
80
|
-
result = setCharsAt(prefix, pos, ' ');
|
81
|
-
}
|
82
|
-
return result;
|
83
|
-
};
|
package/src/debug.coffee
DELETED
@@ -1,300 +0,0 @@
|
|
1
|
-
# debug.coffee
|
2
|
-
|
3
|
-
import {LOG, assert, croak} from '@jdeighan/exceptions'
|
4
|
-
import {
|
5
|
-
undef, defined, notdefined,
|
6
|
-
isString, isFunction, isBoolean, isArray,
|
7
|
-
OL, words, pass,
|
8
|
-
} from '@jdeighan/coffee-utils'
|
9
|
-
import {CallStack} from '@jdeighan/coffee-utils/stack'
|
10
|
-
import {prefix} from '@jdeighan/coffee-utils/arrow'
|
11
|
-
import {
|
12
|
-
log, logItem, logBareItem, shortEnough,
|
13
|
-
} from '@jdeighan/coffee-utils/log'
|
14
|
-
|
15
|
-
# --- set in resetDebugging() and setDebugging()
|
16
|
-
export callStack = new CallStack()
|
17
|
-
export shouldLog = () -> undef
|
18
|
-
|
19
|
-
lFuncList = [] # names of functions being debugged
|
20
|
-
strFuncList = undef # original string
|
21
|
-
|
22
|
-
# ---------------------------------------------------------------------------
|
23
|
-
|
24
|
-
export interp = (label) ->
|
25
|
-
|
26
|
-
return label.replace(/// \$ (\@)? ([A-Za-z_][A-Za-z0-9_]*) ///g,
|
27
|
-
(_, atSign, varName) ->
|
28
|
-
if atSign
|
29
|
-
return "\#{OL(@#{varName})\}"
|
30
|
-
else
|
31
|
-
return "\#{OL(#{varName})\}"
|
32
|
-
)
|
33
|
-
|
34
|
-
# ---------------------------------------------------------------------------
|
35
|
-
|
36
|
-
export debug = (orgLabel, lObjects...) ->
|
37
|
-
|
38
|
-
assert isString(orgLabel), "1st arg #{OL(orgLabel)} should be a string"
|
39
|
-
|
40
|
-
[type, funcName] = getType(orgLabel, lObjects)
|
41
|
-
label = shouldLog(orgLabel, type, funcName, callStack)
|
42
|
-
if defined(label)
|
43
|
-
label = interp(label)
|
44
|
-
|
45
|
-
switch type
|
46
|
-
|
47
|
-
when 'enter'
|
48
|
-
if defined(label)
|
49
|
-
doTheLogging type, label, lObjects
|
50
|
-
callStack.enter funcName, lObjects, defined(label)
|
51
|
-
|
52
|
-
debug2 "enter debug()", orgLabel, lObjects
|
53
|
-
debug2 "type = #{OL(type)}, funcName = #{OL(funcName)}"
|
54
|
-
debug2 "return from debug()"
|
55
|
-
|
56
|
-
when 'return'
|
57
|
-
debug2 "enter debug()", orgLabel, lObjects
|
58
|
-
debug2 "type = #{OL(type)}, funcName = #{OL(funcName)}"
|
59
|
-
debug2 "return from debug()"
|
60
|
-
|
61
|
-
if defined(label)
|
62
|
-
doTheLogging type, label, lObjects
|
63
|
-
callStack.returnFrom funcName
|
64
|
-
|
65
|
-
when 'string'
|
66
|
-
debug2 "enter debug()", orgLabel, lObjects
|
67
|
-
debug2 "type = #{OL(type)}, funcName = #{OL(funcName)}"
|
68
|
-
|
69
|
-
if defined(label)
|
70
|
-
doTheLogging type, label, lObjects
|
71
|
-
debug2 "return from debug()"
|
72
|
-
|
73
|
-
return true # allow use in boolean expressions
|
74
|
-
|
75
|
-
# ---------------------------------------------------------------------------
|
76
|
-
|
77
|
-
export debug2 = (orgLabel, lObjects...) ->
|
78
|
-
|
79
|
-
[type, funcName] = getType(orgLabel, lObjects)
|
80
|
-
label = shouldLog(orgLabel, type, funcName, callStack)
|
81
|
-
|
82
|
-
switch type
|
83
|
-
when 'enter'
|
84
|
-
if defined(label)
|
85
|
-
doTheLogging 'enter', label, lObjects
|
86
|
-
callStack.enter funcName, lObjects, defined(label)
|
87
|
-
|
88
|
-
when 'return'
|
89
|
-
if defined(label)
|
90
|
-
doTheLogging 'return', label, lObjects
|
91
|
-
callStack.returnFrom funcName
|
92
|
-
|
93
|
-
when 'string'
|
94
|
-
if defined(label)
|
95
|
-
doTheLogging 'string', label, lObjects
|
96
|
-
|
97
|
-
return true # allow use in boolean expressions
|
98
|
-
|
99
|
-
# ---------------------------------------------------------------------------
|
100
|
-
|
101
|
-
export doTheLogging = (type, label, lObjects) ->
|
102
|
-
|
103
|
-
assert isString(label), "non-string label #{OL(label)}"
|
104
|
-
level = callStack.getLevel()
|
105
|
-
|
106
|
-
switch type
|
107
|
-
|
108
|
-
when 'enter'
|
109
|
-
log label, prefix(level)
|
110
|
-
pre = prefix(level+1, 'dotLastVbar')
|
111
|
-
itemPre = prefix(level+2, 'dotLast2Vbars')
|
112
|
-
for obj,i in lObjects
|
113
|
-
logItem "arg[#{i}]", obj, pre, itemPre
|
114
|
-
|
115
|
-
when 'return'
|
116
|
-
log label, prefix(level, 'withArrow')
|
117
|
-
pre = prefix(level, 'noLastVbar')
|
118
|
-
itemPre = prefix(level+1, 'noLast2Vbars')
|
119
|
-
for obj,i in lObjects
|
120
|
-
logItem "ret[#{i}]", obj, pre, itemPre
|
121
|
-
|
122
|
-
when 'string'
|
123
|
-
pre = prefix(level)
|
124
|
-
itemPre = prefix(level+1, 'noLastVbar')
|
125
|
-
if (lObjects.length==0)
|
126
|
-
log label, pre
|
127
|
-
else if (lObjects.length==1) && shortEnough(label, lObjects[0])
|
128
|
-
logItem label, lObjects[0], pre
|
129
|
-
else
|
130
|
-
if (label.indexOf(':') != label.length - 1)
|
131
|
-
label += ':'
|
132
|
-
log label, pre
|
133
|
-
for obj in lObjects
|
134
|
-
logBareItem obj, itemPre
|
135
|
-
return
|
136
|
-
|
137
|
-
# ---------------------------------------------------------------------------
|
138
|
-
|
139
|
-
export stdShouldLog = (label, type, funcName, stack) ->
|
140
|
-
# --- if type is 'enter', then funcName won't be on the stack yet
|
141
|
-
# returns the (possibly modified) label to log
|
142
|
-
|
143
|
-
assert isString(label), "label #{OL(label)} not a string"
|
144
|
-
assert isString(type), "type #{OL(type)} not a string"
|
145
|
-
assert stack instanceof CallStack, "not a call stack object"
|
146
|
-
if (type == 'enter') || (type == 'return')
|
147
|
-
assert isString(funcName), "func name #{OL(funcName)} not a string"
|
148
|
-
else
|
149
|
-
assert funcName == undef, "func name #{OL(funcName)} not undef"
|
150
|
-
|
151
|
-
if funcMatch(funcName || stack.curFunc())
|
152
|
-
return label
|
153
|
-
|
154
|
-
if (type == 'enter') && ! isMyFunc(funcName)
|
155
|
-
# --- As a special case, if we enter a function where we will not
|
156
|
-
# be logging, but we were logging in the calling function,
|
157
|
-
# we'll log out the call itself
|
158
|
-
|
159
|
-
if funcMatch(stack.curFunc())
|
160
|
-
result = label.replace('enter', 'call')
|
161
|
-
return result
|
162
|
-
return undef
|
163
|
-
|
164
|
-
# ---------------------------------------------------------------------------
|
165
|
-
|
166
|
-
export isMyFunc = (funcName) ->
|
167
|
-
|
168
|
-
return funcName in words('debug debug2 doTheLogging
|
169
|
-
stdShouldLog setDebugging getFuncList funcMatch
|
170
|
-
getType dumpCallStack')
|
171
|
-
|
172
|
-
# ---------------------------------------------------------------------------
|
173
|
-
|
174
|
-
export trueShouldLog = (label, type, funcName, stack) ->
|
175
|
-
|
176
|
-
if isMyFunc(funcName || stack.curFunc())
|
177
|
-
return undef
|
178
|
-
else
|
179
|
-
return label
|
180
|
-
|
181
|
-
# ---------------------------------------------------------------------------
|
182
|
-
|
183
|
-
export setDebugging = (option) ->
|
184
|
-
|
185
|
-
callStack.reset()
|
186
|
-
if isBoolean(option)
|
187
|
-
if option
|
188
|
-
shouldLog = trueShouldLog
|
189
|
-
else
|
190
|
-
shouldLog = () -> return undef
|
191
|
-
else if isString(option)
|
192
|
-
lFuncList = getFuncList(option)
|
193
|
-
shouldLog = stdShouldLog
|
194
|
-
else if isFunction(option)
|
195
|
-
shouldLog = option
|
196
|
-
else
|
197
|
-
croak "bad parameter #{OL(option)}"
|
198
|
-
return
|
199
|
-
|
200
|
-
# ---------------------------------------------------------------------------
|
201
|
-
# --- export only to allow unit tests
|
202
|
-
|
203
|
-
export getFuncList = (str) ->
|
204
|
-
|
205
|
-
strFuncList = str # store original string for debugging
|
206
|
-
lFuncList = []
|
207
|
-
for word in words(str)
|
208
|
-
if lMatches = word.match(///^
|
209
|
-
([A-Za-z_][A-Za-z0-9_]*)
|
210
|
-
(?:
|
211
|
-
\.
|
212
|
-
([A-Za-z_][A-Za-z0-9_]*)
|
213
|
-
)?
|
214
|
-
(\+)?
|
215
|
-
$///)
|
216
|
-
[_, ident1, ident2, plus] = lMatches
|
217
|
-
if ident2
|
218
|
-
lFuncList.push {
|
219
|
-
name: ident2
|
220
|
-
object: ident1
|
221
|
-
plus: (plus == '+')
|
222
|
-
}
|
223
|
-
else
|
224
|
-
lFuncList.push {
|
225
|
-
name: ident1
|
226
|
-
plus: (plus == '+')
|
227
|
-
}
|
228
|
-
else
|
229
|
-
croak "Bad word in func list: #{OL(word)}"
|
230
|
-
return lFuncList
|
231
|
-
|
232
|
-
# ---------------------------------------------------------------------------
|
233
|
-
# --- export only to allow unit tests
|
234
|
-
|
235
|
-
export funcMatch = (funcName) ->
|
236
|
-
|
237
|
-
assert isArray(lFuncList), "not an array #{OL(lFuncList)}"
|
238
|
-
for h in lFuncList
|
239
|
-
{name, object, plus} = h
|
240
|
-
if (name == funcName)
|
241
|
-
return true
|
242
|
-
if plus && callStack.isActive(name)
|
243
|
-
return true
|
244
|
-
return false
|
245
|
-
|
246
|
-
# ---------------------------------------------------------------------------
|
247
|
-
# --- type is one of: 'enter', 'return', 'string'
|
248
|
-
|
249
|
-
export getType = (str, lObjects) ->
|
250
|
-
|
251
|
-
if lMatches = str.match(///^
|
252
|
-
\s*
|
253
|
-
( enter | (?: return .+ from ) )
|
254
|
-
\s+
|
255
|
-
([A-Za-z_][A-Za-z0-9_]*)
|
256
|
-
(?:
|
257
|
-
\.
|
258
|
-
([A-Za-z_][A-Za-z0-9_]*)
|
259
|
-
)?
|
260
|
-
///)
|
261
|
-
[_, type, ident1, ident2] = lMatches
|
262
|
-
|
263
|
-
if ident2
|
264
|
-
funcName = ident2
|
265
|
-
else
|
266
|
-
funcName = ident1
|
267
|
-
|
268
|
-
if (type == 'enter')
|
269
|
-
return ['enter', funcName]
|
270
|
-
else
|
271
|
-
return ['return', funcName]
|
272
|
-
else
|
273
|
-
return ['string', undef]
|
274
|
-
|
275
|
-
# ---------------------------------------------------------------------------
|
276
|
-
|
277
|
-
reMethod = ///^
|
278
|
-
([A-Za-z_][A-Za-z0-9_]*)
|
279
|
-
\.
|
280
|
-
([A-Za-z_][A-Za-z0-9_]*)
|
281
|
-
$///
|
282
|
-
|
283
|
-
# ---------------------------------------------------------------------------
|
284
|
-
|
285
|
-
export dumpDebugGlobals = () ->
|
286
|
-
|
287
|
-
LOG '='.repeat(40)
|
288
|
-
LOG callStack.dump()
|
289
|
-
if shouldLog == stdShouldLog
|
290
|
-
LOG "using stdShouldLog"
|
291
|
-
else if shouldLog == trueShouldLog
|
292
|
-
LOG "using trueShouldLog"
|
293
|
-
else
|
294
|
-
LOG "using custom shouldLog"
|
295
|
-
LOG "lFuncList:"
|
296
|
-
for funcName in lFuncList
|
297
|
-
LOG " #{OL(funcName)}"
|
298
|
-
LOG '='.repeat(40)
|
299
|
-
|
300
|
-
# ---------------------------------------------------------------------------
|
package/src/debug.js
DELETED
@@ -1,329 +0,0 @@
|
|
1
|
-
// Generated by CoffeeScript 2.7.0
|
2
|
-
// debug.coffee
|
3
|
-
var lFuncList, reMethod, strFuncList,
|
4
|
-
indexOf = [].indexOf;
|
5
|
-
|
6
|
-
import {
|
7
|
-
LOG,
|
8
|
-
assert,
|
9
|
-
croak
|
10
|
-
} from '@jdeighan/exceptions';
|
11
|
-
|
12
|
-
import {
|
13
|
-
undef,
|
14
|
-
defined,
|
15
|
-
notdefined,
|
16
|
-
isString,
|
17
|
-
isFunction,
|
18
|
-
isBoolean,
|
19
|
-
isArray,
|
20
|
-
OL,
|
21
|
-
words,
|
22
|
-
pass
|
23
|
-
} from '@jdeighan/coffee-utils';
|
24
|
-
|
25
|
-
import {
|
26
|
-
CallStack
|
27
|
-
} from '@jdeighan/coffee-utils/stack';
|
28
|
-
|
29
|
-
import {
|
30
|
-
prefix
|
31
|
-
} from '@jdeighan/coffee-utils/arrow';
|
32
|
-
|
33
|
-
import {
|
34
|
-
log,
|
35
|
-
logItem,
|
36
|
-
logBareItem,
|
37
|
-
shortEnough
|
38
|
-
} from '@jdeighan/coffee-utils/log';
|
39
|
-
|
40
|
-
// --- set in resetDebugging() and setDebugging()
|
41
|
-
export var callStack = new CallStack();
|
42
|
-
|
43
|
-
export var shouldLog = function() {
|
44
|
-
return undef;
|
45
|
-
};
|
46
|
-
|
47
|
-
lFuncList = []; // names of functions being debugged
|
48
|
-
|
49
|
-
strFuncList = undef; // original string
|
50
|
-
|
51
|
-
|
52
|
-
// ---------------------------------------------------------------------------
|
53
|
-
export var interp = function(label) {
|
54
|
-
return label.replace(/\$(\@)?([A-Za-z_][A-Za-z0-9_]*)/g, function(_, atSign, varName) {
|
55
|
-
if (atSign) {
|
56
|
-
return `\#{OL(@${varName})\}`;
|
57
|
-
} else {
|
58
|
-
return `\#{OL(${varName})\}`;
|
59
|
-
}
|
60
|
-
});
|
61
|
-
};
|
62
|
-
|
63
|
-
// ---------------------------------------------------------------------------
|
64
|
-
export var debug = function(orgLabel, ...lObjects) {
|
65
|
-
var funcName, label, type;
|
66
|
-
assert(isString(orgLabel), `1st arg ${OL(orgLabel)} should be a string`);
|
67
|
-
[type, funcName] = getType(orgLabel, lObjects);
|
68
|
-
label = shouldLog(orgLabel, type, funcName, callStack);
|
69
|
-
if (defined(label)) {
|
70
|
-
label = interp(label);
|
71
|
-
}
|
72
|
-
switch (type) {
|
73
|
-
case 'enter':
|
74
|
-
if (defined(label)) {
|
75
|
-
doTheLogging(type, label, lObjects);
|
76
|
-
}
|
77
|
-
callStack.enter(funcName, lObjects, defined(label));
|
78
|
-
debug2("enter debug()", orgLabel, lObjects);
|
79
|
-
debug2(`type = ${OL(type)}, funcName = ${OL(funcName)}`);
|
80
|
-
debug2("return from debug()");
|
81
|
-
break;
|
82
|
-
case 'return':
|
83
|
-
debug2("enter debug()", orgLabel, lObjects);
|
84
|
-
debug2(`type = ${OL(type)}, funcName = ${OL(funcName)}`);
|
85
|
-
debug2("return from debug()");
|
86
|
-
if (defined(label)) {
|
87
|
-
doTheLogging(type, label, lObjects);
|
88
|
-
}
|
89
|
-
callStack.returnFrom(funcName);
|
90
|
-
break;
|
91
|
-
case 'string':
|
92
|
-
debug2("enter debug()", orgLabel, lObjects);
|
93
|
-
debug2(`type = ${OL(type)}, funcName = ${OL(funcName)}`);
|
94
|
-
if (defined(label)) {
|
95
|
-
doTheLogging(type, label, lObjects);
|
96
|
-
}
|
97
|
-
debug2("return from debug()");
|
98
|
-
}
|
99
|
-
return true; // allow use in boolean expressions
|
100
|
-
};
|
101
|
-
|
102
|
-
|
103
|
-
// ---------------------------------------------------------------------------
|
104
|
-
export var debug2 = function(orgLabel, ...lObjects) {
|
105
|
-
var funcName, label, type;
|
106
|
-
[type, funcName] = getType(orgLabel, lObjects);
|
107
|
-
label = shouldLog(orgLabel, type, funcName, callStack);
|
108
|
-
switch (type) {
|
109
|
-
case 'enter':
|
110
|
-
if (defined(label)) {
|
111
|
-
doTheLogging('enter', label, lObjects);
|
112
|
-
}
|
113
|
-
callStack.enter(funcName, lObjects, defined(label));
|
114
|
-
break;
|
115
|
-
case 'return':
|
116
|
-
if (defined(label)) {
|
117
|
-
doTheLogging('return', label, lObjects);
|
118
|
-
}
|
119
|
-
callStack.returnFrom(funcName);
|
120
|
-
break;
|
121
|
-
case 'string':
|
122
|
-
if (defined(label)) {
|
123
|
-
doTheLogging('string', label, lObjects);
|
124
|
-
}
|
125
|
-
}
|
126
|
-
return true; // allow use in boolean expressions
|
127
|
-
};
|
128
|
-
|
129
|
-
|
130
|
-
// ---------------------------------------------------------------------------
|
131
|
-
export var doTheLogging = function(type, label, lObjects) {
|
132
|
-
var i, itemPre, j, k, l, len, len1, len2, level, obj, pre;
|
133
|
-
assert(isString(label), `non-string label ${OL(label)}`);
|
134
|
-
level = callStack.getLevel();
|
135
|
-
switch (type) {
|
136
|
-
case 'enter':
|
137
|
-
log(label, prefix(level));
|
138
|
-
pre = prefix(level + 1, 'dotLastVbar');
|
139
|
-
itemPre = prefix(level + 2, 'dotLast2Vbars');
|
140
|
-
for (i = j = 0, len = lObjects.length; j < len; i = ++j) {
|
141
|
-
obj = lObjects[i];
|
142
|
-
logItem(`arg[${i}]`, obj, pre, itemPre);
|
143
|
-
}
|
144
|
-
break;
|
145
|
-
case 'return':
|
146
|
-
log(label, prefix(level, 'withArrow'));
|
147
|
-
pre = prefix(level, 'noLastVbar');
|
148
|
-
itemPre = prefix(level + 1, 'noLast2Vbars');
|
149
|
-
for (i = k = 0, len1 = lObjects.length; k < len1; i = ++k) {
|
150
|
-
obj = lObjects[i];
|
151
|
-
logItem(`ret[${i}]`, obj, pre, itemPre);
|
152
|
-
}
|
153
|
-
break;
|
154
|
-
case 'string':
|
155
|
-
pre = prefix(level);
|
156
|
-
itemPre = prefix(level + 1, 'noLastVbar');
|
157
|
-
if (lObjects.length === 0) {
|
158
|
-
log(label, pre);
|
159
|
-
} else if ((lObjects.length === 1) && shortEnough(label, lObjects[0])) {
|
160
|
-
logItem(label, lObjects[0], pre);
|
161
|
-
} else {
|
162
|
-
if (label.indexOf(':') !== label.length - 1) {
|
163
|
-
label += ':';
|
164
|
-
}
|
165
|
-
log(label, pre);
|
166
|
-
for (l = 0, len2 = lObjects.length; l < len2; l++) {
|
167
|
-
obj = lObjects[l];
|
168
|
-
logBareItem(obj, itemPre);
|
169
|
-
}
|
170
|
-
}
|
171
|
-
}
|
172
|
-
};
|
173
|
-
|
174
|
-
// ---------------------------------------------------------------------------
|
175
|
-
export var stdShouldLog = function(label, type, funcName, stack) {
|
176
|
-
var result;
|
177
|
-
// --- if type is 'enter', then funcName won't be on the stack yet
|
178
|
-
// returns the (possibly modified) label to log
|
179
|
-
assert(isString(label), `label ${OL(label)} not a string`);
|
180
|
-
assert(isString(type), `type ${OL(type)} not a string`);
|
181
|
-
assert(stack instanceof CallStack, "not a call stack object");
|
182
|
-
if ((type === 'enter') || (type === 'return')) {
|
183
|
-
assert(isString(funcName), `func name ${OL(funcName)} not a string`);
|
184
|
-
} else {
|
185
|
-
assert(funcName === undef, `func name ${OL(funcName)} not undef`);
|
186
|
-
}
|
187
|
-
if (funcMatch(funcName || stack.curFunc())) {
|
188
|
-
return label;
|
189
|
-
}
|
190
|
-
if ((type === 'enter') && !isMyFunc(funcName)) {
|
191
|
-
// --- As a special case, if we enter a function where we will not
|
192
|
-
// be logging, but we were logging in the calling function,
|
193
|
-
// we'll log out the call itself
|
194
|
-
if (funcMatch(stack.curFunc())) {
|
195
|
-
result = label.replace('enter', 'call');
|
196
|
-
return result;
|
197
|
-
}
|
198
|
-
}
|
199
|
-
return undef;
|
200
|
-
};
|
201
|
-
|
202
|
-
// ---------------------------------------------------------------------------
|
203
|
-
export var isMyFunc = function(funcName) {
|
204
|
-
return indexOf.call(words('debug debug2 doTheLogging stdShouldLog setDebugging getFuncList funcMatch getType dumpCallStack'), funcName) >= 0;
|
205
|
-
};
|
206
|
-
|
207
|
-
// ---------------------------------------------------------------------------
|
208
|
-
export var trueShouldLog = function(label, type, funcName, stack) {
|
209
|
-
if (isMyFunc(funcName || stack.curFunc())) {
|
210
|
-
return undef;
|
211
|
-
} else {
|
212
|
-
return label;
|
213
|
-
}
|
214
|
-
};
|
215
|
-
|
216
|
-
// ---------------------------------------------------------------------------
|
217
|
-
export var setDebugging = function(option) {
|
218
|
-
callStack.reset();
|
219
|
-
if (isBoolean(option)) {
|
220
|
-
if (option) {
|
221
|
-
shouldLog = trueShouldLog;
|
222
|
-
} else {
|
223
|
-
shouldLog = function() {
|
224
|
-
return undef;
|
225
|
-
};
|
226
|
-
}
|
227
|
-
} else if (isString(option)) {
|
228
|
-
lFuncList = getFuncList(option);
|
229
|
-
shouldLog = stdShouldLog;
|
230
|
-
} else if (isFunction(option)) {
|
231
|
-
shouldLog = option;
|
232
|
-
} else {
|
233
|
-
croak(`bad parameter ${OL(option)}`);
|
234
|
-
}
|
235
|
-
};
|
236
|
-
|
237
|
-
// ---------------------------------------------------------------------------
|
238
|
-
// --- export only to allow unit tests
|
239
|
-
export var getFuncList = function(str) {
|
240
|
-
var _, ident1, ident2, j, lMatches, len, plus, ref, word;
|
241
|
-
strFuncList = str; // store original string for debugging
|
242
|
-
lFuncList = [];
|
243
|
-
ref = words(str);
|
244
|
-
for (j = 0, len = ref.length; j < len; j++) {
|
245
|
-
word = ref[j];
|
246
|
-
if (lMatches = word.match(/^([A-Za-z_][A-Za-z0-9_]*)(?:\.([A-Za-z_][A-Za-z0-9_]*))?(\+)?$/)) {
|
247
|
-
[_, ident1, ident2, plus] = lMatches;
|
248
|
-
if (ident2) {
|
249
|
-
lFuncList.push({
|
250
|
-
name: ident2,
|
251
|
-
object: ident1,
|
252
|
-
plus: plus === '+'
|
253
|
-
});
|
254
|
-
} else {
|
255
|
-
lFuncList.push({
|
256
|
-
name: ident1,
|
257
|
-
plus: plus === '+'
|
258
|
-
});
|
259
|
-
}
|
260
|
-
} else {
|
261
|
-
croak(`Bad word in func list: ${OL(word)}`);
|
262
|
-
}
|
263
|
-
}
|
264
|
-
return lFuncList;
|
265
|
-
};
|
266
|
-
|
267
|
-
// ---------------------------------------------------------------------------
|
268
|
-
// --- export only to allow unit tests
|
269
|
-
export var funcMatch = function(funcName) {
|
270
|
-
var h, j, len, name, object, plus;
|
271
|
-
assert(isArray(lFuncList), `not an array ${OL(lFuncList)}`);
|
272
|
-
for (j = 0, len = lFuncList.length; j < len; j++) {
|
273
|
-
h = lFuncList[j];
|
274
|
-
({name, object, plus} = h);
|
275
|
-
if (name === funcName) {
|
276
|
-
return true;
|
277
|
-
}
|
278
|
-
if (plus && callStack.isActive(name)) {
|
279
|
-
return true;
|
280
|
-
}
|
281
|
-
}
|
282
|
-
return false;
|
283
|
-
};
|
284
|
-
|
285
|
-
// ---------------------------------------------------------------------------
|
286
|
-
// --- type is one of: 'enter', 'return', 'string'
|
287
|
-
export var getType = function(str, lObjects) {
|
288
|
-
var _, funcName, ident1, ident2, lMatches, type;
|
289
|
-
if (lMatches = str.match(/^\s*(enter|(?:return.+from))\s+([A-Za-z_][A-Za-z0-9_]*)(?:\.([A-Za-z_][A-Za-z0-9_]*))?/)) {
|
290
|
-
[_, type, ident1, ident2] = lMatches;
|
291
|
-
if (ident2) {
|
292
|
-
funcName = ident2;
|
293
|
-
} else {
|
294
|
-
funcName = ident1;
|
295
|
-
}
|
296
|
-
if (type === 'enter') {
|
297
|
-
return ['enter', funcName];
|
298
|
-
} else {
|
299
|
-
return ['return', funcName];
|
300
|
-
}
|
301
|
-
} else {
|
302
|
-
return ['string', undef];
|
303
|
-
}
|
304
|
-
};
|
305
|
-
|
306
|
-
// ---------------------------------------------------------------------------
|
307
|
-
reMethod = /^([A-Za-z_][A-Za-z0-9_]*)\.([A-Za-z_][A-Za-z0-9_]*)$/;
|
308
|
-
|
309
|
-
// ---------------------------------------------------------------------------
|
310
|
-
export var dumpDebugGlobals = function() {
|
311
|
-
var funcName, j, len;
|
312
|
-
LOG('='.repeat(40));
|
313
|
-
LOG(callStack.dump());
|
314
|
-
if (shouldLog === stdShouldLog) {
|
315
|
-
LOG("using stdShouldLog");
|
316
|
-
} else if (shouldLog === trueShouldLog) {
|
317
|
-
LOG("using trueShouldLog");
|
318
|
-
} else {
|
319
|
-
LOG("using custom shouldLog");
|
320
|
-
}
|
321
|
-
LOG("lFuncList:");
|
322
|
-
for (j = 0, len = lFuncList.length; j < len; j++) {
|
323
|
-
funcName = lFuncList[j];
|
324
|
-
LOG(` ${OL(funcName)}`);
|
325
|
-
}
|
326
|
-
return LOG('='.repeat(40));
|
327
|
-
};
|
328
|
-
|
329
|
-
// ---------------------------------------------------------------------------
|