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