Пример #1
0
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;
}