Skip to main content

xbp_analysis/domain/
capabilities.rs

1//! Explicit language adapter capabilities.
2
3use serde::{Deserialize, Serialize};
4use std::collections::BTreeSet;
5
6/// Capabilities a language adapter may provide.
7#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
8#[serde(rename_all = "snake_case")]
9pub enum Capability {
10    Ast,
11    TypeInfo,
12    ControlFlowGraph,
13    ErrorFlow,
14    CallSites,
15    ExceptionOrResult,
16    MacroAwareness,
17    SourceRewrite,
18    AsyncConcurrency,
19    GeneratedCodeAwareness,
20}
21
22impl Capability {
23    pub fn as_str(self) -> &'static str {
24        match self {
25            Self::Ast => "ast",
26            Self::TypeInfo => "type_info",
27            Self::ControlFlowGraph => "control_flow_graph",
28            Self::ErrorFlow => "error_flow",
29            Self::CallSites => "call_sites",
30            Self::ExceptionOrResult => "exception_or_result",
31            Self::MacroAwareness => "macro_awareness",
32            Self::SourceRewrite => "source_rewrite",
33            Self::AsyncConcurrency => "async_concurrency",
34            Self::GeneratedCodeAwareness => "generated_code_awareness",
35        }
36    }
37}
38
39#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
40pub struct CapabilitySet {
41    pub caps: BTreeSet<Capability>,
42}
43
44impl CapabilitySet {
45    pub fn new(caps: impl IntoIterator<Item = Capability>) -> Self {
46        Self {
47            caps: caps.into_iter().collect(),
48        }
49    }
50
51    pub fn contains(&self, c: Capability) -> bool {
52        self.caps.contains(&c)
53    }
54
55    pub fn is_superset_of(&self, required: &CapabilitySet) -> bool {
56        required.caps.is_subset(&self.caps)
57    }
58
59    pub fn rust_syn_default() -> Self {
60        Self::new([
61            Capability::Ast,
62            Capability::ErrorFlow,
63            Capability::CallSites,
64            Capability::ExceptionOrResult,
65            Capability::MacroAwareness,
66            Capability::AsyncConcurrency,
67            Capability::GeneratedCodeAwareness,
68            // Source rewrite only for unambiguous fixes
69            Capability::SourceRewrite,
70        ])
71    }
72}