mod action;
mod dump;
mod event;
mod rule;
mod validate;
mod value;
pub mod error;
pub use action::{Action, IfBranch, ModifyOp};
pub use event::{Event, EventTarget, EventTeam, PlayerEventKind};
pub use rule::{Rule, WorkshopSubroutine, WorkshopVariable};
pub use value::{Value, ValueNode};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CensusCapabilityKind {
Variable,
PlayerVariable,
Subroutine,
ControlFlow,
String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct CensusCapability {
pub kind: CensusCapabilityKind,
pub name: &'static str,
}
pub const CENSUS_CAPABILITIES: &[CensusCapability] = &[
CensusCapability {
kind: CensusCapabilityKind::Variable,
name: "global",
},
CensusCapability {
kind: CensusCapabilityKind::PlayerVariable,
name: "player",
},
CensusCapability {
kind: CensusCapabilityKind::Subroutine,
name: "declaration-and-call",
},
CensusCapability {
kind: CensusCapabilityKind::ControlFlow,
name: "if",
},
CensusCapability {
kind: CensusCapabilityKind::ControlFlow,
name: "else-if",
},
CensusCapability {
kind: CensusCapabilityKind::ControlFlow,
name: "else",
},
CensusCapability {
kind: CensusCapabilityKind::ControlFlow,
name: "while",
},
CensusCapability {
kind: CensusCapabilityKind::ControlFlow,
name: "for-global-variable",
},
CensusCapability {
kind: CensusCapabilityKind::String,
name: "custom-string",
},
];
use crate::core::arena::Arena;
use crate::core::ids::Id;
use crate::core::source::SourceFile;
pub type GlobalVarId = Id<WorkshopVariable>;
pub type PlayerVarId = Id<WorkshopVariable>;
pub type SubroutineId = Id<WorkshopSubroutine>;
pub type RuleId = Id<Rule>;
pub type ActionId = Id<Action>;
pub type ValueId = Id<ValueNode>;
#[derive(Debug, Clone)]
pub struct Program {
pub files: Arena<SourceFile>,
pub settings: Option<crate::settings::Settings>,
pub global_variables: Arena<WorkshopVariable>,
pub player_variables: Arena<WorkshopVariable>,
pub subroutines: Arena<WorkshopSubroutine>,
pub rules: Arena<Rule>,
pub values: Arena<ValueNode>,
pub actions: Arena<Action>,
}
impl Default for Program {
fn default() -> Self {
Program {
files: Arena::new(),
settings: None,
global_variables: Arena::new(),
player_variables: Arena::new(),
subroutines: Arena::new(),
rules: Arena::new(),
values: Arena::new(),
actions: Arena::new(),
}
}
}
impl Program {
pub fn add_file(&mut self, file: SourceFile) -> crate::source::FileId {
let id = self.files.push(file);
self.files.get_mut(id).unwrap().bind_file(id);
id
}
pub fn source(&self, file: crate::source::FileId) -> Option<&crate::source::SourceDocument> {
self.files.get(file).and_then(SourceFile::source)
}
pub fn validate(&self) -> Result<(), error::IrError> {
validate::validate(self)
}
pub fn semantic_issues(
&self,
catalog: &crate::catalog::Catalog,
) -> Vec<crate::analysis::semantic::SemanticIssue> {
crate::analysis::semantic::inspect_wir(self, catalog)
}
pub fn dump(&self) -> String {
dump::dump(self)
}
}