Skip to content

Commit

Permalink
fix(compiler): don't convert undefined to null literals (#11503)
Browse files Browse the repository at this point in the history
Fixes #11493
  • Loading branch information
pkozlowski-opensource authored and vikerman committed Nov 4, 2016
1 parent 051d748 commit f0cdb42
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 6 deletions.
8 changes: 3 additions & 5 deletions modules/@angular/compiler/src/output/abstract_emitter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -250,13 +250,11 @@ export abstract class AbstractEmitterVisitor implements o.StatementVisitor, o.Ex
ctx.print(`)`);
return null;
}
visitLiteralExpr(ast: o.LiteralExpr, ctx: EmitterVisitorContext, absentValue: string = 'null'):
any {
var value = ast.value;

visitLiteralExpr(ast: o.LiteralExpr, ctx: EmitterVisitorContext): any {
const value = ast.value;
if (typeof value === 'string') {
ctx.print(escapeIdentifier(value, this._escapeDollarInStrings));
} else if (isBlank(value)) {
ctx.print(absentValue);
} else {
ctx.print(`${value}`);
}
Expand Down
7 changes: 6 additions & 1 deletion modules/@angular/compiler/src/output/ts_emitter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,12 @@ class _TsEmitterVisitor extends AbstractEmitterVisitor implements o.TypeVisitor
}

visitLiteralExpr(ast: o.LiteralExpr, ctx: EmitterVisitorContext): any {
super.visitLiteralExpr(ast, ctx, '(null as any)');
const value = ast.value;
if (isBlank(value)) {
ctx.print(`(${value} as any)`);
return null;
}
return super.visitLiteralExpr(ast, ctx);
}


Expand Down
5 changes: 5 additions & 0 deletions modules/@angular/compiler/test/output/js_emitter_spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,11 @@ export function main() {
expect(emitStmt(o.literalMap([['someKey', o.literal(1)]]).toStmt())).toEqual(`{someKey: 1};`);
});

it('should support blank literals', () => {
expect(emitStmt(o.literal(null).toStmt())).toEqual('null;');
expect(emitStmt(o.literal(undefined).toStmt())).toEqual('undefined;');
});

it('should support external identifiers', () => {
expect(emitStmt(o.importExpr(sameModuleIdentifier).toStmt())).toEqual('someLocalId;');
expect(emitStmt(o.importExpr(externalModuleIdentifier).toStmt())).toEqual([
Expand Down
5 changes: 5 additions & 0 deletions modules/@angular/compiler/test/output/ts_emitter_spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,11 @@ export function main() {
expect(emitStmt(o.literalMap([['someKey', o.literal(1)]]).toStmt())).toEqual(`{someKey: 1};`);
});

it('should support blank literals', () => {
expect(emitStmt(o.literal(null).toStmt())).toEqual('(null as any);');
expect(emitStmt(o.literal(undefined).toStmt())).toEqual('(undefined as any);');
});

it('should support external identifiers', () => {
expect(emitStmt(o.importExpr(sameModuleIdentifier).toStmt())).toEqual('someLocalId;');
expect(emitStmt(o.importExpr(externalModuleIdentifier).toStmt())).toEqual([
Expand Down
9 changes: 9 additions & 0 deletions modules/@angular/core/test/linker/integration_spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,15 @@ function declareTests({useJit}: {useJit: boolean}) {
expect(fixture.nativeElement).toHaveText('');
});

it('should allow both null and undefined in expressions', () => {
const template = '<div>{{null == undefined}}|{{null === undefined}}</div>';
const fixture = TestBed.configureTestingModule({declarations: [MyComp]})
.overrideComponent(MyComp, {set: {template}})
.createComponent(MyComp);
fixture.detectChanges();
expect(fixture.nativeElement).toHaveText('true|false');
});

it('should consume element binding changes', () => {
TestBed.configureTestingModule({declarations: [MyComp]});
const template = '<div [id]="ctxProp"></div>';
Expand Down

0 comments on commit f0cdb42

Please sign in to comment.