_tl() {
    local IFS=$' \t\n'
    local args cur prev cmd opts arg
    args=("${COMP_WORDS[@]}")
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts="-h --help --global-env-def -I --include-dir --wdisable --werror --feat-arity --gen-compat --gen-target --skip-compat53 --version -q --quiet -p --pretend"

    case "$prev" in
        --global-env-def)
            COMPREPLY=($(compgen -f -- "$cur"))
            return 0
            ;;
        -I|--include-dir)
            COMPREPLY=($(compgen -f -- "$cur"))
            return 0
            ;;
        --wdisable)
            COMPREPLY=($(compgen -W "branch debug hint redeclaration unknown unread unused" -- "$cur"))
            return 0
            ;;
        --werror)
            COMPREPLY=($(compgen -W "all branch debug hint redeclaration unknown unread unused" -- "$cur"))
            return 0
            ;;
        --feat-arity)
            COMPREPLY=($(compgen -W "off on" -- "$cur"))
            return 0
            ;;
        --gen-compat)
            COMPREPLY=($(compgen -W "off optional required" -- "$cur"))
            return 0
            ;;
        --gen-target)
            COMPREPLY=($(compgen -W "5.1 5.3 5.4" -- "$cur"))
            return 0
            ;;
    esac

    args=("${args[@]:1}")
    for arg in "${args[@]}"; do
        case "$arg" in
            completion)
                cmd="completion"
                opts="$opts -h --help"
                break
                ;;
            check)
                cmd="check"
                opts="$opts -h --help"
                break
                ;;
            gen)
                cmd="gen"
                opts="$opts -h --help -c --check --keep-hashbang -o --output"
                break
                ;;
            run)
                cmd="run"
                opts="$opts -h --help -l --require"
                break
                ;;
            warnings)
                cmd="warnings"
                opts="$opts -h --help"
                break
                ;;
            types)
                cmd="types"
                opts="$opts -h --help -p --position"
                break
                ;;
        esac
    done

    case "$cmd" in
        '')
            COMPREPLY=($(compgen -W "completion check gen run warnings types" -- "$cur"))
            ;;
        'gen')
            case "$prev" in
                -o|--output)
                    COMPREPLY=($(compgen -f -- "$cur"))
                    return 0
                    ;;
            esac

            ;;
        'run')
            case "$prev" in
                -l|--require)
                    COMPREPLY=($(compgen -f -- "$cur"))
                    return 0
                    ;;
            esac

            ;;
        'types')
            case "$prev" in
                -p|--position)
                    COMPREPLY=($(compgen -f -- "$cur"))
                    return 0
                    ;;
            esac

            ;;
    esac

    if [[ "$cur" = -* ]]; then
        COMPREPLY=($(compgen -W "$opts" -- "$cur"))
    fi
}

complete -F _tl -o bashdefault -o default tl
