fix(compiler): Correctly handles references to static methods (#11013)

Fixes: #10975
This commit is contained in:
Chuck Jazdzewski
2016-08-23 11:58:12 -07:00
committed by Kara
parent 5ddecb18a7
commit 14a30f3ca0
6 changed files with 45 additions and 11 deletions

View File

@ -221,11 +221,12 @@ export class ReflectorHost implements StaticReflectorHost, ImportGenerator {
* @param declarationFile the absolute path of the file where the symbol is declared
* @param name the name of the type.
*/
getStaticSymbol(declarationFile: string, name: string): StaticSymbol {
let key = `"${declarationFile}".${name}`;
getStaticSymbol(declarationFile: string, name: string, members?: string[]): StaticSymbol {
const memberSuffix = members ? `.${ members.join('.')}` : '';
const key = `"${declarationFile}".${name}${memberSuffix}`;
let result = this.typeCache.get(key);
if (!result) {
result = new StaticSymbol(declarationFile, name);
result = new StaticSymbol(declarationFile, name, members);
this.typeCache.set(key, result);
}
return result;

View File

@ -34,7 +34,7 @@ export interface StaticReflectorHost {
*/
findDeclaration(modulePath: string, symbolName: string, containingFile?: string): StaticSymbol;
getStaticSymbol(declarationFile: string, name: string): StaticSymbol;
getStaticSymbol(declarationFile: string, name: string, members?: string[]): StaticSymbol;
angularImportLocations(): {
coreDecorators: string,
@ -52,7 +52,7 @@ export interface StaticReflectorHost {
* This token is unique for a filePath and name and can be used as a hash table key.
*/
export class StaticSymbol {
constructor(public filePath: string, public name: string) {}
constructor(public filePath: string, public name: string, public members?: string[]) {}
}
/**
@ -451,7 +451,12 @@ export class StaticReflector implements ReflectorReader {
if (declarationValue && declarationValue.statics) {
selectTarget = declarationValue.statics;
} else {
return null;
const member: string = expression['member'];
const members = selectTarget.members ?
(selectTarget.members as string[]).concat(member) :
[member];
return _this.host.getStaticSymbol(
selectTarget.filePath, selectTarget.name, members);
}
}
const member = simplify(expression['member']);