#compdef ant -value-,ANT_ARGS,-default-

typeset -A opt_args
local buildfile tmp state line curcontext="$curcontext" ret=1
local c target='*:target:->target'

c=( $ANT_HOME/lib/*.jar )

if [[ $service = *ANT_ARGS* ]]; then
  compset -q
  words=( fake "$words[@]" )
  (( CURRENT++ ))
  unset target
fi

_arguments -C \
  '-help[display usage information]' \
  '-projecthelp[print project help information]' \
  '-version[display version information]' \
  '-diagnostics[display info useful to problem diagnosis]' \
  '(-q -quiet)'{-q,-quiet}'[be extra quiet]' \
  '(-v -verbose)'{-v,-verbose}'[be more verbose]' \
  '-debug[print debugging information]' \
  '-emacs[produce logging information without adornments]' \
  '(-l -logfile)'{-l,-logfile}'[use specified file for log]:logfile:_files' \
  '-logger[the class which is to perform logging]:classname:_java_class -cp ${(j.:.)c}' \
  '*-listener[add an instance of class as a project listener]:classname:_java_class -cp ${(j.:.)c}' \
  '(-f -file -buildfile -find)'{-f,-file,-buildfile}'[use specified build file]:build file:_files' \
  '*-D[specify property with value to use]:property:->property' \
  '-propertyfile[load properties from specified file]:property file:_files' \
  '-inputhandler[specify class which will handle input requests]:class:_java_class -cp ${(j.\:.)c}' \
  '(-f -file -buildfile)-find[search for build file towards the root of filesystem]:build file:(build.xml)' \
  $target && ret=0

case $state in
  property)
    if compset -P '*='; then
      _default
    else
      _message -e properties 'property name'
    fi
  ;;
  target)
    if zstyle -t ":completion:${curcontext}:targets" call-command; then
      # Run ant -projecthelp also passing any of -find, -buildfile or -f options.
      # Parse output into an array of the format "target:description".
      # For the array to be set with correct argument boundaries, the entire
      # set statement needs to be eval'd.  On Cygwin, need to kill \r's output
      # from Java or parsing will fail.
      eval set -A tmp "${$(_call_program targets "$words[1]" $buildxml -projecthelp |
	while read target desc
	do
          # This loop reads ant -projecthelp output from versions 1.3 to 1.5
          ln="${target}${desc:+:$desc}"
          [[ $target = "" ]] && continue  # skip blank lines
          case $ln in
              (Buildfile:*)
                  buildfile=$desc
              ;;
              (Default:target:*)
                  # with version 1.5, target is on the same line
                  default_target="${${desc/target:/}# }"
                  # versions 1.3 and 1.4 with default target on a separate line
                  if [[ -z $default_target ]]; then
                      read junk
                      read default_target junk
                  fi
                  # Output target again indicating its the default one.
                  print -n "'${default_target}:(Default target) ' "
              ;;
              (Searching:*|Main:targets:|Subtargets:|BUILD:SUCCESSFUL|Total:time:
	      *)
              ;;
              (*)
                  # Return target and description
                  print -n "'$ln' "
              ;;
          esac
	done
      )//$'\015'}"
      _describe 'target' tmp && ret=0
    else
      if [[ -n $opt_args[-find] ]]; then
	buildfile=( (../)#${opt_args[-find]:-build.xml}(N[-1]) )
      else
	buildfile=${(v)opt_args[(I)(-f|-file|-buildfile)]:-build.xml}
      fi
      if [[ -f $buildfile ]]; then
        targets=( $(sed -n "s/ *<target[^>]* name=[\"']\([^\"']*\)[\"'].*/\1/p" < $buildfile) )
	_wanted targets expl target compadd -a targets && ret=0
      else
	_message -e targets target
      fi
    fi
  ;;
esac

return ret
