Allow some dynamic names in types

This commit is contained in:
Ron Buckton
2017-04-29 13:17:38 -07:00
parent 7080c4155b
commit d8cb3c628a
11 changed files with 1277 additions and 9 deletions
+145 -8
View File
@@ -959,7 +959,7 @@ namespace ts {
case SyntaxKind.ClassDeclaration:
case SyntaxKind.ClassExpression:
case SyntaxKind.InterfaceDeclaration:
if (result = getSymbol(getSymbolOfNode(location).members, name, meaning & SymbolFlags.Type)) {
if (result = getSymbol(getMembersOfSymbol(getSymbolOfNode(location)), name, meaning & SymbolFlags.Type)) {
if (!isTypeParameterSymbolDeclaredInContainer(result, location)) {
// ignore type parameters not declared in this container
result = undefined;
@@ -2895,6 +2895,9 @@ namespace ts {
}
function getNameOfSymbol(symbol: Symbol): string {
if (symbol.flags & SymbolFlags.Dynamic) {
return unescapeIdentifier(symbol.name);
}
if (symbol.declarations && symbol.declarations.length) {
const declaration = symbol.declarations[0];
if (declaration.name) {
@@ -5133,7 +5136,7 @@ namespace ts {
function resolveDeclaredMembers(type: InterfaceType): InterfaceTypeWithDeclaredMembers {
if (!(<InterfaceTypeWithDeclaredMembers>type).declaredProperties) {
const symbol = type.symbol;
(<InterfaceTypeWithDeclaredMembers>type).declaredProperties = getNamedMembers(symbol.members);
(<InterfaceTypeWithDeclaredMembers>type).declaredProperties = getNamedMembers(getMembersOfSymbol(symbol));
(<InterfaceTypeWithDeclaredMembers>type).declaredCallSignatures = getSignaturesOfSymbol(symbol.members.get("__call"));
(<InterfaceTypeWithDeclaredMembers>type).declaredConstructSignatures = getSignaturesOfSymbol(symbol.members.get("__new"));
(<InterfaceTypeWithDeclaredMembers>type).declaredStringIndexInfo = getIndexInfoOfSymbol(symbol, IndexKind.String);
@@ -5142,6 +5145,137 @@ namespace ts {
return <InterfaceTypeWithDeclaredMembers>type;
}
function getMembersOfSymbol(symbol: Symbol) {
const links = getSymbolLinks(symbol);
if (!links.resolvedMembers) {
links.resolvedMembers = emptySymbols;
const dynamicMembers = getDynamicMembersOfSymbol(symbol);
if (!dynamicMembers || dynamicMembers.size === 0) {
return links.resolvedMembers = symbol.members || emptySymbols;
}
if (!symbol.members || symbol.members.size === 0) {
return links.resolvedMembers = dynamicMembers;
}
const resolvedMembers = createMap<Symbol>();
mergeSymbolTable(resolvedMembers, symbol.members);
mergeSymbolTable(resolvedMembers, dynamicMembers);
return links.resolvedMembers = resolvedMembers;
}
return links.resolvedMembers;
}
function getDynamicMembersOfSymbol(symbol: Symbol) {
if (symbol.flags & (SymbolFlags.Class | SymbolFlags.Interface | SymbolFlags.TypeLiteral | SymbolFlags.ObjectLiteral)) {
const links = getSymbolLinks(symbol);
if (!links.dynamicMembers) {
const members = createMap<Symbol>();
for (const decl of symbol.declarations) {
resolveDynamicMembersOfSymbol(decl, members);
}
links.dynamicMembers = members;
}
return links.dynamicMembers;
}
}
function resolveDynamicMembersOfSymbol(node: Declaration, symbolTable: SymbolTable) {
switch (node.kind) {
case SyntaxKind.InterfaceDeclaration:
case SyntaxKind.ClassDeclaration:
case SyntaxKind.ClassExpression:
case SyntaxKind.TypeLiteral:
resolveDynamicMembersOfClassOrInterfaceOrTypeLiteralNode(<ClassLikeDeclaration | InterfaceDeclaration | TypeLiteralNode>node, symbolTable);
break;
case SyntaxKind.ObjectLiteralExpression:
resolveDynamicMembersOfObjectLiteralExpression(<ObjectLiteralExpression>node, symbolTable);
break;
}
}
function resolveDynamicMembersOfClassOrInterfaceOrTypeLiteralNode(node: ClassLikeDeclaration | InterfaceDeclaration | TypeLiteralNode, symbolTable: SymbolTable) {
for (const member of node.members) {
if (member.name && isComputedPropertyName(member.name) && isEntityNameExpression(member.name.expression)) {
bindDynamicMember(symbolTable, node.symbol, member);
}
}
}
function resolveDynamicMembersOfObjectLiteralExpression(node: ObjectLiteralExpression, symbolTable: SymbolTable) {
for (const member of node.properties) {
if (member.name && isComputedPropertyName(member.name) && isEntityNameExpression(member.name.expression)) {
bindDynamicMember(symbolTable, node.symbol, member);
}
}
}
function bindDynamicMember(symbolTable: SymbolTable, parent: Symbol, member: ClassElement | TypeElement | ObjectLiteralElement) {
const links = getNodeLinks(member);
if (!links.resolvedSymbol) {
switch (member.kind) {
case SyntaxKind.PropertyDeclaration:
case SyntaxKind.PropertySignature:
return resolveDynamicMember(symbolTable, parent, member,
SymbolFlags.Property | ((<PropertyDeclaration>member).questionToken ? SymbolFlags.Optional : SymbolFlags.None),
SymbolFlags.PropertyExcludes);
case SyntaxKind.PropertyAssignment:
return resolveDynamicMember(symbolTable, parent, member, SymbolFlags.Property, SymbolFlags.PropertyExcludes);
case SyntaxKind.MethodDeclaration:
case SyntaxKind.MethodSignature:
return resolveDynamicMember(symbolTable, parent, member,
SymbolFlags.Method | ((<MethodDeclaration>member).questionToken ? SymbolFlags.Optional : SymbolFlags.None),
isObjectLiteralMethod(member) ? SymbolFlags.PropertyExcludes : SymbolFlags.MethodExcludes);
case SyntaxKind.GetAccessor:
return resolveDynamicMember(symbolTable, parent, member, SymbolFlags.GetAccessor, SymbolFlags.GetAccessorExcludes);
case SyntaxKind.SetAccessor:
return resolveDynamicMember(symbolTable, parent, member, SymbolFlags.SetAccessor, SymbolFlags.SetAccessorExcludes);
}
}
return links.resolvedSymbol;
}
function resolveDynamicMember(symbolTable: SymbolTable, parent: Symbol, member: ClassElement | TypeElement | ObjectLiteralElement, includes: SymbolFlags, excludes: SymbolFlags) {
Debug.assert(isComputedPropertyName(member.name));
const nameType = checkComputedPropertyName(<ComputedPropertyName>member.name);
if (nameType.flags & TypeFlags.StringOrNumberLiteral) {
// TODO(rbuckton): ESSymbolLiteral
const memberName = escapeIdentifier((<LiteralType>nameType).text);
let symbol = symbolTable.get(memberName);
if (!symbol) {
symbolTable.set(memberName, symbol = createSymbol(SymbolFlags.Dynamic, memberName));
}
const staticMember = parent.members && parent.members.get(memberName);
if (symbol.flags & excludes || staticMember) {
const declarations = staticMember ? concatenate(staticMember.declarations, symbol.declarations) : symbol.declarations;
forEach(declarations, declaration => {
error(declaration.name || declaration, Diagnostics.Duplicate_identifier_0, memberName);
});
error(member.name || member, Diagnostics.Duplicate_identifier_0, memberName);
symbol = createSymbol(SymbolFlags.Dynamic, memberName);
}
addDeclarationToSymbol(symbol, member, includes);
symbol.parent = parent;
return symbol;
}
return getNodeLinks(member).resolvedSymbol = member.symbol || unknownSymbol;
}
function addDeclarationToSymbol(symbol: Symbol, member: ClassElement | TypeElement | ObjectLiteralElement, symbolFlags: SymbolFlags) {
symbol.flags |= symbolFlags;
getNodeLinks(member).resolvedSymbol = symbol;
if (!symbol.declarations) {
symbol.declarations = [member];
}
else {
symbol.declarations.push(member);
}
if (symbolFlags & SymbolFlags.Value) {
const valueDeclaration = symbol.valueDeclaration;
if (!valueDeclaration || valueDeclaration.kind !== member.kind) {
symbol.valueDeclaration = member;
}
}
}
function getTypeWithThisArgument(type: Type, thisArgument?: Type): Type {
if (getObjectFlags(type) & ObjectFlags.Reference) {
const target = (<TypeReference>type).target;
@@ -5165,7 +5299,7 @@ namespace ts {
let numberIndexInfo: IndexInfo;
if (rangeEquals(typeParameters, typeArguments, 0, typeParameters.length)) {
mapper = identityMapper;
members = source.symbol ? source.symbol.members : createSymbolTable(source.declaredProperties);
members = source.symbol ? getMembersOfSymbol(source.symbol) : createSymbolTable(source.declaredProperties);
callSignatures = source.declaredCallSignatures;
constructSignatures = source.declaredConstructSignatures;
stringIndexInfo = source.declaredStringIndexInfo;
@@ -5425,7 +5559,7 @@ namespace ts {
setStructuredTypeMembers(type, members, callSignatures, constructSignatures, stringIndexInfo, numberIndexInfo);
}
else if (symbol.flags & SymbolFlags.TypeLiteral) {
const members = symbol.members;
const members = getMembersOfSymbol(symbol);
const callSignatures = getSignaturesOfSymbol(members.get("__call"));
const constructSignatures = getSignaturesOfSymbol(members.get("__new"));
const stringIndexInfo = getIndexInfoOfSymbol(symbol, IndexKind.String);
@@ -7396,7 +7530,7 @@ namespace ts {
if (!links.resolvedType) {
// Deferred resolution of members is handled by resolveObjectTypeMembers
const aliasSymbol = getAliasSymbolForTypeNode(node);
if (node.symbol.members.size === 0 && !aliasSymbol) {
if (getMembersOfSymbol(node.symbol).size === 0 && !aliasSymbol) {
links.resolvedType = emptyTypeLiteralType;
}
else {
@@ -15623,7 +15757,7 @@ namespace ts {
function getInferredClassType(symbol: Symbol) {
const links = getSymbolLinks(symbol);
if (!links.inferredClassType) {
links.inferredClassType = createAnonymousType(symbol, symbol.members, emptyArray, emptyArray, /*stringIndexType*/ undefined, /*numberIndexType*/ undefined);
links.inferredClassType = createAnonymousType(symbol, getMembersOfSymbol(symbol), emptyArray, emptyArray, /*stringIndexType*/ undefined, /*numberIndexType*/ undefined);
}
return links.inferredClassType;
}
@@ -21741,7 +21875,7 @@ namespace ts {
// (type parameters of classDeclaration/classExpression and interface are in member property of the symbol.
// Note: that the memberFlags come from previous iteration.
if (!(memberFlags & ModifierFlags.Static)) {
copySymbols(getSymbolOfNode(location).members, meaning & SymbolFlags.Type);
copySymbols(getMembersOfSymbol(getSymbolOfNode(location)), meaning & SymbolFlags.Type);
}
break;
case SyntaxKind.FunctionExpression:
@@ -23739,7 +23873,10 @@ namespace ts {
function checkGrammarForNonSymbolComputedProperty(node: DeclarationName, message: DiagnosticMessage) {
if (isDynamicName(node)) {
return grammarErrorOnNode(node, message);
if (!isEntityNameExpression((<ComputedPropertyName>node).expression) ||
(checkExpressionCached((<ComputedPropertyName>node).expression).flags & TypeFlags.StringOrNumberLiteral) === 0) {
return grammarErrorOnNode(node, message);
}
}
}
+3
View File
@@ -2775,6 +2775,7 @@ namespace ts {
ExportStar = 1 << 25, // Export * declaration
Optional = 1 << 26, // Optional property
Transient = 1 << 27, // Transient symbol (created during type check)
Dynamic = 1 << 28, // Dynamically resolved symbol from computed property
Enum = RegularEnum | ConstEnum,
Variable = FunctionScopedVariable | BlockScopedVariable,
@@ -2869,6 +2870,8 @@ namespace ts {
isDeclarationWithCollidingName?: boolean; // True if symbol is block scoped redeclaration
bindingElement?: BindingElement; // Binding element associated with property symbol
exportsSomeValue?: boolean; // True if module exports some value (not just types)
dynamicMembers?: SymbolTable; // Dynamic members with literal names resolved during check
resolvedMembers?: SymbolTable;
}
/* @internal */
+3
View File
@@ -68,6 +68,9 @@ namespace ts {
transformers: {
before: [replaceUndefinedWithVoid0],
after: [replaceIdentifiersNamedOldNameWithNewName]
},
compilerOptions: {
newLine: ts.NewLineKind.CarriageReturnLineFeed
}
}).outputText;
});
+150
View File
@@ -0,0 +1,150 @@
//// [tests/cases/compiler/dynamicNames.ts] ////
//// [module.ts]
export const c0 = "a";
export const c1 = 1;
export interface T0 {
[c0]: number;
[c1]: string;
}
export declare class T1 implements T2 {
[c0]: number;
[c1]: string;
}
export declare class T2 extends T1 {
}
export declare type T3 = {
[c0]: number;
[c1]: string;
};
//// [main.ts]
import { c0, c1, T0, T1, T2, T3 } from "./module";
import * as M from "./module";
namespace N {
export const c2 = "a";
export const c3 = 1;
export interface T4 {
[N.c2]: number;
[N.c3]: string;
}
export declare class T5 implements T4 {
[N.c2]: number;
[N.c3]: string;
}
export declare class T6 extends T5 {
}
export declare type T7 = {
[N.c2]: number;
[N.c3]: string;
};
}
const c4 = "a";
const c5 = 1;
const c6 = "1";
interface T8 {
[c4]: number;
[c5]: string;
}
declare class T9 implements T8 {
[c4]: number;
[c5]: string;
}
declare class T10 extends T9 {
}
declare type T11 = {
[c4]: number;
[c5]: string;
};
interface T12 {
a: number;
1: string;
}
declare class T13 implements T2 {
a: number;
1: string;
}
declare class T14 extends T13 {
}
declare type T15 = {
a: number;
1: string;
};
interface T16 {
[c5]: number;
[c6]: string;
}
let t0: T0;
let t1: T1;
let t2: T2;
let t3: T3;
let t0_1: M.T0;
let t1_1: M.T1;
let t2_1: M.T2;
let t3_1: M.T3;
let t4: N.T4;
let t5: N.T5;
let t6: N.T6;
let t7: N.T7;
let t8: T8;
let t9: T9;
let t10: T10;
let t11: T11;
let t12: T12;
let t13: T13;
let t14: T14;
let t15: T15;
// 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;
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;
//// [module.js]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.c0 = "a";
exports.c1 = 1;
//// [main.js]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var N;
(function (N) {
N.c2 = "a";
N.c3 = 1;
})(N || (N = {}));
const c4 = "a";
const c5 = 1;
const c6 = "1";
let t0;
let t1;
let t2;
let t3;
let t0_1;
let t1_1;
let t2_1;
let t3_1;
let t4;
let t5;
let t6;
let t7;
let t8;
let t9;
let t10;
let t11;
let t12;
let t13;
let t14;
let t15;
// 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;
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;
@@ -0,0 +1,352 @@
=== tests/cases/compiler/module.ts ===
export const c0 = "a";
>c0 : Symbol(c0, Decl(module.ts, 0, 12))
export const c1 = 1;
>c1 : Symbol(c1, Decl(module.ts, 1, 12))
export interface T0 {
>T0 : Symbol(T0, Decl(module.ts, 1, 20))
[c0]: number;
>c0 : Symbol(c0, Decl(module.ts, 0, 12))
[c1]: string;
>c1 : Symbol(c1, Decl(module.ts, 1, 12))
}
export declare class T1 implements T2 {
>T1 : Symbol(T1, Decl(module.ts, 5, 1))
>T2 : Symbol(T2, Decl(module.ts, 9, 1))
[c0]: number;
>c0 : Symbol(c0, Decl(module.ts, 0, 12))
[c1]: string;
>c1 : Symbol(c1, Decl(module.ts, 1, 12))
}
export declare class T2 extends T1 {
>T2 : Symbol(T2, Decl(module.ts, 9, 1))
>T1 : Symbol(T1, Decl(module.ts, 5, 1))
}
export declare type T3 = {
>T3 : Symbol(T3, Decl(module.ts, 11, 1))
[c0]: number;
>c0 : Symbol(c0, Decl(module.ts, 0, 12))
[c1]: string;
>c1 : Symbol(c1, Decl(module.ts, 1, 12))
};
=== tests/cases/compiler/main.ts ===
import { c0, c1, T0, T1, T2, T3 } from "./module";
>c0 : Symbol(c0, Decl(main.ts, 0, 8))
>c1 : Symbol(c1, Decl(main.ts, 0, 12))
>T0 : Symbol(T0, Decl(main.ts, 0, 16))
>T1 : Symbol(T1, Decl(main.ts, 0, 20))
>T2 : Symbol(T2, Decl(main.ts, 0, 24))
>T3 : Symbol(T3, Decl(main.ts, 0, 28))
import * as M from "./module";
>M : Symbol(M, Decl(main.ts, 1, 6))
namespace N {
>N : Symbol(N, Decl(main.ts, 1, 30))
export const c2 = "a";
>c2 : Symbol(c2, Decl(main.ts, 4, 16))
export const c3 = 1;
>c3 : Symbol(c3, Decl(main.ts, 5, 16))
export interface T4 {
>T4 : Symbol(T4, Decl(main.ts, 5, 24))
[N.c2]: number;
>N.c2 : Symbol(c2, Decl(main.ts, 4, 16))
>N : Symbol(N, Decl(main.ts, 1, 30))
>c2 : Symbol(c2, Decl(main.ts, 4, 16))
[N.c3]: string;
>N.c3 : Symbol(c3, Decl(main.ts, 5, 16))
>N : Symbol(N, Decl(main.ts, 1, 30))
>c3 : Symbol(c3, Decl(main.ts, 5, 16))
}
export declare class T5 implements T4 {
>T5 : Symbol(T5, Decl(main.ts, 10, 5))
>T4 : Symbol(T4, Decl(main.ts, 5, 24))
[N.c2]: number;
>N.c2 : Symbol(c2, Decl(main.ts, 4, 16))
>N : Symbol(N, Decl(main.ts, 1, 30))
>c2 : Symbol(c2, Decl(main.ts, 4, 16))
[N.c3]: string;
>N.c3 : Symbol(c3, Decl(main.ts, 5, 16))
>N : Symbol(N, Decl(main.ts, 1, 30))
>c3 : Symbol(c3, Decl(main.ts, 5, 16))
}
export declare class T6 extends T5 {
>T6 : Symbol(T6, Decl(main.ts, 14, 5))
>T5 : Symbol(T5, Decl(main.ts, 10, 5))
}
export declare type T7 = {
>T7 : Symbol(T7, Decl(main.ts, 16, 5))
[N.c2]: number;
>N.c2 : Symbol(c2, Decl(main.ts, 4, 16))
>N : Symbol(N, Decl(main.ts, 1, 30))
>c2 : Symbol(c2, Decl(main.ts, 4, 16))
[N.c3]: string;
>N.c3 : Symbol(c3, Decl(main.ts, 5, 16))
>N : Symbol(N, Decl(main.ts, 1, 30))
>c3 : Symbol(c3, Decl(main.ts, 5, 16))
};
}
const c4 = "a";
>c4 : Symbol(c4, Decl(main.ts, 23, 5))
const c5 = 1;
>c5 : Symbol(c5, Decl(main.ts, 24, 5))
const c6 = "1";
>c6 : Symbol(c6, Decl(main.ts, 25, 5))
interface T8 {
>T8 : Symbol(T8, Decl(main.ts, 25, 15))
[c4]: number;
>c4 : Symbol(c4, Decl(main.ts, 23, 5))
[c5]: string;
>c5 : Symbol(c5, Decl(main.ts, 24, 5))
}
declare class T9 implements T8 {
>T9 : Symbol(T9, Decl(main.ts, 30, 1))
>T8 : Symbol(T8, Decl(main.ts, 25, 15))
[c4]: number;
>c4 : Symbol(c4, Decl(main.ts, 23, 5))
[c5]: string;
>c5 : Symbol(c5, Decl(main.ts, 24, 5))
}
declare class T10 extends T9 {
>T10 : Symbol(T10, Decl(main.ts, 34, 1))
>T9 : Symbol(T9, Decl(main.ts, 30, 1))
}
declare type T11 = {
>T11 : Symbol(T11, Decl(main.ts, 36, 1))
[c4]: number;
>c4 : Symbol(c4, Decl(main.ts, 23, 5))
[c5]: string;
>c5 : Symbol(c5, Decl(main.ts, 24, 5))
};
interface T12 {
>T12 : Symbol(T12, Decl(main.ts, 40, 2))
a: number;
>a : Symbol(T12.a, Decl(main.ts, 42, 15))
1: string;
}
declare class T13 implements T2 {
>T13 : Symbol(T13, Decl(main.ts, 45, 1))
>T2 : Symbol(T2, Decl(main.ts, 0, 24))
a: number;
>a : Symbol(T13.a, Decl(main.ts, 46, 33))
1: string;
}
declare class T14 extends T13 {
>T14 : Symbol(T14, Decl(main.ts, 49, 1))
>T13 : Symbol(T13, Decl(main.ts, 45, 1))
}
declare type T15 = {
>T15 : Symbol(T15, Decl(main.ts, 51, 1))
a: number;
>a : Symbol(a, Decl(main.ts, 52, 20))
1: string;
};
interface T16 {
>T16 : Symbol(T16, Decl(main.ts, 55, 2))
[c5]: number;
>c5 : Symbol(c5, Decl(main.ts, 24, 5))
[c6]: string;
>c6 : Symbol(c6, Decl(main.ts, 25, 5))
}
let t0: T0;
>t0 : Symbol(t0, Decl(main.ts, 63, 3))
>T0 : Symbol(T0, Decl(main.ts, 0, 16))
let t1: T1;
>t1 : Symbol(t1, Decl(main.ts, 64, 3))
>T1 : Symbol(T1, Decl(main.ts, 0, 20))
let t2: T2;
>t2 : Symbol(t2, Decl(main.ts, 65, 3))
>T2 : Symbol(T2, Decl(main.ts, 0, 24))
let t3: T3;
>t3 : Symbol(t3, Decl(main.ts, 66, 3))
>T3 : Symbol(T3, Decl(main.ts, 0, 28))
let t0_1: M.T0;
>t0_1 : Symbol(t0_1, Decl(main.ts, 67, 3))
>M : Symbol(M, Decl(main.ts, 1, 6))
>T0 : Symbol(T0, Decl(module.ts, 1, 20))
let t1_1: M.T1;
>t1_1 : Symbol(t1_1, Decl(main.ts, 68, 3))
>M : Symbol(M, Decl(main.ts, 1, 6))
>T1 : Symbol(T1, Decl(module.ts, 5, 1))
let t2_1: M.T2;
>t2_1 : Symbol(t2_1, Decl(main.ts, 69, 3))
>M : Symbol(M, Decl(main.ts, 1, 6))
>T2 : Symbol(T2, Decl(module.ts, 9, 1))
let t3_1: M.T3;
>t3_1 : Symbol(t3_1, Decl(main.ts, 70, 3))
>M : Symbol(M, Decl(main.ts, 1, 6))
>T3 : Symbol(T3, Decl(module.ts, 11, 1))
let t4: N.T4;
>t4 : Symbol(t4, Decl(main.ts, 71, 3))
>N : Symbol(N, Decl(main.ts, 1, 30))
>T4 : Symbol(N.T4, Decl(main.ts, 5, 24))
let t5: N.T5;
>t5 : Symbol(t5, Decl(main.ts, 72, 3))
>N : Symbol(N, Decl(main.ts, 1, 30))
>T5 : Symbol(N.T5, Decl(main.ts, 10, 5))
let t6: N.T6;
>t6 : Symbol(t6, Decl(main.ts, 73, 3))
>N : Symbol(N, Decl(main.ts, 1, 30))
>T6 : Symbol(N.T6, Decl(main.ts, 14, 5))
let t7: N.T7;
>t7 : Symbol(t7, Decl(main.ts, 74, 3))
>N : Symbol(N, Decl(main.ts, 1, 30))
>T7 : Symbol(N.T7, Decl(main.ts, 16, 5))
let t8: T8;
>t8 : Symbol(t8, Decl(main.ts, 75, 3))
>T8 : Symbol(T8, Decl(main.ts, 25, 15))
let t9: T9;
>t9 : Symbol(t9, Decl(main.ts, 76, 3))
>T9 : Symbol(T9, Decl(main.ts, 30, 1))
let t10: T10;
>t10 : Symbol(t10, Decl(main.ts, 77, 3))
>T10 : Symbol(T10, Decl(main.ts, 34, 1))
let t11: T11;
>t11 : Symbol(t11, Decl(main.ts, 78, 3))
>T11 : Symbol(T11, Decl(main.ts, 36, 1))
let t12: T12;
>t12 : Symbol(t12, Decl(main.ts, 79, 3))
>T12 : Symbol(T12, Decl(main.ts, 40, 2))
let t13: T13;
>t13 : Symbol(t13, Decl(main.ts, 80, 3))
>T13 : Symbol(T13, Decl(main.ts, 45, 1))
let t14: T14;
>t14 : Symbol(t14, Decl(main.ts, 81, 3))
>T14 : Symbol(T14, Decl(main.ts, 49, 1))
let t15: T15;
>t15 : Symbol(t15, Decl(main.ts, 82, 3))
>T15 : Symbol(T15, Decl(main.ts, 51, 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, 63, 3))
>t1 : Symbol(t1, Decl(main.ts, 64, 3))
>t0 : Symbol(t0, Decl(main.ts, 63, 3))
>t2 : Symbol(t2, Decl(main.ts, 65, 3))
>t0 : Symbol(t0, Decl(main.ts, 63, 3))
>t3 : Symbol(t3, Decl(main.ts, 66, 3))
>t1 : Symbol(t1, Decl(main.ts, 64, 3))
>t0 : Symbol(t0, Decl(main.ts, 63, 3))
>t1 : Symbol(t1, Decl(main.ts, 64, 3))
>t2 : Symbol(t2, Decl(main.ts, 65, 3))
>t1 : Symbol(t1, Decl(main.ts, 64, 3))
>t3 : Symbol(t3, Decl(main.ts, 66, 3))
>t2 : Symbol(t2, Decl(main.ts, 65, 3))
>t0 : Symbol(t0, Decl(main.ts, 63, 3))
>t2 : Symbol(t2, Decl(main.ts, 65, 3))
>t1 : Symbol(t1, Decl(main.ts, 64, 3))
>t2 : Symbol(t2, Decl(main.ts, 65, 3))
>t3 : Symbol(t3, Decl(main.ts, 66, 3))
>t3 : Symbol(t3, Decl(main.ts, 66, 3))
>t0 : Symbol(t0, Decl(main.ts, 63, 3))
>t3 : Symbol(t3, Decl(main.ts, 66, 3))
>t1 : Symbol(t1, Decl(main.ts, 64, 3))
>t3 : Symbol(t3, Decl(main.ts, 66, 3))
>t2 : Symbol(t2, Decl(main.ts, 65, 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, 71, 3))
>t5 : Symbol(t5, Decl(main.ts, 72, 3))
>t4 : Symbol(t4, Decl(main.ts, 71, 3))
>t6 : Symbol(t6, Decl(main.ts, 73, 3))
>t4 : Symbol(t4, Decl(main.ts, 71, 3))
>t7 : Symbol(t7, Decl(main.ts, 74, 3))
>t5 : Symbol(t5, Decl(main.ts, 72, 3))
>t4 : Symbol(t4, Decl(main.ts, 71, 3))
>t5 : Symbol(t5, Decl(main.ts, 72, 3))
>t6 : Symbol(t6, Decl(main.ts, 73, 3))
>t5 : Symbol(t5, Decl(main.ts, 72, 3))
>t7 : Symbol(t7, Decl(main.ts, 74, 3))
>t6 : Symbol(t6, Decl(main.ts, 73, 3))
>t4 : Symbol(t4, Decl(main.ts, 71, 3))
>t6 : Symbol(t6, Decl(main.ts, 73, 3))
>t5 : Symbol(t5, Decl(main.ts, 72, 3))
>t6 : Symbol(t6, Decl(main.ts, 73, 3))
>t7 : Symbol(t7, Decl(main.ts, 74, 3))
>t7 : Symbol(t7, Decl(main.ts, 74, 3))
>t4 : Symbol(t4, Decl(main.ts, 71, 3))
>t7 : Symbol(t7, Decl(main.ts, 74, 3))
>t5 : Symbol(t5, Decl(main.ts, 72, 3))
>t7 : Symbol(t7, Decl(main.ts, 74, 3))
>t6 : Symbol(t6, Decl(main.ts, 73, 3))
t0 = t12, t0 = t13, t0 = t14, t0 = t15, t12 = t0, t13 = t0, t14 = t0, t15 = t0;
>t0 : Symbol(t0, Decl(main.ts, 63, 3))
>t12 : Symbol(t12, Decl(main.ts, 79, 3))
>t0 : Symbol(t0, Decl(main.ts, 63, 3))
>t13 : Symbol(t13, Decl(main.ts, 80, 3))
>t0 : Symbol(t0, Decl(main.ts, 63, 3))
>t14 : Symbol(t14, Decl(main.ts, 81, 3))
>t0 : Symbol(t0, Decl(main.ts, 63, 3))
>t15 : Symbol(t15, Decl(main.ts, 82, 3))
>t12 : Symbol(t12, Decl(main.ts, 79, 3))
>t0 : Symbol(t0, Decl(main.ts, 63, 3))
>t13 : Symbol(t13, Decl(main.ts, 80, 3))
>t0 : Symbol(t0, Decl(main.ts, 63, 3))
>t14 : Symbol(t14, Decl(main.ts, 81, 3))
>t0 : Symbol(t0, Decl(main.ts, 63, 3))
>t15 : Symbol(t15, Decl(main.ts, 82, 3))
>t0 : Symbol(t0, Decl(main.ts, 63, 3))
@@ -0,0 +1,420 @@
=== tests/cases/compiler/module.ts ===
export const c0 = "a";
>c0 : "a"
>"a" : "a"
export const c1 = 1;
>c1 : 1
>1 : 1
export interface T0 {
>T0 : T0
[c0]: number;
>c0 : "a"
[c1]: string;
>c1 : 1
}
export declare class T1 implements T2 {
>T1 : T1
>T2 : T2
[c0]: number;
>c0 : "a"
[c1]: string;
>c1 : 1
}
export declare class T2 extends T1 {
>T2 : T2
>T1 : T1
}
export declare type T3 = {
>T3 : T3
[c0]: number;
>c0 : "a"
[c1]: string;
>c1 : 1
};
=== tests/cases/compiler/main.ts ===
import { c0, c1, T0, T1, T2, T3 } from "./module";
>c0 : "a"
>c1 : 1
>T0 : any
>T1 : typeof T1
>T2 : typeof T2
>T3 : any
import * as M from "./module";
>M : typeof M
namespace N {
>N : typeof N
export const c2 = "a";
>c2 : "a"
>"a" : "a"
export const c3 = 1;
>c3 : 1
>1 : 1
export interface T4 {
>T4 : T4
[N.c2]: number;
>N.c2 : "a"
>N : typeof N
>c2 : "a"
[N.c3]: string;
>N.c3 : 1
>N : typeof N
>c3 : 1
}
export declare class T5 implements T4 {
>T5 : T5
>T4 : T4
[N.c2]: number;
>N.c2 : "a"
>N : typeof N
>c2 : "a"
[N.c3]: string;
>N.c3 : 1
>N : typeof N
>c3 : 1
}
export declare class T6 extends T5 {
>T6 : T6
>T5 : T5
}
export declare type T7 = {
>T7 : { a: number; 1: string; }
[N.c2]: number;
>N.c2 : "a"
>N : typeof N
>c2 : "a"
[N.c3]: string;
>N.c3 : 1
>N : typeof N
>c3 : 1
};
}
const c4 = "a";
>c4 : "a"
>"a" : "a"
const c5 = 1;
>c5 : 1
>1 : 1
const c6 = "1";
>c6 : "1"
>"1" : "1"
interface T8 {
>T8 : T8
[c4]: number;
>c4 : "a"
[c5]: string;
>c5 : 1
}
declare class T9 implements T8 {
>T9 : T9
>T8 : T8
[c4]: number;
>c4 : "a"
[c5]: string;
>c5 : 1
}
declare class T10 extends T9 {
>T10 : T10
>T9 : T9
}
declare type T11 = {
>T11 : { a: number; 1: string; }
[c4]: number;
>c4 : "a"
[c5]: string;
>c5 : 1
};
interface T12 {
>T12 : T12
a: number;
>a : number
1: string;
}
declare class T13 implements T2 {
>T13 : T13
>T2 : T2
a: number;
>a : number
1: string;
}
declare class T14 extends T13 {
>T14 : T14
>T13 : T13
}
declare type T15 = {
>T15 : { a: number; 1: string; }
a: number;
>a : number
1: string;
};
interface T16 {
>T16 : T16
[c5]: number;
>c5 : 1
[c6]: string;
>c6 : "1"
}
let t0: T0;
>t0 : T0
>T0 : T0
let t1: T1;
>t1 : T1
>T1 : T1
let t2: T2;
>t2 : T2
>T2 : T2
let t3: T3;
>t3 : T3
>T3 : T3
let t0_1: M.T0;
>t0_1 : T0
>M : any
>T0 : T0
let t1_1: M.T1;
>t1_1 : T1
>M : any
>T1 : T1
let t2_1: M.T2;
>t2_1 : T2
>M : any
>T2 : T2
let t3_1: M.T3;
>t3_1 : T3
>M : any
>T3 : T3
let t4: N.T4;
>t4 : N.T4
>N : any
>T4 : N.T4
let t5: N.T5;
>t5 : N.T5
>N : any
>T5 : N.T5
let t6: N.T6;
>t6 : N.T6
>N : any
>T6 : N.T6
let t7: N.T7;
>t7 : { a: number; 1: string; }
>N : any
>T7 : { a: number; 1: string; }
let t8: T8;
>t8 : T8
>T8 : T8
let t9: T9;
>t9 : T9
>T9 : T9
let t10: T10;
>t10 : T10
>T10 : T10
let t11: T11;
>t11 : { a: number; 1: string; }
>T11 : { a: number; 1: string; }
let t12: T12;
>t12 : T12
>T12 : T12
let t13: T13;
>t13 : T13
>T13 : T13
let t14: T14;
>t14 : T14
>T14 : T14
let t15: T15;
>t15 : { a: number; 1: string; }
>T15 : { a: number; 1: string; }
// 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 = t1, t0 = t2, t0 = t3, t1 = t0, t1 = t2, t1 = t3, t2 = t0, t2 = t1, t2 = t3, t3 = t0, t3 = t1, t3 = t2 : T2
>t0 = t1, t0 = t2, t0 = t3, t1 = t0, t1 = t2, t1 = t3, t2 = t0, t2 = t1, t2 = t3, t3 = t0, t3 = t1 : T1
>t0 = t1, t0 = t2, t0 = t3, t1 = t0, t1 = t2, t1 = t3, t2 = t0, t2 = t1, t2 = t3, t3 = t0 : T0
>t0 = t1, t0 = t2, t0 = t3, t1 = t0, t1 = t2, t1 = t3, t2 = t0, t2 = t1, t2 = t3 : T3
>t0 = t1, t0 = t2, t0 = t3, t1 = t0, t1 = t2, t1 = t3, t2 = t0, t2 = t1 : T1
>t0 = t1, t0 = t2, t0 = t3, t1 = t0, t1 = t2, t1 = t3, t2 = t0 : T0
>t0 = t1, t0 = t2, t0 = t3, t1 = t0, t1 = t2, t1 = t3 : T3
>t0 = t1, t0 = t2, t0 = t3, t1 = t0, t1 = t2 : T2
>t0 = t1, t0 = t2, t0 = t3, t1 = t0 : T0
>t0 = t1, t0 = t2, t0 = t3 : T3
>t0 = t1, t0 = t2 : T2
>t0 = t1 : T1
>t0 : T0
>t1 : T1
>t0 = t2 : T2
>t0 : T0
>t2 : T2
>t0 = t3 : T3
>t0 : T0
>t3 : T3
>t1 = t0 : T0
>t1 : T1
>t0 : T0
>t1 = t2 : T2
>t1 : T1
>t2 : T2
>t1 = t3 : T3
>t1 : T1
>t3 : T3
>t2 = t0 : T0
>t2 : T2
>t0 : T0
>t2 = t1 : T1
>t2 : T2
>t1 : T1
>t2 = t3 : T3
>t2 : T2
>t3 : T3
>t3 = t0 : T0
>t3 : T3
>t0 : T0
>t3 = t1 : T1
>t3 : T3
>t1 : T1
>t3 = t2 : T2
>t3 : T3
>t2 : 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;
>t4 = t5, t4 = t6, t4 = t7, t5 = t4, t5 = t6, t5 = t7, t6 = t4, t6 = t5, t6 = t7, t7 = t4, t7 = t5, t7 = t6 : N.T6
>t4 = t5, t4 = t6, t4 = t7, t5 = t4, t5 = t6, t5 = t7, t6 = t4, t6 = t5, t6 = t7, t7 = t4, t7 = t5 : N.T5
>t4 = t5, t4 = t6, t4 = t7, t5 = t4, t5 = t6, t5 = t7, t6 = t4, t6 = t5, t6 = t7, t7 = t4 : N.T4
>t4 = t5, t4 = t6, t4 = t7, t5 = t4, t5 = t6, t5 = t7, t6 = t4, t6 = t5, t6 = t7 : { a: number; 1: string; }
>t4 = t5, t4 = t6, t4 = t7, t5 = t4, t5 = t6, t5 = t7, t6 = t4, t6 = t5 : N.T5
>t4 = t5, t4 = t6, t4 = t7, t5 = t4, t5 = t6, t5 = t7, t6 = t4 : N.T4
>t4 = t5, t4 = t6, t4 = t7, t5 = t4, t5 = t6, t5 = t7 : { a: number; 1: string; }
>t4 = t5, t4 = t6, t4 = t7, t5 = t4, t5 = t6 : N.T6
>t4 = t5, t4 = t6, t4 = t7, t5 = t4 : N.T4
>t4 = t5, t4 = t6, t4 = t7 : { a: number; 1: string; }
>t4 = t5, t4 = t6 : N.T6
>t4 = t5 : N.T5
>t4 : N.T4
>t5 : N.T5
>t4 = t6 : N.T6
>t4 : N.T4
>t6 : N.T6
>t4 = t7 : { a: number; 1: string; }
>t4 : N.T4
>t7 : { a: number; 1: string; }
>t5 = t4 : N.T4
>t5 : N.T5
>t4 : N.T4
>t5 = t6 : N.T6
>t5 : N.T5
>t6 : N.T6
>t5 = t7 : { a: number; 1: string; }
>t5 : N.T5
>t7 : { a: number; 1: string; }
>t6 = t4 : N.T4
>t6 : N.T6
>t4 : N.T4
>t6 = t5 : N.T5
>t6 : N.T6
>t5 : N.T5
>t6 = t7 : { a: number; 1: string; }
>t6 : N.T6
>t7 : { a: number; 1: string; }
>t7 = t4 : N.T4
>t7 : { a: number; 1: string; }
>t4 : N.T4
>t7 = t5 : N.T5
>t7 : { a: number; 1: string; }
>t5 : N.T5
>t7 = t6 : N.T6
>t7 : { a: number; 1: string; }
>t6 : N.T6
t0 = t12, t0 = t13, t0 = t14, t0 = t15, t12 = t0, t13 = t0, t14 = t0, t15 = t0;
>t0 = t12, t0 = t13, t0 = t14, t0 = t15, t12 = t0, t13 = t0, t14 = t0, t15 = t0 : T0
>t0 = t12, t0 = t13, t0 = t14, t0 = t15, t12 = t0, t13 = t0, t14 = t0 : T0
>t0 = t12, t0 = t13, t0 = t14, t0 = t15, t12 = t0, t13 = t0 : T0
>t0 = t12, t0 = t13, t0 = t14, t0 = t15, t12 = t0 : T0
>t0 = t12, t0 = t13, t0 = t14, t0 = t15 : { a: number; 1: string; }
>t0 = t12, t0 = t13, t0 = t14 : T14
>t0 = t12, t0 = t13 : T13
>t0 = t12 : T12
>t0 : T0
>t12 : T12
>t0 = t13 : T13
>t0 : T0
>t13 : T13
>t0 = t14 : T14
>t0 : T0
>t14 : T14
>t0 = t15 : { a: number; 1: string; }
>t0 : T0
>t15 : { a: number; 1: string; }
>t12 = t0 : T0
>t12 : T12
>t0 : T0
>t13 = t0 : T0
>t13 : T13
>t0 : T0
>t14 = t0 : T0
>t14 : T14
>t0 : T0
>t15 = t0 : T0
>t15 : { a: number; 1: string; }
>t0 : T0
@@ -0,0 +1,43 @@
tests/cases/compiler/dynamicNamesErrors.ts(5,5): error TS2300: Duplicate identifier '1'.
tests/cases/compiler/dynamicNamesErrors.ts(6,5): error TS2300: Duplicate identifier '1'.
tests/cases/compiler/dynamicNamesErrors.ts(19,1): error TS2322: Type 'T2' is not assignable to type 'T1'.
Types of property '1' are incompatible.
Type 'string' is not assignable to type 'number'.
tests/cases/compiler/dynamicNamesErrors.ts(20,1): error TS2322: Type 'T1' is not assignable to type 'T2'.
Types of property '1' are incompatible.
Type 'number' is not assignable to type 'string'.
==== tests/cases/compiler/dynamicNamesErrors.ts (4 errors) ====
const c0 = "1";
const c1 = 1;
interface T0 {
[c0]: number;
~~~~
!!! error TS2300: Duplicate identifier '1'.
1: number;
~
!!! error TS2300: Duplicate identifier '1'.
}
interface T1 {
[c0]: number;
}
interface T2 {
[c0]: string;
}
let t1: T1;
let t2: T2;
t1 = t2;
~~
!!! error TS2322: Type 'T2' is not assignable to type 'T1'.
!!! error TS2322: Types of property '1' are incompatible.
!!! error TS2322: Type 'string' is not assignable to type 'number'.
t2 = t1;
~~
!!! error TS2322: Type 'T1' is not assignable to type 'T2'.
!!! error TS2322: Types of property '1' are incompatible.
!!! error TS2322: Type 'number' is not assignable to type 'string'.
@@ -0,0 +1,29 @@
//// [dynamicNamesErrors.ts]
const c0 = "1";
const c1 = 1;
interface T0 {
[c0]: number;
1: number;
}
interface T1 {
[c0]: number;
}
interface T2 {
[c0]: string;
}
let t1: T1;
let t2: T2;
t1 = t2;
t2 = t1;
//// [dynamicNamesErrors.js]
const c0 = "1";
const c1 = 1;
let t1;
let t2;
t1 = t2;
t2 = t1;
@@ -1 +1 @@
var newName = void 0 /*undefined*/;
var newName = void 0 /*undefined*/;
+109
View File
@@ -0,0 +1,109 @@
// @target: esnext
// @module: commonjs
// @filename: module.ts
export const c0 = "a";
export const c1 = 1;
export interface T0 {
[c0]: number;
[c1]: string;
}
export declare class T1 implements T2 {
[c0]: number;
[c1]: string;
}
export declare class T2 extends T1 {
}
export declare type T3 = {
[c0]: number;
[c1]: string;
};
// @filename: main.ts
import { c0, c1, T0, T1, T2, T3 } from "./module";
import * as M from "./module";
namespace N {
export const c2 = "a";
export const c3 = 1;
export interface T4 {
[N.c2]: number;
[N.c3]: string;
}
export declare class T5 implements T4 {
[N.c2]: number;
[N.c3]: string;
}
export declare class T6 extends T5 {
}
export declare type T7 = {
[N.c2]: number;
[N.c3]: string;
};
}
const c4 = "a";
const c5 = 1;
const c6 = "1";
interface T8 {
[c4]: number;
[c5]: string;
}
declare class T9 implements T8 {
[c4]: number;
[c5]: string;
}
declare class T10 extends T9 {
}
declare type T11 = {
[c4]: number;
[c5]: string;
};
interface T12 {
a: number;
1: string;
}
declare class T13 implements T2 {
a: number;
1: string;
}
declare class T14 extends T13 {
}
declare type T15 = {
a: number;
1: string;
};
interface T16 {
[c5]: number;
[c6]: string;
}
let t0: T0;
let t1: T1;
let t2: T2;
let t3: T3;
let t0_1: M.T0;
let t1_1: M.T1;
let t2_1: M.T2;
let t3_1: M.T3;
let t4: N.T4;
let t5: N.T5;
let t6: N.T6;
let t7: N.T7;
let t8: T8;
let t9: T9;
let t10: T10;
let t11: T11;
let t12: T12;
let t13: T13;
let t14: T14;
let t15: T15;
// 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;
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;
@@ -0,0 +1,22 @@
// @target: esnext
const c0 = "1";
const c1 = 1;
interface T0 {
[c0]: number;
1: number;
}
interface T1 {
[c0]: number;
}
interface T2 {
[c0]: string;
}
let t1: T1;
let t2: T2;
t1 = t2;
t2 = t1;