Browse Source

[display] add json output for positions

Dan Korostelev 9 years ago
parent
commit
a65a5adbc1
2 changed files with 21 additions and 6 deletions
  1. 14 3
      src/display/display.ml
  2. 7 3
      src/syntax/lexer.mll

+ 14 - 3
src/display/display.ml

@@ -132,9 +132,21 @@ module SymbolInformation = struct
 	}
 	}
 end
 end
 
 
-open Json
 open SymbolKind
 open SymbolKind
 open SymbolInformation
 open SymbolInformation
+open Json
+
+let pos_to_json_location p =
+	if p.pmin = -1 then
+		JNull
+	else
+		let l1, p1, l2, p2 = Lexer.get_pos_coords p in
+		let to_json l c = JObject [("line", JInt l); ("character", JInt c)] in
+		JObject [
+			("file", JString (Common.unique_full_path p.pfile));
+			("start", to_json l1 p1);
+			("end", to_json l2 p2);
+		]
 
 
 let print_document_symbols (pack,decls) =
 let print_document_symbols (pack,decls) =
 	let l = DynArray.create() in
 	let l = DynArray.create() in
@@ -223,12 +235,11 @@ let print_document_symbols (pack,decls) =
 			let si_type = add d.d_name Class p si_pack in
 			let si_type = add d.d_name Class p si_pack in
 			List.iter (field si_type) d.d_data
 			List.iter (field si_type) d.d_data
 	) decls;
 	) decls;
-	let error_printer file line = Printf.sprintf "%s:%d:" (Common.unique_full_path file) line in
 	let jl = List.map (fun si ->
 	let jl = List.map (fun si ->
 		let l =
 		let l =
 			("name",JString si.name) ::
 			("name",JString si.name) ::
 			("kind",JInt (to_int si.kind)) ::
 			("kind",JInt (to_int si.kind)) ::
-			("location",JString (Lexer.get_error_pos error_printer si.location)) ::
+			("location", pos_to_json_location si.location) ::
 			(match si.containerName with None -> [] | Some s -> ["containerName",JString s])
 			(match si.containerName with None -> [] | Some s -> ["containerName",JString s])
 		in
 		in
 		JObject l
 		JObject l

+ 7 - 3
src/syntax/lexer.mll

@@ -182,13 +182,17 @@ let get_error_line p =
 	let l, _ = find_pos p in
 	let l, _ = find_pos p in
 	l
 	l
 
 
+let get_pos_coords p =
+	let file = find_file p.pfile in
+	let l1, p1 = find_line p.pmin file in
+	let l2, p2 = find_line p.pmax file in
+	l1, p1, l2, p2
+
 let get_error_pos printer p =
 let get_error_pos printer p =
 	if p.pmin = -1 then
 	if p.pmin = -1 then
 		"(unknown)"
 		"(unknown)"
 	else
 	else
-		let file = find_file p.pfile in
-		let l1, p1 = find_line p.pmin file in
-		let l2, p2 = find_line p.pmax file in
+		let l1, p1, l2, p2 = get_pos_coords p in
 		if l1 = l2 then begin
 		if l1 = l2 then begin
 			let s = (if p1 = p2 then Printf.sprintf " %d" p1 else Printf.sprintf "s %d-%d" p1 p2) in
 			let s = (if p1 = p2 then Printf.sprintf " %d" p1 else Printf.sprintf "s %d-%d" p1 p2) in
 			Printf.sprintf "%s character%s" (printer p.pfile l1) s
 			Printf.sprintf "%s character%s" (printer p.pfile l1) s