Skip to content

Commit fd03110

Browse files
authored
[fix] do not warn if module variables are not the only dependencies in reactive statements (#6510)
The warning was too strict, since there are valid use cases for having non-reactive variables inside reactive statements Fixes #5954
1 parent a8c35da commit fd03110

File tree

5 files changed

+21
-8
lines changed

5 files changed

+21
-8
lines changed

src/compiler/compile/Component.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1192,6 +1192,7 @@ export default class Component {
11921192
const assignees = new Set<string>();
11931193
const assignee_nodes = new Set();
11941194
const dependencies = new Set<string>();
1195+
const module_dependencies = new Set<string>();
11951196

11961197
let scope = this.instance_scope;
11971198
const map = this.instance_scope_map;
@@ -1228,7 +1229,7 @@ export default class Component {
12281229
variable.is_reactive_dependency = true;
12291230
if (variable.module) {
12301231
should_add_as_dependency = false;
1231-
component.warn(node as any, compiler_warnings.module_script_variable_reactive_declaration(name));
1232+
module_dependencies.add(name);
12321233
}
12331234
}
12341235
const is_writable_or_mutated =
@@ -1253,6 +1254,10 @@ export default class Component {
12531254
}
12541255
});
12551256

1257+
if (module_dependencies.size > 0 && dependencies.size === 0) {
1258+
component.warn(node.body as any, compiler_warnings.module_script_variable_reactive_declaration(Array.from(module_dependencies)));
1259+
}
1260+
12561261
const { expression } = node.body as ExpressionStatement;
12571262
const declaration = expression && (expression as AssignmentExpression).left;
12581263

src/compiler/compile/compiler_warnings.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ export default {
2020
code: 'non-top-level-reactive-declaration',
2121
message: '$: has no effect outside of the top-level'
2222
},
23-
module_script_variable_reactive_declaration: (name: string) => ({
23+
module_script_variable_reactive_declaration: (names: string[]) => ({
2424
code: 'module-script-reactive-declaration',
25-
message: `"${name}" is declared in a module script and will not be reactive`
25+
message: `${names.map(name => `"${name}"`).join(', ')} ${names.length > 1 ? 'are' : 'is'} declared in a module script and will not be reactive`
2626
}),
2727
missing_declaration: (name: string, has_script: boolean) => ({
2828
code: 'missing-declaration',
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<script context="module">
2+
let PI = 3.14;
3+
</script>
4+
<script>
5+
let r;
6+
$: area = PI * r * r;
7+
</script>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[]

test/validator/samples/reactive-module-variable/warnings.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22
{
33
"code": "module-script-reactive-declaration",
44
"message": "\"foo\" is declared in a module script and will not be reactive",
5-
"pos": 65,
5+
"pos": 59,
66
"start": {
7-
"character": 65,
8-
"column": 10,
7+
"character": 59,
8+
"column": 4,
99
"line": 5
1010
},
1111
"end": {
12-
"character": 68,
13-
"column": 13,
12+
"character": 69,
13+
"column": 14,
1414
"line": 5
1515
}
1616
}

0 commit comments

Comments
 (0)