From fd031105aa864f832ee0f7874187ce3881455af3 Mon Sep 17 00:00:00 2001 From: Tan Li Hau Date: Wed, 14 Jul 2021 16:01:05 +0800 Subject: [PATCH] [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 --- src/compiler/compile/Component.ts | 7 ++++++- src/compiler/compile/compiler_warnings.ts | 4 ++-- .../samples/reactive-module-variable-2/input.svelte | 7 +++++++ .../samples/reactive-module-variable-2/warnings.json | 1 + .../samples/reactive-module-variable/warnings.json | 10 +++++----- 5 files changed, 21 insertions(+), 8 deletions(-) create mode 100644 test/validator/samples/reactive-module-variable-2/input.svelte create mode 100644 test/validator/samples/reactive-module-variable-2/warnings.json diff --git a/src/compiler/compile/Component.ts b/src/compiler/compile/Component.ts index f3a012341d..4ca111f7ea 100644 --- a/src/compiler/compile/Component.ts +++ b/src/compiler/compile/Component.ts @@ -1192,6 +1192,7 @@ export default class Component { const assignees = new Set(); const assignee_nodes = new Set(); const dependencies = new Set(); + const module_dependencies = new Set(); let scope = this.instance_scope; const map = this.instance_scope_map; @@ -1228,7 +1229,7 @@ export default class Component { variable.is_reactive_dependency = true; if (variable.module) { should_add_as_dependency = false; - component.warn(node as any, compiler_warnings.module_script_variable_reactive_declaration(name)); + module_dependencies.add(name); } } const is_writable_or_mutated = @@ -1253,6 +1254,10 @@ export default class Component { } }); + if (module_dependencies.size > 0 && dependencies.size === 0) { + component.warn(node.body as any, compiler_warnings.module_script_variable_reactive_declaration(Array.from(module_dependencies))); + } + const { expression } = node.body as ExpressionStatement; const declaration = expression && (expression as AssignmentExpression).left; diff --git a/src/compiler/compile/compiler_warnings.ts b/src/compiler/compile/compiler_warnings.ts index 3b8ba929fa..bfcd779fc7 100644 --- a/src/compiler/compile/compiler_warnings.ts +++ b/src/compiler/compile/compiler_warnings.ts @@ -20,9 +20,9 @@ export default { code: 'non-top-level-reactive-declaration', message: '$: has no effect outside of the top-level' }, - module_script_variable_reactive_declaration: (name: string) => ({ + module_script_variable_reactive_declaration: (names: string[]) => ({ code: 'module-script-reactive-declaration', - message: `"${name}" is declared in a module script and will not be reactive` + message: `${names.map(name => `"${name}"`).join(', ')} ${names.length > 1 ? 'are' : 'is'} declared in a module script and will not be reactive` }), missing_declaration: (name: string, has_script: boolean) => ({ code: 'missing-declaration', diff --git a/test/validator/samples/reactive-module-variable-2/input.svelte b/test/validator/samples/reactive-module-variable-2/input.svelte new file mode 100644 index 0000000000..d36d9cf210 --- /dev/null +++ b/test/validator/samples/reactive-module-variable-2/input.svelte @@ -0,0 +1,7 @@ + + diff --git a/test/validator/samples/reactive-module-variable-2/warnings.json b/test/validator/samples/reactive-module-variable-2/warnings.json new file mode 100644 index 0000000000..fe51488c70 --- /dev/null +++ b/test/validator/samples/reactive-module-variable-2/warnings.json @@ -0,0 +1 @@ +[] diff --git a/test/validator/samples/reactive-module-variable/warnings.json b/test/validator/samples/reactive-module-variable/warnings.json index c3c52cb479..d08fc1309f 100644 --- a/test/validator/samples/reactive-module-variable/warnings.json +++ b/test/validator/samples/reactive-module-variable/warnings.json @@ -2,15 +2,15 @@ { "code": "module-script-reactive-declaration", "message": "\"foo\" is declared in a module script and will not be reactive", - "pos": 65, + "pos": 59, "start": { - "character": 65, - "column": 10, + "character": 59, + "column": 4, "line": 5 }, "end": { - "character": 68, - "column": 13, + "character": 69, + "column": 14, "line": 5 } }