diff --git a/packages/compiler-cli/test/compliance/r3_view_compiler_binding_spec.ts b/packages/compiler-cli/test/compliance/r3_view_compiler_binding_spec.ts
index 7fa4977f60..14a9ac0c86 100644
--- a/packages/compiler-cli/test/compliance/r3_view_compiler_binding_spec.ts
+++ b/packages/compiler-cli/test/compliance/r3_view_compiler_binding_spec.ts
@@ -496,6 +496,51 @@ describe('compiler compliance: bindings', () => {
expectEmit(result.source, template, 'Incorrect handling of interpolated properties');
});
+
+ it('should generate the proper update instructions for interpolated attributes', () => {
+ const files: MockDirectory = getAppFiles(`
+
+
+
+
+
+
+
+
+
+
+ `);
+
+ const template = `
+ …
+ if (rf & 2) {
+ i0.Δselect(0);
+ i0.ΔattributeInterpolateV("title", ["a", ctx.one, "b", ctx.two, "c", ctx.three, "d", ctx.four, "e", ctx.five, "f", ctx.six, "g", ctx.seven, "h", ctx.eight, "i", ctx.nine, "j"]);
+ i0.Δselect(1);
+ i0.ΔattributeInterpolate8("title", "a", ctx.one, "b", ctx.two, "c", ctx.three, "d", ctx.four, "e", ctx.five, "f", ctx.six, "g", ctx.seven, "h", ctx.eight, "i");
+ i0.Δselect(2);
+ i0.ΔattributeInterpolate7("title", "a", ctx.one, "b", ctx.two, "c", ctx.three, "d", ctx.four, "e", ctx.five, "f", ctx.six, "g", ctx.seven, "h");
+ i0.Δselect(3);
+ i0.ΔattributeInterpolate6("title", "a", ctx.one, "b", ctx.two, "c", ctx.three, "d", ctx.four, "e", ctx.five, "f", ctx.six, "g");
+ i0.Δselect(4);
+ i0.ΔattributeInterpolate5("title", "a", ctx.one, "b", ctx.two, "c", ctx.three, "d", ctx.four, "e", ctx.five, "f");
+ i0.Δselect(5);
+ i0.ΔattributeInterpolate4("title", "a", ctx.one, "b", ctx.two, "c", ctx.three, "d", ctx.four, "e");
+ i0.Δselect(6);
+ i0.ΔattributeInterpolate3("title", "a", ctx.one, "b", ctx.two, "c", ctx.three, "d");
+ i0.Δselect(7);
+ i0.ΔattributeInterpolate2("title", "a", ctx.one, "b", ctx.two, "c");
+ i0.Δselect(8);
+ i0.ΔattributeInterpolate1("title", "a", ctx.one, "b");
+ i0.Δselect(9);
+ i0.ΔattributeInterpolate("title", ctx.one);
+ }
+ …
+ `;
+ const result = compile(files, angularFiles);
+ expectEmit(result.source, template, 'Incorrect handling of interpolated properties');
+ });
+
it('should keep local ref for host element', () => {
const files: MockDirectory = getAppFiles(`
diff --git a/packages/compiler/src/render3/r3_identifiers.ts b/packages/compiler/src/render3/r3_identifiers.ts
index 05de920cd9..1a50c5ebb7 100644
--- a/packages/compiler/src/render3/r3_identifiers.ts
+++ b/packages/compiler/src/render3/r3_identifiers.ts
@@ -43,6 +43,27 @@ export class Identifiers {
static attribute: o.ExternalReference = {name: 'ɵɵattribute', moduleName: CORE};
+ static attributeInterpolate:
+ o.ExternalReference = {name: 'ɵɵattributeInterpolate', moduleName: CORE};
+ static attributeInterpolate1:
+ o.ExternalReference = {name: 'ɵɵattributeInterpolate1', moduleName: CORE};
+ static attributeInterpolate2:
+ o.ExternalReference = {name: 'ɵɵattributeInterpolate2', moduleName: CORE};
+ static attributeInterpolate3:
+ o.ExternalReference = {name: 'ɵɵattributeInterpolate3', moduleName: CORE};
+ static attributeInterpolate4:
+ o.ExternalReference = {name: 'ɵɵattributeInterpolate4', moduleName: CORE};
+ static attributeInterpolate5:
+ o.ExternalReference = {name: 'ɵɵattributeInterpolate5', moduleName: CORE};
+ static attributeInterpolate6:
+ o.ExternalReference = {name: 'ɵɵattributeInterpolate6', moduleName: CORE};
+ static attributeInterpolate7:
+ o.ExternalReference = {name: 'ɵɵattributeInterpolate7', moduleName: CORE};
+ static attributeInterpolate8:
+ o.ExternalReference = {name: 'ɵɵattributeInterpolate8', moduleName: CORE};
+ static attributeInterpolateV:
+ o.ExternalReference = {name: 'ɵɵattributeInterpolateV', moduleName: CORE};
+
static classProp: o.ExternalReference = {name: 'ɵɵclassProp', moduleName: CORE};
static elementContainerStart:
diff --git a/packages/compiler/src/render3/view/template.ts b/packages/compiler/src/render3/view/template.ts
index c141d350bc..2b0fb06635 100644
--- a/packages/compiler/src/render3/view/template.ts
+++ b/packages/compiler/src/render3/view/template.ts
@@ -772,12 +772,12 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver
} else if (inputType === BindingType.Attribute) {
if (value instanceof Interpolation) {
// attr.name="{{value}}" and friends
- this.updateInstruction(elementIndex, input.sourceSpan, R3.elementAttribute, () => {
- return [
- o.literal(elementIndex), o.literal(attrName),
- this.convertPropertyBinding(implicit, value), ...params
- ];
- });
+ this.updateInstruction(
+ elementIndex, input.sourceSpan, getAttributeInterpolationExpression(value),
+ () =>
+ [o.literal(attrName),
+ ...this.getUpdateInstructionArguments(o.variable(CONTEXT_NAME), value),
+ ...params]);
} else {
// [attr.name]="value"
this.updateInstruction(elementIndex, input.sourceSpan, R3.attribute, () => {
@@ -1695,6 +1695,35 @@ function getPropertyInterpolationExpression(interpolation: Interpolation) {
}
}
+/**
+ * Gets the instruction to generate for an interpolated attribute
+ * @param interpolation An Interpolation AST
+ */
+function getAttributeInterpolationExpression(interpolation: Interpolation) {
+ switch (getInterpolationArgsLength(interpolation)) {
+ case 1:
+ return R3.attributeInterpolate;
+ case 3:
+ return R3.attributeInterpolate1;
+ case 5:
+ return R3.attributeInterpolate2;
+ case 7:
+ return R3.attributeInterpolate3;
+ case 9:
+ return R3.attributeInterpolate4;
+ case 11:
+ return R3.attributeInterpolate5;
+ case 13:
+ return R3.attributeInterpolate6;
+ case 15:
+ return R3.attributeInterpolate7;
+ case 17:
+ return R3.attributeInterpolate8;
+ default:
+ return R3.attributeInterpolateV;
+ }
+}
+
/**
* Gets the number of arguments expected to be passed to a generated instruction in the case of
* interpolation instructions.
diff --git a/packages/core/src/core_render3_private_export.ts b/packages/core/src/core_render3_private_export.ts
index 96cfb3bd9b..e6bd93d75e 100644
--- a/packages/core/src/core_render3_private_export.ts
+++ b/packages/core/src/core_render3_private_export.ts
@@ -9,6 +9,16 @@
// clang-format off
export {
ɵɵattribute,
+ ɵɵattributeInterpolate,
+ ɵɵattributeInterpolate1,
+ ɵɵattributeInterpolate2,
+ ɵɵattributeInterpolate3,
+ ɵɵattributeInterpolate4,
+ ɵɵattributeInterpolate5,
+ ɵɵattributeInterpolate6,
+ ɵɵattributeInterpolate7,
+ ɵɵattributeInterpolate8,
+ ɵɵattributeInterpolateV,
ɵɵdefineBase,
ɵɵdefineComponent,
ɵɵdefineDirective,
diff --git a/packages/core/src/render3/index.ts b/packages/core/src/render3/index.ts
index b0ffe6aa71..00f1480263 100644
--- a/packages/core/src/render3/index.ts
+++ b/packages/core/src/render3/index.ts
@@ -23,7 +23,19 @@ export {
tick,
ɵɵallocHostVars,
+
ɵɵattribute,
+ ɵɵattributeInterpolate,
+ ɵɵattributeInterpolate1,
+ ɵɵattributeInterpolate2,
+ ɵɵattributeInterpolate3,
+ ɵɵattributeInterpolate4,
+ ɵɵattributeInterpolate5,
+ ɵɵattributeInterpolate6,
+ ɵɵattributeInterpolate7,
+ ɵɵattributeInterpolate8,
+ ɵɵattributeInterpolateV,
+
ɵɵbind,
ɵɵclassMap,
ɵɵclassProp,
diff --git a/packages/core/src/render3/instructions/all.ts b/packages/core/src/render3/instructions/all.ts
index 22017700fd..4ae084f172 100644
--- a/packages/core/src/render3/instructions/all.ts
+++ b/packages/core/src/render3/instructions/all.ts
@@ -27,6 +27,7 @@
*/
export * from './alloc_host_vars';
export * from './attribute';
+export * from './attribute_interpolation';
export * from './change_detection';
export * from './container';
export * from './storage';
diff --git a/packages/core/src/render3/instructions/attribute_interpolation.ts b/packages/core/src/render3/instructions/attribute_interpolation.ts
new file mode 100644
index 0000000000..f078ef9849
--- /dev/null
+++ b/packages/core/src/render3/instructions/attribute_interpolation.ts
@@ -0,0 +1,413 @@
+/**
+ * @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 {SanitizerFn} from '../interfaces/sanitization';
+import {getSelectedIndex} from '../state';
+import {ΔelementAttribute} from './element';
+import {Δinterpolation1, Δinterpolation2, Δinterpolation3, Δinterpolation4, Δinterpolation5, Δinterpolation6, Δinterpolation7, Δinterpolation8, ΔinterpolationV} from './property_interpolation';
+import {TsickleIssue1009} from './shared';
+
+/**
+ *
+ * Update an interpolated attribute on an element with a lone bound value
+ *
+ * Used when the value passed to a property has 1 interpolated value in it, an no additional text
+ * surrounds that interpolated value:
+ *
+ * ```html
+ *
+ * ```
+ *
+ * Its compiled representation is::
+ *
+ * ```ts
+ * ΔattributeInterpolate('title', v0);
+ * ```
+ *
+ * @param attrName The name of the attribute to update
+ * @param prefix Static value used for concatenation only.
+ * @param v0 Value checked for change.
+ * @param suffix Static value used for concatenation only.
+ * @param sanitizer An optional sanitizer function
+ * @returns itself, so that it may be chained.
+ * @codeGenApi
+ */
+export function ΔattributeInterpolate(
+ attrName: string, v0: any, sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009 {
+ ΔattributeInterpolate1(attrName, '', v0, '', sanitizer);
+ return ΔattributeInterpolate;
+}
+
+
+/**
+ *
+ * Update an interpolated attribute on an element with single bound value surrounded by text.
+ *
+ * Used when the value passed to a property has 1 interpolated value in it:
+ *
+ * ```html
+ *
+ * ```
+ *
+ * Its compiled representation is::
+ *
+ * ```ts
+ * ΔattributeInterpolate1('title', 'prefix', v0, 'suffix');
+ * ```
+ *
+ * @param attrName The name of the attribute to update
+ * @param prefix Static value used for concatenation only.
+ * @param v0 Value checked for change.
+ * @param suffix Static value used for concatenation only.
+ * @param sanitizer An optional sanitizer function
+ * @returns itself, so that it may be chained.
+ * @codeGenApi
+ */
+export function ΔattributeInterpolate1(
+ attrName: string, prefix: string, v0: any, suffix: string, sanitizer?: SanitizerFn,
+ namespace?: string): TsickleIssue1009 {
+ const index = getSelectedIndex();
+ const interpolatedValue = Δinterpolation1(prefix, v0, suffix);
+
+ ΔelementAttribute(index, attrName, interpolatedValue, sanitizer, namespace);
+
+ return ΔattributeInterpolate1;
+}
+
+/**
+ *
+ * Update an interpolated attribute on an element with 2 bound values surrounded by text.
+ *
+ * Used when the value passed to a property has 2 interpolated values in it:
+ *
+ * ```html
+ *
+ * ```
+ *
+ * Its compiled representation is::
+ *
+ * ```ts
+ * ΔattributeInterpolate2('title', 'prefix', v0, '-', v1, 'suffix');
+ * ```
+ *
+ * @param attrName The name of the attribute to update
+ * @param prefix Static value used for concatenation only.
+ * @param v0 Value checked for change.
+ * @param i0 Static value used for concatenation only.
+ * @param v1 Value checked for change.
+ * @param suffix Static value used for concatenation only.
+ * @param sanitizer An optional sanitizer function
+ * @returns itself, so that it may be chained.
+ * @codeGenApi
+ */
+export function ΔattributeInterpolate2(
+ attrName: string, prefix: string, v0: any, i0: string, v1: any, suffix: string,
+ sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009 {
+ const index = getSelectedIndex();
+ const interpolatedValue = Δinterpolation2(prefix, v0, i0, v1, suffix);
+ ΔelementAttribute(index, attrName, interpolatedValue, sanitizer, namespace);
+ return ΔattributeInterpolate2;
+}
+
+/**
+ *
+ * Update an interpolated attribute on an element with 3 bound values surrounded by text.
+ *
+ * Used when the value passed to a property has 3 interpolated values in it:
+ *
+ * ```html
+ *
+ * ```
+ *
+ * Its compiled representation is::
+ *
+ * ```ts
+ * ΔattributeInterpolate3(
+ * 'title', 'prefix', v0, '-', v1, '-', v2, 'suffix');
+ * ```
+ *
+ * @param attrName The name of the attribute to update
+ * @param prefix Static value used for concatenation only.
+ * @param v0 Value checked for change.
+ * @param i0 Static value used for concatenation only.
+ * @param v1 Value checked for change.
+ * @param i1 Static value used for concatenation only.
+ * @param v2 Value checked for change.
+ * @param suffix Static value used for concatenation only.
+ * @param sanitizer An optional sanitizer function
+ * @returns itself, so that it may be chained.
+ * @codeGenApi
+ */
+export function ΔattributeInterpolate3(
+ attrName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any,
+ suffix: string, sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009 {
+ const index = getSelectedIndex();
+ const interpolatedValue = Δinterpolation3(prefix, v0, i0, v1, i1, v2, suffix);
+ ΔelementAttribute(index, attrName, interpolatedValue, sanitizer, namespace);
+ return ΔattributeInterpolate3;
+}
+
+/**
+ *
+ * Update an interpolated attribute on an element with 4 bound values surrounded by text.
+ *
+ * Used when the value passed to a property has 4 interpolated values in it:
+ *
+ * ```html
+ *
+ * ```
+ *
+ * Its compiled representation is::
+ *
+ * ```ts
+ * ΔattributeInterpolate4(
+ * 'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, 'suffix');
+ * ```
+ *
+ * @param attrName The name of the attribute to update
+ * @param prefix Static value used for concatenation only.
+ * @param v0 Value checked for change.
+ * @param i0 Static value used for concatenation only.
+ * @param v1 Value checked for change.
+ * @param i1 Static value used for concatenation only.
+ * @param v2 Value checked for change.
+ * @param i2 Static value used for concatenation only.
+ * @param v3 Value checked for change.
+ * @param suffix Static value used for concatenation only.
+ * @param sanitizer An optional sanitizer function
+ * @returns itself, so that it may be chained.
+ * @codeGenApi
+ */
+export function ΔattributeInterpolate4(
+ attrName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string,
+ v3: any, suffix: string, sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009 {
+ const index = getSelectedIndex();
+ const interpolatedValue = Δinterpolation4(prefix, v0, i0, v1, i1, v2, i2, v3, suffix);
+ ΔelementAttribute(index, attrName, interpolatedValue, sanitizer, namespace);
+ return ΔattributeInterpolate4;
+}
+
+/**
+ *
+ * Update an interpolated attribute on an element with 5 bound values surrounded by text.
+ *
+ * Used when the value passed to a property has 5 interpolated values in it:
+ *
+ * ```html
+ *
+ * ```
+ *
+ * Its compiled representation is::
+ *
+ * ```ts
+ * ΔattributeInterpolate5(
+ * 'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, 'suffix');
+ * ```
+ *
+ * @param attrName The name of the attribute to update
+ * @param prefix Static value used for concatenation only.
+ * @param v0 Value checked for change.
+ * @param i0 Static value used for concatenation only.
+ * @param v1 Value checked for change.
+ * @param i1 Static value used for concatenation only.
+ * @param v2 Value checked for change.
+ * @param i2 Static value used for concatenation only.
+ * @param v3 Value checked for change.
+ * @param i3 Static value used for concatenation only.
+ * @param v4 Value checked for change.
+ * @param suffix Static value used for concatenation only.
+ * @param sanitizer An optional sanitizer function
+ * @returns itself, so that it may be chained.
+ * @codeGenApi
+ */
+export function ΔattributeInterpolate5(
+ attrName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string,
+ v3: any, i3: string, v4: any, suffix: string, sanitizer?: SanitizerFn,
+ namespace?: string): TsickleIssue1009 {
+ const index = getSelectedIndex();
+ const interpolatedValue = Δinterpolation5(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, suffix);
+ ΔelementAttribute(index, attrName, interpolatedValue, sanitizer, namespace);
+ return ΔattributeInterpolate5;
+}
+
+/**
+ *
+ * Update an interpolated attribute on an element with 6 bound values surrounded by text.
+ *
+ * Used when the value passed to a property has 6 interpolated values in it:
+ *
+ * ```html
+ *
+ * ```
+ *
+ * Its compiled representation is::
+ *
+ * ```ts
+ * ΔattributeInterpolate6(
+ * 'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, 'suffix');
+ * ```
+ *
+ * @param attrName The name of the attribute to update
+ * @param prefix Static value used for concatenation only.
+ * @param v0 Value checked for change.
+ * @param i0 Static value used for concatenation only.
+ * @param v1 Value checked for change.
+ * @param i1 Static value used for concatenation only.
+ * @param v2 Value checked for change.
+ * @param i2 Static value used for concatenation only.
+ * @param v3 Value checked for change.
+ * @param i3 Static value used for concatenation only.
+ * @param v4 Value checked for change.
+ * @param i4 Static value used for concatenation only.
+ * @param v5 Value checked for change.
+ * @param suffix Static value used for concatenation only.
+ * @param sanitizer An optional sanitizer function
+ * @returns itself, so that it may be chained.
+ * @codeGenApi
+ */
+export function ΔattributeInterpolate6(
+ attrName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string,
+ v3: any, i3: string, v4: any, i4: string, v5: any, suffix: string, sanitizer?: SanitizerFn,
+ namespace?: string): TsickleIssue1009 {
+ const index = getSelectedIndex();
+ const interpolatedValue =
+ Δinterpolation6(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, suffix);
+ ΔelementAttribute(index, attrName, interpolatedValue, sanitizer, namespace);
+ return ΔattributeInterpolate6;
+}
+
+/**
+ *
+ * Update an interpolated attribute on an element with 7 bound values surrounded by text.
+ *
+ * Used when the value passed to a property has 7 interpolated values in it:
+ *
+ * ```html
+ *
+ * ```
+ *
+ * Its compiled representation is::
+ *
+ * ```ts
+ * ΔattributeInterpolate7(
+ * 'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, 'suffix');
+ * ```
+ *
+ * @param attrName The name of the attribute to update
+ * @param prefix Static value used for concatenation only.
+ * @param v0 Value checked for change.
+ * @param i0 Static value used for concatenation only.
+ * @param v1 Value checked for change.
+ * @param i1 Static value used for concatenation only.
+ * @param v2 Value checked for change.
+ * @param i2 Static value used for concatenation only.
+ * @param v3 Value checked for change.
+ * @param i3 Static value used for concatenation only.
+ * @param v4 Value checked for change.
+ * @param i4 Static value used for concatenation only.
+ * @param v5 Value checked for change.
+ * @param i5 Static value used for concatenation only.
+ * @param v6 Value checked for change.
+ * @param suffix Static value used for concatenation only.
+ * @param sanitizer An optional sanitizer function
+ * @returns itself, so that it may be chained.
+ * @codeGenApi
+ */
+export function ΔattributeInterpolate7(
+ attrName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string,
+ v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, suffix: string,
+ sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009 {
+ const index = getSelectedIndex();
+ const interpolatedValue =
+ Δinterpolation7(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, suffix);
+ ΔelementAttribute(index, attrName, interpolatedValue, sanitizer, namespace);
+ return ΔattributeInterpolate7;
+}
+
+/**
+ *
+ * Update an interpolated attribute on an element with 8 bound values surrounded by text.
+ *
+ * Used when the value passed to a property has 8 interpolated values in it:
+ *
+ * ```html
+ *
+ * ```
+ *
+ * Its compiled representation is::
+ *
+ * ```ts
+ * ΔattributeInterpolate8(
+ * 'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, 'suffix');
+ * ```
+ *
+ * @param attrName The name of the attribute to update
+ * @param prefix Static value used for concatenation only.
+ * @param v0 Value checked for change.
+ * @param i0 Static value used for concatenation only.
+ * @param v1 Value checked for change.
+ * @param i1 Static value used for concatenation only.
+ * @param v2 Value checked for change.
+ * @param i2 Static value used for concatenation only.
+ * @param v3 Value checked for change.
+ * @param i3 Static value used for concatenation only.
+ * @param v4 Value checked for change.
+ * @param i4 Static value used for concatenation only.
+ * @param v5 Value checked for change.
+ * @param i5 Static value used for concatenation only.
+ * @param v6 Value checked for change.
+ * @param i6 Static value used for concatenation only.
+ * @param v7 Value checked for change.
+ * @param suffix Static value used for concatenation only.
+ * @param sanitizer An optional sanitizer function
+ * @returns itself, so that it may be chained.
+ * @codeGenApi
+ */
+export function ΔattributeInterpolate8(
+ attrName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string,
+ v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, i6: string, v7: any,
+ suffix: string, sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009 {
+ const index = getSelectedIndex();
+ const interpolatedValue =
+ Δinterpolation8(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, i6, v7, suffix);
+ ΔelementAttribute(index, attrName, interpolatedValue, sanitizer, namespace);
+ return ΔattributeInterpolate8;
+}
+
+/**
+ * Update an interpolated attribute on an element with 8 or more bound values surrounded by text.
+ *
+ * Used when the number of interpolated values exceeds 7.
+ *
+ * ```html
+ *
+ * ```
+ *
+ * Its compiled representation is::
+ *
+ * ```ts
+ * ΔattributeInterpolateV(
+ * 'title', ['prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, '-', v9,
+ * 'suffix']);
+ * ```
+ *
+ * @param attrName The name of the attribute to update.
+ * @param values The a collection of values and the strings in-between those values, beginning with
+ * a string prefix and ending with a string suffix.
+ * (e.g. `['prefix', value0, '-', value1, '-', value2, ..., value99, 'suffix']`)
+ * @param sanitizer An optional sanitizer function
+ * @returns itself, so that it may be chained.
+ * @codeGenApi
+ */
+export function ΔattributeInterpolateV(
+ attrName: string, values: any[], sanitizer?: SanitizerFn,
+ namespace?: string): TsickleIssue1009 {
+ const index = getSelectedIndex();
+ ΔelementAttribute(index, attrName, ΔinterpolationV(values), sanitizer, namespace);
+ return ΔattributeInterpolateV;
+}
diff --git a/tools/public_api_guard/core/core.d.ts b/tools/public_api_guard/core/core.d.ts
index 1ca6059c4b..fecd24d2f0 100644
--- a/tools/public_api_guard/core/core.d.ts
+++ b/tools/public_api_guard/core/core.d.ts
@@ -1405,3 +1405,405 @@ export interface WtfScopeFn {
}
export declare const wtfStartTimeRange: (rangeType: string, action: string) => any;
+
+export declare function ɵɵallocHostVars(count: number): void;
+
+export declare function ɵɵattribute(name: string, value: any, sanitizer?: SanitizerFn | null, namespace?: string): void;
+
+export declare function ɵɵattributeInterpolate(attrName: string, v0: any, sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009;
+
+export declare function ɵɵattributeInterpolate1(attrName: string, prefix: string, v0: any, suffix: string, sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009;
+
+export declare function ɵɵattributeInterpolate2(attrName: string, prefix: string, v0: any, i0: string, v1: any, suffix: string, sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009;
+
+export declare function ɵɵattributeInterpolate3(attrName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, suffix: string, sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009;
+
+export declare function ɵɵattributeInterpolate4(attrName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, suffix: string, sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009;
+
+export declare function ɵɵattributeInterpolate5(attrName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, suffix: string, sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009;
+
+export declare function ɵɵattributeInterpolate6(attrName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, suffix: string, sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009;
+
+export declare function ɵɵattributeInterpolate7(attrName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, suffix: string, sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009;
+
+export declare function ɵɵattributeInterpolate8(attrName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, i6: string, v7: any, suffix: string, sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009;
+
+export declare function ɵɵattributeInterpolateV(attrName: string, values: any[], sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009;
+
+export interface ɵɵBaseDef {
+ contentQueries: ContentQueriesFunction | null;
+ /** @deprecated */ readonly declaredInputs: {
+ [P in keyof T]: string;
+ };
+ hostBindings: HostBindingsFunction | null;
+ readonly inputs: {
+ [P in keyof T]: string;
+ };
+ readonly outputs: {
+ [P in keyof T]: string;
+ };
+ viewQuery: ViewQueriesFunction | null;
+}
+
+export declare function ɵɵbind(value: T): T | NO_CHANGE;
+
+export declare function ɵɵclassMap(classes: {
+ [styleName: string]: any;
+} | NO_CHANGE | string | null): void;
+
+export declare function ɵɵclassProp(classIndex: number, value: boolean | PlayerFactory, forceOverride?: boolean): void;
+
+export declare type ɵɵComponentDefWithMeta = ComponentDef;
+
+export declare function ɵɵcomponentHostSyntheticListener(eventName: string, listenerFn: (e?: any) => any, useCapture?: boolean, eventTargetResolver?: GlobalTargetResolver): void;
+
+export declare function ɵɵcomponentHostSyntheticProperty(index: number, propName: string, value: T | NO_CHANGE, sanitizer?: SanitizerFn | null, nativeOnly?: boolean): void;
+
+export declare function ɵɵcontainer(index: number): void;
+
+export declare function ɵɵcontainerRefreshEnd(): void;
+
+export declare function ɵɵcontainerRefreshStart(index: number): void;
+
+export declare function ɵɵcontentQuery(directiveIndex: number, predicate: Type | string[], descend: boolean, read: any): QueryList;
+
+export declare const ɵɵdefaultStyleSanitizer: StyleSanitizeFn;
+
+export declare function ɵɵdefineBase(baseDefinition: {
+ inputs?: {
+ [P in keyof T]?: string | [string, string];
+ };
+ outputs?: {
+ [P in keyof T]?: string;
+ };
+ contentQueries?: ContentQueriesFunction | null;
+ viewQuery?: ViewQueriesFunction | null;
+ hostBindings?: HostBindingsFunction;
+}): ɵɵBaseDef;
+
+export declare function ɵɵdefineComponent(componentDefinition: {
+ type: Type;
+ selectors: CssSelectorList;
+ factory: FactoryFn;
+ consts: number;
+ vars: number;
+ inputs?: {
+ [P in keyof T]?: string | [string, string];
+ };
+ outputs?: {
+ [P in keyof T]?: string;
+ };
+ hostBindings?: HostBindingsFunction;
+ contentQueries?: ContentQueriesFunction;
+ exportAs?: string[];
+ template: ComponentTemplate;
+ ngContentSelectors?: string[];
+ viewQuery?: ViewQueriesFunction | null;
+ features?: ComponentDefFeature[];
+ encapsulation?: ViewEncapsulation;
+ data?: {
+ [kind: string]: any;
+ };
+ styles?: string[];
+ changeDetection?: ChangeDetectionStrategy;
+ directives?: DirectiveTypesOrFactory | null;
+ pipes?: PipeTypesOrFactory | null;
+ schemas?: SchemaMetadata[] | null;
+}): never;
+
+export declare const ɵɵdefineDirective: (directiveDefinition: {
+ type: Type;
+ selectors: (string | SelectorFlags)[][];
+ factory: FactoryFn;
+ inputs?: { [P in keyof T]?: string | [string, string] | undefined; } | undefined;
+ outputs?: { [P in keyof T]?: string | undefined; } | undefined;
+ features?: DirectiveDefFeature[] | undefined;
+ hostBindings?: HostBindingsFunction | undefined;
+ contentQueries?: ContentQueriesFunction | undefined;
+ viewQuery?: ViewQueriesFunction | null | undefined;
+ exportAs?: string[] | undefined;
+}) => never;
+
+export declare function ɵɵdefineInjectable(opts: {
+ providedIn?: Type | 'root' | 'any' | null;
+ factory: () => T;
+}): never;
+
+export declare function ɵɵdefineInjector(options: {
+ factory: () => any;
+ providers?: any[];
+ imports?: any[];
+}): never;
+
+export declare function ɵɵdefineNgModule(def: {
+ type: T;
+ bootstrap?: Type[] | (() => Type[]);
+ declarations?: Type[] | (() => Type[]);
+ imports?: Type[] | (() => Type[]);
+ exports?: Type[] | (() => Type[]);
+ schemas?: SchemaMetadata[] | null;
+ id?: string | null;
+}): never;
+
+export declare function ɵɵdefinePipe(pipeDef: {
+ name: string;
+ type: Type;
+ factory: FactoryFn;
+ pure?: boolean;
+}): never;
+
+export declare type ɵɵDirectiveDefWithMeta = DirectiveDef;
+
+export declare function ɵɵdirectiveInject(token: Type | InjectionToken): T;
+export declare function ɵɵdirectiveInject(token: Type | InjectionToken, flags: InjectFlags): T;
+
+export declare function ɵɵdisableBindings(): void;
+
+export declare function ɵɵelement(index: number, name: string, attrs?: TAttributes | null, localRefs?: string[] | null): void;
+
+export declare function ɵɵelementAttribute(index: number, name: string, value: any, sanitizer?: SanitizerFn | null, namespace?: string): void;
+
+export declare function ɵɵelementContainerEnd(): void;
+
+export declare function ɵɵelementContainerStart(index: number, attrs?: TAttributes | null, localRefs?: string[] | null): void;
+
+export declare function ɵɵelementEnd(): void;
+
+export declare function ɵɵelementHostAttrs(attrs: TAttributes): void;
+
+export declare function ɵɵelementProperty(index: number, propName: string, value: T | NO_CHANGE, sanitizer?: SanitizerFn | null, nativeOnly?: boolean): void;
+
+export declare function ɵɵelementStart(index: number, name: string, attrs?: TAttributes | null, localRefs?: string[] | null): void;
+
+export declare function ɵɵembeddedViewEnd(): void;
+
+export declare function ɵɵembeddedViewStart(viewBlockId: number, consts: number, vars: number): RenderFlags;
+
+export declare function ɵɵenableBindings(): void;
+
+export declare function ɵɵgetCurrentView(): OpaqueViewState;
+
+export declare function ɵɵgetFactoryOf(type: Type): ((type: Type | null) => T) | null;
+
+export declare function ɵɵgetInheritedFactory(type: Type): (type: Type) => T;
+
+export declare function ɵɵi18n(index: number, message: string, subTemplateIndex?: number): void;
+
+export declare function ɵɵi18nApply(index: number): void;
+
+export declare function ɵɵi18nAttributes(index: number, values: string[]): void;
+
+export declare function ɵɵi18nEnd(): void;
+
+export declare function ɵɵi18nExp(expression: T | NO_CHANGE): void;
+
+/** @deprecated */
+export declare function ɵɵi18nLocalize(input: string, placeholders?: {
+ [key: string]: string;
+}): string;
+
+export declare function ɵɵi18nPostprocess(message: string, replacements?: {
+ [key: string]: (string | string[]);
+}): string;
+
+export declare function ɵɵi18nStart(index: number, message: string, subTemplateIndex?: number): void;
+
+export declare function ɵɵInheritDefinitionFeature(definition: DirectiveDef | ComponentDef): void;
+
+export declare function ɵɵinject(token: Type | InjectionToken): T;
+export declare function ɵɵinject(token: Type | InjectionToken, flags?: InjectFlags): T | null;
+
+export interface ɵɵInjectableDef {
+ factory: () => T;
+ providedIn: InjectorType | 'root' | 'any' | null;
+ value: T | undefined;
+}
+
+export declare function ɵɵinjectAttribute(attrNameToInject: string): string | null;
+
+export interface ɵɵInjectorDef {
+ factory: () => T;
+ imports: (InjectorType | InjectorTypeWithProviders)[];
+ providers: (Type | ValueProvider | ExistingProvider | FactoryProvider | ConstructorProvider | StaticClassProvider | ClassProvider | any[])[];
+}
+
+export declare function ɵɵinterpolation1(prefix: string, v0: any, suffix: string): string | NO_CHANGE;
+
+export declare function ɵɵinterpolation2(prefix: string, v0: any, i0: string, v1: any, suffix: string): string | NO_CHANGE;
+
+export declare function ɵɵinterpolation3(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, suffix: string): string | NO_CHANGE;
+
+export declare function ɵɵinterpolation4(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, suffix: string): string | NO_CHANGE;
+
+export declare function ɵɵinterpolation5(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, suffix: string): string | NO_CHANGE;
+
+export declare function ɵɵinterpolation6(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, suffix: string): string | NO_CHANGE;
+
+export declare function ɵɵinterpolation7(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, suffix: string): string | NO_CHANGE;
+
+export declare function ɵɵinterpolation8(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, i6: string, v7: any, suffix: string): string | NO_CHANGE;
+
+export declare function ɵɵinterpolationV(values: any[]): string | NO_CHANGE;
+
+export declare function ɵɵlistener(eventName: string, listenerFn: (e?: any) => any, useCapture?: boolean, eventTargetResolver?: GlobalTargetResolver): void;
+
+export declare function ɵɵload(index: number): T;
+
+export declare function ɵɵloadContentQuery(): QueryList;
+
+export declare function ɵɵloadViewQuery(): T;
+
+export declare function ɵɵnamespaceHTML(): void;
+
+export declare function ɵɵnamespaceMathML(): void;
+
+export declare function ɵɵnamespaceSVG(): void;
+
+export declare function ɵɵnextContext(level?: number): T;
+
+export declare type ɵɵNgModuleDefWithMeta = NgModuleDef;
+
+export declare function ɵɵNgOnChangesFeature(): DirectiveDefFeature;
+
+export declare function ɵɵpipe(index: number, pipeName: string): any;
+
+export declare function ɵɵpipeBind1(index: number, slotOffset: number, v1: any): any;
+
+export declare function ɵɵpipeBind2(index: number, slotOffset: number, v1: any, v2: any): any;
+
+export declare function ɵɵpipeBind3(index: number, slotOffset: number, v1: any, v2: any, v3: any): any;
+
+export declare function ɵɵpipeBind4(index: number, slotOffset: number, v1: any, v2: any, v3: any, v4: any): any;
+
+export declare function ɵɵpipeBindV(index: number, slotOffset: number, values: any[]): any;
+
+export declare type ɵɵPipeDefWithMeta = PipeDef;
+
+export declare function ɵɵprojection(nodeIndex: number, selectorIndex?: number, attrs?: TAttributes): void;
+
+export declare function ɵɵprojectionDef(selectors?: CssSelectorList[]): void;
+
+export declare function ɵɵproperty(propName: string, value: T, sanitizer?: SanitizerFn | null, nativeOnly?: boolean): TsickleIssue1009;
+
+export declare function ɵɵpropertyInterpolate(propName: string, v0: any, sanitizer?: SanitizerFn): TsickleIssue1009;
+
+export declare function ɵɵpropertyInterpolate1(propName: string, prefix: string, v0: any, suffix: string, sanitizer?: SanitizerFn): TsickleIssue1009;
+
+export declare function ɵɵpropertyInterpolate2(propName: string, prefix: string, v0: any, i0: string, v1: any, suffix: string, sanitizer?: SanitizerFn): TsickleIssue1009;
+
+export declare function ɵɵpropertyInterpolate3(propName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, suffix: string, sanitizer?: SanitizerFn): TsickleIssue1009;
+
+export declare function ɵɵpropertyInterpolate4(propName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, suffix: string, sanitizer?: SanitizerFn): TsickleIssue1009;
+
+export declare function ɵɵpropertyInterpolate5(propName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, suffix: string, sanitizer?: SanitizerFn): TsickleIssue1009;
+
+export declare function ɵɵpropertyInterpolate6(propName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, suffix: string, sanitizer?: SanitizerFn): TsickleIssue1009;
+
+export declare function ɵɵpropertyInterpolate7(propName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, suffix: string, sanitizer?: SanitizerFn): TsickleIssue1009;
+
+export declare function ɵɵpropertyInterpolate8(propName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, i6: string, v7: any, suffix: string, sanitizer?: SanitizerFn): TsickleIssue1009;
+
+export declare function ɵɵpropertyInterpolateV(propName: string, values: any[], sanitizer?: SanitizerFn): TsickleIssue1009;
+
+export declare function ɵɵProvidersFeature(providers: Provider[], viewProviders?: Provider[]): (definition: DirectiveDef) => void;
+
+export declare function ɵɵpureFunction0(slotOffset: number, pureFn: () => T, thisArg?: any): T;
+
+export declare function ɵɵpureFunction1(slotOffset: number, pureFn: (v: any) => any, exp: any, thisArg?: any): any;
+
+export declare function ɵɵpureFunction2(slotOffset: number, pureFn: (v1: any, v2: any) => any, exp1: any, exp2: any, thisArg?: any): any;
+
+export declare function ɵɵpureFunction3(slotOffset: number, pureFn: (v1: any, v2: any, v3: any) => any, exp1: any, exp2: any, exp3: any, thisArg?: any): any;
+
+export declare function ɵɵpureFunction4(slotOffset: number, pureFn: (v1: any, v2: any, v3: any, v4: any) => any, exp1: any, exp2: any, exp3: any, exp4: any, thisArg?: any): any;
+
+export declare function ɵɵpureFunction5(slotOffset: number, pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any) => any, exp1: any, exp2: any, exp3: any, exp4: any, exp5: any, thisArg?: any): any;
+
+export declare function ɵɵpureFunction6(slotOffset: number, pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any, v6: any) => any, exp1: any, exp2: any, exp3: any, exp4: any, exp5: any, exp6: any, thisArg?: any): any;
+
+export declare function ɵɵpureFunction7(slotOffset: number, pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any, v6: any, v7: any) => any, exp1: any, exp2: any, exp3: any, exp4: any, exp5: any, exp6: any, exp7: any, thisArg?: any): any;
+
+export declare function ɵɵpureFunction8(slotOffset: number, pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any, v6: any, v7: any, v8: any) => any, exp1: any, exp2: any, exp3: any, exp4: any, exp5: any, exp6: any, exp7: any, exp8: any, thisArg?: any): any;
+
+export declare function ɵɵpureFunctionV(slotOffset: number, pureFn: (...v: any[]) => any, exps: any[], thisArg?: any): any;
+
+export declare function ɵɵqueryRefresh(queryList: QueryList): boolean;
+
+export declare function ɵɵreference(index: number): T;
+
+export declare function ɵɵresolveBody(element: RElement & {
+ ownerDocument: Document;
+}): {
+ name: string;
+ target: HTMLElement;
+};
+
+export declare function ɵɵresolveDocument(element: RElement & {
+ ownerDocument: Document;
+}): {
+ name: string;
+ target: Document;
+};
+
+export declare function ɵɵresolveWindow(element: RElement & {
+ ownerDocument: Document;
+}): {
+ name: string;
+ target: Window | null;
+};
+
+export declare function ɵɵrestoreView(viewToRestore: OpaqueViewState): void;
+
+export declare function ɵɵsanitizeHtml(unsafeHtml: any): string;
+
+export declare function ɵɵsanitizeResourceUrl(unsafeResourceUrl: any): string;
+
+export declare function ɵɵsanitizeScript(unsafeScript: any): string;
+
+export declare function ɵɵsanitizeStyle(unsafeStyle: any): string;
+
+export declare function ɵɵsanitizeUrl(unsafeUrl: any): string;
+
+export declare function ɵɵsanitizeUrlOrResourceUrl(unsafeUrl: any, tag: string, prop: string): any;
+
+export declare function ɵɵselect(index: number): void;
+
+export declare function ɵɵsetComponentScope(type: ComponentType, directives: Type[], pipes: Type[]): void;
+
+export declare function ɵɵsetNgModuleScope(type: any, scope: {
+ declarations?: Type[] | (() => Type[]);
+ imports?: Type[] | (() => Type[]);
+ exports?: Type[] | (() => Type[]);
+}): void;
+
+export declare function ɵɵstaticContentQuery(directiveIndex: number, predicate: Type | string[], descend: boolean, read: any): void;
+
+export declare function ɵɵstaticViewQuery(predicate: Type | string[], descend: boolean, read: any): void;
+
+export declare function ɵɵstyleMap(styles: {
+ [styleName: string]: any;
+} | NO_CHANGE | null): void;
+
+export declare function ɵɵstyleProp(styleIndex: number, value: string | number | String | PlayerFactory | null, suffix?: string | null, forceOverride?: boolean): void;
+
+export declare function ɵɵstyling(classBindingNames?: string[] | null, styleBindingNames?: string[] | null, styleSanitizer?: StyleSanitizeFn | null): void;
+
+export declare function ɵɵstylingApply(): void;
+
+export declare function ɵɵtemplate(index: number, templateFn: ComponentTemplate | null, consts: number, vars: number, tagName?: string | null, attrs?: TAttributes | null, localRefs?: string[] | null, localRefExtractor?: LocalRefExtractor): void;
+
+export declare function ɵɵtemplateRefExtractor(tNode: TNode, currentView: LView): ViewEngine_TemplateRef<{}> | null;
+
+export declare function ɵɵtext(index: number, value?: any): void;
+
+export declare function ɵɵtextBinding(index: number, value: T | NO_CHANGE): void;
+
+export declare function ɵɵviewQuery(predicate: Type | string[], descend: boolean, read: any): QueryList;