onivim/oni

Golang format, missing EOL at EOF

Open

#2.570 aberto em 13 de set. de 2018

Ver no GitHub
 (3 comments) (0 reactions) (0 assignees)TypeScript (336 forks)batch import
0.3.8buggood first issue

Métricas do repositório

Stars
 (11.389 stars)
Métricas de merge de PR
 (Nenhuma PRs mesclada em 30d)

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 .

Guia do colaborador