1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316
|
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//
// Copyright : (C) 2015 Eran Ifrah
// File name : PHPSourceFile.h
//
// -------------------------------------------------------------------------
// A
// _____ _ _ _ _
// / __ \ | | | | (_) |
// | / \/ ___ __| | ___| | _| |_ ___
// | | / _ \ / _ |/ _ \ | | | __/ _ )
// | \__/\ (_) | (_| | __/ |___| | || __/
// \____/\___/ \__,_|\___\_____/_|\__\___|
//
// F i l e
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
#ifndef PHPPARSER_H
#define PHPPARSER_H
#include "PHPEntityBase.h"
#include "PhpLexerAPI.h"
#include "codelite_exports.h"
#include <vector>
#include <wx/filename.h>
class WXDLLIMPEXP_CL PHPLookupTable;
class WXDLLIMPEXP_CL PHPSourceFile
{
wxString m_text;
PHPEntityBase::List_t m_scopes;
PHPEntityBase::List_t m_defines;
PHPScanner_t m_scanner;
wxFileName m_filename;
std::vector<phpLexerToken> m_lookBackTokens;
std::vector<phpLexerToken> m_comments;
bool m_parseFunctionBody;
int m_depth;
bool m_reachedEOF;
// aliases defined by the 'use' operator
std::map<wxString, wxString> m_aliases;
PHPSourceFile* m_converter = nullptr;
PHPLookupTable* m_lookup = nullptr;
PHPEntityBase::List_t m_allMatchesInorder;
public:
typedef wxSharedPtr<PHPSourceFile> Ptr_t;
protected:
/**
* @brief the lexer just read $something = ...
* read the "..." and create a variable hint from it
*/
bool ReadVariableInitialization(PHPEntityBase::Ptr_t var);
/**
* @brief calls phpLexerNextToken. Use this call instead of the global phpLexerNextToken
* since this function will handle all PHP comments found
*/
bool NextToken(phpLexerToken& token);
/**
* @brief return the previous token
*/
phpLexerToken& GetPreviousToken();
/**
* @brief read until we found 'delim' (consume it)
*/
bool ReadUntilFound(int delim, phpLexerToken& token);
/**
* @brief read until we found 'delim1' or delim2 (return which one was found)
* or wxNOT_FOUND if non found
*/
int ReadUntilFoundOneOf(int delim1, int delim2, phpLexerToken& token);
/**
* @brief read expression from the current position until we hit
* semi colon
* @param tokens [output]
*/
bool ReadExpression(wxString& expression);
/**
* @brief unget the token
*/
void UngetToken(const phpLexerToken& token);
/**
* @brief run the lexer until we find 'delim' - consume delim as well
*/
bool ConsumeUntil(int delim);
/**
* @brief read list of identifiers separated by comma until we find 'delim'
* note that this function does not consume the 'delim' token
*/
bool ReadCommaSeparatedIdentifiers(int delim, wxArrayString& list);
/**
* @brief read the type
*/
wxString ReadType();
/**
* @brief PHP7 style: read the return value
*/
wxString ReadFunctionReturnValueFromSignature();
/**
* @brief read the value that comes after the 'extends' keyword
*/
wxString ReadExtends();
/**
* @brief read the tokens after the implements keyword
*/
void ReadImplements(wxArrayString& impls);
/**
* @brief parse 'use' statements (outer scope, for aliasing)
*/
void OnUse();
/**
* @brief parse 'use' statements inside class (usually this is done for 'traits')
*/
void OnUseTrait();
/**
* @brief we are looking at a case like:
* use A, B {
* B::bigTalk as talk;
* }
* parse the inner block and scan for aliases
*/
void ParseUseTraitsBody();
/**
* @brief found 'foreach' statement
*/
void OnForEach();
/**
* @brief 'namespace' keyword found
*/
void OnNamespace();
/**
* @brief 'function' keyword found
*/
void OnFunction();
/**
* @brief found catch keyword
*/
void OnCatch();
/**
* @brief found a global variable
*/
void OnVariable(const phpLexerToken& token);
/**
* @brief 'class' keyword found
*/
void OnClass(const phpLexerToken& tok);
/**
* @brief a define keyword was found
*/
void OnDefine(const phpLexerToken& tok);
/**
* @brief found constant
*/
void OnConstant(const phpLexerToken& tok);
/**
* @brief go over the look back tokens and extract all function flags
*/
size_t LookBackForFunctionFlags();
/**
* @brief go over the look back tokens and extract all variable flags
*/
size_t LookBackForVariablesFlags();
/**
* @brief return true of the look back tokens contains 'type'
*/
bool LookBackTokensContains(int type) const;
/**
* @brief parse function signature
*/
void ParseFunctionSignature(int startingDepth);
/**
* @brief consume the function body
*/
void ConsumeFunctionBody();
/**
* @brief parse function body and collect local variables +
* possible return statements
*/
void ParseFunctionBody();
/**
* @brief go over the loop back tokens and construct the type hint
*/
wxString LookBackForTypeHint();
/**
* @brief parse phase 2.
* On this stage, all phpdoc comments are assigned to the proper PHP entity
*/
void PhaseTwo();
wxString DoMakeIdentifierAbsolute(const wxString& type, bool exactMatch);
public:
PHPSourceFile(const wxFileName& filename, PHPLookupTable* lookup);
PHPSourceFile(const wxString& content, PHPLookupTable* lookup);
virtual ~PHPSourceFile();
/**
* @brief return a serialized list of all entries found in this source file
* sorted by line number
*/
const PHPEntityBase::List_t& GetAllMatchesInOrder();
/**
* @brief use a different PHPSourceFile class for converting types to their
* absolute path
* @param converter
*/
void SetTypeAbsoluteConverter(PHPSourceFile* converter) { m_converter = converter; }
/**
* @brief check if we are inside a PHP block at the end of the given buffer
*/
static bool IsInPHPSection(const wxString& buffer);
/**
* @brief return list of aliases (their short name) that appears on this file
*/
PHPEntityBase::List_t GetAliases() const;
/**
* @brief return list of defines defined in this source file
*/
const PHPEntityBase::List_t& GetDefines() const { return m_defines; }
/**
* @brief attempt to resolve 'type' to its full path
*/
wxString MakeIdentifierAbsolute(const wxString& type);
/**
* @brief attempt to resolve 'type' to its full path
*/
wxString MakeTypehintAbsolute(const wxString& type);
/**
* @brief prepend the current scope to the class name (or trait, interface...)
*/
wxString PrependCurrentScope(const wxString& className);
/**
* @brief return the source file text
*/
const wxString& GetText() const { return m_text; }
/**
* @brief parse the source file
*/
void Parse(int exitDepth = -1);
/**
* @brief return the current scope
*/
PHPEntityBase::Ptr_t CurrentScope();
/**
* @brief return the inner most class of the 'CurrentScope'
* Note that this function return a const raw pointer to the
* class
*/
const PHPEntityBase* Class();
/**
* @brief return the namespace scope of this file
*/
PHPEntityBase::Ptr_t Namespace();
// Accessors
void SetFilename(const wxFileName& filename) { this->m_filename = filename; }
const wxFileName& GetFilename() const { return m_filename; }
void SetParseFunctionBody(bool parseFunctionBody) { this->m_parseFunctionBody = parseFunctionBody; }
bool IsParseFunctionBody() const { return m_parseFunctionBody; }
void PrintStdout();
};
#endif // PHPPARSER_H
|