From 049d4e049ffd58cd742eca165ccd7cebcd5199f7 Mon Sep 17 00:00:00 2001
From: Jake Bailey <5341706+jakebailey@users.noreply.github.com>
Date: Wed, 19 Jan 2022 13:37:55 -0800
Subject: [PATCH] Modify debug assertion to avoid crashing on SyntaxList
(#47500)
---
src/services/utilities.ts | 12 +++++++-----
tests/cases/fourslash/quickInfoOnClosingJsx.ts | 8 ++++++++
2 files changed, 15 insertions(+), 5 deletions(-)
create mode 100644 tests/cases/fourslash/quickInfoOnClosingJsx.ts
diff --git a/src/services/utilities.ts b/src/services/utilities.ts
index 146e3fb0260e8..58cbbfa7c70f0 100644
--- a/src/services/utilities.ts
+++ b/src/services/utilities.ts
@@ -1297,7 +1297,7 @@ namespace ts {
if (lookInPreviousChild) {
// actual start of the node is past the position - previous token should be at the end of previous child
- const candidate = findRightmostChildNodeWithTokens(children, /*exclusiveStartPosition*/ i, sourceFile);
+ const candidate = findRightmostChildNodeWithTokens(children, /*exclusiveStartPosition*/ i, sourceFile, n.kind);
return candidate && findRightmostToken(candidate, sourceFile);
}
else {
@@ -1313,7 +1313,7 @@ namespace ts {
// the only known case is when position is at the end of the file.
// Try to find the rightmost token in the file without filtering.
// Namely we are skipping the check: 'position < node.end'
- const candidate = findRightmostChildNodeWithTokens(children, /*exclusiveStartPosition*/ children.length, sourceFile);
+ const candidate = findRightmostChildNodeWithTokens(children, /*exclusiveStartPosition*/ children.length, sourceFile, n.kind);
return candidate && findRightmostToken(candidate, sourceFile);
}
}
@@ -1332,19 +1332,21 @@ namespace ts {
return n;
}
- const candidate = findRightmostChildNodeWithTokens(children, /*exclusiveStartPosition*/ children.length, sourceFile);
+ const candidate = findRightmostChildNodeWithTokens(children, /*exclusiveStartPosition*/ children.length, sourceFile, n.kind);
return candidate && findRightmostToken(candidate, sourceFile);
}
/**
* Finds the rightmost child to the left of `children[exclusiveStartPosition]` which is a non-all-whitespace token or has constituent tokens.
*/
- function findRightmostChildNodeWithTokens(children: Node[], exclusiveStartPosition: number, sourceFile: SourceFile): Node | undefined {
+ function findRightmostChildNodeWithTokens(children: Node[], exclusiveStartPosition: number, sourceFile: SourceFile, parentKind: SyntaxKind): Node | undefined {
for (let i = exclusiveStartPosition - 1; i >= 0; i--) {
const child = children[i];
if (isWhiteSpaceOnlyJsxText(child)) {
- Debug.assert(i > 0, "`JsxText` tokens should not be the first child of `JsxElement | JsxSelfClosingElement`");
+ if (i === 0 && (parentKind === SyntaxKind.JsxText || parentKind === SyntaxKind.JsxSelfClosingElement)) {
+ Debug.fail("`JsxText` tokens should not be the first child of `JsxElement | JsxSelfClosingElement`");
+ }
}
else if (nodeHasTokens(children[i], sourceFile)) {
return children[i];
diff --git a/tests/cases/fourslash/quickInfoOnClosingJsx.ts b/tests/cases/fourslash/quickInfoOnClosingJsx.ts
new file mode 100644
index 0000000000000..bdee39457c91f
--- /dev/null
+++ b/tests/cases/fourslash/quickInfoOnClosingJsx.ts
@@ -0,0 +1,8 @@
+///