From 1cbb0bd4d39020b904e14e48b42b1c710cb4841c Mon Sep 17 00:00:00 2001 From: Jean Pierre Date: Wed, 4 Aug 2021 04:00:39 -0500 Subject: [PATCH] Do not classify Infinity and NaN (#44778) * Do not classify Infinity and NaN. Fixes #42022 * Internally expose so that the classifier can use it * Increase the test complexity, and revert the type-checker * Drop the -Infinity Co-authored-by: Orta --- src/services/classifier2020.ts | 6 ++- ...anticModernClassificationInfinityAndNaN.ts | 39 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 tests/cases/fourslash/semanticModernClassificationInfinityAndNaN.ts diff --git a/src/services/classifier2020.ts b/src/services/classifier2020.ts index 6a61670697c..c890b3f6dbe 100644 --- a/src/services/classifier2020.ts +++ b/src/services/classifier2020.ts @@ -79,7 +79,7 @@ namespace ts.classifier.v2020 { inJSXElement = false; } - if (isIdentifier(node) && !inJSXElement && !inImportClause(node)) { + if (isIdentifier(node) && !inJSXElement && !inImportClause(node) && !isInfinityOrNaNString(node.escapedText)) { let symbol = typeChecker.getSymbolAtLocation(node); if (symbol) { if (symbol.flags & SymbolFlags.Alias) { @@ -225,6 +225,10 @@ namespace ts.classifier.v2020 { return (isQualifiedName(node.parent) && node.parent.right === node) || (isPropertyAccessExpression(node.parent) && node.parent.name === node); } + function isInfinityOrNaNString(name: __String): boolean { + return name === "Infinity" || name === "NaN"; + } + const tokenFromDeclarationMapping = new Map([ [SyntaxKind.VariableDeclaration, TokenType.variable], [SyntaxKind.Parameter, TokenType.parameter], diff --git a/tests/cases/fourslash/semanticModernClassificationInfinityAndNaN.ts b/tests/cases/fourslash/semanticModernClassificationInfinityAndNaN.ts new file mode 100644 index 00000000000..fcd508df372 --- /dev/null +++ b/tests/cases/fourslash/semanticModernClassificationInfinityAndNaN.ts @@ -0,0 +1,39 @@ +/// + +//// Infinity; +//// NaN; +//// +////// Regular properties +//// +////const obj1 = { +//// Infinity: 100, +//// NaN: 200, +//// "-Infinity": 300 +////}; +//// +////obj1.Infinity; +////obj1.NaN; +////obj1["-Infinity"]; +//// +////// Shorthand properties +//// +////const obj2 = { +//// Infinity, +//// NaN, +////} +//// +////obj2.Infinity; +////obj2.NaN; + +// Basically only the obj1 and obj2 should be showing up in this list + +const c2 = classification("2020"); +verify.semanticClassificationsAre("2020", + c2.semanticToken("variable.declaration.readonly", "obj1"), + c2.semanticToken("variable.readonly", "obj1"), + c2.semanticToken("variable.readonly", "obj1"), + c2.semanticToken("variable.readonly", "obj1"), + c2.semanticToken("variable.declaration.readonly", "obj2"), + c2.semanticToken("variable.readonly", "obj2"), + c2.semanticToken("variable.readonly", "obj2"), +); \ No newline at end of file