UNPKG

@angular/core

Version:

Angular - the core framework

1,241 lines 105 kB
/** * @fileoverview added by tsickle * Generated from: packages/core/src/render3/instructions/lview_debug.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @license * Copyright Google Inc. All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ import { assertDefined } from '../../util/assert'; import { createNamedArrayType } from '../../util/named_array_type'; import { initNgDevMode } from '../../util/ng_dev_mode'; import { CONTAINER_HEADER_OFFSET, HAS_TRANSPLANTED_VIEWS, MOVED_VIEWS, NATIVE } from '../interfaces/container'; import { COMMENT_MARKER, ELEMENT_MARKER } from '../interfaces/i18n'; import { getTStylingRangeNext, getTStylingRangeNextDuplicate, getTStylingRangePrev, getTStylingRangePrevDuplicate } from '../interfaces/styling'; import { CHILD_HEAD, CHILD_TAIL, CLEANUP, CONTEXT, DECLARATION_VIEW, FLAGS, HEADER_OFFSET, HOST, INJECTOR, NEXT, PARENT, QUERIES, RENDERER, RENDERER_FACTORY, SANITIZER, T_HOST, TVIEW } from '../interfaces/view'; import { attachDebugObject } from '../util/debug_utils'; import { getTNode, unwrapRNode } from '../util/view_utils'; /** @type {?} */ const NG_DEV_MODE = ((typeof ngDevMode === 'undefined' || !!ngDevMode) && initNgDevMode()); /* * This file contains conditionally attached classes which provide human readable (debug) level * information for `LView`, `LContainer` and other internal data structures. These data structures * are stored internally as array which makes it very difficult during debugging to reason about the * current state of the system. * * Patching the array with extra property does change the array's hidden class' but it does not * change the cost of access, therefore this patching should not have significant if any impact in * `ngDevMode` mode. (see: https://jsperf.com/array-vs-monkey-patch-array) * * So instead of seeing: * ``` * Array(30) [Object, 659, null, …] * ``` * * You get to see: * ``` * LViewDebug { * views: [...], * flags: {attached: true, ...} * nodes: [ * {html: '<div id="123">', ..., nodes: [ * {html: '<span>', ..., nodes: null} * ]} * ] * } * ``` */ /** @type {?} */ let LVIEW_COMPONENT_CACHE; /** @type {?} */ let LVIEW_EMBEDDED_CACHE; /** @type {?} */ let LVIEW_ROOT; /** * @record */ function TViewDebug() { } if (false) { /** @type {?} */ TViewDebug.prototype.type; } /** * This function clones a blueprint and creates LView. * * Simple slice will keep the same type, and we need it to be LView * @param {?} tView * @return {?} */ export function cloneToLViewFromTViewBlueprint(tView) { /** @type {?} */ const debugTView = (/** @type {?} */ (tView)); /** @type {?} */ const lView = getLViewToClone(debugTView.type, tView.template && tView.template.name); return (/** @type {?} */ (lView.concat(tView.blueprint))); } /** * @param {?} type * @param {?} name * @return {?} */ function getLViewToClone(type, name) { switch (type) { case 0 /* Root */: if (LVIEW_ROOT === undefined) LVIEW_ROOT = new (createNamedArrayType('LRootView'))(); return LVIEW_ROOT; case 1 /* Component */: if (LVIEW_COMPONENT_CACHE === undefined) LVIEW_COMPONENT_CACHE = new Map(); /** @type {?} */ let componentArray = LVIEW_COMPONENT_CACHE.get(name); if (componentArray === undefined) { componentArray = new (createNamedArrayType('LComponentView' + nameSuffix(name)))(); LVIEW_COMPONENT_CACHE.set(name, componentArray); } return componentArray; case 2 /* Embedded */: if (LVIEW_EMBEDDED_CACHE === undefined) LVIEW_EMBEDDED_CACHE = new Map(); /** @type {?} */ let embeddedArray = LVIEW_EMBEDDED_CACHE.get(name); if (embeddedArray === undefined) { embeddedArray = new (createNamedArrayType('LEmbeddedView' + nameSuffix(name)))(); LVIEW_EMBEDDED_CACHE.set(name, embeddedArray); } return embeddedArray; } throw new Error('unreachable code'); } /** * @param {?} text * @return {?} */ function nameSuffix(text) { if (text == null) return ''; /** @type {?} */ const index = text.lastIndexOf('_Template'); return '_' + (index === -1 ? text : text.substr(0, index)); } /** * This class is a debug version of Object literal so that we can have constructor name show up * in * debug tools in ngDevMode. * @type {?} */ export const TViewConstructor = class TView { /** * @param {?} type * @param {?} id * @param {?} blueprint * @param {?} template * @param {?} queries * @param {?} viewQuery * @param {?} node * @param {?} data * @param {?} bindingStartIndex * @param {?} expandoStartIndex * @param {?} expandoInstructions * @param {?} firstCreatePass * @param {?} firstUpdatePass * @param {?} staticViewQueries * @param {?} staticContentQueries * @param {?} preOrderHooks * @param {?} preOrderCheckHooks * @param {?} contentHooks * @param {?} contentCheckHooks * @param {?} viewHooks * @param {?} viewCheckHooks * @param {?} destroyHooks * @param {?} cleanup * @param {?} contentQueries * @param {?} components * @param {?} directiveRegistry * @param {?} pipeRegistry * @param {?} firstChild * @param {?} schemas * @param {?} consts * @param {?} incompleteFirstPass */ constructor(type, // id, // blueprint, // template, // queries, // viewQuery, // node, // data, // bindingStartIndex, // expandoStartIndex, // expandoInstructions, // firstCreatePass, // firstUpdatePass, // staticViewQueries, // staticContentQueries, // preOrderHooks, // preOrderCheckHooks, // contentHooks, // contentCheckHooks, // viewHooks, // viewCheckHooks, // destroyHooks, // cleanup, // contentQueries, // components, // directiveRegistry, // pipeRegistry, // firstChild, // schemas, // consts, // incompleteFirstPass // ) { this.type = type; this.id = id; this.blueprint = blueprint; this.template = template; this.queries = queries; this.viewQuery = viewQuery; this.node = node; this.data = data; this.bindingStartIndex = bindingStartIndex; this.expandoStartIndex = expandoStartIndex; this.expandoInstructions = expandoInstructions; this.firstCreatePass = firstCreatePass; this.firstUpdatePass = firstUpdatePass; this.staticViewQueries = staticViewQueries; this.staticContentQueries = staticContentQueries; this.preOrderHooks = preOrderHooks; this.preOrderCheckHooks = preOrderCheckHooks; this.contentHooks = contentHooks; this.contentCheckHooks = contentCheckHooks; this.viewHooks = viewHooks; this.viewCheckHooks = viewCheckHooks; this.destroyHooks = destroyHooks; this.cleanup = cleanup; this.contentQueries = contentQueries; this.components = components; this.directiveRegistry = directiveRegistry; this.pipeRegistry = pipeRegistry; this.firstChild = firstChild; this.schemas = schemas; this.consts = consts; this.incompleteFirstPass = incompleteFirstPass; } /** * @return {?} */ get template_() { /** @type {?} */ const buf = []; processTNodeChildren(this.firstChild, buf); return buf.join(''); } }; class TNode { /** * @param {?} tView_ * @param {?} type * @param {?} index * @param {?} injectorIndex * @param {?} directiveStart * @param {?} directiveEnd * @param {?} directiveStylingLast * @param {?} propertyBindings * @param {?} flags * @param {?} providerIndexes * @param {?} tagName * @param {?} attrs * @param {?} mergedAttrs * @param {?} localNames * @param {?} initialInputs * @param {?} inputs * @param {?} outputs * @param {?} tViews * @param {?} next * @param {?} projectionNext * @param {?} child * @param {?} parent * @param {?} projection * @param {?} styles * @param {?} stylesWithoutHost * @param {?} residualStyles * @param {?} classes * @param {?} classesWithoutHost * @param {?} residualClasses * @param {?} classBindings * @param {?} styleBindings */ constructor(tView_, // type, // index, // injectorIndex, // directiveStart, // directiveEnd, // directiveStylingLast, // propertyBindings, // flags, // providerIndexes, // tagName, // attrs, // mergedAttrs, // localNames, // initialInputs, // inputs, // outputs, // tViews, // next, // projectionNext, // child, // parent, // projection, // styles, // stylesWithoutHost, // residualStyles, // classes, // classesWithoutHost, // residualClasses, // classBindings, // styleBindings) { this.tView_ = tView_; this.type = type; this.index = index; this.injectorIndex = injectorIndex; this.directiveStart = directiveStart; this.directiveEnd = directiveEnd; this.directiveStylingLast = directiveStylingLast; this.propertyBindings = propertyBindings; this.flags = flags; this.providerIndexes = providerIndexes; this.tagName = tagName; this.attrs = attrs; this.mergedAttrs = mergedAttrs; this.localNames = localNames; this.initialInputs = initialInputs; this.inputs = inputs; this.outputs = outputs; this.tViews = tViews; this.next = next; this.projectionNext = projectionNext; this.child = child; this.parent = parent; this.projection = projection; this.styles = styles; this.stylesWithoutHost = stylesWithoutHost; this.residualStyles = residualStyles; this.classes = classes; this.classesWithoutHost = classesWithoutHost; this.residualClasses = residualClasses; this.classBindings = classBindings; this.styleBindings = styleBindings; } /** * @return {?} */ get type_() { switch (this.type) { case 0 /* Container */: return 'TNodeType.Container'; case 3 /* Element */: return 'TNodeType.Element'; case 4 /* ElementContainer */: return 'TNodeType.ElementContainer'; case 5 /* IcuContainer */: return 'TNodeType.IcuContainer'; case 1 /* Projection */: return 'TNodeType.Projection'; case 2 /* View */: return 'TNodeType.View'; default: return 'TNodeType.???'; } } /** * @return {?} */ get flags_() { /** @type {?} */ const flags = []; if (this.flags & 16 /* hasClassInput */) flags.push('TNodeFlags.hasClassInput'); if (this.flags & 8 /* hasContentQuery */) flags.push('TNodeFlags.hasContentQuery'); if (this.flags & 32 /* hasStyleInput */) flags.push('TNodeFlags.hasStyleInput'); if (this.flags & 128 /* hasHostBindings */) flags.push('TNodeFlags.hasHostBindings'); if (this.flags & 2 /* isComponentHost */) flags.push('TNodeFlags.isComponentHost'); if (this.flags & 1 /* isDirectiveHost */) flags.push('TNodeFlags.isDirectiveHost'); if (this.flags & 64 /* isDetached */) flags.push('TNodeFlags.isDetached'); if (this.flags & 4 /* isProjected */) flags.push('TNodeFlags.isProjected'); return flags.join('|'); } /** * @return {?} */ get template_() { /** @type {?} */ const buf = []; buf.push('<', this.tagName || this.type_); if (this.attrs) { for (let i = 0; i < this.attrs.length;) { /** @type {?} */ const attrName = this.attrs[i++]; if (typeof attrName == 'number') { break; } /** @type {?} */ const attrValue = this.attrs[i++]; buf.push(' ', (/** @type {?} */ (attrName)), '="', (/** @type {?} */ (attrValue)), '"'); } } buf.push('>'); processTNodeChildren(this.child, buf); buf.push('</', this.tagName || this.type_, '>'); return buf.join(''); } /** * @return {?} */ get styleBindings_() { return toDebugStyleBinding(this, false); } /** * @return {?} */ get classBindings_() { return toDebugStyleBinding(this, true); } } if (false) { /** @type {?} */ TNode.prototype.tView_; /** @type {?} */ TNode.prototype.type; /** @type {?} */ TNode.prototype.index; /** @type {?} */ TNode.prototype.injectorIndex; /** @type {?} */ TNode.prototype.directiveStart; /** @type {?} */ TNode.prototype.directiveEnd; /** @type {?} */ TNode.prototype.directiveStylingLast; /** @type {?} */ TNode.prototype.propertyBindings; /** @type {?} */ TNode.prototype.flags; /** @type {?} */ TNode.prototype.providerIndexes; /** @type {?} */ TNode.prototype.tagName; /** @type {?} */ TNode.prototype.attrs; /** @type {?} */ TNode.prototype.mergedAttrs; /** @type {?} */ TNode.prototype.localNames; /** @type {?} */ TNode.prototype.initialInputs; /** @type {?} */ TNode.prototype.inputs; /** @type {?} */ TNode.prototype.outputs; /** @type {?} */ TNode.prototype.tViews; /** @type {?} */ TNode.prototype.next; /** @type {?} */ TNode.prototype.projectionNext; /** @type {?} */ TNode.prototype.child; /** @type {?} */ TNode.prototype.parent; /** @type {?} */ TNode.prototype.projection; /** @type {?} */ TNode.prototype.styles; /** @type {?} */ TNode.prototype.stylesWithoutHost; /** @type {?} */ TNode.prototype.residualStyles; /** @type {?} */ TNode.prototype.classes; /** @type {?} */ TNode.prototype.classesWithoutHost; /** @type {?} */ TNode.prototype.residualClasses; /** @type {?} */ TNode.prototype.classBindings; /** @type {?} */ TNode.prototype.styleBindings; } /** @type {?} */ export const TNodeDebug = TNode; /** * @record */ export function DebugStyleBindings() { } /** * @record */ export function DebugStyleBinding() { } if (false) { /** @type {?} */ DebugStyleBinding.prototype.key; /** @type {?} */ DebugStyleBinding.prototype.index; /** @type {?} */ DebugStyleBinding.prototype.isTemplate; /** @type {?} */ DebugStyleBinding.prototype.prevDuplicate; /** @type {?} */ DebugStyleBinding.prototype.nextDuplicate; /** @type {?} */ DebugStyleBinding.prototype.prevIndex; /** @type {?} */ DebugStyleBinding.prototype.nextIndex; } /** * @param {?} tNode * @param {?} isClassBased * @return {?} */ function toDebugStyleBinding(tNode, isClassBased) { /** @type {?} */ const tData = tNode.tView_.data; /** @type {?} */ const bindings = (/** @type {?} */ ([])); /** @type {?} */ const range = isClassBased ? tNode.classBindings : tNode.styleBindings; /** @type {?} */ const prev = getTStylingRangePrev(range); /** @type {?} */ const next = getTStylingRangeNext(range); /** @type {?} */ let isTemplate = next !== 0; /** @type {?} */ let cursor = isTemplate ? next : prev; while (cursor !== 0) { /** @type {?} */ const itemKey = (/** @type {?} */ (tData[cursor])); /** @type {?} */ const itemRange = (/** @type {?} */ (tData[cursor + 1])); bindings.unshift({ key: itemKey, index: cursor, isTemplate: isTemplate, prevDuplicate: getTStylingRangePrevDuplicate(itemRange), nextDuplicate: getTStylingRangeNextDuplicate(itemRange), nextIndex: getTStylingRangeNext(itemRange), prevIndex: getTStylingRangePrev(itemRange), }); if (cursor === prev) isTemplate = false; cursor = getTStylingRangePrev(itemRange); } bindings.push((isClassBased ? tNode.residualClasses : tNode.residualStyles) || null); return bindings; } /** * @param {?} tNode * @param {?} buf * @return {?} */ function processTNodeChildren(tNode, buf) { while (tNode) { buf.push(((/** @type {?} */ ((/** @type {?} */ (tNode))))).template_); tNode = tNode.next; } } /** @type {?} */ const TViewData = NG_DEV_MODE && createNamedArrayType('TViewData') || (/** @type {?} */ ((/** @type {?} */ (null)))); /** @type {?} */ let TVIEWDATA_EMPTY; // can't initialize here or it will not be tree shaken, because // `LView` constructor could have side-effects. /** * This function clones a blueprint and creates TData. * * Simple slice will keep the same type, and we need it to be TData * @param {?} list * @return {?} */ export function cloneToTViewData(list) { if (TVIEWDATA_EMPTY === undefined) TVIEWDATA_EMPTY = new TViewData(); return (/** @type {?} */ (TVIEWDATA_EMPTY.concat(list))); } /** @type {?} */ export const LViewBlueprint = NG_DEV_MODE && createNamedArrayType('LViewBlueprint') || (/** @type {?} */ ((/** @type {?} */ (null)))); /** @type {?} */ export const MatchesArray = NG_DEV_MODE && createNamedArrayType('MatchesArray') || (/** @type {?} */ ((/** @type {?} */ (null)))); /** @type {?} */ export const TViewComponents = NG_DEV_MODE && createNamedArrayType('TViewComponents') || (/** @type {?} */ ((/** @type {?} */ (null)))); /** @type {?} */ export const TNodeLocalNames = NG_DEV_MODE && createNamedArrayType('TNodeLocalNames') || (/** @type {?} */ ((/** @type {?} */ (null)))); /** @type {?} */ export const TNodeInitialInputs = NG_DEV_MODE && createNamedArrayType('TNodeInitialInputs') || (/** @type {?} */ ((/** @type {?} */ (null)))); /** @type {?} */ export const TNodeInitialData = NG_DEV_MODE && createNamedArrayType('TNodeInitialData') || (/** @type {?} */ ((/** @type {?} */ (null)))); /** @type {?} */ export const LCleanup = NG_DEV_MODE && createNamedArrayType('LCleanup') || (/** @type {?} */ ((/** @type {?} */ (null)))); /** @type {?} */ export const TCleanup = NG_DEV_MODE && createNamedArrayType('TCleanup') || (/** @type {?} */ ((/** @type {?} */ (null)))); /** * @param {?} lView * @return {?} */ export function attachLViewDebug(lView) { attachDebugObject(lView, new LViewDebug(lView)); } /** * @param {?} lContainer * @return {?} */ export function attachLContainerDebug(lContainer) { attachDebugObject(lContainer, new LContainerDebug(lContainer)); } /** * @param {?} obj * @return {?} */ export function toDebug(obj) { if (obj) { /** @type {?} */ const debug = ((/** @type {?} */ (obj))).debug; assertDefined(debug, 'Object does not have a debug representation.'); return debug; } else { return obj; } } /** * Use this method to unwrap a native element in `LView` and convert it into HTML for easier * reading. * * @param {?} value possibly wrapped native DOM node. * @param {?=} includeChildren If `true` then the serialized HTML form will include child elements * (same * as `outerHTML`). If `false` then the serialized HTML form will only contain the element * itself * (will not serialize child elements). * @return {?} */ function toHtml(value, includeChildren = false) { /** @type {?} */ const node = (/** @type {?} */ (unwrapRNode(value))); if (node) { /** @type {?} */ const isTextNode = node.nodeType === Node.TEXT_NODE; /** @type {?} */ const outerHTML = (isTextNode ? node.textContent : node.outerHTML) || ''; if (includeChildren || isTextNode) { return outerHTML; } else { /** @type {?} */ const innerHTML = '>' + node.innerHTML + '<'; return (outerHTML.split(innerHTML)[0]) + '>'; } } else { return null; } } export class LViewDebug { /** * @param {?} _raw_lView */ constructor(_raw_lView) { this._raw_lView = _raw_lView; } /** * Flags associated with the `LView` unpacked into a more readable state. * @return {?} */ get flags() { /** @type {?} */ const flags = this._raw_lView[FLAGS]; return { __raw__flags__: flags, initPhaseState: flags & 3 /* InitPhaseStateMask */, creationMode: !!(flags & 4 /* CreationMode */), firstViewPass: !!(flags & 8 /* FirstLViewPass */), checkAlways: !!(flags & 16 /* CheckAlways */), dirty: !!(flags & 64 /* Dirty */), attached: !!(flags & 128 /* Attached */), destroyed: !!(flags & 256 /* Destroyed */), isRoot: !!(flags & 512 /* IsRoot */), indexWithinInitPhase: flags >> 11 /* IndexWithinInitPhaseShift */, }; } /** * @return {?} */ get parent() { return toDebug(this._raw_lView[PARENT]); } /** * @return {?} */ get host() { return toHtml(this._raw_lView[HOST], true); } /** * @return {?} */ get html() { return (this.nodes || []).map((/** * @param {?} node * @return {?} */ node => toHtml(node.native, true))).join(''); } /** * @return {?} */ get context() { return this._raw_lView[CONTEXT]; } /** * The tree of nodes associated with the current `LView`. The nodes have been normalized into * a * tree structure with relevant details pulled out for readability. * @return {?} */ get nodes() { /** @type {?} */ const lView = this._raw_lView; /** @type {?} */ const tNode = lView[TVIEW].firstChild; return toDebugNodes(tNode, lView); } /** * @return {?} */ get tView() { return this._raw_lView[TVIEW]; } /** * @return {?} */ get cleanup() { return this._raw_lView[CLEANUP]; } /** * @return {?} */ get injector() { return this._raw_lView[INJECTOR]; } /** * @return {?} */ get rendererFactory() { return this._raw_lView[RENDERER_FACTORY]; } /** * @return {?} */ get renderer() { return this._raw_lView[RENDERER]; } /** * @return {?} */ get sanitizer() { return this._raw_lView[SANITIZER]; } /** * @return {?} */ get childHead() { return toDebug(this._raw_lView[CHILD_HEAD]); } /** * @return {?} */ get next() { return toDebug(this._raw_lView[NEXT]); } /** * @return {?} */ get childTail() { return toDebug(this._raw_lView[CHILD_TAIL]); } /** * @return {?} */ get declarationView() { return toDebug(this._raw_lView[DECLARATION_VIEW]); } /** * @return {?} */ get queries() { return this._raw_lView[QUERIES]; } /** * @return {?} */ get tHost() { return this._raw_lView[T_HOST]; } /** * Normalized view of child views (and containers) attached at this location. * @return {?} */ get childViews() { /** @type {?} */ const childViews = []; /** @type {?} */ let child = this.childHead; while (child) { childViews.push(child); child = child.next; } return childViews; } } if (false) { /** * @type {?} * @private */ LViewDebug.prototype._raw_lView; } /** * @record */ export function DebugNode() { } if (false) { /** @type {?} */ DebugNode.prototype.html; /** @type {?} */ DebugNode.prototype.native; /** @type {?} */ DebugNode.prototype.nodes; /** @type {?} */ DebugNode.prototype.component; } /** * Turns a flat list of nodes into a tree by walking the associated `TNode` tree. * * @param {?} tNode * @param {?} lView * @return {?} */ export function toDebugNodes(tNode, lView) { if (tNode) { /** @type {?} */ const debugNodes = []; /** @type {?} */ let tNodeCursor = tNode; while (tNodeCursor) { debugNodes.push(buildDebugNode(tNodeCursor, lView, tNodeCursor.index)); tNodeCursor = tNodeCursor.next; } return debugNodes; } else { return null; } } /** * @param {?} tNode * @param {?} lView * @param {?} nodeIndex * @return {?} */ export function buildDebugNode(tNode, lView, nodeIndex) { /** @type {?} */ const rawValue = lView[nodeIndex]; /** @type {?} */ const native = unwrapRNode(rawValue); /** @type {?} */ const componentLViewDebug = toDebug(readLViewValue(rawValue)); return { html: toHtml(native), native: (/** @type {?} */ (native)), nodes: toDebugNodes(tNode.child, lView), component: componentLViewDebug, }; } export class LContainerDebug { /** * @param {?} _raw_lContainer */ constructor(_raw_lContainer) { this._raw_lContainer = _raw_lContainer; } /** * @return {?} */ get hasTransplantedViews() { return this._raw_lContainer[HAS_TRANSPLANTED_VIEWS]; } /** * @return {?} */ get views() { return this._raw_lContainer.slice(CONTAINER_HEADER_OFFSET) .map((/** @type {?} */ (toDebug))); } /** * @return {?} */ get parent() { return toDebug(this._raw_lContainer[PARENT]); } /** * @return {?} */ get movedViews() { return this._raw_lContainer[MOVED_VIEWS]; } /** * @return {?} */ get host() { return this._raw_lContainer[HOST]; } /** * @return {?} */ get native() { return this._raw_lContainer[NATIVE]; } /** * @return {?} */ get next() { return toDebug(this._raw_lContainer[NEXT]); } } if (false) { /** * @type {?} * @private */ LContainerDebug.prototype._raw_lContainer; } /** * Return an `LView` value if found. * * @param {?} value `LView` if any * @return {?} */ export function readLViewValue(value) { while (Array.isArray(value)) { // This check is not quite right, as it does not take into account `StylingContext` // This is why it is in debug, not in util.ts if (value.length >= HEADER_OFFSET - 1) return (/** @type {?} */ (value)); value = value[HOST]; } return null; } export class I18NDebugItem { /** * @param {?} __raw_opCode * @param {?} _lView * @param {?} nodeIndex * @param {?} type */ constructor(__raw_opCode, _lView, nodeIndex, type) { this.__raw_opCode = __raw_opCode; this._lView = _lView; this.nodeIndex = nodeIndex; this.type = type; } /** * @return {?} */ get tNode() { return getTNode(this._lView[TVIEW], this.nodeIndex); } } if (false) { /** @type {?} */ I18NDebugItem.prototype.__raw_opCode; /** * @type {?} * @private */ I18NDebugItem.prototype._lView; /** @type {?} */ I18NDebugItem.prototype.nodeIndex; /** @type {?} */ I18NDebugItem.prototype.type; /* Skipping unhandled member: [key: string]: any;*/ } /** * Turns a list of "Create" & "Update" OpCodes into a human-readable list of operations for * debugging purposes. * @param {?} mutateOpCodes mutation opCodes to read * @param {?} updateOpCodes update opCodes to read * @param {?} icus list of ICU expressions * @param {?} lView The view the opCodes are acting on * @return {?} */ export function attachI18nOpCodesDebug(mutateOpCodes, updateOpCodes, icus, lView) { attachDebugObject(mutateOpCodes, new I18nMutateOpCodesDebug(mutateOpCodes, lView)); attachDebugObject(updateOpCodes, new I18nUpdateOpCodesDebug(updateOpCodes, icus, lView)); if (icus) { icus.forEach((/** * @param {?} icu * @return {?} */ icu => { icu.create.forEach((/** * @param {?} icuCase * @return {?} */ icuCase => { attachDebugObject(icuCase, new I18nMutateOpCodesDebug(icuCase, lView)); })); icu.update.forEach((/** * @param {?} icuCase * @return {?} */ icuCase => { attachDebugObject(icuCase, new I18nUpdateOpCodesDebug(icuCase, icus, lView)); })); })); } } export class I18nMutateOpCodesDebug { /** * @param {?} __raw_opCodes * @param {?} __lView */ constructor(__raw_opCodes, __lView) { this.__raw_opCodes = __raw_opCodes; this.__lView = __lView; } /** * A list of operation information about how the OpCodes will act on the view. * @return {?} */ get operations() { const { __lView, __raw_opCodes } = this; /** @type {?} */ const results = []; for (let i = 0; i < __raw_opCodes.length; i++) { /** @type {?} */ const opCode = __raw_opCodes[i]; /** @type {?} */ let result; if (typeof opCode === 'string') { result = { __raw_opCode: opCode, type: 'Create Text Node', nodeIndex: __raw_opCodes[++i], text: opCode, }; } if (typeof opCode === 'number') { switch (opCode & 7 /* MASK_OPCODE */) { case 1 /* AppendChild */: /** @type {?} */ const destinationNodeIndex = opCode >>> 17 /* SHIFT_PARENT */; result = new I18NDebugItem(opCode, __lView, destinationNodeIndex, 'AppendChild'); break; case 0 /* Select */: /** @type {?} */ const nodeIndex = opCode >>> 3 /* SHIFT_REF */; result = new I18NDebugItem(opCode, __lView, nodeIndex, 'Select'); break; case 5 /* ElementEnd */: /** @type {?} */ let elementIndex = opCode >>> 3 /* SHIFT_REF */; result = new I18NDebugItem(opCode, __lView, elementIndex, 'ElementEnd'); break; case 4 /* Attr */: elementIndex = opCode >>> 3 /* SHIFT_REF */; result = new I18NDebugItem(opCode, __lView, elementIndex, 'Attr'); result['attrName'] = __raw_opCodes[++i]; result['attrValue'] = __raw_opCodes[++i]; break; } } if (!result) { switch (opCode) { case COMMENT_MARKER: result = { __raw_opCode: opCode, type: 'COMMENT_MARKER', commentValue: __raw_opCodes[++i], nodeIndex: __raw_opCodes[++i], }; break; case ELEMENT_MARKER: result = { __raw_opCode: opCode, type: 'ELEMENT_MARKER', }; break; } } if (!result) { result = { __raw_opCode: opCode, type: 'Unknown Op Code', code: opCode, }; } results.push(result); } return results; } } if (false) { /** * @type {?} * @private */ I18nMutateOpCodesDebug.prototype.__raw_opCodes; /** * @type {?} * @private */ I18nMutateOpCodesDebug.prototype.__lView; } export class I18nUpdateOpCodesDebug { /** * @param {?} __raw_opCodes * @param {?} icus * @param {?} __lView */ constructor(__raw_opCodes, icus, __lView) { this.__raw_opCodes = __raw_opCodes; this.icus = icus; this.__lView = __lView; } /** * A list of operation information about how the OpCodes will act on the view. * @return {?} */ get operations() { const { __lView, __raw_opCodes, icus } = this; /** @type {?} */ const results = []; for (let i = 0; i < __raw_opCodes.length; i++) { // bit code to check if we should apply the next update /** @type {?} */ const checkBit = (/** @type {?} */ (__raw_opCodes[i])); // Number of opCodes to skip until next set of update codes /** @type {?} */ const skipCodes = (/** @type {?} */ (__raw_opCodes[++i])); /** @type {?} */ let value = ''; for (let j = i + 1; j <= (i + skipCodes); j++) { /** @type {?} */ const opCode = __raw_opCodes[j]; if (typeof opCode === 'string') { value += opCode; } else if (typeof opCode == 'number') { if (opCode < 0) { // It's a binding index whose value is negative // We cannot know the value of the binding so we only show the index value += `�${-opCode - 1}�`; } else { /** @type {?} */ const nodeIndex = opCode >>> 2 /* SHIFT_REF */; /** @type {?} */ let tIcuIndex; /** @type {?} */ let tIcu; switch (opCode & 3 /* MASK_OPCODE */) { case 1 /* Attr */: /** @type {?} */ const attrName = (/** @type {?} */ (__raw_opCodes[++j])); /** @type {?} */ const sanitizeFn = __raw_opCodes[++j]; results.push({ __raw_opCode: opCode, checkBit, type: 'Attr', attrValue: value, attrName, sanitizeFn, }); break; case 0 /* Text */: results.push({ __raw_opCode: opCode, checkBit, type: 'Text', nodeIndex, text: value, }); break; case 2 /* IcuSwitch */: tIcuIndex = (/** @type {?} */ (__raw_opCodes[++j])); tIcu = (/** @type {?} */ (icus))[tIcuIndex]; /** @type {?} */ let result = new I18NDebugItem(opCode, __lView, nodeIndex, 'IcuSwitch'); result['tIcuIndex'] = tIcuIndex; result['checkBit'] = checkBit; result['mainBinding'] = value; result['tIcu'] = tIcu; results.push(result); break; case 3 /* IcuUpdate */: tIcuIndex = (/** @type {?} */ (__raw_opCodes[++j])); tIcu = (/** @type {?} */ (icus))[tIcuIndex]; result = new I18NDebugItem(opCode, __lView, nodeIndex, 'IcuUpdate'); result['tIcuIndex'] = tIcuIndex; result['checkBit'] = checkBit; result['tIcu'] = tIcu; results.push(result); break; } } } } i += skipCodes; } return results; } } if (false) { /** * @type {?} * @private */ I18nUpdateOpCodesDebug.prototype.__raw_opCodes; /** * @type {?} * @private */ I18nUpdateOpCodesDebug.prototype.icus; /** * @type {?} * @private */ I18nUpdateOpCodesDebug.prototype.__lView; } /** * @record */ export function I18nOpCodesDebug() { } if (false) { /** @type {?} */ I18nOpCodesDebug.prototype.operations; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHZpZXdfZGVidWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2luc3RydWN0aW9ucy9sdmlld19kZWJ1Zy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFZQSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDaEQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDakUsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxzQkFBc0IsRUFBYyxXQUFXLEVBQUUsTUFBTSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFekgsT0FBTyxFQUFDLGNBQWMsRUFBRSxjQUFjLEVBQWlGLE1BQU0sb0JBQW9CLENBQUM7QUFLbEosT0FBTyxFQUFDLG9CQUFvQixFQUFFLDZCQUE2QixFQUFFLG9CQUFvQixFQUFFLDZCQUE2QixFQUE2QixNQUFNLHVCQUF1QixDQUFDO0FBQzNLLE9BQU8sRUFBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQXdDLEtBQUssRUFBRSxhQUFhLEVBQVksSUFBSSxFQUFFLFFBQVEsRUFBcUIsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQVMsS0FBSyxFQUFvQyxNQUFNLG9CQUFvQixDQUFDO0FBQzlULE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBQyxRQUFRLEVBQUUsV0FBVyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7O01BRW5ELFdBQVcsR0FBRyxDQUFDLENBQUMsT0FBTyxTQUFTLEtBQUssV0FBVyxJQUFJLENBQUMsQ0FBQyxTQUFTLENB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