From c4930438fd3ab334b76d77ce92e976f2f37e489c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Balv=C3=ADn?= Date: Fri, 21 Aug 2026 00:20:37 +0200 Subject: [PATCH] refactor(lsp): use format package for document formatting Assisted-by: MiMo V2.5 Pro --- lsp/handlers.go | 89 ++----------------------------------------------- 1 file changed, 2 insertions(+), 87 deletions(-) diff --git a/lsp/handlers.go b/lsp/handlers.go index b1fee61..7cc276b 100644 --- a/lsp/handlers.go +++ b/lsp/handlers.go @@ -11,6 +11,7 @@ import ( "sourcedock.dev/petrbalvin/gasm-devkit/arch" "sourcedock.dev/petrbalvin/gasm-devkit/ast" + "sourcedock.dev/petrbalvin/gasm-devkit/format" "sourcedock.dev/petrbalvin/gasm-devkit/lexer" "sourcedock.dev/petrbalvin/gasm-devkit/parser" "sourcedock.dev/petrbalvin/gasm-devkit/token" @@ -211,11 +212,7 @@ func (s *Server) documentFormatting(p documentFormattingParams) []TextEdit { if text == "" { return nil } - f, _ := parser.Parse(uriPath(p.TextDocument.URI), text) - if f == nil { - return nil - } - formatted := formatFile(f) + formatted := format.Source(uriPath(p.TextDocument.URI), text) if formatted == text { return nil } @@ -260,88 +257,6 @@ func (s *Server) inlayHints(p inlayHintParams) []InlayHint { } // formatFile produces a canonical formatting of a parsed file. -func formatFile(f *ast.File) string { - var b strings.Builder - for i, d := range f.Decls { - if i > 0 { - b.WriteByte('\n') - } - switch dd := d.(type) { - case *ast.Include: - fmt.Fprintf(&b, "#include %s\n", dd.Header.Text) - case *ast.Preproc: - b.WriteString("#") - b.WriteString(dd.Raw) - b.WriteByte('\n') - case *ast.Text: - fmt.Fprintf(&b, "TEXT %s(SB), %s, $%d-%d\n", - symString(dd.Name), strings.Join(dd.Flags, "|"), frameVal(dd.Frame), argsVal(dd.Args)) - for _, stmt := range dd.Body { - switch st := stmt.(type) { - case *ast.Label: - fmt.Fprintf(&b, "%s:\n", st.Name.Text) - case *ast.Instr: - b.WriteByte('\t') - b.WriteString(st.Mnemonic.Text) - for j, op := range st.Operands { - if j > 0 { - b.WriteString(", ") - } - b.WriteString(op.Raw) - } - if st.Comment != "" { - b.WriteString(st.Comment) - } - b.WriteByte('\n') - } - } - case *ast.Globl: - fmt.Fprintf(&b, "GLOBL %s(SB), %s, $%d\n", - symString(dd.Name), strings.Join(dd.Flags, "|"), globlSize(dd.Size)) - case *ast.Data: - fmt.Fprintf(&b, "DATA %s+%d(SB)/%d, %s\n", - symString(dd.Name), dd.Name.Offset, dd.Width, dd.Value.Raw) - } - } - return b.String() -} - -func symString(sym *ast.Symbol) string { - if sym == nil { - return "" - } - s := "" - if sym.Pkg != "" { - s = sym.Pkg + "ยท" - } - s += sym.Name - if sym.Static { - s += "<>" - } - return s -} - -func frameVal(op *ast.Operand) int64 { - if op != nil && op.Imm.HasVal { - return op.Imm.Val - } - return 0 -} - -func argsVal(op *ast.Operand) int64 { - if op != nil && op.Imm.HasVal { - return op.Imm.Val - } - return 0 -} - -func globlSize(op *ast.Operand) int64 { - if op != nil && op.Imm.HasVal { - return op.Imm.Val - } - return 0 -} - // documentSymbols returns functions and their labels, plus global symbols. func (s *Server) documentSymbols(p documentSymbolParams) []DocumentSymbol { text := s.docs[p.TextDocument.URI]