Skip to content

Commit 89bfbd0

Browse files
Make StringLiterals and HeritageClauses into TypeNodes. It makes the checker much simpler and nicer.
1 parent b22e0e9 commit 89bfbd0

File tree

3 files changed

+43
-39
lines changed

3 files changed

+43
-39
lines changed

src/compiler/checker.ts

Lines changed: 40 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -597,7 +597,7 @@ module ts {
597597
if (moduleSymbol.flags & SymbolFlags.Variable) {
598598
let typeAnnotation = (<VariableDeclaration>moduleSymbol.valueDeclaration).type;
599599
if (typeAnnotation) {
600-
return getPropertyOfType(getTypeFromTypeNodeOrHeritageClauseElement(typeAnnotation), name);
600+
return getPropertyOfType(getTypeFromTypeNode(typeAnnotation), name);
601601
}
602602
}
603603
}
@@ -646,7 +646,7 @@ module ts {
646646
if (symbol.flags & SymbolFlags.Variable) {
647647
var typeAnnotation = (<VariableDeclaration>symbol.valueDeclaration).type;
648648
if (typeAnnotation) {
649-
return resolveSymbol(getPropertyOfType(getTypeFromTypeNodeOrHeritageClauseElement(typeAnnotation), name));
649+
return resolveSymbol(getPropertyOfType(getTypeFromTypeNode(typeAnnotation), name));
650650
}
651651
}
652652
}
@@ -2127,7 +2127,7 @@ module ts {
21272127
}
21282128
// Use type from type annotation if one is present
21292129
if (declaration.type) {
2130-
return getTypeFromTypeNodeOrHeritageClauseElement(declaration.type);
2130+
return getTypeFromTypeNode(declaration.type);
21312131
}
21322132
if (declaration.kind === SyntaxKind.Parameter) {
21332133
let func = <FunctionLikeDeclaration>declaration.parent;
@@ -2289,18 +2289,18 @@ module ts {
22892289
return links.type;
22902290
}
22912291

2292-
function getSetAccessorTypeAnnotationNode(accessor: AccessorDeclaration): TypeNode | LiteralExpression {
2292+
function getSetAccessorTypeAnnotationNode(accessor: AccessorDeclaration): TypeNode {
22932293
return accessor && accessor.parameters.length > 0 && accessor.parameters[0].type;
22942294
}
22952295

22962296
function getAnnotatedAccessorType(accessor: AccessorDeclaration): Type {
22972297
if (accessor) {
22982298
if (accessor.kind === SyntaxKind.GetAccessor) {
2299-
return accessor.type && getTypeFromTypeNodeOrHeritageClauseElement(accessor.type);
2299+
return accessor.type && getTypeFromTypeNode(accessor.type);
23002300
}
23012301
else {
23022302
let setterTypeAnnotation = getSetAccessorTypeAnnotationNode(accessor);
2303-
return setterTypeAnnotation && getTypeFromTypeNodeOrHeritageClauseElement(setterTypeAnnotation);
2303+
return setterTypeAnnotation && getTypeFromTypeNode(setterTypeAnnotation);
23042304
}
23052305
}
23062306
return undefined;
@@ -2541,7 +2541,7 @@ module ts {
25412541
if (!links.declaredType) {
25422542
links.declaredType = resolvingType;
25432543
let declaration = <TypeAliasDeclaration>getDeclarationOfKind(symbol, SyntaxKind.TypeAliasDeclaration);
2544-
let type = getTypeFromTypeNodeOrHeritageClauseElement(declaration.type);
2544+
let type = getTypeFromTypeNode(declaration.type);
25452545
if (links.declaredType === resolvingType) {
25462546
links.declaredType = type;
25472547
}
@@ -3083,7 +3083,7 @@ module ts {
30833083
returnType = classType;
30843084
}
30853085
else if (declaration.type) {
3086-
returnType = getTypeFromTypeNodeOrHeritageClauseElement(declaration.type);
3086+
returnType = getTypeFromTypeNode(declaration.type);
30873087
}
30883088
else {
30893089
// TypeScript 1.0 spec (April 2014):
@@ -3241,7 +3241,7 @@ module ts {
32413241
function getIndexTypeOfSymbol(symbol: Symbol, kind: IndexKind): Type {
32423242
let declaration = getIndexDeclarationOfSymbol(symbol, kind);
32433243
return declaration
3244-
? declaration.type ? getTypeFromTypeNodeOrHeritageClauseElement(declaration.type) : anyType
3244+
? declaration.type ? getTypeFromTypeNode(declaration.type) : anyType
32453245
: undefined;
32463246
}
32473247

@@ -3252,7 +3252,7 @@ module ts {
32523252
type.constraint = targetConstraint ? instantiateType(targetConstraint, type.mapper) : noConstraintType;
32533253
}
32543254
else {
3255-
type.constraint = getTypeFromTypeNodeOrHeritageClauseElement((<TypeParameterDeclaration>getDeclarationOfKind(type.symbol, SyntaxKind.TypeParameter)).constraint);
3255+
type.constraint = getTypeFromTypeNode((<TypeParameterDeclaration>getDeclarationOfKind(type.symbol, SyntaxKind.TypeParameter)).constraint);
32563256
}
32573257
}
32583258
return type.constraint === noConstraintType ? undefined : type.constraint;
@@ -3383,7 +3383,7 @@ module ts {
33833383
if (type.flags & (TypeFlags.Class | TypeFlags.Interface) && type.flags & TypeFlags.Reference) {
33843384
let typeParameters = (<InterfaceType>type).typeParameters;
33853385
if (node.typeArguments && node.typeArguments.length === typeParameters.length) {
3386-
type = createTypeReference(<GenericType>type, map(node.typeArguments, getTypeFromTypeNodeOrHeritageClauseElement));
3386+
type = createTypeReference(<GenericType>type, map(node.typeArguments, getTypeFromTypeNode));
33873387
}
33883388
else {
33893389
error(node, Diagnostics.Generic_type_0_requires_1_type_argument_s, typeToString(type, /*enclosingDeclaration*/ undefined, TypeFormatFlags.WriteArrayAsGenericType), typeParameters.length);
@@ -3481,7 +3481,7 @@ module ts {
34813481
function getTypeFromArrayTypeNode(node: ArrayTypeNode): Type {
34823482
let links = getNodeLinks(node);
34833483
if (!links.resolvedType) {
3484-
links.resolvedType = createArrayType(getTypeFromTypeNodeOrHeritageClauseElement(node.elementType));
3484+
links.resolvedType = createArrayType(getTypeFromTypeNode(node.elementType));
34853485
}
34863486
return links.resolvedType;
34873487
}
@@ -3499,7 +3499,7 @@ module ts {
34993499
function getTypeFromTupleTypeNode(node: TupleTypeNode): Type {
35003500
let links = getNodeLinks(node);
35013501
if (!links.resolvedType) {
3502-
links.resolvedType = createTupleType(map(node.elementTypes, getTypeFromTypeNodeOrHeritageClauseElement));
3502+
links.resolvedType = createTupleType(map(node.elementTypes, getTypeFromTypeNode));
35033503
}
35043504
return links.resolvedType;
35053505
}
@@ -3608,7 +3608,7 @@ module ts {
36083608
function getTypeFromUnionTypeNode(node: UnionTypeNode): Type {
36093609
let links = getNodeLinks(node);
36103610
if (!links.resolvedType) {
3611-
links.resolvedType = getUnionType(map(node.types, getTypeFromTypeNodeOrHeritageClauseElement), /*noSubtypeReduction*/ true);
3611+
links.resolvedType = getUnionType(map(node.types, getTypeFromTypeNode), /*noSubtypeReduction*/ true);
36123612
}
36133613
return links.resolvedType;
36143614
}
@@ -3622,7 +3622,7 @@ module ts {
36223622
return links.resolvedType;
36233623
}
36243624

3625-
function getStringLiteralType(node: LiteralExpression): StringLiteralType {
3625+
function getStringLiteralType(node: StringLiteralExpression): StringLiteralType {
36263626
if (hasProperty(stringLiteralTypes, node.text)) {
36273627
return stringLiteralTypes[node.text];
36283628
}
@@ -3632,15 +3632,15 @@ module ts {
36323632
return type;
36333633
}
36343634

3635-
function getTypeFromStringLiteral(node: LiteralExpression): Type {
3635+
function getTypeFromStringLiteral(node: StringLiteralExpression): Type {
36363636
let links = getNodeLinks(node);
36373637
if (!links.resolvedType) {
36383638
links.resolvedType = getStringLiteralType(node);
36393639
}
36403640
return links.resolvedType;
36413641
}
36423642

3643-
function getTypeFromTypeNodeOrHeritageClauseElement(node: TypeNode | LiteralExpression | HeritageClauseElement): Type {
3643+
function getTypeFromTypeNode(node: TypeNode): Type {
36443644
switch (node.kind) {
36453645
case SyntaxKind.AnyKeyword:
36463646
return anyType;
@@ -3655,7 +3655,7 @@ module ts {
36553655
case SyntaxKind.VoidKeyword:
36563656
return voidType;
36573657
case SyntaxKind.StringLiteral:
3658-
return getTypeFromStringLiteral(<LiteralExpression>node);
3658+
return getTypeFromStringLiteral(<StringLiteralExpression>node);
36593659
case SyntaxKind.TypeReference:
36603660
return getTypeFromTypeReference(<TypeReferenceNode>node);
36613661
case SyntaxKind.HeritageClauseElement:
@@ -3669,7 +3669,7 @@ module ts {
36693669
case SyntaxKind.UnionType:
36703670
return getTypeFromUnionTypeNode(<UnionTypeNode>node);
36713671
case SyntaxKind.ParenthesizedType:
3672-
return getTypeFromTypeNodeOrHeritageClauseElement((<ParenthesizedTypeNode>node).type);
3672+
return getTypeFromTypeNode((<ParenthesizedTypeNode>node).type);
36733673
case SyntaxKind.FunctionType:
36743674
case SyntaxKind.ConstructorType:
36753675
case SyntaxKind.TypeLiteral:
@@ -5680,7 +5680,7 @@ module ts {
56805680
let declaration = <VariableLikeDeclaration>node.parent;
56815681
if (node === declaration.initializer) {
56825682
if (declaration.type) {
5683-
return getTypeFromTypeNodeOrHeritageClauseElement(declaration.type);
5683+
return getTypeFromTypeNode(declaration.type);
56845684
}
56855685
if (declaration.kind === SyntaxKind.Parameter) {
56865686
let type = getContextuallyTypedParameterType(<ParameterDeclaration>declaration);
@@ -5883,7 +5883,7 @@ module ts {
58835883
case SyntaxKind.NewExpression:
58845884
return getContextualTypeForArgument(<CallExpression>parent, node);
58855885
case SyntaxKind.TypeAssertionExpression:
5886-
return getTypeFromTypeNodeOrHeritageClauseElement((<TypeAssertion>parent).type);
5886+
return getTypeFromTypeNode((<TypeAssertion>parent).type);
58875887
case SyntaxKind.BinaryExpression:
58885888
return getContextualTypeForBinaryOperand(node);
58895889
case SyntaxKind.PropertyAssignment:
@@ -6705,7 +6705,7 @@ module ts {
67056705
let typeArgumentsAreAssignable = true;
67066706
for (let i = 0; i < typeParameters.length; i++) {
67076707
let typeArgNode = typeArguments[i];
6708-
let typeArgument = getTypeFromTypeNodeOrHeritageClauseElement(typeArgNode);
6708+
let typeArgument = getTypeFromTypeNode(typeArgNode);
67096709
// Do not push on this array! It has a preallocated length
67106710
typeArgumentResultTypes[i] = typeArgument;
67116711
if (typeArgumentsAreAssignable /* so far */) {
@@ -6727,9 +6727,12 @@ module ts {
67276727
let paramType = getTypeAtPosition(signature, i);
67286728
// A tagged template expression provides a special first argument, and string literals get string literal types
67296729
// unless we're reporting errors
6730-
let argType = i === 0 && node.kind === SyntaxKind.TaggedTemplateExpression ? globalTemplateStringsArrayType :
6731-
arg.kind === SyntaxKind.StringLiteral && !reportErrors ? getStringLiteralType(<LiteralExpression>arg) :
6732-
checkExpressionWithContextualType(arg, paramType, excludeArgument && excludeArgument[i] ? identityMapper : undefined);
6730+
let argType = i === 0 && node.kind === SyntaxKind.TaggedTemplateExpression
6731+
? globalTemplateStringsArrayType
6732+
: arg.kind === SyntaxKind.StringLiteral && !reportErrors
6733+
? getStringLiteralType(<StringLiteralExpression>arg)
6734+
: checkExpressionWithContextualType(arg, paramType, excludeArgument && excludeArgument[i] ? identityMapper : undefined);
6735+
67336736
// Use argument expression as error location when reporting errors
67346737
if (!checkTypeRelatedTo(argType, paramType, relation, reportErrors ? arg : undefined,
67356738
Diagnostics.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1)) {
@@ -7187,7 +7190,7 @@ module ts {
71877190

71887191
function checkTypeAssertion(node: TypeAssertion): Type {
71897192
let exprType = checkExpression(node.expression);
7190-
let targetType = getTypeFromTypeNodeOrHeritageClauseElement(node.type);
7193+
let targetType = getTypeFromTypeNode(node.type);
71917194
if (produceDiagnostics && targetType !== unknownType) {
71927195
let widenedType = getWidenedType(exprType);
71937196
if (!(isTypeAssignableTo(targetType, widenedType))) {
@@ -7361,7 +7364,7 @@ module ts {
73617364
function checkFunctionExpressionOrObjectLiteralMethodBody(node: FunctionExpression | MethodDeclaration) {
73627365
Debug.assert(node.kind !== SyntaxKind.MethodDeclaration || isObjectLiteralMethod(node));
73637366
if (node.type && !node.asteriskToken) {
7364-
checkIfNonVoidFunctionHasReturnExpressionsOrSingleThrowStatment(node, getTypeFromTypeNodeOrHeritageClauseElement(node.type));
7367+
checkIfNonVoidFunctionHasReturnExpressionsOrSingleThrowStatment(node, getTypeFromTypeNode(node.type));
73657368
}
73667369

73677370
if (node.body) {
@@ -7371,7 +7374,7 @@ module ts {
73717374
else {
73727375
let exprType = checkExpression(<Expression>node.body);
73737376
if (node.type) {
7374-
checkTypeAssignableTo(exprType, getTypeFromTypeNodeOrHeritageClauseElement(node.type), node.body, /*headMessage*/ undefined);
7377+
checkTypeAssignableTo(exprType, getTypeFromTypeNode(node.type), node.body, /*headMessage*/ undefined);
73757378
}
73767379
checkFunctionExpressionBodies(node.body);
73777380
}
@@ -8800,12 +8803,12 @@ module ts {
88008803
}
88018804

88028805
/** Checks a type reference node as an expression. */
8803-
function checkTypeNodeAsExpression(node: TypeNode | LiteralExpression) {
8806+
function checkTypeNodeAsExpression(node: TypeNode) {
88048807
// When we are emitting type metadata for decorators, we need to try to check the type
88058808
// as if it were an expression so that we can emit the type in a value position when we
88068809
// serialize the type metadata.
88078810
if (node && node.kind === SyntaxKind.TypeReference) {
8808-
let type = getTypeFromTypeNodeOrHeritageClauseElement(node);
8811+
let type = getTypeFromTypeNode(node);
88098812
let shouldCheckIfUnknownType = type === unknownType && compilerOptions.separateCompilation;
88108813
if (!type || (!shouldCheckIfUnknownType && type.flags & (TypeFlags.Intrinsic | TypeFlags.NumberLike | TypeFlags.StringLike))) {
88118814
return;
@@ -8825,7 +8828,8 @@ module ts {
88258828
case SyntaxKind.PropertyDeclaration:
88268829
checkTypeNodeAsExpression((<PropertyDeclaration>node).type);
88278830
break;
8828-
case SyntaxKind.Parameter: checkTypeNodeAsExpression((<ParameterDeclaration>node).type);
8831+
case SyntaxKind.Parameter:
8832+
checkTypeNodeAsExpression((<ParameterDeclaration>node).type);
88298833
break;
88308834
case SyntaxKind.MethodDeclaration:
88318835
checkTypeNodeAsExpression((<MethodDeclaration>node).type);
@@ -8941,7 +8945,7 @@ module ts {
89418945

89428946
checkSourceElement(node.body);
89438947
if (node.type && !isAccessor(node.kind) && !node.asteriskToken) {
8944-
checkIfNonVoidFunctionHasReturnExpressionsOrSingleThrowStatment(node, getTypeFromTypeNodeOrHeritageClauseElement(node.type));
8948+
checkIfNonVoidFunctionHasReturnExpressionsOrSingleThrowStatment(node, getTypeFromTypeNode(node.type));
89458949
}
89468950

89478951
// Report an implicit any error if there is no body, no explicit return type, and node is not a private method
@@ -10105,7 +10109,7 @@ module ts {
1010510109
if (!tp1.constraint || !tp2.constraint) {
1010610110
return false;
1010710111
}
10108-
if (!isTypeIdenticalTo(getTypeFromTypeNodeOrHeritageClauseElement(tp1.constraint), getTypeFromTypeNodeOrHeritageClauseElement(tp2.constraint))) {
10112+
if (!isTypeIdenticalTo(getTypeFromTypeNode(tp1.constraint), getTypeFromTypeNode(tp2.constraint))) {
1010910113
return false;
1011010114
}
1011110115
}
@@ -11136,7 +11140,7 @@ module ts {
1113611140
return node.parent && node.parent.kind === SyntaxKind.HeritageClauseElement;
1113711141
}
1113811142

11139-
function isTypeNodeOrHeritageClauseElement(node: Node): boolean {
11143+
function isTypeNode(node: Node): boolean {
1114011144
if (SyntaxKind.FirstTypeNode <= node.kind && node.kind <= SyntaxKind.LastTypeNode) {
1114111145
return true;
1114211146
}
@@ -11385,8 +11389,8 @@ module ts {
1138511389
return unknownType;
1138611390
}
1138711391

11388-
if (isTypeNodeOrHeritageClauseElement(node)) {
11389-
return getTypeFromTypeNodeOrHeritageClauseElement(<TypeNode | HeritageClauseElement>node);
11392+
if (isTypeNode(node)) {
11393+
return getTypeFromTypeNode(<TypeNode>node);
1139011394
}
1139111395

1139211396
if (isExpression(node)) {

src/compiler/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -689,7 +689,7 @@ module ts {
689689
hasExtendedUnicodeEscape?: boolean;
690690
}
691691

692-
export interface StringLiteralExpression extends LiteralExpression {
692+
export interface StringLiteralExpression extends LiteralExpression, TypeNode {
693693
_stringLiteralExpressionBrand: any;
694694
}
695695

@@ -739,7 +739,7 @@ module ts {
739739
arguments: NodeArray<Expression>;
740740
}
741741

742-
export interface HeritageClauseElement extends Node {
742+
export interface HeritageClauseElement extends TypeNode {
743743
expression: LeftHandSideExpression;
744744
typeArguments?: NodeArray<TypeNode>;
745745
}

src/compiler/utilities.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1913,4 +1913,4 @@ module ts {
19131913

19141914
return createTextChangeRange(createTextSpanFromBounds(oldStartN, oldEndN), /*newLength:*/ newEndN - oldStartN);
19151915
}
1916-
}
1916+
}

0 commit comments

Comments
 (0)