import BaseDetector from "./BaseDetector.js";
import { Loop, Var, Call, Joinpoint, Class, Method, Declaration } from "../../../../Joinpoints.js";
export interface MethodInfo {
    method: Method;
    missingInfo: boolean;
    writes: Var[];
    reads: Var[];
}
export default class ExcessiveMethodCallsDetector extends BaseDetector {
    currentPackage: string | undefined;
    loopGlobalReads: Declaration[];
    loopGlobalWrites: Declaration[];
    loopLocalWrites: Declaration[];
    methodsInfo: MethodInfo[];
    variantCalls: string[];
    missingCallDecl: boolean;
    results: Call[];
    constructor(debugEnabled?: boolean);
    static containsJP(arr: Joinpoint[], jp: Joinpoint): boolean;
    static tryGetMethodInfo(arr: MethodInfo[], jp: Method): MethodInfo | null;
    static addIfNew(arr: Joinpoint[], jp: Joinpoint): void;
    analyseClass(jpClass: Class): void;
    analyseLoop(jpLoop: Loop): void;
    print(): void;
    resetDetector(): void;
    printDebugInfo(msg: string): void;
    save(): string[];
    collectLoopInfo(jp: Joinpoint): void;
    analyseVar(jpVar: Var): void;
    analyseCall(jpCall: Call): void;
    analyseMethodRecursive(jpMethod: Method): {
        writes: Var[];
        reads: Var[];
    };
    getFieldUsageInsideJP(jp: Joinpoint): {
        missing: Var[];
        write: Var[];
        read: Var[];
    };
    analyseLoopCall(jp: Joinpoint): boolean;
    isCallInvariant(jpCall: Call): boolean;
    compareFieldUsage(arr1: Joinpoint[], arr2: Joinpoint[]): boolean;
    callUsesVariantArgument(jpCall: Call): {
        isVariant: boolean;
        cause: string;
    };
    callInvokesVariantMethod(jp: Joinpoint): boolean;
    getFirstDescendentsOfTypes(jp: Joinpoint, types: string[]): Joinpoint[];
}
//# sourceMappingURL=ExcessiveMethodCallsDetector.d.ts.map