@@ -1349,24 +1349,30 @@ module ts {
1349
1349
writer.writeSpace(" ");
1350
1350
}
1351
1351
1352
- function getWriteResult<T, U>(info: T , enclosingDeclaration: Node, flags: U, buildDisplay: (info: T, writer: SymbolWriter, enclosingDeclaration ?: Node, flags ?: U) => void ): string {
1352
+ function symbolToString(symbol: Symbol , enclosingDeclaration?: Node, meaning ?: SymbolFlags ): string {
1353
1353
let writer = getSingleLineStringWriter();
1354
- buildDisplay(info , writer, enclosingDeclaration, flags );
1354
+ getSymbolDisplayBuilder().buildSymbolDisplay(symbol , writer, enclosingDeclaration, meaning );
1355
1355
let result = writer.string();
1356
1356
releaseStringWriter(writer);
1357
- return result;
1358
- }
1359
1357
1360
- function symbolToString(symbol: Symbol, enclosingDeclaration?: Node, meaning?: SymbolFlags): string {
1361
- return getWriteResult(symbol, enclosingDeclaration, meaning, getSymbolDisplayBuilder().buildSymbolDisplay);
1358
+ return result;
1362
1359
}
1363
1360
1364
1361
function signatureToString(signature: Signature, enclosingDeclaration?: Node, flags?: TypeFormatFlags): string {
1365
- return getWriteResult(signature, enclosingDeclaration, flags, getSymbolDisplayBuilder().buildSignatureDisplay);
1362
+ let writer = getSingleLineStringWriter();
1363
+ getSymbolDisplayBuilder().buildSignatureDisplay(signature, writer, enclosingDeclaration, flags);
1364
+ let result = writer.string();
1365
+ releaseStringWriter(writer);
1366
+
1367
+ return result;
1366
1368
}
1367
1369
1368
1370
function typeToString(type: Type, enclosingDeclaration?: Node, flags?: TypeFormatFlags): string {
1369
- let result = getWriteResult(type, enclosingDeclaration, flags, getSymbolDisplayBuilder().buildTypeDisplay);
1371
+ let writer = getSingleLineStringWriter();
1372
+ getSymbolDisplayBuilder().buildTypeDisplay(type, writer, enclosingDeclaration, flags);
1373
+ let result = writer.string();
1374
+ releaseStringWriter(writer);
1375
+
1370
1376
let maxLength = compilerOptions.noErrorTruncation || flags & TypeFormatFlags.NoTruncation ? undefined : 100;
1371
1377
if (maxLength && result.length >= maxLength) {
1372
1378
result = result.substr(0, maxLength - "...".length) + "...";
@@ -3234,17 +3240,16 @@ module ts {
3234
3240
if (classType) {
3235
3241
returnType = classType;
3236
3242
}
3237
- else if (declaration.type && declaration.type.kind === SyntaxKind.TypePredicate) {
3238
- returnType = booleanType;
3239
- let typePredicateNode = <TypePredicateNode>declaration.type;
3240
- typePredicate = {
3241
- parameterName: typePredicateNode.parameterName ? typePredicateNode.parameterName.text : undefined,
3242
- parameterIndex: typePredicateNode.parameterName ? getTypePredicateParameterIndex(declaration.parameters, typePredicateNode.parameterName) : undefined,
3243
- type: getTypeFromTypeNode(typePredicateNode.type)
3244
- };
3245
- }
3246
3243
else if (declaration.type) {
3247
3244
returnType = getTypeFromTypeNode(declaration.type);
3245
+ if (declaration.type.kind === SyntaxKind.TypePredicate) {
3246
+ let typePredicateNode = <TypePredicateNode>declaration.type;
3247
+ typePredicate = {
3248
+ parameterName: typePredicateNode.parameterName ? typePredicateNode.parameterName.text : undefined,
3249
+ parameterIndex: typePredicateNode.parameterName ? getTypePredicateParameterIndex(declaration.parameters, typePredicateNode.parameterName) : undefined,
3250
+ type: getTypeFromTypeNode(typePredicateNode.type)
3251
+ };
3252
+ }
3248
3253
}
3249
3254
else {
3250
3255
// TypeScript 1.0 spec (April 2014):
@@ -3850,6 +3855,8 @@ module ts {
3850
3855
return getTypeFromStringLiteral(<StringLiteral>node);
3851
3856
case SyntaxKind.TypeReference:
3852
3857
return getTypeFromTypeReferenceOrExpressionWithTypeArguments(<TypeReferenceNode>node);
3858
+ case SyntaxKind.TypePredicate:
3859
+ return booleanType;
3853
3860
case SyntaxKind.ExpressionWithTypeArguments:
3854
3861
return getTypeFromTypeReferenceOrExpressionWithTypeArguments(<ExpressionWithTypeArguments>node);
3855
3862
case SyntaxKind.TypeQuery:
@@ -4654,16 +4661,18 @@ module ts {
4654
4661
}
4655
4662
4656
4663
if (source.typePredicate && target.typePredicate) {
4657
- let hasDifferentParamaterIndex = source.typePredicate.parameterIndex !== target.typePredicate.parameterIndex;
4664
+ let hasDifferentParameterIndex = source.typePredicate.parameterIndex !== target.typePredicate.parameterIndex;
4658
4665
let hasDifferentTypes: boolean;
4659
- if (hasDifferentParamaterIndex || (hasDifferentTypes = !isTypeIdenticalTo(source.typePredicate.type, target.typePredicate.type))) {
4666
+ if (hasDifferentParameterIndex ||
4667
+ (hasDifferentTypes = !isTypeIdenticalTo(source.typePredicate.type, target.typePredicate.type))) {
4668
+
4660
4669
if (reportErrors) {
4661
4670
let sourceParamText = source.typePredicate.parameterName;
4662
4671
let targetParamText = target.typePredicate.parameterName;
4663
4672
let sourceTypeText = typeToString(source.typePredicate.type);
4664
4673
let targetTypeText = typeToString(target.typePredicate.type);
4665
4674
4666
- if (hasDifferentParamaterIndex ) {
4675
+ if (hasDifferentParameterIndex ) {
4667
4676
reportError(Diagnostics.Parameter_0_is_not_in_the_same_position_as_parameter_1,
4668
4677
sourceParamText,
4669
4678
targetParamText);
@@ -5651,34 +5660,21 @@ module ts {
5651
5660
return originalType;
5652
5661
}
5653
5662
5654
- function shouldNarrowTypeByTypePredicate(signature: Signature, expr: CallExpression): boolean {
5655
- if (!signature.typePredicate) {
5656
- return false;
5657
- }
5658
- if (expr.arguments &&
5659
- expr.arguments[signature.typePredicate.parameterIndex] &&
5660
- getSymbolAtLocation(expr.arguments[signature.typePredicate.parameterIndex]) === symbol) {
5661
-
5662
- return true;
5663
- }
5664
- return false;
5665
- }
5666
-
5667
5663
function narrowTypeByTypePredicate(type: Type, expr: CallExpression, assumeTrue: boolean): Type {
5668
5664
if (type.flags & TypeFlags.Any) {
5669
5665
return type;
5670
5666
}
5671
5667
let signature = getResolvedSignature(expr);
5672
- if (!assumeTrue) {
5673
- if (type.flags & TypeFlags.Union &&
5674
- signature.typePredicate &&
5675
- getSymbolAtLocation(expr.arguments[signature.typePredicate.parameterIndex]) === symbol) {
5676
5668
5677
- return getUnionType(filter((<UnionType>type).types, t => !isTypeSubtypeOf(t, signature.typePredicate.type)));
5669
+ if (signature.typePredicate &&
5670
+ getSymbolAtLocation(expr.arguments[signature.typePredicate.parameterIndex]) === symbol) {
5671
+
5672
+ if (!assumeTrue) {
5673
+ if (type.flags & TypeFlags.Union) {
5674
+ return getUnionType(filter((<UnionType>type).types, t => !isTypeSubtypeOf(t, signature.typePredicate.type)));
5675
+ }
5676
+ return type;
5678
5677
}
5679
- return type;
5680
- }
5681
- if (shouldNarrowTypeByTypePredicate(signature, expr)) {
5682
5678
return getOptionalNarrowedType(type, signature.typePredicate.type);
5683
5679
}
5684
5680
return type;
@@ -8624,19 +8620,20 @@ module ts {
8624
8620
if (node.type) {
8625
8621
if (node.type.kind === SyntaxKind.TypePredicate) {
8626
8622
let typePredicate = getSignatureFromDeclaration(node).typePredicate;
8627
- if ((<TypePredicateNode>node.type).type.kind === SyntaxKind.TypePredicate) {
8628
- error((<TypePredicateNode>node.type).type,
8623
+ let typePredicateNode = <TypePredicateNode>node.type;
8624
+ if (typePredicateNode.type.kind === SyntaxKind.TypePredicate) {
8625
+ error(typePredicateNode.type,
8629
8626
Diagnostics.Cannot_define_type_predicate_0_as_a_type_to_a_type_predicate,
8630
- getTextOfNode((<TypePredicateNode>node.type) .type));
8627
+ getTextOfNode(typePredicateNode .type));
8631
8628
}
8632
8629
else {
8633
8630
if (typePredicate.parameterIndex >= 0) {
8634
8631
checkTypeAssignableTo(typePredicate.type,
8635
8632
getTypeAtLocation(node.parameters[typePredicate.parameterIndex]),
8636
- (<TypePredicateNode>node.type) .type);
8633
+ typePredicateNode .type);
8637
8634
}
8638
- else if ((<TypePredicateNode>node.type) .parameterName) {
8639
- error((<TypePredicateNode>node.type) .parameterName,
8635
+ else if (typePredicateNode .parameterName) {
8636
+ error(typePredicateNode .parameterName,
8640
8637
Diagnostics.Cannot_find_parameter_0,
8641
8638
typePredicate.parameterName);
8642
8639
}
0 commit comments