void PHPCodeCompletion::OnFindSymbol(clCodeCompletionEvent& e) { e.Skip(); if(PHPWorkspace::Get()->IsOpen()) { if(!CanCodeComplete(e)) return; e.Skip(false); IEditor* editor = dynamic_cast<IEditor*>(e.GetEditor()); if(editor) { wxString word = editor->GetWordAtCaret(); if(word.IsEmpty()) return; PHPEntityBase::List_t symbols = m_lookupTable.FindSymbol(word); if(symbols.size() == 1) { PHPEntityBase::Ptr_t match = *symbols.begin(); DoOpenEditorForEntry(match); } else { // Convert the matches to clSelectSymbolDialogEntry::List_t clSelectSymbolDialogEntry::List_t entries; std::for_each(symbols.begin(), symbols.end(), [&](PHPEntityBase::Ptr_t entry) { TagEntryPtr tag = DoPHPEntityToTagEntry(entry); wxBitmap bmp = wxCodeCompletionBox::GetBitmap(tag); clSelectSymbolDialogEntry m; m.bmp = bmp; m.name = entry->GetFullName(); m.clientData = new PHPFindSymbol_ClientData(entry); m.help = tag->GetKind(); entries.push_back(m); }); // Show selection dialog clSelectSymbolDialog dlg(EventNotifier::Get()->TopFrame(), entries); if(dlg.ShowModal() != wxID_OK) return; PHPFindSymbol_ClientData* cd = dynamic_cast<PHPFindSymbol_ClientData*>(dlg.GetSelection()); if(cd) { DoOpenEditorForEntry(cd->m_ptr); } } } } }
void OpenResourceDlg::DoGetResources(const wxString& filter) { m_resources.clear(); PHPEntityBase::List_t matches; m_table.LoadAllByFilter(matches, filter); // Convert the PHP matches into resources PHPEntityBase::List_t::iterator iter = matches.begin(); m_resources.reserve(matches.size()); for(; iter != matches.end(); ++iter) { PHPEntityBase::Ptr_t match = *iter; if(FileUtils::FuzzyMatch(filter, match->GetFullName())) { ResourceItem resource; resource.displayName = match->GetDisplayName(); resource.filename = match->GetFilename(); resource.line = match->GetLine(); resource.SetType(match); m_resources.push_back(resource); } } }
PHPEntityBase::Ptr_t PHPCodeCompletion::DoGetPHPEntryUnderTheAtPos(IEditor* editor, int pos, bool forFunctionCalltip) { if(!PHPWorkspace::Get()->IsOpen()) return PHPEntityBase::Ptr_t(NULL); pos = editor->GetCtrl()->WordEndPosition(pos, true); // Get the expression under the caret wxString unsavedBuffer = editor->GetTextRange(0, pos); wxString filter; PHPEntityBase::Ptr_t resolved; // Parse the source file PHPSourceFile source(unsavedBuffer); source.SetFilename(editor->GetFileName()); source.SetParseFunctionBody(false); source.Parse(); PHPEntityBase::Ptr_t currentScope = source.CurrentScope(); if(currentScope && currentScope->Is(kEntityTypeClass)) { // we are trying to resolve a 'word' under the caret within the class // body but _not_ within a function body (i.e. it can only be // a definition of some kind) // try to construct an expression that will work int wordStart = editor->GetCtrl()->WordStartPosition(pos, true); wxString theWord = editor->GetTextRange(wordStart, pos); wxString theWordNoDollar = theWord; if(theWord.StartsWith("$")) { theWordNoDollar = theWord.Mid(1); } PHPExpression expr2(unsavedBuffer, "<?php $this->" + theWordNoDollar, forFunctionCalltip); resolved = expr2.Resolve(m_lookupTable, editor->GetFileName().GetFullPath()); filter = expr2.GetFilter(); if(!resolved) { // Maybe its a static member/function/const, try using static keyword PHPExpression expr3(unsavedBuffer, "<?php static::" + theWord, forFunctionCalltip); resolved = expr2.Resolve(m_lookupTable, editor->GetFileName().GetFullPath()); filter = expr2.GetFilter(); } } if(!resolved) { PHPExpression expr(unsavedBuffer, "", forFunctionCalltip); resolved = expr.Resolve(m_lookupTable, editor->GetFileName().GetFullPath()); filter = expr.GetFilter(); } if(resolved && !filter.IsEmpty()) { resolved = m_lookupTable.FindMemberOf(resolved->GetDbId(), filter); if(!resolved) { // Fallback to functions and constants PHPEntityBase::List_t children = m_lookupTable.FindGlobalFunctionAndConsts(PHPLookupTable::kLookupFlags_ExactMatch, filter); if(children.size() == 1) { resolved = *children.begin(); } } if(resolved && resolved->Is(kEntityTypeFunction)) { // for a function, we need to load its children (function arguments) resolved->SetChildren(m_lookupTable.LoadFunctionArguments(resolved->GetDbId())); } else if(resolved && resolved->Is(kEntityTypeFunctionAlias)) { // for a function alias, we need to load the actual functions' children (function arguments) PHPEntityBase::Ptr_t realFunc = resolved->Cast<PHPEntityFunctionAlias>()->GetFunc(); realFunc->SetChildren(m_lookupTable.LoadFunctionArguments(realFunc->GetDbId())); } } return resolved; }