Skip to content

Commit ce4936c

Browse files
authored
Allow passing NodeStacks to nested visitors (#285)
This PR adds an `options` objects to most core visitors (or refactors optional arguments into an `options` objects). Within this `options` object, it offers the ability for any visitor that uses a `NodeStack` to use the provided one instead of a brand new one. This enables visitors to call others visitors during their traversal whilst all sharing the same `NodeStack` and not losing track of where we are in the tree.
1 parent d1bab68 commit ce4936c

32 files changed

+303
-203
lines changed

.changeset/spicy-camels-tease.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'@codama/visitors-core': minor
3+
'@codama/visitors': minor
4+
---
5+
6+
Allow passing `NodeStacks` to nested visitors

packages/library/test/index.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ test('it exports visitors', () => {
1212

1313
test('it accepts visitors', () => {
1414
const codama = createFromRoot(rootNode(programNode({ name: 'myProgram', publicKey: '1111' })));
15-
const visitor = voidVisitor(['rootNode']);
15+
const visitor = voidVisitor({ keys: ['rootNode'] });
1616
const result = codama.accept(visitor) satisfies void;
1717
expect(typeof result).toBe('undefined');
1818
});

packages/renderers-js-umi/src/getRenderMapVisitor.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ export function getRenderMapVisitor(options: GetRenderMapOptions = {}): Visitor<
100100
});
101101
const typeManifestVisitor = getTypeManifestVisitor();
102102
const resolvedInstructionInputVisitor = getResolvedInstructionInputsVisitor();
103-
const byteSizeVisitor = getByteSizeVisitor(linkables, stack);
103+
const byteSizeVisitor = getByteSizeVisitor(linkables, { stack });
104104

105105
function getInstructionAccountType(account: ResolvedInstructionAccount): string {
106106
if (account.isPda && account.isSigner === false) return 'Pda';

packages/renderers-js-umi/src/getTypeManifestVisitor.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -85,14 +85,16 @@ export function getTypeManifestVisitor(input: {
8585
value: '',
8686
valueImports: new ImportMap(),
8787
}) as TypeManifest,
88-
[
89-
...REGISTERED_TYPE_NODE_KINDS,
90-
...REGISTERED_VALUE_NODE_KINDS,
91-
'definedTypeLinkNode',
92-
'definedTypeNode',
93-
'accountNode',
94-
'instructionNode',
95-
],
88+
{
89+
keys: [
90+
...REGISTERED_TYPE_NODE_KINDS,
91+
...REGISTERED_VALUE_NODE_KINDS,
92+
'definedTypeLinkNode',
93+
'definedTypeNode',
94+
'accountNode',
95+
'instructionNode',
96+
],
97+
},
9698
),
9799
v =>
98100
extendVisitor(v, {

packages/renderers-js/src/getRenderMapVisitor.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -136,10 +136,9 @@ export function getRenderMapVisitor(options: GetRenderMapOptions = {}) {
136136
};
137137

138138
return pipe(
139-
staticVisitor(
140-
() => new RenderMap(),
141-
['rootNode', 'programNode', 'pdaNode', 'accountNode', 'definedTypeNode', 'instructionNode'],
142-
),
139+
staticVisitor(() => new RenderMap(), {
140+
keys: ['rootNode', 'programNode', 'pdaNode', 'accountNode', 'definedTypeNode', 'instructionNode'],
141+
}),
143142
v =>
144143
extendVisitor(v, {
145144
visitAccount(node) {

packages/renderers-js/src/getTypeManifestVisitor.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,14 +58,16 @@ export function getTypeManifestVisitor(input: {
5858
strictType: fragment(''),
5959
value: fragment(''),
6060
}) as TypeManifest,
61-
[
62-
...REGISTERED_TYPE_NODE_KINDS,
63-
...REGISTERED_VALUE_NODE_KINDS,
64-
'definedTypeLinkNode',
65-
'definedTypeNode',
66-
'accountNode',
67-
'instructionNode',
68-
],
61+
{
62+
keys: [
63+
...REGISTERED_TYPE_NODE_KINDS,
64+
...REGISTERED_VALUE_NODE_KINDS,
65+
'definedTypeLinkNode',
66+
'definedTypeNode',
67+
'accountNode',
68+
'instructionNode',
69+
],
70+
},
6971
),
7072
visitor =>
7173
extendVisitor(visitor, {

packages/renderers-rust/src/getRenderMapVisitor.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,9 @@ export function getRenderMapVisitor(options: GetRenderMapOptions = {}) {
5353
const anchorTraits = options.anchorTraits ?? true;
5454

5555
return pipe(
56-
staticVisitor(
57-
() => new RenderMap(),
58-
['rootNode', 'programNode', 'instructionNode', 'accountNode', 'definedTypeNode'],
59-
),
56+
staticVisitor(() => new RenderMap(), {
57+
keys: ['rootNode', 'programNode', 'instructionNode', 'accountNode', 'definedTypeNode'],
58+
}),
6059
v =>
6160
extendVisitor(v, {
6261
visitAccount(node) {

packages/renderers-rust/src/getTypeManifestVisitor.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export function getTypeManifestVisitor(options: {
4444
...mergeManifests(values),
4545
type: values.map(v => v.type).join('\n'),
4646
}),
47-
[...REGISTERED_TYPE_NODE_KINDS, 'definedTypeLinkNode', 'definedTypeNode', 'accountNode'],
47+
{ keys: [...REGISTERED_TYPE_NODE_KINDS, 'definedTypeLinkNode', 'definedTypeNode', 'accountNode'] },
4848
),
4949
v =>
5050
extendVisitor(v, {

packages/visitors-core/src/bottomUpTransformerVisitor.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export type BottomUpNodeTransformerWithSelector = {
1717

1818
export function bottomUpTransformerVisitor<TNodeKind extends NodeKind = NodeKind>(
1919
transformers: (BottomUpNodeTransformer | BottomUpNodeTransformerWithSelector)[],
20-
nodeKeys?: TNodeKind[],
20+
options: { keys?: TNodeKind[]; stack?: NodeStack } = {},
2121
): Visitor<Node | null, TNodeKind> {
2222
const transformerFunctions = transformers.map((transformer): BottomUpNodeTransformer => {
2323
if (typeof transformer === 'function') return transformer;
@@ -27,9 +27,9 @@ export function bottomUpTransformerVisitor<TNodeKind extends NodeKind = NodeKind
2727
: node;
2828
});
2929

30-
const stack = new NodeStack();
30+
const stack = options.stack ?? new NodeStack();
3131
return pipe(
32-
identityVisitor(nodeKeys),
32+
identityVisitor(options),
3333
v =>
3434
interceptVisitor(v, (node, next) => {
3535
return transformerFunctions.reduce(

packages/visitors-core/src/deleteNodesVisitor.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { TopDownNodeTransformerWithSelector, topDownTransformerVisitor } from '.
55

66
export function deleteNodesVisitor<TNodeKind extends NodeKind = NodeKind>(
77
selectors: NodeSelector[],
8-
nodeKeys?: TNodeKind[],
8+
options?: Parameters<typeof topDownTransformerVisitor<TNodeKind>>[1],
99
) {
1010
return topDownTransformerVisitor<TNodeKind>(
1111
selectors.map(
@@ -14,6 +14,6 @@ export function deleteNodesVisitor<TNodeKind extends NodeKind = NodeKind>(
1414
transform: () => null,
1515
}),
1616
),
17-
nodeKeys,
17+
options,
1818
);
1919
}

0 commit comments

Comments
 (0)