Skip to content

Commit 0a147f1

Browse files
feat(scss): add basic SCSS declaration support and comments (#8721)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
1 parent 1b37c60 commit 0a147f1

File tree

307 files changed

+6056
-4649
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

307 files changed

+6056
-4649
lines changed

crates/biome_css_analyze/src/assist/source/use_sorted_properties.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@ impl RecessOrderMember {
242242
match &self.0 {
243243
AnyCssDeclarationOrRule::CssBogus(_) => NodeKindOrder::UnknownKind,
244244
AnyCssDeclarationOrRule::CssMetavariable(_) => NodeKindOrder::UnknownKind,
245+
AnyCssDeclarationOrRule::ScssDeclaration(_) => NodeKindOrder::UnknownKind,
245246
AnyCssDeclarationOrRule::AnyCssRule(rule) => match rule {
246247
AnyCssRule::CssAtRule(_) => NodeKindOrder::NestedRuleOrAtRule,
247248
AnyCssRule::CssBogusRule(_) => NodeKindOrder::UnknownKind,

crates/biome_css_analyze/src/lint/correctness/no_invalid_position_at_import_rule.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use biome_analyze::{
22
Ast, Rule, RuleDiagnostic, RuleSource, context::RuleContext, declare_lint_rule,
33
};
44
use biome_console::markup;
5-
use biome_css_syntax::{AnyCssRule, CssRuleList};
5+
use biome_css_syntax::{AnyCssRootItem, AnyCssRule, CssRootItemList};
66
use biome_diagnostics::Severity;
77
use biome_rowan::{AstNode, TextRange};
88
use biome_rule_options::no_invalid_position_at_import_rule::NoInvalidPositionAtImportRuleOptions;
@@ -39,7 +39,7 @@ declare_lint_rule! {
3939
}
4040

4141
impl Rule for NoInvalidPositionAtImportRule {
42-
type Query = Ast<CssRuleList>;
42+
type Query = Ast<CssRootItemList>;
4343
type State = TextRange;
4444
type Signals = Box<[Self::State]>;
4545
type Options = NoInvalidPositionAtImportRuleOptions;
@@ -49,9 +49,9 @@ impl Rule for NoInvalidPositionAtImportRule {
4949
let mut is_invalid_position = false;
5050
let mut invalid_import_list = Vec::new();
5151

52-
for rule in node {
53-
let any_css_at_rule = match rule {
54-
AnyCssRule::CssAtRule(item) => item.rule().ok(),
52+
for item in node {
53+
let any_css_at_rule = match item {
54+
AnyCssRootItem::AnyCssRule(AnyCssRule::CssAtRule(at_rule)) => at_rule.rule().ok(),
5555
_ => None,
5656
};
5757

crates/biome_css_analyze/src/lint/nursery/no_empty_source.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ impl Rule for NoEmptySource {
7878
fn run(ctx: &RuleContext<Self>) -> Option<Self::State> {
7979
let node = ctx.query();
8080

81-
if node.rules().len() > 0 {
81+
if node.items().len() > 0 {
8282
return None;
8383
}
8484

crates/biome_css_analyze/src/lint/suspicious/no_duplicate_at_import_rules.rs

Lines changed: 48 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use biome_analyze::{
44
Ast, Rule, RuleDiagnostic, RuleSource, context::RuleContext, declare_lint_rule,
55
};
66
use biome_console::markup;
7-
use biome_css_syntax::{AnyCssAtRule, AnyCssRule, CssImportAtRule, CssRuleList};
7+
use biome_css_syntax::{AnyCssAtRule, AnyCssRootItem, AnyCssRule, CssImportAtRule, CssRootItemList};
88
use biome_diagnostics::Severity;
99
use biome_rowan::AstNode;
1010
use biome_rule_options::no_duplicate_at_import_rules::NoDuplicateAtImportRulesOptions;
@@ -59,65 +59,64 @@ declare_lint_rule! {
5959
}
6060

6161
impl Rule for NoDuplicateAtImportRules {
62-
type Query = Ast<CssRuleList>;
62+
type Query = Ast<CssRootItemList>;
6363
type State = CssImportAtRule;
6464
type Signals = Option<Self::State>;
6565
type Options = NoDuplicateAtImportRulesOptions;
6666

6767
fn run(ctx: &RuleContext<Self>) -> Option<Self::State> {
6868
let node = ctx.query();
6969
let mut import_url_map: HashMap<String, HashSet<String>> = HashMap::new();
70-
for rule in node {
71-
match rule {
72-
AnyCssRule::CssAtRule(item) => match item.rule().ok()? {
73-
AnyCssAtRule::CssImportAtRule(import_rule) => {
74-
let import_url = import_rule
75-
.url()
76-
.ok()?
77-
.to_trimmed_text()
78-
.to_lowercase_cow()
79-
.replace("url(", "")
80-
.replace(')', "")
81-
.replace('"', "'");
82-
if let Some(media_query_set) = import_url_map.get_mut(&import_url) {
83-
// if the current import_rule has no media queries or there are no queries saved in the
84-
// media_query_set, this is always a duplicate
85-
if import_rule.media().to_trimmed_text().is_empty()
86-
|| media_query_set.is_empty()
87-
{
88-
return Some(import_rule);
89-
}
70+
for item in node {
71+
let AnyCssRootItem::AnyCssRule(AnyCssRule::CssAtRule(at_rule)) = item else {
72+
continue;
73+
};
74+
let AnyCssAtRule::CssImportAtRule(import_rule) = at_rule.rule().ok()? else {
75+
continue;
76+
};
9077

91-
for media in import_rule.media() {
92-
match media {
93-
Ok(media) => {
94-
if !media_query_set.insert(
95-
media.to_trimmed_text().to_lowercase_cow().into(),
96-
) {
97-
return Some(import_rule);
98-
}
99-
}
100-
_ => return None,
101-
}
102-
}
103-
} else {
104-
let mut media_set: HashSet<String> = HashSet::new();
105-
for media in import_rule.media() {
106-
match media {
107-
Ok(media) => {
108-
media_set.insert(
109-
media.to_trimmed_text().to_lowercase_cow().into(),
110-
);
111-
}
112-
_ => return None,
113-
}
78+
let import_url = import_rule
79+
.url()
80+
.ok()?
81+
.to_trimmed_text()
82+
.to_lowercase_cow()
83+
.replace("url(", "")
84+
.replace(')', "")
85+
.replace('"', "'");
86+
if let Some(media_query_set) = import_url_map.get_mut(&import_url) {
87+
// if the current import_rule has no media queries or there are no queries saved in the
88+
// media_query_set, this is always a duplicate
89+
if import_rule.media().to_trimmed_text().is_empty()
90+
|| media_query_set.is_empty()
91+
{
92+
return Some(import_rule);
93+
}
94+
95+
for media in import_rule.media() {
96+
match media {
97+
Ok(media) => {
98+
if !media_query_set.insert(
99+
media.to_trimmed_text().to_lowercase_cow().into(),
100+
) {
101+
return Some(import_rule);
114102
}
115-
import_url_map.insert(import_url, media_set);
116103
}
104+
_ => return None,
117105
}
118-
_ => return None,
119-
},
120-
_ => return None,
106+
}
107+
} else {
108+
let mut media_set: HashSet<String> = HashSet::new();
109+
for media in import_rule.media() {
110+
match media {
111+
Ok(media) => {
112+
media_set.insert(
113+
media.to_trimmed_text().to_lowercase_cow().into(),
114+
);
115+
}
116+
_ => return None,
117+
}
118+
}
119+
import_url_map.insert(import_url, media_set);
121120
}
122121
}
123122
None

crates/biome_css_factory/src/generated/node_factory.rs

Lines changed: 103 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)