Skip to main content

foundry_compilers/compilers/vyper/
settings.rs

1use std::{collections::BTreeSet, path::PathBuf};
2
3pub use crate::artifacts::vyper::VyperSettings;
4use crate::{
5    compilers::{CompilerSettings, restrictions::CompilerSettingsRestrictions},
6    solc::Restriction,
7};
8use foundry_compilers_artifacts::{EvmVersion, output_selection::OutputSelection};
9
10#[derive(Clone, Copy, Debug, Default)]
11pub struct VyperRestrictions {
12    pub evm_version: Restriction<EvmVersion>,
13}
14
15impl CompilerSettingsRestrictions for VyperRestrictions {
16    fn merge(self, other: Self) -> Option<Self> {
17        Some(Self { evm_version: self.evm_version.merge(other.evm_version)? })
18    }
19}
20
21impl CompilerSettings for VyperSettings {
22    type Restrictions = VyperRestrictions;
23
24    fn update_output_selection(&mut self, mut f: impl FnMut(&mut OutputSelection)) {
25        f(&mut self.output_selection);
26    }
27
28    fn can_use_cached(&self, other: &Self) -> bool {
29        let Self {
30            evm_version,
31            optimize,
32            opt_level,
33            bytecode_metadata,
34            output_selection,
35            search_paths,
36            experimental_codegen,
37            debug,
38            enable_decimals,
39            venom_experimental,
40            venom,
41        } = self;
42        evm_version == &other.evm_version
43            && optimize == &other.optimize
44            && opt_level == &other.opt_level
45            && bytecode_metadata == &other.bytecode_metadata
46            && output_selection.is_subset_of(&other.output_selection)
47            && search_paths == &other.search_paths
48            && experimental_codegen == &other.experimental_codegen
49            && debug == &other.debug
50            && enable_decimals == &other.enable_decimals
51            && venom_experimental == &other.venom_experimental
52            && venom == &other.venom
53    }
54
55    fn with_include_paths(mut self, include_paths: &BTreeSet<PathBuf>) -> Self {
56        self.search_paths = Some(include_paths.clone());
57        self
58    }
59
60    fn satisfies_restrictions(&self, restrictions: &Self::Restrictions) -> bool {
61        restrictions.evm_version.satisfies(self.evm_version)
62    }
63}
64
65#[cfg(test)]
66mod tests {
67    use super::*;
68    use crate::artifacts::vyper::{VyperOptimizationLevel, VyperVenomSettings};
69
70    #[test]
71    fn cache_key_includes_extended_vyper_settings() {
72        let base = VyperSettings::default();
73
74        let mut changed = base.clone();
75        changed.opt_level = Some(VyperOptimizationLevel::O3);
76        assert!(!base.can_use_cached(&changed));
77
78        let mut changed = base.clone();
79        changed.debug = Some(true);
80        assert!(!base.can_use_cached(&changed));
81
82        let mut changed = base.clone();
83        changed.enable_decimals = Some(true);
84        assert!(!base.can_use_cached(&changed));
85
86        let mut changed = base.clone();
87        changed.venom_experimental = Some(true);
88        assert!(!base.can_use_cached(&changed));
89
90        let mut changed = base;
91        changed.venom = Some(VyperVenomSettings { disable_cse: Some(true), ..Default::default() });
92        assert!(!VyperSettings::default().can_use_cached(&changed));
93    }
94}