refactor(ivy): move hostVars/hostAttrs from instruction to DirectiveDef (#34683)

This change moves information from instructions to declarative position:
- `ɵɵallocHostVars(vars)` => `DirectiveDef.hostVars`
- `ɵɵelementHostAttrs(attrs)` => `DirectiveDef.hostAttrs`

When merging directives it is necessary to know about `hostVars` and `hostAttrs`. Before this change the information was stored in the `hostBindings` function. This was problematic, because in order to get to the information the `hostBindings` would have to be executed. In order for `hostBindings` to be executed the directives would have to be instantiated. This means that the directive instantiation would happen before we had knowledge about the `hostAttrs` and as a result the directive could observe in the constructor that not all of the `hostAttrs` have been applied. This further complicates the runtime as we have to apply `hostAttrs` in parts over many invocations.

`ɵɵallocHostVars` was unnecessarily complicated because it would have to update the `LView` (and Blueprint) while existing directives are already executing. By moving it out of `hostBindings` function we can access it statically and we can create correct `LView` (and Blueprint) in a single pass.

This change only changes how the instructions are generated, but does not change the runtime much. (We cheat by emulating the old behavior by calling `ɵɵallocHostVars` and `ɵɵelementHostAttrs`) Subsequent change will refactor the runtime to take advantage of the static information.

PR Close #34683
This commit is contained in:
Miško Hevery
2020-01-08 11:32:33 -08:00
parent 239c602f69
commit d566621fef
33 changed files with 751 additions and 185 deletions

View File

@ -314,6 +314,9 @@
{
"name": "getContainerRenderParent"
},
{
"name": "getCurrentDirectiveDef"
},
{
"name": "getDirectiveDef"
},
@ -404,6 +407,9 @@
{
"name": "getStylingMapArray"
},
{
"name": "getTNode"
},
{
"name": "hasActiveElementFlag"
},
@ -545,6 +551,12 @@
{
"name": "objectToClassName"
},
{
"name": "prefillHostVars"
},
{
"name": "queueHostBindingForCheck"
},
{
"name": "refreshChildComponents"
},
@ -695,6 +707,9 @@
{
"name": "writeStylingValueDirectly"
},
{
"name": "ɵɵallocHostVars"
},
{
"name": "ɵɵdefineComponent"
},
@ -710,6 +725,9 @@
{
"name": "ɵɵelementEnd"
},
{
"name": "ɵɵelementHostAttrs"
},
{
"name": "ɵɵelementStart"
},

View File

@ -104,6 +104,9 @@
{
"name": "RENDERER_FACTORY"
},
{
"name": "RendererStyleFlags3"
},
{
"name": "SANITIZER"
},
@ -137,12 +140,18 @@
{
"name": "_renderCompCount"
},
{
"name": "addItemToStylingMap"
},
{
"name": "addToViewTree"
},
{
"name": "allocLFrame"
},
{
"name": "allocStylingMapArray"
},
{
"name": "appendChild"
},
@ -161,6 +170,9 @@
{
"name": "callHooks"
},
{
"name": "concatString"
},
{
"name": "createLFrame"
},
@ -227,6 +239,9 @@
{
"name": "extractPipeDef"
},
{
"name": "forceStylesAsString"
},
{
"name": "generateExpandoInstructionBlock"
},
@ -248,6 +263,9 @@
{
"name": "getContainerRenderParent"
},
{
"name": "getCurrentDirectiveDef"
},
{
"name": "getDirectiveDef"
},
@ -260,6 +278,9 @@
{
"name": "getFirstNativeNode"
},
{
"name": "getInitialStylingValue"
},
{
"name": "getInjectorIndex"
},
@ -275,6 +296,12 @@
{
"name": "getLViewParent"
},
{
"name": "getMapProp"
},
{
"name": "getMapValue"
},
{
"name": "getNativeAnchorNode"
},
@ -317,12 +344,21 @@
{
"name": "getSelectedIndex"
},
{
"name": "getStylingMapArray"
},
{
"name": "getTNode"
},
{
"name": "hasActiveElementFlag"
},
{
"name": "hasParentInjector"
},
{
"name": "hyphenate"
},
{
"name": "includeViewProviders"
},
@ -350,6 +386,9 @@
{
"name": "invokeHostBindingsInCreationMode"
},
{
"name": "isAnimationProp"
},
{
"name": "isComponentDef"
},
@ -365,6 +404,12 @@
{
"name": "isProceduralRenderer"
},
{
"name": "isStylingContext"
},
{
"name": "isStylingValueDefined"
},
{
"name": "leaveDI"
},
@ -398,6 +443,15 @@
{
"name": "noSideEffects"
},
{
"name": "objectToClassName"
},
{
"name": "prefillHostVars"
},
{
"name": "queueHostBindingForCheck"
},
{
"name": "refreshChildComponents"
},
@ -416,6 +470,9 @@
{
"name": "refreshView"
},
{
"name": "registerInitialStylingOnTNode"
},
{
"name": "registerPreOrderHooks"
},
@ -428,9 +485,15 @@
{
"name": "renderComponent"
},
{
"name": "renderInitialStyling"
},
{
"name": "renderStringify"
},
{
"name": "renderStylingMap"
},
{
"name": "renderView"
},
@ -449,6 +512,12 @@
{
"name": "setBindingRoot"
},
{
"name": "setClass"
},
{
"name": "setClassName"
},
{
"name": "setCurrentDirectiveDef"
},
@ -464,27 +533,54 @@
{
"name": "setInjectImplementation"
},
{
"name": "setMapValue"
},
{
"name": "setPreviousOrParentTNode"
},
{
"name": "setSelectedIndex"
},
{
"name": "setStyle"
},
{
"name": "setStyleAttr"
},
{
"name": "setUpAttributes"
},
{
"name": "stringifyForError"
},
{
"name": "stylingMapToString"
},
{
"name": "syncViewWithBlueprint"
},
{
"name": "unwrapRNode"
},
{
"name": "updateRawValueOnContext"
},
{
"name": "viewAttachedToChangeDetector"
},
{
"name": "writeStylingValueDirectly"
},
{
"name": "ɵɵallocHostVars"
},
{
"name": "ɵɵdefineComponent"
},
{
"name": "ɵɵelementHostAttrs"
},
{
"name": "ɵɵtext"
}

View File

@ -647,6 +647,9 @@
{
"name": "getContextLView"
},
{
"name": "getCurrentDirectiveDef"
},
{
"name": "getCurrentStyleSanitizer"
},
@ -1079,6 +1082,12 @@
{
"name": "patchHostStylingFlag"
},
{
"name": "prefillHostVars"
},
{
"name": "queueHostBindingForCheck"
},
{
"name": "readPatchedData"
},
@ -1358,6 +1367,9 @@
{
"name": "ɵɵadvance"
},
{
"name": "ɵɵallocHostVars"
},
{
"name": "ɵɵclassProp"
},
@ -1376,6 +1388,9 @@
{
"name": "ɵɵelementEnd"
},
{
"name": "ɵɵelementHostAttrs"
},
{
"name": "ɵɵelementStart"
},