File indexing completed on 2024-04-28 08:26:59
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