feat(ivy): accept multiple values for exportAs in the compiler (#28001)
exportAs in @Directive metadata supports multiple values, separated by commas. Previously it was treated as a single value string. This commit modifies the compiler to understand that exportAs is a string[]. It stops short of carrying the multiple values through to the runtime. Instead, it only emits the first one. A future commit will modify the runtime to accept all the values. PR Close #28001
This commit is contained in:

committed by
Andrew Kushnir

parent
6003145422
commit
142553abc6
@ -119,7 +119,7 @@ export interface R3DirectiveMetadataFacade {
|
||||
inputs: string[];
|
||||
outputs: string[];
|
||||
usesInheritance: boolean;
|
||||
exportAs: string|null;
|
||||
exportAs: string[]|null;
|
||||
providers: Provider[]|null;
|
||||
}
|
||||
|
||||
|
@ -104,7 +104,7 @@ export interface R3DirectiveMetadata {
|
||||
* Reference name under which to export the directive's type in a template,
|
||||
* if any.
|
||||
*/
|
||||
exportAs: string|null;
|
||||
exportAs: string[]|null;
|
||||
|
||||
/**
|
||||
* The list of providers defined in the directive.
|
||||
|
@ -117,7 +117,9 @@ function baseDirectiveFields(
|
||||
definitionMap.set('outputs', conditionallyCreateMapObjectLiteral(meta.outputs));
|
||||
|
||||
if (meta.exportAs !== null) {
|
||||
definitionMap.set('exportAs', o.literal(meta.exportAs));
|
||||
// TODO: handle multiple exportAs values (currently only the first is taken).
|
||||
const [exportAs] = meta.exportAs;
|
||||
definitionMap.set('exportAs', o.literal(exportAs));
|
||||
}
|
||||
|
||||
return {definitionMap, statements: result.statements};
|
||||
@ -605,7 +607,8 @@ function createTypeForDef(meta: R3DirectiveMetadata, typeBase: o.ExternalReferen
|
||||
return o.expressionType(o.importExpr(typeBase, [
|
||||
typeWithParameters(meta.type, meta.typeArgumentCount),
|
||||
stringAsType(selectorForType),
|
||||
meta.exportAs !== null ? stringAsType(meta.exportAs) : o.NONE_TYPE,
|
||||
// TODO: handle multiple exportAs values (currently only the first is taken).
|
||||
meta.exportAs !== null ? stringArrayAsType(meta.exportAs) : o.NONE_TYPE,
|
||||
stringMapAsType(meta.inputs),
|
||||
stringMapAsType(meta.outputs),
|
||||
stringArrayAsType(meta.queries.map(q => q.propertyName)),
|
||||
|
@ -58,7 +58,7 @@ export interface DirectiveMeta {
|
||||
*
|
||||
* Null otherwise
|
||||
*/
|
||||
exportAs: string|null;
|
||||
exportAs: string[]|null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -259,7 +259,10 @@ class DirectiveBinder<DirectiveT extends DirectiveMeta> implements Visitor {
|
||||
dirTarget = directives.find(dir => dir.isComponent) || null;
|
||||
} else {
|
||||
// This is a reference to a directive exported via exportAs. One should exist.
|
||||
dirTarget = directives.find(dir => dir.exportAs === ref.value) || null;
|
||||
dirTarget =
|
||||
directives.find(
|
||||
dir => dir.exportAs !== null && dir.exportAs.some(value => value === ref.value)) ||
|
||||
null;
|
||||
|
||||
// Check if a matching directive was found, and error if it wasn't.
|
||||
if (dirTarget === null) {
|
||||
|
Reference in New Issue
Block a user