onivim/oni

Golang format, missing EOL at EOF

Open

#2570 opened on Sep 13, 2018

View on GitHub
 (3 comments) (0 reactions) (0 assignees)TypeScript (11,389 stars) (336 forks)batch import
0.3.8buggood first issue

Description

Oni Version: 966fd2ccb1cd2c39f2a78adf812cf0b0785cf34d Neovim Version (Linux only): v0.3.1 Operating System: macOs 10.13.6

Issue: golang format error

Expected behavior: format correctly

Actual behavior: no action and get error

Steps to reproduce: Hello. Recently , I try to use Oni , it is a good idea ! Oni get error when formatting golang code .

package main

import "fmt"

func main() {
	fmt.Println("oni")
}

default I try to look deep into this . I find go-langserver log

langserver-go: reading on stdin, writing on stdout
--> request #0: initialize: {"clientName":"oni","rootPath":"/Users/Bing/Golang/src/oni","rootUri":"file:///Users/Bing/Golang/src/oni","capabilities":{"workspace":{"applyEdit":true,"workspaceEdit":{"documentChanges":false},"didChangeConfiguration":{"dynamicRegistration":false},"didChangeWatchedFiles":{"dynamicRegistration":false},"symbol":{"dynamicRegistration":false},"executeCommand":{"dynamicRegistration":false}},"textDocument":{"synchronization":{"dynamicRegistration":false,"willSave":false,"willSaveWaitUntil":false,"didSave":true},"completion":{"dynamicRegistration":false,"completionItem":{"snippetSupport":true,"commitCharactersSupport":true,"documentationFormat":["plaintext"]},"completionItemKind":{},"contextSupport":false},"hover":{"dynamicRegistration":false,"contentFormat":["plaintext"]},"signatureHelp":{"dynamicRegistration":false,"signatureInformation":{"documentationFormat":["plaintext"]}},"references":{"dynamicRegistration":false},"documentSymbol":{"dynamicRegistration":false},"formatting":{"dynamicRegistration":false},"rangeFormatting":{"dynamicRegistration":false},"definition":{"dynamicRegistration":false},"codeAction":{"dynamicRegistration":false},"codeLens":{"dynamicRegistration":false},"rename":{"dynamicRegistration":false}}}}
Passing an initialize rootPath URI ("file:///Users/Bing/Golang/src/oni") is deprecated. Use rootUri instead.
<-- result #0: initialize: {"capabilities":{"textDocumentSync":2,"hoverProvider":true,"completionProvider":{"triggerCharacters":["."]},"signatureHelpProvider":{"triggerCharacters":["(",","]},"definitionProvider":true,"typeDefinitionProvider":true,"referencesProvider":true,"documentSymbolProvider":true,"workspaceSymbolProvider":true,"implementationProvider":true,"documentFormattingProvider":true,"xworkspaceReferencesProvider":true,"xdefinitionProvider":true,"xworkspaceSymbolByProperties":true}}
--> notif: textDocument/didOpen: {"textDocument":{"uri":"file:///Users/Bing/Golang/src/oni/main.go","languageId":"go","text":"package main\n\nimport \"fmt\"\n\nfunc main() {\n\tfmt.Println(\"oni\")\n}"}}
--> notif: textDocument/didOpen: {"textDocument":{"uri":"file:///Users/Bing/Golang/src/oni/main.go","languageId":"go","text":"package main\n\nimport \"fmt\"\n\nfunc main() {\n\tfmt.Println(\"oni\")\n}","version":2}}
--> notif: textDocument/didChange: {"textDocument":{"uri":"file:///Users/Bing/Golang/src/oni/main.go","version":2},"contentChanges":[{"text":"package main\n\nimport \"fmt\"\n\nfunc main() {\n\tfmt.Println(\"oni\")\n}"}]}
--> request #1: textDocument/hover: {"textDocument":{"uri":"file:///Users/Bing/Golang/src/oni/main.go"},"position":{"line":3,"character":0}}
<-- result #1: textDocument/hover: null
--> request #2: textDocument/formatting: {"textDocument":{"uri":"file:///Users/Bing/Golang/src/oni/main.go"}}
<-- result #2: textDocument/formatting: [{"range":{"start":{"line":7,"character":0},"end":{"line":7,"character":0}},"newText":"\n"}]

Then I try neovim with LanguageClient-neovim ,and format the same code .

langserver-go: reading on stdin, writing on stdout
--> request #9: initialize: {"capabilities":{"textDocument":{"completion":{"completionItem":{"snippetSupport":true}}},"workspace":{"applyEdit":true,"didChangeWatchedFiles":{"dynamicRegistration":true}}},"processId":93973,"rootPath":"/Users/Bing/Golang/src/oni","rootUri":"file:///Users/Bing/Golang/src/oni","trace":"off"}
Passing an initialize rootPath URI ("file:///Users/Bing/Golang/src/oni") is deprecated. Use rootUri instead.
<-- result #9: initialize: {"capabilities":{"textDocumentSync":2,"hoverProvider":true,"completionProvider":{"triggerCharacters":["."]},"signatureHelpProvider":{"triggerCharacters":["(",","]},"definitionProvider":true,"typeDefinitionProvider":true,"referencesProvider":true,"documentSymbolProvider":true,"workspaceSymbolProvider":true,"implementationProvider":true,"documentFormattingProvider":true,"xworkspaceReferencesProvider":true,"xdefinitionProvider":true,"xworkspaceSymbolByProperties":true}}
--> notif: initialized: {}
--> notif: textDocument/didOpen: {"textDocument":{"languageId":"go","text":"package main\n\nimport \"fmt\"\n\nfunc main() {\n\tfmt.Println(\"oni\")\n}\n","uri":"file:///Users/Bing/Golang/src/oni/main.go","version":0}}
--> request #19: textDocument/formatting: {"options":{"insertSpaces":false,"tabSize":4},"textDocument":{"uri":"file:///Users/Bing/Golang/src/oni/main.go"}}
<-- result #19: textDocument/formatting: null
--> notif: textDocument/didSave: {"textDocument":{"uri":"file:///Users/Bing/Golang/src/oni/main.go"}}

By comparing two logs .

oni
--> notif: textDocument/didOpen: {"textDocument":{"uri":"file:///Users/Bing/Golang/src/oni/main.go","languageId":"go","text":"package main\n\nimport \"fmt\"\n\nfunc main() {\n\tfmt.Println(\"oni\")\n}"}}

LCN
--> notif: textDocument/didOpen: {"textDocument":{"languageId":"go","text":"package main\n\nimport \"fmt\"\n\nfunc main() {\n\tfmt.Println(\"oni\")\n}\n","uri":"file:///Users/Bing/Golang/src/oni/main.go","version":0}}

It seems that oni loose the os.EOL when send text by textDocument/didOpen textDocument/didChange actions .

Oni first send text missing "\n", and go-langserver notify to insert a newline at the end , and range.start.line seems to out of nvim_buf_get_lines in applyTextEdit and get a null context which cause to substring undefined .

Contributor guide