summaryrefslogtreecommitdiffstats
path: root/completions/java
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 09:14:42 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 09:14:42 +0000
commit0bc58b66a4850cdb8458a86c3d9a2fc81de82aa3 (patch)
treeea0fe36eb5e6f40e0a1f765d44c4b0c0b2bfb089 /completions/java
parentInitial commit. (diff)
downloadbash-completion-upstream.tar.xz
bash-completion-upstream.zip
Adding upstream version 1:2.11.upstream/1%2.11upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'completions/java')
-rw-r--r--completions/java333
1 files changed, 333 insertions, 0 deletions
diff --git a/completions/java b/completions/java
new file mode 100644
index 0000000..d0f70ae
--- /dev/null
+++ b/completions/java
@@ -0,0 +1,333 @@
+# bash completion for java, javac and javadoc -*- shell-script -*-
+
+# available path elements completion
+_java_path()
+{
+ cur=${cur##*:}
+ _filedir '@(jar|zip)'
+}
+
+# exact classpath determination
+_java_find_classpath()
+{
+ local i
+
+ # search first in current options
+ for ((i = 1; i < cword; i++)); do
+ if [[ ${words[i]} == -@(cp|classpath) ]]; then
+ classpath=${words[i + 1]}
+ break
+ fi
+ done
+
+ # default to environment
+ [[ ! -v classpath ]] && classpath=${CLASSPATH-}
+
+ # default to current directory
+ [[ -z $classpath ]] && classpath=.
+}
+
+# exact sourcepath determination
+_java_find_sourcepath()
+{
+ local i
+
+ # search first in current options
+ for ((i = 1; i < cword; i++)); do
+ if [[ ${words[i]} == -sourcepath ]]; then
+ sourcepath=${words[i + 1]}
+ break
+ fi
+ done
+
+ # default to classpath
+ if [[ ! -v sourcepath ]]; then
+ local classpath
+ _java_find_classpath
+ sourcepath=$classpath
+ fi
+}
+
+# available classes completion
+_java_classes()
+{
+ local classpath i
+
+ # find which classpath to use
+ _java_find_classpath
+
+ # convert package syntax to path syntax
+ cur=${cur//.//}
+ # parse each classpath element for classes
+ for i in ${classpath//:/ }; do
+ if [[ $i == *.@(jar|zip) && -r $i ]]; then
+ if type zipinfo &>/dev/null; then
+ COMPREPLY+=($(zipinfo -1 "$i" "$cur*" 2>/dev/null |
+ command grep '^[^$]*\.class$'))
+ elif type unzip &>/dev/null; then
+ # Last column, between entries consisting entirely of dashes
+ COMPREPLY+=($(unzip -lq "$i" "$cur*" 2>/dev/null |
+ awk '$NF ~ /^-+$/ { flag=!flag; next };
+ flag && $NF ~ /^[^$]*\.class/ { print $NF }'))
+ elif type jar &>/dev/null; then
+ COMPREPLY+=($(jar tf "$i" "$cur" |
+ command grep '^[^$]*\.class$'))
+ fi
+
+ elif [[ -d $i ]]; then
+ COMPREPLY+=(
+ $(compgen -d -- "$i/$cur" | command sed -e "s|^$i/\(.*\)|\1.|")
+ $(compgen -f -X '!*.class' -- "$i/$cur" |
+ command sed -e '/\$/d' -e "s|^$i/||")
+ )
+ [[ ${COMPREPLY-} == *.class ]] || compopt -o nospace
+
+ # FIXME: if we have foo.class and foo/, the completion
+ # returns "foo/"... how to give precedence to files
+ # over directories?
+ fi
+ done
+
+ if ((${#COMPREPLY[@]} != 0)); then
+ # remove class extension
+ COMPREPLY=(${COMPREPLY[@]%.class})
+ # convert path syntax to package syntax
+ COMPREPLY=(${COMPREPLY[@]//\//.})
+ fi
+}
+
+# available packages completion
+_java_packages()
+{
+ local sourcepath i
+
+ # find which sourcepath to use
+ _java_find_sourcepath
+
+ # convert package syntax to path syntax
+ cur=${cur//.//}
+ # parse each sourcepath element for packages
+ for i in ${sourcepath//:/ }; do
+ if [[ -d $i ]]; then
+ COMPREPLY+=($(command ls -F -d $i/$cur* 2>/dev/null |
+ command sed -e 's|^'$i'/||'))
+ fi
+ done
+ if ((${#COMPREPLY[@]} != 0)); then
+ # keep only packages
+ COMPREPLY=($(tr " " "\n" <<<"${COMPREPLY[@]}" | command grep "/$"))
+ # remove packages extension
+ COMPREPLY=(${COMPREPLY[@]%/})
+ # convert path syntax to package syntax
+ cur="${COMPREPLY[*]//\//.}"
+ fi
+}
+
+# java completion
+#
+_java()
+{
+ local cur prev words cword
+ _init_completion -n : || return
+
+ local i
+
+ for ((i = 1; i < cword; i++)); do
+ case ${words[i]} in
+ -cp | -classpath)
+ ((i++)) # skip the classpath string.
+ ;;
+ -*)
+ # this is an option, not a class/jarfile name.
+ ;;
+ *)
+ # once we've seen a class, just do filename completion
+ _filedir
+ return
+ ;;
+ esac
+ done
+
+ case $cur in
+ # standard option completions
+ -verbose:*)
+ COMPREPLY=($(compgen -W 'class gc jni' -- "${cur#*:}"))
+ return
+ ;;
+ -javaagent:*)
+ cur=${cur#*:}
+ _filedir '@(jar|zip)'
+ return
+ ;;
+ -agentpath:*)
+ cur=${cur#*:}
+ _filedir so
+ return
+ ;;
+ # various non-standard option completions
+ -splash:*)
+ cur=${cur#*:}
+ _filedir '@(gif|jp?(e)g|png)'
+ return
+ ;;
+ -Xbootclasspath*:*)
+ _java_path
+ return
+ ;;
+ -Xcheck:*)
+ COMPREPLY=($(compgen -W 'jni' -- "${cur#*:}"))
+ return
+ ;;
+ -Xgc:*)
+ COMPREPLY=($(compgen -W 'singlecon gencon singlepar genpar' \
+ -- "${cur#*:}"))
+ return
+ ;;
+ -Xgcprio:*)
+ COMPREPLY=($(compgen -W 'throughput pausetime deterministic' \
+ -- "${cur#*:}"))
+ return
+ ;;
+ -Xloggc:* | -Xverboselog:*)
+ cur=${cur#*:}
+ _filedir
+ return
+ ;;
+ -Xshare:*)
+ COMPREPLY=($(compgen -W 'auto off on' -- "${cur#*:}"))
+ return
+ ;;
+ -Xverbose:*)
+ COMPREPLY=($(compgen -W 'memory load jni cpuinfo codegen opt
+ gcpause gcreport' -- "${cur#*:}"))
+ return
+ ;;
+ -Xverify:*)
+ COMPREPLY=($(compgen -W 'all none remote' -- "${cur#*:}"))
+ return
+ ;;
+ # the rest that we have no completions for
+ -D* | -*:*)
+ return
+ ;;
+ esac
+
+ case $prev in
+ -cp | -classpath)
+ _java_path
+ return
+ ;;
+ esac
+
+ if [[ $cur == -* ]]; then
+ COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur"))
+ [[ $cur == -X* ]] &&
+ COMPREPLY+=($(compgen -W '$(_parse_help "$1" -X)' -- "$cur"))
+ else
+ if [[ $prev == -jar ]]; then
+ # jar file completion
+ _filedir '[jw]ar'
+ else
+ # classes completion
+ _java_classes
+ fi
+ fi
+
+ [[ ${COMPREPLY-} == -*[:=] ]] && compopt -o nospace
+
+ __ltrim_colon_completions "$cur"
+} &&
+ complete -F _java java
+
+_javadoc()
+{
+ local cur prev words cword
+ _init_completion || return
+
+ case $prev in
+ -overview | -helpfile)
+ _filedir '?(x)htm?(l)'
+ return
+ ;;
+ -doclet | -exclude | -subpackages | -source | -locale | -encoding | -windowtitle | \
+ -doctitle | -header | -footer | -top | -bottom | -group | -noqualifier | -tag | \
+ -charset | -sourcetab | -docencoding)
+ return
+ ;;
+ -stylesheetfile)
+ _filedir css
+ return
+ ;;
+ -d | -link | -linkoffline)
+ _filedir -d
+ return
+ ;;
+ -classpath | -cp | -bootclasspath | -docletpath | -sourcepath | -extdirs | \
+ -excludedocfilessubdir)
+ _java_path
+ return
+ ;;
+ esac
+
+ # -linkoffline takes two arguments
+ if [[ $cword -gt 2 && ${words[cword - 2]} == -linkoffline ]]; then
+ _filedir -d
+ return
+ fi
+
+ if [[ $cur == -* ]]; then
+ COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur"))
+ else
+ # source files completion
+ _filedir java
+ # packages completion
+ _java_packages
+ fi
+} &&
+ complete -F _javadoc javadoc
+
+_javac()
+{
+ local cur prev words cword
+ _init_completion -n : || return
+
+ case $prev in
+ -d)
+ _filedir -d
+ return
+ ;;
+ -cp | -classpath | -bootclasspath | -sourcepath | -extdirs)
+ _java_path
+ return
+ ;;
+ esac
+
+ if [[ $cur == -+([a-zA-Z0-9-_]):* ]]; then
+ # Parse required options from -foo:{bar,quux,baz}
+ local helpopt=-help
+ [[ $cur == -X* ]] && helpopt=-X
+ # For some reason there may be -g:none AND -g:{lines,source,vars};
+ # convert the none case to the curly brace format so it parses like
+ # the others.
+ local opts=$("$1" $helpopt 2>&1 | command sed -e 's/-g:none/-g:{none}/' -ne \
+ "s/^[[:space:]]*${cur%%:*}:{\([^}]\{1,\}\)}.*/\1/p")
+ COMPREPLY=($(compgen -W "${opts//,/ }" -- "${cur#*:}"))
+ return
+ fi
+
+ if [[ $cur == -* ]]; then
+ COMPREPLY=($(compgen -W '$(_parse_help "$1" -help)' -- "$cur"))
+ [[ $cur == -X* ]] &&
+ COMPREPLY+=($(compgen -W '$(_parse_help "$1" -X)' -- "$cur"))
+ else
+ # source files completion
+ _filedir java
+ fi
+
+ [[ ${COMPREPLY-} == -*[:=] ]] && compopt -o nospace
+
+ __ltrim_colon_completions "$cur"
+} &&
+ complete -F _javac javac
+
+# ex: filetype=sh