From e40cd82f8c12ca3d0a3b0e9c89737acf940def44 Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Tue, 29 Sep 2009 11:34:11 +0200
Subject: [PATCH] Introduced T_CPP_COMMENT and T_CPP_DOXY_COMMENT to handle
 C++-style comments and improved CPPEditor::isInComment to handle the newly
 introduced tokens.

As side effect,this change should fix the regression we introduced in the "automagically" quote/brace insertion.
---
 src/libs/cplusplus/SimpleLexer.cpp       |  3 ++-
 src/plugins/cppeditor/cppeditor.cpp      | 11 ++++++++++-
 src/plugins/cppeditor/cpphighlighter.cpp |  2 +-
 src/shared/cplusplus/Lexer.cpp           |  2 +-
 src/shared/cplusplus/Token.cpp           |  1 +
 src/shared/cplusplus/Token.h             |  5 ++++-
 6 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/src/libs/cplusplus/SimpleLexer.cpp b/src/libs/cplusplus/SimpleLexer.cpp
index 59475bc4a4e..2934804f093 100644
--- a/src/libs/cplusplus/SimpleLexer.cpp
+++ b/src/libs/cplusplus/SimpleLexer.cpp
@@ -63,7 +63,8 @@ bool SimpleToken::isKeyword() const
 
 bool SimpleToken::isComment() const
 {
-    return _kind == T_COMMENT || _kind == T_DOXY_COMMENT;
+    return _kind == T_COMMENT || _kind == T_DOXY_COMMENT ||
+            _kind == T_CPP_COMMENT || _kind == T_CPP_DOXY_COMMENT;
 }
 
 bool SimpleToken::isObjCAtKeyword() const
diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp
index e16c9008fed..07c892db197 100644
--- a/src/plugins/cppeditor/cppeditor.cpp
+++ b/src/plugins/cppeditor/cppeditor.cpp
@@ -1543,7 +1543,16 @@ bool CPPEditor::isInComment(const QTextCursor &cursor) const
     const SimpleToken tk = tokenUnderCursor(cursor);
 
     if (tk.isComment()) {
-        const int pos = cursor.selectionEnd();
+        const int pos = cursor.selectionEnd() - cursor.block().position();
+
+        if (pos == tk.end()) {
+            if (tk.is(T_CPP_COMMENT) || tk.is(T_CPP_DOXY_COMMENT))
+                return true;
+
+            const int state = cursor.block().userState() & 0xFF;
+            if (state > 0)
+                return true;
+        }
 
         if (pos < tk.end())
             return true;
diff --git a/src/plugins/cppeditor/cpphighlighter.cpp b/src/plugins/cppeditor/cpphighlighter.cpp
index ed5d82d2796..1e1a200b8c8 100644
--- a/src/plugins/cppeditor/cpphighlighter.cpp
+++ b/src/plugins/cppeditor/cpphighlighter.cpp
@@ -138,7 +138,7 @@ void CppHighlighter::highlightBlock(const QString &text)
 
         else if (tk.isComment()) {
 
-            if (tk.is(T_COMMENT))
+            if (tk.is(T_COMMENT) || tk.is(T_CPP_COMMENT))
                 setFormat(tk.position(), tk.length(), m_formats[CppCommentFormat]);
 
             else // a doxygen comment
diff --git a/src/shared/cplusplus/Lexer.cpp b/src/shared/cplusplus/Lexer.cpp
index a9ef6cce3ff..79c9bf4af1c 100644
--- a/src/shared/cplusplus/Lexer.cpp
+++ b/src/shared/cplusplus/Lexer.cpp
@@ -428,7 +428,7 @@ void Lexer::scan_helper(Token *tok)
             if (! f._scanCommentTokens)
                 goto _Lagain;
 
-            tok->f.kind = doxy ? T_DOXY_COMMENT : T_COMMENT;
+            tok->f.kind = doxy ? T_CPP_DOXY_COMMENT : T_CPP_COMMENT;
 
         } else if (_yychar == '*') {
             yyinp();
diff --git a/src/shared/cplusplus/Token.cpp b/src/shared/cplusplus/Token.cpp
index 14a62f3db3a..547849b1ccb 100644
--- a/src/shared/cplusplus/Token.cpp
+++ b/src/shared/cplusplus/Token.cpp
@@ -54,6 +54,7 @@ CPLUSPLUS_BEGIN_NAMESPACE
 static const char *token_names[] = {
     (""), ("<error>"),
 
+    ("<C++ comment>"), ("<C++ doxy comment>"),
     ("<comment>"), ("<doxy comment>"),
 
     ("<identifier>"), ("<numeric literal>"), ("<char literal>"),
diff --git a/src/shared/cplusplus/Token.h b/src/shared/cplusplus/Token.h
index 861c21da27b..00d42b7f89c 100644
--- a/src/shared/cplusplus/Token.h
+++ b/src/shared/cplusplus/Token.h
@@ -59,6 +59,8 @@ enum Kind {
     T_EOF_SYMBOL = 0,
     T_ERROR,
 
+    T_CPP_COMMENT,
+    T_CPP_DOXY_COMMENT,
     T_COMMENT,
     T_DOXY_COMMENT,
     T_IDENTIFIER,
@@ -297,7 +299,8 @@ public:
     { return f.kind >= T_FIRST_KEYWORD && f.kind < T_FIRST_QT_KEYWORD; }
 
     inline bool isComment() const
-    { return f.kind == T_COMMENT || f.kind == T_DOXY_COMMENT; }
+    { return f.kind == T_COMMENT || f.kind == T_DOXY_COMMENT ||
+      f.kind == T_CPP_COMMENT || f.kind == T_CPP_DOXY_COMMENT; }
 
     inline bool isObjCAtKeyword() const
     { return f.kind >= T_FIRST_OBJC_AT_KEYWORD && f.kind <= T_LAST_OBJC_AT_KEYWORD; }
-- 
GitLab