fix(ivy): translate WriteKeyExpr expressions properly (#28523)
Translation of WriteKeyExpr expressions was not implemented in the ngtsc expression translator. This resulted in binding expressions like "target[key] = $event" not compiling. This commit fixes the bug by implementing WriteKeyExpr translation. PR Close #28523
This commit is contained in:
parent
3477610f6d
commit
f8b67712bc
|
@ -166,8 +166,14 @@ class ExpressionTranslatorVisitor implements ExpressionVisitor, StatementVisitor
|
||||||
return context.isStatement ? result : ts.createParen(result);
|
return context.isStatement ? result : ts.createParen(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
visitWriteKeyExpr(expr: WriteKeyExpr, context: Context): never {
|
visitWriteKeyExpr(expr: WriteKeyExpr, context: Context): ts.Expression {
|
||||||
throw new Error('Method not implemented.');
|
const exprContext = context.withExpressionMode;
|
||||||
|
const lhs = ts.createElementAccess(
|
||||||
|
expr.receiver.visitExpression(this, exprContext),
|
||||||
|
expr.index.visitExpression(this, exprContext), );
|
||||||
|
const rhs = expr.value.visitExpression(this, exprContext);
|
||||||
|
const result: ts.Expression = ts.createBinary(lhs, ts.SyntaxKind.EqualsToken, rhs);
|
||||||
|
return context.isStatement ? result : ts.createParen(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
visitWritePropExpr(expr: WritePropExpr, context: Context): ts.BinaryExpression {
|
visitWritePropExpr(expr: WritePropExpr, context: Context): ts.BinaryExpression {
|
||||||
|
|
|
@ -863,6 +863,25 @@ describe('ngtsc behavioral tests', () => {
|
||||||
expect(jsContents).toMatch(contentQueryRegExp('ViewContainerRef', true));
|
expect(jsContents).toMatch(contentQueryRegExp('ViewContainerRef', true));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should compile expressions that write keys', () => {
|
||||||
|
env.tsconfig();
|
||||||
|
env.write(`test.ts`, `
|
||||||
|
import {Component, ContentChild, TemplateRef, ViewContainerRef, forwardRef} from '@angular/core';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'test',
|
||||||
|
template: '<div (click)="test[key] = $event">',
|
||||||
|
})
|
||||||
|
class TestCmp {
|
||||||
|
test: any;
|
||||||
|
key: string;
|
||||||
|
}
|
||||||
|
`);
|
||||||
|
|
||||||
|
env.driveMain();
|
||||||
|
expect(env.getContents('test.js')).toContain('test[key] = $event');
|
||||||
|
});
|
||||||
|
|
||||||
it('should generate host listeners for components', () => {
|
it('should generate host listeners for components', () => {
|
||||||
env.tsconfig();
|
env.tsconfig();
|
||||||
env.write(`test.ts`, `
|
env.write(`test.ts`, `
|
||||||
|
|
Loading…
Reference in New Issue