summaryrefslogtreecommitdiff
path: root/src/libs/qmljs/qmljslineinfo.h
diff options
context:
space:
mode:
authorChristian Kamm <christian.d.kamm@nokia.com>2010-04-26 15:12:27 +0200
committerChristian Kamm <christian.d.kamm@nokia.com>2010-04-29 16:05:24 +0200
commitbd712434079d79f085812fec9ef7a8208a5f11fb (patch)
tree5ea8d8f070cf146c281ba10665af05a825c45ad5 /src/libs/qmljs/qmljslineinfo.h
parenta73a9dc350ece6126822b4986c806c1ae061ee6f (diff)
downloadqt-creator-bd712434079d79f085812fec9ef7a8208a5f11fb.tar.gz
QmlJS: Move parts of the indenter to the new LineInfo.
LineInfo can tell whether lines are finished or not. Done-with: Erik Verbruggen
Diffstat (limited to 'src/libs/qmljs/qmljslineinfo.h')
-rw-r--r--src/libs/qmljs/qmljslineinfo.h126
1 files changed, 126 insertions, 0 deletions
diff --git a/src/libs/qmljs/qmljslineinfo.h b/src/libs/qmljs/qmljslineinfo.h
new file mode 100644
index 0000000000..2112e313f0
--- /dev/null
+++ b/src/libs/qmljs/qmljslineinfo.h
@@ -0,0 +1,126 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#ifndef QMLJSLINEINFO_H
+#define QMLJSLINEINFO_H
+
+#include <qmljs/qmljs_global.h>
+#include <qmljs/qmljsscanner.h>
+
+#include <QtCore/QRegExp>
+#include <QtCore/QStringList>
+#include <QtGui/QTextBlock>
+#include <QtGui/QTextCursor>
+
+namespace QmlJS {
+
+class QMLJS_EXPORT LineInfo
+{
+ Q_DISABLE_COPY(LineInfo)
+
+public:
+ LineInfo();
+ virtual ~LineInfo();
+
+ bool isUnfinishedLine();
+ bool isContinuationLine();
+
+ void initialize(QTextBlock begin, QTextBlock end);
+
+protected:
+ static const int SmallRoof;
+ static const int BigRoof;
+
+ QString trimmedCodeLine(const QString &t);
+ QChar firstNonWhiteSpace(const QString &t) const;
+
+ bool hasUnclosedParenOrBracket() const;
+
+ /*
+ The "linizer" is a group of functions and variables to iterate
+ through the source code of the program to indent. The program is
+ given as a list of strings, with the bottom line being the line
+ to indent. The actual program might contain extra lines, but
+ those are uninteresting and not passed over to us.
+ */
+
+ bool readLine();
+ void startLinizer();
+ bool bottomLineStartsInMultilineComment();
+ bool matchBracelessControlStatement();
+
+ Token lastToken() const;
+ QStringRef tokenText(const Token &token) const;
+
+protected:
+ struct LinizerState
+ {
+ LinizerState()
+ : braceDepth(0),
+ leftBraceFollows(false),
+ pendingRightBrace(false)
+ { }
+
+ int braceDepth;
+ bool leftBraceFollows;
+ bool pendingRightBrace;
+ QString line;
+ QList<Token> tokens;
+ QTextBlock iter;
+ };
+
+ class Program
+ {
+ public:
+ Program() {}
+ Program(QTextBlock begin, QTextBlock end)
+ : begin(begin), end(end) {}
+
+ QTextBlock firstBlock() const { return begin; }
+ QTextBlock lastBlock() const { return end; }
+
+ private:
+ QTextBlock begin, end;
+ };
+
+ Program yyProgram;
+ LinizerState yyLinizerState;
+
+ // shorthands
+ const QString *yyLine;
+ const int *yyBraceDepth;
+ const bool *yyLeftBraceFollows;
+
+ QRegExp braceX;
+};
+
+} // namespace QmlJS
+
+#endif // QMLJSLINEINFO_H
+