From 327c06d4b4c18dcd4cedbad074d585966d587f19 Mon Sep 17 00:00:00 2001 From: Donald33 Wang Date: Mon, 10 Apr 2023 20:26:27 +0800 Subject: [PATCH 1/5] Allow custom switch-case indentation in formatting --- src/services/formatting/smartIndenter.ts | 7 ++++--- src/services/types.ts | 4 +++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/services/formatting/smartIndenter.ts b/src/services/formatting/smartIndenter.ts index b48051e8a651d..1ab72e8c99bb2 100644 --- a/src/services/formatting/smartIndenter.ts +++ b/src/services/formatting/smartIndenter.ts @@ -653,9 +653,6 @@ export namespace SmartIndenter { case SyntaxKind.TypeLiteral: case SyntaxKind.MappedType: case SyntaxKind.TupleType: - case SyntaxKind.CaseBlock: - case SyntaxKind.DefaultClause: - case SyntaxKind.CaseClause: case SyntaxKind.ParenthesizedExpression: case SyntaxKind.PropertyAccessExpression: case SyntaxKind.CallExpression: @@ -684,7 +681,11 @@ export namespace SmartIndenter { case SyntaxKind.ExportSpecifier: case SyntaxKind.ImportSpecifier: case SyntaxKind.PropertyDeclaration: + case SyntaxKind.CaseClause: + case SyntaxKind.DefaultClause: return true; + case SyntaxKind.CaseBlock: + return settings.indentSwitchCase ?? true; case SyntaxKind.VariableDeclaration: case SyntaxKind.PropertyAssignment: case SyntaxKind.BinaryExpression: diff --git a/src/services/types.ts b/src/services/types.ts index cf3205a88afb0..08d983b8691c9 100644 --- a/src/services/types.ts +++ b/src/services/types.ts @@ -1118,6 +1118,7 @@ export interface FormatCodeSettings extends EditorSettings { readonly insertSpaceBeforeTypeAnnotation?: boolean; readonly indentMultiLineObjectLiteralBeginningOnBlankLine?: boolean; readonly semicolons?: SemicolonPreference; + readonly indentSwitchCase?: boolean; } export function getDefaultFormatCodeSettings(newLineCharacter?: string): FormatCodeSettings { @@ -1142,7 +1143,8 @@ export function getDefaultFormatCodeSettings(newLineCharacter?: string): FormatC placeOpenBraceOnNewLineForFunctions: false, placeOpenBraceOnNewLineForControlBlocks: false, semicolons: SemicolonPreference.Ignore, - trimTrailingWhitespace: true + trimTrailingWhitespace: true, + indentSwitchCase: true }; } From d0d73476b085e9c4577f55f4e902f63eb4cf4988 Mon Sep 17 00:00:00 2001 From: Donald33 Wang Date: Tue, 11 Apr 2023 16:01:27 +0800 Subject: [PATCH 2/5] Update tsserver baseline tests --- .../reference/api/tsserverlibrary.d.ts | 1 + tests/baselines/reference/api/typescript.d.ts | 1 + ...fied-with-a-case-insensitive-file-system.js | 18 ++++++++++++------ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index 5355faa1d1b99..9dfa4e5f96fc4 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -10524,6 +10524,7 @@ declare namespace ts { readonly insertSpaceBeforeTypeAnnotation?: boolean; readonly indentMultiLineObjectLiteralBeginningOnBlankLine?: boolean; readonly semicolons?: SemicolonPreference; + readonly indentSwitchCase?: boolean; } interface DefinitionInfo extends DocumentSpan { kind: ScriptElementKind; diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index b923402b208b8..6acc0c5bc906e 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -6594,6 +6594,7 @@ declare namespace ts { readonly insertSpaceBeforeTypeAnnotation?: boolean; readonly indentMultiLineObjectLiteralBeginningOnBlankLine?: boolean; readonly semicolons?: SemicolonPreference; + readonly indentSwitchCase?: boolean; } interface DefinitionInfo extends DocumentSpan { kind: ScriptElementKind; diff --git a/tests/baselines/reference/tsserver/formatSettings/works-when-extends-is-specified-with-a-case-insensitive-file-system.js b/tests/baselines/reference/tsserver/formatSettings/works-when-extends-is-specified-with-a-case-insensitive-file-system.js index 55fbbd968dd19..2f303757fd4f4 100644 --- a/tests/baselines/reference/tsserver/formatSettings/works-when-extends-is-specified-with-a-case-insensitive-file-system.js +++ b/tests/baselines/reference/tsserver/formatSettings/works-when-extends-is-specified-with-a-case-insensitive-file-system.js @@ -76,7 +76,8 @@ Info seq [hh:mm:ss:mss] request: "placeOpenBraceOnNewLineForFunctions": false, "placeOpenBraceOnNewLineForControlBlocks": true, "semicolons": "ignore", - "trimTrailingWhitespace": true + "trimTrailingWhitespace": true, + "indentSwitchCase": true } }, "seq": 2, @@ -112,7 +113,8 @@ FormatCodeOptions should be global:: /a/b/app.ts:: { "placeOpenBraceOnNewLineForFunctions": false, "placeOpenBraceOnNewLineForControlBlocks": true, "semicolons": "ignore", - "trimTrailingWhitespace": true + "trimTrailingWhitespace": true, + "indentSwitchCase": true } Before request @@ -141,7 +143,8 @@ Info seq [hh:mm:ss:mss] request: "placeOpenBraceOnNewLineForFunctions": false, "placeOpenBraceOnNewLineForControlBlocks": false, "semicolons": "ignore", - "trimTrailingWhitespace": true + "trimTrailingWhitespace": true, + "indentSwitchCase": true }, "file": "/a/b/app.ts" }, @@ -178,7 +181,8 @@ FormatCodeOptions should be per file:: /a/b/app.ts:: { "placeOpenBraceOnNewLineForFunctions": false, "placeOpenBraceOnNewLineForControlBlocks": false, "semicolons": "ignore", - "trimTrailingWhitespace": true + "trimTrailingWhitespace": true, + "indentSwitchCase": true } Before request @@ -207,7 +211,8 @@ Info seq [hh:mm:ss:mss] request: "placeOpenBraceOnNewLineForFunctions": false, "placeOpenBraceOnNewLineForControlBlocks": false, "semicolons": "ignore", - "trimTrailingWhitespace": true + "trimTrailingWhitespace": true, + "indentSwitchCase": true } }, "seq": 4, @@ -243,5 +248,6 @@ FormatCodeOptions should be per file:: /a/b/app.ts:: { "placeOpenBraceOnNewLineForFunctions": false, "placeOpenBraceOnNewLineForControlBlocks": false, "semicolons": "ignore", - "trimTrailingWhitespace": true + "trimTrailingWhitespace": true, + "indentSwitchCase": true } \ No newline at end of file From 486155f996abbf025d2e680e9925f4919bcbed94 Mon Sep 17 00:00:00 2001 From: Donald33 Wang Date: Wed, 12 Apr 2023 21:03:53 +0800 Subject: [PATCH 3/5] Add fourslash tests --- .../fourslash/formattingIndentSwitchCase.ts | 31 +++++++++++++++++++ tests/cases/fourslash/fourslash.ts | 1 + 2 files changed, 32 insertions(+) create mode 100644 tests/cases/fourslash/formattingIndentSwitchCase.ts diff --git a/tests/cases/fourslash/formattingIndentSwitchCase.ts b/tests/cases/fourslash/formattingIndentSwitchCase.ts new file mode 100644 index 0000000000000..90535e3680c09 --- /dev/null +++ b/tests/cases/fourslash/formattingIndentSwitchCase.ts @@ -0,0 +1,31 @@ +/// + +////let foo = 1; +////switch (foo) { +/////*1*/case 0: +/////*2*/break; +/////*3*/default: +/////*4*/break; +////} + +format.setOption('indentSwitchCase', true); +format.document(); +goTo.marker('1'); +verify.indentationIs(4); +goTo.marker('2'); +verify.indentationIs(8); +goTo.marker('3'); +verify.indentationIs(4); +goTo.marker('4'); +verify.indentationIs(8); + +format.setOption('indentSwitchCase', false); +format.document(); +goTo.marker('1'); +verify.indentationIs(0); +goTo.marker('2'); +verify.indentationIs(4); +goTo.marker('3'); +verify.indentationIs(0); +goTo.marker('4'); +verify.indentationIs(4); diff --git a/tests/cases/fourslash/fourslash.ts b/tests/cases/fourslash/fourslash.ts index b9f1fecbc2b34..2bf83ba52e5f7 100644 --- a/tests/cases/fourslash/fourslash.ts +++ b/tests/cases/fourslash/fourslash.ts @@ -196,6 +196,7 @@ declare namespace FourSlashInterface { readonly insertSpaceBeforeTypeAnnotation?: boolean; readonly indentMultiLineObjectLiteralBeginningOnBlankLine?: boolean; readonly semicolons?: ts.SemicolonPreference; + readonly indentSwitchCase?: boolean; } interface Range { fileName: string; From d181223e1fb3bbb85b7dc0609b5a0306f8ff9234 Mon Sep 17 00:00:00 2001 From: Donald33 Wang Date: Thu, 13 Apr 2023 01:15:01 +0800 Subject: [PATCH 4/5] Add indentSwitchCase property in protocol --- src/server/protocol.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/server/protocol.ts b/src/server/protocol.ts index 9106c0ef442a6..819c4797084fc 100644 --- a/src/server/protocol.ts +++ b/src/server/protocol.ts @@ -3418,6 +3418,7 @@ export interface FormatCodeSettings extends EditorSettings { placeOpenBraceOnNewLineForControlBlocks?: boolean; insertSpaceBeforeTypeAnnotation?: boolean; semicolons?: SemicolonPreference; + indentSwitchCase?: boolean; } export interface UserPreferences { From fa45d35d6fba9f7a33996eed3c0525bc7fa717f7 Mon Sep 17 00:00:00 2001 From: Donald33 Wang Date: Thu, 13 Apr 2023 13:08:57 +0800 Subject: [PATCH 5/5] Update baselines for protocol --- tests/baselines/reference/api/tsserverlibrary.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index 9dfa4e5f96fc4..4bf70d659b1ff 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -2718,6 +2718,7 @@ declare namespace ts { placeOpenBraceOnNewLineForControlBlocks?: boolean; insertSpaceBeforeTypeAnnotation?: boolean; semicolons?: SemicolonPreference; + indentSwitchCase?: boolean; } interface UserPreferences { readonly disableSuggestions?: boolean;