onivim/oni

Golang format, missing EOL at EOF

Open

#2570 aperta il 13 set 2018

Vedi su GitHub
 (3 commenti) (0 reazioni) (0 assegnatari)TypeScript (336 fork)batch import
0.3.8buggood first issue

Metriche repository

Star
 (11.389 star)
Metriche merge PR
 (Nessuna PR mergiata in 30 g)

Descrizione

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 .

Guida contributor