summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoramitkummer <49096391+amitkummer@users.noreply.github.com>2022-08-18 15:15:40 +0200
committerGitHub <noreply@github.com>2022-08-18 15:15:40 +0200
commitadb90dc65f2f211675af5be27d2a7efdf96c6f44 (patch)
tree73f86268cf1506ac58ff67445809e866ee5137c0
parentbb780f42fff0c9c278b33c545b445ded1179561b (diff)
downloadpygments-git-adb90dc65f2f211675af5be27d2a7efdf96c6f44.tar.gz
CFamilyLexer: Fix matching of function parameters (#2210)
This fixes an issue where in code like this: ``` int foo(float bar) // hello() {} ``` The lexer would match `(float bar) // hello()` as the parameters of the function `foo`, instead of just `(float bar)`. In addition, a similar test case to what was originally reported in #2208 is added.
-rw-r--r--pygments/lexers/c_cpp.py16
-rw-r--r--tests/examplefiles/cpp/functions.cpp18
-rw-r--r--tests/examplefiles/cpp/functions.cpp.output73
3 files changed, 98 insertions, 9 deletions
diff --git a/pygments/lexers/c_cpp.py b/pygments/lexers/c_cpp.py
index 59749fa6..4b5aa2a0 100644
--- a/pygments/lexers/c_cpp.py
+++ b/pygments/lexers/c_cpp.py
@@ -129,22 +129,22 @@ class CFamilyLexer(RegexLexer):
include('keywords'),
# functions
(r'(' + _namespaced_ident + r'(?:[&*\s])+)' # return arguments
- r'(' + _possible_comments + r')' # possible comments
+ r'(' + _possible_comments + r')'
r'(' + _namespaced_ident + r')' # method name
- r'(' + _possible_comments + r')' # possible comments
- r'(\([^;"\']*?\))' # signature
- r'(' + _possible_comments + r')' # possible comments
+ r'(' + _possible_comments + r')'
+ r'(\([^;"\')]*?\))' # signature
+ r'(' + _possible_comments + r')'
r'([^;{/"\']*)(\{)',
bygroups(using(this), using(this, state='whitespace'), Name.Function, using(this, state='whitespace'),
using(this), using(this, state='whitespace'), using(this), Punctuation),
'function'),
# function declarations
(r'(' + _namespaced_ident + r'(?:[&*\s])+)' # return arguments
- r'(' + _possible_comments + r')' # possible comments
+ r'(' + _possible_comments + r')'
r'(' + _namespaced_ident + r')' # method name
- r'(' + _possible_comments + r')' # possible comments
- r'(\([^;"\']*?\))' # signature
- r'(' + _possible_comments + r')' # possible comments
+ r'(' + _possible_comments + r')'
+ r'(\([^;"\')]*?\))' # signature
+ r'(' + _possible_comments + r')'
r'([^;/"\']*)(;)',
bygroups(using(this), using(this, state='whitespace'), Name.Function, using(this, state='whitespace'),
using(this), using(this, state='whitespace'), using(this), Punctuation)),
diff --git a/tests/examplefiles/cpp/functions.cpp b/tests/examplefiles/cpp/functions.cpp
index ef359fe0..25b232b9 100644
--- a/tests/examplefiles/cpp/functions.cpp
+++ b/tests/examplefiles/cpp/functions.cpp
@@ -87,4 +87,20 @@ class raz {
// Make sure these are not functions:
else if(flag && func_call()) {}
new T();
-const operator int() const {} // so int is lexed as type and not function.name \ No newline at end of file
+const operator int() const {} // so int is lexed as type and not function.name
+
+class foo bar : public raz
+{
+ Q_OBJECT
+ /// \cond INCLUDE_QPROPERTIES
+ Q_PROPERTY(arg1 arg2)
+ /// \endcond
+
+public:
+ /*!
+ Lorem ipsum core vanditi.
+ */
+ enum duck { dog, // Comment.
+ cat // Comment (see \ref replot).
+ };
+};
diff --git a/tests/examplefiles/cpp/functions.cpp.output b/tests/examplefiles/cpp/functions.cpp.output
index 619b3fdd..13ccaf89 100644
--- a/tests/examplefiles/cpp/functions.cpp.output
+++ b/tests/examplefiles/cpp/functions.cpp.output
@@ -1427,3 +1427,76 @@
'}' Punctuation
' ' Text.Whitespace
'// so int is lexed as type and not function.name\n' Comment.Single
+
+'\n' Text.Whitespace
+
+'class' Keyword
+' ' Text.Whitespace
+'foo' Name.Class
+' ' Text.Whitespace
+'bar' Name
+' ' Text.Whitespace
+':' Operator
+' ' Text.Whitespace
+'public' Keyword
+' ' Text.Whitespace
+'raz' Name
+'\n' Text.Whitespace
+
+'{' Punctuation
+'\n' Text.Whitespace
+
+' ' Text.Whitespace
+'Q_OBJECT' Name
+'\n' Text.Whitespace
+
+' ' Text.Whitespace
+'/// \\cond INCLUDE_QPROPERTIES\n' Comment.Single
+
+' ' Text.Whitespace
+'Q_PROPERTY' Name
+'(' Punctuation
+'arg1' Name
+' ' Text.Whitespace
+'arg2' Name
+')' Punctuation
+'\n' Text.Whitespace
+
+' ' Text.Whitespace
+'/// \\endcond\n' Comment.Single
+
+'\n' Text.Whitespace
+
+'public' Keyword
+':' Operator
+'\n' Text.Whitespace
+
+' ' Text.Whitespace
+'/*!\n Lorem ipsum core vanditi.\n */' Comment.Multiline
+'\n' Text.Whitespace
+
+' ' Text.Whitespace
+'enum' Keyword
+' ' Text.Whitespace
+'duck' Name.Class
+' ' Text.Whitespace
+'{' Punctuation
+' ' Text.Whitespace
+'dog' Name
+',' Punctuation
+' ' Text.Whitespace
+'// Comment.\n' Comment.Single
+
+' ' Text.Whitespace
+'cat' Name
+' ' Text.Whitespace
+'// Comment (see \\ref replot).\n' Comment.Single
+
+' ' Text.Whitespace
+'}' Punctuation
+';' Punctuation
+'\n' Text.Whitespace
+
+'}' Punctuation
+';' Punctuation
+'\n' Text.Whitespace