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

# Apache Ant version 1.7.1

local curcontext="$curcontext" state line expl ret=1
typeset -A opt_args
local buildfile classpath cp userjars importedfiles target='*:target:->target' targets tmp

find_targets() {
    importedfiles=( $(sed -n "s/ *<import[^>]* file=[\"']\([^\"']*\)[\"'].*/\1/p" < $1) )
    # Tweaked to omit targets beginning with "-" that can't
    # be invoked from the command line; see zsh-workers/24129.
    sed -n "s/ *<target[^>]* name=[\"']\([^-][^\"']*\)[\"'].*/\1/p" $1
    if (( $#importedfiles )) ; then
        ( cd $1:h
            for file in $importedfiles ; do
                expanded=( $(echo $file | sed -n "s|\${ant.home}|$ANT_HOME|p") )
                if [[ ! "bla$expanded" = "bla" ]]; then
                    file=$expanded
                fi
                if [[ -f $file ]]; then
                    find_targets $file
                fi
        done )
    fi
}

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

_arguments -C \
  '(- *)'{-h,-help,--h,--help}'[display help information]' \
  '--noconfig[suppress sourcing of configuration files]' \
  '--usejikes[enable use of jikes by default, unless set explicitly in configuration files]' \
  '--execdebug[print ant exec line generated by this launch script]' \
  '(-p -projecthelp *)'{-p,-projecthelp}'[print project help information]' \
  '(- *)-version[display version information]' \
  '(- *)-diagnostics[print information helpful to diagnosis or report problems]' \
  '(-q -quiet)'{-q,-quiet}'[be extra quiet]' \
  '(-s -silent)'{-s,-silent}'[print nothing but task outputs and build failures]' \
  '(-v -verbose)'{-v,-verbose}'[be extra verbose]' \
  '(-d -debug)'{-d,-debug}'[print debugging information]' \
  '(-e -emacs)'{-e,-emacs}'[produce logging information without adornments]' \
  '*-lib[specify a path to search for jars and classes]:class path:->classpath' \
  '(-l -logfile)'{-l,-logfile}'[use specified file for log]:logfile:_files' \
  '-logger[specify the class which is to perform logging]:class:->class' \
  '*-listener[add an instance of specified class as a project listener]:class:->class' \
  '-noinput[do not allow interactive input]' \
  '(-f -file -buildfile -s -find)'{-f,-file,-buildfile}'[use specified build file]:build file:_files -g "*.xml(-.)"' \
  '*-D+[specify property with value to use]:property:->property' \
  '(-k -keep-going)'{-keep-going,-k}'[execute all targets that do not depend on failed target(s)]' \
  '-propertyfile[load all properties from specified file with -D properties taking precedence]:property file:_files -g "*.properties(-.)"' \
  '-inputhandler[specify class which will handle input requests]:class:->class' \
  '(-s -find -f -file -buildfile)'{-s,-find}'[search for specified build file towards the root of filesystem]:build file:(build.xml)' \
  '-nice[specify a niceness value for the main thread]:niceness value (default 5):({1..10})' \
  '-nouserlib[run ant without using the jar files from ${user.home}/.ant/lib]' \
  '-noclasspath[run ant without using CLASSPATH]' \
  '-autoproxy[Java1.5+: use the OS proxy settings]' \
  "-main[override Ant's normal entry point]:class:->class" \
  $target && ret=0

case $state in
  class)
    if (( ! $+opt_args[-nouserlib] )); then
      userjars=( $HOME/.ant/lib/*.jar )
    fi
    if (( ! $+opt_args[-noclasspath] )); then
      classpath=$CLASSPATH
    fi
    cp=( $opt_args[-lib] $userjars $ANT_HOME/lib/*.jar $classpath )
    cp=${(j.:.)cp:-' '}
    _java_class -classpath $cp && ret=0
  ;;
  classpath)
    compset -P '*:'
    compset -S ':*'
    _alternative \
      "classpath:$state:_path_files -qS: -g '*.(jar|zip)(-.)'" \
      "classpath:$state:_path_files -r': ' -/" && ret=0
  ;;
  property)
    if compset -P 1 '*='; then
      _default && ret=0
    else
      _message -e properties 'property name'
    fi
  ;;
  target)
    if [[ -n $opt_args[(I)(-s|-find)] ]]; then
      buildfile=( (../)#${(v)opt_args[(I)(-s|-find)]:-build.xml}(N[-1]) )
    else
      buildfile=${(v)opt_args[(I)(-f|-file|-buildfile)]:-build.xml}
    fi
    if [[ -f $buildfile ]]; then
      if zstyle -t ":completion:${curcontext}:targets" call-command; then
        # Run ant -projecthelp also passing any of -find, -s, -buildfile, -file
        # 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]" -buildfile $buildfile -projecthelp |
          while read target desc
          do
            # This loop reads ant -projecthelp output from versions 1.3 to 1.6
            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
        targets=( $(find_targets $buildfile) )
        _wanted targets expl target compadd -a targets && ret=0
      fi
    else
      _message -e targets target
    fi
  ;;
esac

return ret
