Skip to content

Commit

Permalink
fix(core): properly evaluate expressions with conditional and boolean…
Browse files Browse the repository at this point in the history
… operators

Fixes #8235
Fixes #8244

Closes #8282
  • Loading branch information
pkozlowski-opensource committed Apr 27, 2016
1 parent 1e8864c commit 1ad2a02
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 4 deletions.
4 changes: 3 additions & 1 deletion modules/angular2/src/compiler/output/abstract_emitter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -264,11 +264,13 @@ export abstract class AbstractEmitterVisitor implements o.StatementVisitor, o.Ex
abstract visitExternalExpr(ast: o.ExternalExpr, ctx: EmitterVisitorContext): any;

visitConditionalExpr(ast: o.ConditionalExpr, ctx: EmitterVisitorContext): any {
ctx.print(`(`);
ast.condition.visitExpression(this, ctx);
ctx.print('? ');
ast.trueCase.visitExpression(this, ctx);
ctx.print(': ');
ast.falseCase.visitExpression(this, ctx);
ctx.print(`)`);
return null;
}
visitNotExpr(ast: o.NotExpr, ctx: EmitterVisitorContext): any {
Expand Down Expand Up @@ -421,4 +423,4 @@ function _createIndent(count: number): string {
res += ' ';
}
return res;
}
}
2 changes: 1 addition & 1 deletion modules/angular2/test/compiler/output/dart_emitter_spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ export function main() {
expect(emitStmt(o.not(someVar).toStmt())).toEqual('!someVar;');
expect(
emitStmt(someVar.conditional(o.variable('trueCase'), o.variable('falseCase')).toStmt()))
.toEqual('someVar? trueCase: falseCase;');
.toEqual('(someVar? trueCase: falseCase);');

expect(emitStmt(lhs.equals(rhs).toStmt())).toEqual('(lhs == rhs);');
expect(emitStmt(lhs.notEquals(rhs).toStmt())).toEqual('(lhs != rhs);');
Expand Down
2 changes: 1 addition & 1 deletion modules/angular2/test/compiler/output/js_emitter_spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ export function main() {
expect(emitStmt(o.not(someVar).toStmt())).toEqual('!someVar;');
expect(
emitStmt(someVar.conditional(o.variable('trueCase'), o.variable('falseCase')).toStmt()))
.toEqual('someVar? trueCase: falseCase;');
.toEqual('(someVar? trueCase: falseCase);');

expect(emitStmt(lhs.equals(rhs).toStmt())).toEqual('(lhs == rhs);');
expect(emitStmt(lhs.notEquals(rhs).toStmt())).toEqual('(lhs != rhs);');
Expand Down
2 changes: 1 addition & 1 deletion modules/angular2/test/compiler/output/ts_emitter_spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ export function main() {
expect(emitStmt(o.not(someVar).toStmt())).toEqual('!someVar;');
expect(
emitStmt(someVar.conditional(o.variable('trueCase'), o.variable('falseCase')).toStmt()))
.toEqual('someVar? trueCase: falseCase;');
.toEqual('(someVar? trueCase: falseCase);');

expect(emitStmt(lhs.equals(rhs).toStmt())).toEqual('(lhs == rhs);');
expect(emitStmt(lhs.notEquals(rhs).toStmt())).toEqual('(lhs != rhs);');
Expand Down
28 changes: 28 additions & 0 deletions modules/angular2/test/core/linker/regression_integration_spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,35 @@ function declareTests(isJit: boolean) {
async.done();
});
}));
});

describe('expressions', () => {

it('should evaluate conditional and boolean operators with right precedence - #8244',
inject([TestComponentBuilder, AsyncTestCompleter], (tcb: TestComponentBuilder, async) => {
tcb.overrideView(MyComp,
new ViewMetadata({template: `{{'red' + (true ? ' border' : '')}}`}))
.createAsync(MyComp)
.then((fixture) => {
fixture.detectChanges();
expect(fixture.nativeElement).toHaveText('red border');
async.done();
});
}));

if (!IS_DART) {
it('should evaluate conditional and unary operators with right precedence - #8235',
inject([TestComponentBuilder, AsyncTestCompleter],
(tcb: TestComponentBuilder, async) => {
tcb.overrideView(MyComp, new ViewMetadata({template: `{{!null?.length}}`}))
.createAsync(MyComp)
.then((fixture) => {
fixture.detectChanges();
expect(fixture.nativeElement).toHaveText('true');
async.done();
});
}));
}
});

describe('providers', () => {
Expand Down

0 comments on commit 1ad2a02

Please sign in to comment.