1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-24 15:19:26 -05:00

fix(console): constrol inspect() indent with option (#14867)

This commit updates the Deno.inspect() logic to use the
indentLevel option to control indentation instead of passing
around separate indent/level parameters internally.

Refs: https://github.com/denoland/deno/issues/8099
Refs: https://github.com/denoland/deno/issues/14171
This commit is contained in:
cjihrig 2022-06-12 15:20:16 -04:00 committed by Colin Ihrig
parent 5bde4c7eca
commit eadf943e59
2 changed files with 65 additions and 85 deletions

View file

@ -887,11 +887,9 @@ Deno.test(function consoleTestWithCustomInspector() {
[customInspect](
inspect: unknown,
options: Deno.InspectOptions,
depth: number,
): string {
assertEquals(typeof inspect, "function");
assertEquals(typeof options, "object");
assertEquals(depth, 0);
return "b";
}
}

View file

@ -329,13 +329,13 @@
return inspectOptions.colors ? fn : (s) => s;
}
function inspectFunction(value, level, inspectOptions) {
function inspectFunction(value, inspectOptions) {
const cyan = maybeColor(colors.cyan, inspectOptions);
if (
ReflectHas(value, customInspect) &&
typeof value[customInspect] === "function"
) {
return String(value[customInspect](inspect, inspectOptions, level));
return String(value[customInspect](inspect, inspectOptions));
}
// Might be Function/AsyncFunction/GeneratorFunction/AsyncGeneratorFunction
let cstrName = ObjectGetPrototypeOf(value)?.constructor?.name;
@ -357,7 +357,6 @@
) {
const [propString, refIndex] = inspectRawObject(
value,
level,
inspectOptions,
);
refStr = refIndex;
@ -380,12 +379,11 @@
function inspectIterable(
value,
level,
options,
inspectOptions,
) {
const cyan = maybeColor(colors.cyan, inspectOptions);
if (level >= inspectOptions.depth) {
if (inspectOptions.indentLevel >= inspectOptions.depth) {
return cyan(`[${options.typeName}]`);
}
@ -435,15 +433,16 @@
throw err;
}
if (entriesLength < inspectOptions.iterableLimit) {
inspectOptions.indentLevel++;
ArrayPrototypePush(
entries,
options.entryHandler(
el,
level + 1,
inspectOptions,
FunctionPrototypeBind(next, iter),
),
);
inspectOptions.indentLevel--;
}
entriesLength++;
}
@ -459,6 +458,7 @@
const iPrefix = `${options.displayName ? options.displayName + " " : ""}`;
const level = inspectOptions.indentLevel;
const initIndentation = `\n${
StringPrototypeRepeat(DEFAULT_INDENT, level + 1)
}`;
@ -630,12 +630,11 @@
function _inspectValue(
value,
level,
inspectOptions,
) {
const proxyDetails = core.getProxyDetails(value);
if (proxyDetails != null && inspectOptions.showProxy) {
return inspectProxy(proxyDetails, level, inspectOptions);
return inspectProxy(proxyDetails, inspectOptions);
}
const green = maybeColor(colors.green, inspectOptions);
@ -665,7 +664,7 @@
return handleCircular(value, cyan);
}
return inspectFunction(value, level, inspectOptions);
return inspectFunction(value, inspectOptions);
case "object": // null is bold
if (value === null) {
return bold("null");
@ -675,7 +674,7 @@
return handleCircular(value, cyan);
}
return inspectObject(value, level, inspectOptions, proxyDetails);
return inspectObject(value, inspectOptions, proxyDetails);
default:
// Not implemented is red
return red("[Not Implemented]");
@ -684,13 +683,12 @@
function inspectValue(
value,
level,
inspectOptions,
) {
ArrayPrototypePush(CTX_STACK, value);
let x;
try {
x = _inspectValue(value, level, inspectOptions);
x = _inspectValue(value, inspectOptions);
} finally {
ArrayPrototypePop(CTX_STACK);
}
@ -790,7 +788,6 @@
// Print strings when they are inside of arrays or objects with quotes
function inspectValueWithQuotes(
value,
level,
inspectOptions,
) {
const abbreviateSize =
@ -806,13 +803,12 @@
return green(quoteString(trunc)); // Quoted strings are green
}
default:
return inspectValue(value, level, inspectOptions);
return inspectValue(value, inspectOptions);
}
}
function inspectArray(
value,
level,
inspectOptions,
) {
const gray = maybeColor(colors.gray, inspectOptions);
@ -820,7 +816,7 @@
typeName: "Array",
displayName: "",
delims: ["[", "]"],
entryHandler: (entry, level, inspectOptions, next) => {
entryHandler: (entry, inspectOptions, next) => {
const [index, val] = entry;
let i = index;
if (!ObjectPrototypeHasOwnProperty(value, i)) {
@ -833,19 +829,18 @@
const ending = emptyItems > 1 ? "s" : "";
return gray(`<${emptyItems} empty item${ending}>`);
} else {
return inspectValueWithQuotes(val, level, inspectOptions);
return inspectValueWithQuotes(val, inspectOptions);
}
},
group: inspectOptions.compact,
sort: false,
};
return inspectIterable(value, level, options, inspectOptions);
return inspectIterable(value, options, inspectOptions);
}
function inspectTypedArray(
typedArrayName,
value,
level,
inspectOptions,
) {
const valueLength = value.length;
@ -853,60 +848,62 @@
typeName: typedArrayName,
displayName: `${typedArrayName}(${valueLength})`,
delims: ["[", "]"],
entryHandler: (entry, level, inspectOptions) => {
entryHandler: (entry, inspectOptions) => {
const val = entry[1];
return inspectValueWithQuotes(val, level + 1, inspectOptions);
inspectOptions.indentLevel++;
const inspectedValue = inspectValueWithQuotes(val, inspectOptions);
inspectOptions.indentLevel--;
return inspectedValue;
},
group: inspectOptions.compact,
sort: false,
};
return inspectIterable(value, level, options, inspectOptions);
return inspectIterable(value, options, inspectOptions);
}
function inspectSet(
value,
level,
inspectOptions,
) {
const options = {
typeName: "Set",
displayName: "Set",
delims: ["{", "}"],
entryHandler: (entry, level, inspectOptions) => {
entryHandler: (entry, inspectOptions) => {
const val = entry[1];
return inspectValueWithQuotes(val, level + 1, inspectOptions);
inspectOptions.indentLevel++;
const inspectedValue = inspectValueWithQuotes(val, inspectOptions);
inspectOptions.indentLevel--;
return inspectedValue;
},
group: false,
sort: inspectOptions.sorted,
};
return inspectIterable(value, level, options, inspectOptions);
return inspectIterable(value, options, inspectOptions);
}
function inspectMap(
value,
level,
inspectOptions,
) {
const options = {
typeName: "Map",
displayName: "Map",
delims: ["{", "}"],
entryHandler: (entry, level, inspectOptions) => {
entryHandler: (entry, inspectOptions) => {
const [key, val] = entry;
return `${
inspectValueWithQuotes(
key,
level + 1,
inspectOptions,
)
} => ${inspectValueWithQuotes(val, level + 1, inspectOptions)}`;
inspectOptions.indentLevel++;
const inspectedValue = `${
inspectValueWithQuotes(key, inspectOptions)
} => ${inspectValueWithQuotes(val, inspectOptions)}`;
inspectOptions.indentLevel--;
return inspectedValue;
},
group: false,
sort: inspectOptions.sorted,
};
return inspectIterable(
value,
level,
options,
inspectOptions,
);
@ -1046,7 +1043,6 @@
function inspectPromise(
value,
level,
inspectOptions,
) {
const cyan = maybeColor(colors.cyan, inspectOptions);
@ -1062,17 +1058,13 @@
? ""
: `${red("<rejected>")} `;
const str = `${prefix}${
inspectValueWithQuotes(
result,
level + 1,
inspectOptions,
)
}`;
inspectOptions.indentLevel++;
const str = `${prefix}${inspectValueWithQuotes(result, inspectOptions)}`;
inspectOptions.indentLevel--;
if (str.length + PROMISE_STRING_BASE_LENGTH > LINE_BREAKING_LENGTH) {
return `Promise {\n${
StringPrototypeRepeat(DEFAULT_INDENT, level + 1)
StringPrototypeRepeat(DEFAULT_INDENT, inspectOptions.indentLevel + 1)
}${str}\n}`;
}
@ -1081,20 +1073,18 @@
function inspectProxy(
targetAndHandler,
level,
inspectOptions,
) {
return `Proxy ${inspectArray(targetAndHandler, level, inspectOptions)}`;
return `Proxy ${inspectArray(targetAndHandler, inspectOptions)}`;
}
function inspectRawObject(
value,
level,
inspectOptions,
) {
const cyan = maybeColor(colors.cyan, inspectOptions);
if (level >= inspectOptions.depth) {
if (inspectOptions.indentLevel >= inspectOptions.depth) {
return [cyan("[Object]"), ""]; // wrappers are in cyan
}
@ -1130,6 +1120,8 @@
const red = maybeColor(colors.red, inspectOptions);
inspectOptions.indentLevel++;
for (const key of stringKeys) {
if (inspectOptions.getters) {
let propertyValue;
@ -1140,11 +1132,7 @@
error = error_;
}
const inspectedValue = error == null
? inspectValueWithQuotes(
propertyValue,
level + 1,
inspectOptions,
)
? inspectValueWithQuotes(propertyValue, inspectOptions)
: red(`[Thrown ${error.name}: ${error.message}]`);
ArrayPrototypePush(
entries,
@ -1163,7 +1151,7 @@
ArrayPrototypePush(
entries,
`${maybeQuoteString(key)}: ${
inspectValueWithQuotes(value[key], level + 1, inspectOptions)
inspectValueWithQuotes(value[key], inspectOptions)
}`,
);
}
@ -1187,11 +1175,7 @@
error = error_;
}
const inspectedValue = error == null
? inspectValueWithQuotes(
propertyValue,
level + 1,
inspectOptions,
)
? inspectValueWithQuotes(propertyValue, inspectOptions)
: red(`Thrown ${error.name}: ${error.message}`);
ArrayPrototypePush(
entries,
@ -1210,22 +1194,30 @@
ArrayPrototypePush(
entries,
`[${maybeQuoteSymbol(key)}]: ${
inspectValueWithQuotes(value[key], level + 1, inspectOptions)
inspectValueWithQuotes(value[key], inspectOptions)
}`,
);
}
}
}
inspectOptions.indentLevel--;
// Making sure color codes are ignored when calculating the total length
const totalLength = entries.length + level +
const totalLength = entries.length + inspectOptions.indentLevel +
colors.stripColor(ArrayPrototypeJoin(entries, "")).length;
if (entries.length === 0) {
baseString = "{}";
} else if (totalLength > LINE_BREAKING_LENGTH || !inspectOptions.compact) {
const entryIndent = StringPrototypeRepeat(DEFAULT_INDENT, level + 1);
const closingIndent = StringPrototypeRepeat(DEFAULT_INDENT, level);
const entryIndent = StringPrototypeRepeat(
DEFAULT_INDENT,
inspectOptions.indentLevel + 1,
);
const closingIndent = StringPrototypeRepeat(
DEFAULT_INDENT,
inspectOptions.indentLevel,
);
baseString = `{\n${entryIndent}${
ArrayPrototypeJoin(entries, `,\n${entryIndent}`)
}${inspectOptions.trailingComma ? "," : ""}\n${closingIndent}}`;
@ -1250,7 +1242,6 @@
function inspectObject(
value,
level,
inspectOptions,
proxyDetails,
) {
@ -1258,7 +1249,7 @@
ReflectHas(value, customInspect) &&
typeof value[customInspect] === "function"
) {
return String(value[customInspect](inspect, inspectOptions, level));
return String(value[customInspect](inspect, inspectOptions));
}
// This non-unique symbol is used to support op_crates, ie.
// in extensions/web we don't want to depend on public
@ -1274,13 +1265,13 @@
// to the `Deno` namespace in web workers. Remove when the `Deno`
// namespace is always enabled.
return String(
value[privateCustomInspect](inspect, inspectOptions, level),
value[privateCustomInspect](inspect, inspectOptions),
);
}
if (ObjectPrototypeIsPrototypeOf(ErrorPrototype, value)) {
return inspectError(value, maybeColor(colors.cyan, inspectOptions));
} else if (ArrayIsArray(value)) {
return inspectArray(value, level, inspectOptions);
return inspectArray(value, inspectOptions);
} else if (ObjectPrototypeIsPrototypeOf(NumberPrototype, value)) {
return inspectNumberObject(value, inspectOptions);
} else if (ObjectPrototypeIsPrototypeOf(BigIntPrototype, value)) {
@ -1292,7 +1283,7 @@
} else if (ObjectPrototypeIsPrototypeOf(SymbolPrototype, value)) {
return inspectSymbolObject(value, inspectOptions);
} else if (ObjectPrototypeIsPrototypeOf(PromisePrototype, value)) {
return inspectPromise(value, level, inspectOptions);
return inspectPromise(value, inspectOptions);
} else if (ObjectPrototypeIsPrototypeOf(RegExpPrototype, value)) {
return inspectRegExp(value, inspectOptions);
} else if (ObjectPrototypeIsPrototypeOf(DatePrototype, value)) {
@ -1300,13 +1291,11 @@
} else if (ObjectPrototypeIsPrototypeOf(SetPrototype, value)) {
return inspectSet(
proxyDetails ? proxyDetails[0] : value,
level,
inspectOptions,
);
} else if (ObjectPrototypeIsPrototypeOf(MapPrototype, value)) {
return inspectMap(
proxyDetails ? proxyDetails[0] : value,
level,
inspectOptions,
);
} else if (ObjectPrototypeIsPrototypeOf(WeakSetPrototype, value)) {
@ -1317,12 +1306,11 @@
return inspectTypedArray(
ObjectGetPrototypeOf(value).constructor.name,
value,
level,
inspectOptions,
);
} else {
// Otherwise, default object formatting
let [insp, refIndex] = inspectRawObject(value, level, inspectOptions);
let [insp, refIndex] = inspectRawObject(value, inspectOptions);
insp = refIndex + insp;
return insp;
}
@ -1836,11 +1824,7 @@
}
} else if (ArrayPrototypeIncludes(["O", "o"], char)) {
// Format as an object.
formattedArg = inspectValue(
args[a++],
0,
rInspectOptions,
);
formattedArg = inspectValue(args[a++], rInspectOptions);
} else if (char == "c") {
const value = args[a++];
if (!noColor) {
@ -1881,7 +1865,7 @@
string += args[a];
} else {
// Use default maximum depth for null or undefined arguments.
string += inspectValue(args[a], 0, rInspectOptions);
string += inspectValue(args[a], rInspectOptions);
}
}
@ -2052,7 +2036,7 @@
}
const stringifyValue = (value) =>
inspectValueWithQuotes(value, 0, {
inspectValueWithQuotes(value, {
...DEFAULT_INSPECT_OPTIONS,
depth: 1,
});
@ -2219,11 +2203,9 @@
inspectOptions = {},
) {
circular = undefined;
return inspectValue(value, 0, {
return inspectValue(value, {
...DEFAULT_INSPECT_OPTIONS,
...inspectOptions,
// TODO(nayeemrmn): Indent level is not supported.
indentLevel: 0,
});
}