refactor(javascript): centralize source coordinate operations

This commit is contained in:
morluto
2026-10-22 10:57:27 +08:00
parent dd3497e133
commit ddce4bb446
11 changed files with 78 additions and 93 deletions
@@ -1,4 +1,28 @@
import { z } from "zod";
import type {
JavaScriptSourcePoint,
JavaScriptSourceRange,
} from "./javascriptStaticAnalysisTypes.js";
/** Compare parser coordinates by line, then UTF-16 column. */
export const compareJavaScriptSourcePoints = (
left: JavaScriptSourcePoint,
right: JavaScriptSourcePoint,
): number => left.line - right.line || left.column - right.column;
/** Include equal endpoints without implying runtime reachability. */
export const javascriptSourceRangeContains = (
outer: JavaScriptSourceRange,
inner: JavaScriptSourceRange,
): boolean =>
compareJavaScriptSourcePoints(outer.start, inner.start) <= 0 &&
compareJavaScriptSourcePoints(outer.end, inner.end) >= 0;
/** Exact artifact-local coordinate key; callers supply the artifact identity. */
export const javascriptSourceRangeKey = (
range: JavaScriptSourceRange,
): string =>
`${range.start.line}:${range.start.column}-${range.end.line}:${range.end.column}`;
const sourcePointSchema = z.strictObject({
line: z.number().int().min(1),
@@ -9,11 +33,7 @@ const sourcePointSchema = z.strictObject({
export const javascriptSourceRangeSchema = z
.strictObject({ start: sourcePointSchema, end: sourcePointSchema })
.superRefine((range, context) => {
if (
range.end.line < range.start.line ||
(range.end.line === range.start.line &&
range.end.column < range.start.column)
)
if (compareJavaScriptSourcePoints(range.end, range.start) < 0)
context.addIssue({
code: "custom",
path: ["end"],