import type { DataflowGraph } from '../../dataflow/graph/graph';
import type { NodeId } from '../../r-bridge/lang-4.x/ast/model/processing/node-id';
import type { MergeableRecord } from '../../util/objects';
import type { SourceRange } from '../../util/range';
import type { LintingResult, LintQuickFixReplacement } from '../linter-format';
import { LintingResultCertainty, LintingRuleCertainty } from '../linter-format';
import { LintingRuleTag } from '../linter-tags';
export declare enum CasingConvention {
    CamelCase = "camelCase",
    PascalCase = "PascalCase",
    SnakeCase = "snake_case",
    ConstantCase = "CONSTANT_CASE",
    CamelSnakeCase = "camel_Snake_Case",
    PascalSnakeCase = "Pascal_Snake_Case",
    Unknown = "unknown"
}
export interface NamingConventionResult extends LintingResult {
    name: string;
    detectedCasing: CasingConvention;
    range: SourceRange;
}
/**
 * It is planned to have a config like ESLint
 */
export interface NamingConventionConfig extends MergeableRecord {
    caseing: CasingConvention | 'auto';
}
export interface NamingConventionMetadata extends MergeableRecord {
    /** number of symbols matching the casing convetion */
    numMatches: number;
    /** number of symbols breaking the casing convetion */
    numBreak: number;
}
export declare function detectCasing(identifier: string): CasingConvention;
export declare function getMostUsedCasing(symbols: {
    detectedCasing: CasingConvention;
}[]): CasingConvention;
export declare function fixCasing(identifier: string, convention: CasingConvention): string;
export declare function createNamingConventionQuickFixes(graph: DataflowGraph, nodeId: NodeId, replacement: string, conv: CasingConvention): LintQuickFixReplacement[] | undefined;
export declare const NAMING_CONVENTION: {
    readonly createSearch: (_config: NamingConventionConfig) => import("../../search/flowr-search-builder").FlowrSearchBuilder<"all", ["filter"], import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../../search/flowr-search").FlowrSearchElements<import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, [] | import("../../search/flowr-search").FlowrSearchElement<import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>>;
    readonly processSearchResult: (elements: import("../../search/flowr-search").FlowrSearchElements<import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../../search/flowr-search").FlowrSearchElement<import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>, config: NamingConventionConfig, data: {
        normalize: import("../../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
        dataflow: import("../../dataflow/info").DataflowInformation;
        config: import("../../config").FlowrConfigOptions;
    }) => {
        results: {
            quickFix: LintQuickFixReplacement[] | undefined;
            certainty: LintingResultCertainty;
            detectedCasing: CasingConvention;
            name: string;
            range: SourceRange;
        }[];
        '.meta': {
            numMatches: number;
            numBreak: number;
        };
    };
    readonly prettyPrint: {
        readonly query: (result: NamingConventionResult) => string;
        readonly full: (result: NamingConventionResult) => string;
    };
    readonly info: {
        readonly name: "Naming Convention";
        readonly certainty: LintingRuleCertainty.OverApproximative;
        readonly description: "Checks wether the symbols conform to a certain naming convention";
        readonly tags: readonly [LintingRuleTag.Style, LintingRuleTag.QuickFix];
        readonly defaultConfig: {
            readonly caseing: "auto";
        };
    };
};
