refactor(ivy): interpolatiom instructions do not support NO_CHANGE at input. (#22268)
PR Close #22268
This commit is contained in:
parent
5a14e2238f
commit
c9ebd60435
|
@ -1418,7 +1418,7 @@ export function bind<T>(value: T | NO_CHANGE): T|NO_CHANGE {
|
||||||
/**
|
/**
|
||||||
* Create interpolation bindings with a variable number of expressions.
|
* Create interpolation bindings with a variable number of expressions.
|
||||||
*
|
*
|
||||||
* If there are 1 to 7 expressions `interpolation1()` to `interpolation7` should be used instead.
|
* If there are 1 to 8 expressions `interpolation1()` to `interpolation8()` should be used instead.
|
||||||
* Those are faster because there is no need to create an array of expressions and loop over it.
|
* Those are faster because there is no need to create an array of expressions and loop over it.
|
||||||
*
|
*
|
||||||
* `values`:
|
* `values`:
|
||||||
|
@ -1448,12 +1448,10 @@ export function interpolationV(values: any[]): string|NO_CHANGE {
|
||||||
const bindings: any[] = data[bindingIndex++];
|
const bindings: any[] = data[bindingIndex++];
|
||||||
// `bIdx` is the index in the `bindings` array, `vIdx` in the `values` array
|
// `bIdx` is the index in the `bindings` array, `vIdx` in the `values` array
|
||||||
for (let bIdx = 0, vIdx = 1; bIdx < bindings.length; bIdx++, vIdx += 2) {
|
for (let bIdx = 0, vIdx = 1; bIdx < bindings.length; bIdx++, vIdx += 2) {
|
||||||
if (values[vIdx] !== NO_CHANGE && isDifferent(values[vIdx], bindings[bIdx])) {
|
if (isDifferent(values[vIdx], bindings[bIdx])) {
|
||||||
let content: string = values[0];
|
let content: string = values[0];
|
||||||
for (bIdx = 0, vIdx = 1; bIdx < bindings.length; vIdx += 2, bIdx++) {
|
for (bIdx = 0, vIdx = 1; bIdx < bindings.length; vIdx += 2, bIdx++) {
|
||||||
if (values[vIdx] !== NO_CHANGE) {
|
bindings[bIdx] = values[vIdx];
|
||||||
bindings[bIdx] = values[vIdx];
|
|
||||||
}
|
|
||||||
content += stringify(bindings[bIdx]) + values[vIdx + 1];
|
content += stringify(bindings[bIdx]) + values[vIdx + 1];
|
||||||
}
|
}
|
||||||
return content;
|
return content;
|
||||||
|
@ -1467,11 +1465,24 @@ export function interpolationV(values: any[]): string|NO_CHANGE {
|
||||||
* Creates an interpolation binding with 1 expression.
|
* Creates an interpolation binding with 1 expression.
|
||||||
*
|
*
|
||||||
* @param prefix static value used for concatenation only.
|
* @param prefix static value used for concatenation only.
|
||||||
* @param value value checked for change.
|
* @param v0 value checked for change.
|
||||||
* @param suffix static value used for concatenation only.
|
* @param suffix static value used for concatenation only.
|
||||||
*/
|
*/
|
||||||
export function interpolation1(prefix: string, value: any, suffix: string): string|NO_CHANGE {
|
export function interpolation1(prefix: string, v0: any, suffix: string): string|NO_CHANGE {
|
||||||
return bind(value) === NO_CHANGE ? NO_CHANGE : prefix + stringify(value) + suffix;
|
let different: boolean;
|
||||||
|
debugger;
|
||||||
|
if (different = creationMode) {
|
||||||
|
initBindings();
|
||||||
|
data[bindingIndex++] = v0;
|
||||||
|
} else {
|
||||||
|
const part0 = data[bindingIndex++];
|
||||||
|
different = isDifferent(part0, v0);
|
||||||
|
if (different) {
|
||||||
|
data[bindingIndex - 1] = v0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return different ? prefix + stringify(v0) + suffix : NO_CHANGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Creates an interpolation binding with 2 expressions. */
|
/** Creates an interpolation binding with 2 expressions. */
|
||||||
|
@ -1485,13 +1496,15 @@ export function interpolation2(
|
||||||
} else {
|
} else {
|
||||||
const part0 = data[bindingIndex++];
|
const part0 = data[bindingIndex++];
|
||||||
const part1 = data[bindingIndex++];
|
const part1 = data[bindingIndex++];
|
||||||
if (v0 === NO_CHANGE) v0 = part0;
|
|
||||||
if (v1 === NO_CHANGE) v1 = part1;
|
different = isDifferent(part0, v0) || isDifferent(part1, v1);
|
||||||
if (different = (isDifferent(part0, v0) || isDifferent(part1, v1))) {
|
|
||||||
|
if (different) {
|
||||||
data[bindingIndex - 2] = v0;
|
data[bindingIndex - 2] = v0;
|
||||||
data[bindingIndex - 1] = v1;
|
data[bindingIndex - 1] = v1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return different ? prefix + stringify(v0) + i0 + stringify(v1) + suffix : NO_CHANGE;
|
return different ? prefix + stringify(v0) + i0 + stringify(v1) + suffix : NO_CHANGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1509,15 +1522,16 @@ export function interpolation3(
|
||||||
const part0 = data[bindingIndex++];
|
const part0 = data[bindingIndex++];
|
||||||
const part1 = data[bindingIndex++];
|
const part1 = data[bindingIndex++];
|
||||||
const part2 = data[bindingIndex++];
|
const part2 = data[bindingIndex++];
|
||||||
if (v0 === NO_CHANGE) v0 = part0;
|
|
||||||
if (v1 === NO_CHANGE) v1 = part1;
|
different = isDifferent(part0, v0) || isDifferent(part1, v1) || isDifferent(part2, v2);
|
||||||
if (v2 === NO_CHANGE) v2 = part2;
|
|
||||||
if (different = (isDifferent(part0, v0) || isDifferent(part1, v1) || isDifferent(part2, v2))) {
|
if (different) {
|
||||||
data[bindingIndex - 3] = v0;
|
data[bindingIndex - 3] = v0;
|
||||||
data[bindingIndex - 2] = v1;
|
data[bindingIndex - 2] = v1;
|
||||||
data[bindingIndex - 1] = v2;
|
data[bindingIndex - 1] = v2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return different ? prefix + stringify(v0) + i0 + stringify(v1) + i1 + stringify(v2) + suffix :
|
return different ? prefix + stringify(v0) + i0 + stringify(v1) + i1 + stringify(v2) + suffix :
|
||||||
NO_CHANGE;
|
NO_CHANGE;
|
||||||
}
|
}
|
||||||
|
@ -1538,19 +1552,18 @@ export function interpolation4(
|
||||||
const part1 = data[bindingIndex++];
|
const part1 = data[bindingIndex++];
|
||||||
const part2 = data[bindingIndex++];
|
const part2 = data[bindingIndex++];
|
||||||
const part3 = data[bindingIndex++];
|
const part3 = data[bindingIndex++];
|
||||||
if (v0 === NO_CHANGE) v0 = part0;
|
|
||||||
if (v1 === NO_CHANGE) v1 = part1;
|
different = isDifferent(part0, v0) || isDifferent(part1, v1) || isDifferent(part2, v2) ||
|
||||||
if (v2 === NO_CHANGE) v2 = part2;
|
isDifferent(part3, v3);
|
||||||
if (v3 === NO_CHANGE) v3 = part3;
|
|
||||||
if (different =
|
if (different) {
|
||||||
(isDifferent(part0, v0) || isDifferent(part1, v1) || isDifferent(part2, v2) ||
|
|
||||||
isDifferent(part3, v3))) {
|
|
||||||
data[bindingIndex - 4] = v0;
|
data[bindingIndex - 4] = v0;
|
||||||
data[bindingIndex - 3] = v1;
|
data[bindingIndex - 3] = v1;
|
||||||
data[bindingIndex - 2] = v2;
|
data[bindingIndex - 2] = v2;
|
||||||
data[bindingIndex - 1] = v3;
|
data[bindingIndex - 1] = v3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return different ?
|
return different ?
|
||||||
prefix + stringify(v0) + i0 + stringify(v1) + i1 + stringify(v2) + i2 + stringify(v3) +
|
prefix + stringify(v0) + i0 + stringify(v1) + i1 + stringify(v2) + i2 + stringify(v3) +
|
||||||
suffix :
|
suffix :
|
||||||
|
@ -1575,15 +1588,11 @@ export function interpolation5(
|
||||||
const part2 = data[bindingIndex++];
|
const part2 = data[bindingIndex++];
|
||||||
const part3 = data[bindingIndex++];
|
const part3 = data[bindingIndex++];
|
||||||
const part4 = data[bindingIndex++];
|
const part4 = data[bindingIndex++];
|
||||||
if (v0 === NO_CHANGE) v0 = part0;
|
|
||||||
if (v1 === NO_CHANGE) v1 = part1;
|
|
||||||
if (v2 === NO_CHANGE) v2 = part2;
|
|
||||||
if (v3 === NO_CHANGE) v3 = part3;
|
|
||||||
if (v4 === NO_CHANGE) v4 = part4;
|
|
||||||
|
|
||||||
if (different =
|
different = isDifferent(part0, v0) || isDifferent(part1, v1) || isDifferent(part2, v2) ||
|
||||||
(isDifferent(part0, v0) || isDifferent(part1, v1) || isDifferent(part2, v2) ||
|
isDifferent(part3, v3) || isDifferent(part4, v4);
|
||||||
isDifferent(part3, v3) || isDifferent(part4, v4))) {
|
|
||||||
|
if (different) {
|
||||||
data[bindingIndex - 5] = v0;
|
data[bindingIndex - 5] = v0;
|
||||||
data[bindingIndex - 4] = v1;
|
data[bindingIndex - 4] = v1;
|
||||||
data[bindingIndex - 3] = v2;
|
data[bindingIndex - 3] = v2;
|
||||||
|
@ -1617,16 +1626,11 @@ export function interpolation6(
|
||||||
const part3 = data[bindingIndex++];
|
const part3 = data[bindingIndex++];
|
||||||
const part4 = data[bindingIndex++];
|
const part4 = data[bindingIndex++];
|
||||||
const part5 = data[bindingIndex++];
|
const part5 = data[bindingIndex++];
|
||||||
if (v0 === NO_CHANGE) v0 = part0;
|
|
||||||
if (v1 === NO_CHANGE) v1 = part1;
|
|
||||||
if (v2 === NO_CHANGE) v2 = part2;
|
|
||||||
if (v3 === NO_CHANGE) v3 = part3;
|
|
||||||
if (v4 === NO_CHANGE) v4 = part4;
|
|
||||||
if (v5 === NO_CHANGE) v5 = part5;
|
|
||||||
|
|
||||||
if (different =
|
different = isDifferent(part0, v0) || isDifferent(part1, v1) || isDifferent(part2, v2) ||
|
||||||
(isDifferent(part0, v0) || isDifferent(part1, v1) || isDifferent(part2, v2) ||
|
isDifferent(part3, v3) || isDifferent(part4, v4) || isDifferent(part5, v5);
|
||||||
isDifferent(part3, v3) || isDifferent(part4, v4) || isDifferent(part5, v5))) {
|
|
||||||
|
if (different) {
|
||||||
data[bindingIndex - 6] = v0;
|
data[bindingIndex - 6] = v0;
|
||||||
data[bindingIndex - 5] = v1;
|
data[bindingIndex - 5] = v1;
|
||||||
data[bindingIndex - 4] = v2;
|
data[bindingIndex - 4] = v2;
|
||||||
|
@ -1664,17 +1668,11 @@ export function interpolation7(
|
||||||
const part4 = data[bindingIndex++];
|
const part4 = data[bindingIndex++];
|
||||||
const part5 = data[bindingIndex++];
|
const part5 = data[bindingIndex++];
|
||||||
const part6 = data[bindingIndex++];
|
const part6 = data[bindingIndex++];
|
||||||
if (v0 === NO_CHANGE) v0 = part0;
|
different = isDifferent(part0, v0) || isDifferent(part1, v1) || isDifferent(part2, v2) ||
|
||||||
if (v1 === NO_CHANGE) v1 = part1;
|
isDifferent(part3, v3) || isDifferent(part4, v4) || isDifferent(part5, v5) ||
|
||||||
if (v2 === NO_CHANGE) v2 = part2;
|
isDifferent(part6, v6);
|
||||||
if (v3 === NO_CHANGE) v3 = part3;
|
|
||||||
if (v4 === NO_CHANGE) v4 = part4;
|
if (different) {
|
||||||
if (v5 === NO_CHANGE) v5 = part5;
|
|
||||||
if (v6 === NO_CHANGE) v6 = part6;
|
|
||||||
if (different =
|
|
||||||
(isDifferent(part0, v0) || isDifferent(part1, v1) || isDifferent(part2, v2) ||
|
|
||||||
isDifferent(part3, v3) || isDifferent(part4, v4) || isDifferent(part5, v5) ||
|
|
||||||
isDifferent(part6, v6))) {
|
|
||||||
data[bindingIndex - 7] = v0;
|
data[bindingIndex - 7] = v0;
|
||||||
data[bindingIndex - 6] = v1;
|
data[bindingIndex - 6] = v1;
|
||||||
data[bindingIndex - 5] = v2;
|
data[bindingIndex - 5] = v2;
|
||||||
|
@ -1684,6 +1682,7 @@ export function interpolation7(
|
||||||
data[bindingIndex - 1] = v6;
|
data[bindingIndex - 1] = v6;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return different ?
|
return different ?
|
||||||
prefix + stringify(v0) + i0 + stringify(v1) + i1 + stringify(v2) + i2 + stringify(v3) + i3 +
|
prefix + stringify(v0) + i0 + stringify(v1) + i1 + stringify(v2) + i2 + stringify(v3) + i3 +
|
||||||
stringify(v4) + i4 + stringify(v5) + i5 + stringify(v6) + suffix :
|
stringify(v4) + i4 + stringify(v5) + i5 + stringify(v6) + suffix :
|
||||||
|
@ -1715,18 +1714,11 @@ export function interpolation8(
|
||||||
const part5 = data[bindingIndex++];
|
const part5 = data[bindingIndex++];
|
||||||
const part6 = data[bindingIndex++];
|
const part6 = data[bindingIndex++];
|
||||||
const part7 = data[bindingIndex++];
|
const part7 = data[bindingIndex++];
|
||||||
if (v0 === NO_CHANGE) v0 = part0;
|
different = isDifferent(part0, v0) || isDifferent(part1, v1) || isDifferent(part2, v2) ||
|
||||||
if (v1 === NO_CHANGE) v1 = part1;
|
isDifferent(part3, v3) || isDifferent(part4, v4) || isDifferent(part5, v5) ||
|
||||||
if (v2 === NO_CHANGE) v2 = part2;
|
isDifferent(part6, v6) || isDifferent(part7, v7);
|
||||||
if (v3 === NO_CHANGE) v3 = part3;
|
|
||||||
if (v4 === NO_CHANGE) v4 = part4;
|
if (different) {
|
||||||
if (v5 === NO_CHANGE) v5 = part5;
|
|
||||||
if (v6 === NO_CHANGE) v6 = part6;
|
|
||||||
if (v7 === NO_CHANGE) v7 = part7;
|
|
||||||
if (different =
|
|
||||||
(isDifferent(part0, v0) || isDifferent(part1, v1) || isDifferent(part2, v2) ||
|
|
||||||
isDifferent(part3, v3) || isDifferent(part4, v4) || isDifferent(part5, v5) ||
|
|
||||||
isDifferent(part6, v6) || isDifferent(part7, v7))) {
|
|
||||||
data[bindingIndex - 8] = v0;
|
data[bindingIndex - 8] = v0;
|
||||||
data[bindingIndex - 7] = v1;
|
data[bindingIndex - 7] = v1;
|
||||||
data[bindingIndex - 6] = v2;
|
data[bindingIndex - 6] = v2;
|
||||||
|
@ -1737,6 +1729,7 @@ export function interpolation8(
|
||||||
data[bindingIndex - 1] = v7;
|
data[bindingIndex - 1] = v7;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return different ?
|
return different ?
|
||||||
prefix + stringify(v0) + i0 + stringify(v1) + i1 + stringify(v2) + i2 + stringify(v3) + i3 +
|
prefix + stringify(v0) + i0 + stringify(v1) + i1 + stringify(v2) + i2 + stringify(v3) + i3 +
|
||||||
stringify(v4) + i4 + stringify(v5) + i5 + stringify(v6) + i6 + stringify(v7) + suffix :
|
stringify(v4) + i4 + stringify(v5) + i5 + stringify(v6) + i6 + stringify(v7) + suffix :
|
||||||
|
|
|
@ -78,46 +78,6 @@ describe('render3 integration test', () => {
|
||||||
expect(renderToHtml(Template, 'twice')).toEqual('once');
|
expect(renderToHtml(Template, 'twice')).toEqual('once');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should support creation-time bindings in interpolations', () => {
|
|
||||||
function Template(v: string, cm: boolean) {
|
|
||||||
if (cm) {
|
|
||||||
text(0);
|
|
||||||
text(1);
|
|
||||||
text(2);
|
|
||||||
text(3);
|
|
||||||
text(4);
|
|
||||||
text(5);
|
|
||||||
text(6);
|
|
||||||
text(7);
|
|
||||||
text(8);
|
|
||||||
}
|
|
||||||
textBinding(0, interpolation1('', cm ? v : NO_CHANGE, '|'));
|
|
||||||
textBinding(1, interpolation2('', v, '_', cm ? v : NO_CHANGE, '|'));
|
|
||||||
textBinding(2, interpolation3('', v, '_', v, '_', cm ? v : NO_CHANGE, '|'));
|
|
||||||
textBinding(3, interpolation4('', v, '_', v, '_', v, '_', cm ? v : NO_CHANGE, '|'));
|
|
||||||
textBinding(4, interpolation5('', v, '_', v, '_', v, '_', v, '_', cm ? v : NO_CHANGE, '|'));
|
|
||||||
textBinding(
|
|
||||||
5, interpolation6('', v, '_', v, '_', v, '_', v, '_', v, '_', cm ? v : NO_CHANGE, '|'));
|
|
||||||
textBinding(
|
|
||||||
6, interpolation7(
|
|
||||||
'', v, '_', v, '_', v, '_', v, '_', v, '_', v, '_', cm ? v : NO_CHANGE, '|'));
|
|
||||||
textBinding(
|
|
||||||
7, interpolation8(
|
|
||||||
'', v, '_', v, '_', v, '_', v, '_', v, '_', v, '_', v, '_', cm ? v : NO_CHANGE,
|
|
||||||
'|'));
|
|
||||||
textBinding(8, interpolationV([
|
|
||||||
'', v, '_', v, '_', v, '_', v, '_', v, '_', v, '_', v, '_', v, '_',
|
|
||||||
cm ? v : NO_CHANGE, ''
|
|
||||||
]));
|
|
||||||
}
|
|
||||||
expect(renderToHtml(Template, 'a'))
|
|
||||||
.toEqual(
|
|
||||||
'a|a_a|a_a_a|a_a_a_a|a_a_a_a_a|a_a_a_a_a_a|a_a_a_a_a_a_a|a_a_a_a_a_a_a_a|a_a_a_a_a_a_a_a_a');
|
|
||||||
expect(renderToHtml(Template, 'A'))
|
|
||||||
.toEqual(
|
|
||||||
'a|A_a|A_A_a|A_A_A_a|A_A_A_A_a|A_A_A_A_A_a|A_A_A_A_A_A_a|A_A_A_A_A_A_A_a|A_A_A_A_A_A_A_A_a');
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('Siblings update', () => {
|
describe('Siblings update', () => {
|
||||||
|
|
Loading…
Reference in New Issue