fix(ivy): properly inject all special token types (#24862)
Previously ngtsc had a few bugs handling special token types: * Injector was not properly translated to INJECTOR * ChangeDetectorRef was not injected via injectChangeDetectorRef() This commit fixes these two bugs, and also adds a test to ensure they continue to work correctly. PR Close #24862
This commit is contained in:

committed by
Victor Berchet

parent
53a16006d6
commit
f9a6a175bf
@ -22,8 +22,15 @@ export const Injectable = callableClassDecorator();
|
||||
export const NgModule = callableClassDecorator();
|
||||
export const Pipe = callableClassDecorator();
|
||||
|
||||
export const Attribute = callableParamDecorator();
|
||||
export const Inject = callableParamDecorator();
|
||||
export const Self = callableParamDecorator();
|
||||
export const SkipSelf = callableParamDecorator();
|
||||
export const Optional = callableParamDecorator();
|
||||
export type ModuleWithProviders<T> = any;
|
||||
|
||||
export class ChangeDetectorRef {}
|
||||
export class ElementRef {}
|
||||
export class Injector {}
|
||||
export class TemplateRef {}
|
||||
export class ViewContainerRef {}
|
@ -370,4 +370,42 @@ describe('ngtsc behavioral tests', () => {
|
||||
expect(dtsContents).toContain(`import * as i1 from 'router';`);
|
||||
expect(dtsContents).toContain('i0.ɵNgModuleDef<TestModule, [], [i1.RouterModule], []>');
|
||||
});
|
||||
|
||||
it('should inject special types according to the metadata', () => {
|
||||
writeConfig();
|
||||
write(`test.ts`, `
|
||||
import {
|
||||
Attribute,
|
||||
ChangeDetectorRef,
|
||||
Component,
|
||||
ElementRef,
|
||||
Injector,
|
||||
TemplateRef,
|
||||
ViewContainerRef,
|
||||
} from '@angular/core';
|
||||
|
||||
@Component({
|
||||
selector: 'test',
|
||||
template: 'Test',
|
||||
})
|
||||
class FooCmp {
|
||||
constructor(
|
||||
@Attribute("test") attr: string,
|
||||
cdr: ChangeDetectorRef,
|
||||
er: ElementRef,
|
||||
i: Injector,
|
||||
tr: TemplateRef,
|
||||
vcr: ViewContainerRef,
|
||||
) {}
|
||||
}
|
||||
`);
|
||||
|
||||
const exitCode = main(['-p', basePath], errorSpy);
|
||||
expect(errorSpy).not.toHaveBeenCalled();
|
||||
expect(exitCode).toBe(0);
|
||||
const jsContents = getContents('test.js');
|
||||
expect(jsContents)
|
||||
.toContain(
|
||||
`factory: function FooCmp_Factory() { return new FooCmp(i0.ɵinjectAttribute("test"), i0.ɵinjectChangeDetectorRef(), i0.ɵinjectElementRef(), i0.ɵdirectiveInject(i0.INJECTOR), i0.ɵinjectTemplateRef(), i0.ɵinjectViewContainerRef()); }`);
|
||||
});
|
||||
});
|
||||
|
Reference in New Issue
Block a user