diff --git a/src/compiler/compile/nodes/Element.ts b/src/compiler/compile/nodes/Element.ts
index e8108858c5..059f88bef5 100644
--- a/src/compiler/compile/nodes/Element.ts
+++ b/src/compiler/compile/nodes/Element.ts
@@ -278,7 +278,7 @@ export default class Element extends Node {
}
validate_attributes() {
- const { component } = this;
+ const { component, parent } = this;
const attribute_map = new Map();
@@ -395,26 +395,20 @@ export default class Element extends Node {
component.slot_outlets.add(name);
}
- let ancestor = this.parent;
- do {
- if (ancestor.type === 'InlineComponent') break;
- if (ancestor.type === 'Element' && /-/.test(ancestor.name)) break;
-
- if (ancestor.type === 'IfBlock' || ancestor.type === 'EachBlock') {
- const type = ancestor.type === 'IfBlock' ? 'if' : 'each';
- const message = `Cannot place slotted elements inside an ${type}-block`;
+ if (parent.type === 'IfBlock' || parent.type === 'EachBlock') {
+ const type = parent.type === 'IfBlock' ? 'if' : 'each';
+ const message = `Cannot place slotted elements inside an ${type}-block`;
- component.error(attribute, {
- code: `invalid-slotted-content`,
- message
- });
- }
- } while (ancestor = ancestor.parent);
+ component.error(attribute, {
+ code: `invalid-slotted-content`,
+ message
+ });
+ }
- if (!ancestor) {
+ if (!(parent.type === 'InlineComponent' || (parent.type === 'Element' && /-/.test(parent.name)))) {
component.error(attribute, {
code: `invalid-slotted-content`,
- message: `Element with a slot='...' attribute must be a descendant of a component or custom element`
+ message: `Element with a slot='...' attribute must be a direct descendant of a component or custom element`,
});
}
}
@@ -425,7 +419,7 @@ export default class Element extends Node {
message: `The 'is' attribute is not supported cross-browser and should be avoided`
});
}
-
+
attribute_map.set(attribute.name, attribute);
});
diff --git a/test/runtime/samples/component-slot-nested-error-2/Nested.svelte b/test/runtime/samples/component-slot-nested-error-2/Nested.svelte
new file mode 100644
index 0000000000..c6f086d96c
--- /dev/null
+++ b/test/runtime/samples/component-slot-nested-error-2/Nested.svelte
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/test/runtime/samples/component-slot-nested-error-2/_config.js b/test/runtime/samples/component-slot-nested-error-2/_config.js
new file mode 100644
index 0000000000..63e6c0fac9
--- /dev/null
+++ b/test/runtime/samples/component-slot-nested-error-2/_config.js
@@ -0,0 +1,3 @@
+export default {
+ error: [`Element with a slot='...' attribute must be a direct descendant of a component or custom element`]
+};
diff --git a/test/runtime/samples/component-slot-nested-error-2/main.svelte b/test/runtime/samples/component-slot-nested-error-2/main.svelte
new file mode 100644
index 0000000000..a7142d6dc1
--- /dev/null
+++ b/test/runtime/samples/component-slot-nested-error-2/main.svelte
@@ -0,0 +1,11 @@
+
+
+
+
+
diff --git a/test/runtime/samples/component-slot-nested-error-3/Nested.svelte b/test/runtime/samples/component-slot-nested-error-3/Nested.svelte
new file mode 100644
index 0000000000..c6f086d96c
--- /dev/null
+++ b/test/runtime/samples/component-slot-nested-error-3/Nested.svelte
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/test/runtime/samples/component-slot-nested-error-3/_config.js b/test/runtime/samples/component-slot-nested-error-3/_config.js
new file mode 100644
index 0000000000..63e6c0fac9
--- /dev/null
+++ b/test/runtime/samples/component-slot-nested-error-3/_config.js
@@ -0,0 +1,3 @@
+export default {
+ error: [`Element with a slot='...' attribute must be a direct descendant of a component or custom element`]
+};
diff --git a/test/runtime/samples/component-slot-nested-error-3/main.svelte b/test/runtime/samples/component-slot-nested-error-3/main.svelte
new file mode 100644
index 0000000000..a63b1defde
--- /dev/null
+++ b/test/runtime/samples/component-slot-nested-error-3/main.svelte
@@ -0,0 +1,11 @@
+
+
+
+
+
diff --git a/test/runtime/samples/component-slot-nested-error/Nested.svelte b/test/runtime/samples/component-slot-nested-error/Nested.svelte
new file mode 100644
index 0000000000..c6f086d96c
--- /dev/null
+++ b/test/runtime/samples/component-slot-nested-error/Nested.svelte
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/test/runtime/samples/component-slot-nested-error/_config.js b/test/runtime/samples/component-slot-nested-error/_config.js
new file mode 100644
index 0000000000..63e6c0fac9
--- /dev/null
+++ b/test/runtime/samples/component-slot-nested-error/_config.js
@@ -0,0 +1,3 @@
+export default {
+ error: [`Element with a slot='...' attribute must be a direct descendant of a component or custom element`]
+};
diff --git a/test/runtime/samples/component-slot-nested-error/main.svelte b/test/runtime/samples/component-slot-nested-error/main.svelte
new file mode 100644
index 0000000000..d69db23739
--- /dev/null
+++ b/test/runtime/samples/component-slot-nested-error/main.svelte
@@ -0,0 +1,9 @@
+
+
+
+
+
diff --git a/test/validator/samples/slot-attribute-invalid/errors.json b/test/validator/samples/slot-attribute-invalid/errors.json
index fc01fa9792..00b1ea05c0 100644
--- a/test/validator/samples/slot-attribute-invalid/errors.json
+++ b/test/validator/samples/slot-attribute-invalid/errors.json
@@ -1,6 +1,6 @@
[{
"code": "invalid-slotted-content",
- "message": "Element with a slot='...' attribute must be a descendant of a component or custom element",
+ "message": "Element with a slot='...' attribute must be a direct descendant of a component or custom element",
"start": {
"line": 1,
"column": 5,