Я реализую функцию, которая получает путь к файлу в качестве параметра и возвращает общее количество нормальных функций, функций стрелок, методов класса, методов установки и получения, присутствующих в файле.
Поскольку существует несколько способов объявления метод класса (например, public methodName(parameter 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) Какие является подходящим регулярным выражением, используемым для идентификации методов класса из файла машинописного текста
2) Если есть более эффективные способы их идентификации, каковы они.
Ps: я пытался искать это в Google, но не смог найти удовлетворительный ответ. Заранее спасибо.
edit: пока что у меня есть текущий Regex для работы с методами класса: "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)
Я обновлю его, если смогу найти лучший.
edit 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;
};