/* @flow */ import { addIfCondition } from 'compiler/parser/index' import { getAndRemoveAttr, addRawAttr } from 'compiler/helpers' function hasConditionDirective (el: ASTElement): boolean { for (const attr in el.attrsMap) { if (/^v\-if|v\-else|v\-else\-if$/.test(attr)) { return true } } return false } function getPreviousConditions (el: ASTElement): Array { const conditions = [] if (el.parent && el.parent.children) { for (let c = 0, n = el.parent.children.length; c < n; ++c) { // $flow-disable-line const ifConditions = el.parent.children[c].ifConditions if (ifConditions) { for (let i = 0, l = ifConditions.length; i < l; ++i) { const condition = ifConditions[i] if (condition && condition.exp) { conditions.push(condition.exp) } } } } } return conditions } export function preTransformVIf (el: ASTElement, options: WeexCompilerOptions) { if (hasConditionDirective(el)) { let exp const ifExp = getAndRemoveAttr(el, 'v-if', true /* remove from attrsMap */) const elseifExp = getAndRemoveAttr(el, 'v-else-if', true) // don't need the value, but remove it to avoid being generated as a // custom directive getAndRemoveAttr(el, 'v-else', true) if (ifExp) { exp = ifExp addIfCondition(el, { exp: ifExp, block: el }) } else { elseifExp && addIfCondition(el, { exp: elseifExp, block: el }) const prevConditions = getPreviousConditions(el) if (prevConditions.length) { const prevMatch = prevConditions.join(' || ') exp = elseifExp ? `!(${prevMatch}) && (${elseifExp})` // v-else-if : `!(${prevMatch})` // v-else } else if (process.env.NODE_ENV !== 'production' && options.warn) { options.warn( `v-${elseifExp ? ('else-if="' + elseifExp + '"') : 'else'} ` + `used on element <${el.tag}> without corresponding v-if.` ) return } } addRawAttr(el, '[[match]]', exp) } }