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 f5b3bee763af939ac7897df4dcfbe9ee6e75e19e..fa299dac4c294998a38c3656a84797fefe1a8592 100644 --- a/ivette/src/frama-c/api/generated/kernel/ast/index.ts +++ b/ivette/src/frama-c/api/generated/kernel/ast/index.ts @@ -71,9 +71,9 @@ const compute_internal: Server.ExecRequest<null,null> = { /** Ensures that AST is computed */ export const compute: Server.ExecRequest<null,null>= compute_internal; -/** Emitted when the AST has been computed */ -export const computed: Server.Signal = { - name: 'kernel.ast.computed', +/** Emitted when the AST has been changed */ +export const changed: Server.Signal = { + name: 'kernel.ast.changed', }; /** Marker kind */ diff --git a/ivette/src/frama-c/kernel/ASTview.tsx b/ivette/src/frama-c/kernel/ASTview.tsx index d127bba677eb8472f55e5ea035994f2b5e0f89fc..76879dcfca9675d4aa1aeffa73711ae6ac734aac 100644 --- a/ivette/src/frama-c/kernel/ASTview.tsx +++ b/ivette/src/frama-c/kernel/ASTview.tsx @@ -213,7 +213,7 @@ export default function ASTview() { }); // Also reload the buffer when the AST is recomputed. - Server.onSignal(Ast.computed, reload); + Server.onSignal(Ast.changed, reload); React.useEffect(() => { const decorator = (marker: string) => { diff --git a/ivette/src/frama-c/menu.ts b/ivette/src/frama-c/menu.ts index 66fc3b9a8b54b21d42554817124ab7a1ef121990..bb9a411c8b8608852f228b25dacf02f33af8f835 100644 --- a/ivette/src/frama-c/menu.ts +++ b/ivette/src/frama-c/menu.ts @@ -28,6 +28,7 @@ import * as Dome from 'dome'; import * as Dialogs from 'dome/dialogs'; import * as Server from 'frama-c/server'; import * as Ast from 'frama-c/api/kernel/ast'; +import * as States from 'frama-c/states'; const cFilter = { name: 'C source files', @@ -43,8 +44,11 @@ async function setFiles(): Promise<void> { title: 'Select C source files', filters: [cFilter, allFilter], }); - await Server.send(Ast.setFiles, files); - await Server.send(Ast.compute, { }); + if (files) { + await Server.send(Ast.setFiles, files); + await Server.send(Ast.compute, { }); + States.resetSelection(); + } return; } @@ -52,7 +56,7 @@ export function init() { Dome.addMenuItem({ menu: 'File', label: 'Set source files', - id: 'file_add', + id: 'file_set', onClick: setFiles, type: 'normal', }); diff --git a/ivette/src/frama-c/states.ts b/ivette/src/frama-c/states.ts index 39786ef5aadea06bc25b51532aa4b0c9e0fa72c9..7900638fce9c60e9ef144f3f82a39985d6b2f962 100644 --- a/ivette/src/frama-c/states.ts +++ b/ivette/src/frama-c/states.ts @@ -772,21 +772,23 @@ export function useSelection(): [Selection, (a: SelectionActions) => void] { return [current, (action) => setCurrent(reducer(current, action))]; } -/* Select the main function when the AST is recomputed, or when the current - project changes and the selection is still empty. */ -async function selectMainFunction() { +/** Resets the selected locations. */ +export async function resetSelection() { + GlobalSelection.setValue(emptySelection); const main = await Server.send(Ast.getMainFunction, { }); const selection = { ...emptySelection, current: { fct: main }, }; - GlobalSelection.setValue(selection); + // If the selection has already been modified, do not change it. + if (GlobalSelection.getValue() === emptySelection) + GlobalSelection.setValue(selection); } -Server.onSignal(Ast.computed, selectMainFunction); +/* Select the main function when the current project changes and the selection + is still empty (which happens at the start of the GUI). */ PROJECT.on(async () => { - const selection = GlobalSelection.getValue(); - if (selection === emptySelection) - selectMainFunction(); + if (GlobalSelection.getValue() === emptySelection) + resetSelection(); }); // -------------------------------------------------------------------------- diff --git a/src/plugins/server/kernel_ast.ml b/src/plugins/server/kernel_ast.ml index 6a83fdf6c71401cc0a5d945c300c12071d07125a..57794fc7dfb9c2332082940a136deeb9901f2316 100644 --- a/src/plugins/server/kernel_ast.ml +++ b/src/plugins/server/kernel_ast.ml @@ -37,15 +37,15 @@ let () = Request.register ~package ~descr:(Md.plain "Ensures that AST is computed") ~input:(module Junit) ~output:(module Junit) Ast.compute -let computed_signal = Request.signal ~package ~name:"computed" - ~descr:(Md.plain "Emitted when the AST has been computed") - -let () = Ast.apply_after_computed (fun _ -> Request.emit computed_signal) +let changed_signal = Request.signal ~package ~name:"changed" + ~descr:(Md.plain "Emitted when the AST has been changed") let ast_update_hook f = Ast.add_hook_on_update f; Ast.apply_after_computed (fun _ -> f ()) +let () = ast_update_hook (fun _ -> Request.emit changed_signal) + (* -------------------------------------------------------------------------- *) (* --- Printers --- *) (* -------------------------------------------------------------------------- *)