Browse Source

Improve C/C++ number parsing

Reisz 3 years ago
parent
commit
3ac67231e3
1 changed files with 17 additions and 2 deletions
  1. 17 2
      metrixpp/ext/std/code/magic.py

+ 17 - 2
metrixpp/ext/std/code/magic.py

@@ -27,14 +27,29 @@ class Plugin(api.Plugin,
         self.is_active_numbers_simplier = options.__dict__['std.code.magic.numbers.simplier']
     
     def initialize(self):
+        # C++ Source: https://en.cppreference.com/w/cpp/language/integer_literal
+        # C Source: https://en.cppreference.com/w/c/language/integer_constant
+        cpp_number_patterns = []
+        cpp_number_patterns.append(r'''[1-9]('?[0-9])*''')
+        cpp_number_patterns.append(r'''0('?[0-7])*''')  # 0 is here
+        cpp_number_patterns.append(r'''0[xX][0-9a-fA-F]('?[0-9a-fA-F])*''')
+        cpp_number_patterns.append(r'''0[bB][01]('?[01])*''')
+
+        cpp_number_suffix = r'(ll|LL|[lLzZ])'
+        cpp_number_suffix = r'([uU]?{s}?|{s}[uU])'.format(s=cpp_number_suffix)
+
+        cpp_number_pattern = r'({}){}'.format(r'|'.join(cpp_number_patterns),
+                                              cpp_number_suffix)
+
         pattern_to_search_java = re.compile(
             r'''((const(\s+[_$a-zA-Z][_$a-zA-Z0-9]*)+\s*[=]\s*)[-+]?[0-9]+\b)'''
             r'''|(\b[0-9]+\b)''')
         pattern_to_search_cpp = re.compile(
-            r'''((const(\s+[_a-zA-Z][_a-zA-Z0-9]*)+\s*[=]\s*)[-+]?[0-9]+\b)'''
+            r'''((const(\s+[_a-zA-Z][_a-zA-Z0-9]*)+\s*[=]\s*)[-+]?''' +
+            cpp_number_pattern + r'''\b)'''
             r'''|(virtual\s+.*\s*[=]\s*[0]\s*[,;])'''
             r'''|(override\s+[=]\s*[0]\s*[,;])'''
-            r'''|(\b[0-9]+\b)''')
+            r'''|(\b''' + cpp_number_pattern + r'''\b)''')
         pattern_to_search_cs = re.compile(
             r'''((const(\s+[_a-zA-Z][_a-zA-Z0-9]*)+\s*[=]\s*)[-+]?[0-9]+\b)'''
             r'''|(\b[0-9]+\b)''')