
By its nature, Ivy alters the import graph of a TS program, adding imports where template dependencies exist. For example, if ComponentA uses PipeB in its template, Ivy will insert an import of PipeB into the file in which ComponentA is declared. Any insertion of an import into a program has the potential to introduce a cycle into the import graph. If for some reason the file in which PipeB is declared imports the file in which ComponentA is declared (maybe it makes use of a service or utility function that happens to be in the same file as ComponentA) then this could create an import cycle. This turns out to happen quite regularly in larger Angular codebases. TypeScript and the Ivy runtime have no issues with such cycles. However, other tools are not so accepting. In particular the Closure Compiler is very anti-cycle. To mitigate this problem, it's necessary to detect when the insertion of an import would create a cycle. ngtsc can then use a different strategy, known as "remote scoping", instead of directly writing a reference from one component to another. Under remote scoping, a function 'setComponentScope' is called after the declaration of the component's module, which does not require the addition of new imports. FW-647 #resolve PR Close #28169
226 lines
10 KiB
TypeScript
226 lines
10 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright Google Inc. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
* found in the LICENSE file at https://angular.io/license
|
|
*/
|
|
|
|
import * as o from '../output/output_ast';
|
|
|
|
const CORE = '@angular/core';
|
|
|
|
export class Identifiers {
|
|
/* Methods */
|
|
static NEW_METHOD = 'factory';
|
|
static TRANSFORM_METHOD = 'transform';
|
|
static PATCH_DEPS = 'patchedDeps';
|
|
|
|
/* Instructions */
|
|
static namespaceHTML: o.ExternalReference = {name: 'ɵnamespaceHTML', moduleName: CORE};
|
|
|
|
static namespaceMathML: o.ExternalReference = {name: 'ɵnamespaceMathML', moduleName: CORE};
|
|
|
|
static namespaceSVG: o.ExternalReference = {name: 'ɵnamespaceSVG', moduleName: CORE};
|
|
|
|
static element: o.ExternalReference = {name: 'ɵelement', moduleName: CORE};
|
|
|
|
static elementStart: o.ExternalReference = {name: 'ɵelementStart', moduleName: CORE};
|
|
|
|
static elementEnd: o.ExternalReference = {name: 'ɵelementEnd', moduleName: CORE};
|
|
|
|
static elementProperty: o.ExternalReference = {name: 'ɵelementProperty', moduleName: CORE};
|
|
|
|
static componentHostSyntheticProperty:
|
|
o.ExternalReference = {name: 'ɵcomponentHostSyntheticProperty', moduleName: CORE};
|
|
|
|
static componentHostSyntheticListener:
|
|
o.ExternalReference = {name: 'ɵcomponentHostSyntheticListener', moduleName: CORE};
|
|
|
|
static elementAttribute: o.ExternalReference = {name: 'ɵelementAttribute', moduleName: CORE};
|
|
|
|
static elementClassProp: o.ExternalReference = {name: 'ɵelementClassProp', moduleName: CORE};
|
|
|
|
static elementContainerStart:
|
|
o.ExternalReference = {name: 'ɵelementContainerStart', moduleName: CORE};
|
|
|
|
static elementContainerEnd:
|
|
o.ExternalReference = {name: 'ɵelementContainerEnd', moduleName: CORE};
|
|
|
|
static elementStyling: o.ExternalReference = {name: 'ɵelementStyling', moduleName: CORE};
|
|
|
|
static elementHostAttrs: o.ExternalReference = {name: 'ɵelementHostAttrs', moduleName: CORE};
|
|
|
|
static elementStylingMap: o.ExternalReference = {name: 'ɵelementStylingMap', moduleName: CORE};
|
|
|
|
static elementStyleProp: o.ExternalReference = {name: 'ɵelementStyleProp', moduleName: CORE};
|
|
|
|
static elementStylingApply:
|
|
o.ExternalReference = {name: 'ɵelementStylingApply', moduleName: CORE};
|
|
|
|
static containerCreate: o.ExternalReference = {name: 'ɵcontainer', moduleName: CORE};
|
|
|
|
static nextContext: o.ExternalReference = {name: 'ɵnextContext', moduleName: CORE};
|
|
|
|
static templateCreate: o.ExternalReference = {name: 'ɵtemplate', moduleName: CORE};
|
|
|
|
static text: o.ExternalReference = {name: 'ɵtext', moduleName: CORE};
|
|
|
|
static textBinding: o.ExternalReference = {name: 'ɵtextBinding', moduleName: CORE};
|
|
|
|
static bind: o.ExternalReference = {name: 'ɵbind', moduleName: CORE};
|
|
|
|
static enableBindings: o.ExternalReference = {name: 'ɵenableBindings', moduleName: CORE};
|
|
|
|
static disableBindings: o.ExternalReference = {name: 'ɵdisableBindings', moduleName: CORE};
|
|
|
|
static allocHostVars: o.ExternalReference = {name: 'ɵallocHostVars', moduleName: CORE};
|
|
|
|
static getCurrentView: o.ExternalReference = {name: 'ɵgetCurrentView', moduleName: CORE};
|
|
|
|
static restoreView: o.ExternalReference = {name: 'ɵrestoreView', moduleName: CORE};
|
|
|
|
static interpolation1: o.ExternalReference = {name: 'ɵinterpolation1', moduleName: CORE};
|
|
static interpolation2: o.ExternalReference = {name: 'ɵinterpolation2', moduleName: CORE};
|
|
static interpolation3: o.ExternalReference = {name: 'ɵinterpolation3', moduleName: CORE};
|
|
static interpolation4: o.ExternalReference = {name: 'ɵinterpolation4', moduleName: CORE};
|
|
static interpolation5: o.ExternalReference = {name: 'ɵinterpolation5', moduleName: CORE};
|
|
static interpolation6: o.ExternalReference = {name: 'ɵinterpolation6', moduleName: CORE};
|
|
static interpolation7: o.ExternalReference = {name: 'ɵinterpolation7', moduleName: CORE};
|
|
static interpolation8: o.ExternalReference = {name: 'ɵinterpolation8', moduleName: CORE};
|
|
static interpolationV: o.ExternalReference = {name: 'ɵinterpolationV', moduleName: CORE};
|
|
|
|
static pureFunction0: o.ExternalReference = {name: 'ɵpureFunction0', moduleName: CORE};
|
|
static pureFunction1: o.ExternalReference = {name: 'ɵpureFunction1', moduleName: CORE};
|
|
static pureFunction2: o.ExternalReference = {name: 'ɵpureFunction2', moduleName: CORE};
|
|
static pureFunction3: o.ExternalReference = {name: 'ɵpureFunction3', moduleName: CORE};
|
|
static pureFunction4: o.ExternalReference = {name: 'ɵpureFunction4', moduleName: CORE};
|
|
static pureFunction5: o.ExternalReference = {name: 'ɵpureFunction5', moduleName: CORE};
|
|
static pureFunction6: o.ExternalReference = {name: 'ɵpureFunction6', moduleName: CORE};
|
|
static pureFunction7: o.ExternalReference = {name: 'ɵpureFunction7', moduleName: CORE};
|
|
static pureFunction8: o.ExternalReference = {name: 'ɵpureFunction8', moduleName: CORE};
|
|
static pureFunctionV: o.ExternalReference = {name: 'ɵpureFunctionV', moduleName: CORE};
|
|
|
|
static pipeBind1: o.ExternalReference = {name: 'ɵpipeBind1', moduleName: CORE};
|
|
static pipeBind2: o.ExternalReference = {name: 'ɵpipeBind2', moduleName: CORE};
|
|
static pipeBind3: o.ExternalReference = {name: 'ɵpipeBind3', moduleName: CORE};
|
|
static pipeBind4: o.ExternalReference = {name: 'ɵpipeBind4', moduleName: CORE};
|
|
static pipeBindV: o.ExternalReference = {name: 'ɵpipeBindV', moduleName: CORE};
|
|
|
|
static i18n: o.ExternalReference = {name: 'ɵi18n', moduleName: CORE};
|
|
static i18nAttributes: o.ExternalReference = {name: 'ɵi18nAttributes', moduleName: CORE};
|
|
static i18nExp: o.ExternalReference = {name: 'ɵi18nExp', moduleName: CORE};
|
|
static i18nStart: o.ExternalReference = {name: 'ɵi18nStart', moduleName: CORE};
|
|
static i18nEnd: o.ExternalReference = {name: 'ɵi18nEnd', moduleName: CORE};
|
|
static i18nApply: o.ExternalReference = {name: 'ɵi18nApply', moduleName: CORE};
|
|
static i18nPostprocess: o.ExternalReference = {name: 'ɵi18nPostprocess', moduleName: CORE};
|
|
|
|
static load: o.ExternalReference = {name: 'ɵload', moduleName: CORE};
|
|
static loadQueryList: o.ExternalReference = {name: 'ɵloadQueryList', moduleName: CORE};
|
|
|
|
static pipe: o.ExternalReference = {name: 'ɵpipe', moduleName: CORE};
|
|
|
|
static projection: o.ExternalReference = {name: 'ɵprojection', moduleName: CORE};
|
|
static projectionDef: o.ExternalReference = {name: 'ɵprojectionDef', moduleName: CORE};
|
|
|
|
static reference: o.ExternalReference = {name: 'ɵreference', moduleName: CORE};
|
|
|
|
static inject: o.ExternalReference = {name: 'inject', moduleName: CORE};
|
|
|
|
static injectAttribute: o.ExternalReference = {name: 'ɵinjectAttribute', moduleName: CORE};
|
|
|
|
static directiveInject: o.ExternalReference = {name: 'ɵdirectiveInject', moduleName: CORE};
|
|
|
|
static templateRefExtractor:
|
|
o.ExternalReference = {name: 'ɵtemplateRefExtractor', moduleName: CORE};
|
|
|
|
static resolveWindow: o.ExternalReference = {name: 'ɵresolveWindow', moduleName: CORE};
|
|
static resolveDocument: o.ExternalReference = {name: 'ɵresolveDocument', moduleName: CORE};
|
|
static resolveBody: o.ExternalReference = {name: 'ɵresolveBody', moduleName: CORE};
|
|
|
|
static defineBase: o.ExternalReference = {name: 'ɵdefineBase', moduleName: CORE};
|
|
|
|
static BaseDef: o.ExternalReference = {
|
|
name: 'ɵBaseDef',
|
|
moduleName: CORE,
|
|
};
|
|
|
|
static defineComponent: o.ExternalReference = {name: 'ɵdefineComponent', moduleName: CORE};
|
|
|
|
static setComponentScope: o.ExternalReference = {name: 'ɵsetComponentScope', moduleName: CORE};
|
|
|
|
static ComponentDefWithMeta: o.ExternalReference = {
|
|
name: 'ɵComponentDefWithMeta',
|
|
moduleName: CORE,
|
|
};
|
|
|
|
static defineDirective: o.ExternalReference = {
|
|
name: 'ɵdefineDirective',
|
|
moduleName: CORE,
|
|
};
|
|
|
|
static DirectiveDefWithMeta: o.ExternalReference = {
|
|
name: 'ɵDirectiveDefWithMeta',
|
|
moduleName: CORE,
|
|
};
|
|
|
|
static InjectorDef: o.ExternalReference = {
|
|
name: 'ɵInjectorDef',
|
|
moduleName: CORE,
|
|
};
|
|
|
|
static defineInjector: o.ExternalReference = {
|
|
name: 'defineInjector',
|
|
moduleName: CORE,
|
|
};
|
|
|
|
static NgModuleDefWithMeta: o.ExternalReference = {
|
|
name: 'ɵNgModuleDefWithMeta',
|
|
moduleName: CORE,
|
|
};
|
|
|
|
static defineNgModule: o.ExternalReference = {name: 'ɵdefineNgModule', moduleName: CORE};
|
|
|
|
static PipeDefWithMeta: o.ExternalReference = {name: 'ɵPipeDefWithMeta', moduleName: CORE};
|
|
|
|
static definePipe: o.ExternalReference = {name: 'ɵdefinePipe', moduleName: CORE};
|
|
|
|
static query: o.ExternalReference = {name: 'ɵquery', moduleName: CORE};
|
|
static queryRefresh: o.ExternalReference = {name: 'ɵqueryRefresh', moduleName: CORE};
|
|
static viewQuery: o.ExternalReference = {name: 'ɵviewQuery', moduleName: CORE};
|
|
static loadViewQuery: o.ExternalReference = {name: 'ɵloadViewQuery', moduleName: CORE};
|
|
static registerContentQuery:
|
|
o.ExternalReference = {name: 'ɵregisterContentQuery', moduleName: CORE};
|
|
|
|
static NgOnChangesFeature: o.ExternalReference = {name: 'ɵNgOnChangesFeature', moduleName: CORE};
|
|
|
|
static InheritDefinitionFeature:
|
|
o.ExternalReference = {name: 'ɵInheritDefinitionFeature', moduleName: CORE};
|
|
|
|
static ProvidersFeature: o.ExternalReference = {name: 'ɵProvidersFeature', moduleName: CORE};
|
|
|
|
static listener: o.ExternalReference = {name: 'ɵlistener', moduleName: CORE};
|
|
|
|
static getFactoryOf: o.ExternalReference = {
|
|
name: 'ɵgetFactoryOf',
|
|
moduleName: CORE,
|
|
};
|
|
|
|
static getInheritedFactory: o.ExternalReference = {
|
|
name: 'ɵgetInheritedFactory',
|
|
moduleName: CORE,
|
|
};
|
|
|
|
// sanitization-related functions
|
|
static sanitizeHtml: o.ExternalReference = {name: 'ɵsanitizeHtml', moduleName: CORE};
|
|
static sanitizeStyle: o.ExternalReference = {name: 'ɵsanitizeStyle', moduleName: CORE};
|
|
static defaultStyleSanitizer:
|
|
o.ExternalReference = {name: 'ɵdefaultStyleSanitizer', moduleName: CORE};
|
|
static sanitizeResourceUrl:
|
|
o.ExternalReference = {name: 'ɵsanitizeResourceUrl', moduleName: CORE};
|
|
static sanitizeScript: o.ExternalReference = {name: 'ɵsanitizeScript', moduleName: CORE};
|
|
static sanitizeUrl: o.ExternalReference = {name: 'ɵsanitizeUrl', moduleName: CORE};
|
|
static sanitizeUrlOrResourceUrl:
|
|
o.ExternalReference = {name: 'ɵsanitizeUrlOrResourceUrl', moduleName: CORE};
|
|
}
|