Skip to content

Instantly share code, notes, and snippets.

@ZacLN
Created November 1, 2016 17:18
Show Gist options
  • Save ZacLN/d84fd47540d83303ab6b34e10bab6525 to your computer and use it in GitHub Desktop.
Save ZacLN/d84fd47540d83303ab6b34e10bab6525 to your computer and use it in GitHub Desktop.
# Structure
# client sends : message::String
# JSON.parse() : message::String -> message_json::Dict
# Request() : message_json::Dict -> req::Request{method,parametertype}
# Respond{m,pt}() : req::Request{m,pt} -> resp::Response{m,returntype}
# JSON.json() : resp::Response{m,returntype} -> retmessage::String
# return : retmessage::String
# A whole load of these for all parameter structures listed in the language-server protocol
type Position
line::Int
character::Int
end
Position(d::Dict) = Position(d["line"],d["character"])
abstract Method
abstract hover <: Method
type Hover <: Response
contents::String
range::Range #?
end
type Request{m<:Method,T}
id::Int
params::T
end
function Request(d::Dict)
m = d["method"]
if m=="textDocument/hover"
return Request{hover,TextDocumentPositionParams}(d["id"],TextDocumentPositionParams(d["params"]))
end
end
function Respond(r::Request{hover,TextDocumentPositionParams})
d = documents[r.params.textDocument.uri]
cnt=0
s=1
while cnt<r.params.position.line-1
cnt+=1
s=search(d,'\n',s)+1
end
line = d[s:search(d,'\n',s)]
word = getfullname(line,r.params.position.character)
try
d = Docs.doc(getfield(Main,Symbol(word)))
return Response{hover,Hover}(r.id,Hover(d,Range()))
catch err
return Response{hover,Exception}(r.id,err)
end
end
message = read_transport_layer(conn)
message_json = JSON.parse(message)
request = Request(message_json)
response = Respond(request)
write_transport_layer(conn,response)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment