{"thread":{"id":"51139","subject":"[PATCH v4] userdiff: add built-in pattern for rust","startedAt":"2019-05-21T10:58:28Z","lastAt":"2019-05-21T20:34:01Z","messageCount":2,"participants":["marcandre.lureau@redhat.com","Johannes Sixt"],"isPatch":true,"patchVersion":4,"patchTotal":null},"messages":[{"id":"375988","messageId":"20190521105820.28511-1-marcandre.lureau@redhat.com","threadId":"51139","inReplyTo":null,"subject":"[PATCH v4] userdiff: add built-in pattern for rust","fromName":"","fromEmail":"marcandre.lureau@redhat.com","sentAt":"2019-05-21T10:58:20Z","receivedAt":"2019-05-21T10:58:28Z","isPatch":true,"sender":{"key":"marcandre.lureau@redhat.com","avatar":null},"body":"From: Marc-André Lureau <mlureau@redhat.com>\n\nThis adds xfuncname and word_regex patterns for Rust, a quite\npopular programming language. It also includes test cases for the\nxfuncname regex (t4018) and updated documentation.\n\nThe word_regex pattern finds identifiers, integers, floats and\noperators, according to the Rust Reference Book.\n\nSigned-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>\n---\n Documentation/gitattributes.txt | 2 ++\n t/t4018-diff-funcname.sh        | 1 +\n t/t4018/rust-fn                 | 5 +++++\n t/t4018/rust-impl               | 5 +++++\n t/t4018/rust-nested-fn          | 6 ++++++\n t/t4018/rust-struct             | 5 +++++\n t/t4018/rust-trait              | 5 +++++\n t/t4018/rust-trait-default      | 8 ++++++++\n t/t4018/rust-unsafe             | 6 ++++++\n userdiff.c                      | 6 ++++++\n 10 files changed, 49 insertions(+)\n create mode 100644 t/t4018/rust-fn\n create mode 100644 t/t4018/rust-impl\n create mode 100644 t/t4018/rust-nested-fn\n create mode 100644 t/t4018/rust-struct\n create mode 100644 t/t4018/rust-trait\n create mode 100644 t/t4018/rust-trait-default\n create mode 100644 t/t4018/rust-unsafe\n\ndiff --git a/Documentation/gitattributes.txt b/Documentation/gitattributes.txt\nindex 4fb20cd0e9..07da08fb27 100644\n--- a/Documentation/gitattributes.txt\n+++ b/Documentation/gitattributes.txt\n@@ -833,6 +833,8 @@ patterns are available:\n \n - `ruby` suitable for source code in the Ruby language.\n \n+- `rust` suitable for source code in the Rust language.\n+\n - `tex` suitable for source code for LaTeX documents.\n \n \ndiff --git a/t/t4018-diff-funcname.sh b/t/t4018-diff-funcname.sh\nindex 22f9f88f0a..9261d6d3a0 100755\n--- a/t/t4018-diff-funcname.sh\n+++ b/t/t4018-diff-funcname.sh\n@@ -43,6 +43,7 @@ diffpatterns=\"\n \tphp\n \tpython\n \truby\n+\trust\n \ttex\n \tcustom1\n \tcustom2\ndiff --git a/t/t4018/rust-fn b/t/t4018/rust-fn\nnew file mode 100644\nindex 0000000000..cbe02155f1\n--- /dev/null\n+++ b/t/t4018/rust-fn\n@@ -0,0 +1,5 @@\n+pub(self) fn RIGHT<T>(x: &[T]) where T: Debug {\n+    let _ = x;\n+    // a comment\n+    let a = ChangeMe;\n+}\ndiff --git a/t/t4018/rust-impl b/t/t4018/rust-impl\nnew file mode 100644\nindex 0000000000..09df3cd93b\n--- /dev/null\n+++ b/t/t4018/rust-impl\n@@ -0,0 +1,5 @@\n+impl<'a, T: AsRef<[u8]>>  std::RIGHT for Git<'a> {\n+\n+    pub fn ChangeMe(&self) -> () {\n+    }\n+}\ndiff --git a/t/t4018/rust-nested-fn b/t/t4018/rust-nested-fn\nnew file mode 100644\nindex 0000000000..ca5cca3292\n--- /dev/null\n+++ b/t/t4018/rust-nested-fn\n@@ -0,0 +1,6 @@\n+fn foo() {\n+    fn RIGHT() {\n+        // must catch nested function\n+        ChangeMe;\n+    }\n+}\ndiff --git a/t/t4018/rust-struct b/t/t4018/rust-struct\nnew file mode 100644\nindex 0000000000..76aff1c0d8\n--- /dev/null\n+++ b/t/t4018/rust-struct\n@@ -0,0 +1,5 @@\n+#[derive(Debug)]\n+pub(super) struct RIGHT<'a> {\n+    name: &'a str,\n+    age: ChangeMe,\n+}\ndiff --git a/t/t4018/rust-trait b/t/t4018/rust-trait\nnew file mode 100644\nindex 0000000000..ea397f09ed\n--- /dev/null\n+++ b/t/t4018/rust-trait\n@@ -0,0 +1,5 @@\n+unsafe trait RIGHT<T> {\n+    fn len(&self) -> u32;\n+    fn ChangeMe(&self, n: u32) -> T;\n+    fn iter<F>(&self, f: F) where F: Fn(T);\n+}\ndiff --git a/t/t4018/rust-trait-default b/t/t4018/rust-trait-default\nnew file mode 100644\nindex 0000000000..e667d22ca4\n--- /dev/null\n+++ b/t/t4018/rust-trait-default\n@@ -0,0 +1,8 @@\n+trait RIGHT {\n+\n+    fn new(name: &'static str) -> Self;\n+\n+    fn ChangeMe(&self) {\n+        // should skip \"new\", and return trait name\n+    }\n+}\ndiff --git a/t/t4018/rust-unsafe b/t/t4018/rust-unsafe\nnew file mode 100644\nindex 0000000000..fd4661a934\n--- /dev/null\n+++ b/t/t4018/rust-unsafe\n@@ -0,0 +1,6 @@\n+unsafe fn RIGHT(inc: u32) {\n+    unsafe {\n+        // don't catch unsafe block\n+        ChangeMe += inc;\n+    }\n+}\ndiff --git a/userdiff.c b/userdiff.c\nindex 3a78fbf504..2bcf105caf 100644\n--- a/userdiff.c\n+++ b/userdiff.c\n@@ -130,6 +130,12 @@ PATTERNS(\"ruby\", \"^[ \\t]*((class|module|def)[ \\t].*)$\",\n \t \"(@|@@|\\\\$)?[a-zA-Z_][a-zA-Z0-9_]*\"\n \t \"|[-+0-9.e]+|0[xXbB]?[0-9a-fA-F]+|\\\\?(\\\\\\\\C-)?(\\\\\\\\M-)?.\"\n \t \"|//=?|[-+*/<>%&^|=!]=|<<=?|>>=?|===|\\\\.{1,3}|::|[!=]~\"),\n+PATTERNS(\"rust\",\n+\t \"^[\\t ]*((pub(\\\\([^\\\\)]+\\\\))?[\\t ]+)?((async|const|unsafe|extern([\\t ]+\\\"[^\\\"]+\\\"))[\\t ]+)?(struct|enum|union|mod|trait|fn|impl)[< \\t]+[^;]*)$\",\n+\t /* -- */\n+\t \"[a-zA-Z_][a-zA-Z0-9_]*\"\n+\t \"|[0-9][0-9_a-fA-Fiosuxz]*(\\\\.([0-9]*[eE][+-]?)?[0-9_fF]*)?\"\n+\t \"|[-+*\\\\/<>%&^|=!:]=|<<=?|>>=?|&&|\\\\|\\\\||->|=>|\\\\.{2}=|\\\\.{3}|::\"),\n PATTERNS(\"bibtex\", \"(@[a-zA-Z]{1,}[ \\t]*\\\\{{0,1}[ \\t]*[^ \\t\\\"@',\\\\#}{~%]*).*$\",\n \t \"[={}\\\"]|[^={}\\\" \\t]+\"),\n PATTERNS(\"tex\", \"^(\\\\\\\\((sub)*section|chapter|part)\\\\*{0,1}\\\\{.*)$\",\n\nbase-commit: aa25c82427ae70aebf3b8f970f2afd54e9a2a8c6\n-- \n2.22.0.rc1.1.g079e7d2849.dirty\n\n"},{"id":"376012","messageId":"6d2cf89d-315e-f202-92cd-c7d9c5458164@kdbg.org","threadId":"51139","inReplyTo":"20190521105820.28511-1-marcandre.lureau@redhat.com","subject":"Re: [PATCH v4] userdiff: add built-in pattern for rust","fromName":"Johannes Sixt","fromEmail":"j6t@kdbg.org","sentAt":"2019-05-21T20:33:53Z","receivedAt":"2019-05-21T20:34:01Z","isPatch":true,"sender":{"key":"j6t@kdbg.org","avatar":"https://avatars.githubusercontent.com/u/14810926?v=4"},"body":"Am 21.05.19 um 12:58 schrieb marcandre.lureau@redhat.com:\n> From: Marc-André Lureau <mlureau@redhat.com>\n> \n> This adds xfuncname and word_regex patterns for Rust, a quite\n> popular programming language. It also includes test cases for the\n> xfuncname regex (t4018) and updated documentation.\n> \n> The word_regex pattern finds identifiers, integers, floats and\n> operators, according to the Rust Reference Book.\n> \n> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>\n\nAcked-by: Johannes Sixt <j6t@kdbg.org>\n\n> ---\n>  Documentation/gitattributes.txt | 2 ++\n>  t/t4018-diff-funcname.sh        | 1 +\n>  t/t4018/rust-fn                 | 5 +++++\n>  t/t4018/rust-impl               | 5 +++++\n>  t/t4018/rust-nested-fn          | 6 ++++++\n>  t/t4018/rust-struct             | 5 +++++\n>  t/t4018/rust-trait              | 5 +++++\n>  t/t4018/rust-trait-default      | 8 ++++++++\n>  t/t4018/rust-unsafe             | 6 ++++++\n>  userdiff.c                      | 6 ++++++\n>  10 files changed, 49 insertions(+)\n>  create mode 100644 t/t4018/rust-fn\n>  create mode 100644 t/t4018/rust-impl\n>  create mode 100644 t/t4018/rust-nested-fn\n>  create mode 100644 t/t4018/rust-struct\n>  create mode 100644 t/t4018/rust-trait\n>  create mode 100644 t/t4018/rust-trait-default\n>  create mode 100644 t/t4018/rust-unsafe\n> \n> diff --git a/Documentation/gitattributes.txt b/Documentation/gitattributes.txt\n> index 4fb20cd0e9..07da08fb27 100644\n> --- a/Documentation/gitattributes.txt\n> +++ b/Documentation/gitattributes.txt\n> @@ -833,6 +833,8 @@ patterns are available:\n>  \n>  - `ruby` suitable for source code in the Ruby language.\n>  \n> +- `rust` suitable for source code in the Rust language.\n> +\n>  - `tex` suitable for source code for LaTeX documents.\n>  \n>  \n> diff --git a/t/t4018-diff-funcname.sh b/t/t4018-diff-funcname.sh\n> index 22f9f88f0a..9261d6d3a0 100755\n> --- a/t/t4018-diff-funcname.sh\n> +++ b/t/t4018-diff-funcname.sh\n> @@ -43,6 +43,7 @@ diffpatterns=\"\n>  \tphp\n>  \tpython\n>  \truby\n> +\trust\n>  \ttex\n>  \tcustom1\n>  \tcustom2\n> diff --git a/t/t4018/rust-fn b/t/t4018/rust-fn\n> new file mode 100644\n> index 0000000000..cbe02155f1\n> --- /dev/null\n> +++ b/t/t4018/rust-fn\n> @@ -0,0 +1,5 @@\n> +pub(self) fn RIGHT<T>(x: &[T]) where T: Debug {\n> +    let _ = x;\n> +    // a comment\n> +    let a = ChangeMe;\n> +}\n> diff --git a/t/t4018/rust-impl b/t/t4018/rust-impl\n> new file mode 100644\n> index 0000000000..09df3cd93b\n> --- /dev/null\n> +++ b/t/t4018/rust-impl\n> @@ -0,0 +1,5 @@\n> +impl<'a, T: AsRef<[u8]>>  std::RIGHT for Git<'a> {\n> +\n> +    pub fn ChangeMe(&self) -> () {\n> +    }\n> +}\n> diff --git a/t/t4018/rust-nested-fn b/t/t4018/rust-nested-fn\n> new file mode 100644\n> index 0000000000..ca5cca3292\n> --- /dev/null\n> +++ b/t/t4018/rust-nested-fn\n> @@ -0,0 +1,6 @@\n> +fn foo() {\n> +    fn RIGHT() {\n> +        // must catch nested function\n> +        ChangeMe;\n> +    }\n> +}\n> diff --git a/t/t4018/rust-struct b/t/t4018/rust-struct\n> new file mode 100644\n> index 0000000000..76aff1c0d8\n> --- /dev/null\n> +++ b/t/t4018/rust-struct\n> @@ -0,0 +1,5 @@\n> +#[derive(Debug)]\n> +pub(super) struct RIGHT<'a> {\n> +    name: &'a str,\n> +    age: ChangeMe,\n> +}\n> diff --git a/t/t4018/rust-trait b/t/t4018/rust-trait\n> new file mode 100644\n> index 0000000000..ea397f09ed\n> --- /dev/null\n> +++ b/t/t4018/rust-trait\n> @@ -0,0 +1,5 @@\n> +unsafe trait RIGHT<T> {\n> +    fn len(&self) -> u32;\n> +    fn ChangeMe(&self, n: u32) -> T;\n> +    fn iter<F>(&self, f: F) where F: Fn(T);\n> +}\n> diff --git a/t/t4018/rust-trait-default b/t/t4018/rust-trait-default\n> new file mode 100644\n> index 0000000000..e667d22ca4\n> --- /dev/null\n> +++ b/t/t4018/rust-trait-default\n> @@ -0,0 +1,8 @@\n> +trait RIGHT {\n> +\n> +    fn new(name: &'static str) -> Self;\n> +\n> +    fn ChangeMe(&self) {\n> +        // should skip \"new\", and return trait name\n> +    }\n> +}\n> diff --git a/t/t4018/rust-unsafe b/t/t4018/rust-unsafe\n> new file mode 100644\n> index 0000000000..fd4661a934\n> --- /dev/null\n> +++ b/t/t4018/rust-unsafe\n> @@ -0,0 +1,6 @@\n> +unsafe fn RIGHT(inc: u32) {\n> +    unsafe {\n> +        // don't catch unsafe block\n> +        ChangeMe += inc;\n> +    }\n> +}\n> diff --git a/userdiff.c b/userdiff.c\n> index 3a78fbf504..2bcf105caf 100644\n> --- a/userdiff.c\n> +++ b/userdiff.c\n> @@ -130,6 +130,12 @@ PATTERNS(\"ruby\", \"^[ \\t]*((class|module|def)[ \\t].*)$\",\n>  \t \"(@|@@|\\\\$)?[a-zA-Z_][a-zA-Z0-9_]*\"\n>  \t \"|[-+0-9.e]+|0[xXbB]?[0-9a-fA-F]+|\\\\?(\\\\\\\\C-)?(\\\\\\\\M-)?.\"\n>  \t \"|//=?|[-+*/<>%&^|=!]=|<<=?|>>=?|===|\\\\.{1,3}|::|[!=]~\"),\n> +PATTERNS(\"rust\",\n> +\t \"^[\\t ]*((pub(\\\\([^\\\\)]+\\\\))?[\\t ]+)?((async|const|unsafe|extern([\\t ]+\\\"[^\\\"]+\\\"))[\\t ]+)?(struct|enum|union|mod|trait|fn|impl)[< \\t]+[^;]*)$\",\n> +\t /* -- */\n> +\t \"[a-zA-Z_][a-zA-Z0-9_]*\"\n> +\t \"|[0-9][0-9_a-fA-Fiosuxz]*(\\\\.([0-9]*[eE][+-]?)?[0-9_fF]*)?\"\n> +\t \"|[-+*\\\\/<>%&^|=!:]=|<<=?|>>=?|&&|\\\\|\\\\||->|=>|\\\\.{2}=|\\\\.{3}|::\"),\n>  PATTERNS(\"bibtex\", \"(@[a-zA-Z]{1,}[ \\t]*\\\\{{0,1}[ \\t]*[^ \\t\\\"@',\\\\#}{~%]*).*$\",\n>  \t \"[={}\\\"]|[^={}\\\" \\t]+\"),\n>  PATTERNS(\"tex\", \"^(\\\\\\\\((sub)*section|chapter|part)\\\\*{0,1}\\\\{.*)$\",\n> \n> base-commit: aa25c82427ae70aebf3b8f970f2afd54e9a2a8c6\n> \n\n"}]}