Skip to content

Commit dceebcd

Browse files
committed
Refactor getTypeFromTypeLiteral, from PR comments
1 parent 3a85312 commit dceebcd

1 file changed

Lines changed: 56 additions & 54 deletions

File tree

src/compiler/checker.ts

Lines changed: 56 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -5710,67 +5710,69 @@ namespace ts {
57105710
function getTypeFromTypeLiteralOrFunctionOrConstructorTypeNode(node: Node, aliasSymbol?: Symbol, aliasTypeArguments?: Type[]): Type {
57115711
const links = getNodeLinks(node);
57125712
if (!links.resolvedType) {
5713-
const isSpread = (node.kind === SyntaxKind.TypeLiteral &&
5714-
find((node as TypeLiteralNode).members, elt => elt.kind === SyntaxKind.SpreadTypeElement));
5715-
let type: ObjectType;
5716-
if (isSpread) {
5717-
let members: Map<Symbol>;
5718-
let stringIndexInfo: IndexInfo;
5719-
let numberIndexInfo: IndexInfo;
5720-
const spreads: Type[] = [];
5721-
for (const member of (node as TypeLiteralNode).members) {
5722-
if (member.kind === SyntaxKind.SpreadTypeElement) {
5723-
if (members) {
5724-
spreads.push(createAnonymousType(node.symbol, members, emptyArray, emptyArray, stringIndexInfo, numberIndexInfo));
5725-
members = undefined;
5726-
stringIndexInfo = undefined;
5727-
numberIndexInfo = undefined;
5728-
}
5729-
spreads.push(getTypeFromTypeNode((member as SpreadTypeElement).type));
5730-
}
5731-
else if (member.kind === SyntaxKind.IndexSignature) {
5732-
const index = member as IndexSignatureDeclaration;
5733-
if (index.parameters.length === 1) {
5734-
const parameter = index.parameters[0];
5735-
if (parameter && parameter.type) {
5736-
const indexInfo = createIndexInfo(index.type ? getTypeFromTypeNode(index.type) : anyType,
5737-
(getModifierFlags(index) & ModifierFlags.Readonly) !== 0, index);
5738-
if (parameter.type.kind === SyntaxKind.StringKeyword) {
5739-
stringIndexInfo = indexInfo;
5740-
}
5741-
else {
5742-
numberIndexInfo = indexInfo;
5743-
}
5744-
}
5713+
const hasSpread = (node.kind === SyntaxKind.TypeLiteral &&
5714+
find((node as TypeLiteralNode).members, elt => elt.kind === SyntaxKind.SpreadTypeElement));
5715+
if (hasSpread) {
5716+
return getTypeFromSpreadTypeLiteral(node, aliasSymbol, aliasTypeArguments);
5717+
}
5718+
5719+
let type = createObjectType(TypeFlags.Anonymous, node.symbol);
5720+
type.aliasSymbol = aliasSymbol;
5721+
type.aliasTypeArguments = aliasTypeArguments;
5722+
links.resolvedType = type;
5723+
}
5724+
return links.resolvedType;
5725+
}
5726+
5727+
function getTypeFromSpreadTypeLiteral(node: Node, aliasSymbol?: Symbol, aliasTypeArguments?: Type[]): Type {
5728+
let members: Map<Symbol>;
5729+
let stringIndexInfo: IndexInfo;
5730+
let numberIndexInfo: IndexInfo;
5731+
const spreads: Type[] = [];
5732+
for (const member of (node as TypeLiteralNode).members) {
5733+
if (member.kind === SyntaxKind.SpreadTypeElement) {
5734+
if (members) {
5735+
spreads.push(createAnonymousType(node.symbol, members, emptyArray, emptyArray, stringIndexInfo, numberIndexInfo));
5736+
members = undefined;
5737+
stringIndexInfo = undefined;
5738+
numberIndexInfo = undefined;
5739+
}
5740+
spreads.push(getTypeFromTypeNode((member as SpreadTypeElement).type));
5741+
}
5742+
else if (member.kind === SyntaxKind.IndexSignature) {
5743+
const index = member as IndexSignatureDeclaration;
5744+
if (index.parameters.length === 1) {
5745+
const parameter = index.parameters[0];
5746+
if (parameter && parameter.type) {
5747+
const indexInfo = createIndexInfo(index.type ? getTypeFromTypeNode(index.type) : anyType,
5748+
(getModifierFlags(index) & ModifierFlags.Readonly) !== 0, index);
5749+
if (parameter.type.kind === SyntaxKind.StringKeyword) {
5750+
stringIndexInfo = indexInfo;
57455751
}
5746-
}
5747-
else if (member.kind !== SyntaxKind.CallSignature && member.kind !== SyntaxKind.ConstructSignature) {
5748-
// note that spread types don't include call and construct signatures
5749-
const flags = SymbolFlags.Property | SymbolFlags.Transient | (member.questionToken ? SymbolFlags.Optional : 0);
5750-
const text = getTextOfPropertyName(member.name);
5751-
const symbol = <TransientSymbol>createSymbol(flags, text);
5752-
symbol.declarations = [member];
5753-
symbol.valueDeclaration = member;
5754-
symbol.type = getTypeFromTypeNodeNoAlias((member as IndexSignatureDeclaration | PropertySignature | MethodSignature).type);
5755-
if (!members) {
5756-
members = createMap<Symbol>();
5752+
else {
5753+
numberIndexInfo = indexInfo;
57575754
}
5758-
members[symbol.name] = symbol;
57595755
}
57605756
}
5761-
if (members || stringIndexInfo || numberIndexInfo) {
5762-
spreads.push(createAnonymousType(node.symbol, members || emptySymbols, emptyArray, emptyArray, stringIndexInfo, numberIndexInfo));
5763-
}
5764-
return getSpreadType(spreads, node.symbol, aliasSymbol, aliasTypeArguments);
57655757
}
5766-
else {
5767-
type = createObjectType(TypeFlags.Anonymous, node.symbol);
5758+
else if (member.kind !== SyntaxKind.CallSignature && member.kind !== SyntaxKind.ConstructSignature) {
5759+
// note that spread types don't include call and construct signatures
5760+
const flags = SymbolFlags.Property | SymbolFlags.Transient | (member.questionToken ? SymbolFlags.Optional : 0);
5761+
const text = getTextOfPropertyName(member.name);
5762+
const symbol = <TransientSymbol>createSymbol(flags, text);
5763+
symbol.declarations = [member];
5764+
symbol.valueDeclaration = member;
5765+
symbol.type = getTypeFromTypeNodeNoAlias((member as IndexSignatureDeclaration | PropertySignature | MethodSignature).type);
5766+
if (!members) {
5767+
members = createMap<Symbol>();
5768+
}
5769+
members[symbol.name] = symbol;
57685770
}
5769-
type.aliasSymbol = aliasSymbol;
5770-
type.aliasTypeArguments = aliasTypeArguments;
5771-
links.resolvedType = type;
57725771
}
5773-
return links.resolvedType;
5772+
if (members || stringIndexInfo || numberIndexInfo) {
5773+
spreads.push(createAnonymousType(node.symbol, members || emptySymbols, emptyArray, emptyArray, stringIndexInfo, numberIndexInfo));
5774+
}
5775+
return getSpreadType(spreads, node.symbol, aliasSymbol, aliasTypeArguments);
57745776
}
57755777

57765778
function getSpreadType(types: Type[], symbol: Symbol, aliasSymbol?: Symbol, aliasTypeArguments?: Type[]): Type {

0 commit comments

Comments
 (0)