xrcf 0.8.0

eXtensible and Reusable Compiler Framework
Documentation
use crate::frontend::Parser;
use crate::frontend::ParserDispatch;
use crate::ir::Attribute;
use crate::ir::StringType;
use crate::ir::Type;
use crate::shared::Shared;
use std::fmt::Formatter;
use std::fmt::Result;

pub struct LinkageAttr {
    value: String,
}

impl Attribute for LinkageAttr {
    fn from_str(value: &str) -> Self {
        Self {
            value: value.to_string(),
        }
    }
    fn typ(&self) -> Shared<dyn Type> {
        Shared::new(StringType::new().into())
    }
    fn parse<T: ParserDispatch>(parser: &mut Parser<T>) -> Option<Self> {
        let next = parser.peek();
        if next.lexeme == "internal" {
            parser.advance();
            Some(Self::from_str("internal"))
        } else {
            Some(Self::from_str("external"))
        }
    }
    fn as_any(&self) -> &dyn std::any::Any {
        self
    }
    fn value(&self) -> String {
        self.value.clone()
    }
    fn display(&self, f: &mut Formatter<'_>) -> Result {
        write!(f, "{}", self.value)
    }
}