Подсчитать все функции, функции стрелок, методы классов из машинописного файла с помощью регулярных выражений - PullRequest
3 голосов
/ 10 марта 2020

Я реализую функцию, которая получает путь к файлу в качестве параметра и возвращает общее количество нормальных функций, функций стрелок, методов класса, методов установки и получения, присутствующих в файле.

Поскольку существует несколько способов объявления метод класса (например, 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;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...