std::vector<ClangPlugin::CCCallTip> ClangPlugin::GetCallTips(int pos, int /*style*/, cbEditor* ed, int& argsPos) { #ifdef CLANGPLUGIN_TRACE_FUNCTIONS fprintf(stdout,"%s\n", __PRETTY_FUNCTION__); #endif std::vector<CCCallTip> tips; if (ed != m_pLastEditor) { return tips; } if (m_TranslUnitId == wxNOT_FOUND) { std::cout<<"GetCallTips: No translUnitId yet"<<std::endl; return tips; } cbStyledTextCtrl* stc = ed->GetControl(); int nest = 0; int commas = 0; while (--pos > 0) { const int curStyle = stc->GetStyleAt(pos); if (stc->IsString(curStyle) || stc->IsCharacter(curStyle) || stc->IsComment(curStyle)) { continue; } const wxChar ch = stc->GetCharAt(pos); if (ch == wxT(';')) { std::cout<<"GetCalltips: Error?"<<std::endl; return tips; // error? } else if (ch == wxT(',')) { if (nest == 0) ++commas; } else if (ch == wxT(')')) --nest; else if (ch == wxT('(')) { ++nest; if (nest > 0) break; } } while (--pos > 0) { if (stc->GetCharAt(pos) <= wxT(' ') || stc->IsComment(stc->GetStyleAt(pos))) { continue; } break; } argsPos = stc->WordEndPosition(pos, true); if (argsPos != m_LastCallTipPos) { m_LastCallTips.clear(); const int line = stc->LineFromPosition(pos); const int column = pos - stc->PositionFromLine(line); const wxString& tknText = stc->GetTextRange(stc->WordStartPosition(pos, true), argsPos); if (!tknText.IsEmpty()) { ClTokenPosition loc(line + 1, column + 1); ClangProxy::GetCallTipsAtJob job( cbEVT_CLANG_SYNCTASK_FINISHED, idClangSyncTask, ed->GetFilename(), loc, m_TranslUnitId, tknText); m_Proxy.AppendPendingJob(job); if (job.WaitCompletion(50) == wxCOND_TIMEOUT) { return tips; } m_LastCallTips = job.GetResults(); // m_Proxy.GetCallTipsAt(ed->GetFilename(), line + 1, column + 1, // m_TranslUnitId, tknText, m_LastCallTips); } } m_LastCallTipPos = argsPos; for (std::vector<wxStringVec>::const_iterator strVecItr = m_LastCallTips.begin(); strVecItr != m_LastCallTips.end(); ++strVecItr) { int strVecSz = strVecItr->size(); if (commas != 0 && strVecSz < commas + 3) continue; wxString tip; int hlStart = wxSCI_INVALID_POSITION; int hlEnd = wxSCI_INVALID_POSITION; for (int i = 0; i < strVecSz; ++i) { if (i == commas + 1 && strVecSz > 2) { hlStart = tip.Length(); hlEnd = hlStart + (*strVecItr)[i].Length(); } tip += (*strVecItr)[i]; if (i > 0 && i < (strVecSz - 2)) tip += wxT(", "); } tips.push_back(CCCallTip(tip, hlStart, hlEnd)); } return tips; }
std::vector<ClangPlugin::CCCallTip> ClangPlugin::GetCallTips(int pos, int style, cbEditor* ed, int& argsPos) { std::vector<CCCallTip> tips; if (ed != m_pLastEditor) { m_TranslUnitId = m_Proxy.GetTranslationUnitId(ed->GetFilename()); m_pLastEditor = ed; } if (m_TranslUnitId == wxNOT_FOUND) return tips; cbStyledTextCtrl* stc = ed->GetControl(); int nest = 0; int commas = 0; while (--pos > 0) { const int curStyle = stc->GetStyleAt(pos); if ( stc->IsString(curStyle) || stc->IsCharacter(curStyle) || stc->IsComment(curStyle) ) { continue; } const wxChar ch = stc->GetCharAt(pos); if (ch == wxT(';')) return tips; // error? else if (ch == wxT(',')) { if (nest == 0) ++commas; } else if (ch == wxT(')')) --nest; else if (ch == wxT('(')) { ++nest; if (nest > 0) break; } } while (--pos > 0) { if ( stc->GetCharAt(pos) <= wxT(' ') || stc->IsComment(stc->GetStyleAt(pos)) ) { continue; } break; } argsPos = stc->WordEndPosition(pos, true); if (argsPos != m_LastCallTipPos) { m_LastCallTips.clear(); const int line = stc->LineFromPosition(pos); const int column = pos - stc->PositionFromLine(line); const wxString& tknText = stc->GetTextRange(stc->WordStartPosition(pos, true), argsPos); if (!tknText.IsEmpty()) m_Proxy.GetCallTipsAt(ed->GetFilename(), line + 1, column + 1, m_TranslUnitId, tknText, m_LastCallTips); } m_LastCallTipPos = argsPos; for (std::vector<wxStringVec>::const_iterator strVecItr = m_LastCallTips.begin(); strVecItr != m_LastCallTips.end(); ++strVecItr) { int strVecSz = strVecItr->size(); if (commas != 0 && strVecSz < commas + 3) continue; wxString tip; int hlStart = wxSCI_INVALID_POSITION; int hlEnd = wxSCI_INVALID_POSITION; for (int i = 0; i < strVecSz; ++i) { if (i == commas + 1 && strVecSz > 2) { hlStart = tip.Length(); hlEnd = hlStart + (*strVecItr)[i].Length(); } tip += (*strVecItr)[i]; if (i > 0 && i < (strVecSz - 2)) tip += wxT(", "); } tips.push_back(CCCallTip(tip, hlStart, hlEnd)); } return tips; }