Skip to content

Commit 0675b25

Browse files
authored
Make forge compiler resolve work correctly when resolc.resolc_compile is set (#129)
* resolve compile
1 parent b084a14 commit 0675b25

File tree

5 files changed

+391
-27
lines changed

5 files changed

+391
-27
lines changed

.config/nextest.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
chisel-serial = { max-threads = 1 }
33

44
[profile.default]
5-
retries = { backoff = "exponential", count = 2, delay = "3s", jitter = true }
5+
retries = { backoff = "exponential", count = 2, delay = "5s", jitter = true }
66
slow-timeout = { period = "1m", terminate-after = 3 }
77

88
[[profile.default.overrides]]

crates/forge/src/cmd/compiler.rs

Lines changed: 66 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
use clap::{Parser, Subcommand, ValueHint};
22
use eyre::Result;
33
use foundry_common::shell;
4-
use foundry_compilers::{artifacts::EvmVersion, Graph};
4+
use foundry_compilers::{
5+
artifacts::EvmVersion, multi::MultiCompilerInput, Compiler, CompilerInput, Graph,
6+
};
57
use foundry_config::Config;
68
use semver::Version;
79
use serde::Serialize;
@@ -29,9 +31,18 @@ pub enum CompilerSubcommands {
2931
Resolve(ResolveArgs),
3032
}
3133

34+
/// Dependency info struct, exists only because tuple gets serialized as an array.
35+
#[derive(Serialize)]
36+
struct Dependency {
37+
name: String,
38+
version: Version,
39+
}
40+
3241
/// Resolved compiler within the project.
3342
#[derive(Serialize)]
3443
struct ResolvedCompiler {
44+
/// Compiler name
45+
name: String,
3546
/// Compiler version.
3647
version: Version,
3748
/// Max supported EVM version of compiler.
@@ -40,6 +51,9 @@ struct ResolvedCompiler {
4051
/// Source paths.
4152
#[serde(skip_serializing_if = "Vec::is_empty")]
4253
paths: Vec<String>,
54+
#[serde(skip_serializing_if = "Option::is_none")]
55+
/// dependency of the compiler
56+
dependency: Option<Dependency>,
4357
}
4458

4559
/// CLI arguments for `forge compiler resolve`.
@@ -59,18 +73,17 @@ impl ResolveArgs {
5973
let Self { root, skip } = self;
6074

6175
let root = root.unwrap_or_else(|| PathBuf::from("."));
62-
let config = Config::load_with_root(&root)?;
76+
let config = Config::load_with_root(&root)?.canonic_at(root);
6377
let project = config.project()?;
6478

6579
let graph = Graph::resolve(&project.paths)?;
6680
let sources = graph.into_sources_by_version(&project)?.sources;
67-
6881
let mut output: BTreeMap<String, Vec<ResolvedCompiler>> = BTreeMap::new();
6982

7083
for (language, sources) in sources {
7184
let mut versions_with_paths: Vec<ResolvedCompiler> = sources
7285
.iter()
73-
.map(|(version, sources, _)| {
86+
.map(|(version, sources, (_, settings))| {
7487
let paths: Vec<String> = sources
7588
.iter()
7689
.filter_map(|(path_file, _)| {
@@ -101,14 +114,48 @@ impl ResolveArgs {
101114
} else {
102115
None
103116
};
117+
let input = MultiCompilerInput::build(
118+
sources.clone(),
119+
settings.to_owned().clone(),
120+
language,
121+
version.clone(),
122+
);
123+
let compiler_version = project.compiler.compiler_version(&input);
124+
let mut compiler_name = project.compiler.compiler_name(&input).into_owned();
125+
126+
let dependency = {
127+
// `Input.version` will always differ from `compiler_version`
128+
if config.resolc.resolc_compile {
129+
let names = compiler_name;
130+
let mut names = names.split_whitespace();
131+
compiler_name =
132+
names.next().expect("Malformed compiler name").to_owned();
133+
names
134+
.last()
135+
.map(|item| item.to_owned())
136+
.zip(Some(version.clone()))
137+
.map(|(name, version)| Dependency { name, version })
138+
} else {
139+
None
140+
}
141+
};
104142

105-
ResolvedCompiler { version: version.clone(), evm_version, paths }
143+
ResolvedCompiler {
144+
name: compiler_name,
145+
version: compiler_version,
146+
evm_version,
147+
paths,
148+
dependency,
149+
}
106150
})
107151
.filter(|version| !version.paths.is_empty())
108152
.collect();
109153

110154
// Sort by SemVer version.
111-
versions_with_paths.sort_by(|v1, v2| Version::cmp(&v1.version, &v2.version));
155+
versions_with_paths.sort_by(|v1, v2| {
156+
(&v1.version, &v1.dependency.as_ref().map(|x| &x.version))
157+
.cmp(&(&v2.version, &v2.dependency.as_ref().map(|x| &x.version)))
158+
});
112159

113160
// Skip language if no paths are found after filtering.
114161
if !versions_with_paths.is_empty() {
@@ -135,13 +182,23 @@ impl ResolveArgs {
135182

136183
for resolved_compiler in compilers {
137184
let version = &resolved_compiler.version;
185+
let extras =
186+
if let Some(Dependency { name, version }) = &resolved_compiler.dependency {
187+
format!(", {name} v{version}")
188+
} else {
189+
String::new()
190+
};
138191
match shell::verbosity() {
139-
0 => sh_println!("- {version}")?,
192+
0 => sh_println!("- {} v{version}{}", resolved_compiler.name, extras)?,
140193
_ => {
141194
if let Some(evm) = &resolved_compiler.evm_version {
142-
sh_println!("{version} (<= {evm}):")?
195+
sh_println!(
196+
"{} v{version}{} (<= {evm}):",
197+
resolved_compiler.name,
198+
extras
199+
)?
143200
} else {
144-
sh_println!("{version}:")?
201+
sh_println!("{} v{version}{}:", resolved_compiler.name, extras)?
145202
}
146203
}
147204
}

crates/forge/tests/cli/compiler.rs

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ forgetest!(can_resolve_path, |prj, cmd| {
7070
.assert_success()
7171
.stdout_eq(str![[r#"
7272
Solidity:
73-
- 0.8.4
73+
- Solc v0.8.4
7474
7575
7676
"#]]);
@@ -81,7 +81,7 @@ forgetest!(can_list_resolved_compiler_versions, |prj, cmd| {
8181

8282
cmd.args(["compiler", "resolve"]).assert_success().stdout_eq(str![[r#"
8383
Solidity:
84-
- 0.8.4
84+
- Solc v0.8.4
8585
8686
8787
"#]]);
@@ -93,11 +93,12 @@ forgetest!(can_list_resolved_compiler_versions_json, |prj, cmd| {
9393
cmd.args(["compiler", "resolve", "--json"]).assert_success().stdout_eq(
9494
str![[r#"
9595
{
96-
"Solidity":[
97-
{
98-
"version":"0.8.4"
99-
}
100-
]
96+
"Solidity": [
97+
{
98+
"name": "Solc",
99+
"version": "0.8.4"
100+
}
101+
]
101102
}
102103
"#]]
103104
.is_json(),
@@ -111,7 +112,7 @@ forgetest!(can_list_resolved_compiler_versions_verbose, |prj, cmd| {
111112
cmd.args(["compiler", "resolve", "-v"]).assert_success().stdout_eq(str![[r#"
112113
Solidity:
113114
114-
0.8.27:
115+
Solc v0.8.27:
115116
├── src/ContractC.sol
116117
└── src/ContractD.sol
117118
@@ -128,6 +129,7 @@ forgetest!(can_list_resolved_compiler_versions_verbose_json, |prj, cmd| {
128129
{
129130
"Solidity": [
130131
{
132+
"name": "Solc",
131133
"version": "0.8.27",
132134
"paths": [
133135
"src/ContractC.sol",
@@ -151,12 +153,12 @@ forgetest!(can_list_resolved_multiple_compiler_versions, |prj, cmd| {
151153

152154
cmd.args(["compiler", "resolve"]).assert_success().stdout_eq(str![[r#"
153155
Solidity:
154-
- 0.8.4
155-
- 0.8.11
156-
- 0.8.27
156+
- Solc v0.8.4
157+
- Solc v0.8.11
158+
- Solc v0.8.27
157159
158160
Vyper:
159-
- 0.4.0
161+
- Vyper v0.4.0
160162
161163
162164
"#]]);
@@ -174,7 +176,7 @@ forgetest!(can_list_resolved_multiple_compiler_versions_skipped, |prj, cmd| {
174176
r#"
175177
Vyper:
176178
177-
0.4.0:
179+
Vyper v0.4.0:
178180
├── src/Counter.vy
179181
└── src/ICounter.vyi
180182
@@ -198,6 +200,7 @@ forgetest!(can_list_resolved_multiple_compiler_versions_skipped_json, |prj, cmd|
198200
{
199201
"Solidity": [
200202
{
203+
"name": "Solc",
201204
"version": "0.8.27",
202205
"paths": [
203206
"src/ContractD.sol"
@@ -206,6 +209,7 @@ forgetest!(can_list_resolved_multiple_compiler_versions_skipped_json, |prj, cmd|
206209
],
207210
"Vyper": [
208211
{
212+
"name": "Vyper",
209213
"version": "0.4.0",
210214
"paths": [
211215
"src/Counter.vy",
@@ -230,19 +234,19 @@ forgetest!(can_list_resolved_multiple_compiler_versions_verbose, |prj, cmd| {
230234
cmd.args(["compiler", "resolve", "-vv"]).assert_success().stdout_eq(str![[r#"
231235
Solidity:
232236
233-
0.8.4 (<= istanbul):
237+
Solc v0.8.4 (<= istanbul):
234238
└── src/ContractA.sol
235239
236-
0.8.11 (<= london):
240+
Solc v0.8.11 (<= london):
237241
└── src/ContractB.sol
238242
239-
0.8.27 (<= [..]):
243+
Solc v0.8.27 (<= cancun):
240244
├── src/ContractC.sol
241245
└── src/ContractD.sol
242246
243247
Vyper:
244248
245-
0.4.0 (<= cancun):
249+
Vyper v0.4.0 (<= cancun):
246250
├── src/Counter.vy
247251
└── src/ICounter.vyi
248252
@@ -263,20 +267,23 @@ forgetest!(can_list_resolved_multiple_compiler_versions_verbose_json, |prj, cmd|
263267
{
264268
"Solidity": [
265269
{
270+
"name": "Solc",
266271
"version": "0.8.4",
267272
"evm_version": "Istanbul",
268273
"paths": [
269274
"src/ContractA.sol"
270275
]
271276
},
272277
{
278+
"name": "Solc",
273279
"version": "0.8.11",
274280
"evm_version": "London",
275281
"paths": [
276282
"src/ContractB.sol"
277283
]
278284
},
279285
{
286+
"name": "Solc",
280287
"version": "0.8.27",
281288
"evm_version": "[..]",
282289
"paths": [
@@ -287,6 +294,7 @@ forgetest!(can_list_resolved_multiple_compiler_versions_verbose_json, |prj, cmd|
287294
],
288295
"Vyper": [
289296
{
297+
"name": "Vyper",
290298
"version": "0.4.0",
291299
"evm_version": "[..]",
292300
"paths": [

crates/forge/tests/cli/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ mod inline_config;
2323
mod multi_script;
2424
mod revive_build;
2525
mod revive_cmd;
26+
mod revive_compiler;
2627
mod revive_config;
2728
mod revive_create;
2829
mod revive_inspect;

0 commit comments

Comments
 (0)