Skip to content

Instantly share code, notes, and snippets.

@puremourning
Created August 18, 2022 19:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save puremourning/6a531965b8a6ef2bcde713e6cf9f2ae2 to your computer and use it in GitHub Desktop.
Save puremourning/6a531965b8a6ef2bcde713e6cf9f2ae2 to your computer and use it in GitHub Desktop.
gopls log
[Trace - 20:52:09.411 PM] Sending request 'initialize - (1)'.
Params: {"capabilities":{"textDocument":{"codeAction":{"codeActionLiteralSupport":{"codeActionKind":{"valueSet":["","quickfix","refactor","refactor.extract","refactor.inline","refactor.rewrite","source","source.organizeImports"]}}},"completion":{"completionItem":{"documentationFormat":["plaintext","markdown"]},"completionItemKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]}},"documentSymbol":{"hierarchicalDocumentSymbolSupport":false,"labelSupport":false,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]}},"hover":{"contentFormat":["plaintext","markdown"]},"inlay_hint":{},"semanticTokens":{"augmentSyntaxTokens":true,"formats":["relative"],"requests":{"full":{"delta":false},"range":true},"tokenModifiers":[],"tokenTypes":["namespace","type","class","enum","interface","struct","typeParameter","parameter","variable","property","enumMember","event","function","method","member","macro","keyword","modifier","comment","string","number","regexp","operator"]},"signatureHelp":{"signatureInformation":{"documentationFormat":["plaintext","markdown"],"parameterInformation":{"labelOffsetSupport":true}}},"synchronization":{"didSave":true}},"workspace":{"applyEdit":true,"configuration":true,"didChangeWatchedFiles":{"dynamicRegistration":true},"symbol":{"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]}},"workspaceEdit":{"documentChanges":true},"workspaceFolders":true}},"initializationOptions":{"hints":{"assignVariableTypes":true,"compositeLiteralFields":true,"compositeLiteralTypes":true,"constantValues":true,"functionTypeParameters":true,"parameterNames":true,"rangeVariableTypes":true},"hoverKind":"Structured","semanticTokens":true},"processId":50969,"rootPath":"/Users/ben/Development/YouCompleteMe/golang-tools","rootUri":"file:///Users/ben/Development/YouCompleteMe/golang-tools","workspaceFolders":[{"name":"golang-tools","uri":"file:///Users/ben/Development/YouCompleteMe/golang-tools"}]}
[Trace - 20:52:09.411 PM] Received response 'initialize - (1)' in 0ms.
Result: {"capabilities":{"textDocumentSync":{"openClose":true,"change":2,"save":{}},"completionProvider":{"triggerCharacters":["."],"completionItem":{}},"hoverProvider":true,"signatureHelpProvider":{"triggerCharacters":["(",","]},"definitionProvider":true,"typeDefinitionProvider":true,"implementationProvider":true,"referencesProvider":true,"documentHighlightProvider":true,"documentSymbolProvider":true,"codeActionProvider":{"codeActionKinds":["quickfix","refactor.extract","refactor.rewrite","source.fixAll","source.organizeImports"]},"codeLensProvider":{},"documentLinkProvider":{},"workspaceSymbolProvider":true,"documentFormattingProvider":true,"documentOnTypeFormattingProvider":{"firstTriggerCharacter":""},"renameProvider":true,"foldingRangeProvider":true,"executeCommandProvider":{"commands":["gopls.add_dependency","gopls.add_import","gopls.apply_fix","gopls.check_upgrades","gopls.edit_go_directive","gopls.gc_details","gopls.generate","gopls.generate_gopls_mod","gopls.go_get_package","gopls.list_imports","gopls.list_known_packages","gopls.regenerate_cgo","gopls.remove_dependency","gopls.run_tests","gopls.run_vulncheck_exp","gopls.start_debugging","gopls.test","gopls.tidy","gopls.toggle_gc_details","gopls.update_go_sum","gopls.upgrade_dependency","gopls.vendor"]},"callHierarchyProvider":true,"workspace":{"workspaceFolders":{"supported":true,"changeNotifications":"workspace/didChangeWorkspaceFolders"}},"inlayHintProvider":{}},"serverInfo":{"name":"gopls","version":"{\"GoVersion\":\"go1.19\",\"Path\":\"golang.org/x/tools/gopls\",\"Main\":{\"Path\":\"golang.org/x/tools/gopls\",\"Version\":\"v0.9.4\",\"Sum\":\"h1:YhHOxVi++ILnY+QnH9FGtRKZZrunSaR7OW8/dCp7bBk=\",\"Replace\":null},\"Deps\":[{\"Path\":\"github.com/BurntSushi/toml\",\"Version\":\"v1.2.0\",\"Sum\":\"h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0=\",\"Replace\":null},{\"Path\":\"github.com/google/go-cmp\",\"Version\":\"v0.5.8\",\"Sum\":\"h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=\",\"Replace\":null},{\"Path\":\"github.com/sergi/go-diff\",\"Version\":\"v1.1.0\",\"Sum\":\"h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=\",\"Replace\":null},{\"Path\":\"golang.org/x/exp/typeparams\",\"Version\":\"v0.0.0-20220722155223-a9213eeb770e\",\"Sum\":\"h1:7Xs2YCOpMlNqSQSmrrnhlzBXIE/bpMecZplbLePTJvE=\",\"Replace\":null},{\"Path\":\"golang.org/x/mod\",\"Version\":\"v0.6.0-dev.0.20220419223038-86c51ed26bb4\",\"Sum\":\"h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s=\",\"Replace\":null},{\"Path\":\"golang.org/x/sync\",\"Version\":\"v0.0.0-20220722155255-886fb9371eb4\",\"Sum\":\"h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw=\",\"Replace\":null},{\"Path\":\"golang.org/x/sys\",\"Version\":\"v0.0.0-20220722155257-8c9f86f7a55f\",\"Sum\":\"h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s=\",\"Replace\":null},{\"Path\":\"golang.org/x/text\",\"Version\":\"v0.3.7\",\"Sum\":\"h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=\",\"Replace\":null},{\"Path\":\"golang.org/x/tools\",\"Version\":\"v0.1.13-0.20220812184215-3f9b119300de\",\"Sum\":\"h1:b68wxF4nfQjj1XTRHtjVjCximbhAwjztuzDEFGU+n9o=\",\"Replace\":null},{\"Path\":\"golang.org/x/vuln\",\"Version\":\"v0.0.0-20220725105440-4151a5aca1df\",\"Sum\":\"h1:BkeW9/QJhcigekDUPS9N9bIb0v7gPKKmLYeczVAqr2s=\",\"Replace\":null},{\"Path\":\"honnef.co/go/tools\",\"Version\":\"v0.3.2\",\"Sum\":\"h1:ytYb4rOqyp1TSa2EPvNVwtPQJctSELKaMyLfqNP4+34=\",\"Replace\":null},{\"Path\":\"mvdan.cc/gofumpt\",\"Version\":\"v0.3.1\",\"Sum\":\"h1:avhhrOmv0IuvQVK7fvwV91oFSGAk5/6Po8GXTzICeu8=\",\"Replace\":null},{\"Path\":\"mvdan.cc/xurls/v2\",\"Version\":\"v2.4.0\",\"Sum\":\"h1:tzxjVAj+wSBmDcF6zBB7/myTy3gX9xvi8Tyr28AuQgc=\",\"Replace\":null}],\"Settings\":[{\"Key\":\"-compiler\",\"Value\":\"gc\"},{\"Key\":\"CGO_ENABLED\",\"Value\":\"1\"},{\"Key\":\"CGO_CFLAGS\",\"Value\":\"\"},{\"Key\":\"CGO_CPPFLAGS\",\"Value\":\"\"},{\"Key\":\"CGO_CXXFLAGS\",\"Value\":\"\"},{\"Key\":\"CGO_LDFLAGS\",\"Value\":\"\"},{\"Key\":\"GOARCH\",\"Value\":\"arm64\"},{\"Key\":\"GOOS\",\"Value\":\"darwin\"}],\"Version\":\"v0.9.4\"}"}}
[Trace - 20:52:09.412 PM] Sending notification 'initialized'.
Params: {}
[Trace - 20:52:09.412 PM] Sending notification 'workspace/didChangeConfiguration'.
Params: {"settings":{"hints":{"assignVariableTypes":true,"compositeLiteralFields":true,"compositeLiteralTypes":true,"constantValues":true,"functionTypeParameters":true,"parameterNames":true,"rangeVariableTypes":true},"hoverKind":"Structured","semanticTokens":true}}
[Trace - 20:52:09.412 PM] Received notification 'window/showMessage'.
Params: {"type":4,"message":"Loading packages..."}
[Trace - 20:52:09.412 PM] Received request 'workspace/configuration - (1)'.
Params: {"items":[{"scopeUri":"file:///Users/ben/Development/YouCompleteMe/golang-tools","section":"gopls"}]}
[Trace - 20:52:09.413 PM] Sending notification 'textDocument/didOpen'.
Params: {"textDocument":{"languageId":"go","text":"// Copyright 2020 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage lsp\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"go/ast\"\n\t\"go/token\"\n\t\"go/types\"\n\t\"log\"\n\t\"path/filepath\"\n\t\"sort\"\n\t\"strings\"\n\t\"time\"\n\n\t\"golang.org/x/tools/internal/event\"\n\t\"golang.org/x/tools/internal/lsp/protocol\"\n\t\"golang.org/x/tools/internal/lsp/safetoken\"\n\t\"golang.org/x/tools/internal/lsp/source\"\n\t\"golang.org/x/tools/internal/lsp/template\"\n\t\"golang.org/x/tools/internal/typeparams\"\n)\n\n// The LSP says that errors for the semantic token requests should only be returned\n// for exceptions (a word not otherwise defined). This code treats a too-large file\n// as an exception. On parse errors, the code does what it can.\n\n// reject full semantic token requests for large files\nconst maxFullFileSize int = 100000\n\n// to control comprehensive logging of decisions (gopls semtok foo.go > /dev/null shows log output)\n// semDebug should NEVER be true in checked-in code\nconst semDebug = false\n\nfunc (s *Server) semanticTokensFull(ctx context.Context, p *protocol.SemanticTokensParams) (*protocol.SemanticTokens, error) {\n\tret, err := s.computeSemanticTokens(ctx, p.TextDocument, nil)\n\treturn ret, err\n}\n\nfunc (s *Server) semanticTokensFullDelta(ctx context.Context, p *protocol.SemanticTokensDeltaParams) (interface{}, error) {\n\treturn nil, fmt.Errorf(\"implement SemanticTokensFullDelta\")\n}\n\nfunc (s *Server) semanticTokensRange(ctx context.Context, p *protocol.SemanticTokensRangeParams) (*protocol.SemanticTokens, error) {\n\tret, err := s.computeSemanticTokens(ctx, p.TextDocument, &p.Range)\n\treturn ret, err\n}\n\nfunc (s *Server) semanticTokensRefresh(ctx context.Context) error {\n\t// in the code, but not in the protocol spec\n\treturn fmt.Errorf(\"implement SemanticTokensRefresh\")\n}\n\nfunc (s *Server) computeSemanticTokens(ctx context.Context, td protocol.TextDocumentIdentifier, rng *protocol.Range) (*protocol.SemanticTokens, error) {\n\tans := protocol.SemanticTokens{\n\t\tData: []uint32{},\n\t}\n\tsnapshot, fh, ok, release, err := s.beginFileRequest(ctx, td.URI, source.UnknownKind)\n\tdefer release()\n\tif !ok {\n\t\treturn nil, err\n\t}\n\tvv := snapshot.View()\n\tif !vv.Options().SemanticTokens {\n\t\t// return an error, so if the option changes\n\t\t// the client won't remember the wrong answer\n\t\treturn nil, fmt.Errorf(\"semantictokens are disabled\")\n\t}\n\tkind := snapshot.View().FileKind(fh)\n\tif kind == source.Tmpl {\n\t\t// this is a little cumbersome to avoid both exporting 'encoded' and its methods\n\t\t// and to avoid import cycles\n\t\te := &encoded{\n\t\t\tctx: ctx,\n\t\t\trng: rng,\n\t\t\ttokTypes: s.session.Options().SemanticTypes,\n\t\t\ttokMods: s.session.Options().SemanticMods,\n\t\t}\n\t\tadd := func(line, start uint32, len uint32) {\n\t\t\te.add(line, start, len, tokMacro, nil)\n\t\t}\n\t\tdata := func() []uint32 {\n\t\t\treturn e.Data()\n\t\t}\n\t\treturn template.SemanticTokens(ctx, snapshot, fh.URI(), add, data)\n\t}\n\tif kind != source.Go {\n\t\treturn nil, nil\n\t}\n\tpkg, err := snapshot.PackageForFile(ctx, fh.URI(), source.TypecheckFull, source.WidestPackage)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tpgf, err := pkg.File(fh.URI())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\t// ignore pgf.ParseErr. Do what we can.\n\tif rng == nil && len(pgf.Src) > maxFullFileSize {\n\t\terr := fmt.Errorf(\"semantic tokens: file %s too large for full (%d>%d)\",\n\t\t\tfh.URI().Filename(), len(pgf.Src), maxFullFileSize)\n\t\treturn nil, err\n\t}\n\te := &encoded{\n\t\tctx: ctx,\n\t\tpgf: pgf,\n\t\trng: rng,\n\t\tti: pkg.GetTypesInfo(),\n\t\tpkg: pkg,\n\t\tfset: snapshot.FileSet(),\n\t\ttokTypes: s.session.Options().SemanticTypes,\n\t\ttokMods: s.session.Options().SemanticMods,\n\t\tnoStrings: vv.Options().NoSemanticString,\n\t\tnoNumbers: vv.Options().NoSemanticNumber,\n\t}\n\tif err := e.init(); err != nil {\n\t\t// e.init should never return an error, unless there's some\n\t\t// seemingly impossible race condition\n\t\treturn nil, err\n\t}\n\te.semantics()\n\tans.Data = e.Data()\n\t// For delta requests, but we've never seen any.\n\tans.ResultID = fmt.Sprintf(\"%v\", time.Now())\n\treturn &ans, nil\n}\n\nfunc (e *encoded) semantics() {\n\tf := e.pgf.File\n\t// may not be in range, but harmless\n\te.token(f.Package, len(\"package\"), tokKeyword, nil)\n\te.token(f.Name.NamePos, len(f.Name.Name), tokNamespace, nil)\n\tinspect := func(n ast.Node) bool {\n\t\treturn e.inspector(n)\n\t}\n\tfor _, d := range f.Decls {\n\t\t// only look at the decls that overlap the range\n\t\tstart, end := d.Pos(), d.End()\n\t\tif end <= e.start || start >= e.end {\n\t\t\tcontinue\n\t\t}\n\t\tast.Inspect(d, inspect)\n\t}\n\tfor _, cg := range f.Comments {\n\t\tfor _, c := range cg.List {\n\t\t\tif !strings.Contains(c.Text, \"\\n\") {\n\t\t\t\te.token(c.Pos(), len(c.Text), tokComment, nil)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\te.multiline(c.Pos(), c.End(), c.Text, tokComment)\n\t\t}\n\t}\n}\n\ntype tokenType string\n\nconst (\n\ttokNamespace tokenType = \"namespace\"\n\ttokType tokenType = \"type\"\n\ttokInterface tokenType = \"interface\"\n\ttokTypeParam tokenType = \"typeParameter\"\n\ttokParameter tokenType = \"parameter\"\n\ttokVariable tokenType = \"variable\"\n\ttokMethod tokenType = \"method\"\n\ttokFunction tokenType = \"function\"\n\ttokKeyword tokenType = \"keyword\"\n\ttokComment tokenType = \"comment\"\n\ttokString tokenType = \"string\"\n\ttokNumber tokenType = \"number\"\n\ttokOperator tokenType = \"operator\"\n\n\ttokMacro tokenType = \"macro\" // for templates\n)\n\nfunc (e *encoded) token(start token.Pos, leng int, typ tokenType, mods []string) {\n\n\tif !start.IsValid() {\n\t\t// This is not worth reporting\n\t\treturn\n\t}\n\tif start >= e.end || start+token.Pos(leng) <= e.start {\n\t\treturn\n\t}\n\t// want a line and column from start (in LSP coordinates)\n\t// [//line directives should be ignored]\n\trng := source.NewMappedRange(e.pgf.Tok, e.pgf.Mapper, start, start+token.Pos(leng))\n\tlspRange, err := rng.Range()\n\tif err != nil {\n\t\t// possibly a //line directive. TODO(pjw): fix this somehow\n\t\t// \"column mapper is for file...instead of...\"\n\t\t// \"line is beyond end of file...\"\n\t\t// see line 116 of internal/span/token.go which uses Position not PositionFor\n\t\t// (it is too verbose to print the error on every token. some other RPC will fail)\n\t\t// event.Error(e.ctx, \"failed to convert to range\", err)\n\t\treturn\n\t}\n\tif lspRange.End.Line != lspRange.Start.Line {\n\t\t// this happens if users are typing at the end of the file, but report nothing\n\t\treturn\n\t}\n\t// token is all on one line\n\tlength := lspRange.End.Character - lspRange.Start.Character\n\te.add(lspRange.Start.Line, lspRange.Start.Character, length, typ, mods)\n}\n\nfunc (e *encoded) add(line, start uint32, len uint32, tok tokenType, mod []string) {\n\tx := semItem{line, start, len, tok, mod}\n\te.items = append(e.items, x)\n}\n\n// semItem represents a token found walking the parse tree\ntype semItem struct {\n\tline, start uint32\n\tlen uint32\n\ttypeStr tokenType\n\tmods []string\n}\n\ntype encoded struct {\n\t// the generated data\n\titems []semItem\n\n\tnoStrings bool\n\tnoNumbers bool\n\n\tctx context.Context\n\ttokTypes, tokMods []string\n\tpgf *source.ParsedGoFile\n\trng *protocol.Range\n\tti *types.Info\n\tpkg source.Package\n\tfset *token.FileSet\n\t// allowed starting and ending token.Pos, set by init\n\t// used to avoid looking at declarations not in range\n\tstart, end token.Pos\n\t// path from the root of the parse tree, used for debugging\n\tstack []ast.Node\n}\n\n// convert the stack to a string, for debugging\nfunc (e *encoded) strStack() string {\n\tmsg := []string{\"[\"}\n\tfor i := len(e.stack) - 1; i >= 0; i-- {\n\t\ts := e.stack[i]\n\t\tmsg = append(msg, fmt.Sprintf(\"%T\", s)[5:])\n\t}\n\tif len(e.stack) > 0 {\n\t\tloc := e.stack[len(e.stack)-1].Pos()\n\t\tif !safetoken.InRange(e.pgf.Tok, loc) {\n\t\t\tmsg = append(msg, fmt.Sprintf(\"invalid position %v for %s\", loc, e.pgf.URI))\n\t\t} else if safetoken.InRange(e.pgf.Tok, loc) {\n\t\t\tadd := e.pgf.Tok.PositionFor(loc, false)\n\t\t\tnm := filepath.Base(add.Filename)\n\t\t\tmsg = append(msg, fmt.Sprintf(\"(%s:%d,col:%d)\", nm, add.Line, add.Column))\n\t\t} else {\n\t\t\tmsg = append(msg, fmt.Sprintf(\"(loc %d out of range)\", loc))\n\t\t}\n\t}\n\tmsg = append(msg, \"]\")\n\treturn strings.Join(msg, \" \")\n}\n\n// find the line in the source\nfunc (e *encoded) srcLine(x ast.Node) string {\n\tfile := e.pgf.Tok\n\tline := file.Line(x.Pos())\n\tstart, err := safetoken.Offset(file, file.LineStart(line))\n\tif err != nil {\n\t\treturn \"\"\n\t}\n\tend := start\n\tfor ; end < len(e.pgf.Src) && e.pgf.Src[end] != '\\n'; end++ {\n\n\t}\n\tans := e.pgf.Src[start:end]\n\treturn string(ans)\n}\n\nfunc (e *encoded) inspector(n ast.Node) bool {\n\tpop := func() {\n\t\te.stack = e.stack[:len(e.stack)-1]\n\t}\n\tif n == nil {\n\t\tpop()\n\t\treturn true\n\t}\n\te.stack = append(e.stack, n)\n\tswitch x := n.(type) {\n\tcase *ast.ArrayType:\n\tcase *ast.AssignStmt:\n\t\te.token(x.TokPos, len(x.Tok.String()), tokOperator, nil)\n\tcase *ast.BasicLit:\n\t\tif strings.Contains(x.Value, \"\\n\") {\n\t\t\t// has to be a string\n\t\t\te.multiline(x.Pos(), x.End(), x.Value, tokString)\n\t\t\tbreak\n\t\t}\n\t\tln := len(x.Value)\n\t\twhat := tokNumber\n\t\tif x.Kind == token.STRING {\n\t\t\twhat = tokString\n\t\t}\n\t\te.token(x.Pos(), ln, what, nil)\n\tcase *ast.BinaryExpr:\n\t\te.token(x.OpPos, len(x.Op.String()), tokOperator, nil)\n\tcase *ast.BlockStmt:\n\tcase *ast.BranchStmt:\n\t\te.token(x.TokPos, len(x.Tok.String()), tokKeyword, nil)\n\t\t// There's no semantic encoding for labels\n\tcase *ast.CallExpr:\n\t\tif x.Ellipsis != token.NoPos {\n\t\t\te.token(x.Ellipsis, len(\"...\"), tokOperator, nil)\n\t\t}\n\tcase *ast.CaseClause:\n\t\tiam := \"case\"\n\t\tif x.List == nil {\n\t\t\tiam = \"default\"\n\t\t}\n\t\te.token(x.Case, len(iam), tokKeyword, nil)\n\tcase *ast.ChanType:\n\t\t// chan | chan <- | <- chan\n\t\tswitch {\n\t\tcase x.Arrow == token.NoPos:\n\t\t\te.token(x.Begin, len(\"chan\"), tokKeyword, nil)\n\t\tcase x.Arrow == x.Begin:\n\t\t\te.token(x.Arrow, 2, tokOperator, nil)\n\t\t\tpos := e.findKeyword(\"chan\", x.Begin+2, x.Value.Pos())\n\t\t\te.token(pos, len(\"chan\"), tokKeyword, nil)\n\t\tcase x.Arrow != x.Begin:\n\t\t\te.token(x.Begin, len(\"chan\"), tokKeyword, nil)\n\t\t\te.token(x.Arrow, 2, tokOperator, nil)\n\t\t}\n\tcase *ast.CommClause:\n\t\tiam := len(\"case\")\n\t\tif x.Comm == nil {\n\t\t\tiam = len(\"default\")\n\t\t}\n\t\te.token(x.Case, iam, tokKeyword, nil)\n\tcase *ast.CompositeLit:\n\tcase *ast.DeclStmt:\n\tcase *ast.DeferStmt:\n\t\te.token(x.Defer, len(\"defer\"), tokKeyword, nil)\n\tcase *ast.Ellipsis:\n\t\te.token(x.Ellipsis, len(\"...\"), tokOperator, nil)\n\tcase *ast.EmptyStmt:\n\tcase *ast.ExprStmt:\n\tcase *ast.Field:\n\tcase *ast.FieldList:\n\tcase *ast.ForStmt:\n\t\te.token(x.For, len(\"for\"), tokKeyword, nil)\n\tcase *ast.FuncDecl:\n\tcase *ast.FuncLit:\n\tcase *ast.FuncType:\n\t\tif x.Func != token.NoPos {\n\t\t\te.token(x.Func, len(\"func\"), tokKeyword, nil)\n\t\t}\n\tcase *ast.GenDecl:\n\t\te.token(x.TokPos, len(x.Tok.String()), tokKeyword, nil)\n\tcase *ast.GoStmt:\n\t\te.token(x.Go, len(\"go\"), tokKeyword, nil)\n\tcase *ast.Ident:\n\t\te.ident(x)\n\tcase *ast.IfStmt:\n\t\te.token(x.If, len(\"if\"), tokKeyword, nil)\n\t\tif x.Else != nil {\n\t\t\t// x.Body.End() or x.Body.End()+1, not that it matters\n\t\t\tpos := e.findKeyword(\"else\", x.Body.End(), x.Else.Pos())\n\t\t\te.token(pos, len(\"else\"), tokKeyword, nil)\n\t\t}\n\tcase *ast.ImportSpec:\n\t\te.importSpec(x)\n\t\tpop()\n\t\treturn false\n\tcase *ast.IncDecStmt:\n\t\te.token(x.TokPos, len(x.Tok.String()), tokOperator, nil)\n\tcase *ast.IndexExpr:\n\tcase *typeparams.IndexListExpr: // accommodate generics\n\tcase *ast.InterfaceType:\n\t\te.token(x.Interface, len(\"interface\"), tokKeyword, nil)\n\tcase *ast.KeyValueExpr:\n\tcase *ast.LabeledStmt:\n\tcase *ast.MapType:\n\t\te.token(x.Map, len(\"map\"), tokKeyword, nil)\n\tcase *ast.ParenExpr:\n\tcase *ast.RangeStmt:\n\t\te.token(x.For, len(\"for\"), tokKeyword, nil)\n\t\t// x.TokPos == token.NoPos is legal (for range foo {})\n\t\toffset := x.TokPos\n\t\tif offset == token.NoPos {\n\t\t\toffset = x.For\n\t\t}\n\t\tpos := e.findKeyword(\"range\", offset, x.X.Pos())\n\t\te.token(pos, len(\"range\"), tokKeyword, nil)\n\tcase *ast.ReturnStmt:\n\t\te.token(x.Return, len(\"return\"), tokKeyword, nil)\n\tcase *ast.SelectStmt:\n\t\te.token(x.Select, len(\"select\"), tokKeyword, nil)\n\tcase *ast.SelectorExpr:\n\tcase *ast.SendStmt:\n\t\te.token(x.Arrow, len(\"<-\"), tokOperator, nil)\n\tcase *ast.SliceExpr:\n\tcase *ast.StarExpr:\n\t\te.token(x.Star, len(\"*\"), tokOperator, nil)\n\tcase *ast.StructType:\n\t\te.token(x.Struct, len(\"struct\"), tokKeyword, nil)\n\tcase *ast.SwitchStmt:\n\t\te.token(x.Switch, len(\"switch\"), tokKeyword, nil)\n\tcase *ast.TypeAssertExpr:\n\t\tif x.Type == nil {\n\t\t\tpos := e.findKeyword(\"type\", x.Lparen, x.Rparen)\n\t\t\te.token(pos, len(\"type\"), tokKeyword, nil)\n\t\t}\n\tcase *ast.TypeSpec:\n\tcase *ast.TypeSwitchStmt:\n\t\te.token(x.Switch, len(\"switch\"), tokKeyword, nil)\n\tcase *ast.UnaryExpr:\n\t\te.token(x.OpPos, len(x.Op.String()), tokOperator, nil)\n\tcase *ast.ValueSpec:\n\t// things only seen with parsing or type errors, so ignore them\n\tcase *ast.BadDecl, *ast.BadExpr, *ast.BadStmt:\n\t\treturn true\n\t// not going to see these\n\tcase *ast.File, *ast.Package:\n\t\te.unexpected(fmt.Sprintf(\"implement %T %s\", x, e.pgf.Tok.PositionFor(x.Pos(), false)))\n\t// other things we knowingly ignore\n\tcase *ast.Comment, *ast.CommentGroup:\n\t\tpop()\n\t\treturn false\n\tdefault:\n\t\te.unexpected(fmt.Sprintf(\"failed to implement %T\", x))\n\t}\n\treturn true\n}\n\nfunc (e *encoded) ident(x *ast.Ident) {\n\tif e.ti == nil {\n\t\twhat, mods := e.unkIdent(x)\n\t\tif what != \"\" {\n\t\t\te.token(x.Pos(), len(x.String()), what, mods)\n\t\t}\n\t\tif semDebug {\n\t\t\tlog.Printf(\" nil %s/nil/nil %q %v %s\", x.String(), what, mods, e.strStack())\n\t\t}\n\t\treturn\n\t}\n\tdef := e.ti.Defs[x]\n\tif def != nil {\n\t\twhat, mods := e.definitionFor(x, def)\n\t\tif what != \"\" {\n\t\t\te.token(x.Pos(), len(x.String()), what, mods)\n\t\t}\n\t\tif semDebug {\n\t\t\tlog.Printf(\" for %s/%T/%T got %s %v (%s)\", x.String(), def, def.Type(), what, mods, e.strStack())\n\t\t}\n\t\treturn\n\t}\n\tuse := e.ti.Uses[x]\n\ttok := func(pos token.Pos, lng int, tok tokenType, mods []string) {\n\t\te.token(pos, lng, tok, mods)\n\t\tq := \"nil\"\n\t\tif use != nil {\n\t\t\tq = fmt.Sprintf(\"%T\", use.Type())\n\t\t}\n\t\tif semDebug {\n\t\t\tlog.Printf(\" use %s/%T/%s got %s %v (%s)\", x.String(), use, q, tok, mods, e.strStack())\n\t\t}\n\t}\n\n\tswitch y := use.(type) {\n\tcase nil:\n\t\twhat, mods := e.unkIdent(x)\n\t\tif what != \"\" {\n\t\t\ttok(x.Pos(), len(x.String()), what, mods)\n\t\t} else if semDebug {\n\t\t\t// tok() wasn't called, so didn't log\n\t\t\tlog.Printf(\" nil %s/%T/nil %q %v (%s)\", x.String(), use, what, mods, e.strStack())\n\t\t}\n\t\treturn\n\tcase *types.Builtin:\n\t\ttok(x.NamePos, len(x.Name), tokFunction, []string{\"defaultLibrary\"})\n\tcase *types.Const:\n\t\tmods := []string{\"readonly\"}\n\t\ttt := y.Type()\n\t\tif _, ok := tt.(*types.Basic); ok {\n\t\t\ttok(x.Pos(), len(x.String()), tokVariable, mods)\n\t\t\tbreak\n\t\t}\n\t\tif ttx, ok := tt.(*types.Named); ok {\n\t\t\tif x.String() == \"iota\" {\n\t\t\t\te.unexpected(fmt.Sprintf(\"iota:%T\", ttx))\n\t\t\t}\n\t\t\tif _, ok := ttx.Underlying().(*types.Basic); ok {\n\t\t\t\ttok(x.Pos(), len(x.String()), tokVariable, mods)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\te.unexpected(fmt.Sprintf(\"%q/%T\", x.String(), tt))\n\t\t}\n\t\t// can this happen? Don't think so\n\t\te.unexpected(fmt.Sprintf(\"%s %T %#v\", x.String(), tt, tt))\n\tcase *types.Func:\n\t\ttok(x.Pos(), len(x.Name), tokFunction, nil)\n\tcase *types.Label:\n\t\t// nothing to map it to\n\tcase *types.Nil:\n\t\t// nil is a predeclared identifier\n\t\ttok(x.Pos(), len(\"nil\"), tokVariable, []string{\"readonly\", \"defaultLibrary\"})\n\tcase *types.PkgName:\n\t\ttok(x.Pos(), len(x.Name), tokNamespace, nil)\n\tcase *types.TypeName: // could be a tokTpeParam\n\t\tvar mods []string\n\t\tif _, ok := y.Type().(*types.Basic); ok {\n\t\t\tmods = []string{\"defaultLibrary\"}\n\t\t} else if _, ok := y.Type().(*typeparams.TypeParam); ok {\n\t\t\ttok(x.Pos(), len(x.String()), tokTypeParam, mods)\n\t\t\tbreak\n\t\t}\n\t\ttok(x.Pos(), len(x.String()), tokType, mods)\n\tcase *types.Var:\n\t\tif isSignature(y) {\n\t\t\ttok(x.Pos(), len(x.Name), tokFunction, nil)\n\t\t} else if _, ok := y.Type().(*typeparams.TypeParam); ok {\n\t\t\ttok(x.Pos(), len(x.Name), tokTypeParam, nil)\n\t\t} else {\n\t\t\ttok(x.Pos(), len(x.Name), tokVariable, nil)\n\t\t}\n\tdefault:\n\t\t// can't happen\n\t\tif use == nil {\n\t\t\tmsg := fmt.Sprintf(\"%#v/%#v %#v %#v\", x, x.Obj, e.ti.Defs[x], e.ti.Uses[x])\n\t\t\te.unexpected(msg)\n\t\t}\n\t\tif use.Type() != nil {\n\t\t\te.unexpected(fmt.Sprintf(\"%s %T/%T,%#v\", x.String(), use, use.Type(), use))\n\t\t} else {\n\t\t\te.unexpected(fmt.Sprintf(\"%s %T\", x.String(), use))\n\t\t}\n\t}\n}\n\nfunc isSignature(use types.Object) bool {\n\tif true {\n\t\treturn false //PJW: fix after generics seem ok\n\t}\n\tif _, ok := use.(*types.Var); !ok {\n\t\treturn false\n\t}\n\tv := use.Type()\n\tif v == nil {\n\t\treturn false\n\t}\n\tif _, ok := v.(*types.Signature); ok {\n\t\treturn true\n\t}\n\treturn false\n}\n\n// both e.ti.Defs and e.ti.Uses are nil. use the parse stack.\n// a lot of these only happen when the package doesn't compile\n// but in that case it is all best-effort from the parse tree\nfunc (e *encoded) unkIdent(x *ast.Ident) (tokenType, []string) {\n\tdef := []string{\"definition\"}\n\tn := len(e.stack) - 2 // parent of Ident\n\tif n < 0 {\n\t\te.unexpected(\"no stack?\")\n\t\treturn \"\", nil\n\t}\n\tswitch nd := e.stack[n].(type) {\n\tcase *ast.BinaryExpr, *ast.UnaryExpr, *ast.ParenExpr, *ast.StarExpr,\n\t\t*ast.IncDecStmt, *ast.SliceExpr, *ast.ExprStmt, *ast.IndexExpr,\n\t\t*ast.ReturnStmt, *ast.ChanType, *ast.SendStmt,\n\t\t*ast.ForStmt, // possibly incomplete\n\t\t*ast.IfStmt, /* condition */\n\t\t*ast.KeyValueExpr: // either key or value\n\t\treturn tokVariable, nil\n\tcase *typeparams.IndexListExpr: // generic?\n\t\treturn tokVariable, nil\n\tcase *ast.Ellipsis:\n\t\treturn tokType, nil\n\tcase *ast.CaseClause:\n\t\tif n-2 >= 0 {\n\t\t\tif _, ok := e.stack[n-2].(*ast.TypeSwitchStmt); ok {\n\t\t\t\treturn tokType, nil\n\t\t\t}\n\t\t}\n\t\treturn tokVariable, nil\n\tcase *ast.ArrayType:\n\t\tif x == nd.Len {\n\t\t\t// or maybe a Type Param, but we can't just from the parse tree\n\t\t\treturn tokVariable, nil\n\t\t} else {\n\t\t\treturn tokType, nil\n\t\t}\n\tcase *ast.MapType:\n\t\treturn tokType, nil\n\tcase *ast.CallExpr:\n\t\tif x == nd.Fun {\n\t\t\treturn tokFunction, nil\n\t\t}\n\t\treturn tokVariable, nil\n\tcase *ast.SwitchStmt:\n\t\treturn tokVariable, nil\n\tcase *ast.TypeAssertExpr:\n\t\tif x == nd.X {\n\t\t\treturn tokVariable, nil\n\t\t} else if x == nd.Type {\n\t\t\treturn tokType, nil\n\t\t}\n\tcase *ast.ValueSpec:\n\t\tfor _, p := range nd.Names {\n\t\t\tif p == x {\n\t\t\t\treturn tokVariable, def\n\t\t\t}\n\t\t}\n\t\tfor _, p := range nd.Values {\n\t\t\tif p == x {\n\t\t\t\treturn tokVariable, nil\n\t\t\t}\n\t\t}\n\t\treturn tokType, nil\n\tcase *ast.SelectorExpr: // e.ti.Selections[nd] is nil, so no help\n\t\tif n-1 >= 0 {\n\t\t\tif ce, ok := e.stack[n-1].(*ast.CallExpr); ok {\n\t\t\t\t// ... CallExpr SelectorExpr Ident (_.x())\n\t\t\t\tif ce.Fun == nd && nd.Sel == x {\n\t\t\t\t\treturn tokFunction, nil\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn tokVariable, nil\n\tcase *ast.AssignStmt:\n\t\tfor _, p := range nd.Lhs {\n\t\t\t// x := ..., or x = ...\n\t\t\tif p == x {\n\t\t\t\tif nd.Tok != token.DEFINE {\n\t\t\t\t\tdef = nil\n\t\t\t\t}\n\t\t\t\treturn tokVariable, def\n\t\t\t}\n\t\t}\n\t\t// RHS, = x\n\t\treturn tokVariable, nil\n\tcase *ast.TypeSpec: // it's a type if it is either the Name or the Type\n\t\tif x == nd.Type {\n\t\t\tdef = nil\n\t\t}\n\t\treturn tokType, def\n\tcase *ast.Field:\n\t\t// ident could be type in a field, or a method in an interface type, or a variable\n\t\tif x == nd.Type {\n\t\t\treturn tokType, nil\n\t\t}\n\t\tif n-2 >= 0 {\n\t\t\t_, okit := e.stack[n-2].(*ast.InterfaceType)\n\t\t\t_, okfl := e.stack[n-1].(*ast.FieldList)\n\t\t\tif okit && okfl {\n\t\t\t\treturn tokMethod, def\n\t\t\t}\n\t\t}\n\t\treturn tokVariable, nil\n\tcase *ast.LabeledStmt, *ast.BranchStmt:\n\t\t// nothing to report\n\tcase *ast.CompositeLit:\n\t\tif nd.Type == x {\n\t\t\treturn tokType, nil\n\t\t}\n\t\treturn tokVariable, nil\n\tcase *ast.RangeStmt:\n\t\tif nd.Tok != token.DEFINE {\n\t\t\tdef = nil\n\t\t}\n\t\treturn tokVariable, def\n\tcase *ast.FuncDecl:\n\t\treturn tokFunction, def\n\tdefault:\n\t\tmsg := fmt.Sprintf(\"%T undexpected: %s %s%q\", nd, x.Name, e.strStack(), e.srcLine(x))\n\t\te.unexpected(msg)\n\t}\n\treturn \"\", nil\n}\n\nfunc isDeprecated(n *ast.CommentGroup) bool {\n\tif n == nil {\n\t\treturn false\n\t}\n\tfor _, c := range n.List {\n\t\tif strings.HasPrefix(c.Text, \"// Deprecated\") {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (e *encoded) definitionFor(x *ast.Ident, def types.Object) (tokenType, []string) {\n\t// PJW: def == types.Label? probably a nothing\n\t// PJW: look into replaceing these syntactic tests with types more generally\n\tmods := []string{\"definition\"}\n\tfor i := len(e.stack) - 1; i >= 0; i-- {\n\t\ts := e.stack[i]\n\t\tswitch y := s.(type) {\n\t\tcase *ast.AssignStmt, *ast.RangeStmt:\n\t\t\tif x.Name == \"_\" {\n\t\t\t\treturn \"\", nil // not really a variable\n\t\t\t}\n\t\t\treturn tokVariable, mods\n\t\tcase *ast.GenDecl:\n\t\t\tif isDeprecated(y.Doc) {\n\t\t\t\tmods = append(mods, \"deprecated\")\n\t\t\t}\n\t\t\tif y.Tok == token.CONST {\n\t\t\t\tmods = append(mods, \"readonly\")\n\t\t\t}\n\t\t\treturn tokVariable, mods\n\t\tcase *ast.FuncDecl:\n\t\t\t// If x is immediately under a FuncDecl, it is a function or method\n\t\t\tif i == len(e.stack)-2 {\n\t\t\t\tif isDeprecated(y.Doc) {\n\t\t\t\t\tmods = append(mods, \"deprecated\")\n\t\t\t\t}\n\t\t\t\tif y.Recv != nil {\n\t\t\t\t\treturn tokMethod, mods\n\t\t\t\t}\n\t\t\t\treturn tokFunction, mods\n\t\t\t}\n\t\t\t// if x < ... < FieldList < FuncDecl, this is the receiver, a variable\n\t\t\tif _, ok := e.stack[i+1].(*ast.FieldList); ok {\n\t\t\t\treturn tokVariable, nil\n\t\t\t}\n\t\t\t// if x < ... < FieldList < FuncType < FuncDecl, this is a param\n\t\t\treturn tokParameter, mods\n\t\tcase *ast.FuncType:\n\t\t\treturn tokParameter, mods\n\t\tcase *ast.InterfaceType:\n\t\t\treturn tokMethod, mods\n\t\tcase *ast.TypeSpec:\n\t\t\t// GenDecl/Typespec/FuncType/FieldList/Field/Ident\n\t\t\t// (type A func(b uint64)) (err error)\n\t\t\t// b and err should not be tokType, but tokVaraible\n\t\t\t// and in GenDecl/TpeSpec/StructType/FieldList/Field/Ident\n\t\t\t// (type A struct{b uint64}\n\t\t\t// but on type B struct{C}), C is a type, but is not being defined.\n\t\t\t// GenDecl/TypeSpec/FieldList/Field/Ident is a typeParam\n\t\t\tif _, ok := e.stack[i+1].(*ast.FieldList); ok {\n\t\t\t\treturn tokTypeParam, mods\n\t\t\t}\n\t\t\tfldm := e.stack[len(e.stack)-2]\n\t\t\tif fld, ok := fldm.(*ast.Field); ok {\n\t\t\t\t// if len(fld.names) == 0 this is a tokType, being used\n\t\t\t\tif len(fld.Names) == 0 {\n\t\t\t\t\treturn tokType, nil\n\t\t\t\t}\n\t\t\t\treturn tokVariable, mods\n\t\t\t}\n\t\t\treturn tokType, mods\n\t\t}\n\t}\n\t// can't happen\n\tmsg := fmt.Sprintf(\"failed to find the decl for %s\", e.pgf.Tok.PositionFor(x.Pos(), false))\n\te.unexpected(msg)\n\treturn \"\", []string{\"\"}\n}\n\nfunc (e *encoded) multiline(start, end token.Pos, val string, tok tokenType) {\n\tf := e.fset.File(start)\n\t// the hard part is finding the lengths of lines. include the \\n\n\tleng := func(line int) int {\n\t\tn := f.LineStart(line)\n\t\tif line >= f.LineCount() {\n\t\t\treturn f.Size() - int(n)\n\t\t}\n\t\treturn int(f.LineStart(line+1) - n)\n\t}\n\tspos := e.fset.PositionFor(start, false)\n\tepos := e.fset.PositionFor(end, false)\n\tsline := spos.Line\n\teline := epos.Line\n\t// first line is from spos.Column to end\n\te.token(start, leng(sline)-spos.Column, tok, nil) // leng(sline)-1 - (spos.Column-1)\n\tfor i := sline + 1; i < eline; i++ {\n\t\t// intermediate lines are from 1 to end\n\t\te.token(f.LineStart(i), leng(i)-1, tok, nil) // avoid the newline\n\t}\n\t// last line is from 1 to epos.Column\n\te.token(f.LineStart(eline), epos.Column-1, tok, nil) // columns are 1-based\n}\n\n// findKeyword finds a keyword rather than guessing its location\nfunc (e *encoded) findKeyword(keyword string, start, end token.Pos) token.Pos {\n\toffset := int(start) - e.pgf.Tok.Base()\n\tlast := int(end) - e.pgf.Tok.Base()\n\tbuf := e.pgf.Src\n\tidx := bytes.Index(buf[offset:last], []byte(keyword))\n\tif idx != -1 {\n\t\treturn start + token.Pos(idx)\n\t}\n\t//(in unparsable programs: type _ <-<-chan int)\n\te.unexpected(fmt.Sprintf(\"not found:%s %v\", keyword, e.fset.PositionFor(start, false)))\n\treturn token.NoPos\n}\n\nfunc (e *encoded) init() error {\n\te.start = token.Pos(e.pgf.Tok.Base())\n\te.end = e.start + token.Pos(e.pgf.Tok.Size())\n\tif e.rng == nil {\n\t\treturn nil\n\t}\n\tspan, err := e.pgf.Mapper.RangeSpan(*e.rng)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"range span (%w) error for %s\", err, e.pgf.File.Name)\n\t}\n\te.end = e.start + token.Pos(span.End().Offset())\n\te.start += token.Pos(span.Start().Offset())\n\treturn nil\n}\n\nfunc (e *encoded) Data() []uint32 {\n\t// binary operators, at least, will be out of order\n\tsort.Slice(e.items, func(i, j int) bool {\n\t\tif e.items[i].line != e.items[j].line {\n\t\t\treturn e.items[i].line < e.items[j].line\n\t\t}\n\t\treturn e.items[i].start < e.items[j].start\n\t})\n\ttypeMap, modMap := e.maps()\n\t// each semantic token needs five values\n\t// (see Integer Encoding for Tokens in the LSP spec)\n\tx := make([]uint32, 5*len(e.items))\n\tvar j int\n\tvar last semItem\n\tfor i := 0; i < len(e.items); i++ {\n\t\titem := e.items[i]\n\t\ttyp, ok := typeMap[item.typeStr]\n\t\tif !ok {\n\t\t\tcontinue // client doesn't want typeStr\n\t\t}\n\t\tif item.typeStr == tokString && e.noStrings {\n\t\t\tcontinue\n\t\t}\n\t\tif item.typeStr == tokNumber && e.noNumbers {\n\t\t\tcontinue\n\t\t}\n\t\tif j == 0 {\n\t\t\tx[0] = e.items[0].line\n\t\t} else {\n\t\t\tx[j] = item.line - last.line\n\t\t}\n\t\tx[j+1] = item.start\n\t\tif j > 0 && x[j] == 0 {\n\t\t\tx[j+1] = item.start - last.start\n\t\t}\n\t\tx[j+2] = item.len\n\t\tx[j+3] = uint32(typ)\n\t\tmask := 0\n\t\tfor _, s := range item.mods {\n\t\t\t// modMap[s] is 0 if the client doesn't want this modifier\n\t\t\tmask |= modMap[s]\n\t\t}\n\t\tx[j+4] = uint32(mask)\n\t\tj += 5\n\t\tlast = item\n\t}\n\treturn x[:j]\n}\n\nfunc (e *encoded) importSpec(d *ast.ImportSpec) {\n\t// a local package name or the last component of the Path\n\tif d.Name != nil {\n\t\tnm := d.Name.String()\n\t\tif nm != \"_\" && nm != \".\" {\n\t\t\te.token(d.Name.Pos(), len(nm), tokNamespace, nil)\n\t\t}\n\t\treturn // don't mark anything for . or _\n\t}\n\tval := d.Path.Value\n\tif len(val) < 2 || val[0] != '\"' || val[len(val)-1] != '\"' {\n\t\t// avoid panics on imports without a properly quoted string\n\t\treturn\n\t}\n\tnm := val[1 : len(val)-1] // remove surrounding \"s\n\t// Import strings are implementation defined. Try to match with parse information.\n\tx, err := e.pkg.GetImport(nm)\n\tif err != nil {\n\t\t// unexpected, but impact is that maybe some import is not colored\n\t\treturn\n\t}\n\t// expect that nm is x.PkgPath and that x.Name() is a component of it\n\tif x.PkgPath() != nm {\n\t\t// don't know how or what to color (if this can happen at all)\n\t\treturn\n\t}\n\t// this is not a precise test: imagine \"github.com/nasty/v/v2\"\n\tj := strings.LastIndex(nm, x.Name())\n\tif j == -1 {\n\t\t// name doesn't show up, for whatever reason, so nothing to report\n\t\treturn\n\t}\n\tstart := d.Path.Pos() + 1 + token.Pos(j) // skip the initial quote\n\te.token(start, len(x.Name()), tokNamespace, nil)\n}\n\n// log unexpected state\nfunc (e *encoded) unexpected(msg string) {\n\tif semDebug {\n\t\tpanic(msg)\n\t}\n\tevent.Error(e.ctx, e.strStack(), errors.New(msg))\n}\n\n// SemType returns a string equivalent of the type, for gopls semtok\nfunc SemType(n int) string {\n\ttokTypes := SemanticTypes()\n\ttokMods := SemanticModifiers()\n\tif n >= 0 && n < len(tokTypes) {\n\t\treturn tokTypes[n]\n\t}\n\treturn fmt.Sprintf(\"?%d[%d,%d]?\", n, len(tokTypes), len(tokMods))\n}\n\n// SemMods returns the []string equivalent of the mods, for gopls semtok.\nfunc SemMods(n int) []string {\n\ttokMods := SemanticModifiers()\n\tmods := []string{}\n\tfor i := 0; i < len(tokMods); i++ {\n\t\tif (n & (1 << uint(i))) != 0 {\n\t\t\tmods = append(mods, tokMods[i])\n\t\t}\n\t}\n\treturn mods\n}\n\nfunc (e *encoded) maps() (map[tokenType]int, map[string]int) {\n\ttmap := make(map[tokenType]int)\n\tmmap := make(map[string]int)\n\tfor i, t := range e.tokTypes {\n\t\ttmap[tokenType(t)] = i\n\t}\n\tfor i, m := range e.tokMods {\n\t\tmmap[m] = 1 << uint(i) // go 1.12 compatibility\n\t}\n\treturn tmap, mmap\n}\n\n// SemanticTypes to use in case there is no client, as in the command line, or tests\nfunc SemanticTypes() []string {\n\treturn semanticTypes[:]\n}\n\n// SemanticModifiers to use in case there is no client.\nfunc SemanticModifiers() []string {\n\treturn semanticModifiers[:]\n}\n\nvar (\n\tsemanticTypes = [...]string{\n\t\t\"namespace\", \"type\", \"class\", \"enum\", \"interface\",\n\t\t\"struct\", \"typeParameter\", \"parameter\", \"variable\", \"property\", \"enumMember\",\n\t\t\"event\", \"function\", \"method\", \"macro\", \"keyword\", \"modifier\", \"comment\",\n\t\t\"string\", \"number\", \"regexp\", \"operator\",\n\t}\n\tsemanticModifiers = [...]string{\n\t\t\"declaration\", \"definition\", \"readonly\", \"static\",\n\t\t\"deprecated\", \"abstract\", \"async\", \"modification\", \"documentation\", \"defaultLibrary\",\n\t}\n)\n","uri":"file:///Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/semantic.go","version":1}}
[Trace - 20:52:09.413 PM] Sending response 'workspace/configuration - (1)' in 0ms.
Result: [{"hints":{"assignVariableTypes":true,"compositeLiteralFields":true,"compositeLiteralTypes":true,"constantValues":true,"functionTypeParameters":true,"parameterNames":true,"rangeVariableTypes":true},"hoverKind":"Structured","semanticTokens":true}]
[Trace - 20:52:09.414 PM] Sending request 'textDocument/inlayHint - (2)'.
Params: {"range":{"end":{"character":0,"line":925},"start":{"character":0,"line":797}},"textDocument":{"uri":"file:///Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/semantic.go"}}
[Trace - 20:52:09.441 PM] Received notification 'window/logMessage'.
Params: {"type":3,"message":"2022/08/18 20:52:09 go env for /Users/ben/Development/YouCompleteMe/golang-tools\n(root /Users/ben/Development/YouCompleteMe/golang-tools)\n(go version go version go1.19 darwin/arm64)\n(valid build configuration = true)\n(build flags: [])\nGOSUMDB=sum.golang.org\nGOMODCACHE=/Users/ben/go/pkg/mod\nGONOPROXY=\nGOPRIVATE=\nGOFLAGS=-modcacherw\nGOINSECURE=\nGOMOD=/Users/ben/Development/YouCompleteMe/golang-tools/go.mod\nGOPATH=/Users/ben/go\nGONOSUMDB=\nGOCACHE=/Users/ben/Library/Caches/go-build\nGOROOT=/opt/homebrew/Cellar/go/1.19/libexec\nGOWORK=\nGOPROXY=https://proxy.golang.org,direct\nGO111MODULE=\n\n"}
[Trace - 20:52:09.751 PM] Received notification 'window/logMessage'.
Params: {"type":3,"message":"2022/08/18 20:52:09 go/packages.Load #1\n\tsnapshot=0\n\tdirectory=/Users/ben/Development/YouCompleteMe/golang-tools\n\tquery=[builtin golang.org/x/tools/...]\n\tpackages=571\n"}
[Trace - 20:52:09.754 PM] Received notification 'window/logMessage'.
Params: {"type":3,"message":"2022/08/18 20:52:09 go/packages.Load #1: updating metadata for 610 packages\n"}
[Trace - 20:52:09.861 PM] Received notification 'window/showMessage'.
Params: {"type":3,"message":"Finished loading packages."}
[Trace - 20:52:09.861 PM] Received request 'client/registerCapability - (2)'.
Params: {"registrations":[{"id":"workspace/didChangeWatchedFiles-0","method":"workspace/didChangeWatchedFiles","registerOptions":{"watchers":[{"globPattern":"**/*.{go,mod,sum,work}","kind":7},{"globPattern":"{/Users/ben/Development/YouCompleteMe/golang-tools/benchmark,/Users/ben/Development/YouCompleteMe/golang-tools/benchmark/parse,/Users/ben/Development/YouCompleteMe/golang-tools/blog,/Users/ben/Development/YouCompleteMe/golang-tools/blog/atom,/Users/ben/Development/YouCompleteMe/golang-tools/cmd,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/auth,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/auth/authtest,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/auth/cookieauth,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/auth/gitauth,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/auth/netrcauth,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/benchcmp,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/bundle,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/callgraph,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/compilebench,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/cover,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/digraph,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/eg,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/file2fuzz,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/fiximports,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/getgo,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/getgo/server,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/go-contrib-init,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/godex,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/godoc,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/goimports,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/gomvpkg,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/gorename,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/gotype,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/goyacc,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/guru,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/guru/serial,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/html2article,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/present,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/present2md,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/signature-fuzzer,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/signature-fuzzer/fuzz-driver,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/signature-fuzzer/fuzz-runner,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/signature-fuzzer/internal,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/signature-fuzzer/internal/fuzz-generator,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/splitdwarf,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/splitdwarf/internal,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/splitdwarf/internal/macho,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/ssadump,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/stress,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/stringer,/Users/ben/Development/YouCompleteMe/golang-tools/cmd/toolstash,/Users/ben/Development/YouCompleteMe/golang-tools/container,/Users/ben/Development/YouCompleteMe/golang-tools/container/intsets,/Users/ben/Development/YouCompleteMe/golang-tools/copyright,/Users/ben/Development/YouCompleteMe/golang-tools/cover,/Users/ben/Development/YouCompleteMe/golang-tools/go,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/analysistest,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/internal,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/internal/analysisflags,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/internal/checker,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/internal/facts,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/multichecker,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/asmdecl,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/assign,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/atomic,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/atomicalign,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/bools,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/buildssa,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/buildtag,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/cgocall,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/composite,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/copylock,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/ctrlflow,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/deepequalerrors,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/errorsas,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/fieldalignment,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/fieldalignment/cmd,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/fieldalignment/cmd/fieldalignment,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/findcall,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/findcall/cmd,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/findcall/cmd/findcall,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/framepointer,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/httpresponse,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/ifaceassert,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/ifaceassert/cmd,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/ifaceassert/cmd/ifaceassert,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/inspect,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/internal,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/internal/analysisutil,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/loopclosure,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/lostcancel,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/lostcancel/cmd,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/lostcancel/cmd/lostcancel,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/nilfunc,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/nilness,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/nilness/cmd,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/nilness/cmd/nilness,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/pkgfact,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/printf,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/reflectvaluecompare,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/shadow,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/shadow/cmd,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/shadow/cmd/shadow,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/shift,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/sigchanyzer,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/sortslice,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/stdmethods,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/stringintconv,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/stringintconv/cmd,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/stringintconv/cmd/stringintconv,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/structtag,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/testinggoroutine,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/tests,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/timeformat,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/unmarshal,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/unmarshal/cmd,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/unmarshal/cmd/unmarshal,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/unreachable,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/unsafeptr,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/unusedresult,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/unusedwrite,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/passes/usesgenerics,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/singlechecker,/Users/ben/Development/YouCompleteMe/golang-tools/go/analysis/unitchecker,/Users/ben/Development/YouCompleteMe/golang-tools/go/ast,/Users/ben/Development/YouCompleteMe/golang-tools/go/ast/astutil,/Users/ben/Development/YouCompleteMe/golang-tools/go/ast/inspector,/Users/ben/Development/YouCompleteMe/golang-tools/go/buildutil,/Users/ben/Development/YouCompleteMe/golang-tools/go/callgraph,/Users/ben/Development/YouCompleteMe/golang-tools/go/callgraph/cha,/Users/ben/Development/YouCompleteMe/golang-tools/go/callgraph/rta,/Users/ben/Development/YouCompleteMe/golang-tools/go/callgraph/static,/Users/ben/Development/YouCompleteMe/golang-tools/go/callgraph/vta,/Users/ben/Development/YouCompleteMe/golang-tools/go/callgraph/vta/internal,/Users/ben/Development/YouCompleteMe/golang-tools/go/callgraph/vta/internal/trie,/Users/ben/Development/YouCompleteMe/golang-tools/go/cfg,/Users/ben/Development/YouCompleteMe/golang-tools/go/expect,/Users/ben/Development/YouCompleteMe/golang-tools/go/gccgoexportdata,/Users/ben/Development/YouCompleteMe/golang-tools/go/gcexportdata,/Users/ben/Development/YouCompleteMe/golang-tools/go/internal,/Users/ben/Development/YouCompleteMe/golang-tools/go/internal/cgo,/Users/ben/Development/YouCompleteMe/golang-tools/go/internal/gccgoimporter,/Users/ben/Development/YouCompleteMe/golang-tools/go/internal/gcimporter,/Users/ben/Development/YouCompleteMe/golang-tools/go/internal/packagesdriver,/Users/ben/Development/YouCompleteMe/golang-tools/go/internal/pkgbits,/Users/ben/Development/YouCompleteMe/golang-tools/go/loader,/Users/ben/Development/YouCompleteMe/golang-tools/go/packages,/Users/ben/Development/YouCompleteMe/golang-tools/go/packages/gopackages,/Users/ben/Development/YouCompleteMe/golang-tools/go/packages/packagestest,/Users/ben/Development/YouCompleteMe/golang-tools/go/pointer,/Users/ben/Development/YouCompleteMe/golang-tools/go/ssa,/Users/ben/Development/YouCompleteMe/golang-tools/go/ssa/interp,/Users/ben/Development/YouCompleteMe/golang-tools/go/ssa/ssautil,/Users/ben/Development/YouCompleteMe/golang-tools/go/types,/Users/ben/Development/YouCompleteMe/golang-tools/go/types/objectpath,/Users/ben/Development/YouCompleteMe/golang-tools/go/types/typeutil,/Users/ben/Development/YouCompleteMe/golang-tools/go/vcs,/Users/ben/Development/YouCompleteMe/golang-tools/godoc,/Users/ben/Development/YouCompleteMe/golang-tools/godoc/analysis,/Users/ben/Development/YouCompleteMe/golang-tools/godoc/redirect,/Users/ben/Development/YouCompleteMe/golang-tools/godoc/static,/Users/ben/Development/YouCompleteMe/golang-tools/godoc/util,/Users/ben/Development/YouCompleteMe/golang-tools/godoc/vfs,/Users/ben/Development/YouCompleteMe/golang-tools/godoc/vfs/gatefs,/Users/ben/Development/YouCompleteMe/golang-tools/godoc/vfs/httpfs,/Users/ben/Development/YouCompleteMe/golang-tools/godoc/vfs/mapfs,/Users/ben/Development/YouCompleteMe/golang-tools/godoc/vfs/zipfs,/Users/ben/Development/YouCompleteMe/golang-tools/imports,/Users/ben/Development/YouCompleteMe/golang-tools/internal,/Users/ben/Development/YouCompleteMe/golang-tools/internal/analysisinternal,/Users/ben/Development/YouCompleteMe/golang-tools/internal/apidiff,/Users/ben/Development/YouCompleteMe/golang-tools/internal/event,/Users/ben/Development/YouCompleteMe/golang-tools/internal/event/core,/Users/ben/Development/YouCompleteMe/golang-tools/internal/event/export,/Users/ben/Development/YouCompleteMe/golang-tools/internal/event/export/eventtest,/Users/ben/Development/YouCompleteMe/golang-tools/internal/event/export/metric,/Users/ben/Development/YouCompleteMe/golang-tools/internal/event/export/ocagent,/Users/ben/Development/YouCompleteMe/golang-tools/internal/event/export/ocagent/wire,/Users/ben/Development/YouCompleteMe/golang-tools/internal/event/export/prometheus,/Users/ben/Development/YouCompleteMe/golang-tools/internal/event/keys,/Users/ben/Development/YouCompleteMe/golang-tools/internal/event/label,/Users/ben/Development/YouCompleteMe/golang-tools/internal/fakenet,/Users/ben/Development/YouCompleteMe/golang-tools/internal/fastwalk,/Users/ben/Development/YouCompleteMe/golang-tools/internal/gocommand,/Users/ben/Development/YouCompleteMe/golang-tools/internal/gopathwalk,/Users/ben/Development/YouCompleteMe/golang-tools/internal/imports,/Users/ben/Development/YouCompleteMe/golang-tools/internal/jsonrpc2,/Users/ben/Development/YouCompleteMe/golang-tools/internal/jsonrpc2/servertest,/Users/ben/Development/YouCompleteMe/golang-tools/internal/jsonrpc2_v2,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/analysis,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/analysis/embeddirective,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/analysis/fillreturns,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/analysis/fillstruct,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/analysis/infertypeargs,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/analysis/nonewvars,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/analysis/noresultvalues,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/analysis/simplifycompositelit,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/analysis/simplifyrange,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/analysis/simplifyslice,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/analysis/stubmethods,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/analysis/undeclaredname,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/analysis/unusedparams,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/analysis/unusedvariable,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/analysis/useany,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/browser,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/bug,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/cache,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/cmd,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/cmd/test,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/command,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/command/commandmeta,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/command/gen,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/debug,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/debug/log,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/debug/tag,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/diff,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/diff/difftest,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/diff/lcs,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/diff/myers,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/fake,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/fuzzy,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/helper,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/lsppos,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/lsprpc,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/mod,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/progress,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/protocol,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/regtest,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/safetoken,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/snippet,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/source,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/source/completion,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/template,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/tests,/Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/work,/Users/ben/Development/YouCompleteMe/golang-tools/internal/memoize,/Users/ben/Development/YouCompleteMe/golang-tools/internal/packagesinternal,/Users/ben/Development/YouCompleteMe/golang-tools/internal/persistent,/Users/ben/Development/YouCompleteMe/golang-tools/internal/proxydir,/Users/ben/Development/YouCompleteMe/golang-tools/internal/span,/Users/ben/Development/YouCompleteMe/golang-tools/internal/stack,/Users/ben/Development/YouCompleteMe/golang-tools/internal/stack/gostacks,/Users/ben/Development/YouCompleteMe/golang-tools/internal/stack/stacktest,/Users/ben/Development/YouCompleteMe/golang-tools/internal/testenv,/Users/ben/Development/YouCompleteMe/golang-tools/internal/tool,/Users/ben/Development/YouCompleteMe/golang-tools/internal/typeparams,/Users/ben/Development/YouCompleteMe/golang-tools/internal/typeparams/genericfeatures,/Users/ben/Development/YouCompleteMe/golang-tools/internal/typesinternal,/Users/ben/Development/YouCompleteMe/golang-tools/internal/xcontext,/Users/ben/Development/YouCompleteMe/golang-tools/playground,/Users/ben/Development/YouCompleteMe/golang-tools/playground/socket,/Users/ben/Development/YouCompleteMe/golang-tools/present,/Users/ben/Development/YouCompleteMe/golang-tools/refactor,/Users/ben/Development/YouCompleteMe/golang-tools/refactor/eg,/Users/ben/Development/YouCompleteMe/golang-tools/refactor/importgraph,/Users/ben/Development/YouCompleteMe/golang-tools/refactor/rename,/Users/ben/Development/YouCompleteMe/golang-tools/refactor/satisfy,/Users/ben/Development/YouCompleteMe/golang-tools/txtar}","kind":7}]}}]}
[Trace - 20:52:09.865 PM] Sending response 'client/registerCapability - (2)' in 4ms.
Result:
[Trace - 20:52:09.865 PM] Received request 'workspace/configuration - (3)'.
Params: {"items":[{"section":"gopls"}]}
[Trace - 20:52:09.866 PM] Sending response 'workspace/configuration - (3)' in 0ms.
Result: [{"hints":{"assignVariableTypes":true,"compositeLiteralFields":true,"compositeLiteralTypes":true,"constantValues":true,"functionTypeParameters":true,"parameterNames":true,"rangeVariableTypes":true},"hoverKind":"Structured","semanticTokens":true}]
[Trace - 20:52:09.867 PM] Received request 'workspace/configuration - (4)'.
Params: {"items":[{"scopeUri":"file:///Users/ben/Development/YouCompleteMe/golang-tools","section":"gopls"}]}
[Trace - 20:52:09.867 PM] Sending response 'workspace/configuration - (4)' in 0ms.
Result: [{"hints":{"assignVariableTypes":true,"compositeLiteralFields":true,"compositeLiteralTypes":true,"constantValues":true,"functionTypeParameters":true,"parameterNames":true,"rangeVariableTypes":true},"hoverKind":"Structured","semanticTokens":true}]
[Trace - 20:52:09.978 PM] Received notification 'window/logMessage'.
Params: {"type":3,"message":"2022/08/18 20:52:09 discovered missing identifiers: map[bracketPair:true]\n\tpackage=\"vendor/golang.org/x/text/unicode/bidi\"\n"}
[Trace - 20:52:09.979 PM] Received notification 'window/logMessage'.
Params: {"type":3,"message":"2022/08/18 20:52:09 discovered missing identifiers: map[encOpts:true encodeState:true]\n\tpackage=\"encoding/json\"\n"}
[Trace - 20:52:09.984 PM] Received notification 'window/logMessage'.
Params: {"type":3,"message":"2022/08/18 20:52:09 discovered missing identifiers: map[message:true]\n\tpackage=\"internal/profile\"\n"}
[Trace - 20:52:09.988 PM] Received notification 'window/logMessage'.
Params: {"type":3,"message":"2022/08/18 20:52:09 discovered missing identifiers: map[_Ctype___darwin_socklen_t:true _Ctype_uchar:true]\n\tpackage=\"net\"\n"}
[Trace - 20:52:09.990 PM] Received notification 'window/logMessage'.
Params: {"type":3,"message":"2022/08/18 20:52:09 discovered missing identifiers: map[nistPoint:true]\n\tpackage=\"crypto/elliptic\"\n"}
[Trace - 20:52:09.994 PM] Received notification 'window/logMessage'.
Params: {"type":3,"message":"2022/08/18 20:52:09 discovered missing identifiers: map[graphNode:true term:true]\n\tpackage=\"go/types\"\n"}
[Trace - 20:52:10.002 PM] Received notification 'window/logMessage'.
Params: {"type":3,"message":"2022/08/18 20:52:10 falling back to safe trimming due to type errors: [] or still-missing identifiers: map[_Ctype___uint32_t:true]\n\tpackage=\"net\"\n"}
[Trace - 20:52:10.036 PM] Received notification 'window/logMessage'.
Params: {"type":3,"message":"2022/08/18 20:52:10 discovered missing identifiers: map[abbrev:true]\n\tpackage=\"debug/dwarf\"\n"}
[Trace - 20:52:10.050 PM] Received notification 'window/logMessage'.
Params: {"type":3,"message":"2022/08/18 20:52:10 falling back to safe trimming due to type errors: [/opt/homebrew/Cellar/go/1.19/libexec/src/os/user/cgo_lookup_unix.go:195:19: int not declared by package C /opt/homebrew/Cellar/go/1.19/libexec/src/os/user/cgo_lookup_unix.go:198:27: cannot convert C._SC_GETPW_R_SIZE_MAX (untyped int constant 71) to bufferKind /opt/homebrew/Cellar/go/1.19/libexec/src/os/user/cgo_lookup_unix.go:199:27: cannot convert C._SC_GETGR_R_SIZE_MAX (untyped int constant 70) to bufferKind] or still-missing identifiers: map[_Ctype___darwin_gid_t:true _Ctype___darwin_uid_t:true _Ctype_long:true]\n\tpackage=\"os/user\"\n"}
[Trace - 20:52:10.094 PM] Received response 'textDocument/inlayHint - (2)' in 680ms.
Result: [{"position":{"line":800,"character":14},"label":[{"value":"msg:"}],"kind":2,"paddingRight":true},{"position":{"line":800,"character":26},"label":[{"value":"format:"}],"kind":2,"paddingRight":true},{"position":{"line":800,"character":45},"label":[{"value":"a...:"}],"kind":2,"paddingRight":true},{"position":{"line":800,"character":73},"label":[{"value":"p:"}],"kind":2,"paddingRight":true},{"position":{"line":800,"character":80},"label":[{"value":"adjusted:"}],"kind":2,"paddingRight":true},{"position":{"line":810,"character":5},"label":[{"value":"span.Span"}],"kind":1,"paddingLeft":true},{"position":{"line":810,"character":10},"label":[{"value":"error"}],"kind":1,"paddingLeft":true},{"position":{"line":810,"character":37},"label":[{"value":"r:"}],"kind":2,"paddingRight":true},{"position":{"line":812,"character":20},"label":[{"value":"format:"}],"kind":2,"paddingRight":true},{"position":{"line":812,"character":52},"label":[{"value":"a...:"}],"kind":2,"paddingRight":true},{"position":{"line":821,"character":12},"label":[{"value":"x:"}],"kind":2,"paddingRight":true},{"position":{"line":821,"character":21},"label":[{"value":"less:"}],"kind":2,"paddingRight":true},{"position":{"line":827,"character":8},"label":[{"value":"map[tokenType]int"}],"kind":1,"paddingLeft":true},{"position":{"line":827,"character":16},"label":[{"value":"map[string]int"}],"kind":1,"paddingLeft":true},{"position":{"line":830,"character":2},"label":[{"value":"[]uint32"}],"kind":1,"paddingLeft":true},{"position":{"line":833,"character":6},"label":[{"value":"int"}],"kind":1,"paddingLeft":true},{"position":{"line":834,"character":6},"label":[{"value":"semItem"}],"kind":1,"paddingLeft":true},{"position":{"line":835,"character":5},"label":[{"value":"int"}],"kind":1,"paddingLeft":true},{"position":{"line":835,"character":9},"label":[{"value":"bool"}],"kind":1,"paddingLeft":true},{"position":{"line":856,"character":6},"label":[{"value":"int"}],"kind":1,"paddingLeft":true},{"position":{"line":857,"character":7},"label":[{"value":"int"}],"kind":1,"paddingLeft":true},{"position":{"line":857,"character":10},"label":[{"value":"string"}],"kind":1,"paddingLeft":true},{"position":{"line":871,"character":4},"label":[{"value":"string"}],"kind":1,"paddingLeft":true},{"position":{"line":873,"character":11},"label":[{"value":"start:"}],"kind":2,"paddingRight":true},{"position":{"line":873,"character":25},"label":[{"value":"leng:"}],"kind":2,"paddingRight":true},{"position":{"line":873,"character":34},"label":[{"value":"typ:"}],"kind":2,"paddingRight":true},{"position":{"line":873,"character":48},"label":[{"value":"mods:"}],"kind":2,"paddingRight":true},{"position":{"line":877,"character":4},"label":[{"value":"string"}],"kind":1,"paddingLeft":true},{"position":{"line":882,"character":3},"label":[{"value":"string"}],"kind":1,"paddingLeft":true},{"position":{"line":884,"character":2},"label":[{"value":"source.Package"}],"kind":1,"paddingLeft":true},{"position":{"line":884,"character":7},"label":[{"value":"error"}],"kind":1,"paddingLeft":true},{"position":{"line":884,"character":27},"label":[{"value":"pkgPath:"}],"kind":2,"paddingRight":true},{"position":{"line":895,"character":2},"label":[{"value":"int"}],"kind":1,"paddingLeft":true},{"position":{"line":895,"character":24},"label":[{"value":"s:"}],"kind":2,"paddingRight":true},{"position":{"line":895,"character":28},"label":[{"value":"substr:"}],"kind":2,"paddingRight":true},{"position":{"line":900,"character":6},"label":[{"value":"token.Pos"}],"kind":1,"paddingLeft":true},{"position":{"line":901,"character":16},"label":[{"value":"leng:"}],"kind":2,"paddingRight":true},{"position":{"line":901,"character":31},"label":[{"value":"typ:"}],"kind":2,"paddingRight":true},{"position":{"line":901,"character":45},"label":[{"value":"mods:"}],"kind":2,"paddingRight":true},{"position":{"line":909,"character":13},"label":[{"value":"ctx:"}],"kind":2,"paddingRight":true},{"position":{"line":909,"character":20},"label":[{"value":"message:"}],"kind":2,"paddingRight":true},{"position":{"line":909,"character":34},"label":[{"value":"err:"}],"kind":2,"paddingRight":true},{"position":{"line":909,"character":45},"label":[{"value":"text:"}],"kind":2,"paddingRight":true},{"position":{"line":914,"character":9},"label":[{"value":"[]string"}],"kind":1,"paddingLeft":true},{"position":{"line":915,"character":8},"label":[{"value":"[]string"}],"kind":1,"paddingLeft":true},{"position":{"line":919,"character":20},"label":[{"value":"format:"}],"kind":2,"paddingRight":true},{"position":{"line":919,"character":35},"label":[{"value":"a...:"}],"kind":2,"paddingRight":true},{"position":{"line":924,"character":8},"label":[{"value":"[]string"}],"kind":1,"paddingLeft":true}]
[Trace - 20:52:10.143 PM] Received notification 'textDocument/publishDiagnostics'.
Params: {"uri":"file:///Users/ben/Development/YouCompleteMe/golang-tools/internal/lsp/semantic.go","version":1,"diagnostics":[]}
[Trace - 20:52:10.170 PM] Received notification 'window/logMessage'.
Params: {"type":3,"message":"2022/08/18 20:52:10 discovered missing identifiers: map[markdown:true]\n\tpackage=\"github.com/yuin/goldmark\"\n"}
[Trace - 20:52:10.285 PM] Received notification 'window/logMessage'.
Params: {"type":3,"message":"2022/08/18 20:52:10 discovered missing identifiers: map[sparseEntry:true]\n\tpackage=\"archive/tar\"\n"}
[Trace - 20:52:10.512 PM] Received notification 'window/logMessage'.
Params: {"type":3,"message":"2022/08/18 20:52:10 discovered missing identifiers: map[parser:true]\n\tpackage=\"golang.org/x/net/html\"\n"}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment