本文整理汇总了C++中TokenIdxSet::end方法的典型用法代码示例。如果您正苦于以下问题:C++ TokenIdxSet::end方法的具体用法?C++ TokenIdxSet::end怎么用?C++ TokenIdxSet::end使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类TokenIdxSet
的用法示例。
在下文中一共展示了TokenIdxSet::end方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: FindTokensInFile
size_t ParserBase::FindTokensInFile(const wxString& filename, TokenIdxSet& result, short int kindMask)
{
result.clear();
size_t tokens_found = 0;
TRACE(_T("Parser::FindTokensInFile() : Searching for file '%s' in tokens tree..."), filename.wx_str());
CC_LOCKER_TRACK_TT_MTX_LOCK(s_TokenTreeMutex)
TokenIdxSet tmpresult;
if ( m_TokenTree->FindTokensInFile(filename, tmpresult, kindMask) )
{
for (TokenIdxSet::const_iterator it = tmpresult.begin(); it != tmpresult.end(); ++it)
{
const Token* token = m_TokenTree->at(*it);
if (token)
result.insert(*it);
}
tokens_found = result.size();
}
CC_LOCKER_TRACK_TT_MTX_UNLOCK(s_TokenTreeMutex)
return tokens_found;
}
示例2: TokenExists
int TokenTree::TokenExists(const wxString& name, const TokenIdxSet& parents, short int kindMask)
{
int idx = m_Tree.GetItemNo(name);
if (!idx)
return -1;
TokenIdxSet::const_iterator it;
TokenIdxSet& curList = m_Tree.GetItemAtPos(idx);
int result = -1;
for (it = curList.begin(); it != curList.end(); ++it)
{
result = *it;
if (result < 0 || (size_t)result >= m_Tokens.size())
continue;
const Token* curToken = m_Tokens[result];
if (!curToken)
continue;
if (curToken->m_TokenKind & kindMask)
{
for ( TokenIdxSet::const_iterator pIt = parents.begin();
pIt != parents.end(); ++pIt )
{
if (curToken->m_ParentIndex == *pIt)
return result;
}
}
}
return -1;
}
示例3: FindMatches
size_t TokensTree::FindMatches(const cc_string& s,TokenIdxSet& result,bool caseSensitive,bool is_prefix, int kindMask)
{
set<size_t> lists;
result.clear();
int numitems = m_Tree.FindMatches(s,lists,caseSensitive,is_prefix);
if(!numitems)
return 0;
// now the lists contains indexes to all the matching keywords
TokenIdxSet* curset;
set<size_t>::iterator it;
TokenIdxSet::iterator it2;
// first loop will find all the keywords
for(it = lists.begin(); it != lists.end(); it++)
{
curset = &(m_Tree.GetItemAtPos(*it));
// second loop will get all the items maped by the same keyword,
// for example, we have ClassA::foo, ClassB::foo ...
for(it2 = curset->begin();it2 != curset->end(); it2++)
{
if (kindMask == 0xffff || (at(*it)->m_TokenKind & kindMask))
result.insert(*it2);
}
}
return result.size();
}
示例4: RecalcFullInheritance
// caches the inheritance info for each token (recursive function)
void TokensTree::RecalcFullInheritance(int parentIdx, TokenIdxSet& result)
{
// no parent token? no ancestors...
if (parentIdx == -1)
return;
// no parent token? no ancestors...
Token* ancestor = at(parentIdx);
if (!ancestor)
return;
// only classes take part in inheritance
if (!(ancestor->m_TokenKind & (tkClass | tkTypedef)))
return;
TRACE(cc_text("RecalcFullInheritance() : Anc: '%s'"), ancestor->m_Name.wx_str());
// for all its ancestors
for (TokenIdxSet::iterator it = ancestor->m_Ancestors.begin(); it != ancestor->m_Ancestors.end(); it++)
{
if (*it != -1 && // not global scope
*it != parentIdx && // not the same token (avoid infinite loop)
result.find(*it) == result.end()) // not already in the set (avoid infinite loop)
{
// add it to the set
result.insert(*it);
// and recurse for its ancestors
RecalcFullInheritance(*it, result);
}
}
}
示例5: SaveTokenIdxSetToFile
inline void SaveTokenIdxSetToFile(std::ostream& f,const TokenIdxSet& data)
{
SaveIntToFile(f, (int)(data.size()));
for (TokenIdxSet::iterator it = data.begin(); it != data.end(); it++)
{
int num = *it;
SaveIntToFile(f, num);
}
}
示例6: OnFindClick
void CCDebugInfo::OnFindClick(wxCommandEvent& /*event*/)
{
TokensTree* tokens = m_Parser->GetTokensTree();
wxString search = txtFilter->GetValue();
m_Token = 0;
// first determine if the user entered an ID or a search mask
long unsigned id;
if (search.ToULong(&id, 10))
{
// easy; ID
m_Token = tokens->at(id);
}
else
{
// find all matching tokens
TokenIdxSet result;
for (size_t i = 0; i < tokens->size(); ++i)
{
Token* token = tokens->at(i);
if (token && token->m_Name.Matches(search))
result.insert(i);
}
// a single result?
if (result.size() == 1)
{
m_Token = tokens->at(*(result.begin()));
}
else
{
// fill a list and ask the user which token to display
wxArrayString arr;
wxArrayInt intarr;
for (TokenIdxSet::iterator it = result.begin(); it != result.end(); ++it)
{
Token* token = tokens->at(*it);
arr.Add(token->DisplayName());
intarr.Add(*it);
}
int sel = wxGetSingleChoiceIndex(_("Please make a selection:"), _("Multiple matches"), arr, this);
if (sel == -1)
return;
m_Token = tokens->at(intarr[sel]);
}
}
DisplayTokenInfo();
}
示例7: FindMatches
size_t TokensTree::FindMatches(const wxString& s,TokenIdxSet& result,bool caseSensitive,bool is_prefix, int kindMask)
{
set<size_t> lists;
result.clear();
int numitems = m_Tree.FindMatches(s,lists,caseSensitive,is_prefix);
if(!numitems)
return 0;
TokenIdxSet* curset;
set<size_t>::iterator it;
TokenIdxSet::iterator it2;
for(it = lists.begin(); it != lists.end(); it++)
{
curset = &(m_Tree.GetItemAtPos(*it));
for(it2 = curset->begin();it2 != curset->end(); it2++)
{
if (kindMask == 0xffff || (at(*it)->m_TokenKind & kindMask))
result.insert(*it2);
}
}
return result.size();
}
示例8: FindTokensInFile
size_t ParserBase::FindTokensInFile(const wxString& fileName, TokenIdxSet& result, short int kindMask)
{
result.clear();
wxString file = UnixFilename(fileName);
TRACE(_T("Parser::FindTokensInFile() : Searching for file '%s' in tokens tree..."), file.wx_str());
TRACK_THREAD_LOCKER(s_TokensTreeCritical);
wxCriticalSectionLocker locker(s_TokensTreeCritical);
THREAD_LOCKER_SUCCESS(s_TokensTreeCritical);
TokenIdxSet tmpresult;
if ( !m_TokensTree->FindTokensInFile(file, tmpresult, kindMask) )
return 0;
for (TokenIdxSet::iterator it = tmpresult.begin(); it != tmpresult.end(); ++it)
{
Token* token = m_TokensTree->at(*it);
if (token)
result.insert(*it);
}
return result.size();
}
示例9: RecalcInheritanceChain
void TokenTree::RecalcInheritanceChain(Token* token)
{
if (!token)
return;
if (!(token->m_TokenKind & (tkClass | tkTypedef | tkEnum | tkNamespace)))
return;
if (token->m_AncestorsString.IsEmpty())
return;
token->m_DirectAncestors.clear();
token->m_Ancestors.clear();
wxStringTokenizer tkz(token->m_AncestorsString, _T(","));
TRACE(_T("RecalcInheritanceChain() : Token %s, Ancestors %s"), token->m_Name.wx_str(),
token->m_AncestorsString.wx_str());
TRACE(_T("RecalcInheritanceChain() : Removing ancestor string from %s"), token->m_Name.wx_str());
token->m_AncestorsString.Clear();
while (tkz.HasMoreTokens())
{
wxString ancestor = tkz.GetNextToken();
if (ancestor.IsEmpty() || ancestor == token->m_Name)
continue;
TRACE(_T("RecalcInheritanceChain() : Ancestor %s"), ancestor.wx_str());
// ancestors might contain namespaces, e.g. NS::Ancestor
if (ancestor.Find(_T("::")) != wxNOT_FOUND)
{
Token* ancestorToken = 0;
wxStringTokenizer anctkz(ancestor, _T("::"));
while (anctkz.HasMoreTokens())
{
wxString ns = anctkz.GetNextToken();
if (!ns.IsEmpty())
{
int ancestorIdx = TokenExists(ns, ancestorToken ? ancestorToken->m_Index : -1,
tkNamespace | tkClass | tkTypedef);
ancestorToken = at(ancestorIdx);
if (!ancestorToken) // unresolved
break;
}
}
if ( ancestorToken
&& ancestorToken != token
&& (ancestorToken->m_TokenKind == tkClass || ancestorToken->m_TokenKind == tkNamespace) )
{
TRACE(_T("RecalcInheritanceChain() : Resolved to %s"), ancestorToken->m_Name.wx_str());
RecalcInheritanceChain(ancestorToken);
token->m_Ancestors.insert(ancestorToken->m_Index);
ancestorToken->m_Descendants.insert(token->m_Index);
TRACE(_T("RecalcInheritanceChain() : + '%s'"), ancestorToken->m_Name.wx_str());
}
else
{
TRACE(_T("RecalcInheritanceChain() : ! '%s' (unresolved)"), ancestor.wx_str());
}
}
else // no namespaces in ancestor
{
// accept multiple matches for inheritance
TokenIdxSet result;
FindMatches(ancestor, result, true, false);
for (TokenIdxSet::const_iterator it = result.begin(); it != result.end(); ++it)
{
Token* ancestorToken = at(*it);
// only classes take part in inheritance
if ( ancestorToken
&& (ancestorToken != token)
&& ( (ancestorToken->m_TokenKind == tkClass)
|| (ancestorToken->m_TokenKind == tkEnum)
|| (ancestorToken->m_TokenKind == tkTypedef)
|| (ancestorToken->m_TokenKind == tkNamespace) ) )
{
RecalcInheritanceChain(ancestorToken);
token->m_Ancestors.insert(*it);
ancestorToken->m_Descendants.insert(token->m_Index);
TRACE(_T("RecalcInheritanceChain() : + '%s'"), ancestorToken->m_Name.wx_str());
}
}
#if defined(CC_TOKEN_DEBUG_OUTPUT)
#if CC_TOKEN_DEBUG_OUTPUT
if (result.empty())
TRACE(_T("RecalcInheritanceChain() : ! '%s' (unresolved)"), ancestor.wx_str());
#endif
#endif
}
// Now, we have calc all the direct ancestors
token->m_DirectAncestors = token->m_Ancestors;
}
#if defined(CC_TOKEN_DEBUG_OUTPUT)
#if CC_TOKEN_DEBUG_OUTPUT
wxStopWatch sw;
TRACE(_T("RecalcInheritanceChain() : First iteration took : %ld ms"), sw.Time());
sw.Start();
#endif
#endif
//.........这里部分代码省略.........
示例10: RecalcData
void TokensTree::RecalcData()
{
TRACE(cc_text("RecalcData() : Calculating full inheritance tree."));
// first loop to convert ancestors string to token indices for each token
for (size_t i = 0; i < size(); ++i)
{
Token* token = at(i);
if (!token)
continue;
if (!(token->m_TokenKind & (tkClass | tkTypedef | tkEnum)))
continue;
if (token->m_AncestorsString.empty())
continue;
// only local symbols might change inheritance
// if (!token->m_IsLocal)
// continue;
token->m_DirectAncestors.clear();
token->m_Ancestors.clear();
TRACE(cc_text("RecalcData() : Token %s, Ancestors %s"),
token->m_Name.wx_str(),
token->m_AncestorsString.wx_str());
StringTokenizer tkz(token->m_AncestorsString, cc_text(","));
while (tkz.HasMoreTokens())
{
cc_string ancestor = tkz.GetNextToken();
if (ancestor.empty() || ancestor == token->m_Name)
continue;
TRACE(cc_text("RecalcData() : Ancestor %s"), ancestor.wx_str());
// ancestors might contain namespaces, e.g. NS::Ancestor
if (ancestor.find(cc_text("::")) != cc_string::npos)
{
Token* ancestorToken = 0;
StringTokenizer anctkz(ancestor, cc_text("::"));
while (anctkz.HasMoreTokens())
{
cc_string ns = anctkz.GetNextToken();
if (!ns.empty())
{
int ancestorIdx = TokenExists(ns, ancestorToken ? ancestorToken->GetSelf() : -1, tkNamespace | tkClass | tkTypedef);
ancestorToken = at(ancestorIdx);
// ancestorToken = token->HasChildToken(ns, tkNamespace | tkClass);
if (!ancestorToken) // unresolved
break;
}
}
if (ancestorToken && ancestorToken != token && ancestorToken->m_TokenKind == tkClass)// && !ancestorToken->m_IsTypedef)
{
TRACE(cc_text("RecalcData() : Resolved to %s"), ancestorToken->m_Name.wx_str());
token->m_Ancestors.insert(ancestorToken->GetSelf());
ancestorToken->m_Descendants.insert(i);
TRACE(cc_text("RecalcData() : + '%s'"), ancestorToken->m_Name.wx_str());
}
else
TRACE(cc_text("RecalcData() : ! '%s' (unresolved)"), ancestor.wx_str());
}
else // no namespaces in ancestor
{
// accept multiple matches for inheritance
TokenIdxSet result;
FindMatches(ancestor, result, true, false);
for (TokenIdxSet::iterator it = result.begin(); it != result.end(); it++)
{
Token* ancestorToken = at(*it);
// only classes take part in inheritance
if ( ancestorToken
&& (ancestorToken != token)
&& ( (ancestorToken->m_TokenKind == tkClass)
|| (ancestorToken->m_TokenKind == tkEnum)
|| (ancestorToken->m_TokenKind == tkTypedef) ) ) // && !ancestorToken->m_IsTypedef)
{
token->m_Ancestors.insert(*it);
ancestorToken->m_Descendants.insert(i);
TRACE(cc_text("RecalcData() : + '%s'"), ancestorToken->m_Name.wx_str());
}
}
#if TOKEN_DEBUG_OUTPUT
if (result.empty())
TRACE(_T("RecalcData() : ! '%s' (unresolved)"), ancestor.wx_str());
#endif
}
}
token->m_DirectAncestors = token->m_Ancestors;
if (!token->m_IsLocal) // global symbols are linked once
{
TRACE(cc_text("RecalcData() : Removing ancestor string from %s"), token->m_Name.wx_str(), token->m_Name.wx_str());
token->m_AncestorsString.clear();
}
}
// second loop to calculate full inheritance for each token
for (size_t i = 0; i < size(); ++i)
//.........这里部分代码省略.........
示例11: RemoveToken
void TokensTree::RemoveToken(Token* oldToken)
{
if(!oldToken)
return;
int idx = oldToken->m_Self;
if(m_Tokens[idx]!=oldToken)
return;
// Step 1: Detach token from its parent
Token* parentToken = 0;
if((size_t)(oldToken->m_ParentIndex) >= m_Tokens.size())
oldToken->m_ParentIndex = -1;
if(oldToken->m_ParentIndex >= 0)
parentToken = m_Tokens[oldToken->m_ParentIndex];
if(parentToken)
parentToken->m_Children.erase(idx);
TokenIdxSet nodes;
TokenIdxSet::iterator it;
// Step 2: Detach token from its ancestors
nodes = (oldToken->m_DirectAncestors);
for(it = nodes.begin();it!=nodes.end(); it++)
{
int ancestoridx = *it;
if(ancestoridx < 0 || (size_t)ancestoridx >= m_Tokens.size())
continue;
Token* ancestor = m_Tokens[ancestoridx];
if(ancestor)
ancestor->m_Descendants.erase(idx);
}
oldToken->m_Ancestors.clear();
oldToken->m_DirectAncestors.clear();
// Step 3: Remove children
nodes = (oldToken->m_Children); // Copy the list to avoid interference
for(it = nodes.begin();it!=nodes.end(); it++)
RemoveToken(*it);
// m_Children SHOULD be empty by now - but clear anyway.
oldToken->m_Children.clear();
// Step 4: Remove descendants
nodes = oldToken->m_Descendants; // Copy the list to avoid interference
for(it = nodes.begin();it!=nodes.end(); it++)
RemoveToken(*it);
// m_Descendants SHOULD be empty by now - but clear anyway.
oldToken->m_Descendants.clear();
// Step 5: Detach token from the SearchTrees
int idx2 = m_Tree.GetItemNo(oldToken->m_Name);
if(idx2)
{
TokenIdxSet& curlist = m_Tree.GetItemAtPos(idx2);
curlist.erase(idx);
}
// Now, from the global namespace (if applicable)
if(oldToken->m_ParentIndex == -1)
{
m_GlobalNameSpace.erase(idx);
m_TopNameSpaces.erase(idx);
}
// Step 6: Finally, remove it from the list.
RemoveTokenFromList(idx);
}
示例12: eraseToken
void TokensTree::eraseToken(Token* oldToken)
{
if(!oldToken)
return;
int idx = oldToken->m_Self;
if(m_Tokens[idx]!=oldToken)
return;
// Step 1: Detach token from its parent
Token* parentToken = 0;
if((size_t)(oldToken->m_ParentIndex) >= m_Tokens.size())
oldToken->m_ParentIndex = -1;
if(oldToken->m_ParentIndex >= 0)
parentToken = m_Tokens[oldToken->m_ParentIndex];
if(parentToken)
parentToken->m_Children.erase(idx);
TokenIdxSet nodes;
TokenIdxSet::iterator it;
// Step 2: Detach token from its ancestors
nodes = (oldToken->m_DirectAncestors);
for(it = nodes.begin();it!=nodes.end(); it++)
{
int ancestoridx = *it;
if(ancestoridx < 0 || (size_t)ancestoridx >= m_Tokens.size())
continue;
Token* ancestor = m_Tokens[ancestoridx];
if(ancestor)
ancestor->m_Descendants.erase(idx);
}
oldToken->m_Ancestors.clear();
oldToken->m_DirectAncestors.clear();
// Step 3: erase children
nodes = (oldToken->m_Children); // Copy the list to avoid interference
for(it = nodes.begin();it!=nodes.end(); it++)
eraseToken(*it);
// m_Children SHOULD be empty by now - but clear anyway.
oldToken->m_Children.clear();
// Step 4: erase descendants
nodes = oldToken->m_Descendants; // Copy the list to avoid interference
for(it = nodes.begin();it!=nodes.end(); it++)
{
if(*it == idx) // that should not happen, we can not be our own descendant, but in fact that can happen with boost
{
DebugLog(cc_text("Break out the loop to erase descendants, to avoid a crash. We can not be our own descendant !!"));
break;
}
eraseToken(*it);
}
// m_Descendants SHOULD be empty by now - but clear anyway.
oldToken->m_Descendants.clear();
// Step 5: Detach token from the SearchTrees
int idx2 = m_Tree.GetItemIdx(oldToken->m_Name);
if(idx2)
{
TokenIdxSet& curlist = m_Tree.GetItemAtPos(idx2);
curlist.erase(idx);
}
// Now, from the global namespace (if applicable)
if(oldToken->m_ParentIndex == -1)
{
m_GlobalNameSpace.erase(idx);
m_TopNameSpaces.erase(idx);
}
// Step 6: Finally, erase it from the list.
eraseTokenFromList(idx);
}
示例13: RecalcData
void TokensTree::RecalcData()
{
// Manager::Get()->GetMessageManager()->DebugLog(_T("Calculating full inheritance tree"));
// first loop to convert ancestors string to token indices for each token
for (size_t i = 0; i < size(); ++i)
{
Token* token = at(i);
if (!token)
continue;
if (!(token->m_TokenKind & (tkClass | tkTypedef | tkEnum)))
continue;
if (token->m_AncestorsString.IsEmpty())
continue;
// only local symbols might change inheritance
// if (!token->m_IsLocal)
// continue;
token->m_DirectAncestors.clear();
token->m_Ancestors.clear();
// Manager::Get()->GetMessageManager()->DebugLog(_T(" : '%s'"), token->m_Name.c_str());
//Manager::Get()->GetMessageManager()->DebugLog("Token %s, Ancestors %s", token->m_Name.c_str(), token->m_AncestorsString.c_str());
wxStringTokenizer tkz(token->m_AncestorsString, _T(","));
while (tkz.HasMoreTokens())
{
wxString ancestor = tkz.GetNextToken();
if (ancestor.IsEmpty() || ancestor == token->m_Name)
continue;
// Manager::Get()->GetMessageManager()->DebugLog(_T("Ancestor %s"), ancestor.c_str());
// ancestors might contain namespaces, e.g. NS::Ancestor
if (ancestor.Find(_T("::")) != wxNOT_FOUND)
{
Token* ancestorToken = 0;
wxStringTokenizer anctkz(ancestor, _T("::"));
while (anctkz.HasMoreTokens())
{
wxString ns = anctkz.GetNextToken();
if (!ns.IsEmpty())
{
int ancestorIdx = TokenExists(ns, ancestorToken ? ancestorToken->GetSelf() : -1, tkNamespace | tkClass | tkTypedef);
ancestorToken = at(ancestorIdx);
// ancestorToken = token->HasChildToken(ns, tkNamespace | tkClass);
if (!ancestorToken) // unresolved
break;
}
}
if (ancestorToken && ancestorToken != token && ancestorToken->m_TokenKind == tkClass)// && !ancestorToken->m_IsTypedef)
{
// Manager::Get()->GetMessageManager()->DebugLog(_T("Resolved to %s"), ancestorToken->m_Name.c_str());
token->m_Ancestors.insert(ancestorToken->GetSelf());
ancestorToken->m_Descendants.insert(i);
// Manager::Get()->GetMessageManager()->DebugLog(_T(" + '%s'"), ancestorToken->m_Name.c_str());
}
// else
// Manager::Get()->GetMessageManager()->DebugLog(_T(" ! '%s' (unresolved)"), ancestor.c_str());
}
else // no namespaces in ancestor
{
// accept multiple matches for inheritance
TokenIdxSet result;
FindMatches(ancestor, result, true, false);
for (TokenIdxSet::iterator it = result.begin(); it != result.end(); it++)
{
Token* ancestorToken = at(*it);
// only classes take part in inheritance
if (ancestorToken && ancestorToken != token && (ancestorToken->m_TokenKind == tkClass || ancestorToken->m_TokenKind == tkEnum))// && !ancestorToken->m_IsTypedef)
{
token->m_Ancestors.insert(*it);
ancestorToken->m_Descendants.insert(i);
// Manager::Get()->GetMessageManager()->DebugLog(_T(" + '%s'"), ancestorToken->m_Name.c_str());
}
}
// if (result.empty())
// Manager::Get()->GetMessageManager()->DebugLog(_T(" ! '%s' (unresolved)"), ancestor.c_str());
}
}
token->m_DirectAncestors = token->m_Ancestors;
if (!token->m_IsLocal) // global symbols are linked once
{
//Manager::Get()->GetMessageManager()->DebugLog("Removing ancestor string from %s", token->m_Name.c_str(), token->m_Name.c_str());
token->m_AncestorsString.Clear();
}
}
// second loop to calculate full inheritance for each token
for (size_t i = 0; i < size(); ++i)
{
Token* token = at(i);
if (!token)
continue;
if (!(token->m_TokenKind & (tkClass | tkTypedef | tkEnum)))
continue;
// recalc
TokenIdxSet result;
//.........这里部分代码省略.........
示例14: ParseAndCodeCompletion
//.........这里部分代码省略.........
match = str.Mid(pos + 2);// the remaining string
}
else
{
expression = str;
if (!match_doc.IsEmpty())
match = _T("* @doxygen");
}
expression.Trim(true).Trim(false);
match.Trim(true).Trim(false);
match_doc.Trim(true).Trim(false);
wxArrayString suggestList;
// the match can have many items, like: AAA,BBBB
wxStringTokenizer tkz(match, wxT(","));
while ( tkz.HasMoreTokens() )
{
wxString token = tkz.GetNextToken().Trim(true).Trim(false);
suggestList.Add(token);
}
TokenIdxSet searchScope;
searchScope.insert(-1);
TokenIdxSet result;
TestExpression(expression,searchScope,result);
// loop the suggestList to see it is in the result Tokens
for (size_t i=0; i<suggestList.GetCount(); i++)
{
wxString element = suggestList[i];
bool pass = false; // pass the test?
for (TokenIdxSet::const_iterator it = result.begin();
it != result.end();
++it)
{
const Token* token = m_Parser.GetTokenTree()->at(*it);
if (!token || token->m_Name.IsEmpty())
continue;
if (element.IsSameAs(token->m_Name) || element[0] == '*')
{
// no doxygen documents, only matches the suggestion list
if (match_doc.IsEmpty())
{
message = wxString::Format(_T("+ PASS: %s %s"), expression.wx_str(), element.wx_str());
testResult << message << wxT("\n");
wxLogMessage(message);
pass = true;
++passCount;
}
else
{
// check whether doxygen documents are matched
if (token->m_Doc.Contains(match_doc)
|| (match_doc[0] == '*' && match_doc.Len() == 1 && !token->m_Doc.IsEmpty())
|| (match_doc[0] == '-' && match_doc.Len() == 1 && token->m_Doc.IsEmpty()))
{
message = wxString::Format(_T("+ PASS: %s %s \"%s\""), expression.wx_str(), token->m_Name.wx_str(), match_doc.wx_str());
testResult << message << wxT("\n");
wxLogMessage(message);
if (!pass)
{
pass = true;
++passCount;
}
示例15: Start
void CCTestFrame::Start()
{
if (m_ParserCtrl) m_ParserCtrl->SetSelection(1); // make sure "Output" tab is selected
CCTestAppGlobal::s_includeDirs.Clear();
CCTestAppGlobal::s_fileQueue.Clear();
CCTestAppGlobal::s_filesParsed.Clear();
// Obtain all include directories
wxStringTokenizer tkz_inc(m_IncludeCtrl->GetValue(), _T("\r\n"));
while ( tkz_inc.HasMoreTokens() )
{
wxString include = tkz_inc.GetNextToken().Trim(true).Trim(false);
if (!include.IsEmpty())
CCTestAppGlobal::s_includeDirs.Add(include);
}
if (m_DoHeadersCtrl->IsChecked())
{
// Obtain all priority header files
wxStringTokenizer tkz_hdr(m_HeadersCtrl->GetValue(), _T(","));
while (tkz_hdr.HasMoreTokens())
{
wxString header = tkz_hdr.GetNextToken().Trim(false).Trim(true);
// Remove <> (if any)
int lt = header.Find(wxT('<')); int gt = header.Find(wxT('>'),true);
if (lt!=wxNOT_FOUND && gt!=wxNOT_FOUND && gt>lt)
header = header.AfterFirst(wxT('<')).BeforeLast(wxT('>'));
// Remove "" (if any)
int oq = header.Find(wxT('"')); int cq = header.Find(wxT('"'),true);
if (oq!=wxNOT_FOUND && cq!=wxNOT_FOUND && cq>oq)
header = header.AfterFirst(wxT('"')).BeforeLast(wxT('"'));
header = header.Trim(false).Trim(true);
// Find the header files in include path's as provided
// (practically the same as ParserBase::FindFileInIncludeDirs())
for (size_t i=0; i<CCTestAppGlobal::s_includeDirs.GetCount(); ++i)
{
// Normalize the path (as in C::B's "NormalizePath()")
wxFileName f_header(header);
wxString base_path(CCTestAppGlobal::s_includeDirs[i]);
if (f_header.Normalize(wxPATH_NORM_ALL & ~wxPATH_NORM_CASE, base_path))
{
wxString this_header = f_header.GetFullPath();
if ( ::wxFileExists(this_header) )
CCTestAppGlobal::s_fileQueue.Add(this_header);
}
}
}
}
if (CCTestAppGlobal::s_fileQueue.IsEmpty() && !m_Control->GetLength())
{
wxMessageBox(wxT("Main file not found and buffer empty. Nothing to do."),
_("Information"), wxOK | wxICON_INFORMATION, this);
return;
}
if (m_DoHideCtrl && m_DoHideCtrl->IsChecked()) Hide();
m_ProgDlg = new wxProgressDialog(_T("Please wait, operating..."), _("Preparing...\nPlease wait..."), 0, this, wxPD_APP_MODAL);
m_ProgDlg->SetSize(640,100);
m_ProgDlg->Layout();
m_ProgDlg->CenterOnParent();
m_LogCount = 0;
m_LogCtrl->Clear();
CCTest::Get()->Clear(); // initial clearance
// make sure not to over-write an existing file (in case content had changed)
wxString tf(wxFileName::CreateTempFileName(wxT("cc")));
// make the parser recognise it as header file:
wxFileName fn(tf); fn.SetExt(wxT("h")); wxRemoveFile(tf); // no longer needed
if (m_Control->SaveFile(fn.GetFullPath()))
CCTestAppGlobal::s_fileQueue.Add(fn.GetFullPath());
else
AppendToLog(_T("Unable to parse buffer (could not convert to file)."));
AppendToLog(_T("--------------M-a-i-n--L-o-g--------------\r\n\r\n"));
// parse file from the queue one-by-one
while (!CCTestAppGlobal::s_fileQueue.IsEmpty())
{
wxString file = CCTestAppGlobal::s_fileQueue.Item(0);
CCTestAppGlobal::s_fileQueue.Remove(file);
if (file.IsEmpty()) continue;
AppendToLog(_T("-----------I-n-t-e-r-i-m--L-o-g-----------"));
m_CurrentFile = file;
m_ProgDlg->Update(-1, m_CurrentFile);
m_StatuBar->SetStatusText(m_CurrentFile);
// This is the core parse stage for files
CCTest::Get()->Start(m_CurrentFile);
CCTestAppGlobal::s_filesParsed.Add(m_CurrentFile); // done
}
// don't forget to remove the temporary file (w/ ".h" extension)
//.........这里部分代码省略.........