diff --git a/modules/angular2/src/compiler/output/abstract_emitter.ts b/modules/angular2/src/compiler/output/abstract_emitter.ts index c84d7809ff..2688a6a060 100644 --- a/modules/angular2/src/compiler/output/abstract_emitter.ts +++ b/modules/angular2/src/compiler/output/abstract_emitter.ts @@ -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 { @@ -421,4 +423,4 @@ function _createIndent(count: number): string { res += ' '; } return res; -} \ No newline at end of file +} diff --git a/modules/angular2/test/compiler/output/dart_emitter_spec.ts b/modules/angular2/test/compiler/output/dart_emitter_spec.ts index 264838f9ee..40857cd88f 100644 --- a/modules/angular2/test/compiler/output/dart_emitter_spec.ts +++ b/modules/angular2/test/compiler/output/dart_emitter_spec.ts @@ -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);'); diff --git a/modules/angular2/test/compiler/output/js_emitter_spec.ts b/modules/angular2/test/compiler/output/js_emitter_spec.ts index 49d5bd6cff..2862d47c8a 100644 --- a/modules/angular2/test/compiler/output/js_emitter_spec.ts +++ b/modules/angular2/test/compiler/output/js_emitter_spec.ts @@ -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);'); diff --git a/modules/angular2/test/compiler/output/ts_emitter_spec.ts b/modules/angular2/test/compiler/output/ts_emitter_spec.ts index 802f0e292b..9bae38a06f 100644 --- a/modules/angular2/test/compiler/output/ts_emitter_spec.ts +++ b/modules/angular2/test/compiler/output/ts_emitter_spec.ts @@ -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);'); diff --git a/modules/angular2/test/core/linker/regression_integration_spec.ts b/modules/angular2/test/core/linker/regression_integration_spec.ts index 0851a6efef..233ca73a31 100644 --- a/modules/angular2/test/core/linker/regression_integration_spec.ts +++ b/modules/angular2/test/core/linker/regression_integration_spec.ts @@ -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', () => {