const t = require('@babel/types')
|
|
const initStatement = t.expressionStatement(t.callExpression(t.identifier('$initSSP'), []))
|
const resolveStatement = t.expressionStatement(t.callExpression(t.identifier('$callSSP'), []))
|
|
module.exports = function getRenderSlot (path, state) {
|
const name = path.get('arguments.0')
|
const arg2 = path.get('arguments.2')
|
const arg3 = path.get('arguments.3')
|
let valueNode
|
if (arg3) {
|
// v-bind:object
|
valueNode = arg3.node
|
} else if (arg2 && !arg2.isNullLiteral()) {
|
if (arg2.isObjectExpression()) {
|
const propertiesPath = arg2.get('properties')
|
const oldProperties = []
|
const newProperties = []
|
propertiesPath.forEach(path => {
|
const properties = path.get('key').isStringLiteral({ value: 'SLOT_DEFAULT' }) ? oldProperties : newProperties
|
properties.push(state.options.scopedSlotsCompiler === 'auto' ? path.node : t.cloneNode(path.node, true))
|
})
|
if (!newProperties.length) {
|
return
|
}
|
valueNode = t.objectExpression(newProperties)
|
if (state.options.scopedSlotsCompiler !== 'auto') {
|
arg2.replaceWith(t.objectExpression(oldProperties))
|
}
|
} else {
|
valueNode = arg2.node
|
}
|
}
|
if (valueNode) {
|
if (!state.declarationArray.includes(initStatement)) {
|
state.declarationArray.push(initStatement)
|
}
|
const indexNode = t.callExpression(t.identifier('$setSSP'), [name.node, valueNode])
|
const slotMultipleInstance = state.options.scopedSlotsCompiler === 'augmented' && state.options.slotMultipleInstance
|
if (slotMultipleInstance) {
|
// 插槽名拼接 '.'+index
|
name.replaceWith(t.binaryExpression('+', name.node, t.binaryExpression('+', t.stringLiteral('.'), indexNode)))
|
} else {
|
const scoped = state.scoped
|
// TODO 判断是否包含作用域内变量
|
const renderSlotStatementArray = scoped && scoped.length ? scoped[scoped.length - 1].renderSlotStatementArray : state.renderSlotStatementArray
|
renderSlotStatementArray.push(t.expressionStatement(indexNode))
|
}
|
if (!state.resolveSlotStatementArray.includes(resolveStatement)) {
|
state.resolveSlotStatementArray.push(resolveStatement)
|
}
|
}
|
// TODO 组件嵌套
|
}
|