While I was migrating my formatter implementation to the latest version, I found that one test broke related to functions.
Functions like const a = () => {}; a are correctly returning Type::Function, but functions like function a() {}; a are now returning a Type::Constructor.
Unsure if this is expected or a bug.
fn _format(
&self,
out: &mut impl Write,
value: Value<'_>,
args: FormatArgs,
depth: usize,
) -> Result<()> {
match value.type_of() {
Type::String => {
write!(
out,
"{}",
value
.into_string()
.ok_or(Error::new_from_js("value", "string"))?
.to_string()?
)
.map_err(|_| Error::Unknown)?;
}
Type::Int => {
write!(
out,
"{}",
value.as_int().ok_or(Error::new_from_js("value", "int"))?
)
.map_err(|_| Error::Unknown)?;
}
Type::Bool => {
write!(
out,
"{}",
value.as_bool().ok_or(Error::new_from_js("value", "bool"))?
)
.map_err(|_| Error::Unknown)?;
}
Type::Float => {
write!(
out,
"{}",
value
.as_float()
.ok_or(Error::new_from_js("value", "float"))?
)
.map_err(|_| Error::Unknown)?;
}
Type::BigInt => {
write!(
out,
"{}n",
value
.into_big_int()
.ok_or(Error::new_from_js("value", "bigint"))?
.to_i64()?
)
.map_err(|_| Error::Unknown)?;
}
Type::Array => {
let array = value
.into_array()
.ok_or(Error::new_from_js("value", "array"))?;
if depth > self.max_depth {
write!(out, "[Array]").map_err(|_| Error::Unknown)?;
} else if args.is_key() {
for (i, element) in array.iter().enumerate() {
if i > 0 {
write!(out, ",").map_err(|_| Error::Unknown)?;
}
self._format(out, element?, FormatArgs::default().with_key(), depth + 1)?;
}
} else {
write!(out, "[ ").map_err(|_| Error::Unknown)?;
for (i, element) in array.iter().enumerate() {
if i > 0 {
write!(out, ", ").map_err(|_| Error::Unknown)?;
}
self._format(out, element?, FormatArgs::default(), depth + 1)?;
}
write!(out, " ]").map_err(|_| Error::Unknown)?;
}
}
Type::Object => {
if depth > self.max_depth {
write!(out, "[Object]").map_err(|_| Error::Unknown)?;
} else if args.is_key() {
write!(out, "[object Object]").map_err(|_| Error::Unknown)?;
} else {
let object = value
.into_object()
.ok_or(Error::new_from_js("value", "object"))?;
write!(out, "{{ ").map_err(|_| Error::Unknown)?;
for prop in object.props() {
let (key, val) = prop?;
self._format(out, key, FormatArgs::default().with_key(), depth + 1)?;
write!(out, ": ").map_err(|_| Error::Unknown)?;
self._format(out, val, FormatArgs::default(), depth + 1)?;
}
write!(out, " }}").map_err(|_| Error::Unknown)?;
}
}
Type::Symbol => {
let symbol = value
.as_symbol()
.ok_or(Error::new_from_js("value", "symbol"))?;
let mut description = symbol.description()?.to_string()?;
if description == "undefined" {
description = String::default();
}
write!(out, "Symbol({})", description).map_err(|_| Error::Unknown)?;
}
Type::Function => {
let function = value
.as_function()
.ok_or(Error::new_from_js("value", "function"))?
.as_object()
.ok_or(Error::new_from_js("function", "object"))?;
let name: Option<String> = function.get("name").ok().and_then(|n| {
if n == "[object Object]" {
None
} else {
Some(n)
}
});
match name {
Some(name) => {
write!(out, "[Function: {}]", name).map_err(|_| Error::Unknown)?
}
None => write!(out, "[Function (anonymous)]").map_err(|_| Error::Unknown)?,
}
}
Type::Null => {
write!(out, "null",).map_err(|_| Error::Unknown)?;
}
Type::Undefined => {
write!(out, "undefined",).map_err(|_| Error::Unknown)?;
}
_ => {}
};
Ok(())
}
While I was migrating my formatter implementation to the latest version, I found that one test broke related to functions. Functions like
const a = () => {}; a
are correctly returningType::Function
, but functions likefunction a() {}; a
are now returning aType::Constructor
. Unsure if this is expected or a bug.