Support POSIX, bashism and mixed function declarations, all four
compound command types, trailing comments and mixed whitespace.
Even though Bash allows locale-dependent characters in function names
<https://unix.stackexchange.com/a/245336/3645>, only detect function
names with characters allowed by POSIX.1-2017
<https://pubs.opengroup.org/onlinepubs/
9699919799/basedefs/V1_chap03.html#tag_03_235>
for simplicity. This should cover the vast majority of use cases, and
produces system-agnostic results.
Since a word pattern has to be specified, but there is no easy way to
know the default word pattern, use the default `IFS` characters for a
starter. A later patch can improve this.
Signed-off-by: Victor Engmark <victor@engmark.name>
Acked-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
- `ada` suitable for source code in the Ada language.
+- `bash` suitable for source code in the Bourne-Again SHell language.
+ Covers a superset of POSIX shell function definitions.
+
- `bibtex` suitable for files with BibTeX coded references.
- `cpp` suitable for source code in the C and C++ languages.
diffpatterns="
ada
+ bash
bibtex
cpp
csharp
--- /dev/null
+RIGHT() ((
+
+ ChangeMe = "$x" + "$y"
+))
--- /dev/null
+function RIGHT {
+ function InvalidSyntax{
+ :
+ echo 'ChangeMe'
+ }
+}
--- /dev/null
+function RIGHT {
+ :
+ echo 'ChangeMe'
+}
--- /dev/null
+ function RIGHT ( ) {
+
+ ChangeMe
+ }
--- /dev/null
+RIGHT() [[ \
+
+ "$a" > "$ChangeMe"
+]]
--- /dev/null
+function RIGHT {
+ functionInvalidSyntax {
+ :
+ echo 'ChangeMe'
+ }
+}
--- /dev/null
+function RIGHT(){
+ :
+ echo 'ChangeMe'
+}
--- /dev/null
+function RIGHT() {
+
+ ChangeMe
+}
--- /dev/null
+outer() {
+ RIGHT() {
+ :
+ echo 'ChangeMe'
+ }
+}
--- /dev/null
+_RIGHT_0n() {
+
+ ChangeMe
+}
--- /dev/null
+RIGHT(){
+
+ ChangeMe
+}
--- /dev/null
+RIGHT() {
+
+ ChangeMe
+}
--- /dev/null
+ RIGHT ( ) {
+
+ ChangeMe
+ }
--- /dev/null
+RIGHT() (
+
+ ChangeMe=2
+)
--- /dev/null
+RIGHT() { # Comment
+
+ ChangeMe
+}
"[a-zA-Z][a-zA-Z0-9_]*"
"|[-+]?[0-9][0-9#_.aAbBcCdDeEfF]*([eE][+-]?[0-9_]+)?"
"|=>|\\.\\.|\\*\\*|:=|/=|>=|<=|<<|>>|<>"),
+PATTERNS("bash",
+ /* Optional leading indentation */
+ "^[ \t]*"
+ /* Start of captured text */
+ "("
+ "("
+ /* POSIX identifier with mandatory parentheses */
+ "[a-zA-Z_][a-zA-Z0-9_]*[ \t]*\\([ \t]*\\))"
+ "|"
+ /* Bashism identifier with optional parentheses */
+ "(function[ \t]+[a-zA-Z_][a-zA-Z0-9_]*(([ \t]*\\([ \t]*\\))|([ \t]+))"
+ ")"
+ /* Optional whitespace */
+ "[ \t]*"
+ /* Compound command starting with `{`, `(`, `((` or `[[` */
+ "(\\{|\\(\\(?|\\[\\[)"
+ /* End of captured text */
+ ")",
+ /* -- */
+ /* Characters not in the default $IFS value */
+ "[^ \t]+"),
PATTERNS("dts",
"!;\n"
"!=\n"