-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Co-authored-by: ygqygq2 <ygqygq2@qq.com>
- Loading branch information
Showing
15 changed files
with
313 additions
and
31 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
3 changes: 3 additions & 0 deletions
3
sampleWorkspace/function-comment-for-c/function-none-params-without-return.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
void func() { | ||
printf("test\n"); | ||
} |
7 changes: 7 additions & 0 deletions
7
sampleWorkspace/function-comment-for-c/function-none-params-without-return.result.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
/** | ||
* @description | ||
* @return default {void} | ||
*/ | ||
void func() { | ||
printf("test\n"); | ||
} |
4 changes: 4 additions & 0 deletions
4
sampleWorkspace/function-comment-for-c/function-with-params-with-return.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
int func(char* a, int b) { | ||
printf("test\n"); | ||
return 1; | ||
} |
10 changes: 10 additions & 0 deletions
10
sampleWorkspace/function-comment-for-c/function-with-params-with-return.result.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
/** | ||
* @description | ||
* @return default {int} | ||
* @param a {char*} | ||
* @param b {int} | ||
*/ | ||
int func(char* a, int b) { | ||
printf("test\n"); | ||
return 1; | ||
} |
File renamed without changes.
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,164 @@ | ||
import * as vscode from 'vscode'; | ||
|
||
import { ConfigManager } from '@/configuration/ConfigManager'; | ||
import { logger } from '@/extension'; | ||
import { LanguageFunctionCommentSettings } from '@/typings/types'; | ||
import { escapeRegexString } from '@/utils/str'; | ||
|
||
import { FunctionParamsParser } from './FunctionParamsParser'; | ||
import { splitParams } from './c-splitParams'; | ||
import { extractFunctionParamsString } from './extractFunctionParamsString'; | ||
import { FunctionParamsInfo, ParamsInfo, ReturnInfo } from './types'; | ||
|
||
function matchNormalFunction( | ||
functionDefinition: string, | ||
languageSettings: LanguageFunctionCommentSettings, | ||
): { | ||
matched: boolean; | ||
returnType: ReturnInfo; | ||
params: ParamsInfo; | ||
} { | ||
const { defaultReturnName = 'default' } = languageSettings; | ||
const returnType: ReturnInfo = {}; | ||
let matched = false; | ||
let params: ParamsInfo = {}; | ||
|
||
// 提取参数括号里的字符串 | ||
const functionParamsStr = extractFunctionParamsString(functionDefinition); | ||
const functionParamsRegStr = escapeRegexString(functionParamsStr); | ||
const functionPattern = new RegExp( | ||
`(.*?)\\s+([a-zA-Z0-9_]+)\\s*\\(${functionParamsRegStr}\\)\\s*{[\\s\\S]*?}`, | ||
'm', | ||
); | ||
|
||
const match = functionPattern.exec(functionDefinition); | ||
const modifiers = ['static', 'inline']; | ||
|
||
if (match) { | ||
matched = true; | ||
const prefixParts = match[1].split(' ').filter((part) => part !== ''); | ||
let returnTypeIndex = 0; | ||
|
||
for (let i = 0; i < prefixParts.length; i++) { | ||
if (!modifiers.includes(prefixParts[i])) { | ||
returnTypeIndex = i; | ||
break; | ||
} | ||
} | ||
|
||
const returnTypeStr = prefixParts.slice(returnTypeIndex).join(' '); | ||
returnType[defaultReturnName] = { | ||
type: returnTypeStr, | ||
description: '', | ||
}; | ||
|
||
params = splitParams(functionParamsStr, languageSettings); | ||
} | ||
|
||
return { matched, returnType, params }; | ||
} | ||
|
||
/** | ||
* @description | ||
* @return default {auto} | ||
*/ | ||
function matchFunction( | ||
functionDefinition: string, | ||
languageSettings: LanguageFunctionCommentSettings, | ||
): { matched: boolean; returnType: ReturnInfo; params: ParamsInfo } { | ||
const { defaultReturnName = 'default', defaultReturnType = 'auto' } = languageSettings; | ||
let returnType: ReturnInfo = { | ||
[defaultReturnName]: { type: defaultReturnType, description: '' }, | ||
}; | ||
let matched = false; | ||
let params: ParamsInfo = {}; | ||
|
||
const matchers = [matchNormalFunction]; | ||
|
||
for (const matcher of matchers) { | ||
const result = matcher(functionDefinition, languageSettings); | ||
if (result.matched) { | ||
matched = result.matched; | ||
params = result.params; | ||
returnType = result.returnType; | ||
break; | ||
} | ||
} | ||
|
||
return { matched, returnType, params }; | ||
} | ||
|
||
export class CParser extends FunctionParamsParser { | ||
constructor(configManager: ConfigManager, languageId: string) { | ||
super(configManager, languageId); | ||
} | ||
|
||
private getFunctionString(document: vscode.TextDocument, startLine: number) { | ||
let functionDefinition = ''; | ||
let bracketCount = 0; // 大括号计数 | ||
let parenthesisCount = 0; // 小括号计数 | ||
|
||
for (let i = startLine; i < document.lineCount; i++) { | ||
const line = document.lineAt(i); | ||
functionDefinition += line.text + '\n'; | ||
|
||
for (const char of line.text) { | ||
if (char === '(') { | ||
parenthesisCount++; | ||
} else if (char === ')') { | ||
parenthesisCount--; | ||
} else if (char === '{') { | ||
bracketCount++; | ||
} else if (char === '}') { | ||
bracketCount--; | ||
} | ||
} | ||
|
||
if (bracketCount === 0 && parenthesisCount === 0) { | ||
break; | ||
} | ||
} | ||
|
||
return functionDefinition; | ||
} | ||
|
||
public getFunctionParamsAtCursor( | ||
activeEditor: vscode.TextEditor, | ||
languageSettings: LanguageFunctionCommentSettings = this.languageSettings, | ||
): FunctionParamsInfo { | ||
let functionParams: ParamsInfo = {}; | ||
let matchedFunction = false; | ||
let returnType: ReturnInfo = {}; | ||
const document = activeEditor.document; | ||
const cursorLine = activeEditor.selection.start.line; | ||
let startLine = cursorLine; | ||
// 如果光标所在行为空行或者注释,则从下一行开始 | ||
const cursorLineText = document.lineAt(cursorLine).text.trim(); | ||
if (cursorLineText === '' || cursorLineText === '//' || cursorLineText === '*/') { | ||
startLine = cursorLine + 1; | ||
} | ||
|
||
const functionDefinition = this.getFunctionString(document, startLine); | ||
const { | ||
matched, | ||
returnType: returnTypeTmp, | ||
params, | ||
} = matchFunction(functionDefinition, languageSettings); | ||
if (matched) { | ||
matchedFunction = true; | ||
returnType = returnTypeTmp; | ||
functionParams = params; | ||
} | ||
|
||
if (!matchFunction) { | ||
logger.info(vscode.l10n.t('No function found at the cursor')); | ||
} | ||
|
||
return { | ||
matchedFunction, | ||
returnType, | ||
params: functionParams, | ||
insertPosition: new vscode.Position(startLine, 0), | ||
}; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.