diff options
author | Sergio Martins <sergio.martins@kdab.com> | 2019-06-10 12:15:45 +0100 |
---|---|---|
committer | Sergio Martins <sergio.martins@kdab.com> | 2019-06-10 12:15:45 +0100 |
commit | e50222c243b9eb067a319393b6a858de55a7e565 (patch) | |
tree | f5df9bff8a74625593e41d027295eeb13003c2bc | |
parent | e89a0230dcc43ef59a8f5b0530f02c48edd9491f (diff) |
WIP
-rwxr-xr-x | dev-scripts/miniAstDumper.py | 76 | ||||
-rw-r--r-- | src/MiniAstDumper.cpp | 52 | ||||
-rw-r--r-- | src/MiniAstDumper.h | 5 |
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 |