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