use crate::typechecker::{CheckedType, TypeCtx};
use crate::Generic;
use crate::{Context, InstrKind, Instruction, ObjectInstance, TypeCheck};
#[derive(Clone)]
pub enum CommentKind {
Shebang,
SingleLine,
MultiLine,
}
#[derive(Clone)]
pub enum ExtraKind {
Comment(CommentKind),
WhiteSpace,
}
#[derive(Clone)]
pub struct ExtraContent {
kind: ExtraKind,
content: String,
}
impl ExtraContent {
pub fn new(kind: ExtraKind, content: String) -> ExtraContent {
ExtraContent { kind, content }
}
pub fn new_shebang(content: String) -> ExtraContent {
ExtraContent::new(ExtraKind::Comment(CommentKind::Shebang), content)
}
pub fn new_single_line(content: String) -> ExtraContent {
ExtraContent::new(ExtraKind::Comment(CommentKind::SingleLine), content)
}
pub fn new_multi_line(content: String) -> ExtraContent {
ExtraContent::new(ExtraKind::Comment(CommentKind::MultiLine), content)
}
pub fn new_whitespaces(content: String) -> ExtraContent {
ExtraContent::new(ExtraKind::WhiteSpace, content)
}
}
impl Instruction for ExtraContent {
fn execute(&self, ctx: &mut Context) -> Option<ObjectInstance> {
None
}
fn kind(&self) -> InstrKind {
InstrKind::Statement
}
fn print(&self) -> String {
let result = self.content.clone();
match self.kind {
ExtraKind::WhiteSpace => result,
ExtraKind::Comment(CommentKind::Shebang) => format!("#{}", result),
ExtraKind::Comment(CommentKind::SingleLine) => format!("//{}", result),
ExtraKind::Comment(CommentKind::MultiLine) => format!("/*{}*/", result),
}
}
}
impl TypeCheck for ExtraContent {
fn resolve_type(&mut self, _ctx: &mut TypeCtx) -> CheckedType {
CheckedType::Void
}
}
impl Generic for ExtraContent {}