import { For, Show } from 'solid-js';
import type {
ConcreteError,
ConcreteErrorNode,
PartialConcreteSyntax,
PartialExpr,
PartialList,
PartialListItem,
} from '../../../languages/lisp';
import { LispExpr } from '../../../languages/lisp';
import { spanLabel } from '../../format';
import { HoverBlock } from '../../HoverBlock';
import { SpanChip } from '../../SpanChip';
import type { HoverTarget } from '../../types';
import { errorDetail, errorTitle } from './format';
export function StructureTree(props: {
program: PartialConcreteSyntax;
isValid: boolean;
errorCount: number;
onHover: (target: HoverTarget | undefined) => void;
}) {
return (
{(error) => }
{(expr, index) => (
)}
);
}
function ExprView(props: {
expr: PartialExpr;
label: string;
onHover: (target: HoverTarget | undefined) => void;
}) {
switch (props.expr.tag) {
case "number":
case "identifier":
return (
);
case "error-number":
case "error-identifier":
case "error-expression":
return (
);
case "list":
return ;
}
}
function ListView(props: {
list: PartialList;
label: string;
onHover: (target: HoverTarget | undefined) => void;
}) {
return (
{(close) => }
{(error) => }
{(item, index) => (
)}
);
}
function ListItemView(props: {
item: PartialListItem;
label: string;
onHover: (target: HoverTarget | undefined) => void;
}) {
if (props.item.tag === "error-list-separator") {
return (
);
}
return ;
}
function ConcreteErrorView(props: {
error: ConcreteError;
label: string;
onHover: (target: HoverTarget | undefined) => void;
}) {
return (
{(node, index) => (
)}
);
}
function ConcreteErrorNodeView(props: {
node: ConcreteErrorNode;
label: string;
onHover: (target: HoverTarget | undefined) => void;
}) {
return (
{errorTitle(props.node.error)}
{errorDetail(props.node.error)}
{(span) => }
);
}
function listLabel(tag: string): string {
return tag === "open-bracket" ? "square-list" : "round-list";
}
function delimiterLabel(list: PartialList): string {
return list.close ? `${list.open.tag} / ${list.close.tag}` : `${list.open.tag} / missing close`;
}