pull/10502/head
Rich Harris 3 years ago
parent 168eac7c9d
commit 0dbcfa2f63

@ -11,10 +11,6 @@ import { error } from '../../../errors.js';
*/ */
/** @typedef {NODE_PROBABLY_EXISTS | NODE_DEFINITELY_EXISTS} NodeExistsValue */ /** @typedef {NODE_PROBABLY_EXISTS | NODE_DEFINITELY_EXISTS} NodeExistsValue */
const NO_MATCH = 'NO_MATCH';
const POSSIBLE_MATCH = 'POSSIBLE_MATCH';
const UNKNOWN_SELECTOR = 'UNKNOWN_SELECTOR';
const NODE_PROBABLY_EXISTS = 0; const NODE_PROBABLY_EXISTS = 0;
const NODE_DEFINITELY_EXISTS = 1; const NODE_DEFINITELY_EXISTS = 1;
@ -131,21 +127,17 @@ function apply_selector(relative_selectors, rule, element, stylesheet) {
if (!relative_selector) return false; if (!relative_selector) return false;
const applies = relative_selector_might_apply_to_node( const possible_match = relative_selector_might_apply_to_node(
relative_selector, relative_selector,
rule, rule,
element, element,
stylesheet stylesheet
); );
if (applies === NO_MATCH) { if (!possible_match) {
return false; return false;
} }
if (applies === UNKNOWN_SELECTOR) {
return true;
}
if (relative_selector.combinator) { if (relative_selector.combinator) {
if ( if (
relative_selector.combinator.type === 'Combinator' && relative_selector.combinator.type === 'Combinator' &&
@ -269,15 +261,15 @@ function mark(relative_selector, element) {
const regex_backslash_and_following_character = /\\(.)/g; const regex_backslash_and_following_character = /\\(.)/g;
/** /**
* Ensure that `element` satisfies each simple selector in `relative_selector`
*
* @param {import('#compiler').Css.RelativeSelector} relative_selector * @param {import('#compiler').Css.RelativeSelector} relative_selector
* @param {import('#compiler').Css.Rule} rule * @param {import('#compiler').Css.Rule} rule
* @param {import('#compiler').RegularElement | import('#compiler').SvelteElement} element * @param {import('#compiler').RegularElement | import('#compiler').SvelteElement} element
* @param {import('#compiler').Css.StyleSheet} stylesheet * @param {import('#compiler').Css.StyleSheet} stylesheet
* @returns {NO_MATCH | POSSIBLE_MATCH | UNKNOWN_SELECTOR} * @returns {boolean}
*/ */
function relative_selector_might_apply_to_node(relative_selector, rule, element, stylesheet) { function relative_selector_might_apply_to_node(relative_selector, rule, element, stylesheet) {
if (relative_selector.metadata.is_host || relative_selector.metadata.is_root) return NO_MATCH;
for (const selector of relative_selector.selectors) { for (const selector of relative_selector.selectors) {
if (selector.type === 'Percentage' || selector.type === 'Nth') continue; if (selector.type === 'Percentage' || selector.type === 'Nth') continue;
@ -286,11 +278,11 @@ function relative_selector_might_apply_to_node(relative_selector, rule, element,
switch (selector.type) { switch (selector.type) {
case 'PseudoClassSelector': { case 'PseudoClassSelector': {
if (name === 'host' || name === 'root') { if (name === 'host' || name === 'root') {
return NO_MATCH; return false;
} }
if (name === 'global' && relative_selector.selectors.length === 1) { if (name === 'global' && relative_selector.selectors.length === 1) {
return NO_MATCH; return false;
} }
if ((name === 'is' || name === 'where') && selector.args) { if ((name === 'is' || name === 'where') && selector.args) {
@ -304,7 +296,7 @@ function relative_selector_might_apply_to_node(relative_selector, rule, element,
} }
if (!matched) { if (!matched) {
return NO_MATCH; return false;
} }
} }
@ -327,7 +319,7 @@ function relative_selector_might_apply_to_node(relative_selector, rule, element,
selector.flags?.includes('i') ?? false selector.flags?.includes('i') ?? false
) )
) { ) {
return NO_MATCH; return false;
} }
break; break;
} }
@ -339,7 +331,7 @@ function relative_selector_might_apply_to_node(relative_selector, rule, element,
(attribute) => attribute.type === 'ClassDirective' && attribute.name === name (attribute) => attribute.type === 'ClassDirective' && attribute.name === name
) )
) { ) {
return NO_MATCH; return false;
} }
break; break;
@ -347,7 +339,7 @@ function relative_selector_might_apply_to_node(relative_selector, rule, element,
case 'IdSelector': { case 'IdSelector': {
if (!attribute_matches(element, 'id', name, '=', false)) { if (!attribute_matches(element, 'id', name, '=', false)) {
return NO_MATCH; return false;
} }
break; break;
@ -359,7 +351,7 @@ function relative_selector_might_apply_to_node(relative_selector, rule, element,
name !== '*' && name !== '*' &&
element.type !== 'SvelteElement' element.type !== 'SvelteElement'
) { ) {
return NO_MATCH; return false;
} }
break; break;
@ -378,18 +370,16 @@ function relative_selector_might_apply_to_node(relative_selector, rule, element,
} }
if (!matched) { if (!matched) {
return NO_MATCH; return false;
} }
break; break;
} }
default:
return UNKNOWN_SELECTOR;
} }
} }
return POSSIBLE_MATCH; // possible match
return true;
} }
/** /**

Loading…
Cancel
Save