File indexing completed on 2024-05-19 15:42:37
0001 /* 0002 SPDX-FileCopyrightText: 2013-2015 Sven Brauch <mail@svenbrauch.de> 0003 SPDX-FileCopyrightText: 2016-2017 Francis Herne <mail@flherne.uk> 0004 0005 SPDX-License-Identifier: LGPL-2.0-or-later 0006 */ 0007 0008 #ifndef RANGEFIXVISITOR_H 0009 #define RANGEFIXVISITOR_H 0010 0011 #include <QRegularExpression> 0012 0013 #include "astdefaultvisitor.h" 0014 0015 namespace Python { 0016 0017 /** 0018 * This visitor attempts to give each AST node the correct range, 0019 * with workarounds for unset or incorrect (for our purposes) ranges 0020 * that are supplied by the CPython parser. 0021 */ 0022 class KDEVPYTHONPARSER_NO_EXPORT RangeFixVisitor : public AstDefaultVisitor { 0023 public: 0024 RangeFixVisitor(const QString& contents) : lines(contents.split('\n')) {}; 0025 void visitNode(Ast* node) override; 0026 void visitCode(Python::CodeAst* node) override; 0027 void visitFunctionDefinition(FunctionDefinitionAst* node) override; 0028 void visitClassDefinition(ClassDefinitionAst* node) override; 0029 void visitAttribute(AttributeAst* node) override; 0030 void visitImport(ImportAst* node) override; 0031 void visitExceptionHandler(ExceptionHandlerAst* node) override; 0032 void visitString(Python::StringAst* node) override; 0033 void visitBytes(Python::BytesAst* node) override; 0034 void visitFormattedValue(Python::FormattedValueAst * node) override; 0035 void visitNumber(Python::NumberAst* node) override; 0036 void visitSubscript(Python::SubscriptAst* node) override; 0037 void visitComprehension(Python::ComprehensionAst* node) override; 0038 void visitList(Python::ListAst* node) override; 0039 void visitTuple(Python::TupleAst* node) override; 0040 0041 private: 0042 void cutDefinitionPreamble(Ast* fixNode, const QString& defKeyword); 0043 int backtrackDottedName(const QString& data, const int start); 0044 void fixAlias(Ast* dotted, Ast* asname, const int startLine, int aliasIndex); 0045 int whitespaceAtEnd(const QString& line); 0046 0047 const QStringList lines; 0048 QVector<KTextEditor::Cursor> dots; 0049 KTextEditor::Cursor attributeStart; 0050 static const QRegularExpression findString; 0051 static const QRegularExpression findNumber; 0052 }; 0053 0054 } 0055 0056 #endif // RANGEFIXVISITOR_H