From c1a0d82acbe6fa026a1f6843fee00cc1df626549 Mon Sep 17 00:00:00 2001 From: amitkummer <49096391+amitkummer@users.noreply.github.com> Date: Sat, 27 Feb 2021 18:32:41 +0200 Subject: 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 --- tests/examplefiles/cpp/functions.cpp | 87 ++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 tests/examplefiles/cpp/functions.cpp (limited to 'tests/examplefiles/cpp/functions.cpp') 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 chars) const noexcept; +std::string contains(std::vector chars) const noexcept {} +std::string std::vector::contains(std::vector chars) const; +std::string std::vector::contains(std::vector chars) const {} +const inline explicit std::string std::vector::contains(std::vector chars) const {} +const inline explicit std::string std::vector::contains(std::vector 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 -- cgit v1.2.1