/** * Before/after comparison of ABAP sources — the deterministic half of a * rework review. * * Findings are matched by CONTENT (rule + message + offending line text), * never by line number, so code that merely moved does not show up as * regressed or fixed. Blocker count / score / grade movement comes from the * same objective dual-parse diff check_cloud_readiness uses; this module * adds no judgment of its own. */ import type { AbapSource, AbapVersion, Finding, FocusTag } from "./engine.js"; import type { ReadinessGrade } from "./readiness.js"; export interface CompareSide { findingCount: number; cloudBlockerCount: number; score: number; grade: ReadinessGrade; } export interface OutlineChanges { classesAdded: string[]; classesRemoved: string[]; /** "class.method", lower-cased. */ methodsAdded: string[]; methodsRemoved: string[]; formsAdded: string[]; formsRemoved: string[]; } export interface CompareOptions { version: AbapVersion; preset: "style" | "full" | "syntax-only"; rules?: Record | undefined; focus?: FocusTag | undefined; /** Baseline for the readiness halves; defaults to v758. */ baselineVersion?: AbapVersion | undefined; } export interface CompareReport { /** Findings present before but gone after — improvements. */ resolved: Finding[]; /** Findings present only after — regressions. */ introduced: Finding[]; /** Findings present on both sides (content-matched). */ unchangedCount: number; before: CompareSide; after: CompareSide; outlineChanges: OutlineChanges; matchNote: string; } export declare const MATCH_NOTE: string; export declare function compareAbap(before: AbapSource[], after: AbapSource[], opts: CompareOptions): CompareReport;