return false
}
+export function isInNewExpression(parentStack: Node[]): boolean {
+ let i = parentStack.length
+ while (i--) {
+ const p = parentStack[i]
+ if (p.type === 'NewExpression') {
+ return true
+ } else if (p.type !== 'MemberExpression') {
+ break
+ }
+ }
+ return false
+}
+
export function walkFunctionParams(
node: Function,
onIdent: (id: Identifier) => void,
} from '../ast'
import {
isInDestructureAssignment,
+ isInNewExpression,
isStaticProperty,
isStaticPropertyKey,
walkIdentifiers,
// ({ x } = y)
const isDestructureAssignment =
parent && isInDestructureAssignment(parent, parentStack)
+ const isNewExpression = parent && isInNewExpression(parentStack)
+ const wrapWithUnref = (raw: string) => {
+ const wrapped = `${context.helperString(UNREF)}(${raw})`
+ return isNewExpression ? `(${wrapped})` : wrapped
+ }
if (
isConst(type) ||
// that assumes the value to be a ref for more efficiency
return isAssignmentLVal || isUpdateArg || isDestructureAssignment
? `${raw}.value`
- : `${context.helperString(UNREF)}(${raw})`
+ : wrapWithUnref(raw)
} else if (type === BindingTypes.SETUP_LET) {
if (isAssignmentLVal) {
// let binding.
// for now
return raw
} else {
- return `${context.helperString(UNREF)}(${raw})`
+ return wrapWithUnref(raw)
}
} else if (type === BindingTypes.PROPS) {
// use __props which is generated by compileScript so in ts mode
}"
`;
+exports[`SFC compile <script setup> > inlineTemplate mode > unref + new expression 1`] = `
+"import { unref as _unref, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock } from "vue"
+
+import Foo from './foo'
+
+export default {
+ setup(__props) {
+
+
+return (_ctx, _cache) => {
+ return (_openBlock(), _createElementBlock(_Fragment, null, [
+ _createElementVNode("div", null, _toDisplayString(new (_unref(Foo))()), 1 /* TEXT */),
+ _createElementVNode("div", null, _toDisplayString(new (_unref(Foo)).Bar()), 1 /* TEXT */)
+ ], 64 /* STABLE_FRAGMENT */))
+}
+}
+
+}"
+`;
+
exports[`SFC compile <script setup> > inlineTemplate mode > v-model codegen 1`] = `
"import { vModelText as _vModelText, createElementVNode as _createElementVNode, withDirectives as _withDirectives, unref as _unref, isRef as _isRef, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock } from "vue"
),
).not.toThrowError()
})
+
+ test('unref + new expression', () => {
+ const { content } = compile(
+ `
+ <script setup>
+ import Foo from './foo'
+ </script>
+ <template>
+ <div>{{ new Foo() }}</div>
+ <div>{{ new Foo.Bar() }}</div>
+ </template>
+ `,
+ { inlineTemplate: true },
+ )
+ expect(content).toMatch(`new (_unref(Foo))()`)
+ expect(content).toMatch(`new (_unref(Foo)).Bar()`)
+ assertCode(content)
+ })
})
describe('with TypeScript', () => {