From 547912af2a282148f835abe3ccbe3e8ba9acc329 Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Tue, 12 Jan 2010 15:59:22 +0100
Subject: [PATCH] Speed up contextAllowsAutoParentheses().

Look at the token under cursor only if the current character is a brace or a quote.
---
 src/plugins/qmleditor/qmleditor.cpp           | 52 +++++++++--------
 src/plugins/qtscripteditor/qtscripteditor.cpp | 58 +++++++++++--------
 2 files changed, 63 insertions(+), 47 deletions(-)

diff --git a/src/plugins/qmleditor/qmleditor.cpp b/src/plugins/qmleditor/qmleditor.cpp
index 432c23de904..8986f1eaf12 100644
--- a/src/plugins/qmleditor/qmleditor.cpp
+++ b/src/plugins/qmleditor/qmleditor.cpp
@@ -726,6 +726,28 @@ bool QmlTextEditor::contextAllowsAutoParentheses(const QTextCursor &cursor, cons
     if (! textToInsert.isEmpty())
         ch = textToInsert.at(0);
 
+    switch (ch.unicode()) {
+    case '\'':
+    case '"':
+
+    case '(':
+    case '[':
+    case '{':
+
+    case ')':
+    case ']':
+    case '}':
+
+    case ';':
+        break;
+
+    default:
+        if (ch.isNull())
+            break;
+
+        return false;
+    } // end of switch
+
     const QString blockText = cursor.block().text();
     const int blockState = blockStartState(cursor.block());
 
@@ -736,8 +758,12 @@ bool QmlTextEditor::contextAllowsAutoParentheses(const QTextCursor &cursor, cons
     int tokenIndex = tokens.size() - 1;
     for (; tokenIndex != -1; --tokenIndex) {
         const QScriptIncrementalScanner::Token &token = tokens.at(tokenIndex);
-        if (pos >= token.begin() && pos <= token.end())
-            break;
+        if (pos >= token.begin()) {
+            if (pos < token.end())
+                break;
+            else if (pos == token.end() && token.is(QScriptIncrementalScanner::Token::Comment))
+                break;
+        }
     }
 
     if (tokenIndex != -1) {
@@ -760,27 +786,7 @@ bool QmlTextEditor::contextAllowsAutoParentheses(const QTextCursor &cursor, cons
         } // end of switch
     }
 
-    switch (ch.unicode()) {
-    case '\'':
-    case '"':
-
-    case '(':
-    case '[':
-    case '{':
-
-    case ')':
-    case ']':
-    case '}':
-
-    case ';':
-        return true;
-
-    default:
-        if (ch.isNull())
-            return true;
-    } // end of switch
-
-    return false;
+    return true;
 }
 
 bool QmlTextEditor::isInComment(const QTextCursor &) const
diff --git a/src/plugins/qtscripteditor/qtscripteditor.cpp b/src/plugins/qtscripteditor/qtscripteditor.cpp
index 6d235b5f0a2..670c5c747e8 100644
--- a/src/plugins/qtscripteditor/qtscripteditor.cpp
+++ b/src/plugins/qtscripteditor/qtscripteditor.cpp
@@ -409,8 +409,34 @@ bool ScriptEditor::contextAllowsAutoParentheses(const QTextCursor &cursor, const
     if (! textToInsert.isEmpty())
         ch = textToInsert.at(0);
 
+    switch (ch.unicode()) {
+    case '\'':
+    case '"':
+
+    case '(':
+    case '[':
+    case '{':
+
+    case ')':
+    case ']':
+    case '}':
+
+    case ';':
+        break;
+
+    default:
+        if (ch.isNull())
+            break;
+
+        return false;
+    } // end of switch
+
     const QString blockText = cursor.block().text();
-    const int blockState = cursor.block().userState() & 0xFF;
+    int blockState = cursor.block().userState();
+    if (blockState == -1)
+        blockState = 0;
+    else
+        blockState = blockState & 0xFF;
 
     QScriptIncrementalScanner tokenize;
     const QList<QScriptIncrementalScanner::Token> tokens = tokenize(blockText, blockState);
@@ -419,8 +445,12 @@ bool ScriptEditor::contextAllowsAutoParentheses(const QTextCursor &cursor, const
     int tokenIndex = tokens.size() - 1;
     for (; tokenIndex != -1; --tokenIndex) {
         const QScriptIncrementalScanner::Token &token = tokens.at(tokenIndex);
-        if (pos >= token.begin() && pos <= token.end())
-            break;
+        if (pos >= token.begin()) {
+            if (pos < token.end())
+                break;
+            else if (pos == token.end() && token.is(QScriptIncrementalScanner::Token::Comment))
+                break;
+        }
     }
 
     if (tokenIndex != -1) {
@@ -443,27 +473,7 @@ bool ScriptEditor::contextAllowsAutoParentheses(const QTextCursor &cursor, const
         } // end of switch
     }
 
-    switch (ch.unicode()) {
-    case '\'':
-    case '"':
-
-    case '(':
-    case '[':
-    case '{':
-
-    case ')':
-    case ']':
-    case '}':
-
-    case ';':
-        return true;
-
-    default:
-        if (ch.isNull())
-            return true;
-    } // end of switch
-
-    return false;
+    return true;
 }
 
 bool ScriptEditor::isInComment(const QTextCursor &) const
-- 
GitLab