Skip to content

Commit dae578c

Browse files
authored
Merge pull request #76 from a793181018/NewMaster
[AddNewLanguageSupport]:Add Csharp Language Support
2 parents 0580609 + 217c4c7 commit dae578c

24 files changed

+1201
-7
lines changed

l10n/bundle.l10n.zh-cn.json

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"Optimize Code": "优化代码",
77
"Fix Code": "修复代码",
88
"Quick Chat": "快速聊天",
9+
"AutoMethod": "填充当前方法",
910
"Optimize the code": "请优化下面的代码",
1011
"How do I fix this problem in the above code?": "请帮我修复下面代码中的问题:",
1112
"I got the following error, can you please help explain how to fix it?": "我遇到了以下错误,请帮我解释如何修复它?",

package.json

+9-2
Original file line numberDiff line numberDiff line change
@@ -88,14 +88,16 @@
8888
"optimizeCode",
8989
"autoComment",
9090
"autoTest",
91-
"customAction"
91+
"customAction",
92+
"AutoMethod"
9293
]
9394
},
9495
"uniqueItems": true,
9596
"default": [
9697
"quickChat",
9798
"autoTest",
98-
"autoComment"
99+
"autoComment",
100+
"AutoMethod"
99101
],
100102
"description": "%configuration.codelensDisplayItems.description%",
101103
"order": 4
@@ -644,6 +646,11 @@
644646
"command": "autodev.codelens.autoComment",
645647
"title": "%command.autoComment.title%"
646648
},
649+
{
650+
"command": "autodev.codelens.CodeCompletions",
651+
"title": "%command.CodeCompletions.title%"
652+
},
653+
647654
{
648655
"command": "autodev.codelens.autoTest",
649656
"title": "%command.autoTest.title%"

package.nls.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,8 @@
9191
"command.openSettings.title": "Open Settings",
9292
"command.showTutorial.title": "Show Tutorial",
9393
"command.feedback.title": "Feedback",
94-
9594
"command.quickChat.title": "Quick Chat",
95+
"command.AutoMethod.title": "Generate Method Codes",
9696
"command.explainCode.title": "Explain Code",
9797
"command.optimizeCode.title": "Optimize Code",
9898
"command.quickFix.title": "Quick Fix",

package.nls.zh-cn.json

+1
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
"command.optimizeCode.title": "优化代码",
7979
"command.quickFix.title": "快速修复",
8080
"command.autoComment.title": "生成注释",
81+
"command.AutoMethod.title":"填充当前方法",
8182
"command.autoTest.title": "生成测试",
8283

8384
"command.openSettings.title": "打开设置",

prompts/genius/en/code/auto-method.vm

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
Write documentation for user's given ${context.language} code.
2+
#if($context.chatContext.length > 0 )
3+
${context.chatContext}
4+
#end
5+
#if($context.forbiddenRules.length > 0)
6+
${context.forbiddenRules}
7+
#end
8+
- Start your documentation with ${context.startSymbol} here, and ends with `${context.endSymbol}`.
9+
Here is User's code:
10+
```${context.language}
11+
${context.code}
12+
```
13+
#if($context.originalComments.length > 0)
14+
Here is code Origin comment: ${context.originalComments}
15+
Please according to the code to update documentation.
16+
#end
17+
Please write documentation for user's code inside the Markdown code block.

prompts/genius/zh-cn/code/auto-doc.vm

-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,5 @@ ${context.forbiddenRules}
99
Here is User's code:
1010
```${context.language}
1111
${context.code}
12-
```
1312

1413
Please write documentation for this code inside the Markdown code block.
+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
Write documentation for user's given ${context.language} code.
2+
#if($context.chatContext.length > 0 )
3+
${context.chatContext}
4+
#end
5+
#if($context.forbiddenRules.length > 0)
6+
${context.forbiddenRules}
7+
#end
8+
- Start your documentation with ${context.startSymbol} here, and ends with `${context.endSymbol}`.
9+
Here is User's code:
10+
```${context.language}
11+
${context.code}
12+
```
13+
14+
Please write documentation for this code inside the Markdown code block.

src/AutoDevExtension.ts

+6
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import { logger } from 'base/common/log/log';
1010

1111
import { AutoDocActionExecutor } from './action/autodoc/AutoDocActionExecutor';
1212
import { AutoTestActionExecutor } from './action/autotest/AutoTestActionExecutor';
13+
import { AutoMethodActionExecutor } from './action/autoMethod/AutoMethodActionExecutor';
14+
1315
import {
1416
registerAutoDevProviders,
1517
registerCodeLensProvider,
@@ -42,6 +44,7 @@ import { TemplateRender } from './prompt-manage/template/TemplateRender';
4244
import { IProjectService } from './ProviderTypes';
4345
import { ToolchainContextManager } from './toolchain-context/ToolchainContextManager';
4446

47+
4548
@injectable()
4649
export class AutoDevExtension {
4750
// Vscode
@@ -223,6 +226,9 @@ export class AutoDevExtension {
223226
executeAutoDocAction(document: TextDocument, nameElement: NamedElement, edit?: WorkspaceEdit) {
224227
return new AutoDocActionExecutor(this, document, nameElement, edit).execute();
225228
}
229+
executeAutoMethodAction(document: TextDocument, nameElement: NamedElement, edit?: WorkspaceEdit) {
230+
return new AutoMethodActionExecutor(this, document, nameElement, edit).execute();
231+
}
226232

227233
executeAutoTestAction(document: TextDocument, nameElement: NamedElement, edit?: WorkspaceEdit) {
228234
return new AutoTestActionExecutor(this, document, nameElement, edit).execute();

src/ProviderContainer.config.ts

+2
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,11 @@ import { JavaScriptContextProvider } from './toolchain-context/framework/javascr
3434
import { SpringContextProvider } from './toolchain-context/framework/jvm/SpringContextProvider';
3535
import { ToolchainContextProvider } from './toolchain-context/ToolchainContextProvider';
3636
import { JavaVersionProvider } from './toolchain-context/version/JavaVersionProvider';
37+
import { AutoMethodActionCreator } from './action/autoMethod/AutoMethodActionCreator';
3738

3839
// Action Register
3940
providerContainer.bind(IActionCreator).to(AutoDocActionCreator);
41+
providerContainer.bind(IActionCreator).to(AutoMethodActionCreator);
4042
providerContainer.bind(IActionCreator).to(AutoTestActionCreator);
4143
providerContainer.bind(IActionCreator).to(GenApiDataActionCreator);
4244

src/ProviderLanguageProfile.config.ts

+2
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ import { PythonProfile } from './code-context/python/PythonProfile';
66
import { RustProfile } from './code-context/rust/RustProfile';
77
import { TypeScriptProfile } from './code-context/typescript/TypeScriptProfile';
88
import { ILanguageProfile } from './ProviderTypes';
9+
import { CsharpProfile } from './code-context/csharp/CsharpProfile';
910

1011
const languageContainer = new Container();
1112

1213
languageContainer.bind(ILanguageProfile).to(JavaProfile);
1314
languageContainer.bind(ILanguageProfile).to(TypeScriptProfile);
1415
languageContainer.bind(ILanguageProfile).to(GolangProfile);
1516
languageContainer.bind(ILanguageProfile).to(PythonProfile);
17+
languageContainer.bind(ILanguageProfile).to(CsharpProfile)
1618
languageContainer.bind(ILanguageProfile).to(RustProfile);
1719

1820
export { languageContainer };
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { injectable } from 'inversify';
2+
import vscode from 'vscode';
3+
4+
import { NamedElement } from '../../editor/ast/NamedElement';
5+
import { ActionCreatorContext } from '../_base/ActionCreatorContext';
6+
import { CodeActionCreator } from '../_base/CodeActionCreator';
7+
import { CMD_GEN_CODE_METHOD_COMPLETIONS } from 'base/common/configuration/configuration';
8+
9+
@injectable()
10+
export class AutoMethodActionCreator extends CodeActionCreator {
11+
static readonly providedCodeActionKinds = [vscode.CodeActionKind.RefactorRewrite];
12+
13+
isApplicable(creatorContext: ActionCreatorContext): boolean {
14+
return true;
15+
}
16+
17+
buildClassAction(context: ActionCreatorContext, elementBlock: NamedElement) {
18+
const title = `AutoDoc for class \`${elementBlock.identifierRange.text}\` (AutoDev)`;
19+
return this.createMethodAction(title, context.document, elementBlock);
20+
}
21+
22+
buildMethodAction(context: ActionCreatorContext, elementBlock: NamedElement): vscode.CodeAction {
23+
const title = `AutoDoc for method \`${elementBlock.identifierRange.text}\` (AutoDev)`;
24+
return this.createMethodAction(title, context.document, elementBlock);
25+
}
26+
27+
private createMethodAction(title: string, document: vscode.TextDocument, block: NamedElement): vscode.CodeAction {
28+
const codeAction = new vscode.CodeAction(title, AutoMethodActionCreator.providedCodeActionKinds[0]);
29+
30+
codeAction.isPreferred = false;
31+
codeAction.edit = new vscode.WorkspaceEdit();
32+
codeAction.command = {
33+
command: CMD_GEN_CODE_METHOD_COMPLETIONS,
34+
title: title,
35+
arguments: [document, block, codeAction.edit],
36+
};
37+
38+
return codeAction;
39+
}
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
import { AutoDevExtension } from 'src/AutoDevExtension';
2+
import { CancellationTokenSource, Position, TextDocument, WorkspaceEdit } from 'vscode';
3+
4+
import { ChatMessageRole, IChatMessage } from 'base/common/language-models/languageModels';
5+
import { LanguageModelsService } from 'base/common/language-models/languageModelsService';
6+
import { LANGUAGE_BLOCK_COMMENT_MAP } from 'base/common/languages/docstring';
7+
import { log } from 'base/common/log/log';
8+
import { MarkdownTextProcessor } from 'base/common/markdown/MarkdownTextProcessor';
9+
import { StreamingMarkdownCodeBlock } from 'base/common/markdown/StreamingMarkdownCodeBlock';
10+
11+
import { type NamedElement } from '../../editor/ast/NamedElement';
12+
import { insertCodeByRange, selectCodeInRange } from '../../editor/ast/PositionUtil';
13+
import { AutoDevStatus, AutoDevStatusManager } from '../../editor/editor-api/AutoDevStatusManager';
14+
import { ActionType } from '../../prompt-manage/ActionType';
15+
import { PromptManager } from '../../prompt-manage/PromptManager';
16+
import { CreateToolchainContext } from '../../toolchain-context/ToolchainContextProvider';
17+
import { ActionExecutor } from '../_base/ActionExecutor';
18+
import { AutoDocTemplateContext } from '../autodoc/AutoDocTemplateContext';
19+
import { AutoMethodTemplateContext } from './AutoMethodTemplateContext';
20+
21+
export class AutoMethodActionExecutor implements ActionExecutor {
22+
type: ActionType = ActionType.AutoDoc;
23+
24+
private lm: LanguageModelsService;
25+
private promptManager: PromptManager;
26+
private statusBarManager: AutoDevStatusManager;
27+
28+
private document: TextDocument;
29+
private range: NamedElement;
30+
private edit?: WorkspaceEdit;
31+
private language: string;
32+
33+
constructor(autodev: AutoDevExtension, document: TextDocument, range: NamedElement, edit?: WorkspaceEdit) {
34+
this.lm = autodev.lm;
35+
this.promptManager = autodev.promptManager;
36+
this.statusBarManager = autodev.statusBarManager;
37+
38+
this.document = document;
39+
this.range = range;
40+
this.edit = edit;
41+
this.language = document.languageId;
42+
}
43+
44+
async execute() {
45+
const document = this.document;
46+
const range = this.range;
47+
const language = document.languageId;
48+
49+
const startSymbol = LANGUAGE_BLOCK_COMMENT_MAP[language]!.start;
50+
const endSymbol = LANGUAGE_BLOCK_COMMENT_MAP[language]!.end;
51+
52+
const templateContext: AutoMethodTemplateContext = {
53+
language: language,
54+
startSymbol: startSymbol,
55+
endSymbol: endSymbol,
56+
code: document.getText(range.blockRange),
57+
forbiddenRules: [],
58+
// 原有代码块
59+
originalMethodCodes: [],
60+
};
61+
62+
if (range.commentRange) {
63+
templateContext.originalMethodCodes.push(document.getText(range.commentRange));
64+
}
65+
66+
this.statusBarManager.setStatus(AutoDevStatus.InProgress);
67+
68+
selectCodeInRange(range.blockRange.start, range.blockRange.end);
69+
if (range.commentRange) {
70+
selectCodeInRange(range.commentRange.start, range.commentRange.end);
71+
}
72+
73+
const creationContext: CreateToolchainContext = {
74+
action: 'AutoMethodAction',
75+
filename: document.fileName,
76+
language: language,
77+
78+
content: document.getText(),
79+
element: range,
80+
};
81+
82+
const contextItems = await this.promptManager.collectToolchain(creationContext);
83+
if (contextItems.length > 0) {
84+
templateContext.chatContext = contextItems.map(item => item.text).join('\n - ');
85+
}
86+
87+
let content = await this.promptManager.generateInstruction(ActionType.AutoMethod, templateContext);
88+
log(`request: ${content}`);
89+
90+
let msg: IChatMessage = {
91+
role: ChatMessageRole.User,
92+
content: content,
93+
};
94+
95+
try {
96+
const doc = await this.lm.chat([msg], {});
97+
98+
this.statusBarManager.setStatus(AutoDevStatus.Done);
99+
const finalText = StreamingMarkdownCodeBlock.parse(doc).text;
100+
101+
log(`FencedCodeBlock parsed output: ${finalText}`);
102+
103+
let codestring = MarkdownTextProcessor.buildDocFromSuggestion(doc, startSymbol, endSymbol);
104+
105+
let startLine = range.blockRange.start.line;
106+
let startChar = range.blockRange.start.character;
107+
108+
if (startLine === 0) {
109+
startLine = 1;
110+
}
111+
112+
// todo: add format by indent.
113+
114+
const textRange: Position = new Position(startLine - 1, startChar);
115+
insertCodeByRange(textRange, codestring);
116+
} catch (e) {
117+
console.error(e);
118+
this.statusBarManager.setStatus(AutoDevStatus.Error);
119+
return;
120+
}
121+
}
122+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { TemplateContext } from '../../prompt-manage/template/TemplateContext';
2+
3+
export interface AutoMethodTemplateContext extends TemplateContext {
4+
startSymbol: string;
5+
endSymbol: string;
6+
code: string;
7+
forbiddenRules: string[];
8+
originalMethodCodes: string[];
9+
}

src/action/providers/AutoDevCodeLensProvider.ts

+20-2
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import {
2727
CMD_CODELENS_QUICK_CHAT,
2828
CMD_CODELENS_SHOW_CUSTOM_ACTION,
2929
CMD_SHOW_CODELENS_DETAIL_QUICKPICK,
30+
CMD_CODELENS_SHOW_CODE_METHOD_COMPLETIONS,
3031
} from 'base/common/configuration/configuration';
3132
import { ConfigurationService } from 'base/common/configuration/configurationService';
3233
import { isFileTooLarge } from 'base/common/files/files';
@@ -35,8 +36,9 @@ import { ILanguageServiceProvider } from 'base/common/languages/languageService'
3536
import { logger } from 'base/common/log/log';
3637

3738
import { type AutoDevExtension } from '../../AutoDevExtension';
39+
import { CodeElementType } from 'src/editor/codemodel/CodeElementType';
3840

39-
type CodeLensItemType = 'quickChat' | 'explainCode' | 'optimizeCode' | 'autoComment' | 'autoTest' | 'customAction';
41+
type CodeLensItemType = 'quickChat' | 'explainCode' | 'optimizeCode' | 'autoComment' | 'autoTest' | 'customAction'|'AutoMethod';
4042

4143
export class AutoDevCodeLensProvider implements CodeLensProvider {
4244
private config: ConfigurationService;
@@ -123,6 +125,9 @@ export class AutoDevCodeLensProvider implements CodeLensProvider {
123125
commands.registerCommand(CMD_CODELENS_SHOW_CUSTOM_ACTION, (document: TextDocument, nameElement: NamedElement) => {
124126
autodev.executeCustomAction(document, nameElement);
125127
}),
128+
commands.registerCommand(CMD_CODELENS_SHOW_CODE_METHOD_COMPLETIONS, (document: TextDocument, nameElement: NamedElement) => {
129+
autodev.executeAutoMethodAction(document, nameElement);
130+
}),
126131
];
127132
}
128133

@@ -153,6 +158,7 @@ export class AutoDevCodeLensProvider implements CodeLensProvider {
153158
}
154159

155160
const elements = await this.parseToNamedElements(document);
161+
// elements为空导致codelens组没有数据,无法生成codelens
156162

157163
if (token.isCancellationRequested || elements.length === 0) {
158164
return [];
@@ -250,7 +256,6 @@ export class AutoDevCodeLensProvider implements CodeLensProvider {
250256
}
251257
continue;
252258
}
253-
254259
if (type === 'customAction') {
255260
if (hasCustomPromps) {
256261
codelenses.push(
@@ -263,6 +268,19 @@ export class AutoDevCodeLensProvider implements CodeLensProvider {
263268
}
264269
continue;
265270
}
271+
if (type === 'AutoMethod') {
272+
if (element.codeElementType==CodeElementType.Method) {
273+
codelenses.push(
274+
new CodeLens(element.identifierRange, {
275+
title: l10n.t('AutoMethod'),
276+
command: CMD_CODELENS_SHOW_CODE_METHOD_COMPLETIONS,
277+
arguments: [document, element],
278+
}),
279+
);
280+
}
281+
continue;
282+
}
283+
266284
}
267285

268286
result.push(codelenses);

0 commit comments

Comments
 (0)