Skip to content

Commit 504d169

Browse files
committed
feat: generate NodeType as enum and mapping to interface for better type hints
1 parent 7c693cd commit 504d169

File tree

5 files changed

+402
-11
lines changed

5 files changed

+402
-11
lines changed

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ import {
4747
FullyQualifiedScalarString,
4848
FullyQualifiedStmtEcho,
4949
NodeRetrieverHelpers,
50+
NodeType,
5051
NodeTypeInheritingFromNodeAbstract,
5152
} from '@rightcapital/php-parser';
5253

@@ -68,7 +69,7 @@ console.log(rootNodes);
6869
const echoNode =
6970
NodeRetrieverHelpers.findNodeByNodeType<FullyQualifiedStmtEcho>(
7071
rootNodes,
71-
'Stmt_Echo',
72+
NodeType.Stmt_Echo,
7273
);
7374

7475
// Get the specified node with type annotation
@@ -84,7 +85,7 @@ console.log(echoNode);
8485
const scalarStringNode =
8586
NodeRetrieverHelpers.findNodeByNodeType<FullyQualifiedScalarString>(
8687
echoNode!.exprs,
87-
'Scalar_String',
88+
NodeType.Scalar_String,
8889
);
8990
console.log(scalarStringNode?.value);
9091
// Hello
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"type": "minor",
3+
"comment": "feat: generate NodeType as enum and mapping to interface for better type hints",
4+
"packageName": "@rightcapital/php-parser",
5+
"email": "[email protected]",
6+
"dependentChangeType": "patch"
7+
}

src/php-parser/helpers/node-retriever-helpers.ts

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ import type { Namespace_ } from '../types/node/stmt/namespace';
99
import type { Property } from '../types/node/stmt/property';
1010
import type { Return_ } from '../types/node/stmt/return';
1111
import type { Use_ } from '../types/node/stmt/use';
12-
import type { NodeTypeInheritingFromNodeAbstract } from '../types/types';
12+
import {
13+
NodeType,
14+
type NodeTypeInheritingFromNodeAbstract,
15+
} from '../types/types';
1316

1417
export type IUseFullQualifiedNameParts = string[];
1518
export type IUses = {
@@ -37,11 +40,14 @@ export class NodeRetrieverHelpers {
3740
): Class_ {
3841
const namespaceNode = NodeRetrieverHelpers.findNodeByNodeType<Namespace_>(
3942
rootNode as INode[],
40-
'Stmt_Namespace',
43+
NodeType.Stmt_Namespace,
4144
);
4245

4346
if (namespaceNode?.stmts) {
44-
return this.findNodeByNodeType<Class_>(namespaceNode.stmts, 'Stmt_Class');
47+
return this.findNodeByNodeType<Class_>(
48+
namespaceNode.stmts,
49+
NodeType.Stmt_Class,
50+
);
4551
}
4652

4753
return undefined;
@@ -56,7 +62,7 @@ export class NodeRetrieverHelpers {
5662
if (classNode.stmts) {
5763
return this.filterNodeByNodeType<Property>(
5864
classNode.stmts,
59-
'Stmt_Property',
65+
NodeType.Stmt_Property,
6066
)
6167
.filter(
6268
/**
@@ -113,12 +119,12 @@ export class NodeRetrieverHelpers {
113119
): IUses {
114120
const namespaceNode = NodeRetrieverHelpers.findNodeByNodeType<Namespace_>(
115121
rootNode,
116-
'Stmt_Namespace',
122+
NodeType.Stmt_Namespace,
117123
);
118124

119125
if (namespaceNode?.stmts) {
120126
return Object.fromEntries(
121-
this.filterNodeByNodeType<Use_>(namespaceNode.stmts, 'Stmt_Use')
127+
this.filterNodeByNodeType<Use_>(namespaceNode.stmts, NodeType.Stmt_Use)
122128
.map((useNode) => useNode.uses[0].name.parts)
123129
.map((parts) => [parts.slice(-1), parts]),
124130
) as IUses;
@@ -133,7 +139,7 @@ export class NodeRetrieverHelpers {
133139
if (classNode.stmts) {
134140
const classMethodNodes = this.filterNodeByNodeType<ClassMethod>(
135141
classNode.stmts,
136-
'Stmt_ClassMethod',
142+
NodeType.Stmt_ClassMethod,
137143
);
138144

139145
const getTypeMethodNode = classMethodNodes.find(
@@ -143,7 +149,7 @@ export class NodeRetrieverHelpers {
143149
if (getTypeMethodNode) {
144150
const returnNode = this.findNodeByNodeType<Return_>(
145151
getTypeMethodNode.stmts,
146-
'Stmt_Return',
152+
NodeType.Stmt_Return,
147153
);
148154

149155
if (returnNode) {

src/php-parser/helpers/type-generation-helpers.ts

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { join } from 'path';
2-
import type { ICliContext } from '../generate-types';
2+
import type { ICliContext, IContextNodeItem } from '../generate-types';
33

44
export class TypeGenerationHelpers {
55
public static getGroupedTypeNameForNode(nodeName: string) {
@@ -48,6 +48,41 @@ ${importNodeNamesPart}
4848
${combinationTypesPart}
4949
5050
${exportNodeNamesPart}
51+
52+
${TypeGenerationHelpers.generateNodeTypeEnum(cliContext)}
5153
`;
5254
}
55+
56+
public static generateNodeTypeEnum(cliContext: ICliContext): string {
57+
const { allNodes } = cliContext;
58+
59+
const nodesThatHasNodeType: [string, IContextNodeItem][] = Object.values(
60+
allNodes,
61+
)
62+
.filter((node) => node.nodeType !== undefined && node.nodeType !== '')
63+
.map((node) => [node.nodeType, node]);
64+
const nodeEnum = `export enum NodeType {
65+
${nodesThatHasNodeType
66+
.map(([nodeType, _]) => {
67+
return ` ${nodeType} = '${nodeType}',`;
68+
})
69+
.join('\n')}
70+
}
71+
`;
72+
73+
const nodeTypeToInterfaceMap = `
74+
export interface NodeTypeToInterfaceMap {
75+
${nodesThatHasNodeType
76+
.map(([nodeType, node]) => {
77+
return ` [NodeType.${nodeType}]: ${node.name};`;
78+
})
79+
.join('\n')}
80+
}
81+
`;
82+
83+
return `
84+
${nodeEnum};
85+
${nodeTypeToInterfaceMap}
86+
`;
87+
}
5388
}

0 commit comments

Comments
 (0)