str.replace(classifyRE, c => c.toUpperCase()).replace(/[-_]/g, '')
export function formatComponentName(
+ instance: ComponentInternalInstance | null,
Component: Component,
isRoot = false
): string {
name = match[1]
}
}
+
+ if (!name && instance && instance.parent) {
+ // try to infer the name based on local resolution
+ const registry = instance.parent.components
+ for (const key in registry) {
+ if (registry[key] === Component) {
+ name = key
+ break
+ }
+ }
+ }
+
return name ? classify(name) : isRoot ? `App` : `Anonymous`
}
res = self
}
}
- if (__DEV__) {
- if (res) {
- // in dev, infer anonymous component's name based on registered name
- if (
- type === COMPONENTS &&
- isObject(res) &&
- !(res as ComponentOptions).name
- ) {
- ;(res as ComponentOptions).name = name
- }
- } else if (warnMissing) {
- warn(`Failed to resolve ${type.slice(0, -1)}: ${name}`)
- }
+ if (__DEV__ && warnMissing && !res) {
+ warn(`Failed to resolve ${type.slice(0, -1)}: ${name}`)
}
return res
} else if (__DEV__) {
const startTag = `vue-${type}-${instance.uid}`
const endTag = startTag + `:end`
perf.mark(endTag)
- perf.measure(
- `<${formatComponentName(instance.type)}> ${type}`,
- startTag,
- endTag
- )
+ perf.measure(`<${formatComponentName(instance)}> ${type}`, startTag, endTag)
perf.clearMarks(startTag)
perf.clearMarks(endTag)
}
msg + args.join(''),
instance && instance.proxy,
trace
- .map(({ vnode }) => `at <${formatComponentName(vnode.type)}>`)
+ .map(
+ ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`
+ )
.join('\n'),
trace
]
const postfix =
recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``
const isRoot = vnode.component ? vnode.component.parent == null : false
- const open = ` at <${formatComponentName(vnode.type, isRoot)}`
+ const open = ` at <${formatComponentName(
+ vnode.component,
+ vnode.type,
+ isRoot
+ )}`
const close = `>` + postfix
return vnode.props
? [open, ...formatProps(vnode.props), close]