Skip to content

Commit 159de98

Browse files
committed
Support auto doc comment generation
Adds '\n' and '/' to the on-type format list, enabling vscode support for the newly-added omnisharp feature of auto-generating documentation comments. Closes dotnet#8.
1 parent 2489158 commit 159de98

File tree

4 files changed

+88
-1
lines changed

4 files changed

+88
-1
lines changed

src/omnisharp/extension.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ export async function activate(context: vscode.ExtensionContext, packageJSON: an
8888
localDisposables.add(vscode.languages.registerRenameProvider(documentSelector, new RenameProvider(server, languageMiddlewareFeature)));
8989
if (options.useFormatting) {
9090
localDisposables.add(vscode.languages.registerDocumentRangeFormattingEditProvider(documentSelector, new FormatProvider(server, languageMiddlewareFeature)));
91-
localDisposables.add(vscode.languages.registerOnTypeFormattingEditProvider(documentSelector, new FormatProvider(server, languageMiddlewareFeature), '}', ';'));
91+
localDisposables.add(vscode.languages.registerOnTypeFormattingEditProvider(documentSelector, new FormatProvider(server, languageMiddlewareFeature), '}', '/', '\n', ';'));
9292
}
9393
localDisposables.add(vscode.languages.registerCompletionItemProvider(documentSelector, new CompletionProvider(server, languageMiddlewareFeature), '.', ' '));
9494
localDisposables.add(vscode.languages.registerWorkspaceSymbolProvider(new WorkspaceSymbolProvider(server, optionProvider, languageMiddlewareFeature)));
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import { expect, should } from 'chai';
2+
import * as vscode from 'vscode';
3+
import * as path from 'path';
4+
import { isRazorWorkspace } from './integrationHelpers';
5+
import testAssetWorkspace from './testAssets/testAssetWorkspace';
6+
import { skip } from 'rxjs/operators';
7+
8+
const onTypeFormatProviderCommand = 'vscode.executeFormatOnTypeProvider';
9+
10+
function normalizeNewlines(original: string): string {
11+
while (original.indexOf('\r\n') != -1) {
12+
original = original.replace('\r\n', '\n');
13+
}
14+
15+
return original;
16+
}
17+
18+
suite(`Documentation Comment Auto Formatting: ${testAssetWorkspace.description}`, function () {
19+
let fileUri: vscode.Uri;
20+
21+
suiteSetup(async function () {
22+
should();
23+
24+
if (isRazorWorkspace(vscode.workspace)) {
25+
// The format-on-type provider does not run for razor files.
26+
this.skip();
27+
}
28+
29+
const projectDirectory = testAssetWorkspace.projects[0].projectDirectoryPath;
30+
const filePath = path.join(projectDirectory, 'DocComments.cs');
31+
fileUri = vscode.Uri.file(filePath);
32+
33+
await vscode.commands.executeCommand('vscode.open', fileUri);
34+
});
35+
36+
suiteTeardown(async () => {
37+
await testAssetWorkspace.cleanupWorkspace();
38+
});
39+
40+
test('Triple slash inserts doc comment snippet', async () => {
41+
const commentPosition = new vscode.Position(2, 7);
42+
const formatEdits = <vscode.TextEdit[]>(await vscode.commands.executeCommand(onTypeFormatProviderCommand, fileUri, commentPosition, '/'));
43+
expect(formatEdits).ofSize(1);
44+
expect(normalizeNewlines(formatEdits[0].newText)).eq(" <summary>\n /// \n /// </summary>\n /// <param name=\"param1\"></param>\n /// <param name=\"param2\"></param>\n /// <returns></returns>");
45+
expect(formatEdits[0].range.start.line).eq(commentPosition.line);
46+
expect(formatEdits[0].range.start.character).eq(commentPosition.character);
47+
expect(formatEdits[0].range.end.line).eq(commentPosition.line);
48+
expect(formatEdits[0].range.end.character).eq(commentPosition.character);
49+
});
50+
51+
test('Enter in comment inserts triple-slashes preceding', async () => {
52+
const commentPosition = new vscode.Position(9, 0);
53+
const formatEdits = <vscode.TextEdit[]>(await vscode.commands.executeCommand(onTypeFormatProviderCommand, fileUri, commentPosition, '\n'));
54+
expect(formatEdits).ofSize(1);
55+
expect(formatEdits[0].newText).eq(" /// ");
56+
expect(formatEdits[0].range.start.line).eq(commentPosition.line);
57+
expect(formatEdits[0].range.start.character).eq(commentPosition.character);
58+
expect(formatEdits[0].range.end.line).eq(commentPosition.line);
59+
expect(formatEdits[0].range.end.character).eq(commentPosition.character);
60+
});
61+
});
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class DocComments
2+
{
3+
///
4+
string M(int param1, string param2)
5+
{
6+
return null;
7+
}
8+
9+
/// <summary>
10+
11+
/// </summary>
12+
void M2() {}
13+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class DocComments
2+
{
3+
///
4+
string M(int param1, string param2)
5+
{
6+
return null;
7+
}
8+
9+
/// <summary>
10+
11+
/// </summary>
12+
void M2() {}
13+
}

0 commit comments

Comments
 (0)