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
|
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//
// Copyright : (C) 2015 Eran Ifrah
// File name : php_code_completion.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 PHPCODECOMPLETION_H
#define PHPCODECOMPLETION_H
#include "PHPEntityBase.h"
#include "PHPExpression.h"
#include "PHPLookupTable.h"
#include "cl_command_event.h"
#include "ieditor.h"
#include "php_event.h"
#include "precompiled_header.h"
#include "wxStringHash.h"
#include <cc_box_tip_window.h>
#include <cl_command_event.h>
#include <smart_ptr.h>
#include <vector>
#include "ServiceProvider.h"
struct PHPLocation {
wxString what; // Token name
wxString filename; // file name (absolute path)
int linenumber; // line number within filename
PHPEntityBase::Ptr_t entity;
typedef SmartPtr<PHPLocation> Ptr_t;
};
class IManager;
class ResourceItem;
class PHPCodeCompletion : public ServiceProvider
{
public:
enum {
kCC_FUNCTIONS_ONLY = 0x00000001,
kCC_SELF_FUNCTIONS = 0x00000002, // self::
kCC_SELF_MEMBERS = 0x00000004, // self::
kCC_STATIC = 0x00000008, // static::
kCC_SELF = kCC_SELF_FUNCTIONS | kCC_SELF_MEMBERS,
};
static PHPCodeCompletion* Instance();
static void Release();
protected:
static PHPCodeCompletion* m_instance;
IManager* m_manager;
CCBoxTipWindow* m_typeInfoTooltip;
PHPLookupTable m_lookupTable;
std::unordered_map<wxString, PHPEntityBase::Ptr_t> m_currentNavBarFunctions;
static bool CanCodeComplete(clCodeCompletionEvent& e);
void DoShowCompletionBox(const PHPEntityBase::List_t& entries, PHPExpression::Ptr_t expr);
protected:
/**
* @brief convert PHP's entity to CodeLite's TagEntry class
* This is needed mainly for display purposes (CodeLite's API requires
* TagEntry for display)
* This function never fails.
*/
TagEntryPtr DoPHPEntityToTagEntry(PHPEntityBase::Ptr_t entry);
PHPEntityBase::Ptr_t DoGetPHPEntryUnderTheAtPos(IEditor* editor, int pos, bool forFunctionCalltip);
PHPEntityBase::List_t PhpKeywords(const wxString& prefix) const;
private:
PHPCodeCompletion();
virtual ~PHPCodeCompletion();
// Event handlers
void OnCodeComplete(clCodeCompletionEvent& e);
void OnCodeCompleteLangKeywords(clCodeCompletionEvent& e);
void OnFunctionCallTip(clCodeCompletionEvent& e);
void OnTypeinfoTip(clCodeCompletionEvent& e);
void OnCodeCompletionBoxDismissed(clCodeCompletionEvent& e);
void OnFindSymbol(clCodeCompletionEvent& e);
void OnQuickJump(clCodeCompletionEvent& e);
void OnInsertDoxyBlock(clCodeCompletionEvent& e);
void OnRetagWorkspace(wxCommandEvent& event);
void OnParseEnded(clParseEvent& event);
void OnUpdateNavigationBar(clCodeCompletionEvent& e);
void OnNavigationBarMenuSelectionMade(clCommandEvent& e);
void OnNavigationBarMenuShowing(clContextMenuEvent& e);
// Workspace events
void OnFileSaved(clCommandEvent& event);
void DoSelectInEditor(IEditor* editor, const wxString& what, int from);
void DoOpenEditorForEntry(PHPEntityBase::Ptr_t entry);
public:
/**
* @brief go to the definition of the word starting at pos
* @param editor
* @param pos
*/
void GotoDefinition(IEditor* editor, int pos);
void SetManager(IManager* manager) { this->m_manager = manager; }
/**
* @brief return a PHPLocation::Ptr_t for the declaration of the
* expression in the given editor / position
* @return a valid PHPLocation or NULL
*/
PHPLocation::Ptr_t FindDefinition(IEditor* editor, int pos);
/**
* @brief return the PHPEntity under the caret
*/
PHPEntityBase::Ptr_t GetPHPEntityAtPos(IEditor* editor, int pos);
/**
* @brief open the symbols database for the given workspace file.
* Close any opened database
*/
void Open(const wxFileName& workspaceFile);
/**
* @brief close the lookup database
*/
void Close();
/**
* @brief called by the PHP symbols cache job.
* This is to optimize the searching the database (loading the symbols into the
* memory forces a kernel caching)
*/
void OnSymbolsCached();
/**
* @brief same as the above function, but the caching went bad...
*/
void OnSymbolsCacheError();
/**
* @brief expand 'require_once' line (or any require) by replacing __file__ etc with the proper
* values and appending everything
*/
wxString ExpandRequire(const wxFileName& curfile, const wxString& require);
/**
* @brief return the best location for inserting generated code inside a class name
* @param filecontent
* @return wxNOT_FOUND when could not determine the location
*/
int GetLocationForSettersGetters(const wxString& filecontent, const wxString& classname);
/**
* @brief list members of a class defined in an editor at the current position
* This only returns member variables (i.e. no constants, nor static members)
*/
void GetMembers(IEditor* editor, PHPEntityBase::List_t& members, wxString& scope);
};
#endif // PHPCODECOMPLETION_H
|