diff --git a/.changeset/sharp-rings-rhyme.md b/.changeset/sharp-rings-rhyme.md new file mode 100644 index 000000000000..75e285de3b6d --- /dev/null +++ b/.changeset/sharp-rings-rhyme.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +generate error when $props.id() is after an await diff --git a/documentation/docs/98-reference/.generated/compile-errors.md b/documentation/docs/98-reference/.generated/compile-errors.md index 8a8a10c80b61..ad0087c04e65 100644 --- a/documentation/docs/98-reference/.generated/compile-errors.md +++ b/documentation/docs/98-reference/.generated/compile-errors.md @@ -696,7 +696,7 @@ Cannot use `%rune%()` more than once ### props_id_invalid_placement ``` -`$props.id()` can only be used at the top level of components as a variable declaration initializer +`$props.id()` can only be used at the top level of components as a variable declaration initializer, and before any `await` expression. ``` ### props_illegal_name diff --git a/packages/svelte/messages/compile-errors/script.md b/packages/svelte/messages/compile-errors/script.md index 5c1080acedfe..d4297ad5f913 100644 --- a/packages/svelte/messages/compile-errors/script.md +++ b/packages/svelte/messages/compile-errors/script.md @@ -136,7 +136,7 @@ This turned out to be buggy and unpredictable, particularly when working with de ## props_id_invalid_placement -> `$props.id()` can only be used at the top level of components as a variable declaration initializer +> `$props.id()` can only be used at the top level of components as a variable declaration initializer, and before any `await` expression. ## props_illegal_name diff --git a/packages/svelte/src/compiler/errors.js b/packages/svelte/src/compiler/errors.js index d6c2efdfdc0d..fde11a3a5fe3 100644 --- a/packages/svelte/src/compiler/errors.js +++ b/packages/svelte/src/compiler/errors.js @@ -319,12 +319,12 @@ export function props_duplicate(node, rune) { } /** - * `$props.id()` can only be used at the top level of components as a variable declaration initializer + * `$props.id()` can only be used at the top level of components as a variable declaration initializer, and before any `await` expression. * @param {null | number | NodeLike} node * @returns {never} */ export function props_id_invalid_placement(node) { - e(node, 'props_id_invalid_placement', `\`$props.id()\` can only be used at the top level of components as a variable declaration initializer\nhttps://svelte.dev/e/props_id_invalid_placement`); + e(node, 'props_id_invalid_placement', `\`$props.id()\` can only be used at the top level of components as a variable declaration initializer, and before any \`await\` expression.\nhttps://svelte.dev/e/props_id_invalid_placement`); } /** diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/CallExpression.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/CallExpression.js index 52eba8c73554..79bf905430dc 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/CallExpression.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/CallExpression.js @@ -103,6 +103,11 @@ export function CallExpression(node, context) { e.props_id_invalid_placement(node); } + // $props.id() should not be on the async part of the body : + if (context.state.analysis.instance_body.async.find((a) => a.node === parent)) { + e.props_id_invalid_placement(node); + } + if (node.arguments.length > 0) { e.rune_invalid_arguments(node, rune); } diff --git a/packages/svelte/tests/compiler-errors/samples/runes-props-id-invalid-placement/_config.js b/packages/svelte/tests/compiler-errors/samples/runes-props-id-invalid-placement/_config.js new file mode 100644 index 000000000000..47b9ed68c977 --- /dev/null +++ b/packages/svelte/tests/compiler-errors/samples/runes-props-id-invalid-placement/_config.js @@ -0,0 +1,10 @@ +import { test } from '../../test'; + +export default test({ + error: { + code: 'props_id_invalid_placement', + message: + '`$props.id()` can only be used at the top level of components as a variable declaration initializer, and before any `await` expression.' + }, + async: true +}); diff --git a/packages/svelte/tests/compiler-errors/samples/runes-props-id-invalid-placement/main.svelte b/packages/svelte/tests/compiler-errors/samples/runes-props-id-invalid-placement/main.svelte new file mode 100644 index 000000000000..dcd461fc658f --- /dev/null +++ b/packages/svelte/tests/compiler-errors/samples/runes-props-id-invalid-placement/main.svelte @@ -0,0 +1,9 @@ +