forked from qt-creator/qt-creator
		
	QmlJSEditor: Improve indentation of square brackets.
Task-number: QTCREATORBUG-583 Reviewed-by: Roberto Raggi
This commit is contained in:
		@@ -253,12 +253,14 @@ QString QmlJSIndenter::trimmedCodeLine(const QString &t)
 | 
			
		||||
        switch (last.kind) {
 | 
			
		||||
        case Token::LeftParenthesis:
 | 
			
		||||
        case Token::LeftBrace:
 | 
			
		||||
        case Token::LeftBracket:
 | 
			
		||||
        case Token::Semicolon:
 | 
			
		||||
        case Token::Delimiter:
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case Token::RightParenthesis:
 | 
			
		||||
        case Token::RightBrace:
 | 
			
		||||
        case Token::RightBracket:
 | 
			
		||||
            if (isBinding)
 | 
			
		||||
                needSemicolon = true;
 | 
			
		||||
            break;
 | 
			
		||||
@@ -267,8 +269,6 @@ QString QmlJSIndenter::trimmedCodeLine(const QString &t)
 | 
			
		||||
        case Token::Number:
 | 
			
		||||
        case Token::Colon:
 | 
			
		||||
        case Token::Comma:
 | 
			
		||||
        case Token::LeftBracket:
 | 
			
		||||
        case Token::RightBracket:
 | 
			
		||||
            needSemicolon = true;
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
@@ -314,6 +314,31 @@ QChar QmlJSIndenter::lastParen() const
 | 
			
		||||
    return QChar();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool QmlJSIndenter::hasUnclosedParenOrBracket() const
 | 
			
		||||
{
 | 
			
		||||
    int closedParen = 0;
 | 
			
		||||
    int closedBracket = 0;
 | 
			
		||||
    for (int index = yyLinizerState.tokens.size() - 1; index != -1; --index) {
 | 
			
		||||
        const Token &token = yyLinizerState.tokens.at(index);
 | 
			
		||||
 | 
			
		||||
        if (token.is(Token::RightParenthesis)) {
 | 
			
		||||
            closedParen++;
 | 
			
		||||
        } else if (token.is(Token::RightBracket)) {
 | 
			
		||||
            closedBracket++;
 | 
			
		||||
        } else if (token.is(Token::LeftParenthesis)) {
 | 
			
		||||
            closedParen--;
 | 
			
		||||
            if (closedParen < 0)
 | 
			
		||||
                return true;
 | 
			
		||||
        } else if (token.is(Token::LeftBracket)) {
 | 
			
		||||
            closedBracket--;
 | 
			
		||||
            if (closedBracket < 0)
 | 
			
		||||
                return true;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
    Returns true if typedIn the same as okayCh or is null; otherwise
 | 
			
		||||
    returns false.
 | 
			
		||||
@@ -383,8 +408,8 @@ bool QmlJSIndenter::readLine()
 | 
			
		||||
            the other way around, as we are parsing backwards.
 | 
			
		||||
        */
 | 
			
		||||
        yyLinizerState.braceDepth +=
 | 
			
		||||
                yyLinizerState.line.count('}') -
 | 
			
		||||
                yyLinizerState.line.count('{');
 | 
			
		||||
                yyLinizerState.line.count('}') + yyLinizerState.line.count(']') -
 | 
			
		||||
                yyLinizerState.line.count('{') - yyLinizerState.line.count('[');
 | 
			
		||||
 | 
			
		||||
        /*
 | 
			
		||||
            We use a dirty trick for
 | 
			
		||||
@@ -620,7 +645,7 @@ bool QmlJSIndenter::isUnfinishedLine()
 | 
			
		||||
 | 
			
		||||
    const QChar lastCh = yyLine->at(yyLine->length() - 1);
 | 
			
		||||
 | 
			
		||||
    if (QString::fromLatin1("{};").indexOf(lastCh) == -1) {
 | 
			
		||||
    if (QString::fromLatin1("{};[]").indexOf(lastCh) == -1) {
 | 
			
		||||
        /*
 | 
			
		||||
          It doesn't end with ';' or similar. If it's not an "if (x)", it must be an unfinished line.
 | 
			
		||||
        */
 | 
			
		||||
@@ -630,15 +655,16 @@ bool QmlJSIndenter::isUnfinishedLine()
 | 
			
		||||
            unf = false;
 | 
			
		||||
 | 
			
		||||
    } else if (lastCh == QLatin1Char(';')) {
 | 
			
		||||
        if (lastParen() == QLatin1Char('(')) {
 | 
			
		||||
        if (hasUnclosedParenOrBracket()) {
 | 
			
		||||
            /*
 | 
			
		||||
              Exception:
 | 
			
		||||
 | 
			
		||||
                  for (int i = 1; i < 10;
 | 
			
		||||
            */
 | 
			
		||||
            unf = true;
 | 
			
		||||
        } else if (readLine() && yyLine->endsWith(QLatin1String(";")) &&
 | 
			
		||||
                    lastParen() == QLatin1Char('(')) {
 | 
			
		||||
 | 
			
		||||
        // ### This only checks one line back.
 | 
			
		||||
        } else if (readLine() && yyLine->endsWith(QLatin1String(";")) && hasUnclosedParenOrBracket()) {
 | 
			
		||||
            /*
 | 
			
		||||
              Exception:
 | 
			
		||||
 | 
			
		||||
@@ -1037,7 +1063,8 @@ int QmlJSIndenter::indentForBottomLine(QTextBlock begin, QTextBlock end, QChar t
 | 
			
		||||
            indent = indentForStandaloneLine();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (okay(typedIn, QLatin1Char('}')) && firstCh == QLatin1Char('}')) {
 | 
			
		||||
        if ((okay(typedIn, QLatin1Char('}')) && firstCh == QLatin1Char('}'))
 | 
			
		||||
            || (okay(typedIn, QLatin1Char(']')) && firstCh == QLatin1Char(']'))) {
 | 
			
		||||
            /*
 | 
			
		||||
                A closing brace is one level more to the left than the
 | 
			
		||||
                code it follows.
 | 
			
		||||
 
 | 
			
		||||
@@ -64,6 +64,7 @@ private:
 | 
			
		||||
 | 
			
		||||
    void eraseChar(QString &t, int k, QChar ch) const;
 | 
			
		||||
    QChar lastParen() const;
 | 
			
		||||
    bool hasUnclosedParenOrBracket() const;
 | 
			
		||||
    bool okay(QChar typedIn, QChar okayCh) const;
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user