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

* fix(solc): process all imports even input files

* pin test to 0.8.17
This commit is contained in:
Matthias Seitz 2023-02-10 20:45:51 +01:00 committed by GitHub
parent e20bb71569
commit c436eae96c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 12 deletions

View File

@ -455,17 +455,20 @@ impl Graph {
all_nodes: &mut HashMap<usize, (PathBuf, Source)>, all_nodes: &mut HashMap<usize, (PathBuf, Source)>,
sources: &mut Sources, sources: &mut Sources,
edges: &[Vec<usize>], 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() { for dep in edges[idx].iter().copied() {
// we only process nodes that were added as part of the resolve step because input // keep track of processed dependencies, if the dep was already in the set we have
// nodes are handled separately // processed it already
if dep >= num_input_files { if !processed_sources.insert(dep) {
// library import continue
if let Some((path, source)) = all_nodes.remove(&dep) { }
sources.insert(path, source);
insert_imports(dep, all_nodes, sources, edges, num_input_files); // 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);
} }
} }
} }
@ -480,17 +483,21 @@ impl Graph {
// determine the `Sources` set for each solc version // determine the `Sources` set for each solc version
for (version, input_node_indices) in versioned_nodes { for (version, input_node_indices) in versioned_nodes {
let mut sources = Sources::new(); 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) // we only process input nodes (from sources, tests for example)
for idx in input_node_indices { for idx in input_node_indices {
// insert the input node in the sources set and remove it from the available set // 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); sources.insert(path, source);
insert_imports( insert_imports(
idx, idx,
&mut all_nodes, &mut all_nodes,
&mut sources, &mut sources,
&edges.edges, &edges.edges,
edges.num_input_files, &mut processed_sources,
); );
} }
versioned_sources.insert(version, sources); versioned_sources.insert(version, sources);

View File

@ -1860,7 +1860,7 @@ fn can_parse_doc() {
let contract = r#" let contract = r#"
// SPDX-License-Identifier: GPL-3.0-only // SPDX-License-Identifier: GPL-3.0-only
pragma solidity ^0.8.0; pragma solidity 0.8.17;
/// @title Not an ERC20. /// @title Not an ERC20.
/// @author Notadev /// @author Notadev