refactor(ngcc): move `ClassSymbol` to become `NgccClassSymbol` (#32539)
PR Close #32539
This commit is contained in:
parent
222af38462
commit
2279cb8dc0
|
@ -14,10 +14,9 @@ import {FileSystem, LogicalFileSystem, absoluteFrom, dirname, resolve} from '../
|
||||||
import {AbsoluteModuleStrategy, LocalIdentifierStrategy, LogicalProjectStrategy, ModuleResolver, NOOP_DEFAULT_IMPORT_RECORDER, ReferenceEmitter} from '../../../src/ngtsc/imports';
|
import {AbsoluteModuleStrategy, LocalIdentifierStrategy, LogicalProjectStrategy, ModuleResolver, NOOP_DEFAULT_IMPORT_RECORDER, ReferenceEmitter} from '../../../src/ngtsc/imports';
|
||||||
import {CompoundMetadataReader, CompoundMetadataRegistry, DtsMetadataReader, LocalMetadataRegistry} from '../../../src/ngtsc/metadata';
|
import {CompoundMetadataReader, CompoundMetadataRegistry, DtsMetadataReader, LocalMetadataRegistry} from '../../../src/ngtsc/metadata';
|
||||||
import {PartialEvaluator} from '../../../src/ngtsc/partial_evaluator';
|
import {PartialEvaluator} from '../../../src/ngtsc/partial_evaluator';
|
||||||
import {ClassSymbol} from '../../../src/ngtsc/reflection';
|
|
||||||
import {LocalModuleScopeRegistry, MetadataDtsModuleScopeResolver} from '../../../src/ngtsc/scope';
|
import {LocalModuleScopeRegistry, MetadataDtsModuleScopeResolver} from '../../../src/ngtsc/scope';
|
||||||
import {CompileResult, DecoratorHandler, DetectResult, HandlerPrecedence} from '../../../src/ngtsc/transform';
|
import {CompileResult, DecoratorHandler, DetectResult, HandlerPrecedence} from '../../../src/ngtsc/transform';
|
||||||
import {NgccReflectionHost} from '../host/ngcc_host';
|
import {NgccClassSymbol, NgccReflectionHost} from '../host/ngcc_host';
|
||||||
import {Migration, MigrationHost} from '../migrations/migration';
|
import {Migration, MigrationHost} from '../migrations/migration';
|
||||||
import {EntryPointBundle} from '../packages/entry_point_bundle';
|
import {EntryPointBundle} from '../packages/entry_point_bundle';
|
||||||
import {isDefined} from '../utils';
|
import {isDefined} from '../utils';
|
||||||
|
@ -128,7 +127,7 @@ export class DecorationAnalyzer {
|
||||||
return analyzedClasses.length ? {sourceFile, analyzedClasses} : undefined;
|
return analyzedClasses.length ? {sourceFile, analyzedClasses} : undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected analyzeClass(symbol: ClassSymbol): AnalyzedClass|null {
|
protected analyzeClass(symbol: NgccClassSymbol): AnalyzedClass|null {
|
||||||
const decorators = this.reflectionHost.getDecoratorsOfSymbol(symbol);
|
const decorators = this.reflectionHost.getDecoratorsOfSymbol(symbol);
|
||||||
const analyzedClass = analyzeDecorators(symbol, decorators, this.handlers);
|
const analyzedClass = analyzeDecorators(symbol, decorators, this.handlers);
|
||||||
if (analyzedClass !== null && analyzedClass.diagnostics !== undefined) {
|
if (analyzedClass !== null && analyzedClass.diagnostics !== undefined) {
|
||||||
|
|
|
@ -9,8 +9,9 @@ import * as ts from 'typescript';
|
||||||
|
|
||||||
import {isFatalDiagnosticError} from '../../../src/ngtsc/diagnostics';
|
import {isFatalDiagnosticError} from '../../../src/ngtsc/diagnostics';
|
||||||
import {AbsoluteFsPath, absoluteFromSourceFile, relative} from '../../../src/ngtsc/file_system';
|
import {AbsoluteFsPath, absoluteFromSourceFile, relative} from '../../../src/ngtsc/file_system';
|
||||||
import {ClassSymbol, Decorator} from '../../../src/ngtsc/reflection';
|
import {Decorator} from '../../../src/ngtsc/reflection';
|
||||||
import {DecoratorHandler, DetectResult, HandlerPrecedence} from '../../../src/ngtsc/transform';
|
import {DecoratorHandler, DetectResult, HandlerPrecedence} from '../../../src/ngtsc/transform';
|
||||||
|
import {NgccClassSymbol} from '../host/ngcc_host';
|
||||||
|
|
||||||
import {AnalyzedClass, MatchingHandler} from './types';
|
import {AnalyzedClass, MatchingHandler} from './types';
|
||||||
|
|
||||||
|
@ -19,7 +20,7 @@ export function isWithinPackage(packagePath: AbsoluteFsPath, sourceFile: ts.Sour
|
||||||
}
|
}
|
||||||
|
|
||||||
export function analyzeDecorators(
|
export function analyzeDecorators(
|
||||||
symbol: ClassSymbol, decorators: Decorator[] | null,
|
symbol: NgccClassSymbol, decorators: Decorator[] | null,
|
||||||
handlers: DecoratorHandler<any, any>[]): AnalyzedClass|null {
|
handlers: DecoratorHandler<any, any>[]): AnalyzedClass|null {
|
||||||
const declaration = symbol.valueDeclaration;
|
const declaration = symbol.valueDeclaration;
|
||||||
const matchingHandlers = handlers
|
const matchingHandlers = handlers
|
||||||
|
|
|
@ -8,12 +8,13 @@
|
||||||
|
|
||||||
import * as ts from 'typescript';
|
import * as ts from 'typescript';
|
||||||
import {absoluteFrom} from '../../../src/ngtsc/file_system';
|
import {absoluteFrom} from '../../../src/ngtsc/file_system';
|
||||||
import {ClassSymbol, Declaration, Import} from '../../../src/ngtsc/reflection';
|
import {Declaration, Import} from '../../../src/ngtsc/reflection';
|
||||||
import {Logger} from '../logging/logger';
|
import {Logger} from '../logging/logger';
|
||||||
import {BundleProgram} from '../packages/bundle_program';
|
import {BundleProgram} from '../packages/bundle_program';
|
||||||
import {isDefined} from '../utils';
|
import {isDefined} from '../utils';
|
||||||
|
|
||||||
import {Esm5ReflectionHost} from './esm5_host';
|
import {Esm5ReflectionHost} from './esm5_host';
|
||||||
|
import {NgccClassSymbol} from './ngcc_host';
|
||||||
|
|
||||||
export class CommonJsReflectionHost extends Esm5ReflectionHost {
|
export class CommonJsReflectionHost extends Esm5ReflectionHost {
|
||||||
protected commonJsExports = new Map<ts.SourceFile, Map<string, Declaration>|null>();
|
protected commonJsExports = new Map<ts.SourceFile, Map<string, Declaration>|null>();
|
||||||
|
@ -57,7 +58,7 @@ export class CommonJsReflectionHost extends Esm5ReflectionHost {
|
||||||
* @param helperName the name of the helper (e.g. `__decorate`) whose calls we are interested in.
|
* @param helperName the name of the helper (e.g. `__decorate`) whose calls we are interested in.
|
||||||
* @returns an array of nodes of calls to the helper with the given name.
|
* @returns an array of nodes of calls to the helper with the given name.
|
||||||
*/
|
*/
|
||||||
protected getHelperCallsForClass(classSymbol: ClassSymbol, helperName: string):
|
protected getHelperCallsForClass(classSymbol: NgccClassSymbol, helperName: string):
|
||||||
ts.CallExpression[] {
|
ts.CallExpression[] {
|
||||||
const esm5HelperCalls = super.getHelperCallsForClass(classSymbol, helperName);
|
const esm5HelperCalls = super.getHelperCallsForClass(classSymbol, helperName);
|
||||||
if (esm5HelperCalls.length > 0) {
|
if (esm5HelperCalls.length > 0) {
|
||||||
|
|
|
@ -9,13 +9,13 @@
|
||||||
import * as ts from 'typescript';
|
import * as ts from 'typescript';
|
||||||
|
|
||||||
import {AbsoluteFsPath} from '../../../src/ngtsc/file_system';
|
import {AbsoluteFsPath} from '../../../src/ngtsc/file_system';
|
||||||
import {ClassDeclaration, ClassMember, ClassMemberKind, ClassSymbol, ConcreteDeclaration, CtorParameter, Declaration, Decorator, TypeScriptReflectionHost, isDecoratorIdentifier, reflectObjectLiteral} from '../../../src/ngtsc/reflection';
|
import {ClassDeclaration, ClassMember, ClassMemberKind, ConcreteDeclaration, CtorParameter, Declaration, Decorator, TypeScriptReflectionHost, isDecoratorIdentifier, reflectObjectLiteral} from '../../../src/ngtsc/reflection';
|
||||||
import {isWithinPackage} from '../analysis/util';
|
import {isWithinPackage} from '../analysis/util';
|
||||||
import {Logger} from '../logging/logger';
|
import {Logger} from '../logging/logger';
|
||||||
import {BundleProgram} from '../packages/bundle_program';
|
import {BundleProgram} from '../packages/bundle_program';
|
||||||
import {findAll, getNameText, hasNameIdentifier, isDefined, stripDollarSuffix} from '../utils';
|
import {findAll, getNameText, hasNameIdentifier, isDefined, stripDollarSuffix} from '../utils';
|
||||||
|
|
||||||
import {ModuleWithProvidersFunction, NgccReflectionHost, PRE_R3_MARKER, SwitchableVariableDeclaration, isSwitchableVariableDeclaration} from './ngcc_host';
|
import {ModuleWithProvidersFunction, NgccClassSymbol, NgccReflectionHost, PRE_R3_MARKER, SwitchableVariableDeclaration, isSwitchableVariableDeclaration} from './ngcc_host';
|
||||||
|
|
||||||
export const DECORATORS = 'decorators' as ts.__String;
|
export const DECORATORS = 'decorators' as ts.__String;
|
||||||
export const PROP_DECORATORS = 'propDecorators' as ts.__String;
|
export const PROP_DECORATORS = 'propDecorators' as ts.__String;
|
||||||
|
@ -116,10 +116,10 @@ export class Esm2015ReflectionHost extends TypeScriptReflectionHost implements N
|
||||||
* @param node the node whose symbol we are finding.
|
* @param node the node whose symbol we are finding.
|
||||||
* @returns the symbol for the node or `undefined` if it is not a "class" or has no symbol.
|
* @returns the symbol for the node or `undefined` if it is not a "class" or has no symbol.
|
||||||
*/
|
*/
|
||||||
getClassSymbol(declaration: ts.Node): ClassSymbol|undefined {
|
getClassSymbol(declaration: ts.Node): NgccClassSymbol|undefined {
|
||||||
const classDeclaration = this.getClassDeclaration(declaration);
|
const classDeclaration = this.getClassDeclaration(declaration);
|
||||||
return classDeclaration &&
|
return classDeclaration &&
|
||||||
this.checker.getSymbolAtLocation(classDeclaration.name) as ClassSymbol;
|
this.checker.getSymbolAtLocation(classDeclaration.name) as NgccClassSymbol;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -256,7 +256,7 @@ export class Esm2015ReflectionHost extends TypeScriptReflectionHost implements N
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Gets all decorators of the given class symbol. */
|
/** Gets all decorators of the given class symbol. */
|
||||||
getDecoratorsOfSymbol(symbol: ClassSymbol): Decorator[]|null {
|
getDecoratorsOfSymbol(symbol: NgccClassSymbol): Decorator[]|null {
|
||||||
const {classDecorators} = this.acquireDecoratorInfo(symbol);
|
const {classDecorators} = this.acquireDecoratorInfo(symbol);
|
||||||
return classDecorators;
|
return classDecorators;
|
||||||
}
|
}
|
||||||
|
@ -338,8 +338,8 @@ export class Esm2015ReflectionHost extends TypeScriptReflectionHost implements N
|
||||||
* @param sourceFile The source file to search for classes.
|
* @param sourceFile The source file to search for classes.
|
||||||
* @returns An array of class symbols.
|
* @returns An array of class symbols.
|
||||||
*/
|
*/
|
||||||
findClassSymbols(sourceFile: ts.SourceFile): ClassSymbol[] {
|
findClassSymbols(sourceFile: ts.SourceFile): NgccClassSymbol[] {
|
||||||
const classes: ClassSymbol[] = [];
|
const classes: NgccClassSymbol[] = [];
|
||||||
this.getModuleStatements(sourceFile).forEach(statement => {
|
this.getModuleStatements(sourceFile).forEach(statement => {
|
||||||
if (ts.isVariableStatement(statement)) {
|
if (ts.isVariableStatement(statement)) {
|
||||||
statement.declarationList.declarations.forEach(declaration => {
|
statement.declarationList.declarations.forEach(declaration => {
|
||||||
|
@ -547,7 +547,8 @@ export class Esm2015ReflectionHost extends TypeScriptReflectionHost implements N
|
||||||
* @param propertyName the name of static property.
|
* @param propertyName the name of static property.
|
||||||
* @returns the symbol if it is found or `undefined` if not.
|
* @returns the symbol if it is found or `undefined` if not.
|
||||||
*/
|
*/
|
||||||
protected getStaticProperty(symbol: ClassSymbol, propertyName: ts.__String): ts.Symbol|undefined {
|
protected getStaticProperty(symbol: NgccClassSymbol, propertyName: ts.__String): ts.Symbol
|
||||||
|
|undefined {
|
||||||
return symbol.exports && symbol.exports.get(propertyName);
|
return symbol.exports && symbol.exports.get(propertyName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -559,7 +560,7 @@ export class Esm2015ReflectionHost extends TypeScriptReflectionHost implements N
|
||||||
* @param classSymbol the class for which decorators should be acquired.
|
* @param classSymbol the class for which decorators should be acquired.
|
||||||
* @returns all information of the decorators on the class.
|
* @returns all information of the decorators on the class.
|
||||||
*/
|
*/
|
||||||
protected acquireDecoratorInfo(classSymbol: ClassSymbol): DecoratorInfo {
|
protected acquireDecoratorInfo(classSymbol: NgccClassSymbol): DecoratorInfo {
|
||||||
if (this.decoratorCache.has(classSymbol.valueDeclaration)) {
|
if (this.decoratorCache.has(classSymbol.valueDeclaration)) {
|
||||||
return this.decoratorCache.get(classSymbol.valueDeclaration) !;
|
return this.decoratorCache.get(classSymbol.valueDeclaration) !;
|
||||||
}
|
}
|
||||||
|
@ -585,7 +586,8 @@ export class Esm2015ReflectionHost extends TypeScriptReflectionHost implements N
|
||||||
* @returns All information on the decorators as extracted from static properties, or `null` if
|
* @returns All information on the decorators as extracted from static properties, or `null` if
|
||||||
* none of the static properties exist.
|
* none of the static properties exist.
|
||||||
*/
|
*/
|
||||||
protected computeDecoratorInfoFromStaticProperties(classSymbol: ClassSymbol): DecoratorInfo|null {
|
protected computeDecoratorInfoFromStaticProperties(classSymbol: NgccClassSymbol): DecoratorInfo
|
||||||
|
|null {
|
||||||
let classDecorators: Decorator[]|null = null;
|
let classDecorators: Decorator[]|null = null;
|
||||||
let memberDecorators: Map<string, Decorator[]>|null = null;
|
let memberDecorators: Map<string, Decorator[]>|null = null;
|
||||||
let constructorParamInfo: ParamInfo[]|null = null;
|
let constructorParamInfo: ParamInfo[]|null = null;
|
||||||
|
@ -651,7 +653,7 @@ export class Esm2015ReflectionHost extends TypeScriptReflectionHost implements N
|
||||||
* @param symbol the `ClassSymbol` representing the class over which to reflect.
|
* @param symbol the `ClassSymbol` representing the class over which to reflect.
|
||||||
* @returns an array of `ClassMember` metadata representing the members of the class.
|
* @returns an array of `ClassMember` metadata representing the members of the class.
|
||||||
*/
|
*/
|
||||||
protected getMembersOfSymbol(symbol: ClassSymbol): ClassMember[] {
|
protected getMembersOfSymbol(symbol: NgccClassSymbol): ClassMember[] {
|
||||||
const members: ClassMember[] = [];
|
const members: ClassMember[] = [];
|
||||||
|
|
||||||
// The decorators map contains all the properties that are decorated
|
// The decorators map contains all the properties that are decorated
|
||||||
|
@ -788,7 +790,7 @@ export class Esm2015ReflectionHost extends TypeScriptReflectionHost implements N
|
||||||
* @param classSymbol The class symbol for which decorators should be extracted.
|
* @param classSymbol The class symbol for which decorators should be extracted.
|
||||||
* @returns All information on the decorators of the class.
|
* @returns All information on the decorators of the class.
|
||||||
*/
|
*/
|
||||||
protected computeDecoratorInfoFromHelperCalls(classSymbol: ClassSymbol): DecoratorInfo {
|
protected computeDecoratorInfoFromHelperCalls(classSymbol: NgccClassSymbol): DecoratorInfo {
|
||||||
let classDecorators: Decorator[]|null = null;
|
let classDecorators: Decorator[]|null = null;
|
||||||
const memberDecorators = new Map<string, Decorator[]>();
|
const memberDecorators = new Map<string, Decorator[]>();
|
||||||
const constructorParamInfo: ParamInfo[] = [];
|
const constructorParamInfo: ParamInfo[] = [];
|
||||||
|
@ -1178,7 +1180,7 @@ export class Esm2015ReflectionHost extends TypeScriptReflectionHost implements N
|
||||||
* @returns an array of `ts.ParameterDeclaration` objects representing each of the parameters in
|
* @returns an array of `ts.ParameterDeclaration` objects representing each of the parameters in
|
||||||
* the class's constructor or null if there is no constructor.
|
* the class's constructor or null if there is no constructor.
|
||||||
*/
|
*/
|
||||||
protected getConstructorParameterDeclarations(classSymbol: ClassSymbol):
|
protected getConstructorParameterDeclarations(classSymbol: NgccClassSymbol):
|
||||||
ts.ParameterDeclaration[]|null {
|
ts.ParameterDeclaration[]|null {
|
||||||
if (classSymbol.members && classSymbol.members.has(CONSTRUCTOR)) {
|
if (classSymbol.members && classSymbol.members.has(CONSTRUCTOR)) {
|
||||||
const constructorSymbol = classSymbol.members.get(CONSTRUCTOR) !;
|
const constructorSymbol = classSymbol.members.get(CONSTRUCTOR) !;
|
||||||
|
@ -1207,7 +1209,7 @@ export class Esm2015ReflectionHost extends TypeScriptReflectionHost implements N
|
||||||
* @returns an array of constructor parameter info objects.
|
* @returns an array of constructor parameter info objects.
|
||||||
*/
|
*/
|
||||||
protected getConstructorParamInfo(
|
protected getConstructorParamInfo(
|
||||||
classSymbol: ClassSymbol, parameterNodes: ts.ParameterDeclaration[]): CtorParameter[] {
|
classSymbol: NgccClassSymbol, parameterNodes: ts.ParameterDeclaration[]): CtorParameter[] {
|
||||||
const {constructorParamInfo} = this.acquireDecoratorInfo(classSymbol);
|
const {constructorParamInfo} = this.acquireDecoratorInfo(classSymbol);
|
||||||
|
|
||||||
return parameterNodes.map((node, index) => {
|
return parameterNodes.map((node, index) => {
|
||||||
|
@ -1295,7 +1297,7 @@ export class Esm2015ReflectionHost extends TypeScriptReflectionHost implements N
|
||||||
* in.
|
* in.
|
||||||
* @returns an array of CallExpression nodes for each matching helper call.
|
* @returns an array of CallExpression nodes for each matching helper call.
|
||||||
*/
|
*/
|
||||||
protected getHelperCallsForClass(classSymbol: ClassSymbol, helperName: string):
|
protected getHelperCallsForClass(classSymbol: NgccClassSymbol, helperName: string):
|
||||||
ts.CallExpression[] {
|
ts.CallExpression[] {
|
||||||
return this.getStatementsForClass(classSymbol)
|
return this.getStatementsForClass(classSymbol)
|
||||||
.map(statement => this.getHelperCall(statement, helperName))
|
.map(statement => this.getHelperCall(statement, helperName))
|
||||||
|
@ -1311,7 +1313,7 @@ export class Esm2015ReflectionHost extends TypeScriptReflectionHost implements N
|
||||||
* @param classSymbol the class whose helper calls we are interested in.
|
* @param classSymbol the class whose helper calls we are interested in.
|
||||||
* @returns an array of statements that may contain helper calls.
|
* @returns an array of statements that may contain helper calls.
|
||||||
*/
|
*/
|
||||||
protected getStatementsForClass(classSymbol: ClassSymbol): ts.Statement[] {
|
protected getStatementsForClass(classSymbol: NgccClassSymbol): ts.Statement[] {
|
||||||
return Array.from(classSymbol.valueDeclaration.getSourceFile().statements);
|
return Array.from(classSymbol.valueDeclaration.getSourceFile().statements);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,11 +8,12 @@
|
||||||
|
|
||||||
import * as ts from 'typescript';
|
import * as ts from 'typescript';
|
||||||
|
|
||||||
import {ClassDeclaration, ClassMember, ClassMemberKind, ClassSymbol, CtorParameter, Declaration, Decorator, FunctionDefinition, Parameter, TsHelperFn, isNamedVariableDeclaration, reflectObjectLiteral} from '../../../src/ngtsc/reflection';
|
import {ClassDeclaration, ClassMember, ClassMemberKind, CtorParameter, Declaration, Decorator, FunctionDefinition, Parameter, TsHelperFn, isNamedVariableDeclaration, reflectObjectLiteral} from '../../../src/ngtsc/reflection';
|
||||||
import {isFromDtsFile} from '../../../src/ngtsc/util/src/typescript';
|
import {isFromDtsFile} from '../../../src/ngtsc/util/src/typescript';
|
||||||
import {getNameText, hasNameIdentifier, stripDollarSuffix} from '../utils';
|
import {getNameText, hasNameIdentifier, stripDollarSuffix} from '../utils';
|
||||||
|
|
||||||
import {Esm2015ReflectionHost, ParamInfo, getPropertyValueFromSymbol, isAssignmentStatement} from './esm2015_host';
|
import {Esm2015ReflectionHost, ParamInfo, getPropertyValueFromSymbol, isAssignmentStatement} from './esm2015_host';
|
||||||
|
import {NgccClassSymbol} from './ngcc_host';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -238,7 +239,7 @@ export class Esm5ReflectionHost extends Esm2015ReflectionHost {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Gets all decorators of the given class symbol. */
|
/** Gets all decorators of the given class symbol. */
|
||||||
getDecoratorsOfSymbol(symbol: ClassSymbol): Decorator[]|null {
|
getDecoratorsOfSymbol(symbol: NgccClassSymbol): Decorator[]|null {
|
||||||
// The necessary info is on the inner function declaration (inside the ES5 class IIFE).
|
// The necessary info is on the inner function declaration (inside the ES5 class IIFE).
|
||||||
const innerFunctionSymbol =
|
const innerFunctionSymbol =
|
||||||
this.getInnerFunctionSymbolFromClassDeclaration(symbol.valueDeclaration);
|
this.getInnerFunctionSymbolFromClassDeclaration(symbol.valueDeclaration);
|
||||||
|
@ -302,12 +303,12 @@ export class Esm5ReflectionHost extends Esm2015ReflectionHost {
|
||||||
* @returns the inner function declaration identifier symbol or `undefined` if it is not a "class"
|
* @returns the inner function declaration identifier symbol or `undefined` if it is not a "class"
|
||||||
* or has no identifier.
|
* or has no identifier.
|
||||||
*/
|
*/
|
||||||
protected getInnerFunctionSymbolFromClassDeclaration(clazz: ClassDeclaration): ClassSymbol
|
protected getInnerFunctionSymbolFromClassDeclaration(clazz: ClassDeclaration): NgccClassSymbol
|
||||||
|undefined {
|
|undefined {
|
||||||
const innerFunctionDeclaration = this.getInnerFunctionDeclarationFromClassDeclaration(clazz);
|
const innerFunctionDeclaration = this.getInnerFunctionDeclarationFromClassDeclaration(clazz);
|
||||||
if (!innerFunctionDeclaration || !hasNameIdentifier(innerFunctionDeclaration)) return undefined;
|
if (!innerFunctionDeclaration || !hasNameIdentifier(innerFunctionDeclaration)) return undefined;
|
||||||
|
|
||||||
return this.checker.getSymbolAtLocation(innerFunctionDeclaration.name) as ClassSymbol;
|
return this.checker.getSymbolAtLocation(innerFunctionDeclaration.name) as NgccClassSymbol;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -322,7 +323,7 @@ export class Esm5ReflectionHost extends Esm2015ReflectionHost {
|
||||||
* @returns an array of `ts.ParameterDeclaration` objects representing each of the parameters in
|
* @returns an array of `ts.ParameterDeclaration` objects representing each of the parameters in
|
||||||
* the class's constructor or `null` if there is no constructor.
|
* the class's constructor or `null` if there is no constructor.
|
||||||
*/
|
*/
|
||||||
protected getConstructorParameterDeclarations(classSymbol: ClassSymbol):
|
protected getConstructorParameterDeclarations(classSymbol: NgccClassSymbol):
|
||||||
ts.ParameterDeclaration[]|null {
|
ts.ParameterDeclaration[]|null {
|
||||||
const constructor =
|
const constructor =
|
||||||
this.getInnerFunctionDeclarationFromClassDeclaration(classSymbol.valueDeclaration);
|
this.getInnerFunctionDeclarationFromClassDeclaration(classSymbol.valueDeclaration);
|
||||||
|
@ -348,7 +349,7 @@ export class Esm5ReflectionHost extends Esm2015ReflectionHost {
|
||||||
* @returns an array of constructor parameter info objects.
|
* @returns an array of constructor parameter info objects.
|
||||||
*/
|
*/
|
||||||
protected getConstructorParamInfo(
|
protected getConstructorParamInfo(
|
||||||
classSymbol: ClassSymbol, parameterNodes: ts.ParameterDeclaration[]): CtorParameter[] {
|
classSymbol: NgccClassSymbol, parameterNodes: ts.ParameterDeclaration[]): CtorParameter[] {
|
||||||
// The necessary info is on the inner function declaration (inside the ES5 class IIFE).
|
// The necessary info is on the inner function declaration (inside the ES5 class IIFE).
|
||||||
const innerFunctionSymbol =
|
const innerFunctionSymbol =
|
||||||
this.getInnerFunctionSymbolFromClassDeclaration(classSymbol.valueDeclaration);
|
this.getInnerFunctionSymbolFromClassDeclaration(classSymbol.valueDeclaration);
|
||||||
|
@ -479,7 +480,7 @@ export class Esm5ReflectionHost extends Esm2015ReflectionHost {
|
||||||
* to reference the inner identifier inside the IIFE.
|
* to reference the inner identifier inside the IIFE.
|
||||||
* @returns an array of statements that may contain helper calls.
|
* @returns an array of statements that may contain helper calls.
|
||||||
*/
|
*/
|
||||||
protected getStatementsForClass(classSymbol: ClassSymbol): ts.Statement[] {
|
protected getStatementsForClass(classSymbol: NgccClassSymbol): ts.Statement[] {
|
||||||
const classDeclarationParent = classSymbol.valueDeclaration.parent;
|
const classDeclarationParent = classSymbol.valueDeclaration.parent;
|
||||||
return ts.isBlock(classDeclarationParent) ? Array.from(classDeclarationParent.statements) : [];
|
return ts.isBlock(classDeclarationParent) ? Array.from(classDeclarationParent.statements) : [];
|
||||||
}
|
}
|
||||||
|
@ -496,7 +497,8 @@ export class Esm5ReflectionHost extends Esm2015ReflectionHost {
|
||||||
* @param propertyName the name of static property.
|
* @param propertyName the name of static property.
|
||||||
* @returns the symbol if it is found or `undefined` if not.
|
* @returns the symbol if it is found or `undefined` if not.
|
||||||
*/
|
*/
|
||||||
protected getStaticProperty(symbol: ClassSymbol, propertyName: ts.__String): ts.Symbol|undefined {
|
protected getStaticProperty(symbol: NgccClassSymbol, propertyName: ts.__String): ts.Symbol
|
||||||
|
|undefined {
|
||||||
// The symbol corresponds with the inner function declaration. First lets see if the static
|
// The symbol corresponds with the inner function declaration. First lets see if the static
|
||||||
// property is set there.
|
// property is set there.
|
||||||
const prop = super.getStaticProperty(symbol, propertyName);
|
const prop = super.getStaticProperty(symbol, propertyName);
|
||||||
|
@ -516,7 +518,7 @@ export class Esm5ReflectionHost extends Esm2015ReflectionHost {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
return super.getStaticProperty(outerSymbol as ClassSymbol, propertyName);
|
return super.getStaticProperty(outerSymbol as NgccClassSymbol, propertyName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
*/
|
*/
|
||||||
import * as ts from 'typescript';
|
import * as ts from 'typescript';
|
||||||
|
|
||||||
import {ClassDeclaration, ClassSymbol, ConcreteDeclaration, Decorator, ReflectionHost} from '../../../src/ngtsc/reflection';
|
import {ClassDeclaration, ConcreteDeclaration, Decorator, ReflectionHost} from '../../../src/ngtsc/reflection';
|
||||||
|
|
||||||
export const PRE_R3_MARKER = '__PRE_R3__';
|
export const PRE_R3_MARKER = '__PRE_R3__';
|
||||||
export const POST_R3_MARKER = '__POST_R3__';
|
export const POST_R3_MARKER = '__POST_R3__';
|
||||||
|
@ -43,6 +43,12 @@ export interface ModuleWithProvidersFunction {
|
||||||
ngModule: ConcreteDeclaration<ClassDeclaration>;
|
ngModule: ConcreteDeclaration<ClassDeclaration>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The symbol corresponding to a "class" declaration. I.e. a `ts.Symbol` whose `valueDeclaration` is
|
||||||
|
* a `ClassDeclaration`.
|
||||||
|
*/
|
||||||
|
export type NgccClassSymbol = ts.Symbol & {valueDeclaration: ClassDeclaration};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A reflection host that has extra methods for looking at non-Typescript package formats
|
* A reflection host that has extra methods for looking at non-Typescript package formats
|
||||||
*/
|
*/
|
||||||
|
@ -53,7 +59,7 @@ export interface NgccReflectionHost extends ReflectionHost {
|
||||||
* @returns the symbol for the declaration or `undefined` if it is not
|
* @returns the symbol for the declaration or `undefined` if it is not
|
||||||
* a "class" or has no symbol.
|
* a "class" or has no symbol.
|
||||||
*/
|
*/
|
||||||
getClassSymbol(node: ts.Node): ClassSymbol|undefined;
|
getClassSymbol(node: ts.Node): NgccClassSymbol|undefined;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Search the given module for variable declarations in which the initializer
|
* Search the given module for variable declarations in which the initializer
|
||||||
|
@ -68,14 +74,14 @@ export interface NgccReflectionHost extends ReflectionHost {
|
||||||
* @param symbol Class symbol that can refer to a declaration which can hold decorators.
|
* @param symbol Class symbol that can refer to a declaration which can hold decorators.
|
||||||
* @returns An array of decorators or null if none are declared.
|
* @returns An array of decorators or null if none are declared.
|
||||||
*/
|
*/
|
||||||
getDecoratorsOfSymbol(symbol: ClassSymbol): Decorator[]|null;
|
getDecoratorsOfSymbol(symbol: NgccClassSymbol): Decorator[]|null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves all class symbols of a given source file.
|
* Retrieves all class symbols of a given source file.
|
||||||
* @param sourceFile The source file to search for classes.
|
* @param sourceFile The source file to search for classes.
|
||||||
* @returns An array of found class symbols.
|
* @returns An array of found class symbols.
|
||||||
*/
|
*/
|
||||||
findClassSymbols(sourceFile: ts.SourceFile): ClassSymbol[];
|
findClassSymbols(sourceFile: ts.SourceFile): NgccClassSymbol[];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Search the given source file for exported functions and static class methods that return
|
* Search the given source file for exported functions and static class methods that return
|
||||||
|
|
|
@ -6,15 +6,16 @@
|
||||||
* found in the LICENSE file at https://angular.io/license
|
* found in the LICENSE file at https://angular.io/license
|
||||||
*/
|
*/
|
||||||
import {ErrorCode} from '../../../src/ngtsc/diagnostics';
|
import {ErrorCode} from '../../../src/ngtsc/diagnostics';
|
||||||
import {ClassDeclaration, ClassSymbol, Decorator} from '../../../src/ngtsc/reflection';
|
import {ClassDeclaration, Decorator} from '../../../src/ngtsc/reflection';
|
||||||
import {AnalysisOutput, CompileResult, DecoratorHandler, DetectResult, HandlerPrecedence} from '../../../src/ngtsc/transform';
|
import {AnalysisOutput, CompileResult, DecoratorHandler, DetectResult, HandlerPrecedence} from '../../../src/ngtsc/transform';
|
||||||
import {DefaultMigrationHost} from '../../src/analysis/migration_host';
|
import {DefaultMigrationHost} from '../../src/analysis/migration_host';
|
||||||
import {AnalyzedClass, AnalyzedFile} from '../../src/analysis/types';
|
import {AnalyzedClass, AnalyzedFile} from '../../src/analysis/types';
|
||||||
|
import {NgccClassSymbol} from '../../src/host/ngcc_host';
|
||||||
|
|
||||||
describe('DefaultMigrationHost', () => {
|
describe('DefaultMigrationHost', () => {
|
||||||
describe('injectSyntheticDecorator()', () => {
|
describe('injectSyntheticDecorator()', () => {
|
||||||
const mockHost: any = {
|
const mockHost: any = {
|
||||||
getClassSymbol: (node: any): ClassSymbol | undefined =>
|
getClassSymbol: (node: any): NgccClassSymbol | undefined =>
|
||||||
({ valueDeclaration: node, name: node.name.text } as any),
|
({ valueDeclaration: node, name: node.name.text } as any),
|
||||||
};
|
};
|
||||||
const mockMetadata: any = {};
|
const mockMetadata: any = {};
|
||||||
|
|
|
@ -70,12 +70,6 @@ export function isDecoratorIdentifier(exp: ts.Expression): exp is DecoratorIdent
|
||||||
*/
|
*/
|
||||||
export type ClassDeclaration<T extends ts.Declaration = ts.Declaration> = T & {name: ts.Identifier};
|
export type ClassDeclaration<T extends ts.Declaration = ts.Declaration> = T & {name: ts.Identifier};
|
||||||
|
|
||||||
/**
|
|
||||||
* The symbol corresponding to a "class" declaration. I.e. a `ts.Symbol` whose `valueDeclaration` is
|
|
||||||
* a `ClassDeclaration`.
|
|
||||||
*/
|
|
||||||
export type ClassSymbol = ts.Symbol & {valueDeclaration: ClassDeclaration};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An enumeration of possible kinds of class members.
|
* An enumeration of possible kinds of class members.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue