feat(core): missing-injectable migration should migrate empty object literal providers (#33709)

In View Engine, providers which neither used `useValue`, `useClass`,
`useFactory` or `useExisting`, were interpreted differently.

e.g.

```
{provide: X} -> {provide: X, useValue: undefined}, // this is how it works in View Engine
{provide: X} -> {provide: X, useClass: X}, // this is how it works in Ivy
```

The missing-injectable migration should migrate such providers to the
explicit `useValue` provider. This ensures that there is no unexpected
behavioral change when updating to v9.

PR Close #33709
This commit is contained in:
Paul Gschwendtner
2019-11-14 10:16:07 +01:00
committed by Alex Rickabaugh
parent 1b7aa05699
commit b7c012f91b
10 changed files with 229 additions and 48 deletions

View File

@ -34,9 +34,9 @@ class BaseProviderCase {
constructor(zone: NgZone) {}
}
export class ProvideCase extends BaseProviderCase {}
export class EmptyProviderLiteralCase {}
export class ProviderClass {}
export class ProviderClass extends BaseProviderCase {}
export class DontNeedCase {}
@ -46,7 +46,7 @@ export class DirectiveCase {}
@NgModule({
providers: [
TypeCase,
{provide: ProvideCase},
{provide: EmptyProviderLiteralCase},
{provide: DontNeedCase, useValue: 0},
{provide: DontNeedCase, useFactory: () => null},
{provide: DontNeedCase, useExisting: TypeCase},
@ -56,4 +56,3 @@ export class DirectiveCase {}
declarations: [ProvidersTestDirective, ProvidersTestComponent],
})
export class ProvidersTestModule {}

View File

@ -41,11 +41,10 @@ class BaseProviderCase {
constructor(zone: NgZone) {}
}
@Injectable()
export class ProvideCase extends BaseProviderCase {}
export class EmptyProviderLiteralCase {}
@Injectable()
export class ProviderClass {}
export class ProviderClass extends BaseProviderCase {}
export class DontNeedCase {}
@ -55,7 +54,7 @@ export class DirectiveCase {}
@NgModule({
providers: [
TypeCase,
{provide: ProvideCase},
{ provide: EmptyProviderLiteralCase, useValue: undefined },
{provide: DontNeedCase, useValue: 0},
{provide: DontNeedCase, useFactory: () => null},
{provide: DontNeedCase, useExisting: TypeCase},
@ -65,4 +64,3 @@ export class DirectiveCase {}
declarations: [ProvidersTestDirective, ProvidersTestComponent],
})
export class ProvidersTestModule {}