Skip to content

Commit

Permalink
fix(compiler-sfc): properly remove comma of multiple macros in the sa…
Browse files Browse the repository at this point in the history
…me declaration (vuejs#7423)

closes vuejs#7422
reverts vuejs#6778
  • Loading branch information
sxzz authored and IAmSSH committed Apr 29, 2023
1 parent ed2a625 commit 4ea2d9f
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 5 deletions.
Expand Up @@ -754,6 +754,24 @@ return { a, props, emit }
}"
`;

exports[`SFC compile <script setup> > defineProps/defineEmits in multi-variable declaration fix #7422 1`] = `
"export default {
props: ['item'],
emits: ['foo'],
setup(__props, { expose, emit: emits }) {
expose();

const props = __props;

const a = 0,
b = 0;

return { props, emits, a, b }
}

}"
`;

exports[`SFC compile <script setup> > dev mode import usage check > TS annotations 1`] = `
"import { defineComponent as _defineComponent } from 'vue'
import { Foo, Bar, Baz, Qux, Fred } from './x'
Expand Down
17 changes: 17 additions & 0 deletions packages/compiler-sfc/__tests__/compileScript.spec.ts
Expand Up @@ -171,6 +171,23 @@ const myEmit = defineEmits(['foo', 'bar'])
expect(content).toMatch(`emits: ['a'],`)
})

// #7422
test('defineProps/defineEmits in multi-variable declaration fix #7422', () => {
const { content } = compile(`
<script setup>
const props = defineProps(['item']),
emits = defineEmits(['foo']),
a = 0,
b = 0;
</script>
`)
assertCode(content)
expect(content).toMatch(`props: ['item'],`)
expect(content).toMatch(`emits: ['foo'],`)
expect(content).toMatch(`const a = 0,`)
expect(content).toMatch(`b = 0;`)
})

test('defineProps/defineEmits in multi-variable declaration (full removal)', () => {
const { content } = compile(`
<script setup>
Expand Down
16 changes: 11 additions & 5 deletions packages/compiler-sfc/src/compileScript.ts
Expand Up @@ -1258,6 +1258,8 @@ export function compileScript(
if (node.type === 'VariableDeclaration' && !node.declare) {
const total = node.declarations.length
let left = total
let lastNonRemoved: number | undefined

for (let i = 0; i < total; i++) {
const decl = node.declarations[i]
const init = decl.init && unwrapTSNode(decl.init)
Expand All @@ -1280,16 +1282,20 @@ export function compileScript(
} else {
let start = decl.start! + startOffset
let end = decl.end! + startOffset
if (i === 0) {
// first one, locate the start of the next
end = node.declarations[i + 1].start! + startOffset
if (i === total - 1) {
// last one, locate the end of the last one that is not removed
// if we arrive at this branch, there must have been a
// non-removed decl before us, so lastNonRemoved is non-null.
start = node.declarations[lastNonRemoved!].end! + startOffset
} else {
// not first one, locate the end of the prev
start = node.declarations[i - 1].end! + startOffset
// not the last one, locate the start of the next
end = node.declarations[i + 1].start! + startOffset
}
s.remove(start, end)
left--
}
} else {
lastNonRemoved = i
}
}
}
Expand Down

0 comments on commit 4ea2d9f

Please sign in to comment.