diff --git a/src/app/components/generator/McdocRenderer.tsx b/src/app/components/generator/McdocRenderer.tsx
index 58f4d6d5..6727f4e8 100644
--- a/src/app/components/generator/McdocRenderer.tsx
+++ b/src/app/components/generator/McdocRenderer.tsx
@@ -8,7 +8,6 @@ import type { SimplifiedStructType } from '@spyglassmc/mcdoc/lib/runtime/checker
import { useCallback } from 'preact/hooks'
import type { TextDocument } from 'vscode-languageserver-textdocument'
import { useLocale } from '../../contexts/Locale.jsx'
-import type { AstEdit } from '../../services/Spyglass.js'
import { Octicon } from '../Octicon.jsx'
export interface McdocContext {
@@ -16,9 +15,11 @@ export interface McdocContext {
symbols: core.SymbolUtil,
}
+type MakeEdit = (edit: (range: core.Range) => JsonNode | undefined) => void
+
interface Props {
node: JsonNode | undefined
- makeEdit: (edit: AstEdit) => void
+ makeEdit: MakeEdit
ctx: McdocContext
}
export function McdocRoot({ node, makeEdit, ctx } : Props) {
@@ -90,18 +91,17 @@ function StringHead({ node, makeEdit }: Props) {
const value = JsonStringNode.is(node) ? node.value : undefined
const onChangeValue = useCallback((value: string) => {
- makeEdit(() => {
- replaceNode(node, (range, parent) => {
- const newNode: JsonStringNode = {
- type: 'json:string',
- range,
- options: json.parser.JsonStringOptions,
- value: value,
- valueMap: [{ inner: core.Range.create(0), outer: core.Range.create(range.start) }],
- parent,
- }
- return newNode
- })
+ makeEdit((range) => {
+ if (value.length === 0) {
+ return undefined
+ }
+ return {
+ type: 'json:string',
+ range,
+ options: json.parser.JsonStringOptions,
+ value: value,
+ valueMap: [{ inner: core.Range.create(0), outer: core.Range.create(range.start) }],
+ }
})
}, [node, makeEdit])
@@ -121,25 +121,21 @@ function NumericHead({ type, node, makeEdit }: NumericHeadProps) {
if (number !== undefined && Number.isNaN(number)) {
return
}
- makeEdit(() => {
+ makeEdit((range) => {
if (number === undefined) {
- removeNode(node)
- return
+ return undefined
}
- replaceNode(node, (range, parent) => {
- const newValue: core.FloatNode | core.LongNode = isFloat
- ? { type: 'float', range, value: number }
- : { type: 'long', range, value: BigInt(number) }
- const newNode: JsonNumberNode = {
- type: 'json:number',
- range,
- value: newValue,
- children: [newValue],
- parent,
- }
- newValue.parent = newNode
- return newNode
- })
+ const newValue: core.FloatNode | core.LongNode = isFloat
+ ? { type: 'float', range, value: number }
+ : { type: 'long', range, value: BigInt(number) }
+ const newNode: JsonNumberNode = {
+ type: 'json:number',
+ range,
+ value: newValue,
+ children: [newValue],
+ }
+ newValue.parent = newNode
+ return newNode
})
}, [isFloat, node, makeEdit])
@@ -150,19 +146,14 @@ function BooleanHead({ node, makeEdit }: Props) {
const value = node && JsonBooleanNode.is(node) ? node.value : undefined
const onSelect = useCallback((newValue: boolean) => {
- makeEdit(() => {
+ makeEdit((range) => {
if (value === newValue) {
- removeNode(node)
- } else {
- replaceNode(node, (range, parent) => {
- const newNode: JsonBooleanNode = {
- type: 'json:boolean',
- range,
- value: newValue,
- parent,
- }
- return newNode
- })
+ return undefined
+ }
+ return {
+ type: 'json:boolean',
+ range,
+ value: newValue,
}
})
}, [node, makeEdit, value])
@@ -188,23 +179,32 @@ function ListHead({ type, node, makeEdit, ctx }: ListHeadProps) {
const onAdd = useCallback(() => {
if (canAdd) {
- makeEdit(() => {
+ makeEdit((range) => {
const itemType: McdocType = type.kind === 'list' ? type.item
: type.kind === 'byte_array' ? { kind: 'byte' }
: type.kind === 'int_array' ? { kind: 'int' }
: type.kind === 'long_array' ? { kind: 'long' }
: { kind: 'any' }
- addNode(node, (range, parent) => {
- const newValue = getDefault(itemType, range, ctx)
- const newNode: core.ItemNode