Skip to content

Commit 0f8cab3

Browse files
authored
Git - add "Hard wrap all lines" code action is there are multiple long lines (microsoft#205349)
* Git - add "Hard wrap all lines" code action is there are multiple long lines * 💄 Moved code around
1 parent 00b91ce commit 0f8cab3

File tree

1 file changed

+44
-8
lines changed

1 file changed

+44
-8
lines changed

extensions/git/src/diagnostics.ts

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ export class GitCommitInputBoxCodeActionsProvider implements CodeActionProvider
8282
provideCodeActions(document: TextDocument, range: Range | Selection): CodeAction[] {
8383
const codeActions: CodeAction[] = [];
8484
const diagnostics = this.diagnosticsManager.getDiagnostics(document.uri);
85+
const wrapAllLinesCodeAction = this.getWrapAllLinesCodeAction(document, diagnostics);
8586

8687
for (const diagnostic of diagnostics) {
8788
if (!diagnostic.range.contains(range)) {
@@ -96,17 +97,23 @@ export class GitCommitInputBoxCodeActionsProvider implements CodeActionProvider
9697
const codeAction = new CodeAction(l10n.t('Remove empty characters'), CodeActionKind.QuickFix);
9798
codeAction.diagnostics = [diagnostic];
9899
codeAction.edit = workspaceEdit;
99-
100100
codeActions.push(codeAction);
101+
101102
break;
102103
}
103104
case DiagnosticCodes.line_length: {
104105
const workspaceEdit = this.getWrapLineWorkspaceEdit(document, diagnostic.range);
106+
105107
const codeAction = new CodeAction(l10n.t('Hard wrap line'), CodeActionKind.QuickFix);
106108
codeAction.diagnostics = [diagnostic];
107109
codeAction.edit = workspaceEdit;
108-
109110
codeActions.push(codeAction);
111+
112+
if (wrapAllLinesCodeAction) {
113+
wrapAllLinesCodeAction.diagnostics = [diagnostic];
114+
codeActions.push(wrapAllLinesCodeAction);
115+
}
116+
110117
break;
111118
}
112119
}
@@ -116,13 +123,45 @@ export class GitCommitInputBoxCodeActionsProvider implements CodeActionProvider
116123
}
117124

118125
private getWrapLineWorkspaceEdit(document: TextDocument, range: Range): WorkspaceEdit {
126+
const lineSegments = this.wrapTextDocumentLine(document, range.start.line);
127+
128+
const workspaceEdit = new WorkspaceEdit();
129+
workspaceEdit.replace(document.uri, range, lineSegments.join('\n'));
130+
131+
return workspaceEdit;
132+
}
133+
134+
private getWrapAllLinesCodeAction(document: TextDocument, diagnostics: readonly Diagnostic[]): CodeAction | undefined {
135+
const lineLengthDiagnostics = diagnostics.filter(d => d.code === DiagnosticCodes.line_length);
136+
if (lineLengthDiagnostics.length < 2) {
137+
return undefined;
138+
}
139+
140+
const wrapAllLinesCodeAction = new CodeAction(l10n.t('Hard wrap all lines'), CodeActionKind.QuickFix);
141+
wrapAllLinesCodeAction.edit = this.getWrapAllLinesWorkspaceEdit(document, lineLengthDiagnostics);
142+
143+
return wrapAllLinesCodeAction;
144+
}
145+
146+
private getWrapAllLinesWorkspaceEdit(document: TextDocument, diagnostics: Diagnostic[]): WorkspaceEdit {
147+
const workspaceEdit = new WorkspaceEdit();
148+
149+
for (const diagnostic of diagnostics) {
150+
const lineSegments = this.wrapTextDocumentLine(document, diagnostic.range.start.line);
151+
workspaceEdit.replace(document.uri, diagnostic.range, lineSegments.join('\n'));
152+
}
153+
154+
return workspaceEdit;
155+
}
156+
157+
private wrapTextDocumentLine(document: TextDocument, line: number): string[] {
119158
const config = workspace.getConfiguration('git');
120159
const inputValidationLength = config.get<number>('inputValidationLength', 50);
121160
const inputValidationSubjectLength = config.get<number | undefined>('inputValidationSubjectLength', undefined);
122-
const lineLengthThreshold = range.start.line === 0 ? inputValidationSubjectLength ?? inputValidationLength : inputValidationLength;
161+
const lineLengthThreshold = line === 0 ? inputValidationSubjectLength ?? inputValidationLength : inputValidationLength;
123162

124163
const lineSegments: string[] = [];
125-
const lineText = document.lineAt(range.start.line).text;
164+
const lineText = document.lineAt(line).text;
126165

127166
let position = 0;
128167
while (lineText.length - position > lineLengthThreshold) {
@@ -147,10 +186,7 @@ export class GitCommitInputBoxCodeActionsProvider implements CodeActionProvider
147186
lineSegments.push(lineText.substring(position));
148187
}
149188

150-
const workspaceEdit = new WorkspaceEdit();
151-
workspaceEdit.replace(document.uri, range, lineSegments.join('\n'));
152-
153-
return workspaceEdit;
189+
return lineSegments;
154190
}
155191

156192
dispose() {

0 commit comments

Comments
 (0)