Skip to content

Commit

Permalink
Deprecate 'ASTKindToNode' (#3318)
Browse files Browse the repository at this point in the history
  • Loading branch information
IvanGoncharov committed Oct 18, 2021
1 parent 73025aa commit ada5ee0
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 64 deletions.
3 changes: 0 additions & 3 deletions integrationTests/ts/package.json
Expand Up @@ -6,9 +6,6 @@
},
"dependencies": {
"graphql": "file:../graphql.tgz",
"typescript-3.8": "npm:typescript@3.8.x",
"typescript-3.9": "npm:typescript@3.9.x",
"typescript-4.0": "npm:typescript@4.0.x",
"typescript-4.1": "npm:typescript@4.1.x",
"typescript-4.2": "npm:typescript@4.2.x",
"typescript-4.3": "npm:typescript@4.3.x",
Expand Down
50 changes: 4 additions & 46 deletions src/language/ast.ts
Expand Up @@ -184,57 +184,15 @@ export type ASTNode =
/**
* Utility type listing all nodes indexed by their kind.
*/
export interface ASTKindToNode {
Name: NameNode;
Document: DocumentNode;
OperationDefinition: OperationDefinitionNode;
VariableDefinition: VariableDefinitionNode;
Variable: VariableNode;
SelectionSet: SelectionSetNode;
Field: FieldNode;
Argument: ArgumentNode;
FragmentSpread: FragmentSpreadNode;
InlineFragment: InlineFragmentNode;
FragmentDefinition: FragmentDefinitionNode;
IntValue: IntValueNode;
FloatValue: FloatValueNode;
StringValue: StringValueNode;
BooleanValue: BooleanValueNode;
NullValue: NullValueNode;
EnumValue: EnumValueNode;
ListValue: ListValueNode;
ObjectValue: ObjectValueNode;
ObjectField: ObjectFieldNode;
Directive: DirectiveNode;
NamedType: NamedTypeNode;
ListType: ListTypeNode;
NonNullType: NonNullTypeNode;
SchemaDefinition: SchemaDefinitionNode;
OperationTypeDefinition: OperationTypeDefinitionNode;
ScalarTypeDefinition: ScalarTypeDefinitionNode;
ObjectTypeDefinition: ObjectTypeDefinitionNode;
FieldDefinition: FieldDefinitionNode;
InputValueDefinition: InputValueDefinitionNode;
InterfaceTypeDefinition: InterfaceTypeDefinitionNode;
UnionTypeDefinition: UnionTypeDefinitionNode;
EnumTypeDefinition: EnumTypeDefinitionNode;
EnumValueDefinition: EnumValueDefinitionNode;
InputObjectTypeDefinition: InputObjectTypeDefinitionNode;
DirectiveDefinition: DirectiveDefinitionNode;
SchemaExtension: SchemaExtensionNode;
ScalarTypeExtension: ScalarTypeExtensionNode;
ObjectTypeExtension: ObjectTypeExtensionNode;
InterfaceTypeExtension: InterfaceTypeExtensionNode;
UnionTypeExtension: UnionTypeExtensionNode;
EnumTypeExtension: EnumTypeExtensionNode;
InputObjectTypeExtension: InputObjectTypeExtensionNode;
}
export type ASTKindToNode = {
[NodeT in ASTNode as NodeT['kind']]: NodeT;
};

/**
* @internal
*/
export const QueryDocumentKeys: {
[P in keyof ASTKindToNode]: ReadonlyArray<keyof ASTKindToNode[P]>;
[NodeT in ASTNode as NodeT['kind']]: ReadonlyArray<keyof NodeT>;
} = {
Name: [],

Expand Down
28 changes: 13 additions & 15 deletions src/language/visitor.ts
@@ -1,7 +1,7 @@
import { inspect } from '../jsutils/inspect';
import { devAssert } from '../jsutils/devAssert';

import type { ASTNode, ASTKindToNode } from './ast';
import type { ASTNode } from './ast';
import { isNode, QueryDocumentKeys } from './ast';
import { Kind } from './kinds';

Expand All @@ -12,9 +12,9 @@ import { Kind } from './kinds';
export type ASTVisitor = EnterLeaveVisitor<ASTNode> | KindVisitor;

type KindVisitor = {
readonly [K in keyof ASTKindToNode]?:
| ASTVisitFn<ASTKindToNode[K]>
| EnterLeaveVisitor<ASTKindToNode[K]>;
readonly [NodeT in ASTNode as NodeT['kind']]?:
| ASTVisitFn<NodeT>
| EnterLeaveVisitor<NodeT>;
};

interface EnterLeaveVisitor<TVisitedNode extends ASTNode> {
Expand Down Expand Up @@ -48,9 +48,9 @@ export type ASTVisitFn<TVisitedNode extends ASTNode> = (
* another form.
*/
export type ASTReducer<R> = {
readonly [K in keyof ASTKindToNode]?: {
readonly enter?: ASTVisitFn<ASTKindToNode[K]>;
readonly leave: ASTReducerFn<ASTKindToNode[K], R>;
readonly [NodeT in ASTNode as NodeT['kind']]?: {
readonly enter?: ASTVisitFn<NodeT>;
readonly leave: ASTReducerFn<NodeT, R>;
};
};

Expand Down Expand Up @@ -79,9 +79,11 @@ type ReducedField<T, R> = T extends null | undefined

/**
* A KeyMap describes each the traversable properties of each kind of node.
*
* @deprecated Please inline it. Will be removed in v17
*/
export type ASTVisitorKeyMap = {
[P in keyof ASTKindToNode]?: ReadonlyArray<keyof ASTKindToNode[P]>;
[NodeT in ASTNode as NodeT['kind']]?: ReadonlyArray<keyof NodeT>;
};

export const BREAK: unknown = Object.freeze({});
Expand Down Expand Up @@ -179,11 +181,7 @@ export function visit(
visitor: ASTVisitor | ASTReducer<any>,
visitorKeys: ASTVisitorKeyMap = QueryDocumentKeys,
): any {
const enterLeaveMap = new Map<
keyof ASTKindToNode,
EnterLeaveVisitor<ASTNode>
>();

const enterLeaveMap = new Map<Kind, EnterLeaveVisitor<ASTNode>>();
for (const kind of Object.values(Kind)) {
enterLeaveMap.set(kind, getEnterLeaveForKind(visitor, kind));
}
Expand Down Expand Up @@ -380,7 +378,7 @@ export function visitInParallel(
*/
export function getEnterLeaveForKind(
visitor: ASTVisitor,
kind: keyof ASTKindToNode,
kind: Kind,
): EnterLeaveVisitor<ASTNode> {
const kindVisitor:
| ASTVisitFn<ASTNode>
Expand Down Expand Up @@ -408,7 +406,7 @@ export function getEnterLeaveForKind(
// istanbul ignore next (Deprecated code)
export function getVisitFn(
visitor: ASTVisitor,
kind: keyof ASTKindToNode,
kind: Kind,
isLeaving: boolean,
): ASTVisitFn<ASTNode> | undefined {
const { enter, leave } = getEnterLeaveForKind(visitor, kind);
Expand Down

0 comments on commit ada5ee0

Please sign in to comment.