/
ASTViewerTS.tsx
65 lines (59 loc) · 2.14 KB
/
ASTViewerTS.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import React, { useEffect, useState } from 'react';
import ASTViewer from './ast/ASTViewer';
import type { ASTViewerBaseProps, ASTViewerModelMap } from './ast/types';
import type { SourceFile } from 'typescript';
import { serialize } from './ast/serializer/serializer';
import { createTsSerializer } from './ast/serializer/serializerTS';
export interface ASTTsViewerProps extends ASTViewerBaseProps {
readonly value: SourceFile | string;
}
function extractEnum(
obj: Record<number, string | number>,
): Record<number, string> {
const result: Record<number, string> = {};
const keys = Object.entries(obj);
for (const [name, value] of keys) {
if (typeof value === 'number') {
if (!(value in result)) {
result[value] = name;
}
}
}
return result;
}
export default function ASTViewerTS({
value,
position,
onSelectNode,
}: ASTTsViewerProps): JSX.Element {
const [model, setModel] = useState<string | ASTViewerModelMap>('');
const [syntaxKind] = useState(() => extractEnum(window.ts.SyntaxKind));
const [nodeFlags] = useState(() => extractEnum(window.ts.NodeFlags));
const [tokenFlags] = useState(() => extractEnum(window.ts.TokenFlags));
const [modifierFlags] = useState(() => extractEnum(window.ts.ModifierFlags));
const [objectFlags] = useState(() => extractEnum(window.ts.ObjectFlags));
const [symbolFlags] = useState(() => extractEnum(window.ts.SymbolFlags));
const [flowFlags] = useState(() => extractEnum(window.ts.FlowFlags));
const [typeFlags] = useState(() => extractEnum(window.ts.TypeFlags));
useEffect(() => {
if (typeof value === 'string') {
setModel(value);
} else {
const scopeSerializer = createTsSerializer(
value,
syntaxKind,
['NodeFlags', nodeFlags],
['TokenFlags', tokenFlags],
['ModifierFlags', modifierFlags],
['ObjectFlags', objectFlags],
['SymbolFlags', symbolFlags],
['FlowFlags', flowFlags],
['TypeFlags', typeFlags],
);
setModel(serialize(value, scopeSerializer));
}
}, [value, syntaxKind]);
return (
<ASTViewer position={position} onSelectNode={onSelectNode} value={model} />
);
}