Move eitherIsNotLiteral check into switch and === checks

This improves error messages
This commit is contained in:
Nathan Shively-Sanders
2016-10-31 14:44:04 -07:00
parent b0080a253d
commit ebef408dfa
8 changed files with 43 additions and 42 deletions

View File

@@ -13814,12 +13814,6 @@ namespace ts {
}
function isTypeEqualityComparableTo(source: Type, target: Type) {
const sourceIsLiteral = isLiteralType(source);
const targetIsLiteral = isLiteralType(target);
if (!sourceIsLiteral || !targetIsLiteral) {
source = sourceIsLiteral ? getBaseTypeOfLiteralType(source) : source;
target = targetIsLiteral ? getBaseTypeOfLiteralType(target) : target;
}
return (target.flags & TypeFlags.Nullable) !== 0 || isTypeComparableTo(source, target);
}
@@ -13960,6 +13954,12 @@ namespace ts {
case SyntaxKind.ExclamationEqualsToken:
case SyntaxKind.EqualsEqualsEqualsToken:
case SyntaxKind.ExclamationEqualsEqualsToken:
const leftIsLiteral = isLiteralType(leftType);
const rightIsLiteral = isLiteralType(rightType);
if (!leftIsLiteral || !rightIsLiteral) {
leftType = leftIsLiteral ? getBaseTypeOfLiteralType(leftType) : leftType;
rightType = rightIsLiteral ? getBaseTypeOfLiteralType(rightType) : rightType;
}
if (!isTypeEqualityComparableTo(leftType, rightType) && !isTypeEqualityComparableTo(rightType, leftType)) {
reportOperatorError();
}
@@ -16882,7 +16882,7 @@ namespace ts {
let firstDefaultClause: CaseOrDefaultClause;
let hasDuplicateDefaultClause = false;
const expressionType = checkExpression(node.expression);
let expressionType = checkExpression(node.expression);
forEach(node.caseBlock.clauses, clause => {
// Grammar check for duplicate default clauses, skip if we already report duplicate default clause
if (clause.kind === SyntaxKind.DefaultClause && !hasDuplicateDefaultClause) {
@@ -16903,7 +16903,13 @@ namespace ts {
// TypeScript 1.0 spec (April 2014): 5.9
// In a 'switch' statement, each 'case' expression must be of a type that is comparable
// to or from the type of the 'switch' expression.
const caseType = checkExpression(caseClause.expression);
let caseType = checkExpression(caseClause.expression);
const caseIsLiteral = isLiteralType(caseType);
const expressionIsLiteral = isLiteralType(expressionType);
if (!caseIsLiteral || !expressionIsLiteral) {
caseType = caseIsLiteral ? getBaseTypeOfLiteralType(caseType) : caseType;
expressionType = expressionIsLiteral ? getBaseTypeOfLiteralType(expressionType) : expressionType;
}
if (!isTypeEqualityComparableTo(expressionType, caseType)) {
// expressionType is not comparable to caseType, try the reversed check and report errors if it fails
checkTypeComparableTo(caseType, expressionType, caseClause.expression, /*headMessage*/ undefined);