javascript - Räkna alla funktioner, pilfunktioner, klassmetoder från TypeScript-fil med regex


Jag implementerar en funktion som tar emot en filsökväg som en parameter och returnerar det totala antalet vanliga funktioner, arrow-funktioner, klassmetoder, setters och getters som finns i filen.

Eftersom det finns flera sätt att deklarera en klassmetod på, (t.ex. public methodName(parameter 1, ...) , private methodName(...)) tänkte jag använda reguljära uttryck för att hämta antalet klassmetoder. Något i stil med:

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;
}

Mina frågor är:

1) Vilket är den lämpliga Regex att använda för att identifiera klassmetoder från en TypeScript-fil

2) Om det finns bättre sätt att identifiera dem, vilka är de.

Ps: Jag försökte leta efter detta på Google men kunde inte hitta ett tillfredsställande svar. Tack på förhand.

redigera: hittills har jag fått den nuvarande Regex att fungera för klassmetoder: "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)

Jag kommer att uppdatera det om jag kan hitta en bättre.

redigera 2: Följande @Timos förslag, detta är min slutliga kod, om någon är intresserad:

'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;
};