diff --git a/src/services/formatting/rules.ts b/src/services/formatting/rules.ts index 98b8be1fe8c..6931a6e5b44 100644 --- a/src/services/formatting/rules.ts +++ b/src/services/formatting/rules.ts @@ -106,7 +106,7 @@ export function getAllRules(): RuleSpec[] { rule("SpaceAfterQuestionMarkInConditionalOperator", SyntaxKind.QuestionToken, anyToken, [isNonJsxSameLineTokenContext, isConditionalOperatorContext], RuleAction.InsertSpace), // in other cases there should be no space between '?' and next token - rule("NoSpaceAfterQuestionMark", SyntaxKind.QuestionToken, anyToken, [isNonJsxSameLineTokenContext], RuleAction.DeleteSpace), + rule("NoSpaceAfterQuestionMark", SyntaxKind.QuestionToken, anyToken, [isNonJsxSameLineTokenContext, isNonOptionalPropertyContext], RuleAction.DeleteSpace), rule("NoSpaceBeforeDot", anyToken, [SyntaxKind.DotToken, SyntaxKind.QuestionDotToken], [isNonJsxSameLineTokenContext, isNotPropertyAccessOnIntegerLiteral], RuleAction.DeleteSpace), rule("NoSpaceAfterDot", [SyntaxKind.DotToken, SyntaxKind.QuestionDotToken], anyToken, [isNonJsxSameLineTokenContext], RuleAction.DeleteSpace), @@ -561,6 +561,14 @@ function isTypeAnnotationContext(context: FormattingContext): boolean { isFunctionLikeKind(contextKind); } +function isOptionalPropertyContext(context: FormattingContext) { + return isPropertyDeclaration(context.contextNode) && context.contextNode.questionToken; +} + +function isNonOptionalPropertyContext(context: FormattingContext) { + return !isOptionalPropertyContext(context); +} + function isConditionalOperatorContext(context: FormattingContext): boolean { return context.contextNode.kind === SyntaxKind.ConditionalExpression || context.contextNode.kind === SyntaxKind.ConditionalType; diff --git a/tests/cases/fourslash/optionalPropertyFormatting.ts b/tests/cases/fourslash/optionalPropertyFormatting.ts new file mode 100644 index 00000000000..141e691b14d --- /dev/null +++ b/tests/cases/fourslash/optionalPropertyFormatting.ts @@ -0,0 +1,13 @@ +/// + +////export class C extends Error { +//// message: string; +//// data? = {}; +////} + +format.document(); +verify.currentFileContentIs( +`export class C extends Error { + message: string; + data? = {}; +}`);