aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSergio Martins <sergio.martins@kdab.com>2019-06-10 12:15:45 +0100
committerSergio Martins <sergio.martins@kdab.com>2019-06-10 12:15:45 +0100
commite50222c243b9eb067a319393b6a858de55a7e565 (patch)
treef5df9bff8a74625593e41d027295eeb13003c2bc
parente89a0230dcc43ef59a8f5b0530f02c48edd9491f (diff)
WIP
-rwxr-xr-xdev-scripts/miniAstDumper.py76
-rw-r--r--src/MiniAstDumper.cpp52
-rw-r--r--src/MiniAstDumper.h5
3 files changed, 121 insertions, 12 deletions
diff --git a/dev-scripts/miniAstDumper.py b/dev-scripts/miniAstDumper.py
new file mode 100755
index 00000000..8f6652aa
--- /dev/null
+++ b/dev-scripts/miniAstDumper.py
@@ -0,0 +1,76 @@
+#!/usr/bin/env python
+
+import cbor, sys, time
+
+
+class FunctionCall:
+ def __init__(self):
+ self.callee_name = ""
+
+class CXXMethod:
+ def __init__(self):
+ self.id = 0
+ self.qualified_name = ""
+ self.method_flags = 0
+
+class CXXClass:
+ def __init__(self):
+ self.id = 0
+ self.qualified_name = ""
+ self.methods = []
+ self.class_flags = 0
+
+class GlobalAST:
+ def __init__(self):
+ self.cxx_classes = []
+ self.function_calls = []
+
+
+_globalAST = GlobalAST()
+
+def read_file(filename):
+ f = open(filename, 'rb')
+ contents = f.read()
+ f.close()
+ return contents
+
+def read_cbor(filename):
+ contents = read_file(filename);
+ return cbor.loads(contents)
+
+def load_cbor(filename, globalAST):
+ cborData = read_cbor(filename)
+
+ if 'stuff' in cborData:
+ for stuff in cborData['stuff']:
+ if 'type' in stuff:
+ if stuff['type'] == 31: # CXXRecordDecl
+ cxxclass = CXXClass()
+ cxxclass.id = stuff['id']
+ cxxclass.qualified_name = stuff['name']
+
+ if 'methods' in stuff:
+ for m in stuff['methods']:
+ method = CXXMethod()
+ methods.id = m['id']
+ methods.qualified_name = m['name']
+ cxxclass.methods.append(method)
+
+
+
+ globalAST.cxx_classes.append(cxxclass)
+ elif stuff['type'] == 48: # CallExpr
+ funccall = FunctionCall()
+ funccall.callee_name = stuff['calleeName']
+ globalAST.function_calls.append(funccall)
+
+
+
+
+load_cbor(sys.argv[1], _globalAST)
+
+
+for c in _globalAST.cxx_classes:
+ print(c.qualified_name)
+
+#print(cborData)
diff --git a/src/MiniAstDumper.cpp b/src/MiniAstDumper.cpp
index 1dbd1b44..d1a44772 100644
--- a/src/MiniAstDumper.cpp
+++ b/src/MiniAstDumper.cpp
@@ -24,6 +24,7 @@
#include "SourceCompatibilityHelpers.h"
#include "clazy_stl.h"
#include "StringUtils.h"
+#include "QtUtils.h"
#include <clang/Frontend/CompilerInstance.h>
#include <clang/Frontend/FrontendPluginRegistry.h>
@@ -142,16 +143,13 @@ void MiniASTDumperConsumer::dumpCXXMethodDecl(CXXMethodDecl *method, CborEncoder
cborEncodeString(recordMap, "id");
cborEncodeInt(recordMap, int64_t(method));
- //cborEncodeString(recordMap, "loc");
- //cborEncodeString(recordMap, clazy::getLocStart(method).printToString(m_ci.getSourceManager()).c_str());
-
cbor_encoder_close_container(encoder, &recordMap);
}
void MiniASTDumperConsumer::dumpCXXRecordDecl(CXXRecordDecl *rec, CborEncoder *encoder)
{
CborEncoder recordMap;
- cbor_encoder_create_map(encoder, &recordMap, 4);
+ cbor_encoder_create_map(encoder, &recordMap, CborIndefiniteLength);
cborEncodeString(recordMap, "type");
cborEncodeInt(recordMap, rec->getDeclKind());
@@ -162,17 +160,22 @@ void MiniASTDumperConsumer::dumpCXXRecordDecl(CXXRecordDecl *rec, CborEncoder *e
cborEncodeString(recordMap, "id");
cborEncodeInt(recordMap, int64_t(rec));
- cborEncodeString(recordMap, "loc"); // TODO: replace with file id
- cborEncodeString(recordMap, clazy::getLocStart(rec).printToString(m_ci.getSourceManager()).c_str());
+ cborEncodeString(recordMap, "loc");
+ dumpLocation(clazy::getLocStart(rec), &recordMap);
- cbor_encoder_close_container(&m_cborStuffArray, &recordMap);
+ if (clazy::isQObject(rec)) { // TODO: Use flags
+ cborEncodeString(recordMap, "isQObject");
+ cbor_encode_boolean(&recordMap, true);
+ }
+ cborEncodeString(recordMap, "methods");
CborEncoder cborMethodList;
- cbor_encoder_create_array(encoder, &cborMethodList, CborIndefiniteLength);
+ cbor_encoder_create_array(&recordMap, &cborMethodList, CborIndefiniteLength);
for (auto method : rec->methods()) {
dumpCXXMethodDecl(method, &cborMethodList);
}
- cbor_encoder_close_container(encoder, &cborMethodList);
+ cbor_encoder_close_container(encoder, &cborMethodList);*/
+ cbor_encoder_close_container(&m_cborStuffArray, &recordMap);
}
void MiniASTDumperConsumer::dumpCallExpr(CallExpr *callExpr, CborEncoder *encoder)
@@ -214,7 +217,6 @@ void MiniASTDumperConsumer::dumpLocation(SourceLocation loc, CborEncoder *encode
cborEncodeString(locMap, "column");
cborEncodeInt(locMap, ploc.getColumn());
-
cbor_encoder_close_container(encoder, &locMap);
}
@@ -233,12 +235,38 @@ void MiniASTDumperConsumer::dumpFileMap(CborEncoder *encoder)
void MiniASTDumperConsumer::cborEncodeString(CborEncoder &enc, const char *str)
{
- cbor_encode_text_stringz(&enc, str);
+ if (cbor_encode_text_stringz(&enc, str) != CborNoError)
+ llvm::errs() << "cborEncodeString error\n";
}
void MiniASTDumperConsumer::cborEncodeInt(CborEncoder &enc, int64_t v)
{
- cbor_encode_int(&enc, v);
+ if (cbor_encode_int(&enc, v) != CborNoError)
+ llvm::errs() << "cborEncodeInt error\n";
+}
+
+void MiniASTDumperConsumer::cborEncodeBool(CborEncoder &enc, bool b)
+{
+ if (cbor_encode_boolean(&enc, b) != CborNoError)
+ llvm::errs() << "cborEncodeBool error\n";
+}
+
+void MiniASTDumperConsumer::cborCreateMap(CborEncoder *encoder, CborEncoder *mapEncoder, size_t length)
+{
+ if (cbor_encoder_create_map(encoder, mapEncoder, length) != CborNoError)
+ llvm::errs() << "cborCreateMap error\n";
+}
+
+void MiniASTDumperConsumer::cborCreateArray(CborEncoder *encoder, CborEncoder *arrayEncoder, size_t length)
+{
+ if (cbor_encoder_create_array(encoder, arrayEncoder, length) != CborNoError)
+ llvm::errs() << "cborCreateMap error\n";
+}
+
+void MiniASTDumperConsumer::cborCloseContainer(CborEncoder *encoder, const CborEncoder *containerEncoder)
+{
+ if (cbor_encoder_close_container(encoder, containerEncoder) != CborNoError)
+ llvm::errs() << "cborCloseContainer error\n";
}
static FrontendPluginRegistry::Add<MiniAstDumperASTAction>
diff --git a/src/MiniAstDumper.h b/src/MiniAstDumper.h
index eb4823bf..53ac3f3c 100644
--- a/src/MiniAstDumper.h
+++ b/src/MiniAstDumper.h
@@ -73,6 +73,11 @@ private:
void cborEncodeString(CborEncoder&, const char *);
void cborEncodeInt(CborEncoder&, int64_t);
+ void cborEncodeBool(CborEncoder &enc, bool);
+ void cborCreateMap(CborEncoder *encoder, CborEncoder *mapEncoder, size_t length);
+ void cborCreateArray(CborEncoder *encoder, CborEncoder *mapEncoder, size_t length);
+ void cborCloseContainer(CborEncoder *encoder, const CborEncoder *containerEncoder);
+
uint8_t *m_cborBuf = nullptr;
size_t m_bufferSize = 1024 * 1024 * 20; // 20MB to start with