Skip to content

Commit

Permalink
AST viewer now updates correctly without delay; various completion bu…
Browse files Browse the repository at this point in the history
…gfixes, code cleanup
  • Loading branch information
kralicky committed Jan 14, 2024
1 parent 2800107 commit af3f289
Show file tree
Hide file tree
Showing 13 changed files with 536 additions and 317 deletions.
23 changes: 19 additions & 4 deletions editors/vscode/client/src/astviewer.ts
Original file line number Diff line number Diff line change
@@ -1,29 +1,43 @@
import * as vscode from "vscode"

type ASTFetcher = (
uri: vscode.Uri,
version: number,
token: vscode.CancellationToken,
) => Promise<string>

export class ASTViewer implements vscode.TextDocumentContentProvider {
private virtualUrisByFile = new Map<string, vscode.Uri>()
private documentVersionsByUri = new Map<string, number>()
private closeListener: vscode.Disposable
private changeListener: vscode.Disposable
private fetchAST: (uri: vscode.Uri) => Promise<string>
private fetchAST: ASTFetcher

constructor(fetchAST: (uri: vscode.Uri) => Promise<string>) {
constructor(fetchAST: ASTFetcher) {
this.fetchAST = fetchAST
this.closeListener = vscode.workspace.onDidCloseTextDocument((doc) => {
switch (doc.uri.scheme) {
case "file": {
this.virtualUrisByFile.delete(doc.uri.toString())
this.documentVersionsByUri.delete(doc.uri.toString())
break
}
case "protoast2":
case "protoast": {
this.virtualUrisByFile.delete(fromProtoAstUri(doc.uri).toString())
const uri = fromProtoAstUri(doc.uri)
this.virtualUrisByFile.delete(uri.toString())
this.documentVersionsByUri.delete(uri.toString())
break
}
}
})
this.changeListener = vscode.workspace.onDidChangeTextDocument((e) => {
const virtualUri = this.virtualUrisByFile.get(e.document.uri.toString())
if (virtualUri) {
this.documentVersionsByUri.set(
virtualUri.toString(),
e.document.version,
)
this.refresh(virtualUri)
}
})
Expand Down Expand Up @@ -63,7 +77,8 @@ export class ASTViewer implements vscode.TextDocumentContentProvider {
if (!this.virtualUrisByFile.has(fileUri.toString())) {
return ""
}
return this.fetchAST(fileUri)
const version = this.documentVersionsByUri.get(uri.toString()) ?? 0
return this.fetchAST(fileUri, version, token)
}

public dispose() {
Expand Down
13 changes: 9 additions & 4 deletions editors/vscode/client/src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,15 @@ export class ProtolsLanguageClient
uri: vscode.Uri,
token: vscode.CancellationToken,
): vscode.ProviderResult<string> {
return this.sendRequest("workspace/executeCommand", {
command: "protols/synthetic-file-contents",
arguments: [{ uri: uri.toString() }],
}).then((result: string) => {
// look up the document version for this uri
return this.sendRequest(
"workspace/executeCommand",
{
command: "protols/synthetic-file-contents",
arguments: [{ uri: uri.toString() }],
},
token,
).then((result: string) => {
return result
})
}
Expand Down
31 changes: 21 additions & 10 deletions editors/vscode/client/src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,27 @@ export async function activate(context: vscode.ExtensionContext) {
// Start the client. This will also launch the server
client.start()

const astViewer = new ASTViewer((uri) => {
return client
.sendRequest("workspace/executeCommand", {
command: "protols/ast",
arguments: [{ uri: fromProtoAstUri(uri).toString() }],
})
.then((result: string) => {
return result
})
})
const astViewer = new ASTViewer(
(uri: vscode.Uri, version: number, token: vscode.CancellationToken) => {
return client
.sendRequest(
"workspace/executeCommand",
{
command: "protols/ast",
arguments: [
{
uri: fromProtoAstUri(uri).toString(),
version,
},
],
},
token,
)
.then((result: string) => {
return result
})
},
)
context.subscriptions.push(
astViewer,
vscode.workspace.registerTextDocumentContentProvider("protoast", astViewer),
Expand Down
16 changes: 8 additions & 8 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,21 @@ module github.com/kralicky/protols
go 1.21.4

require (
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20230914171853-63dfe56cc2c4.1
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.32.0-20231115204500-e097f827e652.1
github.com/AlecAivazis/survey/v2 v2.3.7
github.com/bufbuild/protovalidate-go v0.3.4
github.com/bufbuild/protovalidate-go v0.4.3
github.com/google/cel-go v0.18.2
github.com/kralicky/gpkg v0.0.0-20231114180450-2f4bff8c5588
github.com/kralicky/protocompile v0.0.0-20240113031314-24e69108897d
github.com/kralicky/protocompile v0.0.0-20240114032708-6ff5d8987df3
github.com/kralicky/tools-lite v0.0.0-20240104191314-c259ddd5a342
github.com/mattn/go-tty v0.0.5
github.com/spf13/cobra v1.8.0
golang.org/x/mod v0.14.0
golang.org/x/sync v0.5.0
google.golang.org/genproto v0.0.0-20231212172506-995d672761c0
google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0
google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0
google.golang.org/protobuf v1.31.1-0.20231027082548-f4a6c1f6e5c1
golang.org/x/sync v0.6.0
google.golang.org/genproto v0.0.0-20240108191215-35c7eff3a6b1
google.golang.org/genproto/googleapis/api v0.0.0-20240108191215-35c7eff3a6b1
google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1
google.golang.org/protobuf v1.32.0
)

require (
Expand Down
33 changes: 16 additions & 17 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20230914171853-63dfe56cc2c4.1 h1:2gmp+PRca1fqQHf/WMKOgu9inVb0R0N07TucgY3QZCQ=
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20230914171853-63dfe56cc2c4.1/go.mod h1:xafc+XIsTxTy76GJQ1TKgvJWsSugFBqMaN27WhUblew=
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.32.0-20231115204500-e097f827e652.1 h1:u0olL4yf2p7Tl5jfsAK5keaFi+JFJuv1CDHrbiXkxkk=
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.32.0-20231115204500-e097f827e652.1/go.mod h1:tiTMKD8j6Pd/D2WzREoweufjzaJKHZg35f/VGcZ2v3I=
cloud.google.com/go/dlp v1.11.1 h1:OFlXedmPP/5//X1hBEeq3D9kUVm9fb6ywYANlpv/EsQ=
cloud.google.com/go/dlp v1.11.1/go.mod h1:/PA2EnioBeXTL/0hInwgj0rfsQb3lpE3R8XUJxqUNKI=
github.com/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ=
Expand All @@ -8,8 +8,8 @@ github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63n
github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w=
github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=
github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=
github.com/bufbuild/protovalidate-go v0.3.4 h1:FrHcBBShspitvmC9Nkwu7BNs/EXWjkEQqrgFnWxYH60=
github.com/bufbuild/protovalidate-go v0.3.4/go.mod h1:Au57xmLypglbQAF0GzuDDYbYIct7SZ9QnwJlaPolyFw=
github.com/bufbuild/protovalidate-go v0.4.3 h1:1Xsm3qhkwioxLDEtxWgtn0Ch71xBP/sBauT/FZnn76A=
github.com/bufbuild/protovalidate-go v0.4.3/go.mod h1:RcgJ+onKVv4OkAVtzkRUxkocb8stcUAMK0EoqR4fuZE=
github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI=
github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
Expand All @@ -32,8 +32,8 @@ github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNU
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
github.com/kralicky/gpkg v0.0.0-20231114180450-2f4bff8c5588 h1:chw4znRXk7AA+AlKcrUZzH1Vupl54KcS4W6wkXCX3lU=
github.com/kralicky/gpkg v0.0.0-20231114180450-2f4bff8c5588/go.mod h1:vOkwMjs49XmP/7Xfo9ZL6eg2ei51lmtD/4U/Az5GTq8=
github.com/kralicky/protocompile v0.0.0-20240113031314-24e69108897d h1:DdKNJNMQRs2MBIikDaqWm75w2Yud4xtjRCmmhs/d1qw=
github.com/kralicky/protocompile v0.0.0-20240113031314-24e69108897d/go.mod h1:QKlDXp/yojhlpqgJfUHWhqzvD9gCD/baEPFvq89cpgE=
github.com/kralicky/protocompile v0.0.0-20240114032708-6ff5d8987df3 h1:ZFXct43FfQYouVBjIaHUsDUpKm/o/RQItocyVKhOj+g=
github.com/kralicky/protocompile v0.0.0-20240114032708-6ff5d8987df3/go.mod h1:QKlDXp/yojhlpqgJfUHWhqzvD9gCD/baEPFvq89cpgE=
github.com/kralicky/tools-lite v0.0.0-20240104191314-c259ddd5a342 h1:lZLWHXKHmOhTrs3oSZoCRtb8Y9a0mqUwCsaKut+Y1eU=
github.com/kralicky/tools-lite v0.0.0-20240104191314-c259ddd5a342/go.mod h1:NKsdxFI6awifvNvxDwtCU1YCaKRoSSPpbHXkKOMuq24=
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
Expand Down Expand Up @@ -82,8 +82,8 @@ golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c=
golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE=
golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
Expand All @@ -109,19 +109,18 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/genproto v0.0.0-20231212172506-995d672761c0 h1:YJ5pD9rF8o9Qtta0Cmy9rdBwkSjrTCT6XTiUQVOtIos=
google.golang.org/genproto v0.0.0-20231212172506-995d672761c0/go.mod h1:l/k7rMz0vFTBPy+tFSGvXEd3z+BcoG1k7EHbqm+YBsY=
google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0 h1:s1w3X6gQxwrLEpxnLd/qXTVLgQE2yXwaOaoa6IlY/+o=
google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0/go.mod h1:CAny0tYF+0/9rmDB9fahA9YLzX3+AEVl1qXbv5hhj6c=
google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU=
google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=
google.golang.org/genproto v0.0.0-20240108191215-35c7eff3a6b1 h1:/IWabOtPziuXTEtI1KYCpM6Ss7vaAkeMxk+uXV/xvZs=
google.golang.org/genproto v0.0.0-20240108191215-35c7eff3a6b1/go.mod h1:+Rvu7ElI+aLzyDQhpHMFMMltsD6m7nqpuWDd2CwJw3k=
google.golang.org/genproto/googleapis/api v0.0.0-20240108191215-35c7eff3a6b1 h1:OPXtXn7fNMaXwO3JvOmF1QyTc00jsSFFz1vXXBOdCDo=
google.golang.org/genproto/googleapis/api v0.0.0-20240108191215-35c7eff3a6b1/go.mod h1:B5xPO//w8qmBDjGReYLpR6UJPnkldGkCSMoH/2vxJeg=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1 h1:gphdwh0npgs8elJ4T6J+DQJHPVF7RsuJHCfwztUb4J4=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1/go.mod h1:daQN87bsDqDoe316QbbvX60nMoJQa4r6Ds0ZuoAe5yA=
google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU=
google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.31.1-0.20231027082548-f4a6c1f6e5c1 h1:fk72uXZyuZiTtW5tgd63jyVK6582lF61nRC/kGv6vCA=
google.golang.org/protobuf v1.31.1-0.20231027082548-f4a6c1f6e5c1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=
google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
Expand Down
12 changes: 11 additions & 1 deletion pkg/format/ast.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,12 @@ func (v *dumpVisitor) VisitCompoundStringLiteralNode(node *ast.CompoundStringLit
}

func (v *dumpVisitor) VisitEmptyDeclNode(node *ast.EmptyDeclNode) error {
v.buf.WriteString("\n")
return nil
}

func (v *dumpVisitor) VisitErrorNode(*ast.ErrorNode) error {
v.buf.WriteString("\n")
return nil
}

Expand Down Expand Up @@ -132,7 +138,11 @@ func (v *dumpVisitor) VisitFieldReferenceNode(node *ast.FieldReferenceNode) erro
}

func (v *dumpVisitor) VisitFileNode(node *ast.FileNode) error {
v.buf.WriteString(fmt.Sprintf("syntax=%q #decls=%d\n", maybe(node.Syntax).Syntax.AsString(), len(node.Decls)))
if node.Syntax == nil {
v.buf.WriteString(fmt.Sprintf("!syntax #decls=%d\n", len(node.Decls)))
} else {
v.buf.WriteString(fmt.Sprintf("syntax=%q #decls=%d\n", maybe(node.Syntax).Syntax.AsString(), len(node.Decls)))
}
return nil
}

Expand Down
33 changes: 20 additions & 13 deletions pkg/lsp/cache.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ type Cache struct {
inflightTasksInvalidate gsync.Map[protocompile.ResolvedPath, time.Time]
inflightTasksCompile gsync.Map[protocompile.ResolvedPath, time.Time]
pragmas gsync.Map[protocompile.ResolvedPath, *pragmaMap]

documentVersions *documentVersionQueue
}

// FindDescriptorByName implements linker.Resolver.
Expand Down Expand Up @@ -215,11 +217,12 @@ func NewCache(workspace protocol.WorkspaceFolder, opts ...CacheOption) *Cache {
workdir: protocol.DocumentURI(workspace.URI).Path(),
}
cache := &Cache{
workspace: workspace,
compiler: compiler,
resolver: resolver,
diagHandler: diagHandler,
unlinkedResults: make(map[protocompile.ResolvedPath]parser.Result),
workspace: workspace,
compiler: compiler,
resolver: resolver,
diagHandler: diagHandler,
unlinkedResults: make(map[protocompile.ResolvedPath]parser.Result),
documentVersions: newDocumentVersionQueue(),
}
compiler.Hooks = protocompile.CompilerHooks{
PreInvalidate: cache.preInvalidateHook,
Expand All @@ -243,9 +246,7 @@ func (c *Cache) LoadFiles(files []string) {
}
}

if err := c.DidModifyFiles(context.TODO(), created); err != nil {
slog.Error("failed to index files", "error", err)
}
c.DidModifyFiles(context.TODO(), created)
}

func (r *Cache) GetMapper(uri protocol.DocumentURI) (*protocol.Mapper, error) {
Expand All @@ -267,7 +268,7 @@ func (r *Cache) GetMapper(uri protocol.DocumentURI) (*protocol.Mapper, error) {
return protocol.NewMapper(uri, content), nil
}

func (s *Cache) ChangedText(ctx context.Context, uri protocol.DocumentURI, changes []protocol.TextDocumentContentChangeEvent) ([]byte, error) {
func (s *Cache) ChangedText(ctx context.Context, uri protocol.VersionedTextDocumentIdentifier, changes []protocol.TextDocumentContentChangeEvent) ([]byte, error) {
if len(changes) == 0 {
return nil, fmt.Errorf("%w: no content changes provided", jsonrpc2.ErrInternal)
}
Expand All @@ -278,7 +279,7 @@ func (s *Cache) ChangedText(ctx context.Context, uri protocol.DocumentURI, chang
return []byte(changes[0].Text), nil
}

m, err := s.GetMapper(uri)
m, err := s.GetMapper(uri.URI)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -400,8 +401,9 @@ func (c *Cache) compileLocked(protos ...string) {
c.compileLocked(syntheticFiles...)
}

func (c *Cache) DidModifyFiles(ctx context.Context, modifications []file.Modification) error {
func (c *Cache) DidModifyFiles(ctx context.Context, modifications []file.Modification) {
c.resolver.UpdateURIPathMappings(modifications)
defer c.documentVersions.Update(modifications...)

var toRecompile []string
for _, m := range modifications {
Expand All @@ -427,12 +429,11 @@ func (c *Cache) DidModifyFiles(ctx context.Context, modifications []file.Modific
}
}
if err := c.compiler.fs.UpdateOverlays(ctx, modifications); err != nil {
return err
panic(fmt.Errorf("internal protocol error: %w", err))
}
if len(toRecompile) > 0 {
c.Compile(toRecompile...)
}
return nil
}

func (c *Cache) ComputeSemanticTokens(doc protocol.TextDocumentIdentifier) ([]uint32, error) {
Expand Down Expand Up @@ -1198,3 +1199,9 @@ func (c *Cache) FindPragmasByPath(path protocompile.ResolvedPath) (Pragmas, bool
p, ok := c.pragmas.Load(path)
return p, ok
}

func (c *Cache) WaitDocumentVersion(ctx context.Context, uri protocol.DocumentURI, version int32) error {
ctx, ca := context.WithTimeout(ctx, 2*time.Second)
defer ca()
return c.documentVersions.Wait(ctx, uri, version)
}
3 changes: 2 additions & 1 deletion pkg/lsp/commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ type SyntheticFileContentsRequest struct {

type DocumentASTRequest struct {
// The URI of the file to retrieve the AST for.
URI string `json:"uri"`
URI string `json:"uri"`
Version int32 `json:"version"`
}

type ReindexWorkspacesRequest struct{}
Loading

0 comments on commit af3f289

Please sign in to comment.