]> git.ipfire.org Git - thirdparty/git.git/blobdiff - userdiff.c
Merge branch 'rj/add-i-leak-fix'
[thirdparty/git.git] / userdiff.c
index 2b1dab2649ac50b64abf99846e5b78c517e78ef4..82bc76b910ad1ef98d0ca51669de1ca1ca7861ef 100644 (file)
@@ -3,6 +3,7 @@
 #include "userdiff.h"
 #include "attr.h"
 #include "strbuf.h"
+#include "environment.h"
 
 static struct userdiff_driver *drivers;
 static int ndrivers;
@@ -89,12 +90,48 @@ PATTERNS("cpp",
         "|\\.[0-9][0-9]*([Ee][-+]?[0-9]+)?[fFlL]?"
         "|[-+*/<>%&^|=!]=|--|\\+\\+|<<=?|>>=?|&&|\\|\\||::|->\\*?|\\.\\*|<=>"),
 PATTERNS("csharp",
-        /* Keywords */
-        "!^[ \t]*(do|while|for|if|else|instanceof|new|return|switch|case|throw|catch|using)\n"
-        /* Methods and constructors */
-        "^[ \t]*(((static|public|internal|private|protected|new|virtual|sealed|override|unsafe|async)[ \t]+)*[][<>@.~_[:alnum:]]+[ \t]+[<>@._[:alnum:]]+[ \t]*\\(.*\\))[ \t]*$\n"
-        /* Properties */
-        "^[ \t]*(((static|public|internal|private|protected|new|virtual|sealed|override|unsafe)[ \t]+)*[][<>@.~_[:alnum:]]+[ \t]+[@._[:alnum:]]+)[ \t]*$\n"
+        /*
+         * Jump over reserved keywords which are illegal method names, but which
+         * can be followed by parentheses without special characters in between,
+         * making them look like methods.
+         */
+        "!(^|[ \t]+)" /* Start of line or whitespace. */
+               "(do|while|for|foreach|if|else|new|default|return|switch|case|throw"
+               "|catch|using|lock|fixed)"
+               "([ \t(]+|$)\n" /* Whitespace, "(", or end of line. */
+        /*
+         * Methods/constructors:
+         * The strategy is to identify a minimum of two groups (any combination
+         * of keywords/type/name) before the opening parenthesis, and without
+         * final unexpected characters, normally only used in ordinary statements.
+         */
+        "^[ \t]*" /* Remove leading whitespace. */
+               "(" /* Start chunk header capture. */
+               "(" /* First group. */
+                       "[][[:alnum:]@_.]" /* Name. */
+                       "(<[][[:alnum:]@_, \t<>]+>)?" /* Optional generic parameters. */
+               ")+"
+               "([ \t]+" /* Subsequent groups, prepended with space. */
+                       "([][[:alnum:]@_.](<[][[:alnum:]@_, \t<>]+>)?)+"
+               ")+"
+               "[ \t]*" /* Optional space before parameters start. */
+               "\\(" /* Start of method parameters. */
+               "[^;]*" /* Allow complex parameters, but exclude statements (;). */
+               ")$\n" /* Close chunk header capture. */
+        /*
+         * Properties:
+         * As with methods, expect a minimum of two groups. But, more trivial than
+         * methods, the vast majority of properties long enough to be worth
+         * showing a chunk header for don't include "=:;,()" on the line they are
+         * defined, since they don't have a parameter list.
+         */
+        "^[ \t]*("
+               "([][[:alnum:]@_.](<[][[:alnum:]@_, \t<>]+>)?)+"
+               "([ \t]+"
+                       "([][[:alnum:]@_.](<[][[:alnum:]@_, \t<>]+>)?)+"
+               ")+" /* Up to here, same as methods regex. */
+               "[^;=:,()]*" /* Compared to methods, no parameter list allowed. */
+               ")$\n"
         /* Type definitions */
         "^[ \t]*(((static|public|internal|private|protected|new|unsafe|sealed|abstract|partial)[ \t]+)*(class|enum|interface|struct|record)[ \t]+.*)$\n"
         /* Namespace */
@@ -459,7 +496,8 @@ struct userdiff_driver *userdiff_get_textconv(struct repository *r,
        if (!driver->textconv)
                return NULL;
 
-       if (driver->textconv_want_cache && !driver->textconv_cache) {
+       if (driver->textconv_want_cache && !driver->textconv_cache &&
+           have_git_dir()) {
                struct notes_cache *c = xmalloc(sizeof(*c));
                struct strbuf name = STRBUF_INIT;