Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(solc): process all imports even input files #2136

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
29 changes: 18 additions & 11 deletions ethers-solc/src/resolver/mod.rs
Expand Up @@ -455,17 +455,20 @@ impl Graph {
all_nodes: &mut HashMap<usize, (PathBuf, Source)>,
sources: &mut Sources,
edges: &[Vec<usize>],
num_input_files: usize,
processed_sources: &mut HashSet<usize>,
) {
// iterate over all dependencies not processed yet
for dep in edges[idx].iter().copied() {
// we only process nodes that were added as part of the resolve step because input
// nodes are handled separately
if dep >= num_input_files {
// library import
if let Some((path, source)) = all_nodes.remove(&dep) {
sources.insert(path, source);
insert_imports(dep, all_nodes, sources, edges, num_input_files);
}
// keep track of processed dependencies, if the dep was already in the set we have
// processed it already
if !processed_sources.insert(dep) {
continue
}

// library import
if let Some((path, source)) = all_nodes.get(&dep).cloned() {
sources.insert(path, source);
insert_imports(dep, all_nodes, sources, edges, processed_sources);
}
}
}
Expand All @@ -480,17 +483,21 @@ impl Graph {
// determine the `Sources` set for each solc version
for (version, input_node_indices) in versioned_nodes {
let mut sources = Sources::new();

// all input nodes will be processed
let mut processed_sources = input_node_indices.iter().copied().collect();

// we only process input nodes (from sources, tests for example)
for idx in input_node_indices {
// insert the input node in the sources set and remove it from the available set
let (path, source) = all_nodes.remove(&idx).expect("node is preset. qed");
let (path, source) = all_nodes.get(&idx).cloned().expect("node is preset. qed");
sources.insert(path, source);
insert_imports(
idx,
&mut all_nodes,
&mut sources,
&edges.edges,
edges.num_input_files,
&mut processed_sources,
);
}
versioned_sources.insert(version, sources);
Expand Down
2 changes: 1 addition & 1 deletion ethers-solc/tests/project.rs
Expand Up @@ -1860,7 +1860,7 @@ fn can_parse_doc() {

let contract = r#"
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity ^0.8.0;
pragma solidity 0.8.17;

/// @title Not an ERC20.
/// @author Notadev
Expand Down