74 class Request0(name: String) |
74 class Request0(name: String) |
75 { |
75 { |
76 def unapply(json: JSON.T): Option[Id] = |
76 def unapply(json: JSON.T): Option[Id] = |
77 json match { |
77 json match { |
78 case RequestMessage(id, method, _) if method == name => Some(id) |
78 case RequestMessage(id, method, _) if method == name => Some(id) |
|
79 case _ => None |
|
80 } |
|
81 } |
|
82 |
|
83 class RequestTextDocumentPosition(name: String) |
|
84 { |
|
85 def unapply(json: JSON.T): Option[(Id, String, Line.Position)] = |
|
86 json match { |
|
87 case RequestMessage(id, method, Some(TextDocumentPosition(uri, pos))) if method == name => |
|
88 Some((id, uri, pos)) |
79 case _ => None |
89 case _ => None |
80 } |
90 } |
81 } |
91 } |
82 |
92 |
83 |
93 |
123 } |
133 } |
124 |
134 |
125 object ServerCapabilities |
135 object ServerCapabilities |
126 { |
136 { |
127 val json: JSON.T = |
137 val json: JSON.T = |
128 Map("textDocumentSync" -> 1, "hoverProvider" -> true) |
138 Map( |
|
139 "textDocumentSync" -> 1, |
|
140 "hoverProvider" -> true, |
|
141 "definitionProvider" -> true) |
129 } |
142 } |
130 |
143 |
131 object Shutdown extends Request0("shutdown") |
144 object Shutdown extends Request0("shutdown") |
132 { |
145 { |
133 def reply(id: Id, error: String): JSON.T = |
146 def reply(id: Id, error: String): JSON.T = |
275 object DidSaveTextDocument extends TextDocumentNotification("textDocument/didSave") |
288 object DidSaveTextDocument extends TextDocumentNotification("textDocument/didSave") |
276 |
289 |
277 |
290 |
278 /* hover request */ |
291 /* hover request */ |
279 |
292 |
280 object Hover |
293 object Hover extends RequestTextDocumentPosition("textDocument/hover") |
281 { |
294 { |
282 def unapply(json: JSON.T): Option[(Id, String, Line.Position)] = |
|
283 json match { |
|
284 case RequestMessage(id, "textDocument/hover", Some(TextDocumentPosition(uri, pos))) => |
|
285 Some((id, uri, pos)) |
|
286 case _ => None |
|
287 } |
|
288 |
|
289 def reply(id: Id, result: Option[(Line.Range, List[String])]): JSON.T = |
295 def reply(id: Id, result: Option[(Line.Range, List[String])]): JSON.T = |
290 { |
296 { |
291 val res = |
297 val res = |
292 result match { |
298 result match { |
293 case Some((range, contents)) => Map("contents" -> contents, "range" -> Range(range)) |
299 case Some((range, contents)) => Map("contents" -> contents, "range" -> Range(range)) |
294 case None => Map("contents" -> Nil) |
300 case None => Map("contents" -> Nil) |
295 } |
301 } |
296 ResponseMessage(id, Some(res)) |
302 ResponseMessage(id, Some(res)) |
297 } |
303 } |
298 } |
304 } |
|
305 |
|
306 |
|
307 /* goto definition request */ |
|
308 |
|
309 object GotoDefinition extends RequestTextDocumentPosition("textDocument/definition") |
|
310 { |
|
311 def reply(id: Id, result: List[(String, Line.Range)]): JSON.T = |
|
312 ResponseMessage(id, Some(result.map({ case (uri, range) => Location.apply(uri, range) }))) |
|
313 } |
299 } |
314 } |