perf(ivy): add self-closing elementContainer instruction (#31444)
Adds a new `elementContainer` instruction that can be used to avoid two instruction (`elementContainerStart` and `elementContainerEnd`) for `ng-container` that has text-only content. This is particularly useful when we have `ng-container` inside i18n sections. This PR resolves FW-1105. PR Close #31444
This commit is contained in:
@ -66,6 +66,8 @@ export class Identifiers {
|
||||
static elementContainerEnd:
|
||||
o.ExternalReference = {name: 'ɵɵelementContainerEnd', moduleName: CORE};
|
||||
|
||||
static elementContainer: o.ExternalReference = {name: 'ɵɵelementContainer', moduleName: CORE};
|
||||
|
||||
static styling: o.ExternalReference = {name: 'ɵɵstyling', moduleName: CORE};
|
||||
|
||||
static styleMap: o.ExternalReference = {name: 'ɵɵstyleMap', moduleName: CORE};
|
||||
|
@ -613,23 +613,21 @@ export class TemplateDefinitionBuilder implements t.Visitor<void>, LocalResolver
|
||||
this.i18n.appendElement(element.i18n !, elementIndex);
|
||||
}
|
||||
|
||||
const hasChildren = () => {
|
||||
if (!isI18nRootElement && this.i18n) {
|
||||
// we do not append text node instructions and ICUs inside i18n section,
|
||||
// so we exclude them while calculating whether current element has children
|
||||
return !hasTextChildrenOnly(element.children);
|
||||
}
|
||||
return element.children.length > 0;
|
||||
};
|
||||
// Note that we do not append text node instructions and ICUs inside i18n section,
|
||||
// so we exclude them while calculating whether current element has children
|
||||
const hasChildren = (!isI18nRootElement && this.i18n) ? !hasTextChildrenOnly(element.children) :
|
||||
element.children.length > 0;
|
||||
|
||||
const createSelfClosingInstruction = !stylingBuilder.hasBindings && !isNgContainer &&
|
||||
element.outputs.length === 0 && i18nAttrs.length === 0 && !hasChildren();
|
||||
const createSelfClosingInstruction = !stylingBuilder.hasBindings &&
|
||||
element.outputs.length === 0 && i18nAttrs.length === 0 && !hasChildren;
|
||||
|
||||
const createSelfClosingI18nInstruction = !createSelfClosingInstruction &&
|
||||
!stylingBuilder.hasBindings && hasTextChildrenOnly(element.children);
|
||||
|
||||
if (createSelfClosingInstruction) {
|
||||
this.creationInstruction(element.sourceSpan, R3.element, trimTrailingNulls(parameters));
|
||||
this.creationInstruction(
|
||||
element.sourceSpan, isNgContainer ? R3.elementContainer : R3.element,
|
||||
trimTrailingNulls(parameters));
|
||||
} else {
|
||||
this.creationInstruction(
|
||||
element.sourceSpan, isNgContainer ? R3.elementContainerStart : R3.elementStart,
|
||||
|
Reference in New Issue
Block a user