Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Deprecate 'ASTKindToNode' #3318

Merged
merged 1 commit into from Oct 18, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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