corsa-oxlint 0.20.0 → 0.21.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/parser_services.js +40 -1
- package/dist/parser_services.js.map +1 -1
- package/dist/session.js +5 -1
- package/dist/session.js.map +1 -1
- package/package.json +2 -2
package/dist/parser_services.js
CHANGED
|
@@ -132,7 +132,7 @@ function createEslintTypeChecker(checker, esTreeNodeToTSNodeMap) {
|
|
|
132
132
|
return heritageTypesFromDeclaration(tsNodeFor(node, esTreeNodeToTSNodeMap), source, "implements");
|
|
133
133
|
},
|
|
134
134
|
getImplementedTypesOfType(type) {
|
|
135
|
-
return
|
|
135
|
+
return implementedTypesIncludingBases(type, source);
|
|
136
136
|
},
|
|
137
137
|
getTypeArguments(type) {
|
|
138
138
|
return asReadonlyArray(callChecker(source, "getTypeArguments", type));
|
|
@@ -200,6 +200,45 @@ function fallbackTypeText(type) {
|
|
|
200
200
|
function heritageTypes(type, checker, keyword) {
|
|
201
201
|
return asReadonlyArray(type.symbol?.declarations).flatMap((declaration) => heritageTypesFromDeclaration(declaration, checker, keyword));
|
|
202
202
|
}
|
|
203
|
+
/**
|
|
204
|
+
* Mirrors the tsgo-backed `getImplementedTypesOfType` behaviour by walking the
|
|
205
|
+
* base-type chain so a class that implements an interface only through a base
|
|
206
|
+
* class still reports that interface. Without this, a rule shared between
|
|
207
|
+
* oxlint (tsgo) and ESLint (this `@typescript-eslint` fallback checker) would
|
|
208
|
+
* see different implemented types for the same source (GH#207).
|
|
209
|
+
*
|
|
210
|
+
* The traversal is a DFS so we can use `pop()` (O(1)) instead of a queue with
|
|
211
|
+
* `shift()` (O(n)) — visit order doesn't matter because we dedupe implemented
|
|
212
|
+
* types by identity. We also `continue` on already-visited bases before
|
|
213
|
+
* touching `Set.add`, so a deep diamond hierarchy never quadruples work.
|
|
214
|
+
*/
|
|
215
|
+
function implementedTypesIncludingBases(type, checker) {
|
|
216
|
+
if (type === void 0 || type === null) return [];
|
|
217
|
+
const visited = /* @__PURE__ */ new Set();
|
|
218
|
+
const seenImplemented = /* @__PURE__ */ new Set();
|
|
219
|
+
const implemented = [];
|
|
220
|
+
const stack = [type];
|
|
221
|
+
while (stack.length > 0) {
|
|
222
|
+
const current = stack.pop();
|
|
223
|
+
if (current === void 0 || current === null || visited.has(current)) continue;
|
|
224
|
+
visited.add(current);
|
|
225
|
+
const ownImplemented = heritageTypes(current, checker, "implements");
|
|
226
|
+
for (let index = 0; index < ownImplemented.length; index += 1) {
|
|
227
|
+
const ownType = ownImplemented[index];
|
|
228
|
+
if (seenImplemented.has(ownType)) continue;
|
|
229
|
+
seenImplemented.add(ownType);
|
|
230
|
+
implemented.push(ownType);
|
|
231
|
+
}
|
|
232
|
+
const directBases = asReadonlyArray(callChecker(checker, "getBaseTypes", current));
|
|
233
|
+
const bases = directBases.length > 0 ? directBases : heritageTypes(current, checker, "extends");
|
|
234
|
+
for (let index = bases.length - 1; index >= 0; index -= 1) {
|
|
235
|
+
const baseType = bases[index];
|
|
236
|
+
if (baseType === void 0 || baseType === null || visited.has(baseType)) continue;
|
|
237
|
+
stack.push(baseType);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return implemented;
|
|
241
|
+
}
|
|
203
242
|
function heritageTypesFromDeclaration(declaration, checker, keyword) {
|
|
204
243
|
return asReadonlyArray(declaration.heritageClauses).filter((clause) => heritageClauseText(clause).trimStart().startsWith(keyword)).flatMap((clause) => asReadonlyArray(clause.types)).map((node) => {
|
|
205
244
|
return callChecker(checker, "getTypeAtLocation", node.expression ?? node);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser_services.js","names":[],"sources":["../ts/parser_services.ts"],"sourcesContent":["import { createProgram, createTypeChecker } from \"./checker\";\nimport { resolveTypeAwareParserOptions } from \"./context\";\nimport { createNodeMaps } from \"./node_map\";\nimport type {\n ContextWithParserOptions,\n CorsaTypeCheckerShape,\n ParserServices,\n ParserServicesWithTypeInformation,\n} from \"./types\";\n\nconst parserServices = new WeakMap<object, ParserServices>();\n\n/**\n * Returns type-aware parser services backed by Corsa.\n *\n * @example\n * ```ts\n * const services = getParserServices(context);\n * const checker = services.program.getTypeChecker();\n * ```\n */\nexport function getParserServices(\n context: ContextWithParserOptions,\n allowWithoutFullTypeInformation = false,\n): ParserServices {\n const current = parserServices.get(context);\n if (current) {\n return current;\n }\n const parserOptions = resolveTypeAwareParserOptions(context);\n const eslintParserServices = resolveEslintParserServices(context);\n if (!parserOptions.corsa && eslintParserServices) {\n const services = createEslintParserServices(eslintParserServices);\n parserServices.set(context, services);\n return services;\n }\n try {\n const maps = createNodeMaps(context);\n const program = createProgram(context);\n const services: ParserServicesWithTypeInformation = {\n program,\n ...maps,\n hasFullTypeInformation: true,\n getTypeAtLocation(node) {\n return createTypeChecker(context).getTypeAtLocation(node);\n },\n getSymbolAtLocation(node) {\n return createTypeChecker(context).getSymbolAtLocation(node);\n },\n };\n parserServices.set(context, services);\n return services;\n } catch (error) {\n if (!allowWithoutFullTypeInformation) {\n throw error;\n }\n const fallback: ParserServices = {\n program: createProgram(context),\n ...createNodeMaps(context),\n hasFullTypeInformation: false,\n getTypeAtLocation() {\n return undefined;\n },\n getSymbolAtLocation() {\n return undefined;\n },\n };\n parserServices.set(context, fallback);\n return fallback;\n }\n}\n\nfunction createEslintParserServices(\n parserServices: ParserServices,\n): ParserServicesWithTypeInformation {\n const checker = createEslintTypeChecker(\n parserServices.program.getTypeChecker(),\n parserServices.esTreeNodeToTSNodeMap,\n );\n return {\n program: createEslintProgram(parserServices.program, checker),\n esTreeNodeToTSNodeMap: parserServices.esTreeNodeToTSNodeMap,\n tsNodeToESTreeNodeMap: parserServices.tsNodeToESTreeNodeMap,\n hasFullTypeInformation: true,\n getTypeAtLocation(node) {\n const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node);\n return tsNode ? checker.getTypeAtLocation(tsNode) : undefined;\n },\n getSymbolAtLocation(node) {\n const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node);\n return tsNode ? checker.getSymbolAtLocation(tsNode) : undefined;\n },\n };\n}\n\nfunction createEslintProgram(\n program: ParserServices[\"program\"],\n checker: CorsaTypeCheckerShape,\n): ParserServices[\"program\"] {\n return Object.assign(Object.create(program), {\n getTypeChecker() {\n return checker;\n },\n });\n}\n\nfunction createEslintTypeChecker(\n checker: CorsaTypeCheckerShape,\n esTreeNodeToTSNodeMap: ParserServices[\"esTreeNodeToTSNodeMap\"],\n): CorsaTypeCheckerShape {\n const source = checker as unknown as Record<string, unknown>;\n return {\n ...checker,\n getTypeAtLocation(node) {\n return callChecker(source, \"getTypeAtLocation\", tsNodeFor(node, esTreeNodeToTSNodeMap));\n },\n getContextualType(node) {\n return (\n callChecker(source, \"getContextualType\", tsNodeFor(node, esTreeNodeToTSNodeMap)) ??\n this.getTypeAtLocation(node)\n );\n },\n getSymbolAtLocation(node) {\n return callChecker(source, \"getSymbolAtLocation\", tsNodeFor(node, esTreeNodeToTSNodeMap));\n },\n getSymbol(symbol) {\n return typeof symbol === \"object\" ? symbol : undefined;\n },\n getSymbolById(id) {\n return typeof id === \"object\" ? id : undefined;\n },\n getNode(node) {\n return typeof node === \"object\" ? node : undefined;\n },\n getNodeById(id) {\n return typeof id === \"object\" ? id : undefined;\n },\n getTypeOfSymbol(symbol) {\n return callChecker(source, \"getTypeOfSymbol\", symbol);\n },\n getDeclaredTypeOfSymbol(symbol) {\n return callChecker(source, \"getDeclaredTypeOfSymbol\", symbol);\n },\n getTypeOfSymbolAtLocation(symbol, node) {\n return (\n callChecker(\n source,\n \"getTypeOfSymbolAtLocation\",\n symbol,\n tsNodeFor(node, esTreeNodeToTSNodeMap),\n ) ??\n this.getTypeOfSymbol(symbol) ??\n this.getDeclaredTypeOfSymbol(symbol)\n );\n },\n typeToString(type, enclosingDeclaration, flags) {\n return (\n callChecker(\n source,\n \"typeToString\",\n type,\n enclosingDeclaration ? tsNodeFor(enclosingDeclaration, esTreeNodeToTSNodeMap) : undefined,\n flags,\n ) ?? fallbackTypeText(type)\n );\n },\n getBaseTypeOfLiteralType(type) {\n return callChecker(source, \"getBaseTypeOfLiteralType\", type) ?? type;\n },\n getPropertiesOfType(type) {\n return asReadonlyArray(callChecker(source, \"getPropertiesOfType\", type));\n },\n getSignaturesOfType(type, kind) {\n return asReadonlyArray(callChecker(source, \"getSignaturesOfType\", type, kind));\n },\n getReturnTypeOfSignature(signature) {\n return callChecker(source, \"getReturnTypeOfSignature\", signature);\n },\n getTypePredicateOfSignature(signature) {\n return callChecker(source, \"getTypePredicateOfSignature\", signature);\n },\n getBaseTypes(type) {\n const baseTypes = asReadonlyArray(callChecker(source, \"getBaseTypes\", type));\n return baseTypes.length > 0 ? baseTypes : heritageTypes(type, source, \"extends\");\n },\n getImplementedTypes(node) {\n return heritageTypesFromDeclaration(\n tsNodeFor(node, esTreeNodeToTSNodeMap),\n source,\n \"implements\",\n );\n },\n getImplementedTypesOfType(type) {\n return heritageTypes(type, source, \"implements\");\n },\n getTypeArguments(type) {\n return asReadonlyArray(callChecker(source, \"getTypeArguments\", type));\n },\n getTypesOfType(type) {\n return asReadonlyArray((type as { readonly types?: unknown }).types);\n },\n getTargetOfType(type) {\n return (type as { readonly target?: unknown }).target as never;\n },\n getTypeParametersOfType(type) {\n return asReadonlyArray((type as { readonly typeParameters?: unknown }).typeParameters);\n },\n getOuterTypeParametersOfType(type) {\n return asReadonlyArray(\n (type as { readonly outerTypeParameters?: unknown }).outerTypeParameters,\n );\n },\n getLocalTypeParametersOfType(type) {\n return asReadonlyArray(\n (type as { readonly localTypeParameters?: unknown }).localTypeParameters,\n );\n },\n getObjectTypeOfType(type) {\n return (type as { readonly objectType?: unknown }).objectType as never;\n },\n getIndexTypeOfType(type) {\n return (type as { readonly indexType?: unknown }).indexType as never;\n },\n getCheckTypeOfType(type) {\n return (type as { readonly checkType?: unknown }).checkType as never;\n },\n getExtendsTypeOfType(type) {\n return (type as { readonly extendsType?: unknown }).extendsType as never;\n },\n getBaseTypeOfType(type) {\n return (type as { readonly baseType?: unknown }).baseType as never;\n },\n getConstraintOfType(type) {\n return callChecker(source, \"getBaseConstraintOfType\", type);\n },\n isUnionType(type) {\n const value = type as { readonly isUnion?: unknown };\n return typeof value.isUnion === \"function\" ? Boolean(value.isUnion()) : false;\n },\n isIntersectionType(type) {\n const value = type as { readonly isIntersection?: unknown };\n return typeof value.isIntersection === \"function\" ? Boolean(value.isIntersection()) : false;\n },\n } as CorsaTypeCheckerShape;\n}\n\nfunction callChecker(\n checker: Record<string, unknown>,\n method: string,\n ...args: readonly unknown[]\n): never | undefined {\n const candidate = checker[method];\n return typeof candidate === \"function\" ? candidate.apply(checker, args) : undefined;\n}\n\nfunction asReadonlyArray<T>(value: unknown): readonly T[] {\n return Array.isArray(value) ? value : [];\n}\n\nfunction tsNodeFor(\n node: unknown,\n esTreeNodeToTSNodeMap: ParserServices[\"esTreeNodeToTSNodeMap\"],\n): unknown {\n return hasNode(esTreeNodeToTSNodeMap, node) ? esTreeNodeToTSNodeMap.get(node as never) : node;\n}\n\nfunction hasNode(\n esTreeNodeToTSNodeMap: ParserServices[\"esTreeNodeToTSNodeMap\"],\n node: unknown,\n): boolean {\n return typeof node === \"object\" && node !== null && esTreeNodeToTSNodeMap.has(node as never);\n}\n\nfunction fallbackTypeText(type: unknown): string {\n const name = (type as { readonly name?: unknown }).name;\n return typeof name === \"string\" || typeof name === \"number\" || typeof name === \"boolean\"\n ? String(name)\n : \"\";\n}\n\nfunction heritageTypes(\n type: unknown,\n checker: Record<string, unknown>,\n keyword: \"extends\" | \"implements\",\n): readonly never[] {\n const declarations = asReadonlyArray(\n (type as { readonly symbol?: { readonly declarations?: unknown } }).symbol?.declarations,\n );\n return declarations.flatMap((declaration) =>\n heritageTypesFromDeclaration(declaration, checker, keyword),\n );\n}\n\nfunction heritageTypesFromDeclaration(\n declaration: unknown,\n checker: Record<string, unknown>,\n keyword: \"extends\" | \"implements\",\n): readonly never[] {\n const clauses = asReadonlyArray(\n (declaration as { readonly heritageClauses?: unknown }).heritageClauses,\n );\n return clauses\n .filter((clause) => heritageClauseText(clause).trimStart().startsWith(keyword))\n .flatMap((clause) => asReadonlyArray((clause as { readonly types?: unknown }).types))\n .map((node) => {\n const expression = (node as { readonly expression?: unknown }).expression ?? node;\n return callChecker(checker, \"getTypeAtLocation\", expression);\n })\n .filter((type): type is never => type !== undefined);\n}\n\nfunction heritageClauseText(clause: unknown): string {\n const getText = (clause as { readonly getText?: unknown }).getText;\n return typeof getText === \"function\" ? String(getText.call(clause)) : \"\";\n}\n\nfunction resolveEslintParserServices(\n context: ContextWithParserOptions,\n): ParserServices | undefined {\n const candidates = [context.parserServices, context.sourceCode.parserServices] as const;\n for (const candidate of candidates) {\n if (hasEslintParserServices(candidate)) {\n return candidate;\n }\n }\n return undefined;\n}\n\nfunction hasEslintParserServices(value: unknown): value is ParserServices {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"program\" in value &&\n \"esTreeNodeToTSNodeMap\" in value &&\n \"tsNodeToESTreeNodeMap\" in value,\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"parser_services.js","names":[],"sources":["../ts/parser_services.ts"],"sourcesContent":["import { createProgram, createTypeChecker } from \"./checker\";\nimport { resolveTypeAwareParserOptions } from \"./context\";\nimport { createNodeMaps } from \"./node_map\";\nimport type {\n ContextWithParserOptions,\n CorsaTypeCheckerShape,\n ParserServices,\n ParserServicesWithTypeInformation,\n} from \"./types\";\n\nconst parserServices = new WeakMap<object, ParserServices>();\n\n/**\n * Returns type-aware parser services backed by Corsa.\n *\n * @example\n * ```ts\n * const services = getParserServices(context);\n * const checker = services.program.getTypeChecker();\n * ```\n */\nexport function getParserServices(\n context: ContextWithParserOptions,\n allowWithoutFullTypeInformation = false,\n): ParserServices {\n const current = parserServices.get(context);\n if (current) {\n return current;\n }\n const parserOptions = resolveTypeAwareParserOptions(context);\n const eslintParserServices = resolveEslintParserServices(context);\n if (!parserOptions.corsa && eslintParserServices) {\n const services = createEslintParserServices(eslintParserServices);\n parserServices.set(context, services);\n return services;\n }\n try {\n const maps = createNodeMaps(context);\n const program = createProgram(context);\n const services: ParserServicesWithTypeInformation = {\n program,\n ...maps,\n hasFullTypeInformation: true,\n getTypeAtLocation(node) {\n return createTypeChecker(context).getTypeAtLocation(node);\n },\n getSymbolAtLocation(node) {\n return createTypeChecker(context).getSymbolAtLocation(node);\n },\n };\n parserServices.set(context, services);\n return services;\n } catch (error) {\n if (!allowWithoutFullTypeInformation) {\n throw error;\n }\n const fallback: ParserServices = {\n program: createProgram(context),\n ...createNodeMaps(context),\n hasFullTypeInformation: false,\n getTypeAtLocation() {\n return undefined;\n },\n getSymbolAtLocation() {\n return undefined;\n },\n };\n parserServices.set(context, fallback);\n return fallback;\n }\n}\n\nfunction createEslintParserServices(\n parserServices: ParserServices,\n): ParserServicesWithTypeInformation {\n const checker = createEslintTypeChecker(\n parserServices.program.getTypeChecker(),\n parserServices.esTreeNodeToTSNodeMap,\n );\n return {\n program: createEslintProgram(parserServices.program, checker),\n esTreeNodeToTSNodeMap: parserServices.esTreeNodeToTSNodeMap,\n tsNodeToESTreeNodeMap: parserServices.tsNodeToESTreeNodeMap,\n hasFullTypeInformation: true,\n getTypeAtLocation(node) {\n const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node);\n return tsNode ? checker.getTypeAtLocation(tsNode) : undefined;\n },\n getSymbolAtLocation(node) {\n const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node);\n return tsNode ? checker.getSymbolAtLocation(tsNode) : undefined;\n },\n };\n}\n\nfunction createEslintProgram(\n program: ParserServices[\"program\"],\n checker: CorsaTypeCheckerShape,\n): ParserServices[\"program\"] {\n return Object.assign(Object.create(program), {\n getTypeChecker() {\n return checker;\n },\n });\n}\n\nfunction createEslintTypeChecker(\n checker: CorsaTypeCheckerShape,\n esTreeNodeToTSNodeMap: ParserServices[\"esTreeNodeToTSNodeMap\"],\n): CorsaTypeCheckerShape {\n const source = checker as unknown as Record<string, unknown>;\n return {\n ...checker,\n getTypeAtLocation(node) {\n return callChecker(source, \"getTypeAtLocation\", tsNodeFor(node, esTreeNodeToTSNodeMap));\n },\n getContextualType(node) {\n return (\n callChecker(source, \"getContextualType\", tsNodeFor(node, esTreeNodeToTSNodeMap)) ??\n this.getTypeAtLocation(node)\n );\n },\n getSymbolAtLocation(node) {\n return callChecker(source, \"getSymbolAtLocation\", tsNodeFor(node, esTreeNodeToTSNodeMap));\n },\n getSymbol(symbol) {\n return typeof symbol === \"object\" ? symbol : undefined;\n },\n getSymbolById(id) {\n return typeof id === \"object\" ? id : undefined;\n },\n getNode(node) {\n return typeof node === \"object\" ? node : undefined;\n },\n getNodeById(id) {\n return typeof id === \"object\" ? id : undefined;\n },\n getTypeOfSymbol(symbol) {\n return callChecker(source, \"getTypeOfSymbol\", symbol);\n },\n getDeclaredTypeOfSymbol(symbol) {\n return callChecker(source, \"getDeclaredTypeOfSymbol\", symbol);\n },\n getTypeOfSymbolAtLocation(symbol, node) {\n return (\n callChecker(\n source,\n \"getTypeOfSymbolAtLocation\",\n symbol,\n tsNodeFor(node, esTreeNodeToTSNodeMap),\n ) ??\n this.getTypeOfSymbol(symbol) ??\n this.getDeclaredTypeOfSymbol(symbol)\n );\n },\n typeToString(type, enclosingDeclaration, flags) {\n return (\n callChecker(\n source,\n \"typeToString\",\n type,\n enclosingDeclaration ? tsNodeFor(enclosingDeclaration, esTreeNodeToTSNodeMap) : undefined,\n flags,\n ) ?? fallbackTypeText(type)\n );\n },\n getBaseTypeOfLiteralType(type) {\n return callChecker(source, \"getBaseTypeOfLiteralType\", type) ?? type;\n },\n getPropertiesOfType(type) {\n return asReadonlyArray(callChecker(source, \"getPropertiesOfType\", type));\n },\n getSignaturesOfType(type, kind) {\n return asReadonlyArray(callChecker(source, \"getSignaturesOfType\", type, kind));\n },\n getReturnTypeOfSignature(signature) {\n return callChecker(source, \"getReturnTypeOfSignature\", signature);\n },\n getTypePredicateOfSignature(signature) {\n return callChecker(source, \"getTypePredicateOfSignature\", signature);\n },\n getBaseTypes(type) {\n const baseTypes = asReadonlyArray(callChecker(source, \"getBaseTypes\", type));\n return baseTypes.length > 0 ? baseTypes : heritageTypes(type, source, \"extends\");\n },\n getImplementedTypes(node) {\n return heritageTypesFromDeclaration(\n tsNodeFor(node, esTreeNodeToTSNodeMap),\n source,\n \"implements\",\n );\n },\n getImplementedTypesOfType(type) {\n return implementedTypesIncludingBases(type, source);\n },\n getTypeArguments(type) {\n return asReadonlyArray(callChecker(source, \"getTypeArguments\", type));\n },\n getTypesOfType(type) {\n return asReadonlyArray((type as { readonly types?: unknown }).types);\n },\n getTargetOfType(type) {\n return (type as { readonly target?: unknown }).target as never;\n },\n getTypeParametersOfType(type) {\n return asReadonlyArray((type as { readonly typeParameters?: unknown }).typeParameters);\n },\n getOuterTypeParametersOfType(type) {\n return asReadonlyArray(\n (type as { readonly outerTypeParameters?: unknown }).outerTypeParameters,\n );\n },\n getLocalTypeParametersOfType(type) {\n return asReadonlyArray(\n (type as { readonly localTypeParameters?: unknown }).localTypeParameters,\n );\n },\n getObjectTypeOfType(type) {\n return (type as { readonly objectType?: unknown }).objectType as never;\n },\n getIndexTypeOfType(type) {\n return (type as { readonly indexType?: unknown }).indexType as never;\n },\n getCheckTypeOfType(type) {\n return (type as { readonly checkType?: unknown }).checkType as never;\n },\n getExtendsTypeOfType(type) {\n return (type as { readonly extendsType?: unknown }).extendsType as never;\n },\n getBaseTypeOfType(type) {\n return (type as { readonly baseType?: unknown }).baseType as never;\n },\n getConstraintOfType(type) {\n return callChecker(source, \"getBaseConstraintOfType\", type);\n },\n isUnionType(type) {\n const value = type as { readonly isUnion?: unknown };\n return typeof value.isUnion === \"function\" ? Boolean(value.isUnion()) : false;\n },\n isIntersectionType(type) {\n const value = type as { readonly isIntersection?: unknown };\n return typeof value.isIntersection === \"function\" ? Boolean(value.isIntersection()) : false;\n },\n } as CorsaTypeCheckerShape;\n}\n\nfunction callChecker(\n checker: Record<string, unknown>,\n method: string,\n ...args: readonly unknown[]\n): never | undefined {\n const candidate = checker[method];\n return typeof candidate === \"function\" ? candidate.apply(checker, args) : undefined;\n}\n\nfunction asReadonlyArray<T>(value: unknown): readonly T[] {\n return Array.isArray(value) ? value : [];\n}\n\nfunction tsNodeFor(\n node: unknown,\n esTreeNodeToTSNodeMap: ParserServices[\"esTreeNodeToTSNodeMap\"],\n): unknown {\n return hasNode(esTreeNodeToTSNodeMap, node) ? esTreeNodeToTSNodeMap.get(node as never) : node;\n}\n\nfunction hasNode(\n esTreeNodeToTSNodeMap: ParserServices[\"esTreeNodeToTSNodeMap\"],\n node: unknown,\n): boolean {\n return typeof node === \"object\" && node !== null && esTreeNodeToTSNodeMap.has(node as never);\n}\n\nfunction fallbackTypeText(type: unknown): string {\n const name = (type as { readonly name?: unknown }).name;\n return typeof name === \"string\" || typeof name === \"number\" || typeof name === \"boolean\"\n ? String(name)\n : \"\";\n}\n\nfunction heritageTypes(\n type: unknown,\n checker: Record<string, unknown>,\n keyword: \"extends\" | \"implements\",\n): readonly never[] {\n const declarations = asReadonlyArray(\n (type as { readonly symbol?: { readonly declarations?: unknown } }).symbol?.declarations,\n );\n return declarations.flatMap((declaration) =>\n heritageTypesFromDeclaration(declaration, checker, keyword),\n );\n}\n\n/**\n * Mirrors the tsgo-backed `getImplementedTypesOfType` behaviour by walking the\n * base-type chain so a class that implements an interface only through a base\n * class still reports that interface. Without this, a rule shared between\n * oxlint (tsgo) and ESLint (this `@typescript-eslint` fallback checker) would\n * see different implemented types for the same source (GH#207).\n *\n * The traversal is a DFS so we can use `pop()` (O(1)) instead of a queue with\n * `shift()` (O(n)) — visit order doesn't matter because we dedupe implemented\n * types by identity. We also `continue` on already-visited bases before\n * touching `Set.add`, so a deep diamond hierarchy never quadruples work.\n */\nfunction implementedTypesIncludingBases(\n type: unknown,\n checker: Record<string, unknown>,\n): readonly never[] {\n if (type === undefined || type === null) {\n return [];\n }\n const visited = new Set<unknown>();\n const seenImplemented = new Set<unknown>();\n const implemented: never[] = [];\n const stack: unknown[] = [type];\n while (stack.length > 0) {\n const current = stack.pop();\n if (current === undefined || current === null || visited.has(current)) {\n continue;\n }\n visited.add(current);\n const ownImplemented = heritageTypes(current, checker, \"implements\");\n for (let index = 0; index < ownImplemented.length; index += 1) {\n const ownType = ownImplemented[index];\n if (seenImplemented.has(ownType)) {\n continue;\n }\n seenImplemented.add(ownType);\n implemented.push(ownType);\n }\n const directBases = asReadonlyArray(callChecker(checker, \"getBaseTypes\", current));\n const bases = directBases.length > 0 ? directBases : heritageTypes(current, checker, \"extends\");\n for (let index = bases.length - 1; index >= 0; index -= 1) {\n const baseType = bases[index];\n if (baseType === undefined || baseType === null || visited.has(baseType)) {\n continue;\n }\n stack.push(baseType);\n }\n }\n return implemented;\n}\n\nfunction heritageTypesFromDeclaration(\n declaration: unknown,\n checker: Record<string, unknown>,\n keyword: \"extends\" | \"implements\",\n): readonly never[] {\n const clauses = asReadonlyArray(\n (declaration as { readonly heritageClauses?: unknown }).heritageClauses,\n );\n return clauses\n .filter((clause) => heritageClauseText(clause).trimStart().startsWith(keyword))\n .flatMap((clause) => asReadonlyArray((clause as { readonly types?: unknown }).types))\n .map((node) => {\n const expression = (node as { readonly expression?: unknown }).expression ?? node;\n return callChecker(checker, \"getTypeAtLocation\", expression);\n })\n .filter((type): type is never => type !== undefined);\n}\n\nfunction heritageClauseText(clause: unknown): string {\n const getText = (clause as { readonly getText?: unknown }).getText;\n return typeof getText === \"function\" ? String(getText.call(clause)) : \"\";\n}\n\nfunction resolveEslintParserServices(\n context: ContextWithParserOptions,\n): ParserServices | undefined {\n const candidates = [context.parserServices, context.sourceCode.parserServices] as const;\n for (const candidate of candidates) {\n if (hasEslintParserServices(candidate)) {\n return candidate;\n }\n }\n return undefined;\n}\n\nfunction hasEslintParserServices(value: unknown): value is ParserServices {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"program\" in value &&\n \"esTreeNodeToTSNodeMap\" in value &&\n \"tsNodeToESTreeNodeMap\" in value,\n );\n}\n"],"mappings":"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"}
|
package/dist/session.js
CHANGED
|
@@ -159,7 +159,7 @@ var CorsaProjectSession = class {
|
|
|
159
159
|
type: type.id
|
|
160
160
|
}) ?? []);
|
|
161
161
|
} catch (error) {
|
|
162
|
-
if (isProtocolPanicError(error)) return [];
|
|
162
|
+
if (isProtocolPanicError(error) || isStaleHandleError(error)) return [];
|
|
163
163
|
throw error;
|
|
164
164
|
}
|
|
165
165
|
}
|
|
@@ -486,6 +486,10 @@ function isProtocolPanicError(error) {
|
|
|
486
486
|
const message = error instanceof Error ? error.message : String(error);
|
|
487
487
|
return message.includes("protocol error: panic:") || message.includes("panic: runtime error");
|
|
488
488
|
}
|
|
489
|
+
function isStaleHandleError(error) {
|
|
490
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
491
|
+
return /handle "[^"]*" not found in snapshot registry/.test(message);
|
|
492
|
+
}
|
|
489
493
|
function statMtimeMs(fileName) {
|
|
490
494
|
try {
|
|
491
495
|
return statSync(fileName).mtimeMs;
|
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 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 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 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 }) ?? [],\n );\n } catch (error) {\n if (isProtocolPanicError(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 (type.flags & typeFlags.substitution) !== 0\n ? this.callType(\"getConstraintOfType\", type)\n : undefined;\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 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 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 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 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 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 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 }) ?? [],\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 (type.flags & typeFlags.substitution) !== 0\n ? this.callType(\"getConstraintOfType\", type)\n : undefined;\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 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 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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "corsa-oxlint",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.21.0",
|
|
4
4
|
"description": "Type-aware Oxlint helpers powered by Corsa",
|
|
5
5
|
"homepage": "https://github.com/ubugeeei/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.21.0"
|
|
107
107
|
},
|
|
108
108
|
"devDependencies": {
|
|
109
109
|
"@typescript-eslint/utils": "8.59.3"
|