From a405cbced27ad3c47e5f209216739b2f51179150 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20B=C3=BChler?= <david.buhler@cea.fr> Date: Fri, 22 Oct 2021 19:24:18 +0200 Subject: [PATCH] [server] Adds request getMarkerAt returning the marker at a given file position. --- .../frama-c/api/generated/kernel/ast/index.ts | 21 ++++++++++++++++ src/plugins/server/kernel_ast.ml | 25 +++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/ivette/src/frama-c/api/generated/kernel/ast/index.ts b/ivette/src/frama-c/api/generated/kernel/ast/index.ts index 89d14dc6e85..e971013dd12 100644 --- a/ivette/src/frama-c/api/generated/kernel/ast/index.ts +++ b/ivette/src/frama-c/api/generated/kernel/ast/index.ts @@ -468,6 +468,27 @@ const getInfo_internal: Server.GetRequest<marker,text> = { /** Get textual information about a marker */ export const getInfo: Server.GetRequest<marker,text>= getInfo_internal; +const getMarkerAt_internal: Server.GetRequest< + [ string, number, number ], + [ Json.key<'#fct'> | undefined, marker | undefined ] + > = { + kind: Server.RqKind.GET, + name: 'kernel.ast.getMarkerAt', + input: Json.jTry( + Json.jTriple( + Json.jFail(Json.jString,'String expected'), + Json.jFail(Json.jNumber,'Number expected'), + Json.jFail(Json.jNumber,'Number expected'), + )), + output: Json.jTry(Json.jPair( Json.jKey<'#fct'>('#fct'), jMarker,)), + signals: [], +}; +/** Returns the marker and function at a source file position, if any. Input: file path, line and column. */ +export const getMarkerAt: Server.GetRequest< + [ string, number, number ], + [ Json.key<'#fct'> | undefined, marker | undefined ] + >= getMarkerAt_internal; + const getFiles_internal: Server.GetRequest<null,string[]> = { kind: Server.RqKind.GET, name: 'kernel.ast.getFiles', diff --git a/src/plugins/server/kernel_ast.ml b/src/plugins/server/kernel_ast.ml index d130f00bdd8..916a1277ace 100644 --- a/src/plugins/server/kernel_ast.ml +++ b/src/plugins/server/kernel_ast.ml @@ -612,6 +612,31 @@ let () = Request.register ~package ~input:(module Marker) ~output:(module Jtext) Info.get_marker_info +(* -------------------------------------------------------------------------- *) +(* --- Marker at a position --- *) +(* -------------------------------------------------------------------------- *) + +let get_kf_marker (file, line, col) = + let pos_path = Filepath.Normalized.of_string file in + let pos = + Filepath.{ pos_path; pos_lnum = line; pos_cnum = col; pos_bol = 0; } + in + let tag = Printer_tag.loc_to_localizable ~precise_col:true pos in + let kf = Option.bind tag Printer_tag.kf_of_localizable in + kf, tag + +let () = + let descr = + Md.plain + "Returns the marker and function at a source file position, if any. \ + Input: file path, line and column." + in + Request.register + ~package ~descr ~kind:`GET ~name:"getMarkerAt" + ~input:(module Jtriple (Jstring) (Jint) (Jint)) + ~output:(module Jpair (Joption (Kf)) (Joption (Marker))) + get_kf_marker + (* -------------------------------------------------------------------------- *) (* --- Files --- *) (* -------------------------------------------------------------------------- *) -- GitLab