File indexing completed on 2024-05-19 15:42:35

0001 #pragma once
0002 #include "kdevpythonversion.h"
0003 #include "python_grammar.h"
0004 
0005 namespace Python
0006 {
0007 
0008 class PyObjectRef {
0009 public:
0010     PyObjectRef(PyObject* py_obj): obj(py_obj) {}
0011     operator PyObject*() const {
0012         return obj;
0013     }
0014     ~PyObjectRef() {
0015         Py_XDECREF(obj);
0016         obj = nullptr;
0017     }
0018     PyObject* obj = nullptr;
0019 };
0020 
0021 
0022 class AstTransformer {
0023 public:
0024     CodeAst* ast;
0025     Grammar grammar;
0026 
0027     AstTransformer() {}
0028 
0029     void run(PyObject *syntaxtree, QString moduleName) {
0030         ast = static_cast<CodeAst*>(visitModuleNode(syntaxtree, nullptr));
0031         ast->name = new Identifier(moduleName);
0032     }
0033     // Shift lines by some fixed amount
0034     inline int tline(int line) {
0035         if ( line == -99999 ) {
0036             // don't touch the marker
0037             return -99999;
0038         }
0039         return line - 1;
0040     };
0041 
0042     template <class T>
0043     T getattr(PyObject *obj, const char *attr) const {
0044         return getattr<T>(obj, attr);
0045     }
0046 
0047 public:
0048     Ast* visitNode(PyObject* node, Ast* parent);
0049     template<typename K> QList<K*> visitNodeList(PyObject* node, Ast* parent);
0050     Ast* visitModuleNode(PyObject* node, Ast* parent);
0051     Ast* visitStmtNode(PyObject* node, Ast* parent);
0052     Ast* visitExprNode(PyObject* node, Ast* parent);
0053     Ast* visitComprehensionNode(PyObject* node, Ast* parent);
0054     Ast* visitExceptHandlerNode(PyObject* node, Ast* parent);
0055     Ast* visitArgumentsNode(PyObject* node, Ast* parent);
0056     Ast* visitArgNode(PyObject* node, Ast* parent);
0057     Ast* visitKeywordNode(PyObject* node, Ast* parent);
0058     Ast* visitAliasNode(PyObject* node, Ast* parent);
0059     Ast* visitWithItemNode(PyObject* node, Ast* parent);
0060     Ast* visitSliceNode(PyObject* node, Ast* parent);
0061 #if PYTHON_VERSION >= QT_VERSION_CHECK(3, 10, 0)
0062     Ast* visitMatchCaseNode(PyObject* node, Ast* parent);
0063     Ast* visitPatternNode(PyObject* node, Ast* parent);
0064 #endif
0065 #if PYTHON_VERSION >= QT_VERSION_CHECK(3, 11, 0)
0066     Ast* visitExceptStarNode(PyObject* node, Ast* parent);
0067 #endif
0068     void updateRanges(Ast* result);
0069 };
0070 
0071 } // namespace Python
0072