void RefactoringEngine::RenameLocalSymbol(const wxString& symname, const wxFileName& fn, int line, int pos) { // Clear previous results Clear(); // Load the file and get a state map + the text from the scanner CppWordScanner scanner(fn.GetFullPath()); // get the current file states TextStatesPtr states = scanner.states(); if( !states ) { return; } // get the local by scanning from the current function's TagEntryPtr tag = TagsManagerST::Get()->FunctionFromFileLine(fn, line + 1); if( !tag ) { return; } // Get the line number of the function int funcLine = tag->GetLine() - 1; // Convert the line number to offset int from = states->LineToPos (funcLine); int to = states->FunctionEndPos(from); if(to == wxNOT_FOUND) return; // search for matches in the given range CppTokensMap l; scanner.Match(symname, l, from, to); CppToken::List_t tokens; l.findTokens(symname, tokens); if (tokens.empty()) return; // Loop over the matches // Incase we did manage to resolve the word, it means that it is NOT a local variable (DoResolveWord only wors for globals NOT for locals) RefactorSource target; std::list<CppToken>::iterator iter = tokens.begin(); for (; iter != tokens.end(); iter++) { wxFileName f( iter->getFilename() ); if (!DoResolveWord(states, wxFileName(iter->getFilename()), iter->getOffset(), line, symname, &target)) { m_candidates.push_back( *iter ); } } }
void SearchThread::DoSearchLine(const wxString& line, const int lineNum, const int lineOffset, const wxString& fileName, const SearchData* data, const wxString& findWhat, const wxArrayString& filters, TextStatesPtr statesPtr) { wxString modLine = line; if(!data->IsMatchCase()) { modLine.MakeLower(); } int pos = 0; int col = 0; int iCorrectedCol = 0; int iCorrectedLen = 0; while(pos != wxNOT_FOUND) { pos = modLine.Find(findWhat); if(pos != wxNOT_FOUND) { col += pos; // Pipe support bool allFiltersOK = true; if(!filters.IsEmpty()) { // Apply the filters for(size_t i = 0; i < filters.size() && allFiltersOK; ++i) { allFiltersOK = (modLine.Find(filters.Item(i)) != wxNOT_FOUND); } } // Pipe filtes OK? if(!allFiltersOK) return; // we have a match if(data->IsMatchWholeWord()) { // make sure that the word before is not in the wordChars map if((pos > 0) && (m_wordCharsMap.find(modLine.GetChar(pos - 1)) != m_wordCharsMap.end())) { if(!AdjustLine(modLine, pos, findWhat)) { break; } else { col += (int)findWhat.Length(); continue; } } // if we have more characters to the right, make sure that the first char does not match any // in the wordCharsMap if(pos + findWhat.Length() <= modLine.Length()) { wxChar nextCh = modLine.GetChar(pos + findWhat.Length()); if(m_wordCharsMap.find(nextCh) != m_wordCharsMap.end()) { if(!AdjustLine(modLine, pos, findWhat)) { break; } else { col += (int)findWhat.Length(); continue; } } } } // Notify our match // correct search Pos and Length owing to non plain ASCII multibyte characters iCorrectedCol = clUTF8Length(line.c_str(), col); iCorrectedLen = clUTF8Length(findWhat.c_str(), findWhat.Length()); SearchResult result; result.SetPosition(lineOffset + col); result.SetColumnInChars(col); result.SetColumn(iCorrectedCol); result.SetLineNumber(lineNum); result.SetPattern(line); result.SetFileName(fileName); result.SetLenInChars((int)findWhat.Length()); result.SetLen(iCorrectedLen); result.SetFindWhat(data->GetFindString()); result.SetFlags(data->m_flags); int position(wxNOT_FOUND); bool canAdd(true); if(statesPtr) { position = statesPtr->LineToPos(lineNum - 1); position += iCorrectedCol; } // Make sure our match is not on a comment if(statesPtr && position != wxNOT_FOUND && data->GetSkipComments()) { if(statesPtr->states.size() > (size_t)position) { short state = statesPtr->states.at(position).state; if(state == CppWordScanner::STATE_CPP_COMMENT || state == CppWordScanner::STATE_C_COMMENT) { canAdd = false; } } } if(statesPtr && position != wxNOT_FOUND && data->GetSkipStrings()) { if(statesPtr->states.size() > (size_t)position) { short state = statesPtr->states.at(position).state; if(state == CppWordScanner::STATE_DQ_STRING || state == CppWordScanner::STATE_SINGLE_STRING) { canAdd = false; } } } result.SetMatchState(CppWordScanner::STATE_NORMAL); if(canAdd && statesPtr && position != wxNOT_FOUND && data->GetColourComments()) { // set the match state if(statesPtr->states.size() > (size_t)position) { short state = statesPtr->states.at(position).state; if(state == CppWordScanner::STATE_C_COMMENT || state == CppWordScanner::STATE_CPP_COMMENT) { result.SetMatchState(state); } } } if(canAdd) { m_results.push_back(result); m_summary.SetNumMatchesFound(m_summary.GetNumMatchesFound() + 1); } if(!AdjustLine(modLine, pos, findWhat)) { break; } col += (int)findWhat.Length(); } } }
wxString RefactoringEngine::GetExpression(int pos, TextStatesPtr states) { bool cont(true); int depth(0); bool prevGt (false); wxString expression; states->SetPosition(pos); while (cont && depth >= 0) { wxChar ch = states->Previous(); // eof? if (ch == 0) { break; } switch (ch) { case wxT(';'): cont = false; break; case wxT('-'): if (prevGt) { prevGt = false; //if previous char was '>', we found an arrow so reduce the depth //which was increased depth--; } else { if (depth <= 0) { cont = false; } } break; case wxT(' '): case wxT('\n'): case wxT('\v'): case wxT('\t'): case wxT('\r'): prevGt = false; if (depth <= 0) { cont = false; } break; case wxT('{'): case wxT('='): prevGt = false; cont = false; break; case wxT('('): case wxT('['): depth--; prevGt = false; if (depth < 0) { //dont include this token cont = false; } break; case wxT(','): case wxT('*'): case wxT('&'): case wxT('!'): case wxT('~'): case wxT('+'): case wxT('^'): case wxT('|'): case wxT('%'): case wxT('?'): prevGt = false; if (depth <= 0) { //dont include this token cont = false; } break; case wxT('>'): prevGt = true; depth++; break; case wxT('<'): prevGt = false; depth--; if (depth < 0) { //dont include this token cont = false; } break; case wxT(')'): case wxT(']'): prevGt = false; depth++; break; default: prevGt = false; break; } if(cont) { expression.Prepend(ch); } } return expression; }
void SearchThread::DoSearchLineRE(const wxString& line, const int lineNum, const int lineOffset, const wxString& fileName, const SearchData* data, TextStatesPtr statesPtr) { wxRegEx& re = GetRegex(data->GetFindString(), data->IsMatchCase()); size_t col = 0; int iCorrectedCol = 0; int iCorrectedLen = 0; wxString modLine = line; if(re.IsValid()) { while(re.Matches(modLine)) { size_t start, len; re.GetMatch(&start, &len); col += start; // Notify our match // correct search Pos and Length owing to non plain ASCII multibyte characters iCorrectedCol = clUTF8Length(line.c_str(), col); iCorrectedLen = clUTF8Length(line.c_str(), col + len) - iCorrectedCol; SearchResult result; result.SetPosition(lineOffset + col); result.SetColumnInChars((int)col); result.SetColumn(iCorrectedCol); result.SetLineNumber(lineNum); result.SetPattern(line); result.SetFileName(fileName); result.SetLenInChars((int)len); result.SetLen(iCorrectedLen); result.SetFlags(data->m_flags); result.SetFindWhat(data->GetFindString()); // Make sure our match is not on a comment int position(wxNOT_FOUND); bool canAdd(true); if(statesPtr) { position = statesPtr->LineToPos(lineNum - 1); position += iCorrectedCol; } if(statesPtr && position != wxNOT_FOUND && data->GetSkipComments()) { if(statesPtr->states.size() > (size_t)position) { short state = statesPtr->states.at(position).state; if(state == CppWordScanner::STATE_CPP_COMMENT || state == CppWordScanner::STATE_C_COMMENT) { canAdd = false; } } } if(statesPtr && position != wxNOT_FOUND && data->GetSkipStrings()) { if(statesPtr->states.size() > (size_t)position) { short state = statesPtr->states.at(position).state; if(state == CppWordScanner::STATE_DQ_STRING || state == CppWordScanner::STATE_SINGLE_STRING) { canAdd = false; } } } result.SetMatchState(CppWordScanner::STATE_NORMAL); if(canAdd && statesPtr && position != wxNOT_FOUND && data->GetColourComments()) { // set the match state if(statesPtr->states.size() > (size_t)position) { short state = statesPtr->states.at(position).state; if(state == CppWordScanner::STATE_C_COMMENT || state == CppWordScanner::STATE_CPP_COMMENT) { result.SetMatchState(state); } } } if(canAdd) { m_results.push_back(result); m_summary.SetNumMatchesFound(m_summary.GetNumMatchesFound() + 1); } col += len; // adjust the line if(line.Length() - col <= 0) break; modLine = modLine.Right(line.Length() - col); } } }