# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# Almost all code borrowed from Zshell's _make function
#
# Copyright (c) 2018 Sebastian Gniazdowski

local -a TARGETS

.make-expandVars() {
    local open close var val front='' rest=$1

    while [[ $rest == (#b)[^$]#($)* ]]; do
        front=$front${rest[1,$mbegin[1]-1]}
        rest=${rest[$mbegin[1],-1]}

        case $rest[2] in
            ($)           # '$$'. may not appear in target and variable's value
                front=$front\$\$
                rest=${rest[3,-1]}
                continue
                ;;
                (\()          # Variable of the form $(foobar)
                open='('
                close=')'
                ;;
            ({)           # ${foobar}
                open='{'
                close='}'
                ;;
            ([[:alpha:]]) # $foobar. This is exactly $(f)oobar.
                open=''
                close=''
                var=$rest[2]
                ;;
            (*)           # bad parameter name
                print -- $front$rest
                return 1
                ;;
        esac

        if [[ -n $open ]]; then
            if [[ $rest == \$$open(#b)([[:alnum:]_]##)(#B)$close* ]]; then
                var=$match
            else  # unmatched () or {}, or bad parameter name
                print -- $front$rest
                return 1
            fi
        fi

        val=''
        if [[ -n ${VAR_ARGS[(i)$var]} ]]; then
            val=${VAR_ARGS[$var]}
        else
            if [[ -n $opt_args[(I)(-e|--environment-overrides)] ]]; then
                if [[ $parameters[$var] == scalar-export* ]]; then
                    val=${(P)var}
                elif [[ -n ${VARIABLES[(i)$var]} ]]; then
                    val=${VARIABLES[$var]}
                fi
            else
                if [[ -n ${VARIABLES[(i)$var]} ]]; then
                    val=${VARIABLES[$var]}
                elif [[ $parameters[$var] == scalar-export* ]]; then
                    val=${(P)var}
                fi
            fi
        fi
        rest=${rest//\$$open$var$close/$val}
    done

    print -- ${front}${rest}
}


.make-parseMakefile () {
    local input var val target dep TAB=$'\t' tmp IFS=

    while read input
    do
        case "$input " in
            # TARGET: dependencies
            # TARGET1 TARGET2 TARGET3: dependencies
            ([[*?[:alnum:]$][^$TAB:=%]#:[^=]*)
            target=$(.make-expandVars ${input%%:*})
            TARGETS+=( ${(z)target} )
            ;;
        esac
    done
}

if [[ -z "${FAST_HIGHLIGHT[chroma-make-cache]}" || $(( EPOCHSECONDS - FAST_HIGHLIGHT[chroma-make-cache-born-at] )) -gt 7 ]]; then
    .make-parseMakefile
    FAST_HIGHLIGHT[chroma-make-cache-born-at]="$EPOCHSECONDS"
    FAST_HIGHLIGHT[chroma-make-cache]="${(j:;:)TARGETS}"
fi

reply2=( "${(s:;:)FAST_HIGHLIGHT[chroma-make-cache]}" )

# vim:ft=zsh:et