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; }