| // Copyright 2020 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package main |
| |
| import ( |
| "context" |
| "log" |
| "os" |
| |
| "github.com/sourcegraph/jsonrpc2" |
| |
| "fidl-lsp/analysis" |
| "fidl-lsp/langserver" |
| ) |
| |
| type stdrwc struct{} |
| |
| func (stdrwc) Read(p []byte) (int, error) { |
| return os.Stdin.Read(p) |
| } |
| |
| func (stdrwc) Write(p []byte) (int, error) { |
| return os.Stdout.Write(p) |
| } |
| |
| func (stdrwc) Close() error { |
| if err := os.Stdin.Close(); err != nil { |
| return err |
| } |
| return os.Stdout.Close() |
| } |
| |
| func main() { |
| ctx, cancel := context.WithCancel(context.Background()) |
| defer cancel() |
| |
| trace := log.New(os.Stderr, "[LSP] ", log.Lshortfile) |
| logOpt := jsonrpc2.LogMessages(trace) |
| |
| fidlProject, err := analysis.GetFidlProject() |
| if err != nil { |
| trace.Fatalf("Failed to parse fidl_project.json: %s\n", err) |
| } |
| |
| handler := langserver.NewLangHandler(langserver.NewDefaultConfig(), trace, fidlProject) |
| server := langserver.LspServer{handler} |
| |
| // Setup a new Conn over stdio |
| trace.Println("setting up a new connection") |
| conn := jsonrpc2.NewConn( |
| ctx, |
| jsonrpc2.NewBufferedStream(stdrwc{}, jsonrpc2.VSCodeObjectCodec{}), |
| server, |
| logOpt, |
| ) |
| defer conn.Close() |
| |
| <-conn.DisconnectNotify() |
| } |