File indexing completed on 2024-04-14 04:31:15

0001 /* This file is part of KDevelop
0002  *
0003  * Copyright (C) 2011-2015 Miquel Sabaté Solà <mikisabate@gmail.com>
0004  *
0005  * This program is free software: you can redistribute it and/or modify
0006  * it under the terms of the GNU General Public License as published by
0007  * the Free Software Foundation, either version 3 of the License, or
0008  * (at your option) any later version.
0009  *
0010  * This program is distributed in the hope that it will be useful,
0011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
0012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0013  * GNU General Public License for more details.
0014  *
0015  * You should have received a copy of the GNU General Public License
0016  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
0017  */
0018 
0019 #ifndef RUBY_AST_VISITOR_H
0020 #define RUBY_AST_VISITOR_H
0021 
0022 #include <parser/ast.h>
0023 #include <parser/export.h>
0024 
0025 namespace ruby {
0026 
0027 /**
0028  * @class AstVisitor
0029  *
0030  * This class represents the Visitor of the Ast class.
0031  */
0032 class KDEVRUBYPARSER_EXPORT AstVisitor
0033 {
0034 public:
0035     virtual ~AstVisitor();
0036 
0037     /**
0038      * This is the entry point of the visitor. It means that to visit a
0039      * valid Ast we should call this method.
0040      *
0041      * @param node The root of the AST.
0042      */
0043     void visitCode(Ast *node);
0044 
0045     /**
0046      * Given a node, it calls the appropiate method in order to successfully
0047      * visit this node.
0048      *
0049      * @param node The given node.
0050      */
0051     void visitNode(Ast *node);
0052 
0053 protected:
0054     /**
0055      * @returns true if the given name identifies an variable/method/... that
0056      * has already been declared in the current context. This method will be
0057      * called when it's needed to resolve the ambiguity of special methods like:
0058      * require, include, ...
0059      */
0060     virtual bool declaredInContext(const QByteArray &name) const = 0;
0061 
0062 protected:
0063     /// And the following is a list of methods that can be overriden.
0064 
0065     virtual void visitName(Ast *node);
0066     virtual void visitString(Ast *node);
0067     virtual void visitRegexp(Ast *node);
0068     virtual void visitNumeric(Ast *node);
0069     virtual void visitSymbol(Ast *node);
0070     virtual void visitBody(Ast *node);
0071     virtual void visitBinary(Ast *node);
0072     virtual void visitBoolean(Ast *node);
0073     virtual void visitRange(Ast *node);
0074     virtual void visitUnary(Ast *node);
0075     virtual void visitArray(Ast *node);
0076     virtual void visitArrayValue(Ast *node);
0077     virtual void visitHash(Ast *node);
0078     virtual void visitReturnStatement(Ast *node);
0079     virtual void visitUndefStatement(Ast *node);
0080     virtual void visitAliasStatement(Ast *node);
0081     virtual void visitYieldStatement(Ast *node);
0082     virtual void visitAssignmentStatement(Ast *node);
0083     virtual void visitIfStatement(Ast *node);
0084     virtual void visitCaseStatement(Ast *node);
0085     virtual void visitBeginStatement(Ast *node);
0086     virtual void visitUpBeginEndStatement(Ast *node);
0087     virtual void visitWhileStatement(Ast *node);
0088     virtual void visitForStatement(Ast *node);
0089     virtual void visitMethodStatement(Ast *node);
0090     virtual void visitMethodArguments(Ast *node);
0091     virtual void visitParameter(Ast *node);
0092     virtual void visitClassStatement(Ast *node);
0093     virtual void visitSingletonClass(Ast *node);
0094     virtual void visitModuleStatement(Ast *node);
0095     virtual void visitMethodCall(Ast *node);
0096     virtual void visitSuper(Ast *node);
0097     virtual void visitLambda(Ast *node);
0098     virtual void visitBlock(Ast *node);
0099     virtual void visitBlockVariables(Ast *node);
0100     virtual void visitRequire(Ast *node, bool relative = false);
0101     virtual void visitMixin(Ast *node, bool include);
0102     virtual void visitDefined(Ast *node);
0103     virtual void visitTrue(Ast *node);
0104     virtual void visitFalse(Ast *node);
0105     virtual void visitNil(Ast *node);
0106     virtual void visitLine(Ast *node);
0107     virtual void visitFile(Ast *node);
0108     virtual void visitEncoding(Ast *node);
0109     virtual void visitSelf(Ast *node);
0110     virtual void visitAccessSpecifier(const access_t policy);
0111     virtual void visitClassName(Ast *node);
0112     virtual void visitRescue(Ast *node);
0113     virtual void visitRescueArg(Ast *node);
0114     virtual void visitEnsure(Ast *node);
0115 
0116 private:
0117     /**
0118      * @internal Helper method useful to visit a list of statements.
0119      *
0120      * @param list A node that is the first item of a list of nodes.
0121      */
0122     void visitStatements(Ast *list);
0123 
0124     /**
0125      * @internal Helper method used for the visitIfStatement method. Its
0126      * goal is to visit a tail of an if statement.
0127      *
0128      * @param tail The tail of an if statement.
0129      */
0130     void visitIfTail(Ast *tail);
0131 
0132     /**
0133      * @internal Helper method that goes through a list of when statements.
0134      * Obviously, this method is used by the visitCaseStatement method.
0135      *
0136      * @param list A node that is the first item of a list of when statements.
0137      */
0138     void visitWhenStatements(Ast *list);
0139 
0140     /**
0141      * @internal Helper method that checks if this is either a require, an
0142      * include/extend or just a regular method call.
0143      *
0144      * @param mc The given method call node.
0145      */
0146     void checkMethodCall(Ast *mc);
0147 };
0148 
0149 }
0150 
0151 #endif // RUBY_ASTVISITOR_H
0152