|
|
@@ -2,6 +2,7 @@ import MagicString from 'magic-string'
|
|
|
import { parseExpression, ParserOptions, ParserPlugin } from '@babel/parser'
|
|
|
import { makeMap } from 'shared/util'
|
|
|
import { walkIdentifiers } from './babelUtils'
|
|
|
+import { BindingMetadata } from './types'
|
|
|
|
|
|
const doNotPrefix = makeMap(
|
|
|
'Infinity,undefined,NaN,isFinite,isNaN,' +
|
|
|
@@ -16,12 +17,13 @@ const doNotPrefix = makeMap(
|
|
|
* The input is expected to be the render function code directly returned from
|
|
|
* `compile()` calls, e.g. `with(this){return ...}`
|
|
|
*/
|
|
|
-export function stripWith(
|
|
|
+export function prefixIdentifiers(
|
|
|
source: string,
|
|
|
fnName = '',
|
|
|
isFunctional = false,
|
|
|
isTS = false,
|
|
|
- babelOptions: ParserOptions = {}
|
|
|
+ babelOptions: ParserOptions = {},
|
|
|
+ bindings?: BindingMetadata
|
|
|
) {
|
|
|
source = `function ${fnName}(${isFunctional ? `_c,_vm` : ``}){${source}\n}`
|
|
|
|
|
|
@@ -40,17 +42,29 @@ export function stripWith(
|
|
|
walkIdentifiers(
|
|
|
ast,
|
|
|
ident => {
|
|
|
- if (doNotPrefix(ident.name)) {
|
|
|
+ const { name } = ident
|
|
|
+ if (doNotPrefix(name)) {
|
|
|
return
|
|
|
}
|
|
|
- s.prependRight(ident.start!, '_vm.')
|
|
|
+
|
|
|
+ if (!bindings) {
|
|
|
+ s.prependRight(ident.start!, '_vm.')
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ s.overwrite(ident.start!, ident.end!, rewriteIdentifier(name, bindings))
|
|
|
},
|
|
|
node => {
|
|
|
if (node.type === 'WithStatement') {
|
|
|
s.remove(node.start!, node.body.start! + 1)
|
|
|
s.remove(node.end! - 1, node.end!)
|
|
|
if (!isFunctional) {
|
|
|
- s.prependRight(node.start!, `var _vm=this;var _c=_vm._self._c;`)
|
|
|
+ s.prependRight(
|
|
|
+ node.start!,
|
|
|
+ `var _vm=this,_c=_vm._self._c${
|
|
|
+ bindings ? `,_setup=_vm._setupProxy;` : `;`
|
|
|
+ }`
|
|
|
+ )
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -58,3 +72,15 @@ export function stripWith(
|
|
|
|
|
|
return s.toString()
|
|
|
}
|
|
|
+
|
|
|
+export function rewriteIdentifier(
|
|
|
+ name: string,
|
|
|
+ bindings: BindingMetadata
|
|
|
+): string {
|
|
|
+ const type = bindings[name]
|
|
|
+ if (type && type.startsWith('setup')) {
|
|
|
+ return `_setup.${name}`
|
|
|
+ } else {
|
|
|
+ return `_vm.${name}`
|
|
|
+ }
|
|
|
+}
|