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