Support dynamic names on static members of class.

This commit is contained in:
Ron Buckton
2017-10-04 21:24:32 -07:00
parent 36f90b6ec3
commit 906a79df76
6 changed files with 183 additions and 98 deletions
+43 -5
View File
@@ -1867,7 +1867,9 @@ namespace ts {
}
function getExportsOfSymbol(symbol: Symbol): SymbolTable {
return symbol.flags & SymbolFlags.Module ? getExportsOfModule(symbol) : symbol.exports || emptySymbols;
return symbol.flags & SymbolFlags.Class ? getExportsOfClass(symbol) :
symbol.flags & SymbolFlags.Module ? getExportsOfModule(symbol) :
symbol.exports || emptySymbols;
}
function getExportsOfModule(moduleSymbol: Symbol): SymbolTable {
@@ -1875,6 +1877,33 @@ namespace ts {
return links.resolvedExports || (links.resolvedExports = getExportsOfModuleWorker(moduleSymbol));
}
function getExportsOfClass(symbol: Symbol) {
const links = getSymbolLinks(symbol);
if (!links.resolvedExports) {
const earlySymbols = symbol.flags & SymbolFlags.Module ? getExportsOfModuleWorker(symbol) : symbol.exports;
const lateSymbols = getLateBoundExportsOfSymbol(symbol);
// In the event we recursively resolve the members of the symbol, we
// should only see the early-bound members of the symbol here.
links.resolvedExports = earlySymbols || emptySymbols;
// fill in any as-yet-unresolved late-bound members.
for (const decl of symbol.declarations) {
const members = getMembersOfDeclaration(decl);
if (members) {
for (const member of members) {
if (hasModifier(member, ModifierFlags.Static) && hasLateBindableName(member)) {
lateBindMember(decl.symbol, earlySymbols, lateSymbols, member);
}
}
}
}
links.resolvedExports = combineSymbolTables(earlySymbols, lateSymbols) || emptySymbols;
}
return links.resolvedExports;
}
interface ExportCollisionTracker {
specifierText: string;
exportsWithDuplicate: ExportDeclaration[];
@@ -5507,6 +5536,16 @@ namespace ts {
return links.lateMembers || (links.lateMembers = createSymbolTable());
}
/**
* Gets the symbol table used to store exports added during late-binding.
* This table is filled in as the late-bound names for dynamic members are resolved.
*/
function getLateBoundExportsOfSymbol(symbol: Symbol): SymbolTable {
Debug.assert(!!(symbol.flags & SymbolFlags.Class), "Expected a container that supports late-binding of exports.");
const links = getSymbolLinks(symbol);
return links.lateExports || (links.lateExports = createSymbolTable());
}
/**
* Adds a declaration to a late-bound dynamic member. This performs the same function for
* late-bound members that `addDeclarationToSymbol` in binder.ts performs for early-bound
@@ -5617,14 +5656,13 @@ namespace ts {
*/
function getLateBoundSymbol(symbol: Symbol) {
if (symbol && (symbol.flags & SymbolFlags.ClassMember) && symbol.escapedName === InternalSymbolName.Computed) {
// NOTE: This does not yet support late-bound static members of a class.
const isStaticMember = some(symbol.declarations, declaration => hasModifier(declaration, ModifierFlags.Static));
const parent = symbol.parent;
if (parent && (parent.flags & (isStaticMember ? SymbolFlags.Class : SymbolFlags.LateBindableContainer)) && !isStaticMember) {
if (parent && (parent.flags & (isStaticMember ? SymbolFlags.Class : SymbolFlags.LateBindableContainer))) {
const links = getSymbolLinks(symbol);
if (!links.lateSymbol) {
const earlySymbols = parent.members;
const lateSymbols = getLateBoundMembersOfSymbol(symbol.parent);
const earlySymbols = isStaticMember ? parent.exports : parent.members;
const lateSymbols = isStaticMember ? getLateBoundExportsOfSymbol(parent) : getLateBoundMembersOfSymbol(parent);
// In the event we attempt to get the late-bound symbol for a symbol recursively,
// fall back to the early-bound symbol.
+1
View File
@@ -3070,6 +3070,7 @@ namespace ts {
enumKind?: EnumKind; // Enum declaration classification
lateSymbol?: Symbol; // Late-bound symbol for a computed property
lateMembers?: SymbolTable; // Late-bound members resolved during check
lateExports?: SymbolTable; // Late-bound exports resolved during check
}
/* @internal */
@@ -90,6 +90,12 @@ declare type T15 = {
[s2]: boolean;
};
declare class C {
static a: number;
static 1: string;
static [s2]: boolean;
}
let t0: T0;
let t1: T1;
let t2: T2;
@@ -115,6 +121,7 @@ let t15: T15;
t0 = t1, t0 = t2, t0 = t3, t1 = t0, t1 = t2, t1 = t3, t2 = t0, t2 = t1, t2 = t3, t3 = t0, t3 = t1, t3 = t2;
t4 = t5, t4 = t6, t4 = t7, t5 = t4, t5 = t6, t5 = t7, t6 = t4, t6 = t5, t6 = t7, t7 = t4, t7 = t5, t7 = t6;
t0 = t12, t0 = t13, t0 = t14, t0 = t15, t12 = t0, t13 = t0, t14 = t0, t15 = t0;
t0 = C; // static side
// object literals
export const o1 = {
@@ -173,6 +180,7 @@ let t15;
t0 = t1, t0 = t2, t0 = t3, t1 = t0, t1 = t2, t1 = t3, t2 = t0, t2 = t1, t2 = t3, t3 = t0, t3 = t1, t3 = t2;
t4 = t5, t4 = t6, t4 = t7, t5 = t4, t5 = t6, t5 = t7, t6 = t4, t6 = t5, t6 = t7, t7 = t4, t7 = t5, t7 = t6;
t0 = t12, t0 = t13, t0 = t14, t0 = t15, t12 = t0, t13 = t0, t14 = t0, t15 = t0;
t0 = C; // static side
// object literals
exports.o1 = {
[exports.c4]: 1,
+108 -93
View File
@@ -232,168 +232,183 @@ declare type T15 = {
};
declare class C {
>C : Symbol(C, Decl(main.ts, 65, 2))
static a: number;
>a : Symbol(C.a, Decl(main.ts, 67, 17))
static 1: string;
static [s2]: boolean;
>s2 : Symbol(s2, Decl(main.ts, 29, 12))
}
let t0: T0;
>t0 : Symbol(t0, Decl(main.ts, 67, 3))
>t0 : Symbol(t0, Decl(main.ts, 73, 3))
>T0 : Symbol(T0, Decl(main.ts, 0, 20))
let t1: T1;
>t1 : Symbol(t1, Decl(main.ts, 68, 3))
>t1 : Symbol(t1, Decl(main.ts, 74, 3))
>T1 : Symbol(T1, Decl(main.ts, 0, 24))
let t2: T2;
>t2 : Symbol(t2, Decl(main.ts, 69, 3))
>t2 : Symbol(t2, Decl(main.ts, 75, 3))
>T2 : Symbol(T2, Decl(main.ts, 0, 28))
let t3: T3;
>t3 : Symbol(t3, Decl(main.ts, 70, 3))
>t3 : Symbol(t3, Decl(main.ts, 76, 3))
>T3 : Symbol(T3, Decl(main.ts, 0, 32))
let t0_1: M.T0;
>t0_1 : Symbol(t0_1, Decl(main.ts, 71, 3))
>t0_1 : Symbol(t0_1, Decl(main.ts, 77, 3))
>M : Symbol(M, Decl(main.ts, 1, 6))
>T0 : Symbol(T0, Decl(module.ts, 2, 27))
let t1_1: M.T1;
>t1_1 : Symbol(t1_1, Decl(main.ts, 72, 3))
>t1_1 : Symbol(t1_1, Decl(main.ts, 78, 3))
>M : Symbol(M, Decl(main.ts, 1, 6))
>T1 : Symbol(T1, Decl(module.ts, 7, 1))
let t2_1: M.T2;
>t2_1 : Symbol(t2_1, Decl(main.ts, 73, 3))
>t2_1 : Symbol(t2_1, Decl(main.ts, 79, 3))
>M : Symbol(M, Decl(main.ts, 1, 6))
>T2 : Symbol(T2, Decl(module.ts, 12, 1))
let t3_1: M.T3;
>t3_1 : Symbol(t3_1, Decl(main.ts, 74, 3))
>t3_1 : Symbol(t3_1, Decl(main.ts, 80, 3))
>M : Symbol(M, Decl(main.ts, 1, 6))
>T3 : Symbol(T3, Decl(module.ts, 14, 1))
let t4: N.T4;
>t4 : Symbol(t4, Decl(main.ts, 75, 3))
>t4 : Symbol(t4, Decl(main.ts, 81, 3))
>N : Symbol(N, Decl(main.ts, 1, 30))
>T4 : Symbol(N.T4, Decl(main.ts, 6, 36))
let t5: N.T5;
>t5 : Symbol(t5, Decl(main.ts, 76, 3))
>t5 : Symbol(t5, Decl(main.ts, 82, 3))
>N : Symbol(N, Decl(main.ts, 1, 30))
>T5 : Symbol(N.T5, Decl(main.ts, 12, 5))
let t6: N.T6;
>t6 : Symbol(t6, Decl(main.ts, 77, 3))
>t6 : Symbol(t6, Decl(main.ts, 83, 3))
>N : Symbol(N, Decl(main.ts, 1, 30))
>T6 : Symbol(N.T6, Decl(main.ts, 17, 5))
let t7: N.T7;
>t7 : Symbol(t7, Decl(main.ts, 78, 3))
>t7 : Symbol(t7, Decl(main.ts, 84, 3))
>N : Symbol(N, Decl(main.ts, 1, 30))
>T7 : Symbol(N.T7, Decl(main.ts, 19, 5))
let t8: T8;
>t8 : Symbol(t8, Decl(main.ts, 79, 3))
>t8 : Symbol(t8, Decl(main.ts, 85, 3))
>T8 : Symbol(T8, Decl(main.ts, 29, 32))
let t9: T9;
>t9 : Symbol(t9, Decl(main.ts, 80, 3))
>t9 : Symbol(t9, Decl(main.ts, 86, 3))
>T9 : Symbol(T9, Decl(main.ts, 35, 1))
let t10: T10;
>t10 : Symbol(t10, Decl(main.ts, 81, 3))
>t10 : Symbol(t10, Decl(main.ts, 87, 3))
>T10 : Symbol(T10, Decl(main.ts, 40, 1))
let t11: T11;
>t11 : Symbol(t11, Decl(main.ts, 82, 3))
>t11 : Symbol(t11, Decl(main.ts, 88, 3))
>T11 : Symbol(T11, Decl(main.ts, 42, 1))
let t12: T12;
>t12 : Symbol(t12, Decl(main.ts, 83, 3))
>t12 : Symbol(t12, Decl(main.ts, 89, 3))
>T12 : Symbol(T12, Decl(main.ts, 47, 2))
let t13: T13;
>t13 : Symbol(t13, Decl(main.ts, 84, 3))
>t13 : Symbol(t13, Decl(main.ts, 90, 3))
>T13 : Symbol(T13, Decl(main.ts, 53, 1))
let t14: T14;
>t14 : Symbol(t14, Decl(main.ts, 85, 3))
>t14 : Symbol(t14, Decl(main.ts, 91, 3))
>T14 : Symbol(T14, Decl(main.ts, 58, 1))
let t15: T15;
>t15 : Symbol(t15, Decl(main.ts, 86, 3))
>t15 : Symbol(t15, Decl(main.ts, 92, 3))
>T15 : Symbol(T15, Decl(main.ts, 60, 1))
// assignability
t0 = t1, t0 = t2, t0 = t3, t1 = t0, t1 = t2, t1 = t3, t2 = t0, t2 = t1, t2 = t3, t3 = t0, t3 = t1, t3 = t2;
>t0 : Symbol(t0, Decl(main.ts, 67, 3))
>t1 : Symbol(t1, Decl(main.ts, 68, 3))
>t0 : Symbol(t0, Decl(main.ts, 67, 3))
>t2 : Symbol(t2, Decl(main.ts, 69, 3))
>t0 : Symbol(t0, Decl(main.ts, 67, 3))
>t3 : Symbol(t3, Decl(main.ts, 70, 3))
>t1 : Symbol(t1, Decl(main.ts, 68, 3))
>t0 : Symbol(t0, Decl(main.ts, 67, 3))
>t1 : Symbol(t1, Decl(main.ts, 68, 3))
>t2 : Symbol(t2, Decl(main.ts, 69, 3))
>t1 : Symbol(t1, Decl(main.ts, 68, 3))
>t3 : Symbol(t3, Decl(main.ts, 70, 3))
>t2 : Symbol(t2, Decl(main.ts, 69, 3))
>t0 : Symbol(t0, Decl(main.ts, 67, 3))
>t2 : Symbol(t2, Decl(main.ts, 69, 3))
>t1 : Symbol(t1, Decl(main.ts, 68, 3))
>t2 : Symbol(t2, Decl(main.ts, 69, 3))
>t3 : Symbol(t3, Decl(main.ts, 70, 3))
>t3 : Symbol(t3, Decl(main.ts, 70, 3))
>t0 : Symbol(t0, Decl(main.ts, 67, 3))
>t3 : Symbol(t3, Decl(main.ts, 70, 3))
>t1 : Symbol(t1, Decl(main.ts, 68, 3))
>t3 : Symbol(t3, Decl(main.ts, 70, 3))
>t2 : Symbol(t2, Decl(main.ts, 69, 3))
>t0 : Symbol(t0, Decl(main.ts, 73, 3))
>t1 : Symbol(t1, Decl(main.ts, 74, 3))
>t0 : Symbol(t0, Decl(main.ts, 73, 3))
>t2 : Symbol(t2, Decl(main.ts, 75, 3))
>t0 : Symbol(t0, Decl(main.ts, 73, 3))
>t3 : Symbol(t3, Decl(main.ts, 76, 3))
>t1 : Symbol(t1, Decl(main.ts, 74, 3))
>t0 : Symbol(t0, Decl(main.ts, 73, 3))
>t1 : Symbol(t1, Decl(main.ts, 74, 3))
>t2 : Symbol(t2, Decl(main.ts, 75, 3))
>t1 : Symbol(t1, Decl(main.ts, 74, 3))
>t3 : Symbol(t3, Decl(main.ts, 76, 3))
>t2 : Symbol(t2, Decl(main.ts, 75, 3))
>t0 : Symbol(t0, Decl(main.ts, 73, 3))
>t2 : Symbol(t2, Decl(main.ts, 75, 3))
>t1 : Symbol(t1, Decl(main.ts, 74, 3))
>t2 : Symbol(t2, Decl(main.ts, 75, 3))
>t3 : Symbol(t3, Decl(main.ts, 76, 3))
>t3 : Symbol(t3, Decl(main.ts, 76, 3))
>t0 : Symbol(t0, Decl(main.ts, 73, 3))
>t3 : Symbol(t3, Decl(main.ts, 76, 3))
>t1 : Symbol(t1, Decl(main.ts, 74, 3))
>t3 : Symbol(t3, Decl(main.ts, 76, 3))
>t2 : Symbol(t2, Decl(main.ts, 75, 3))
t4 = t5, t4 = t6, t4 = t7, t5 = t4, t5 = t6, t5 = t7, t6 = t4, t6 = t5, t6 = t7, t7 = t4, t7 = t5, t7 = t6;
>t4 : Symbol(t4, Decl(main.ts, 75, 3))
>t5 : Symbol(t5, Decl(main.ts, 76, 3))
>t4 : Symbol(t4, Decl(main.ts, 75, 3))
>t6 : Symbol(t6, Decl(main.ts, 77, 3))
>t4 : Symbol(t4, Decl(main.ts, 75, 3))
>t7 : Symbol(t7, Decl(main.ts, 78, 3))
>t5 : Symbol(t5, Decl(main.ts, 76, 3))
>t4 : Symbol(t4, Decl(main.ts, 75, 3))
>t5 : Symbol(t5, Decl(main.ts, 76, 3))
>t6 : Symbol(t6, Decl(main.ts, 77, 3))
>t5 : Symbol(t5, Decl(main.ts, 76, 3))
>t7 : Symbol(t7, Decl(main.ts, 78, 3))
>t6 : Symbol(t6, Decl(main.ts, 77, 3))
>t4 : Symbol(t4, Decl(main.ts, 75, 3))
>t6 : Symbol(t6, Decl(main.ts, 77, 3))
>t5 : Symbol(t5, Decl(main.ts, 76, 3))
>t6 : Symbol(t6, Decl(main.ts, 77, 3))
>t7 : Symbol(t7, Decl(main.ts, 78, 3))
>t7 : Symbol(t7, Decl(main.ts, 78, 3))
>t4 : Symbol(t4, Decl(main.ts, 75, 3))
>t7 : Symbol(t7, Decl(main.ts, 78, 3))
>t5 : Symbol(t5, Decl(main.ts, 76, 3))
>t7 : Symbol(t7, Decl(main.ts, 78, 3))
>t6 : Symbol(t6, Decl(main.ts, 77, 3))
>t4 : Symbol(t4, Decl(main.ts, 81, 3))
>t5 : Symbol(t5, Decl(main.ts, 82, 3))
>t4 : Symbol(t4, Decl(main.ts, 81, 3))
>t6 : Symbol(t6, Decl(main.ts, 83, 3))
>t4 : Symbol(t4, Decl(main.ts, 81, 3))
>t7 : Symbol(t7, Decl(main.ts, 84, 3))
>t5 : Symbol(t5, Decl(main.ts, 82, 3))
>t4 : Symbol(t4, Decl(main.ts, 81, 3))
>t5 : Symbol(t5, Decl(main.ts, 82, 3))
>t6 : Symbol(t6, Decl(main.ts, 83, 3))
>t5 : Symbol(t5, Decl(main.ts, 82, 3))
>t7 : Symbol(t7, Decl(main.ts, 84, 3))
>t6 : Symbol(t6, Decl(main.ts, 83, 3))
>t4 : Symbol(t4, Decl(main.ts, 81, 3))
>t6 : Symbol(t6, Decl(main.ts, 83, 3))
>t5 : Symbol(t5, Decl(main.ts, 82, 3))
>t6 : Symbol(t6, Decl(main.ts, 83, 3))
>t7 : Symbol(t7, Decl(main.ts, 84, 3))
>t7 : Symbol(t7, Decl(main.ts, 84, 3))
>t4 : Symbol(t4, Decl(main.ts, 81, 3))
>t7 : Symbol(t7, Decl(main.ts, 84, 3))
>t5 : Symbol(t5, Decl(main.ts, 82, 3))
>t7 : Symbol(t7, Decl(main.ts, 84, 3))
>t6 : Symbol(t6, Decl(main.ts, 83, 3))
t0 = t12, t0 = t13, t0 = t14, t0 = t15, t12 = t0, t13 = t0, t14 = t0, t15 = t0;
>t0 : Symbol(t0, Decl(main.ts, 67, 3))
>t12 : Symbol(t12, Decl(main.ts, 83, 3))
>t0 : Symbol(t0, Decl(main.ts, 67, 3))
>t13 : Symbol(t13, Decl(main.ts, 84, 3))
>t0 : Symbol(t0, Decl(main.ts, 67, 3))
>t14 : Symbol(t14, Decl(main.ts, 85, 3))
>t0 : Symbol(t0, Decl(main.ts, 67, 3))
>t15 : Symbol(t15, Decl(main.ts, 86, 3))
>t12 : Symbol(t12, Decl(main.ts, 83, 3))
>t0 : Symbol(t0, Decl(main.ts, 67, 3))
>t13 : Symbol(t13, Decl(main.ts, 84, 3))
>t0 : Symbol(t0, Decl(main.ts, 67, 3))
>t14 : Symbol(t14, Decl(main.ts, 85, 3))
>t0 : Symbol(t0, Decl(main.ts, 67, 3))
>t15 : Symbol(t15, Decl(main.ts, 86, 3))
>t0 : Symbol(t0, Decl(main.ts, 67, 3))
>t0 : Symbol(t0, Decl(main.ts, 73, 3))
>t12 : Symbol(t12, Decl(main.ts, 89, 3))
>t0 : Symbol(t0, Decl(main.ts, 73, 3))
>t13 : Symbol(t13, Decl(main.ts, 90, 3))
>t0 : Symbol(t0, Decl(main.ts, 73, 3))
>t14 : Symbol(t14, Decl(main.ts, 91, 3))
>t0 : Symbol(t0, Decl(main.ts, 73, 3))
>t15 : Symbol(t15, Decl(main.ts, 92, 3))
>t12 : Symbol(t12, Decl(main.ts, 89, 3))
>t0 : Symbol(t0, Decl(main.ts, 73, 3))
>t13 : Symbol(t13, Decl(main.ts, 90, 3))
>t0 : Symbol(t0, Decl(main.ts, 73, 3))
>t14 : Symbol(t14, Decl(main.ts, 91, 3))
>t0 : Symbol(t0, Decl(main.ts, 73, 3))
>t15 : Symbol(t15, Decl(main.ts, 92, 3))
>t0 : Symbol(t0, Decl(main.ts, 73, 3))
t0 = C; // static side
>t0 : Symbol(t0, Decl(main.ts, 73, 3))
>C : Symbol(C, Decl(main.ts, 65, 2))
// object literals
export const o1 = {
>o1 : Symbol(o1, Decl(main.ts, 94, 12))
>o1 : Symbol(o1, Decl(main.ts, 101, 12))
[c4]: 1,
>c4 : Symbol(c4, Decl(main.ts, 27, 12))
@@ -408,22 +423,22 @@ export const o1 = {
// check element access types
export const o1_c4 = o1[c4];
>o1_c4 : Symbol(o1_c4, Decl(main.ts, 101, 12))
>o1 : Symbol(o1, Decl(main.ts, 94, 12))
>o1_c4 : Symbol(o1_c4, Decl(main.ts, 108, 12))
>o1 : Symbol(o1, Decl(main.ts, 101, 12))
>c4 : Symbol(c4, Decl(main.ts, 27, 12))
export const o1_c5 = o1[c5];
>o1_c5 : Symbol(o1_c5, Decl(main.ts, 102, 12))
>o1 : Symbol(o1, Decl(main.ts, 94, 12))
>o1_c5 : Symbol(o1_c5, Decl(main.ts, 109, 12))
>o1 : Symbol(o1, Decl(main.ts, 101, 12))
>c5 : Symbol(c5, Decl(main.ts, 28, 12))
export const o1_s2 = o1[s2];
>o1_s2 : Symbol(o1_s2, Decl(main.ts, 103, 12))
>o1 : Symbol(o1, Decl(main.ts, 94, 12))
>o1_s2 : Symbol(o1_s2, Decl(main.ts, 110, 12))
>o1 : Symbol(o1, Decl(main.ts, 101, 12))
>s2 : Symbol(s2, Decl(main.ts, 29, 12))
export const o2: T0 = o1;
>o2 : Symbol(o2, Decl(main.ts, 105, 12))
>o2 : Symbol(o2, Decl(main.ts, 112, 12))
>T0 : Symbol(T0, Decl(main.ts, 0, 20))
>o1 : Symbol(o1, Decl(main.ts, 94, 12))
>o1 : Symbol(o1, Decl(main.ts, 101, 12))
@@ -239,6 +239,17 @@ declare type T15 = {
};
declare class C {
>C : C
static a: number;
>a : number
static 1: string;
static [s2]: boolean;
>s2 : unique symbol
}
let t0: T0;
>t0 : T0
>T0 : T0
@@ -459,6 +470,11 @@ t0 = t12, t0 = t13, t0 = t14, t0 = t15, t12 = t0, t13 = t0, t14 = t0, t15 = t0;
>t15 : { a: number; 1: string; [s2]: boolean; }
>t0 : T0
t0 = C; // static side
>t0 = C : typeof C
>t0 : T0
>C : typeof C
// object literals
export const o1 = {
>o1 : { [c4]: number; [c5]: string; [s2]: boolean; }
+7
View File
@@ -92,6 +92,12 @@ declare type T15 = {
[s2]: boolean;
};
declare class C {
static a: number;
static 1: string;
static [s2]: boolean;
}
let t0: T0;
let t1: T1;
let t2: T2;
@@ -117,6 +123,7 @@ let t15: T15;
t0 = t1, t0 = t2, t0 = t3, t1 = t0, t1 = t2, t1 = t3, t2 = t0, t2 = t1, t2 = t3, t3 = t0, t3 = t1, t3 = t2;
t4 = t5, t4 = t6, t4 = t7, t5 = t4, t5 = t6, t5 = t7, t6 = t4, t6 = t5, t6 = t7, t7 = t4, t7 = t5, t7 = t6;
t0 = t12, t0 = t13, t0 = t14, t0 = t15, t12 = t0, t13 = t0, t14 = t0, t15 = t0;
t0 = C; // static side
// object literals
export const o1 = {