Skip to content

Commit 7e6fa43

Browse files
committed
Make sure required proc macro CUs are processed beforehand
1 parent 0b92122 commit 7e6fa43

File tree

2 files changed

+36
-9
lines changed

2 files changed

+36
-9
lines changed

scarb/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ similar-asserts.workspace = true
117117
snapbox.workspace = true
118118
test-case.workspace = true
119119
test-for-each-example = { path = "../utils/test-for-each-example" }
120-
cairo-lint-core = { workspace = true, features = ["testing-colors"]}
120+
cairo-lint-core = { workspace = true, features = ["testing-colors"] }
121121

122122
[build-dependencies]
123123
fs_extra.workspace = true

scarb/src/ops/lint.rs

+35-8
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
use std::collections::HashSet;
2+
13
use crate::{
24
compiler::{
35
db::{build_scarb_root_database, ScarbDatabase},
46
CompilationUnit, CompilationUnitAttributes,
57
},
6-
core::TargetKind,
8+
core::{PackageId, TargetKind},
79
ops,
810
};
911
use anyhow::Result;
@@ -19,13 +21,14 @@ use cairo_lint_core::{
1921
diagnostics::format_diagnostic,
2022
plugin::{cairo_lint_plugin_suite, diagnostic_kind_from_message, CairoLintKind},
2123
};
24+
use itertools::Itertools;
2225
use scarb_ui::components::Status;
2326
use serde::Deserialize;
2427
use smol_str::SmolStr;
2528

2629
use crate::core::{Package, Workspace};
2730

28-
use super::{CompilationUnitsOpts, FeaturesOpts, FeaturesSelector};
31+
use super::{compile_unit, CompilationUnitsOpts, FeaturesOpts, FeaturesSelector};
2932

3033
pub struct LintOptions {
3134
pub packages: Vec<Package>,
@@ -53,6 +56,19 @@ pub fn lint(opts: LintOptions, ws: &Workspace<'_>) -> Result<()> {
5356
},
5457
)?;
5558

59+
// Select proc macro units that need to be compiled for Cairo compilation units.
60+
let required_plugins = compilation_units
61+
.iter()
62+
.flat_map(|unit| match unit {
63+
CompilationUnit::Cairo(unit) => unit
64+
.cairo_plugins
65+
.iter()
66+
.map(|p| p.package.id)
67+
.collect_vec(),
68+
_ => Vec::new(),
69+
})
70+
.collect::<HashSet<PackageId>>();
71+
5672
for package in opts.packages {
5773
let package_compilation_units = if opts.test {
5874
compilation_units
@@ -78,13 +94,24 @@ pub fn lint(opts: LintOptions, ws: &Workspace<'_>) -> Result<()> {
7894
.unwrap()]
7995
};
8096

81-
for compilation_unit in package_compilation_units {
97+
// We guarantee that proc-macro units are always processed first,
98+
// so that all required plugins are compiled before we start checking Cairo units.
99+
let units = package_compilation_units.into_iter().sorted_by_key(|unit| {
100+
if matches!(unit, CompilationUnit::ProcMacro(_)) {
101+
0
102+
} else {
103+
1
104+
}
105+
});
106+
107+
for compilation_unit in units {
82108
match compilation_unit {
83-
// We skip proc macros as we don't want to check anything related to rust code.
84-
CompilationUnit::ProcMacro(_) => ws
85-
.config()
86-
.ui()
87-
.print(Status::new("Skipping proc macro", &compilation_unit.name())),
109+
CompilationUnit::ProcMacro(_) => {
110+
// We process all proc-macro units that are required by Cairo compilation units.
111+
if required_plugins.contains(&compilation_unit.main_package_id()) {
112+
compile_unit(compilation_unit.clone(), ws)?;
113+
}
114+
}
88115
CompilationUnit::Cairo(compilation_unit) => {
89116
ws.config()
90117
.ui()

0 commit comments

Comments
 (0)