Javascript 使用正则表达式计算typescript文件中的所有函数、箭头函数和类方法
我正在实现一个函数,它接收一个文件路径作为参数,并返回文件中存在的普通函数、箭头函数、类方法、setter和getter的总数 由于有多种方法可以声明类方法(例如,Javascript 使用正则表达式计算typescript文件中的所有函数、箭头函数和类方法,javascript,regex,typescript,Javascript,Regex,Typescript,我正在实现一个函数,它接收一个文件路径作为参数,并返回文件中存在的普通函数、箭头函数、类方法、setter和getter的总数 由于有多种方法可以声明类方法(例如,public methodName(参数1,…),private methodName(…),因此我考虑使用正则表达式来检索类方法的数量。例如: const countClassMethods = (typescriptFileString: string): number => { return typescriptF
public methodName(参数1,…),private methodName(…)
,因此我考虑使用正则表达式来检索类方法的数量。例如:
const countClassMethods = (typescriptFileString: string): number => {
return typescriptFileString.match('REGULAR_EXPRESSION_TO_COUNT_CLASS_METHODS')?.length || 0;
}
const extractAllFunctionOcurences = (filePath: string): number => {
const typescriptFileString = fs.readFileSync(filePath, 'utf8');
const quantityOfNormalFunctions = countNormalFunction(typescriptFileString);
const quantityOfArrowFunctions = countArrowFunctions(typescriptFileString);
const quantityOfClassMethods = countClassMethods(typescriptFileString);
const quantityOfGettersAndSetters = countGettersAndSetters(typescriptFileString);
return quantityOfNormalFunctions + quantityOfArrowFunctions + quantityOfClassMethods + quantityOfGettersAndSetters;
}
我的问题是:
1) 哪一个是用于从typescript文件中标识类方法的适当正则表达式
2) 如果有更好的方法来识别它们,它们是什么
Ps:我试着在谷歌上寻找这个,但找不到满意的答案。
提前谢谢
编辑:到目前为止,我让当前正则表达式为类方法工作:“myFileString.match(/(public | private | protected)*\s{0,}[^\n\r\t\v\0\s]+\(\s*([^)]+?)\s*\(\s*:\s*[^\n\r\t\v\0\s]+)*\s*{/igm)
如果我能找到更好的,我会更新它
编辑2:根据@Timo的建议,这是我的最终代码,以防有人感兴趣:
'use strict';
import fs from 'fs';
import ts from 'typescript';
const extractAllFunctionOcurences = (filename: string): number => {
let numOfFunctions = 0;
const delintNode = (node: ts.Node) => {
switch (node.kind) {
case ts.SyntaxKind.FunctionDeclaration:
case ts.SyntaxKind.FunctionKeyword:
case ts.SyntaxKind.FunctionExpression:
case ts.SyntaxKind.ArrowFunction:
case ts.SyntaxKind.ClassDeclaration:
case ts.SyntaxKind.MethodDeclaration:
case ts.SyntaxKind.GetAccessor:
case ts.SyntaxKind.SetAccessor:
numOfFunctions += 1;
}
ts.forEachChild(node, delintNode);
};
if (!fs.existsSync(filename)) return 0;
const sourceFile = ts.createSourceFile(
filename,
fs.readFileSync(filename).toString(),
ts.ScriptTarget.ES2015,
true
);
delintNode(sourceFile);
return numOfFunctions;
};
你最好还是使用抽象语法树(如果它不响的话,用谷歌搜索这个词)来考虑太多的边缘情况:
constfoo=()/*functionprivate()=>*/=>{}
你能把你自己的答案变成答案的形式并接受它吗?