From b57f4ec5fb4cca8a1ef349dd007129c02448e09c Mon Sep 17 00:00:00 2001 From: Fred Sauer Date: Mon, 16 Feb 2026 22:40:54 -0800 Subject: [PATCH] debugHighlightTagsTooltip to see parser tags --- src/ide/views/debug.ts | 56 ++++++++++++++++++++++++++++++++++++++++ src/ide/views/editors.ts | 7 +++++ 2 files changed, 63 insertions(+) create mode 100644 src/ide/views/debug.ts diff --git a/src/ide/views/debug.ts b/src/ide/views/debug.ts new file mode 100644 index 00000000..4056e838 --- /dev/null +++ b/src/ide/views/debug.ts @@ -0,0 +1,56 @@ +import { LRLanguage, StreamLanguage, language, syntaxTree } from "@codemirror/language"; +import { hoverTooltip } from "@codemirror/view"; +import { getStyleTags } from "@lezer/highlight"; + +// Tooltip to show tags, useful for theme and parser development. +export const debugHighlightTagsTooltip = hoverTooltip((view, pos, side) => { + let tree = syntaxTree(view.state).resolveInner(pos, side); + let style = getStyleTags(tree); + let tagList = ""; + if (style) { + for (let tag of style.tags) { + tagList += tag.set.join(" < ") + "\n"; + } + } + + let lang = view.state.facet(language); + let parserType = (lang instanceof LRLanguage) ? "Lezer LRLanguage" : + (lang instanceof StreamLanguage) ? "StreamLanguage" : "Unknown"; + let treeName = (lang instanceof LRLanguage) ? "AST " : + (lang instanceof StreamLanguage) ? "Token " : "Name "; + + return { + pos: pos, + above: true, + arrow: true, + create(view) { + let dom = document.createElement("div"); + // Zero size element, so tooltip quickly dismisses when mouse moves over it, force + // CodeMirror's getBoundingClientRect() in isInTooltip() to always return false. + dom.style.overflow = "visible"; + dom.style.height = "0"; + dom.style.width = "0"; + // Tooltip content. + let inner = document.createElement("div"); + inner.className = "cm-debug-tooltip"; + inner.textContent = `Parser: ${parserType}\n${treeName}: ${tree.name}\nTags : ${tagList}`; + inner.style.whiteSpace = "pre-wrap"; + inner.style.fontFamily = "monospace"; + inner.style.background = "#333"; + inner.style.color = "white"; + inner.style.padding = "2px 8px"; + inner.style.borderRadius = "4px"; + inner.style.fontSize = "12px"; + inner.style.border = "1px solid #555"; + inner.style.pointerEvents = "none"; + inner.style.position = "absolute"; + inner.style.bottom = "0"; + inner.style.width = "max-content"; + dom.appendChild(inner); + return { dom }; + } + }; +}, { + hoverTime: 10, + hideOnChange: true, +}); \ No newline at end of file diff --git a/src/ide/views/editors.ts b/src/ide/views/editors.ts index acb01b11..418b9bba 100644 --- a/src/ide/views/editors.ts +++ b/src/ide/views/editors.ts @@ -19,10 +19,15 @@ import { editorTheme } from "../../themes/editorTheme"; import { mbo } from "../../themes/mbo"; import { current_project, lastDebugState, platform, qs, runToPC } from "../ui"; import { isMobileDevice, ProjectView } from "./baseviews"; +import { debugHighlightTagsTooltip } from "./debug"; import { createTextTransformFilterEffect, textTransformFilterCompartment } from "./filters"; import { breakpointMarkers, bytes, clock, currentPcMarker, errorMarkers, offset } from "./gutter"; import { currentPc, errorMessages, highlightLines, showValue } from "./visuals"; +// TODO: make this an easily toggleable debug setting. +// Debug syntax highlighting. Useful when developing new parsers and themes. +const debugHighlightTags = false; + // helper function for editor function jumpToLine(ed: EditorView, i: number) { const line = ed.state.doc.line(i); @@ -194,6 +199,7 @@ export class SourceEditor implements ProjectView { parser || [], theme, editorTheme, + debugHighlightTags ? debugHighlightTagsTooltip : [], EditorState.tabSize.of(8), indentUnit.of(" "), keymap.of([indentWithTab]), @@ -563,6 +569,7 @@ export class DisassemblerView implements ProjectView { drawSelection(), highlightActiveLine(), highlightSelectionMatches(), + debugHighlightTags ? debugHighlightTagsTooltip : [], disassemblyTheme, cobalt, currentPc.field,