import { Increment } from "../GracefulRecursion.mjs";
import { InstanceOrStatic, Integer } from "../miscTypes.mjs";
import { BaseClass, BaseClassProto, ClassLike, ConstructorConstraint, ConstructorLike, SuperClassLike, WithProto } from "./inheritance.mjs";
import { InstanceTypeOrSelfPropertyDescriptorMap } from "./InstanceTypeOrSelfPropertyDescriptorMap.mjs";
import { OwnPropertyDescriptorMap } from "./OwnPropertyDescriptorMap.mjs";
//#region src/utils/reflection/getOwnPropertyDescriptorsRecursively.d.ts
/**
 * A conditional wrapper for {@link InstanceTypeOrSelfPropertyDescriptorMap} and
 * {@link OwnPropertyDescriptorMap}.
 *
 * If {@link _InstanceOrStatic} is 'Instance', {@link InstanceTypeOrSelfPropertyDescriptorMap}.\
 * Else if {@link _InstanceOrStatic} is 'Static',
 * {@link OwnPropertyDescriptorMap }.\
 * Else, `never`.
 * @template {ConstructorConstraint<Class> & WithProto<SuperClassLike | BaseClassProto>} Class
 * A class definition cast to {@link ClassLike}.
 * @template {InstanceOrStatic} _InstanceOrStatic
 * 'Instance' or 'Static'. Determines the return type.
 * @since 3.0.0
 */
type RecursedPropertyDescriptorMap<Class extends ConstructorConstraint<Class> & WithProto<SuperClassLike | BaseClassProto>, _InstanceOrStatic extends InstanceOrStatic> = [_InstanceOrStatic] extends ["Instance"] ? InstanceTypeOrSelfPropertyDescriptorMap<Class, Class["__proto__"]> : [_InstanceOrStatic] extends ["Static"] ? OwnPropertyDescriptorMap<Class> : never;
/**
 * An
 * ordered array of {@link OwnPropertyDescriptorMap} or
 * {@link InstancePropertyDescriptorMap} starting with {@link classDefinition}
 * and ending with a {@link BaseClass}.
 * @template {ConstructorConstraint<Class> & WithProto<SuperClassLike | BaseClassProto>} Class
 * @template {'Instance' | 'Static'} InstanceOrStatic
 * @template {Integer<number>} [Limit=16]
 * @template {Integer<number>} [CurrentLevel=0]
 */
type RecursedPropertyDescriptorMapArray<Class extends ConstructorConstraint<Class> & WithProto<SuperClassLike | BaseClassProto>, InstanceOrStatic extends "Instance" | "Static", Limit extends Integer<number> = 16, CurrentLevel extends Integer<number> = 0> = Class["__proto__"] extends BaseClassProto["__proto__"] | BaseClassProto["__proto__"]["__proto__"] ? never : Class["__proto__"] extends BaseClassProto ? [RecursedPropertyDescriptorMap<BaseClass<Class>, InstanceOrStatic>] : Class["__proto__"] extends ConstructorLike<Class["__proto__"]> ? [RecursedPropertyDescriptorMap<Class, InstanceOrStatic>, ...RecursedPropertyDescriptorMapArray<ClassLike<Exclude<Class["__proto__"], BaseClassProto> & WithProto<SuperClassLike | BaseClassProto>>, InstanceOrStatic, Limit, Increment<CurrentLevel>>] : never;
/**
 * Walks the class inheritance chain to get a PropertyDescriptorMap of each class.
 *
 * While you _can_ use this to get an array of getter names/keys, you should use {@link getPrototypeOf} and {@link listOwnGetters}, instead!
 * @template Class Any class definition type-cast to {@link ClassLike}
 * @template _InstanceOrStatic
 * @param classDefinition Any class definition type-cast to {@link ClassLike}
 * @param instanceOrStatic 'Instance' or 'Static'. Determines the return type.
 * @returns An
 * ordered array of {@link OwnPropertyDescriptorMap} or
 * {@link InstancePropertyDescriptorMap} starting with {@link classDefinition}
 * and ending with a {@link BaseClass}.
 * @since 3.0.0
 */
declare function getOwnPropertyDescriptorsRecursively<Class extends ClassLike<ConstructorConstraint<Class> & WithProto<SuperClassLike | BaseClassProto>>, _InstanceOrStatic extends InstanceOrStatic, Limit extends Integer<number> = 16>(classDefinition: Class, instanceOrStatic: _InstanceOrStatic): RecursedPropertyDescriptorMapArray<Class, _InstanceOrStatic>;
//#endregion
export { RecursedPropertyDescriptorMap, RecursedPropertyDescriptorMapArray, getOwnPropertyDescriptorsRecursively };
//# sourceMappingURL=getOwnPropertyDescriptorsRecursively.d.mts.map