Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
wa-lang
wa
提交
be0f86a3
wa
项目概览
wa-lang
/
wa
9 个月 前同步成功
通知
68
Star
655
Fork
45
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
wa
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
be0f86a3
编写于
5月 02, 2023
作者:
chai2010
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
lsp: 完善 rpc 实现
上级
fbb46bdf
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
64 addition
and
55 deletion
+64
-55
internal/lsp/rpc.go
internal/lsp/rpc.go
+25
-51
internal/lsp/server.go
internal/lsp/server.go
+39
-4
未找到文件。
internal/lsp/rpc.go
浏览文件 @
be0f86a3
...
...
@@ -3,25 +3,29 @@
package
lsp
import
(
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"io"
)
type
lspChannel
struct
{
r
io
.
Reader
w
io
.
Writer
dec
*
json
.
Decoder
}
type
lspRequest
struct
{
ID
int
`json:"id"`
JSONRPC
string
`json:"jsonrpc"`
Method
string
`json:"method"`
Params
[]
interface
{}
`json:"params"`
ID
int
`json:"id"`
JSONRPC
string
`json:"jsonrpc"`
Method
string
`json:"method"`
Params
[]
json
.
RawMessage
`json:"params"`
}
type
lspResponse
struct
{
ID
int
`json:"id"`
JSONRPC
string
`json:"jsonrpc"`
Result
json
.
RawMessage
`json:"result"`
Error
*
lspError
`json:"error"`
ID
int
`json:"id"`
JSONRPC
string
`json:"jsonrpc"`
Result
interface
{}
`json:"result"`
Error
*
lspError
`json:"error"`
}
// JSONRPC错误
...
...
@@ -34,52 +38,22 @@ func (err *lspError) Error() string {
return
fmt
.
Sprintf
(
"lsp.Error{code:%d, message: %q}"
,
err
.
Code
,
err
.
Message
)
}
// 原生调用方法
func
lspCall
(
host
,
method
string
,
args
...
interface
{})
(
result
json
.
RawMessage
,
err
error
)
{
return
jsonrpcCall
(
host
,
method
,
args
...
)
}
// jsonrpc 调用
func
jsonrpcCall
(
host
,
method
string
,
args
...
interface
{})
(
result
json
.
RawMessage
,
err
error
)
{
reqBody
,
err
:=
json
.
Marshal
(
&
lspRequest
{
JSONRPC
:
"2.0"
,
Method
:
method
,
Params
:
args
,
ID
:
1
,
})
if
err
!=
nil
{
return
nil
,
err
}
r
,
err
:=
http
.
Post
(
host
,
"application/json"
,
bytes
.
NewReader
(
reqBody
))
if
err
!=
nil
{
return
nil
,
err
}
defer
r
.
Body
.
Close
()
respBody
,
err
:=
ioutil
.
ReadAll
(
r
.
Body
)
if
err
!=
nil
{
return
nil
,
err
}
var
resp
=
new
(
lspResponse
)
if
err
:=
json
.
Unmarshal
(
respBody
,
resp
);
err
!=
nil
{
return
nil
,
err
}
if
resp
.
Error
!=
nil
{
return
nil
,
resp
.
Error
func
(
p
*
lspChannel
)
RecvRequest
()
(
req
*
lspRequest
,
err
error
)
{
if
p
.
dec
==
nil
{
p
.
dec
=
json
.
NewDecoder
(
p
.
r
)
}
return
resp
.
Result
,
nil
req
=
new
(
lspRequest
)
err
=
p
.
dec
.
Decode
(
&
req
)
return
}
// JSONRPC调用, 需要通过response提供返回类型
func
lsprpcCall
(
host
,
method
string
,
response
interface
{},
args
...
interface
{})
(
err
error
)
{
resp_Result
,
err
:=
jsonrpcCall
(
host
,
method
,
args
...
)
func
(
p
*
lspChannel
)
SendRespose
(
resp
*
lspResponse
)
error
{
reqBody
,
err
:=
json
.
Marshal
(
resp
)
if
err
!=
nil
{
return
err
}
if
err
:=
json
.
Unmarshal
(
resp_Result
,
response
);
err
!=
nil
{
_
,
err
=
p
.
w
.
Write
(
reqBody
)
if
err
!=
nil
{
return
err
}
return
nil
...
...
internal/lsp/server.go
浏览文件 @
be0f86a3
...
...
@@ -6,16 +6,51 @@ import (
"context"
"encoding/json"
"fmt"
"os"
)
type
LSPServer
struct
{}
type
LSPServer
struct
{
conn
*
lspChannel
}
func
NewLSPServer
()
*
LSPServer
{
return
&
LSPServer
{}
return
&
LSPServer
{
conn
:
&
lspChannel
{
r
:
os
.
Stdin
,
w
:
os
.
Stdout
},
}
}
func
(
p
*
LSPServer
)
handleMethod
(
ctx
context
.
Context
,
reqMethod
string
,
argsData
[]
byte
)
(
result
interface
{},
err
error
)
{
switch
reqMethod
{
func
(
p
*
LSPServer
)
Run
()
error
{
ctx
:=
context
.
Background
()
for
{
req
,
err
:=
p
.
conn
.
RecvRequest
()
if
err
!=
nil
{
return
err
}
var
resp
=
&
lspResponse
{
ID
:
req
.
ID
,
JSONRPC
:
req
.
JSONRPC
,
}
resp
.
Result
,
err
=
p
.
handleMethod
(
ctx
,
req
)
if
err
!=
nil
{
resp
.
Error
=
&
lspError
{
Message
:
err
.
Error
(),
}
}
if
err
=
p
.
conn
.
SendRespose
(
resp
);
err
!=
nil
{
// log
}
}
}
func
(
p
*
LSPServer
)
handleMethod
(
ctx
context
.
Context
,
req
*
lspRequest
)
(
result
interface
{},
err
error
)
{
var
argsData
[]
byte
if
len
(
req
.
Params
)
>
0
{
argsData
=
[]
byte
(
req
.
Params
[
0
])
}
switch
req
.
Method
{
case
"initialized"
:
return
case
"textDocument/didOpen"
:
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录