Skip to content

Commit 3c5c57d

Browse files
committed
nicer AST view
1 parent 58fc779 commit 3c5c57d

File tree

2 files changed

+67
-58
lines changed

2 files changed

+67
-58
lines changed

packages/repl/src/lib/Output/AstNode.svelte

Lines changed: 66 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,17 @@
99
interface Props {
1010
key?: string;
1111
value: Ast;
12-
root?: boolean;
1312
path_nodes?: Ast[];
1413
autoscroll?: boolean;
14+
depth?: number;
1515
}
1616
17-
let { key = '', value, root = false, path_nodes = [], autoscroll = true }: Props = $props();
17+
let { key = '', value, path_nodes = [], autoscroll = true, depth = 0 }: Props = $props();
1818
1919
const { toggleable } = get_repl_context();
2020
21-
let collapsed = $state(!root);
21+
let root = depth === 0;
22+
let open = $state(root);
2223
2324
let list_item_el = $state() as HTMLLIElement;
2425
@@ -34,22 +35,8 @@
3435
);
3536
let key_text = $derived(key ? `${key}:` : '');
3637
37-
let preview_text = $state('');
38-
3938
$effect(() => {
40-
if (is_primitive || !collapsed) return;
41-
42-
if (is_array) {
43-
if (!('length' in value)) return;
44-
45-
preview_text = `[ ${value.length} element${value.length === 1 ? '' : 's'} ]`;
46-
} else {
47-
preview_text = `{ ${Object.keys(value).join(', ')} }`;
48-
}
49-
});
50-
51-
$effect(() => {
52-
collapsed = !path_nodes.includes(value);
39+
open = path_nodes.includes(value);
5340
});
5441
5542
$effect(() => {
@@ -95,30 +82,56 @@
9582
onfocus={handle_mark_text}
9683
onmouseleave={handle_unmark_text}
9784
>
98-
{#if !root && !is_primitive}
99-
<button class="ast-toggle" class:open={!collapsed} onclick={() => (collapsed = !collapsed)}>
100-
{key_text}
101-
</button>
102-
{:else if key_text}
103-
<span>{key_text}</span>
104-
{/if}
105-
106-
{#if is_primitive}
107-
<span class="token {typeof value}">
108-
{JSON.stringify(value)}
85+
{#if is_primitive || (is_array && value.length === 0)}
86+
<span class="value">
87+
{#if key_text}
88+
<span>{key_text}</span>
89+
{/if}
90+
91+
{#if value == undefined}
92+
<span class="token comment">{String(value)}</span>
93+
{:else}
94+
<span class="token {typeof value}">
95+
{JSON.stringify(value)}
96+
</span>
97+
{/if}
10998
</span>
110-
{:else if collapsed && !root}
111-
<button class="preview" onclick={() => (collapsed = !collapsed)}>
112-
{preview_text}
113-
</button>
11499
{:else}
115-
<span>{is_array ? '[' : '{'}</span>
116-
<ul>
117-
{#each Object.entries(value) as [k, v]}
118-
<AstNode key={is_array ? '' : k} value={v} {path_nodes} {autoscroll} />
119-
{/each}
120-
</ul>
121-
<span>{is_array ? ']' : '}'}</span>
100+
<details bind:open>
101+
<summary>
102+
{#if key}
103+
<span class="key">{key}</span>:
104+
{/if}
105+
106+
{#if is_array}
107+
[{#if !open}
108+
<span class="token comment">...</span>]
109+
<span class="token comment">({value.length})</span>
110+
{/if}
111+
{:else}
112+
{#if value.type}
113+
<span class="token comment">{value.type}</span>
114+
{/if}
115+
{'{'}{#if !open}<span class="token comment">...</span>}{/if}
116+
{/if}
117+
</summary>
118+
119+
{#if is_array}
120+
<ul>
121+
{#each value as v}
122+
<AstNode value={v} {path_nodes} {autoscroll} depth={depth + 1} />
123+
{/each}
124+
</ul>
125+
<span>]</span>
126+
{:else}
127+
<ul>
128+
{#each Object.entries(value) as [k, v]}
129+
<AstNode key={k} value={v} {path_nodes} {autoscroll} depth={depth + 1} />
130+
{/each}
131+
</ul>
132+
<span>}</span>
133+
{/if}
134+
</details>
122135
{/if}
123136
</li>
124137

@@ -137,26 +150,18 @@
137150
background-color: var(--sk-highlight-color);
138151
}
139152
140-
button {
141-
&:hover {
142-
text-decoration: underline;
143-
}
144-
}
145-
146-
.ast-toggle {
153+
summary {
147154
position: relative;
148-
}
155+
display: block;
156+
cursor: pointer;
149157
150-
.ast-toggle::before {
151-
content: '\25B6';
152-
position: absolute;
153-
bottom: 0;
154-
left: -1.3rem;
155-
opacity: 0.7;
156-
}
158+
.key {
159+
text-decoration: underline;
160+
}
157161
158-
.ast-toggle.open::before {
159-
content: '\25BC';
162+
&:hover .key {
163+
text-decoration: underline;
164+
}
160165
}
161166
162167
.token {
@@ -170,4 +175,8 @@
170175
.token.number {
171176
color: var(--sk-code-number);
172177
}
178+
179+
.token.comment {
180+
color: var(--sk-code-comment);
181+
}
173182
</style>

packages/repl/src/lib/Output/AstView.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
<code>
6666
{#if typeof ast === 'object'}
6767
<ul>
68-
<AstNode value={ast} {path_nodes} {autoscroll} root />
68+
<AstNode value={ast} {path_nodes} {autoscroll} />
6969
</ul>
7070
{:else}
7171
<p>No AST available</p>

0 commit comments

Comments
 (0)