From 80d0f5041d10fe9abcf8e0b18b8c59efa7c1adc5 Mon Sep 17 00:00:00 2001 From: lyonbot Date: Mon, 7 Aug 2023 21:08:23 +0800 Subject: [PATCH 1/4] Remove space after colon in JSX introduced by formatting --- src/services/formatting/rules.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/services/formatting/rules.ts b/src/services/formatting/rules.ts index 9eb7635db8379..a726afb72712b 100644 --- a/src/services/formatting/rules.ts +++ b/src/services/formatting/rules.ts @@ -90,7 +90,7 @@ export function getAllRules(): RuleSpec[] { rule("IgnoreAfterLineComment", SyntaxKind.SingleLineCommentTrivia, anyToken, anyContext, RuleAction.StopProcessingSpaceActions), rule("NotSpaceBeforeColon", anyToken, SyntaxKind.ColonToken, [isNonJsxSameLineTokenContext, isNotBinaryOpContext, isNotTypeAnnotationContext], RuleAction.DeleteSpace), - rule("SpaceAfterColon", SyntaxKind.ColonToken, anyToken, [isNonJsxSameLineTokenContext, isNotBinaryOpContext], RuleAction.InsertSpace), + rule("SpaceAfterColon", SyntaxKind.ColonToken, anyToken, [isNonJsxSameLineTokenContext, isNotBinaryOpContext, isNextTokenParentNotJsxNamespacedName], RuleAction.InsertSpace), rule("NoSpaceBeforeQuestionMark", anyToken, SyntaxKind.QuestionToken, [isNonJsxSameLineTokenContext, isNotBinaryOpContext, isNotTypeAnnotationContext], RuleAction.DeleteSpace), // insert space after '?' only when it is used in conditional operator rule("SpaceAfterQuestionMarkInConditionalOperator", SyntaxKind.QuestionToken, anyToken, [isNonJsxSameLineTokenContext, isConditionalOperatorContext], RuleAction.InsertSpace), @@ -179,6 +179,8 @@ export function getAllRules(): RuleSpec[] { rule("NoSpaceBeforeGreaterThanTokenInJsxOpeningElement", SyntaxKind.SlashToken, SyntaxKind.GreaterThanToken, [isJsxSelfClosingElementContext, isNonJsxSameLineTokenContext], RuleAction.DeleteSpace), rule("NoSpaceBeforeEqualInJsxAttribute", anyToken, SyntaxKind.EqualsToken, [isJsxAttributeContext, isNonJsxSameLineTokenContext], RuleAction.DeleteSpace), rule("NoSpaceAfterEqualInJsxAttribute", SyntaxKind.EqualsToken, anyToken, [isJsxAttributeContext, isNonJsxSameLineTokenContext], RuleAction.DeleteSpace), + rule("NoSpaceBeforeJsxNamespaceColon", SyntaxKind.Identifier, SyntaxKind.ColonToken, [isNextTokenParentJsxNamespacedName], RuleAction.DeleteSpace), + rule("NoSpaceAfterJsxNamespaceColon", SyntaxKind.ColonToken, SyntaxKind.Identifier, [isNextTokenParentJsxNamespacedName], RuleAction.DeleteSpace), // TypeScript-specific rules // Use of module as a function call. e.g.: import m2 = module("m2"); @@ -756,6 +758,14 @@ function isJsxAttributeContext(context: FormattingContext): boolean { return context.contextNode.kind === SyntaxKind.JsxAttribute; } +function isNextTokenParentNotJsxNamespacedName(context: FormattingContext): boolean { + return context.nextTokenParent.kind !== SyntaxKind.JsxNamespacedName; +} + +function isNextTokenParentJsxNamespacedName(context: FormattingContext): boolean { + return context.nextTokenParent.kind === SyntaxKind.JsxNamespacedName; +} + function isJsxSelfClosingElementContext(context: FormattingContext): boolean { return context.contextNode.kind === SyntaxKind.JsxSelfClosingElement; } From c790cd4e0e92db0686858e08ce7d10c0701aa99e Mon Sep 17 00:00:00 2001 From: lyonbot Date: Mon, 7 Aug 2023 16:19:41 +0000 Subject: [PATCH 2/4] add test for Unwanted space after the colon of a namespaced JSX attribute #55293 --- tests/cases/fourslash/formattingJsxTexts4.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 tests/cases/fourslash/formattingJsxTexts4.ts diff --git a/tests/cases/fourslash/formattingJsxTexts4.ts b/tests/cases/fourslash/formattingJsxTexts4.ts new file mode 100644 index 0000000000000..3cf5ccbf98c8a --- /dev/null +++ b/tests/cases/fourslash/formattingJsxTexts4.ts @@ -0,0 +1,19 @@ +/// + +// Github issue #55293 + +//@Filename: file.tsx +//// function foo() { +//// const a = ; +//// +//// return a; +//// } + +format.document(); + +verify.currentFileContentIs( +`function foo() { + const a = ; + + return a; +}`); \ No newline at end of file From 028beaf3faefe3a6b801861cb0326e7d5debc281 Mon Sep 17 00:00:00 2001 From: lyonbot Date: Mon, 7 Aug 2023 16:23:36 +0000 Subject: [PATCH 3/4] add test for Unwanted space after the colon of a namespaced JSX attribute #55293 --- tests/cases/fourslash/formattingJsxTexts4.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/cases/fourslash/formattingJsxTexts4.ts b/tests/cases/fourslash/formattingJsxTexts4.ts index 3cf5ccbf98c8a..47c7943eb2dde 100644 --- a/tests/cases/fourslash/formattingJsxTexts4.ts +++ b/tests/cases/fourslash/formattingJsxTexts4.ts @@ -13,7 +13,9 @@ format.document(); verify.currentFileContentIs( `function foo() { - const a = ; + const a = ; return a; -}`); \ No newline at end of file +}`); + +// the original whitespaces between attributes are not handled by TypeScript yet \ No newline at end of file From 0df01c25fe90dc8e32b2e9f25ed896bec1b3360a Mon Sep 17 00:00:00 2001 From: lyonbot Date: Mon, 7 Aug 2023 19:35:51 +0000 Subject: [PATCH 4/4] Normalize whitespace before namespaced JSXAttribute --- src/services/formatting/rules.ts | 4 +++- tests/cases/fourslash/formattingJsxTexts4.ts | 4 +--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/services/formatting/rules.ts b/src/services/formatting/rules.ts index a726afb72712b..3d9c201a5050b 100644 --- a/src/services/formatting/rules.ts +++ b/src/services/formatting/rules.ts @@ -751,7 +751,9 @@ function isJsxExpressionContext(context: FormattingContext): boolean { } function isNextTokenParentJsxAttribute(context: FormattingContext): boolean { - return context.nextTokenParent.kind === SyntaxKind.JsxAttribute; + return context.nextTokenParent.kind === SyntaxKind.JsxAttribute || ( + context.nextTokenParent.kind === SyntaxKind.JsxNamespacedName && context.nextTokenParent.parent.kind === SyntaxKind.JsxAttribute + ); } function isJsxAttributeContext(context: FormattingContext): boolean { diff --git a/tests/cases/fourslash/formattingJsxTexts4.ts b/tests/cases/fourslash/formattingJsxTexts4.ts index 47c7943eb2dde..c9d238bf482d0 100644 --- a/tests/cases/fourslash/formattingJsxTexts4.ts +++ b/tests/cases/fourslash/formattingJsxTexts4.ts @@ -13,9 +13,7 @@ format.document(); verify.currentFileContentIs( `function foo() { - const a = ; + const a = ; return a; }`); - -// the original whitespaces between attributes are not handled by TypeScript yet \ No newline at end of file