# bash completion for cppcheck(1)                          -*- shell-script -*-

_cppcheck()
{
    local cur prev words cword split
    _init_completion -s || return

    case $prev in
        --append | --exitcode-suppressions | --rule-file | --config-excludes-file | \
            --suppressions-list | --includes-file | --include | -i)
            _filedir
            return
            ;;
        -D | -U | --rule | --suppress | --template | --max-configs | -h | --help | --version | \
            --errorlist | --config-exclude | -l)
            return
            ;;
        --enable)
            # split comma-separated list
            split=false
            if [[ $cur == ?*,* ]]; then
                prev="${cur%,*}"
                cur="${cur##*,}"
                split=true
            fi
            COMPREPLY=($(compgen -W 'all warning style performance
                portability information unusedFunction missingInclude' \
                -- "$cur"))
            $split && COMPREPLY=(${COMPREPLY[@]/#/"$prev,"})
            return
            ;;
        --error-exitcode)
            COMPREPLY=($(compgen -W '{0..255}' -- "$cur"))
            return
            ;;
        --file-list)
            _filedir
            [[ -z $cur || $cur == - ]] && COMPREPLY+=(-)
            return
            ;;
        -I)
            _filedir -d
            return
            ;;
        -j)
            COMPREPLY=($(compgen -W "{2..$(_ncpus)}" -- "$cur"))
            return
            ;;
        --language | -x)
            COMPREPLY=($(compgen -W 'c c++' -- "$cur"))
            return
            ;;
        --std)
            COMPREPLY=($(compgen -W 'c89 c99 c11 c++03 c++11 c++14 c++17
                c++20' -- "$cur"))
            return
            ;;
        --platform)
            _filedir
            COMPREPLY+=($(compgen -W 'unix32 unix64 win32A win32W win64
                native' -- "$cur"))
            return
            ;;
        -rp | --relative-paths)
            if $split; then # -rp without argument is allowed
                _filedir -d
                return
            fi
            ;;
        --library)
            _filedir cfg
            return
            ;;
        --xml-version)
            COMPREPLY=($(compgen -W '1 2' -- "$cur"))
            return
            ;;
    esac

    $split && return

    if [[ $cur == -* ]]; then
        COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur"))
        [[ ${COMPREPLY-} == *= ]] && compopt -o nospace
    else
        _filedir '@([cht]pp|[cht]xx|cc|[ch]++|[ch])'
    fi
} &&
    complete -F _cppcheck cppcheck

# ex: filetype=sh
