From 14b081f700ff760d08e40b0ba4615211e44036a9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thorbj=C3=B8rn=20Lindeijer?= <thorbjorn.lindeijer@nokia.com>
Date: Wed, 16 Sep 2009 13:56:34 +0200
Subject: [PATCH] Don't insert automatic parenthesis in comments and strings

---
 src/plugins/cppeditor/cppeditor.cpp       |  7 +++++++
 src/plugins/cppeditor/cppeditor.h         |  5 +++--
 src/plugins/texteditor/basetexteditor.cpp | 15 +++++++++++----
 src/plugins/texteditor/basetexteditor.h   |  2 ++
 4 files changed, 23 insertions(+), 6 deletions(-)

diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp
index 3ba2967a9b0..8f9b4075db3 100644
--- a/src/plugins/cppeditor/cppeditor.cpp
+++ b/src/plugins/cppeditor/cppeditor.cpp
@@ -1268,6 +1268,13 @@ bool CPPEditor::isElectricCharacter(const QChar &ch) const
     return false;
 }
 
+bool CPPEditor::contextAllowsAutoParenthesis(const QTextCursor &cursor) const
+{
+    CPlusPlus::TokenUnderCursor tokenUnderCursor;
+    const SimpleToken tk = tokenUnderCursor(cursor);
+    return !(tk.isComment() || tk.isLiteral());
+}
+
 void CPPEditor::indentInsertedText(const QTextCursor &tc)
 {
     indent(tc.document(), tc, QChar::Null);
diff --git a/src/plugins/cppeditor/cppeditor.h b/src/plugins/cppeditor/cppeditor.h
index 40e2e71972f..224033d182e 100644
--- a/src/plugins/cppeditor/cppeditor.h
+++ b/src/plugins/cppeditor/cppeditor.h
@@ -211,8 +211,9 @@ protected:
 
     TextEditor::BaseTextEditorEditable *createEditableInterface();
 
-    // Rertuns true if key triggers anindent.
-    virtual bool isElectricCharacter(const QChar &ch) const;
+    // These override BaseTextEditor
+    bool isElectricCharacter(const QChar &ch) const;
+    bool contextAllowsAutoParenthesis(const QTextCursor &cursor) const;
 
 private Q_SLOTS:
     void updateFileName();
diff --git a/src/plugins/texteditor/basetexteditor.cpp b/src/plugins/texteditor/basetexteditor.cpp
index d5d6e2d5261..b766e672118 100644
--- a/src/plugins/texteditor/basetexteditor.cpp
+++ b/src/plugins/texteditor/basetexteditor.cpp
@@ -1073,9 +1073,8 @@ void BaseTextEditor::keyPressEvent(QKeyEvent *e)
         QString text = e->text();
         QString autoText;
 
-        // TODO disable this inside string or character literals
         if (d->m_autoParenthesesEnabled && d->m_document->tabSettings().m_autoParentheses) {
-            foreach(QChar c, text) {
+            foreach (QChar c, text) {
                 QChar close;
                 if (c == QLatin1Char('('))
                     close = QLatin1Char(')');
@@ -1101,7 +1100,7 @@ void BaseTextEditor::keyPressEvent(QKeyEvent *e)
         }
         QChar electricChar;
         if (d->m_document->tabSettings().m_autoIndent) {
-            foreach(QChar c, text) {
+            foreach (QChar c, text) {
                 if (isElectricCharacter(c)) {
                     electricChar = c;
                     break;
@@ -1110,8 +1109,11 @@ void BaseTextEditor::keyPressEvent(QKeyEvent *e)
         }
         if (!electricChar.isNull())
             cursor.beginEditBlock();
+
+        bool insertAutoParenthesis = !autoText.isEmpty() && contextAllowsAutoParenthesis(cursor);
         cursor.insertText(text);
-        if (!autoText.isEmpty()) {
+
+        if (insertAutoParenthesis) {
             int pos = cursor.position();
             cursor.insertText(autoText);
             cursor.setPosition(pos);
@@ -3316,6 +3318,11 @@ bool BaseTextEditor::isElectricCharacter(const QChar &) const
     return false;
 }
 
+bool BaseTextEditor::contextAllowsAutoParenthesis(const QTextCursor &) const
+{
+    return true;
+}
+
 void BaseTextEditor::indentBlock(QTextDocument *, QTextBlock, QChar)
 {
 }
diff --git a/src/plugins/texteditor/basetexteditor.h b/src/plugins/texteditor/basetexteditor.h
index 691365cecd2..6477ab71e1d 100644
--- a/src/plugins/texteditor/basetexteditor.h
+++ b/src/plugins/texteditor/basetexteditor.h
@@ -508,6 +508,8 @@ protected:
 
     // Returns true if key triggers an indent.
     virtual bool isElectricCharacter(const QChar &ch) const;
+    // Returns true if automatic brace matching should be enabled in the context of the given cursor
+    virtual bool contextAllowsAutoParenthesis(const QTextCursor &cursor) const;
     // Indent a text block based on previous line. Default does nothing
     virtual void indentBlock(QTextDocument *doc, QTextBlock block, QChar typedChar);
     // Indent at cursor. Calls indentBlock for selection or current line.
-- 
GitLab