use super::{RangeId, SymId};
use crate::{codec_enum, codec_struct};
#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct Scope {
pub containers: Vec<SymId>,
pub records: Vec<(u16, Binding)>,
pub files: Vec<SharedFile>,
pub areas: Vec<(u16, u16)>,
pub globals: Vec<Global>,
pub global_files: Vec<(u16, RangeId)>,
pub global_modes: [Option<RangeId>; 4],
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Binding {
External { name: SymId, size: u32 },
ExternalFile(u16),
Global { program: SymId, section: Section, name: SymId },
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Section {
WorkingStorage,
LocalStorage,
Linkage,
File,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct SharedFile {
pub file: u16,
pub external: bool,
pub declared_in: Option<SymId>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct Global {
pub section: Section,
pub name: SymId,
pub at: GlobalAt,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum GlobalAt {
Program(u32),
Local(u32),
Linkage(u16),
}
codec_struct!(Scope { containers, records, files, areas, globals, global_files, global_modes });
codec_enum!(Binding { External { name, size } = 0, ExternalFile(file) = 1, Global { program, section, name } = 2 });
codec_enum!(Section { WorkingStorage = 0, LocalStorage = 1, Linkage = 2, File = 3 });
codec_struct!(SharedFile { file, external, declared_in });
codec_struct!(Global { section, name, at });
codec_enum!(GlobalAt { Program(offset) = 0, Local(offset) = 1, Linkage(record) = 2 });