From 4c48a2fffcb5798860d17a3b8c50ac6e36397deb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Loi=CC=88c=20Correnson?= <loic.correnson@cea.fr> Date: Fri, 6 Mar 2020 16:11:59 +0100 Subject: [PATCH] [ivette] load function and display AST --- ivette/.gitignore | 1 + ivette/foo.i | 12 +++++ ivette/src/dome/src/renderer/table/arrays.js | 2 +- ivette/src/frama-c/states.js | 4 +- ivette/src/renderer/ASTview.js | 47 +++++++++++++++++++- 5 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 ivette/foo.i diff --git a/ivette/.gitignore b/ivette/.gitignore index da037a9e2fa..994f69553f0 100644 --- a/ivette/.gitignore +++ b/ivette/.gitignore @@ -10,5 +10,6 @@ yarn-error.log /bin /dist /doc/html +/src/dome # -------------------------------------------------------------------------- diff --git a/ivette/foo.i b/ivette/foo.i new file mode 100644 index 00000000000..336eb7fa6e6 --- /dev/null +++ b/ivette/foo.i @@ -0,0 +1,12 @@ +// Test for Ivette + +int main(int x,int y) +{ + int k ; + if (0 < x) k = 0; + k += x ; + k += y ; + k += x ; + k += y ; + return k; +} diff --git a/ivette/src/dome/src/renderer/table/arrays.js b/ivette/src/dome/src/renderer/table/arrays.js index b8df09d5e86..cfd5ef18555 100644 --- a/ivette/src/dome/src/renderer/table/arrays.js +++ b/ivette/src/dome/src/renderer/table/arrays.js @@ -78,7 +78,7 @@ const chainableOrder = ( order ) => { const compare = (a,b) => { for (var k = 0; k < order.length ; k++) { const cmp = (order[k])(a,b); - if (cmp) return cmp; + if (cmp !==0 ) return cmp; } return 0; }; diff --git a/ivette/src/frama-c/states.js b/ivette/src/frama-c/states.js index 6bc2b21470f..334a49f065f 100644 --- a/ivette/src/frama-c/states.js +++ b/ivette/src/frama-c/states.js @@ -356,8 +356,10 @@ class SyncArray updated.forEach((item) => { this.index[item.key] = item; }); - if (reloaded || removed.length || updated.length) + if (reloaded || removed.length || updated.length) { + this.index = Object.assign( {}, this.index ); Dome.emit( this.UPDATE ); + } if (pending>0) { this.fetch(); } diff --git a/ivette/src/renderer/ASTview.js b/ivette/src/renderer/ASTview.js index ae39f1c8c5a..0085ebf7cbf 100644 --- a/ivette/src/renderer/ASTview.js +++ b/ivette/src/renderer/ASTview.js @@ -5,9 +5,34 @@ import _ from 'lodash' ; import React from 'react' ; import Dome from 'dome' ; +import Server from 'frama-c/server' ; import States from 'frama-c/states' ; + +import { Vfill } from 'dome/layout/boxes' ; +import { Buffer } from 'dome/text/buffers' ; +import { Text } from 'dome/text/editors' ; import { Component } from 'frama-c/labviews' ; +import 'codemirror/mode/clike/clike.js'; +import 'codemirror/theme/ambiance.css' ; + +// -------------------------------------------------------------------------- +// --- Rich Text Printer +// -------------------------------------------------------------------------- + +const print = async (buffer, text) => { + if (Array.isArray(text)) { + const tag = text.shift(); + if (tag !== '') + buffer.openTextMarker( { id:tag } ); + for (const k in text) + await print(buffer, text[k]); + if (tag !== '') + buffer.closeTextMarker(); + } else if (typeof(text)==='string') + buffer.append(text); +}; + // -------------------------------------------------------------------------- // --- AST Printer // -------------------------------------------------------------------------- @@ -15,13 +40,31 @@ import { Component } from 'frama-c/labviews' ; const ASTview = () => { // Hooks + const buffer = React.useMemo( () => new Buffer(), []); const [ select, setSelect ] = States.useSelection(); + const theFunction = select && select.function ; + React.useEffect( () => { + buffer.clear(); + if (theFunction) { + buffer.log('Loading',theFunction,'…'); + Server + .sendGET("kernel.ast.printFunction", theFunction) + .then(data => { + buffer.clear(); + return print(buffer,data); + }); + } + }, [ theFunction ] ); return ( - <div> + <Vfill> <div>Function: {select && select.function}</div> <div>Marker: {select && select.marker}</div> - </div> + <Text buffer={buffer} + mode='text/x-csrc' + theme='ambiance' + readOnly /> + </Vfill> ); }; -- GitLab