about summary refs log tree commit diff
path: root/Completion/Unix/Type/_java_class
diff options
context:
space:
mode:
Diffstat (limited to 'Completion/Unix/Type/_java_class')
-rw-r--r--Completion/Unix/Type/_java_class24
1 files changed, 24 insertions, 0 deletions
diff --git a/Completion/Unix/Type/_java_class b/Completion/Unix/Type/_java_class
new file mode 100644
index 000000000..d81669c00
--- /dev/null
+++ b/Completion/Unix/Type/_java_class
@@ -0,0 +1,24 @@
+#autoload
+
+# Should probably add some sort of cache.
+# Should we call _multi_parts instead of compadd?
+
+local classpath i expl
+local -a c
+local method type
+
+zparseopts -D -E -a classpath t:=type m:=method cp: classpath:
+: "$classpath[@]"
+classpath="${${classpath[2]:-${CLASSPATH:-.}}//\\:/:}"
+: "$classpath[@]"
+
+for i in "${(s.:.)classpath}"; do
+  if [ -f $i ] && [[ "$i" == *.(jar|zip|war|ear) ]]; then
+    c+=( ${${${(M)$(_call_program jar_classes jar -tf $i)##*.class}%%.class}:gs#/#.#} )
+  elif [ -d $i ]; then
+    c+=( $i/**/*.class(.:r:s/.class//:s#$i/##:gs#/#.#) )
+  fi
+done
+
+_wanted classes expl 'java class' compadd "$@" -M 'r:|.=* r:|=*' -a - c
+