corsa-oxlint 0.33.0 → 0.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/session.d.ts +0 -1
- package/dist/session.js +2 -57
- package/dist/session.js.map +1 -1
- package/package.json +2 -2
package/dist/session.d.ts
CHANGED
package/dist/session.js
CHANGED
|
@@ -181,8 +181,8 @@ var CorsaProjectSession = class {
|
|
|
181
181
|
}
|
|
182
182
|
}
|
|
183
183
|
getTypeArguments(type) {
|
|
184
|
-
const
|
|
185
|
-
return
|
|
184
|
+
const source = this.sourceSliceForType(type);
|
|
185
|
+
return this.rememberTypes(source ? this.client().getTypeArgumentsAtSourceRange(this.#snapshot, this.projectId(), type.id, type.objectFlags, source.node.fileName, source.node.pos, source.node.end, this.sourceTextForPath(source.node.fileName) ?? "") : this.client().getTypeArguments(this.#snapshot, this.projectId(), type.id, type.objectFlags));
|
|
186
186
|
}
|
|
187
187
|
getTypesOfType(type) {
|
|
188
188
|
if ((type.flags & (typeFlags.union | typeFlags.intersection | typeFlags.templateLiteral)) === 0) return [];
|
|
@@ -246,14 +246,6 @@ var CorsaProjectSession = class {
|
|
|
246
246
|
return;
|
|
247
247
|
}
|
|
248
248
|
}
|
|
249
|
-
fallbackTypeArguments(type) {
|
|
250
|
-
const source = this.sourceSliceForType(type);
|
|
251
|
-
if (!source) return [];
|
|
252
|
-
return typeArgumentInfosForSource(source).map((argument) => {
|
|
253
|
-
const symbol = this.getSymbolAtPosition(source.node.fileName, argument.pos, this.sourceTextForPath(source.node.fileName));
|
|
254
|
-
return symbol ? this.getDeclaredTypeOfSymbol(symbol) ?? this.getTypeOfSymbol(symbol) : void 0;
|
|
255
|
-
}).filter((argument) => argument !== void 0);
|
|
256
|
-
}
|
|
257
249
|
sourceSliceForType(type) {
|
|
258
250
|
const cached = this.#typeSourceById.get(type.id);
|
|
259
251
|
if (cached) return cached;
|
|
@@ -606,21 +598,6 @@ function parameterNameForText(text) {
|
|
|
606
598
|
if (left.startsWith("{") || left.startsWith("[")) return left;
|
|
607
599
|
return left.split(/\s+/).at(-1);
|
|
608
600
|
}
|
|
609
|
-
function typeArgumentInfosForSource(source) {
|
|
610
|
-
const annotationMarker = firstTopLevelIndexOfAny(source.text, [":", "="]);
|
|
611
|
-
const typeStart = annotationMarker >= 0 ? annotationMarker + 1 : 0;
|
|
612
|
-
const openInType = firstTopLevelOpeningAngle(source.text.slice(typeStart));
|
|
613
|
-
if (openInType < 0) return [];
|
|
614
|
-
const open = typeStart + openInType;
|
|
615
|
-
const close = matchingCloseAngle(source.text, open);
|
|
616
|
-
if (close < 0) return [];
|
|
617
|
-
const argumentsText = source.text.slice(open + 1, close);
|
|
618
|
-
return splitTopLevelRanges(argumentsText, ",").map((range) => {
|
|
619
|
-
const leading = argumentsText.slice(range.start, range.end).search(/\S/);
|
|
620
|
-
if (leading < 0) return;
|
|
621
|
-
return { pos: source.node.pos + open + 1 + range.start + leading };
|
|
622
|
-
}).filter((argument) => argument !== void 0);
|
|
623
|
-
}
|
|
624
601
|
function matchingCloseParen(text, open) {
|
|
625
602
|
let depth = 0;
|
|
626
603
|
const scanner = createScanner();
|
|
@@ -635,20 +612,6 @@ function matchingCloseParen(text, open) {
|
|
|
635
612
|
}
|
|
636
613
|
return -1;
|
|
637
614
|
}
|
|
638
|
-
function matchingCloseAngle(text, open) {
|
|
639
|
-
let depth = 0;
|
|
640
|
-
const scanner = createScanner();
|
|
641
|
-
for (let index = open; index < text.length; index += 1) {
|
|
642
|
-
const char = text[index];
|
|
643
|
-
if (scanner.inQuote(char)) continue;
|
|
644
|
-
if (char === "<") depth += 1;
|
|
645
|
-
else if (char === ">") {
|
|
646
|
-
depth -= 1;
|
|
647
|
-
if (depth === 0) return index;
|
|
648
|
-
}
|
|
649
|
-
}
|
|
650
|
-
return -1;
|
|
651
|
-
}
|
|
652
615
|
function splitTopLevelRanges(text, delimiter) {
|
|
653
616
|
const ranges = [];
|
|
654
617
|
const scanner = createScanner();
|
|
@@ -703,24 +666,6 @@ function firstTopLevelIndexOfAny(text, needles) {
|
|
|
703
666
|
}
|
|
704
667
|
return -1;
|
|
705
668
|
}
|
|
706
|
-
function firstTopLevelOpeningAngle(text) {
|
|
707
|
-
const scanner = createScanner();
|
|
708
|
-
let parenDepth = 0;
|
|
709
|
-
let bracketDepth = 0;
|
|
710
|
-
let braceDepth = 0;
|
|
711
|
-
for (let index = 0; index < text.length; index += 1) {
|
|
712
|
-
const char = text[index];
|
|
713
|
-
if (scanner.inQuote(char)) continue;
|
|
714
|
-
if (char === "(") parenDepth += 1;
|
|
715
|
-
else if (char === ")") parenDepth = Math.max(0, parenDepth - 1);
|
|
716
|
-
else if (char === "[") bracketDepth += 1;
|
|
717
|
-
else if (char === "]") bracketDepth = Math.max(0, bracketDepth - 1);
|
|
718
|
-
else if (char === "{") braceDepth += 1;
|
|
719
|
-
else if (char === "}") braceDepth = Math.max(0, braceDepth - 1);
|
|
720
|
-
else if (char === "<" && parenDepth === 0 && bracketDepth === 0 && braceDepth === 0) return index;
|
|
721
|
-
}
|
|
722
|
-
return -1;
|
|
723
|
-
}
|
|
724
669
|
function createScanner() {
|
|
725
670
|
let quote;
|
|
726
671
|
let escaped = false;
|
package/dist/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","names":["#snapshot","#client","#supportsOverlayChanges","#files","#typeTextById","#typeLookupById","#syntheticSymbolsById","#symbolsById","#symbolTypeById","#nodesById","#typeSourceById","#config","#lastRefreshMs","#projects"],"sources":["../ts/session.ts"],"sourcesContent":["import { readFileSync, statSync } from \"node:fs\";\n\nimport { type ProjectResponse, CorsaApiClient } from \"@corsa-bind/napi\";\n\nimport type {\n CorsaNode,\n CorsaSignature,\n CorsaSymbol,\n CorsaType,\n CorsaTypePredicate,\n} from \"./types\";\nimport type { ResolvedProjectConfig, ResolvedRuntimeOptions } from \"./types\";\n\ntype FileCache = {\n mtimeMs: number;\n lintSourceText?: string;\n sourceText?: string;\n projectId: string;\n typeByPosition: Map<number, CorsaType | undefined>;\n typeBySourceRange: Map<string, CorsaType | undefined>;\n symbolByPosition: Map<number, CorsaSymbol | undefined>;\n};\n\ntype PreparedFileState = {\n mtimeMs: number;\n lintSourceText?: string;\n sourceText?: string;\n};\n\ntype SourceSlice = {\n node: CorsaNode;\n text: string;\n};\n\ntype TypeLookup = {\n fileName: string;\n position: number;\n sourceText?: string;\n};\n\ntype ParameterInfo = {\n name: string;\n node: CorsaNode;\n};\n\ntype TypeArgumentInfo = {\n pos: number;\n};\n\nconst typeFlags = {\n object: 1 << 20,\n index: 1 << 21,\n templateLiteral: 1 << 22,\n stringMapping: 1 << 23,\n substitution: 1 << 24,\n indexedAccess: 1 << 25,\n conditional: 1 << 26,\n union: 1 << 27,\n intersection: 1 << 28,\n} as const;\n\nconst objectFlags = {\n classOrInterface: (1 << 0) | (1 << 1),\n reference: 1 << 2,\n mapped: 1 << 5,\n} as const;\n\nexport class CorsaProjectSession {\n #client?: CorsaApiClient;\n #config?: { options: unknown; fileNames: string[] };\n #snapshot?: string;\n #projects: ProjectResponse[] = [];\n #files = new Map<string, FileCache>();\n #symbolsById = new Map<string, CorsaSymbol>();\n #syntheticSymbolsById = new Map<string, CorsaSymbol>();\n #symbolTypeById = new Map<string, string>();\n #nodesById = new Map<string, CorsaNode>();\n #typeLookupById = new Map<string, TypeLookup>();\n #typeSourceById = new Map<string, SourceSlice>();\n #typeTextById = new Map<string, string>();\n #lastRefreshMs = 0;\n #supportsOverlayChanges?: boolean;\n\n constructor(\n readonly project: ResolvedProjectConfig,\n readonly runtime: ResolvedRuntimeOptions,\n ) {}\n\n close(): void {\n if (this.#snapshot) {\n this.#client?.releaseHandle(this.#snapshot);\n this.#snapshot = undefined;\n }\n this.#client?.close();\n this.#client = undefined;\n this.#supportsOverlayChanges = undefined;\n this.#files.clear();\n this.clearHandleCaches();\n this.#typeTextById.clear();\n }\n\n getCompilerOptions(): unknown {\n return this.config().options;\n }\n\n getRootFileNames(): readonly string[] {\n return this.config().fileNames;\n }\n\n getTypeAtPosition(\n fileName: string,\n position: number,\n sourceText?: string,\n ): CorsaType | undefined {\n const state = this.fileState(fileName, sourceText);\n if (!state.typeByPosition.has(position)) {\n state.typeByPosition.set(\n position,\n this.client().getTypeAtPosition(this.#snapshot!, state.projectId, fileName, position) as\n | CorsaType\n | undefined,\n );\n }\n const type = this.rememberType(state.typeByPosition.get(position));\n if (type) {\n this.#typeLookupById.set(type.id, { fileName, position, sourceText });\n }\n return type;\n }\n\n getTypeAtSourceRange(\n fileName: string,\n start: number,\n end: number,\n sourceText: string | undefined,\n kind: string | undefined,\n ): CorsaType | undefined {\n if (!sourceText || end <= start) {\n return this.getTypeAtPosition(fileName, start, sourceText);\n }\n const state = this.fileState(fileName, sourceText);\n const key = `${start}:${end}:${kind ?? \"\"}`;\n if (!state.typeBySourceRange.has(key)) {\n state.typeBySourceRange.set(\n key,\n this.client().getTypeAtSourceRange(\n this.#snapshot!,\n state.projectId,\n fileName,\n start,\n end,\n sourceText,\n kind,\n ) as CorsaType | undefined,\n );\n }\n const type = this.rememberType(state.typeBySourceRange.get(key));\n if (type) {\n this.#typeLookupById.set(type.id, { fileName, position: start, sourceText });\n }\n return type;\n }\n\n getSymbolAtPosition(\n fileName: string,\n position: number,\n sourceText?: string,\n ): CorsaSymbol | undefined {\n const state = this.fileState(fileName, sourceText);\n if (!state.symbolByPosition.has(position)) {\n state.symbolByPosition.set(\n position,\n this.client().getSymbolAtPosition(this.#snapshot!, state.projectId, fileName, position) as\n | CorsaSymbol\n | undefined,\n );\n }\n return this.rememberSymbol(state.symbolByPosition.get(position));\n }\n\n getSymbol(symbol: string | CorsaSymbol): CorsaSymbol | undefined {\n if (typeof symbol !== \"string\") {\n return this.rememberSymbol(symbol);\n }\n const synthetic = this.#syntheticSymbolsById.get(symbol);\n if (synthetic) {\n return synthetic;\n }\n const cached = this.#symbolsById.get(symbol);\n if (cached) {\n return cached;\n }\n const typeId = this.#symbolTypeById.get(symbol);\n if (!typeId || !this.#snapshot) {\n return undefined;\n }\n const resolved = this.client().callJson<CorsaSymbol | null>(\"getSymbolOfType\", {\n snapshot: this.#snapshot,\n type: typeId,\n });\n return resolved?.id === symbol ? this.rememberSymbol(resolved) : undefined;\n }\n\n getNode(node: string | CorsaNode): CorsaNode | undefined {\n if (typeof node !== \"string\") {\n return node;\n }\n return this.#nodesById.get(node) ?? this.rememberNode(node);\n }\n\n getSourceTextForPath(path: string): string | undefined {\n return this.sourceTextForPath(path);\n }\n\n getTypeOfSymbol(symbol: CorsaSymbol): CorsaType | undefined {\n const type = this.rememberType(this.tryGetSymbolType(symbol, \"getTypeOfSymbol\"));\n this.rememberTypeSource(type, symbol.valueDeclaration);\n return type;\n }\n\n getDeclaredTypeOfSymbol(symbol: CorsaSymbol): CorsaType | undefined {\n const type = this.rememberType(this.tryGetSymbolType(symbol, \"getDeclaredTypeOfSymbol\"));\n this.rememberTypeSource(type, symbol.valueDeclaration);\n return type;\n }\n\n typeToString(type: CorsaType, flags?: number): string {\n try {\n const text = this.client().typeToString(\n this.#snapshot!,\n this.projectId(),\n type.id,\n undefined,\n flags,\n );\n if (flags === undefined) {\n this.#typeTextById.set(type.id, text);\n }\n return text;\n } catch (error) {\n const cached = flags === undefined ? this.#typeTextById.get(type.id) : undefined;\n if (cached !== undefined) {\n return cached;\n }\n throw error;\n }\n }\n\n // Seeds the type-text cache from a name the caller already knows (for\n // example the identifier in an `implements` clause). Implemented-interface\n // handles come back with empty `texts`, and upstream Corsa sometimes evicts\n // them from its snapshot registry before `typeToString` runs, so warming the\n // cache here lets `typeToString` fall back to the source name instead of\n // throwing (GH#211). Never overwrites a value the server already provided.\n rememberTypeText(typeId: string, text: string): void {\n if (!this.#typeTextById.has(typeId)) {\n this.#typeTextById.set(typeId, text);\n }\n }\n\n getBaseTypeOfLiteralType(type: CorsaType): CorsaType | undefined {\n return this.rememberType(\n this.client().callJson(\"getBaseTypeOfLiteralType\", {\n snapshot: this.#snapshot,\n project: this.projectId(),\n type: type.id,\n }),\n );\n }\n\n getPropertiesOfType(type: CorsaType): readonly CorsaSymbol[] {\n return this.rememberSymbols(\n this.client().callJson(\"getPropertiesOfType\", {\n snapshot: this.#snapshot,\n project: this.projectId(),\n type: type.id,\n }) ?? [],\n );\n }\n\n getSignaturesOfType(type: CorsaType, kind: number): readonly CorsaSignature[] {\n return this.rememberSignatures(\n this.client().callJson(\"getSignaturesOfType\", {\n snapshot: this.#snapshot,\n project: this.projectId(),\n type: type.id,\n kind,\n }) ?? [],\n );\n }\n\n getReturnTypeOfSignature(signature: CorsaSignature): CorsaType | undefined {\n return this.rememberType(\n this.client().callJson(\"getReturnTypeOfSignature\", {\n snapshot: this.#snapshot,\n project: this.projectId(),\n signature: signature.id,\n }),\n );\n }\n\n getTypePredicateOfSignature(signature: CorsaSignature): CorsaTypePredicate | undefined {\n const predicate = this.client().callJson<CorsaTypePredicate | undefined>(\n \"getTypePredicateOfSignature\",\n {\n snapshot: this.#snapshot,\n project: this.projectId(),\n signature: signature.id,\n },\n );\n if (predicate?.type) {\n this.rememberType(predicate.type);\n }\n return predicate;\n }\n\n getBaseTypes(type: CorsaType): readonly CorsaType[] {\n if (isArrayOrTupleLikeType(this, type)) {\n return [];\n }\n try {\n return this.rememberTypes(\n this.client().callJson(\"getBaseTypes\", {\n snapshot: this.#snapshot,\n project: this.projectId(),\n type: type.id,\n texts: this.typeTexts(type),\n }) ?? [],\n );\n } catch (error) {\n // Upstream Corsa occasionally drops a type handle from its snapshot\n // registry after the first base-types query on a class that has no\n // explicit `extends` clause. Treating that as \"no base types\" lets a\n // follow-up `getImplementedTypesOfType` on the same handle still report\n // the type's own `implements` clause instead of throwing (GH#206).\n if (isProtocolPanicError(error) || isStaleHandleError(error)) {\n return [];\n }\n throw error;\n }\n }\n\n getTypeArguments(type: CorsaType): readonly CorsaType[] {\n const argumentsFromApi = this.rememberTypes(\n this.client().getTypeArguments(\n this.#snapshot!,\n this.projectId(),\n type.id,\n type.objectFlags,\n ) as unknown as readonly CorsaType[],\n );\n return argumentsFromApi.length > 0 ? argumentsFromApi : this.fallbackTypeArguments(type);\n }\n\n getTypesOfType(type: CorsaType): readonly CorsaType[] {\n if (\n (type.flags & (typeFlags.union | typeFlags.intersection | typeFlags.templateLiteral)) ===\n 0\n ) {\n return [];\n }\n return this.callTypeArray(\"getTypesOfType\", type);\n }\n\n getTargetOfType(type: CorsaType): CorsaType | undefined {\n if (\n (type.flags & (typeFlags.index | typeFlags.stringMapping)) === 0 &&\n ((type.objectFlags ?? 0) & (objectFlags.reference | objectFlags.mapped)) === 0\n ) {\n return undefined;\n }\n const target = this.callType(\"getTargetOfType\", type);\n this.cacheTypeText(target);\n return target;\n }\n\n getTypeParametersOfType(type: CorsaType): readonly CorsaType[] {\n const flags = type.objectFlags ?? 0;\n if ((type.flags & typeFlags.object) === 0 || (flags & objectFlags.classOrInterface) === 0) {\n return [];\n }\n return this.callTypeArray(\"getTypeParametersOfType\", type);\n }\n\n getOuterTypeParametersOfType(type: CorsaType): readonly CorsaType[] {\n const flags = type.objectFlags ?? 0;\n if ((type.flags & typeFlags.object) === 0 || (flags & objectFlags.classOrInterface) === 0) {\n return [];\n }\n return this.callTypeArray(\"getOuterTypeParametersOfType\", type);\n }\n\n getLocalTypeParametersOfType(type: CorsaType): readonly CorsaType[] {\n const flags = type.objectFlags ?? 0;\n if ((type.flags & typeFlags.object) === 0 || (flags & objectFlags.classOrInterface) === 0) {\n return [];\n }\n return this.callTypeArray(\"getLocalTypeParametersOfType\", type);\n }\n\n getObjectTypeOfType(type: CorsaType): CorsaType | undefined {\n return (type.flags & typeFlags.indexedAccess) !== 0\n ? this.callType(\"getObjectTypeOfType\", type)\n : undefined;\n }\n\n getIndexTypeOfType(type: CorsaType): CorsaType | undefined {\n return (type.flags & typeFlags.indexedAccess) !== 0\n ? this.callType(\"getIndexTypeOfType\", type)\n : undefined;\n }\n\n getCheckTypeOfType(type: CorsaType): CorsaType | undefined {\n return (type.flags & typeFlags.conditional) !== 0\n ? this.callType(\"getCheckTypeOfType\", type)\n : undefined;\n }\n\n getExtendsTypeOfType(type: CorsaType): CorsaType | undefined {\n return (type.flags & typeFlags.conditional) !== 0\n ? this.callType(\"getExtendsTypeOfType\", type)\n : undefined;\n }\n\n getBaseTypeOfType(type: CorsaType): CorsaType | undefined {\n return (type.flags & typeFlags.substitution) !== 0\n ? this.callType(\"getBaseTypeOfType\", type)\n : undefined;\n }\n\n getConstraintOfType(type: CorsaType): CorsaType | undefined {\n return this.rememberType(\n this.client().getConstraintOfType(this.#snapshot!, this.projectId(), type.id) as\n | CorsaType\n | undefined,\n );\n }\n\n private callType(method: string, type: CorsaType): CorsaType | undefined {\n return this.rememberType(\n this.client().callJson<CorsaType | null>(method, {\n snapshot: this.#snapshot,\n type: type.id,\n }) ?? undefined,\n );\n }\n\n private callTypeArray(method: string, type: CorsaType): readonly CorsaType[] {\n return this.rememberTypes(\n this.client().callJson<readonly CorsaType[] | null>(method, {\n snapshot: this.#snapshot,\n type: type.id,\n }) ?? [],\n );\n }\n\n private tryGetSymbolType(\n symbol: CorsaSymbol,\n method: \"getTypeOfSymbol\" | \"getDeclaredTypeOfSymbol\",\n ): CorsaType | undefined {\n try {\n return this.client()[method](this.#snapshot!, this.projectId(), symbol.id) as\n | CorsaType\n | undefined;\n } catch {\n return undefined;\n }\n }\n\n private fallbackTypeArguments(type: CorsaType): readonly CorsaType[] {\n const source = this.sourceSliceForType(type);\n if (!source) {\n return [];\n }\n return typeArgumentInfosForSource(source)\n .map((argument) => {\n const symbol = this.getSymbolAtPosition(\n source.node.fileName,\n argument.pos,\n this.sourceTextForPath(source.node.fileName),\n );\n return symbol\n ? (this.getDeclaredTypeOfSymbol(symbol) ?? this.getTypeOfSymbol(symbol))\n : undefined;\n })\n .filter((argument): argument is CorsaType => argument !== undefined);\n }\n\n private sourceSliceForType(type: CorsaType): SourceSlice | undefined {\n const cached = this.#typeSourceById.get(type.id);\n if (cached) {\n return cached;\n }\n const lookup = this.#typeLookupById.get(type.id);\n if (lookup) {\n const symbol = this.getSymbolAtPosition(lookup.fileName, lookup.position, lookup.sourceText);\n this.rememberTypeSource(type, symbol?.valueDeclaration);\n const fromLookup = this.#typeSourceById.get(type.id);\n if (fromLookup) {\n return fromLookup;\n }\n }\n if (type.symbol) {\n const symbol = this.getSymbol(type.symbol);\n this.rememberTypeSource(type, symbol?.valueDeclaration);\n }\n return this.#typeSourceById.get(type.id);\n }\n\n private rememberType<T extends CorsaType | undefined>(type: T): T {\n if (type?.symbol) {\n this.#symbolTypeById.set(type.symbol, type.id);\n }\n if (type?.texts?.[0]) {\n this.#typeTextById.set(type.id, type.texts[0]);\n }\n return type;\n }\n\n private rememberTypes<T extends readonly CorsaType[]>(types: T): T {\n for (const type of types) {\n this.rememberType(type);\n }\n return types;\n }\n\n private rememberTypeSource(type: CorsaType | undefined, handle: string | undefined): void {\n if (!type || !handle || this.#typeSourceById.has(type.id)) {\n return;\n }\n const source = this.sourceSliceForHandle(handle);\n if (source) {\n this.#typeSourceById.set(type.id, source);\n }\n }\n\n private cacheTypeText(type: CorsaType | undefined): void {\n if (!type || this.#typeTextById.has(type.id)) {\n return;\n }\n try {\n this.#typeTextById.set(\n type.id,\n this.client().typeToString(this.#snapshot!, this.projectId(), type.id),\n );\n } catch {\n // Some upstream handles are only renderable before a later relation query.\n }\n }\n\n private typeTexts(type: CorsaType): readonly string[] {\n if (Array.isArray(type.texts) && type.texts.length > 0) {\n return type.texts;\n }\n const cached = this.#typeTextById.get(type.id);\n return cached === undefined ? [] : [cached];\n }\n\n private rememberSymbol<T extends CorsaSymbol | undefined>(symbol: T): T {\n if (!symbol) {\n return symbol;\n }\n const synthetic = this.#syntheticSymbolsById.get(symbol.id);\n if (synthetic) {\n return synthetic as T;\n }\n this.#symbolsById.set(symbol.id, symbol);\n for (const declaration of symbol.declarations ?? []) {\n this.rememberNode(declaration);\n }\n if (symbol.valueDeclaration) {\n this.rememberNode(symbol.valueDeclaration);\n }\n return symbol;\n }\n\n private rememberSymbols<T extends readonly CorsaSymbol[]>(symbols: T): T {\n for (const symbol of symbols) {\n this.rememberSymbol(symbol);\n }\n return symbols;\n }\n\n private rememberSignatures<T extends readonly CorsaSignature[]>(signatures: T): T {\n for (const signature of signatures) {\n this.rememberSignature(signature);\n }\n return signatures;\n }\n\n private rememberSignature(signature: CorsaSignature): CorsaSignature {\n if (signature.declaration) {\n this.rememberNode(signature.declaration);\n }\n const parameterIds = Array.isArray(signature.parameters) ? signature.parameters : [];\n const parameters = signature.declaration\n ? this.parameterInfosForDeclaration(signature.declaration, parameterIds.length)\n : [];\n parameterIds.forEach((id, index) => {\n this.rememberSyntheticSymbol(id, parameters[index]);\n });\n if (signature.thisParameter) {\n this.rememberSyntheticSymbol(signature.thisParameter, undefined, \"this\");\n }\n return signature;\n }\n\n private rememberSyntheticSymbol(\n id: string,\n parameter?: ParameterInfo,\n fallbackName = \"\",\n ): CorsaSymbol {\n const cached = this.#syntheticSymbolsById.get(id);\n if (cached && (cached.name || !parameter?.name)) {\n return cached;\n }\n const declaration = parameter?.node.id;\n const symbol: CorsaSymbol = {\n id,\n name: parameter?.name ?? fallbackName,\n flags: cached?.flags ?? 0,\n checkFlags: cached?.checkFlags ?? 0,\n declarations: declaration ? [declaration] : (cached?.declarations ?? []),\n valueDeclaration: declaration ?? cached?.valueDeclaration,\n };\n this.#syntheticSymbolsById.set(id, symbol);\n this.#symbolsById.set(id, symbol);\n if (declaration) {\n this.#nodesById.set(declaration, parameter.node);\n }\n return symbol;\n }\n\n private rememberNode(handle: string): CorsaNode | undefined {\n const parsed = parseNodeHandle(handle);\n if (!parsed) {\n return undefined;\n }\n this.#nodesById.set(handle, parsed);\n return parsed;\n }\n\n private clearHandleCaches(): void {\n this.#symbolsById.clear();\n this.#syntheticSymbolsById.clear();\n this.#symbolTypeById.clear();\n this.#nodesById.clear();\n this.#typeLookupById.clear();\n this.#typeSourceById.clear();\n }\n\n private parameterInfosForDeclaration(\n handle: string,\n expectedCount: number,\n ): readonly ParameterInfo[] {\n const source = this.sourceSliceForHandle(handle);\n if (!source) {\n return this.parameterInfosForUtf8ByteDeclaration(handle);\n }\n const parameters = parameterInfosForSource(source);\n if (parameters.length >= expectedCount || expectedCount === 0) {\n return parameters;\n }\n const utf8Parameters = this.parameterInfosForUtf8ByteDeclaration(handle);\n return utf8Parameters.length > parameters.length ? utf8Parameters : parameters;\n }\n\n private parameterInfosForUtf8ByteDeclaration(handle: string): readonly ParameterInfo[] {\n const source = this.sourceSliceForHandle(handle, \"utf8-byte\");\n return source ? parameterInfosForSource(source) : [];\n }\n\n private sourceSliceForHandle(\n handle: string,\n offsetUnit: \"utf16\" | \"utf8-byte\" = \"utf16\",\n ): SourceSlice | undefined {\n const node = this.getNode(handle);\n if (!node) {\n return undefined;\n }\n const sourceText = this.sourceTextForPath(node.fileName);\n const normalizedNode =\n offsetUnit === \"utf8-byte\" ? nodeFromUtf8ByteOffsets(node, sourceText) : node;\n if (\n !sourceText ||\n !normalizedNode ||\n normalizedNode.pos < 0 ||\n normalizedNode.end > sourceText.length ||\n normalizedNode.pos >= normalizedNode.end\n ) {\n return undefined;\n }\n return {\n node: normalizedNode,\n text: sourceText.slice(normalizedNode.pos, normalizedNode.end),\n };\n }\n\n private sourceTextForPath(path: string): string | undefined {\n for (const [fileName, cached] of this.#files) {\n if (fileName === path || fileName.endsWith(path)) {\n return cached.lintSourceText ?? cached.sourceText ?? readFileOrUndefined(fileName);\n }\n }\n return readFileOrUndefined(path) ?? readFileOrUndefined(`${this.runtime.cwd}/${path}`);\n }\n\n private client(): CorsaApiClient {\n if (!this.#client) {\n this.#client = CorsaApiClient.spawn({\n executable: this.runtime.executable,\n cwd: this.runtime.cwd,\n mode: this.runtime.mode,\n });\n this.#client.initialize();\n }\n return this.#client;\n }\n\n private config(): { options: unknown; fileNames: string[] } {\n if (!this.#config) {\n this.#config = this.client().parseConfigFile(this.project.configPath);\n }\n const config = this.#config;\n if (!config) {\n throw new Error(`corsa oxlint could not parse a Corsa config for ${this.project.configPath}`);\n }\n return config;\n }\n\n private fileState(fileName: string, sourceText?: string): FileCache {\n const prepared = this.refreshIfNeeded(fileName, sourceText);\n const current = this.#files.get(fileName);\n if (current) {\n return current;\n }\n const project = this.client().callJson<ProjectResponse | null>(\"getDefaultProjectForFile\", {\n snapshot: this.#snapshot,\n file: fileName,\n });\n const state: FileCache = {\n mtimeMs: prepared.mtimeMs,\n lintSourceText: prepared.lintSourceText,\n sourceText: prepared.sourceText,\n projectId: project?.id ?? this.projectId(),\n typeByPosition: new Map(),\n typeBySourceRange: new Map(),\n symbolByPosition: new Map(),\n };\n this.#files.set(fileName, state);\n return state;\n }\n\n private refreshIfNeeded(fileName: string, sourceText?: string): PreparedFileState {\n const now = Date.now();\n const expired = now - this.#lastRefreshMs > this.runtime.cacheLifetimeMs;\n const cached = this.#files.get(fileName);\n const mtimeMs = statMtimeMs(fileName);\n const overlayText = this.supportedOverlayText(fileName, sourceText, mtimeMs, cached);\n const mtimeChanged = cached !== undefined && mtimeMs !== cached.mtimeMs;\n const textChanged = overlayText !== cached?.sourceText;\n const prepared = {\n mtimeMs,\n lintSourceText: sourceText,\n sourceText: overlayText,\n };\n const stale = !this.#snapshot || mtimeChanged || textChanged || expired;\n if (!stale) {\n return prepared;\n }\n const previous = this.#snapshot;\n const overlayChanges = this.overlayChanges(fileName, overlayText, cached);\n const response = this.client().updateSnapshot({\n ...(previous\n ? { fileChanges: { changed: [fileName] } }\n : { openProject: this.project.configPath }),\n ...(overlayChanges === undefined ? {} : { overlayChanges }),\n });\n this.#snapshot = response.snapshot;\n this.#projects = response.projects;\n this.#lastRefreshMs = now;\n this.#files.clear();\n this.clearHandleCaches();\n if (previous && previous !== this.#snapshot) {\n this.client().releaseHandle(previous);\n }\n return prepared;\n }\n\n private projectId(): string {\n const id = this.#projects[0]?.id;\n if (!id) {\n throw new Error(\n `corsa oxlint could not resolve a Corsa project for ${this.project.filename}`,\n );\n }\n return id;\n }\n\n private supportedOverlayText(\n fileName: string,\n sourceText: string | undefined,\n mtimeMs: number,\n cached?: FileCache,\n ): string | undefined {\n if (sourceText === undefined || !this.supportsOverlayChanges()) {\n return undefined;\n }\n if (cached?.lintSourceText === sourceText && cached.mtimeMs === mtimeMs) {\n return cached.sourceText;\n }\n return overlayTextFor(fileName, sourceText);\n }\n\n private overlayChanges(\n fileName: string,\n overlayText: string | undefined,\n cached?: FileCache,\n ):\n | {\n upsert?: { document: string; text: string; languageId: string }[];\n delete?: string[];\n }\n | undefined {\n if (!this.supportsOverlayChanges()) {\n return undefined;\n }\n if (overlayText !== undefined) {\n return {\n upsert: [\n {\n document: fileName,\n text: overlayText,\n languageId: languageIdFor(fileName),\n },\n ],\n };\n }\n if (cached?.sourceText !== undefined) {\n return { delete: [fileName] };\n }\n return undefined;\n }\n\n private supportsOverlayChanges(): boolean {\n if (this.#supportsOverlayChanges !== undefined) {\n return this.#supportsOverlayChanges;\n }\n try {\n const capabilities = this.client().callJson<{\n overlay?: { updateSnapshotOverlayChanges?: boolean };\n }>(\"describeCapabilities\");\n this.#supportsOverlayChanges = capabilities?.overlay?.updateSnapshotOverlayChanges === true;\n } catch {\n this.#supportsOverlayChanges = false;\n }\n return this.#supportsOverlayChanges;\n }\n}\n\nfunction parameterInfosForSource(source: SourceSlice): readonly ParameterInfo[] {\n const open = findConstructorParameterOpen(source.text);\n if (open < 0) {\n return [];\n }\n const close = matchingCloseParen(source.text, open);\n if (close < 0) {\n return [];\n }\n const parametersText = source.text.slice(open + 1, close);\n return splitTopLevelRanges(parametersText, \",\")\n .map((range) => parameterInfoForText(source.node, parametersText, range, open + 1))\n .filter((parameter): parameter is ParameterInfo => parameter !== undefined);\n}\n\nfunction isArrayOrTupleLikeType(session: CorsaProjectSession, type: CorsaType): boolean {\n const texts =\n Array.isArray(type.texts) && type.texts.length > 0 ? type.texts : [session.typeToString(type)];\n return texts.some((text) => {\n const normalized = text.trimStart();\n return (\n normalized.startsWith(\"readonly [\") || normalized.startsWith(\"[\") || normalized.endsWith(\"[]\")\n );\n });\n}\n\nfunction findConstructorParameterOpen(text: string): number {\n const constructorPattern = /\\bconstructor\\s*\\(/g;\n let match: RegExpExecArray | null;\n let open = -1;\n while ((match = constructorPattern.exec(text)) !== null) {\n open = match.index + match[0].lastIndexOf(\"(\");\n }\n if (open >= 0) {\n return open;\n }\n return text.indexOf(\"(\");\n}\n\nfunction overlayTextFor(fileName: string, sourceText?: string): string | undefined {\n if (sourceText === undefined) {\n return undefined;\n }\n try {\n return readFileSync(fileName, \"utf8\") === sourceText ? undefined : sourceText;\n } catch {\n return sourceText;\n }\n}\n\nfunction isProtocolPanicError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return message.includes(\"protocol error: panic:\") || message.includes(\"panic: runtime error\");\n}\n\nfunction isStaleHandleError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return /handle \"[^\"]*\" not found in snapshot registry/.test(message);\n}\n\nfunction statMtimeMs(fileName: string): number {\n try {\n return statSync(fileName).mtimeMs;\n } catch {\n return 0;\n }\n}\n\nfunction languageIdFor(fileName: string): string {\n if (fileName.endsWith(\".tsx\")) {\n return \"typescriptreact\";\n }\n if (fileName.endsWith(\".jsx\")) {\n return \"javascriptreact\";\n }\n if (fileName.endsWith(\".js\")) {\n return \"javascript\";\n }\n return \"typescript\";\n}\n\nfunction parseNodeHandle(value: string): CorsaNode | undefined {\n const [posText, endText, _kindText, ...pathParts] = value.split(\".\");\n const pos = Number(posText);\n const end = Number(endText);\n const fileName = pathParts.join(\".\");\n if (!Number.isFinite(pos) || !Number.isFinite(end) || !fileName) {\n return undefined;\n }\n return { id: value, fileName, pos, end, range: [pos, end] };\n}\n\nfunction nodeFromUtf8ByteOffsets(\n node: CorsaNode,\n sourceText: string | undefined,\n): CorsaNode | undefined {\n if (sourceText === undefined) {\n return undefined;\n }\n const pos = utf16IndexFromUtf8ByteOffset(sourceText, node.pos);\n const end = utf16IndexFromUtf8ByteOffset(sourceText, node.end);\n if (pos === undefined || end === undefined || end < pos) {\n return undefined;\n }\n return {\n ...node,\n pos,\n end,\n range: [pos, end],\n };\n}\n\nfunction utf16IndexFromUtf8ByteOffset(text: string, byteOffset: number): number | undefined {\n if (!Number.isInteger(byteOffset) || byteOffset < 0) {\n return undefined;\n }\n let bytes = 0;\n for (let index = 0; index < text.length; ) {\n if (bytes === byteOffset) {\n return index;\n }\n const codePoint = text.codePointAt(index);\n if (codePoint === undefined) {\n break;\n }\n const nextBytes = bytes + utf8ByteLengthOfCodePoint(codePoint);\n if (nextBytes > byteOffset) {\n return undefined;\n }\n bytes = nextBytes;\n index += codePoint > 0xffff ? 2 : 1;\n }\n return bytes === byteOffset ? text.length : undefined;\n}\n\nfunction utf8ByteLengthOfCodePoint(codePoint: number): number {\n if (codePoint <= 0x7f) {\n return 1;\n }\n if (codePoint <= 0x7ff) {\n return 2;\n }\n if (codePoint <= 0xffff) {\n return 3;\n }\n return 4;\n}\n\nfunction parameterInfoForText(\n declarationNode: CorsaNode,\n parametersText: string,\n range: { readonly start: number; readonly end: number },\n parametersStart: number,\n): ParameterInfo | undefined {\n const raw = parametersText.slice(range.start, range.end);\n const leading = raw.search(/\\S/);\n if (leading < 0) {\n return undefined;\n }\n const trailing = raw.match(/\\s*$/)?.[0].length ?? 0;\n const text = raw.slice(leading, raw.length - trailing);\n const name = parameterNameForText(text);\n if (!name) {\n return undefined;\n }\n const pos = declarationNode.pos + parametersStart + range.start + leading;\n const end = declarationNode.pos + parametersStart + range.end - trailing;\n const id = `${pos}.${end}.0.${declarationNode.fileName}`;\n return {\n name,\n node: {\n id,\n fileName: declarationNode.fileName,\n pos,\n end,\n range: [pos, end],\n },\n };\n}\n\nfunction parameterNameForText(text: string): string | undefined {\n let candidate = text.trim().replace(/^\\.\\.\\.\\s*/, \"\");\n let changed = true;\n while (changed) {\n const previous = candidate;\n candidate = candidate.replace(\n /^(?:public|private|protected|readonly|override|static|abstract|declare)\\s+/,\n \"\",\n );\n changed = candidate !== previous;\n }\n const separator = firstTopLevelIndexOfAny(candidate, [\":\", \"=\"]);\n let left = (separator >= 0 ? candidate.slice(0, separator) : candidate).trim();\n if (left.endsWith(\"?\")) {\n left = left.slice(0, -1).trim();\n }\n if (left.startsWith(\"{\") || left.startsWith(\"[\")) {\n return left;\n }\n return left.split(/\\s+/).at(-1);\n}\n\nfunction typeArgumentInfosForSource(source: SourceSlice): readonly TypeArgumentInfo[] {\n const annotationMarker = firstTopLevelIndexOfAny(source.text, [\":\", \"=\"]);\n const typeStart = annotationMarker >= 0 ? annotationMarker + 1 : 0;\n const openInType = firstTopLevelOpeningAngle(source.text.slice(typeStart));\n if (openInType < 0) {\n return [];\n }\n const open = typeStart + openInType;\n const close = matchingCloseAngle(source.text, open);\n if (close < 0) {\n return [];\n }\n const argumentsText = source.text.slice(open + 1, close);\n return splitTopLevelRanges(argumentsText, \",\")\n .map((range) => {\n const raw = argumentsText.slice(range.start, range.end);\n const leading = raw.search(/\\S/);\n if (leading < 0) {\n return undefined;\n }\n return {\n pos: source.node.pos + open + 1 + range.start + leading,\n };\n })\n .filter((argument): argument is TypeArgumentInfo => argument !== undefined);\n}\n\nfunction matchingCloseParen(text: string, open: number): number {\n let depth = 0;\n const scanner = createScanner();\n for (let index = open; index < text.length; index += 1) {\n const char = text[index];\n if (scanner.inQuote(char)) {\n continue;\n }\n if (char === \"(\") {\n depth += 1;\n } else if (char === \")\") {\n depth -= 1;\n if (depth === 0) {\n return index;\n }\n }\n }\n return -1;\n}\n\nfunction matchingCloseAngle(text: string, open: number): number {\n let depth = 0;\n const scanner = createScanner();\n for (let index = open; index < text.length; index += 1) {\n const char = text[index];\n if (scanner.inQuote(char)) {\n continue;\n }\n if (char === \"<\") {\n depth += 1;\n } else if (char === \">\") {\n depth -= 1;\n if (depth === 0) {\n return index;\n }\n }\n }\n return -1;\n}\n\nfunction splitTopLevelRanges(\n text: string,\n delimiter: string,\n): readonly { readonly start: number; readonly end: number }[] {\n const ranges: { start: number; end: number }[] = [];\n const scanner = createScanner();\n let start = 0;\n let angleDepth = 0;\n let parenDepth = 0;\n let bracketDepth = 0;\n let braceDepth = 0;\n for (let index = 0; index < text.length; index += 1) {\n const char = text[index];\n if (scanner.inQuote(char)) {\n continue;\n }\n if (char === \"<\") angleDepth += 1;\n else if (char === \">\") angleDepth = Math.max(0, angleDepth - 1);\n else if (char === \"(\") parenDepth += 1;\n else if (char === \")\") parenDepth = Math.max(0, parenDepth - 1);\n else if (char === \"[\") bracketDepth += 1;\n else if (char === \"]\") bracketDepth = Math.max(0, bracketDepth - 1);\n else if (char === \"{\") braceDepth += 1;\n else if (char === \"}\") braceDepth = Math.max(0, braceDepth - 1);\n else if (\n char === delimiter &&\n angleDepth === 0 &&\n parenDepth === 0 &&\n bracketDepth === 0 &&\n braceDepth === 0\n ) {\n ranges.push({ start, end: index });\n start = index + 1;\n }\n }\n ranges.push({ start, end: text.length });\n return ranges;\n}\n\nfunction firstTopLevelIndexOfAny(text: string, needles: readonly string[]): number {\n const scanner = createScanner();\n let angleDepth = 0;\n let parenDepth = 0;\n let bracketDepth = 0;\n let braceDepth = 0;\n for (let index = 0; index < text.length; index += 1) {\n const char = text[index];\n if (scanner.inQuote(char)) {\n continue;\n }\n if (char === \"<\") angleDepth += 1;\n else if (char === \">\") angleDepth = Math.max(0, angleDepth - 1);\n else if (char === \"(\") parenDepth += 1;\n else if (char === \")\") parenDepth = Math.max(0, parenDepth - 1);\n else if (char === \"[\") bracketDepth += 1;\n else if (char === \"]\") bracketDepth = Math.max(0, bracketDepth - 1);\n else if (char === \"{\") braceDepth += 1;\n else if (char === \"}\") braceDepth = Math.max(0, braceDepth - 1);\n else if (\n needles.includes(char) &&\n angleDepth === 0 &&\n parenDepth === 0 &&\n bracketDepth === 0 &&\n braceDepth === 0\n ) {\n return index;\n }\n }\n return -1;\n}\n\nfunction firstTopLevelOpeningAngle(text: string): number {\n const scanner = createScanner();\n let parenDepth = 0;\n let bracketDepth = 0;\n let braceDepth = 0;\n for (let index = 0; index < text.length; index += 1) {\n const char = text[index];\n if (scanner.inQuote(char)) {\n continue;\n }\n if (char === \"(\") parenDepth += 1;\n else if (char === \")\") parenDepth = Math.max(0, parenDepth - 1);\n else if (char === \"[\") bracketDepth += 1;\n else if (char === \"]\") bracketDepth = Math.max(0, bracketDepth - 1);\n else if (char === \"{\") braceDepth += 1;\n else if (char === \"}\") braceDepth = Math.max(0, braceDepth - 1);\n else if (char === \"<\" && parenDepth === 0 && bracketDepth === 0 && braceDepth === 0) {\n return index;\n }\n }\n return -1;\n}\n\nfunction createScanner(): {\n inQuote(char: string): boolean;\n} {\n let quote: string | undefined;\n let escaped = false;\n return {\n inQuote(char) {\n if (quote) {\n if (escaped) {\n escaped = false;\n } else if (char === \"\\\\\") {\n escaped = true;\n } else if (char === quote) {\n quote = undefined;\n }\n return true;\n }\n if (char === '\"' || char === \"'\" || char === \"`\") {\n quote = char;\n return true;\n }\n return false;\n },\n };\n}\n\nfunction readFileOrUndefined(path: string): string | undefined {\n try {\n return readFileSync(path, \"utf8\");\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"session.js","names":["#snapshot","#client","#supportsOverlayChanges","#files","#typeTextById","#typeLookupById","#syntheticSymbolsById","#symbolsById","#symbolTypeById","#nodesById","#typeSourceById","#config","#lastRefreshMs","#projects"],"sources":["../ts/session.ts"],"sourcesContent":["import { readFileSync, statSync } from \"node:fs\";\n\nimport { type ProjectResponse, CorsaApiClient } from \"@corsa-bind/napi\";\n\nimport type {\n CorsaNode,\n CorsaSignature,\n CorsaSymbol,\n CorsaType,\n CorsaTypePredicate,\n} from \"./types\";\nimport type { ResolvedProjectConfig, ResolvedRuntimeOptions } from \"./types\";\n\ntype FileCache = {\n mtimeMs: number;\n lintSourceText?: string;\n sourceText?: string;\n projectId: string;\n typeByPosition: Map<number, CorsaType | undefined>;\n typeBySourceRange: Map<string, CorsaType | undefined>;\n symbolByPosition: Map<number, CorsaSymbol | undefined>;\n};\n\ntype PreparedFileState = {\n mtimeMs: number;\n lintSourceText?: string;\n sourceText?: string;\n};\n\ntype SourceSlice = {\n node: CorsaNode;\n text: string;\n};\n\ntype TypeLookup = {\n fileName: string;\n position: number;\n sourceText?: string;\n};\n\ntype ParameterInfo = {\n name: string;\n node: CorsaNode;\n};\n\nconst typeFlags = {\n object: 1 << 20,\n index: 1 << 21,\n templateLiteral: 1 << 22,\n stringMapping: 1 << 23,\n substitution: 1 << 24,\n indexedAccess: 1 << 25,\n conditional: 1 << 26,\n union: 1 << 27,\n intersection: 1 << 28,\n} as const;\n\nconst objectFlags = {\n classOrInterface: (1 << 0) | (1 << 1),\n reference: 1 << 2,\n mapped: 1 << 5,\n} as const;\n\nexport class CorsaProjectSession {\n #client?: CorsaApiClient;\n #config?: { options: unknown; fileNames: string[] };\n #snapshot?: string;\n #projects: ProjectResponse[] = [];\n #files = new Map<string, FileCache>();\n #symbolsById = new Map<string, CorsaSymbol>();\n #syntheticSymbolsById = new Map<string, CorsaSymbol>();\n #symbolTypeById = new Map<string, string>();\n #nodesById = new Map<string, CorsaNode>();\n #typeLookupById = new Map<string, TypeLookup>();\n #typeSourceById = new Map<string, SourceSlice>();\n #typeTextById = new Map<string, string>();\n #lastRefreshMs = 0;\n #supportsOverlayChanges?: boolean;\n\n constructor(\n readonly project: ResolvedProjectConfig,\n readonly runtime: ResolvedRuntimeOptions,\n ) {}\n\n close(): void {\n if (this.#snapshot) {\n this.#client?.releaseHandle(this.#snapshot);\n this.#snapshot = undefined;\n }\n this.#client?.close();\n this.#client = undefined;\n this.#supportsOverlayChanges = undefined;\n this.#files.clear();\n this.clearHandleCaches();\n this.#typeTextById.clear();\n }\n\n getCompilerOptions(): unknown {\n return this.config().options;\n }\n\n getRootFileNames(): readonly string[] {\n return this.config().fileNames;\n }\n\n getTypeAtPosition(\n fileName: string,\n position: number,\n sourceText?: string,\n ): CorsaType | undefined {\n const state = this.fileState(fileName, sourceText);\n if (!state.typeByPosition.has(position)) {\n state.typeByPosition.set(\n position,\n this.client().getTypeAtPosition(this.#snapshot!, state.projectId, fileName, position) as\n | CorsaType\n | undefined,\n );\n }\n const type = this.rememberType(state.typeByPosition.get(position));\n if (type) {\n this.#typeLookupById.set(type.id, { fileName, position, sourceText });\n }\n return type;\n }\n\n getTypeAtSourceRange(\n fileName: string,\n start: number,\n end: number,\n sourceText: string | undefined,\n kind: string | undefined,\n ): CorsaType | undefined {\n if (!sourceText || end <= start) {\n return this.getTypeAtPosition(fileName, start, sourceText);\n }\n const state = this.fileState(fileName, sourceText);\n const key = `${start}:${end}:${kind ?? \"\"}`;\n if (!state.typeBySourceRange.has(key)) {\n state.typeBySourceRange.set(\n key,\n this.client().getTypeAtSourceRange(\n this.#snapshot!,\n state.projectId,\n fileName,\n start,\n end,\n sourceText,\n kind,\n ) as CorsaType | undefined,\n );\n }\n const type = this.rememberType(state.typeBySourceRange.get(key));\n if (type) {\n this.#typeLookupById.set(type.id, { fileName, position: start, sourceText });\n }\n return type;\n }\n\n getSymbolAtPosition(\n fileName: string,\n position: number,\n sourceText?: string,\n ): CorsaSymbol | undefined {\n const state = this.fileState(fileName, sourceText);\n if (!state.symbolByPosition.has(position)) {\n state.symbolByPosition.set(\n position,\n this.client().getSymbolAtPosition(this.#snapshot!, state.projectId, fileName, position) as\n | CorsaSymbol\n | undefined,\n );\n }\n return this.rememberSymbol(state.symbolByPosition.get(position));\n }\n\n getSymbol(symbol: string | CorsaSymbol): CorsaSymbol | undefined {\n if (typeof symbol !== \"string\") {\n return this.rememberSymbol(symbol);\n }\n const synthetic = this.#syntheticSymbolsById.get(symbol);\n if (synthetic) {\n return synthetic;\n }\n const cached = this.#symbolsById.get(symbol);\n if (cached) {\n return cached;\n }\n const typeId = this.#symbolTypeById.get(symbol);\n if (!typeId || !this.#snapshot) {\n return undefined;\n }\n const resolved = this.client().callJson<CorsaSymbol | null>(\"getSymbolOfType\", {\n snapshot: this.#snapshot,\n type: typeId,\n });\n return resolved?.id === symbol ? this.rememberSymbol(resolved) : undefined;\n }\n\n getNode(node: string | CorsaNode): CorsaNode | undefined {\n if (typeof node !== \"string\") {\n return node;\n }\n return this.#nodesById.get(node) ?? this.rememberNode(node);\n }\n\n getSourceTextForPath(path: string): string | undefined {\n return this.sourceTextForPath(path);\n }\n\n getTypeOfSymbol(symbol: CorsaSymbol): CorsaType | undefined {\n const type = this.rememberType(this.tryGetSymbolType(symbol, \"getTypeOfSymbol\"));\n this.rememberTypeSource(type, symbol.valueDeclaration);\n return type;\n }\n\n getDeclaredTypeOfSymbol(symbol: CorsaSymbol): CorsaType | undefined {\n const type = this.rememberType(this.tryGetSymbolType(symbol, \"getDeclaredTypeOfSymbol\"));\n this.rememberTypeSource(type, symbol.valueDeclaration);\n return type;\n }\n\n typeToString(type: CorsaType, flags?: number): string {\n try {\n const text = this.client().typeToString(\n this.#snapshot!,\n this.projectId(),\n type.id,\n undefined,\n flags,\n );\n if (flags === undefined) {\n this.#typeTextById.set(type.id, text);\n }\n return text;\n } catch (error) {\n const cached = flags === undefined ? this.#typeTextById.get(type.id) : undefined;\n if (cached !== undefined) {\n return cached;\n }\n throw error;\n }\n }\n\n // Seeds the type-text cache from a name the caller already knows (for\n // example the identifier in an `implements` clause). Implemented-interface\n // handles come back with empty `texts`, and upstream Corsa sometimes evicts\n // them from its snapshot registry before `typeToString` runs, so warming the\n // cache here lets `typeToString` fall back to the source name instead of\n // throwing (GH#211). Never overwrites a value the server already provided.\n rememberTypeText(typeId: string, text: string): void {\n if (!this.#typeTextById.has(typeId)) {\n this.#typeTextById.set(typeId, text);\n }\n }\n\n getBaseTypeOfLiteralType(type: CorsaType): CorsaType | undefined {\n return this.rememberType(\n this.client().callJson(\"getBaseTypeOfLiteralType\", {\n snapshot: this.#snapshot,\n project: this.projectId(),\n type: type.id,\n }),\n );\n }\n\n getPropertiesOfType(type: CorsaType): readonly CorsaSymbol[] {\n return this.rememberSymbols(\n this.client().callJson(\"getPropertiesOfType\", {\n snapshot: this.#snapshot,\n project: this.projectId(),\n type: type.id,\n }) ?? [],\n );\n }\n\n getSignaturesOfType(type: CorsaType, kind: number): readonly CorsaSignature[] {\n return this.rememberSignatures(\n this.client().callJson(\"getSignaturesOfType\", {\n snapshot: this.#snapshot,\n project: this.projectId(),\n type: type.id,\n kind,\n }) ?? [],\n );\n }\n\n getReturnTypeOfSignature(signature: CorsaSignature): CorsaType | undefined {\n return this.rememberType(\n this.client().callJson(\"getReturnTypeOfSignature\", {\n snapshot: this.#snapshot,\n project: this.projectId(),\n signature: signature.id,\n }),\n );\n }\n\n getTypePredicateOfSignature(signature: CorsaSignature): CorsaTypePredicate | undefined {\n const predicate = this.client().callJson<CorsaTypePredicate | undefined>(\n \"getTypePredicateOfSignature\",\n {\n snapshot: this.#snapshot,\n project: this.projectId(),\n signature: signature.id,\n },\n );\n if (predicate?.type) {\n this.rememberType(predicate.type);\n }\n return predicate;\n }\n\n getBaseTypes(type: CorsaType): readonly CorsaType[] {\n if (isArrayOrTupleLikeType(this, type)) {\n return [];\n }\n try {\n return this.rememberTypes(\n this.client().callJson(\"getBaseTypes\", {\n snapshot: this.#snapshot,\n project: this.projectId(),\n type: type.id,\n texts: this.typeTexts(type),\n }) ?? [],\n );\n } catch (error) {\n // Upstream Corsa occasionally drops a type handle from its snapshot\n // registry after the first base-types query on a class that has no\n // explicit `extends` clause. Treating that as \"no base types\" lets a\n // follow-up `getImplementedTypesOfType` on the same handle still report\n // the type's own `implements` clause instead of throwing (GH#206).\n if (isProtocolPanicError(error) || isStaleHandleError(error)) {\n return [];\n }\n throw error;\n }\n }\n\n getTypeArguments(type: CorsaType): readonly CorsaType[] {\n const source = this.sourceSliceForType(type);\n return this.rememberTypes(\n source\n ? (this.client().getTypeArgumentsAtSourceRange(\n this.#snapshot!,\n this.projectId(),\n type.id,\n type.objectFlags,\n source.node.fileName,\n source.node.pos,\n source.node.end,\n this.sourceTextForPath(source.node.fileName) ?? \"\",\n ) as unknown as readonly CorsaType[])\n : (this.client().getTypeArguments(\n this.#snapshot!,\n this.projectId(),\n type.id,\n type.objectFlags,\n ) as unknown as readonly CorsaType[]),\n );\n }\n\n getTypesOfType(type: CorsaType): readonly CorsaType[] {\n if (\n (type.flags & (typeFlags.union | typeFlags.intersection | typeFlags.templateLiteral)) ===\n 0\n ) {\n return [];\n }\n return this.callTypeArray(\"getTypesOfType\", type);\n }\n\n getTargetOfType(type: CorsaType): CorsaType | undefined {\n if (\n (type.flags & (typeFlags.index | typeFlags.stringMapping)) === 0 &&\n ((type.objectFlags ?? 0) & (objectFlags.reference | objectFlags.mapped)) === 0\n ) {\n return undefined;\n }\n const target = this.callType(\"getTargetOfType\", type);\n this.cacheTypeText(target);\n return target;\n }\n\n getTypeParametersOfType(type: CorsaType): readonly CorsaType[] {\n const flags = type.objectFlags ?? 0;\n if ((type.flags & typeFlags.object) === 0 || (flags & objectFlags.classOrInterface) === 0) {\n return [];\n }\n return this.callTypeArray(\"getTypeParametersOfType\", type);\n }\n\n getOuterTypeParametersOfType(type: CorsaType): readonly CorsaType[] {\n const flags = type.objectFlags ?? 0;\n if ((type.flags & typeFlags.object) === 0 || (flags & objectFlags.classOrInterface) === 0) {\n return [];\n }\n return this.callTypeArray(\"getOuterTypeParametersOfType\", type);\n }\n\n getLocalTypeParametersOfType(type: CorsaType): readonly CorsaType[] {\n const flags = type.objectFlags ?? 0;\n if ((type.flags & typeFlags.object) === 0 || (flags & objectFlags.classOrInterface) === 0) {\n return [];\n }\n return this.callTypeArray(\"getLocalTypeParametersOfType\", type);\n }\n\n getObjectTypeOfType(type: CorsaType): CorsaType | undefined {\n return (type.flags & typeFlags.indexedAccess) !== 0\n ? this.callType(\"getObjectTypeOfType\", type)\n : undefined;\n }\n\n getIndexTypeOfType(type: CorsaType): CorsaType | undefined {\n return (type.flags & typeFlags.indexedAccess) !== 0\n ? this.callType(\"getIndexTypeOfType\", type)\n : undefined;\n }\n\n getCheckTypeOfType(type: CorsaType): CorsaType | undefined {\n return (type.flags & typeFlags.conditional) !== 0\n ? this.callType(\"getCheckTypeOfType\", type)\n : undefined;\n }\n\n getExtendsTypeOfType(type: CorsaType): CorsaType | undefined {\n return (type.flags & typeFlags.conditional) !== 0\n ? this.callType(\"getExtendsTypeOfType\", type)\n : undefined;\n }\n\n getBaseTypeOfType(type: CorsaType): CorsaType | undefined {\n return (type.flags & typeFlags.substitution) !== 0\n ? this.callType(\"getBaseTypeOfType\", type)\n : undefined;\n }\n\n getConstraintOfType(type: CorsaType): CorsaType | undefined {\n return this.rememberType(\n this.client().getConstraintOfType(this.#snapshot!, this.projectId(), type.id) as\n | CorsaType\n | undefined,\n );\n }\n\n private callType(method: string, type: CorsaType): CorsaType | undefined {\n return this.rememberType(\n this.client().callJson<CorsaType | null>(method, {\n snapshot: this.#snapshot,\n type: type.id,\n }) ?? undefined,\n );\n }\n\n private callTypeArray(method: string, type: CorsaType): readonly CorsaType[] {\n return this.rememberTypes(\n this.client().callJson<readonly CorsaType[] | null>(method, {\n snapshot: this.#snapshot,\n type: type.id,\n }) ?? [],\n );\n }\n\n private tryGetSymbolType(\n symbol: CorsaSymbol,\n method: \"getTypeOfSymbol\" | \"getDeclaredTypeOfSymbol\",\n ): CorsaType | undefined {\n try {\n return this.client()[method](this.#snapshot!, this.projectId(), symbol.id) as\n | CorsaType\n | undefined;\n } catch {\n return undefined;\n }\n }\n\n private sourceSliceForType(type: CorsaType): SourceSlice | undefined {\n const cached = this.#typeSourceById.get(type.id);\n if (cached) {\n return cached;\n }\n const lookup = this.#typeLookupById.get(type.id);\n if (lookup) {\n const symbol = this.getSymbolAtPosition(lookup.fileName, lookup.position, lookup.sourceText);\n this.rememberTypeSource(type, symbol?.valueDeclaration);\n const fromLookup = this.#typeSourceById.get(type.id);\n if (fromLookup) {\n return fromLookup;\n }\n }\n if (type.symbol) {\n const symbol = this.getSymbol(type.symbol);\n this.rememberTypeSource(type, symbol?.valueDeclaration);\n }\n return this.#typeSourceById.get(type.id);\n }\n\n private rememberType<T extends CorsaType | undefined>(type: T): T {\n if (type?.symbol) {\n this.#symbolTypeById.set(type.symbol, type.id);\n }\n if (type?.texts?.[0]) {\n this.#typeTextById.set(type.id, type.texts[0]);\n }\n return type;\n }\n\n private rememberTypes<T extends readonly CorsaType[]>(types: T): T {\n for (const type of types) {\n this.rememberType(type);\n }\n return types;\n }\n\n private rememberTypeSource(type: CorsaType | undefined, handle: string | undefined): void {\n if (!type || !handle || this.#typeSourceById.has(type.id)) {\n return;\n }\n const source = this.sourceSliceForHandle(handle);\n if (source) {\n this.#typeSourceById.set(type.id, source);\n }\n }\n\n private cacheTypeText(type: CorsaType | undefined): void {\n if (!type || this.#typeTextById.has(type.id)) {\n return;\n }\n try {\n this.#typeTextById.set(\n type.id,\n this.client().typeToString(this.#snapshot!, this.projectId(), type.id),\n );\n } catch {\n // Some upstream handles are only renderable before a later relation query.\n }\n }\n\n private typeTexts(type: CorsaType): readonly string[] {\n if (Array.isArray(type.texts) && type.texts.length > 0) {\n return type.texts;\n }\n const cached = this.#typeTextById.get(type.id);\n return cached === undefined ? [] : [cached];\n }\n\n private rememberSymbol<T extends CorsaSymbol | undefined>(symbol: T): T {\n if (!symbol) {\n return symbol;\n }\n const synthetic = this.#syntheticSymbolsById.get(symbol.id);\n if (synthetic) {\n return synthetic as T;\n }\n this.#symbolsById.set(symbol.id, symbol);\n for (const declaration of symbol.declarations ?? []) {\n this.rememberNode(declaration);\n }\n if (symbol.valueDeclaration) {\n this.rememberNode(symbol.valueDeclaration);\n }\n return symbol;\n }\n\n private rememberSymbols<T extends readonly CorsaSymbol[]>(symbols: T): T {\n for (const symbol of symbols) {\n this.rememberSymbol(symbol);\n }\n return symbols;\n }\n\n private rememberSignatures<T extends readonly CorsaSignature[]>(signatures: T): T {\n for (const signature of signatures) {\n this.rememberSignature(signature);\n }\n return signatures;\n }\n\n private rememberSignature(signature: CorsaSignature): CorsaSignature {\n if (signature.declaration) {\n this.rememberNode(signature.declaration);\n }\n const parameterIds = Array.isArray(signature.parameters) ? signature.parameters : [];\n const parameters = signature.declaration\n ? this.parameterInfosForDeclaration(signature.declaration, parameterIds.length)\n : [];\n parameterIds.forEach((id, index) => {\n this.rememberSyntheticSymbol(id, parameters[index]);\n });\n if (signature.thisParameter) {\n this.rememberSyntheticSymbol(signature.thisParameter, undefined, \"this\");\n }\n return signature;\n }\n\n private rememberSyntheticSymbol(\n id: string,\n parameter?: ParameterInfo,\n fallbackName = \"\",\n ): CorsaSymbol {\n const cached = this.#syntheticSymbolsById.get(id);\n if (cached && (cached.name || !parameter?.name)) {\n return cached;\n }\n const declaration = parameter?.node.id;\n const symbol: CorsaSymbol = {\n id,\n name: parameter?.name ?? fallbackName,\n flags: cached?.flags ?? 0,\n checkFlags: cached?.checkFlags ?? 0,\n declarations: declaration ? [declaration] : (cached?.declarations ?? []),\n valueDeclaration: declaration ?? cached?.valueDeclaration,\n };\n this.#syntheticSymbolsById.set(id, symbol);\n this.#symbolsById.set(id, symbol);\n if (declaration) {\n this.#nodesById.set(declaration, parameter.node);\n }\n return symbol;\n }\n\n private rememberNode(handle: string): CorsaNode | undefined {\n const parsed = parseNodeHandle(handle);\n if (!parsed) {\n return undefined;\n }\n this.#nodesById.set(handle, parsed);\n return parsed;\n }\n\n private clearHandleCaches(): void {\n this.#symbolsById.clear();\n this.#syntheticSymbolsById.clear();\n this.#symbolTypeById.clear();\n this.#nodesById.clear();\n this.#typeLookupById.clear();\n this.#typeSourceById.clear();\n }\n\n private parameterInfosForDeclaration(\n handle: string,\n expectedCount: number,\n ): readonly ParameterInfo[] {\n const source = this.sourceSliceForHandle(handle);\n if (!source) {\n return this.parameterInfosForUtf8ByteDeclaration(handle);\n }\n const parameters = parameterInfosForSource(source);\n if (parameters.length >= expectedCount || expectedCount === 0) {\n return parameters;\n }\n const utf8Parameters = this.parameterInfosForUtf8ByteDeclaration(handle);\n return utf8Parameters.length > parameters.length ? utf8Parameters : parameters;\n }\n\n private parameterInfosForUtf8ByteDeclaration(handle: string): readonly ParameterInfo[] {\n const source = this.sourceSliceForHandle(handle, \"utf8-byte\");\n return source ? parameterInfosForSource(source) : [];\n }\n\n private sourceSliceForHandle(\n handle: string,\n offsetUnit: \"utf16\" | \"utf8-byte\" = \"utf16\",\n ): SourceSlice | undefined {\n const node = this.getNode(handle);\n if (!node) {\n return undefined;\n }\n const sourceText = this.sourceTextForPath(node.fileName);\n const normalizedNode =\n offsetUnit === \"utf8-byte\" ? nodeFromUtf8ByteOffsets(node, sourceText) : node;\n if (\n !sourceText ||\n !normalizedNode ||\n normalizedNode.pos < 0 ||\n normalizedNode.end > sourceText.length ||\n normalizedNode.pos >= normalizedNode.end\n ) {\n return undefined;\n }\n return {\n node: normalizedNode,\n text: sourceText.slice(normalizedNode.pos, normalizedNode.end),\n };\n }\n\n private sourceTextForPath(path: string): string | undefined {\n for (const [fileName, cached] of this.#files) {\n if (fileName === path || fileName.endsWith(path)) {\n return cached.lintSourceText ?? cached.sourceText ?? readFileOrUndefined(fileName);\n }\n }\n return readFileOrUndefined(path) ?? readFileOrUndefined(`${this.runtime.cwd}/${path}`);\n }\n\n private client(): CorsaApiClient {\n if (!this.#client) {\n this.#client = CorsaApiClient.spawn({\n executable: this.runtime.executable,\n cwd: this.runtime.cwd,\n mode: this.runtime.mode,\n });\n this.#client.initialize();\n }\n return this.#client;\n }\n\n private config(): { options: unknown; fileNames: string[] } {\n if (!this.#config) {\n this.#config = this.client().parseConfigFile(this.project.configPath);\n }\n const config = this.#config;\n if (!config) {\n throw new Error(`corsa oxlint could not parse a Corsa config for ${this.project.configPath}`);\n }\n return config;\n }\n\n private fileState(fileName: string, sourceText?: string): FileCache {\n const prepared = this.refreshIfNeeded(fileName, sourceText);\n const current = this.#files.get(fileName);\n if (current) {\n return current;\n }\n const project = this.client().callJson<ProjectResponse | null>(\"getDefaultProjectForFile\", {\n snapshot: this.#snapshot,\n file: fileName,\n });\n const state: FileCache = {\n mtimeMs: prepared.mtimeMs,\n lintSourceText: prepared.lintSourceText,\n sourceText: prepared.sourceText,\n projectId: project?.id ?? this.projectId(),\n typeByPosition: new Map(),\n typeBySourceRange: new Map(),\n symbolByPosition: new Map(),\n };\n this.#files.set(fileName, state);\n return state;\n }\n\n private refreshIfNeeded(fileName: string, sourceText?: string): PreparedFileState {\n const now = Date.now();\n const expired = now - this.#lastRefreshMs > this.runtime.cacheLifetimeMs;\n const cached = this.#files.get(fileName);\n const mtimeMs = statMtimeMs(fileName);\n const overlayText = this.supportedOverlayText(fileName, sourceText, mtimeMs, cached);\n const mtimeChanged = cached !== undefined && mtimeMs !== cached.mtimeMs;\n const textChanged = overlayText !== cached?.sourceText;\n const prepared = {\n mtimeMs,\n lintSourceText: sourceText,\n sourceText: overlayText,\n };\n const stale = !this.#snapshot || mtimeChanged || textChanged || expired;\n if (!stale) {\n return prepared;\n }\n const previous = this.#snapshot;\n const overlayChanges = this.overlayChanges(fileName, overlayText, cached);\n const response = this.client().updateSnapshot({\n ...(previous\n ? { fileChanges: { changed: [fileName] } }\n : { openProject: this.project.configPath }),\n ...(overlayChanges === undefined ? {} : { overlayChanges }),\n });\n this.#snapshot = response.snapshot;\n this.#projects = response.projects;\n this.#lastRefreshMs = now;\n this.#files.clear();\n this.clearHandleCaches();\n if (previous && previous !== this.#snapshot) {\n this.client().releaseHandle(previous);\n }\n return prepared;\n }\n\n private projectId(): string {\n const id = this.#projects[0]?.id;\n if (!id) {\n throw new Error(\n `corsa oxlint could not resolve a Corsa project for ${this.project.filename}`,\n );\n }\n return id;\n }\n\n private supportedOverlayText(\n fileName: string,\n sourceText: string | undefined,\n mtimeMs: number,\n cached?: FileCache,\n ): string | undefined {\n if (sourceText === undefined || !this.supportsOverlayChanges()) {\n return undefined;\n }\n if (cached?.lintSourceText === sourceText && cached.mtimeMs === mtimeMs) {\n return cached.sourceText;\n }\n return overlayTextFor(fileName, sourceText);\n }\n\n private overlayChanges(\n fileName: string,\n overlayText: string | undefined,\n cached?: FileCache,\n ):\n | {\n upsert?: { document: string; text: string; languageId: string }[];\n delete?: string[];\n }\n | undefined {\n if (!this.supportsOverlayChanges()) {\n return undefined;\n }\n if (overlayText !== undefined) {\n return {\n upsert: [\n {\n document: fileName,\n text: overlayText,\n languageId: languageIdFor(fileName),\n },\n ],\n };\n }\n if (cached?.sourceText !== undefined) {\n return { delete: [fileName] };\n }\n return undefined;\n }\n\n private supportsOverlayChanges(): boolean {\n if (this.#supportsOverlayChanges !== undefined) {\n return this.#supportsOverlayChanges;\n }\n try {\n const capabilities = this.client().callJson<{\n overlay?: { updateSnapshotOverlayChanges?: boolean };\n }>(\"describeCapabilities\");\n this.#supportsOverlayChanges = capabilities?.overlay?.updateSnapshotOverlayChanges === true;\n } catch {\n this.#supportsOverlayChanges = false;\n }\n return this.#supportsOverlayChanges;\n }\n}\n\nfunction parameterInfosForSource(source: SourceSlice): readonly ParameterInfo[] {\n const open = findConstructorParameterOpen(source.text);\n if (open < 0) {\n return [];\n }\n const close = matchingCloseParen(source.text, open);\n if (close < 0) {\n return [];\n }\n const parametersText = source.text.slice(open + 1, close);\n return splitTopLevelRanges(parametersText, \",\")\n .map((range) => parameterInfoForText(source.node, parametersText, range, open + 1))\n .filter((parameter): parameter is ParameterInfo => parameter !== undefined);\n}\n\nfunction isArrayOrTupleLikeType(session: CorsaProjectSession, type: CorsaType): boolean {\n const texts =\n Array.isArray(type.texts) && type.texts.length > 0 ? type.texts : [session.typeToString(type)];\n return texts.some((text) => {\n const normalized = text.trimStart();\n return (\n normalized.startsWith(\"readonly [\") || normalized.startsWith(\"[\") || normalized.endsWith(\"[]\")\n );\n });\n}\n\nfunction findConstructorParameterOpen(text: string): number {\n const constructorPattern = /\\bconstructor\\s*\\(/g;\n let match: RegExpExecArray | null;\n let open = -1;\n while ((match = constructorPattern.exec(text)) !== null) {\n open = match.index + match[0].lastIndexOf(\"(\");\n }\n if (open >= 0) {\n return open;\n }\n return text.indexOf(\"(\");\n}\n\nfunction overlayTextFor(fileName: string, sourceText?: string): string | undefined {\n if (sourceText === undefined) {\n return undefined;\n }\n try {\n return readFileSync(fileName, \"utf8\") === sourceText ? undefined : sourceText;\n } catch {\n return sourceText;\n }\n}\n\nfunction isProtocolPanicError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return message.includes(\"protocol error: panic:\") || message.includes(\"panic: runtime error\");\n}\n\nfunction isStaleHandleError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return /handle \"[^\"]*\" not found in snapshot registry/.test(message);\n}\n\nfunction statMtimeMs(fileName: string): number {\n try {\n return statSync(fileName).mtimeMs;\n } catch {\n return 0;\n }\n}\n\nfunction languageIdFor(fileName: string): string {\n if (fileName.endsWith(\".tsx\")) {\n return \"typescriptreact\";\n }\n if (fileName.endsWith(\".jsx\")) {\n return \"javascriptreact\";\n }\n if (fileName.endsWith(\".js\")) {\n return \"javascript\";\n }\n return \"typescript\";\n}\n\nfunction parseNodeHandle(value: string): CorsaNode | undefined {\n const [posText, endText, _kindText, ...pathParts] = value.split(\".\");\n const pos = Number(posText);\n const end = Number(endText);\n const fileName = pathParts.join(\".\");\n if (!Number.isFinite(pos) || !Number.isFinite(end) || !fileName) {\n return undefined;\n }\n return { id: value, fileName, pos, end, range: [pos, end] };\n}\n\nfunction nodeFromUtf8ByteOffsets(\n node: CorsaNode,\n sourceText: string | undefined,\n): CorsaNode | undefined {\n if (sourceText === undefined) {\n return undefined;\n }\n const pos = utf16IndexFromUtf8ByteOffset(sourceText, node.pos);\n const end = utf16IndexFromUtf8ByteOffset(sourceText, node.end);\n if (pos === undefined || end === undefined || end < pos) {\n return undefined;\n }\n return {\n ...node,\n pos,\n end,\n range: [pos, end],\n };\n}\n\nfunction utf16IndexFromUtf8ByteOffset(text: string, byteOffset: number): number | undefined {\n if (!Number.isInteger(byteOffset) || byteOffset < 0) {\n return undefined;\n }\n let bytes = 0;\n for (let index = 0; index < text.length; ) {\n if (bytes === byteOffset) {\n return index;\n }\n const codePoint = text.codePointAt(index);\n if (codePoint === undefined) {\n break;\n }\n const nextBytes = bytes + utf8ByteLengthOfCodePoint(codePoint);\n if (nextBytes > byteOffset) {\n return undefined;\n }\n bytes = nextBytes;\n index += codePoint > 0xffff ? 2 : 1;\n }\n return bytes === byteOffset ? text.length : undefined;\n}\n\nfunction utf8ByteLengthOfCodePoint(codePoint: number): number {\n if (codePoint <= 0x7f) {\n return 1;\n }\n if (codePoint <= 0x7ff) {\n return 2;\n }\n if (codePoint <= 0xffff) {\n return 3;\n }\n return 4;\n}\n\nfunction parameterInfoForText(\n declarationNode: CorsaNode,\n parametersText: string,\n range: { readonly start: number; readonly end: number },\n parametersStart: number,\n): ParameterInfo | undefined {\n const raw = parametersText.slice(range.start, range.end);\n const leading = raw.search(/\\S/);\n if (leading < 0) {\n return undefined;\n }\n const trailing = raw.match(/\\s*$/)?.[0].length ?? 0;\n const text = raw.slice(leading, raw.length - trailing);\n const name = parameterNameForText(text);\n if (!name) {\n return undefined;\n }\n const pos = declarationNode.pos + parametersStart + range.start + leading;\n const end = declarationNode.pos + parametersStart + range.end - trailing;\n const id = `${pos}.${end}.0.${declarationNode.fileName}`;\n return {\n name,\n node: {\n id,\n fileName: declarationNode.fileName,\n pos,\n end,\n range: [pos, end],\n },\n };\n}\n\nfunction parameterNameForText(text: string): string | undefined {\n let candidate = text.trim().replace(/^\\.\\.\\.\\s*/, \"\");\n let changed = true;\n while (changed) {\n const previous = candidate;\n candidate = candidate.replace(\n /^(?:public|private|protected|readonly|override|static|abstract|declare)\\s+/,\n \"\",\n );\n changed = candidate !== previous;\n }\n const separator = firstTopLevelIndexOfAny(candidate, [\":\", \"=\"]);\n let left = (separator >= 0 ? candidate.slice(0, separator) : candidate).trim();\n if (left.endsWith(\"?\")) {\n left = left.slice(0, -1).trim();\n }\n if (left.startsWith(\"{\") || left.startsWith(\"[\")) {\n return left;\n }\n return left.split(/\\s+/).at(-1);\n}\n\nfunction matchingCloseParen(text: string, open: number): number {\n let depth = 0;\n const scanner = createScanner();\n for (let index = open; index < text.length; index += 1) {\n const char = text[index];\n if (scanner.inQuote(char)) {\n continue;\n }\n if (char === \"(\") {\n depth += 1;\n } else if (char === \")\") {\n depth -= 1;\n if (depth === 0) {\n return index;\n }\n }\n }\n return -1;\n}\n\nfunction splitTopLevelRanges(\n text: string,\n delimiter: string,\n): readonly { readonly start: number; readonly end: number }[] {\n const ranges: { start: number; end: number }[] = [];\n const scanner = createScanner();\n let start = 0;\n let angleDepth = 0;\n let parenDepth = 0;\n let bracketDepth = 0;\n let braceDepth = 0;\n for (let index = 0; index < text.length; index += 1) {\n const char = text[index];\n if (scanner.inQuote(char)) {\n continue;\n }\n if (char === \"<\") angleDepth += 1;\n else if (char === \">\") angleDepth = Math.max(0, angleDepth - 1);\n else if (char === \"(\") parenDepth += 1;\n else if (char === \")\") parenDepth = Math.max(0, parenDepth - 1);\n else if (char === \"[\") bracketDepth += 1;\n else if (char === \"]\") bracketDepth = Math.max(0, bracketDepth - 1);\n else if (char === \"{\") braceDepth += 1;\n else if (char === \"}\") braceDepth = Math.max(0, braceDepth - 1);\n else if (\n char === delimiter &&\n angleDepth === 0 &&\n parenDepth === 0 &&\n bracketDepth === 0 &&\n braceDepth === 0\n ) {\n ranges.push({ start, end: index });\n start = index + 1;\n }\n }\n ranges.push({ start, end: text.length });\n return ranges;\n}\n\nfunction firstTopLevelIndexOfAny(text: string, needles: readonly string[]): number {\n const scanner = createScanner();\n let angleDepth = 0;\n let parenDepth = 0;\n let bracketDepth = 0;\n let braceDepth = 0;\n for (let index = 0; index < text.length; index += 1) {\n const char = text[index];\n if (scanner.inQuote(char)) {\n continue;\n }\n if (char === \"<\") angleDepth += 1;\n else if (char === \">\") angleDepth = Math.max(0, angleDepth - 1);\n else if (char === \"(\") parenDepth += 1;\n else if (char === \")\") parenDepth = Math.max(0, parenDepth - 1);\n else if (char === \"[\") bracketDepth += 1;\n else if (char === \"]\") bracketDepth = Math.max(0, bracketDepth - 1);\n else if (char === \"{\") braceDepth += 1;\n else if (char === \"}\") braceDepth = Math.max(0, braceDepth - 1);\n else if (\n needles.includes(char) &&\n angleDepth === 0 &&\n parenDepth === 0 &&\n bracketDepth === 0 &&\n braceDepth === 0\n ) {\n return index;\n }\n }\n return -1;\n}\n\nfunction createScanner(): {\n inQuote(char: string): boolean;\n} {\n let quote: string | undefined;\n let escaped = false;\n return {\n inQuote(char) {\n if (quote) {\n if (escaped) {\n escaped = false;\n } else if (char === \"\\\\\") {\n escaped = true;\n } else if (char === quote) {\n quote = undefined;\n }\n return true;\n }\n if (char === '\"' || char === \"'\" || char === \"`\") {\n quote = char;\n return true;\n }\n return false;\n },\n };\n}\n\nfunction readFileOrUndefined(path: string): string | undefined {\n try {\n return readFileSync(path, \"utf8\");\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "corsa-oxlint",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.35.0",
|
|
4
4
|
"description": "Type-aware Oxlint helpers powered by Corsa",
|
|
5
5
|
"homepage": "https://github.com/ubugeeei-prod/corsa-bind/tree/main/src/bindings/nodejs/corsa_oxlint",
|
|
6
6
|
"bugs": {
|
|
@@ -103,7 +103,7 @@
|
|
|
103
103
|
"dependencies": {
|
|
104
104
|
"@oxlint/plugins": "1.66.0",
|
|
105
105
|
"oxlint": "1.66.0",
|
|
106
|
-
"@corsa-bind/napi": "0.
|
|
106
|
+
"@corsa-bind/napi": "0.35.0"
|
|
107
107
|
},
|
|
108
108
|
"devDependencies": {
|
|
109
109
|
"@typescript-eslint/utils": "8.59.3"
|