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)>,
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);
}
}
}
@ -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);

View File

@ -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