summaryrefslogtreecommitdiff
path: root/tests/examplefiles/cpp/functions.cpp
diff options
context:
space:
mode:
authoramitkummer <49096391+amitkummer@users.noreply.github.com>2021-02-27 18:32:41 +0200
committerGitHub <noreply@github.com>2021-02-27 17:32:41 +0100
commitc1a0d82acbe6fa026a1f6843fee00cc1df626549 (patch)
tree2f62310c9f3e6b674c2d8a39f700dbfa921181fb /tests/examplefiles/cpp/functions.cpp
parentad55974ce83b85dbb333ab57764415ab84169461 (diff)
downloadpygments-git-c1a0d82acbe6fa026a1f6843fee00cc1df626549.tar.gz
Fixes for C and C++ functions and namespaces (#1722)
* Fix lexing of function names This fixes #1561. Add a keywords state that matches inside and outside functions for keywords. Before this, when a keyword would appear the lexer would go to the statements state, in which functions were not matched. * Add tests for lexing of function names * Unbreak previous tests * Allow namespaced names in function statements Add a second identifiers regex that matces all the previous identifiers and also '::'. I took the decision to create a second identifiers regex with '::' inside, simply because using the old identifiers regex would hurt performance massively on every solution I tried to craft. * Add tests for namespaced names in functions * Unbreak previous tests * Add support for namespaces in namespace declarations Add a namespace state that is entered each time the namespace keyword is matched and lexes all name matches as namespaces. Cases this approach doesn't cover: * Namespaces in using declarations. * Namespaces that prefix names in random code. Unfortunately, in both of these cases the names before and after '::' are not always namespaces. * Add tests for namespace declartions * Unbreak previous tests * Tidy functions regex Remove group nesting that became unneeded after fc56ab8 (the last big refactor). * Remove f string usage I introduced by mistake
Diffstat (limited to 'tests/examplefiles/cpp/functions.cpp')
-rw-r--r--tests/examplefiles/cpp/functions.cpp87
1 files changed, 87 insertions, 0 deletions
diff --git a/tests/examplefiles/cpp/functions.cpp b/tests/examplefiles/cpp/functions.cpp
new file mode 100644
index 00000000..662e0d2c
--- /dev/null
+++ b/tests/examplefiles/cpp/functions.cpp
@@ -0,0 +1,87 @@
+using std::numerical;
+string contains(const char str);
+string contains(const char str) {}
+string* contains(const char str);
+string* contains(const char str) {}
+string * contains(const char str);
+string * contains(const char str) {}
+string * contains(const char str);
+string * contains(const char str) {}
+string *contains(const char str);
+string *contains(const char str) {}
+string **contains(const char str);
+string **contains(const char str) {}
+string** contains(const char str);
+string** contains(const char str) {}
+string ** contains(const char str);
+string ** contains(const char str) {}
+string & contains(const char str);
+string & contains(const char str) {}
+string& contains(const char str);
+string& contains(const char str) {}
+string &contains(const char str);
+string &contains(const char str) {}
+string &&contains(const char str);
+string &&contains(const char str) {}
+string && contains(const char str);
+string && contains(const char str) {}
+string&& contains(const char str);
+string&& contains(const char str) {}
+const string contains(const char str);
+const string contains(const char str) {}
+explicit const string contains(const char str);
+explicit const string contains(const char str) {}
+explicit const string contains(const char str) noexcept;
+explicit const string contains(const char str) noexcept {}
+explicit const string contains(const char str) noexcept const;
+explicit const string contains(const char str) noexcept const {}
+
+
+explicit const string contains(const char&str);
+explicit const string contains(const char&str) {}
+explicit const string contains(const char& str);
+explicit const string contains(const char& str) {}
+explicit const string contains(const char str);
+explicit const string contains(const char str) {}
+explicit const string contains(const char&& str);
+explicit const string contains(const char&& str) {}
+explicit const string contains(const char&& str);
+explicit const string contains(const char&& str) {}
+explicit const string contains(const char &&str);
+explicit const string contains(const char &&str) {}
+explicit const string contains(const char ***** str);
+explicit const string contains(const char ***** str) {}
+explicit const string contains(const char *****str);
+explicit const string contains(const char *****str) {}
+explicit const string contains(const char***** str);
+explicit const string contains(const char***** str) {}
+explicit const string contains(const char *str);
+explicit const string contains(const char *str) {}
+explicit const string contains(const char* str);
+explicit const string contains(const char* str) {}
+explicit const string contains(const char * str);
+explicit const string contains(const char * str) {}
+
+// Names with namespaces
+
+string Type::contains(char c) const noexcept;
+string Type::contains(char c) const noexcept {}
+std::string contains(char c) const noexcept;
+std::string contains(char c) const noexcept {}
+std::string contains(std::vector<char> chars) const noexcept;
+std::string contains(std::vector<char> chars) const noexcept {}
+std::string std::vector::contains(std::vector<char> chars) const;
+std::string std::vector::contains(std::vector<char> chars) const {}
+const inline explicit std::string std::vector::contains(std::vector<char> chars) const {}
+const inline explicit std::string std::vector::contains(std::vector<char> chars) const;
+
+// inside classes
+
+class raz {
+ const virtual std::string contains(const std::string str);
+}
+
+// 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