import type { ChainableExpression, SuperableChainableExpression, } from "./chain"; import type { Expression, SuperableExpression } from "./expression"; import type { KeyIdentifier } from "./key"; export type ChainMemberExpression = | OptionalChainMemberExpression | NonOptionalChainMemberExpression; export type MemberExpression = | ComputedMemberExpression | NonComputedMemberExpression; export type ComputedMemberExpression = X & { type: "MemberExpression"; object: SuperableExpression; property: Expression; computed: true; optional: false; }; export type NonComputedMemberExpression = X & { type: "MemberExpression"; object: SuperableExpression; property: KeyIdentifier; computed: false; optional: false; }; // OptionalChainMemberExpression // export type OptionalChainMemberExpression = | ComputedOptionalChainMemberExpression | NonComputedOptionalChainMemberExpression; export type ComputedOptionalChainMemberExpression = X & { type: "MemberExpression"; object: ChainableExpression; property: Expression; computed: true; optional: true; }; export type NonComputedOptionalChainMemberExpression = X & { type: "MemberExpression"; object: ChainableExpression; property: KeyIdentifier; computed: false; optional: true; }; export type NonOptionalChainMemberExpression = | ComputedNonOptionalChainMemberExpression | NonComputedNonOptionalChainMemberExpression; export type ComputedNonOptionalChainMemberExpression = X & { type: "MemberExpression"; object: SuperableChainableExpression; property: Expression; computed: true; optional: false; }; export type NonComputedNonOptionalChainMemberExpression = X & { type: "MemberExpression"; object: SuperableChainableExpression; property: KeyIdentifier; computed: false; optional: false; };