Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 | 14x 3x 3x 3x 3x 3x 3x 3x 3x 3x 8x 8x 8x 8x 8x 3x 3x | /**
* FunctionCollector - Extracts function definitions and declarations from C++ parse trees.
*
* Produces ICppFunctionSymbol instances with parameters.
*/
/* eslint-disable @typescript-eslint/no-explicit-any */
import ESourceLanguage from "../../../../../utils/types/ESourceLanguage";
import ICppFunctionSymbol from "../../../../types/symbols/cpp/ICppFunctionSymbol";
import ICppParameterInfo from "../../../../types/symbols/cpp/ICppParameterInfo";
import DeclaratorUtils from "../utils/DeclaratorUtils";
import IExtractedParameter from "../../shared/IExtractedParameter";
class FunctionCollector {
/**
* Map extracted parameters to ICppParameterInfo array.
*/
private static _mapParameters(
extracted: IExtractedParameter[],
): ICppParameterInfo[] {
return extracted.map((p) => ({
name: p.name,
type: p.type,
isConst: p.isConst,
isArray: p.isArray,
}));
}
/**
* Collect a function definition and return an ICppFunctionSymbol.
*
* @param funcDef The function definition context
* @param sourceFile Source file path
* @param line Line number
* @param currentNamespace Optional current namespace
* @returns The function symbol or null if no name
*/
static collectDefinition(
funcDef: any,
sourceFile: string,
line: number,
currentNamespace?: string,
): ICppFunctionSymbol | null {
const declarator = funcDef.declarator?.();
Iif (!declarator) return null;
const name = DeclaratorUtils.extractDeclaratorName(declarator);
Iif (!name) return null;
// Get return type
const declSpecSeq = funcDef.declSpecifierSeq?.();
const returnType = declSpecSeq
? DeclaratorUtils.extractTypeFromDeclSpecSeq(declSpecSeq)
: "void";
const fullName = currentNamespace ? `${currentNamespace}::${name}` : name;
const params = FunctionCollector._mapParameters(
DeclaratorUtils.extractFunctionParameters(declarator),
);
return {
kind: "function",
name: fullName,
type: returnType,
sourceFile,
sourceLine: line,
sourceLanguage: ESourceLanguage.Cpp,
isExported: true,
parent: currentNamespace,
parameters: params.length > 0 ? params : undefined,
isDeclaration: false,
};
}
/**
* Collect a function declaration (prototype) and return an ICppFunctionSymbol.
*
* @param declarator The function declarator context
* @param baseType The return type string
* @param sourceFile Source file path
* @param line Line number
* @param currentNamespace Optional current namespace
* @returns The function symbol or null if no name
*/
static collectDeclaration(
declarator: any,
baseType: string,
sourceFile: string,
line: number,
currentNamespace?: string,
): ICppFunctionSymbol | null {
const name = DeclaratorUtils.extractDeclaratorName(declarator);
Iif (!name) return null;
const fullName = currentNamespace ? `${currentNamespace}::${name}` : name;
const params = FunctionCollector._mapParameters(
DeclaratorUtils.extractFunctionParameters(declarator),
);
return {
kind: "function",
name: fullName,
type: baseType,
sourceFile,
sourceLine: line,
sourceLanguage: ESourceLanguage.Cpp,
isExported: true,
parent: currentNamespace,
parameters: params.length > 0 ? params : undefined,
isDeclaration: true,
};
}
/**
* Collect a member function (method) and return an ICppFunctionSymbol.
*
* @param className The class this method belongs to
* @param funcName The method name
* @param declarator The function declarator context
* @param returnType The return type string
* @param sourceFile Source file path
* @param line Line number
* @param isDeclaration Whether this is a declaration (vs inline definition)
* @returns The function symbol
*/
static collectMemberFunction(
className: string,
funcName: string,
declarator: any,
returnType: string,
sourceFile: string,
line: number,
isDeclaration: boolean,
): ICppFunctionSymbol {
const params = FunctionCollector._mapParameters(
DeclaratorUtils.extractFunctionParameters(declarator),
);
return {
kind: "function",
name: `${className}::${funcName}`,
type: returnType,
sourceFile,
sourceLine: line,
sourceLanguage: ESourceLanguage.Cpp,
isExported: true,
parent: className,
parameters: params.length > 0 ? params : undefined,
isDeclaration: isDeclaration || undefined,
};
}
}
export default FunctionCollector;
|