refactor(ngcc): move `ClassSymbol` to become `NgccClassSymbol` (#32539)

PR Close #32539
This commit is contained in:
JoostK 2019-09-01 20:54:41 +02:00 committed by Kara Erickson
parent 222af38462
commit 2279cb8dc0
8 changed files with 51 additions and 45 deletions

View File

@ -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) {

View File

@ -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

View File

@ -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) {

View File

@ -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);
} }

View File

@ -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);
} }
} }

View File

@ -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

View File

@ -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 = {};

View File

@ -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.
*/ */