mod query;
use core::fmt;
use core::num::NonZeroUsize;
pub(crate) use self::query::{MissingId, Query, QueryInner};
use crate as rune;
use crate::alloc::path::PathBuf;
use crate::alloc::prelude::*;
use crate::alloc::{self, Box, Vec};
use crate::ast;
use crate::ast::{Span, Spanned};
use crate::compile::ir;
use crate::compile::{ItemId, ItemMeta, Location, ModId};
use crate::hash::Hash;
use crate::hir;
use crate::indexing;
use crate::parse::NonZeroId;
use crate::runtime::format;
#[derive(Debug, TryClone, Clone, Copy)]
#[try_clone(copy)]
pub(crate) enum Used {
Unused,
Used,
}
impl Used {
pub(crate) fn is_unused(self) -> bool {
matches!(self, Self::Unused)
}
}
impl Default for Used {
fn default() -> Self {
Self::Used
}
}
pub(crate) struct Named<'ast> {
pub(crate) module: ModId,
pub(crate) item: ItemId,
pub(crate) trailing: usize,
pub(crate) parameters: [Option<(
&'ast dyn Spanned,
&'ast ast::AngleBracketed<ast::PathSegmentExpr, T![,]>,
)>; 2],
}
impl fmt::Display for Named<'_> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt::Display::fmt(&self.item, f)
}
}
#[allow(clippy::large_enum_variant)]
pub(crate) enum BuiltInMacro {
Template(BuiltInTemplate),
Format(BuiltInFormat),
File(BuiltInFile),
Line(BuiltInLine),
}
#[derive(Spanned)]
pub(crate) struct BuiltInTemplate {
#[rune(span)]
pub(crate) span: Span,
pub(crate) from_literal: bool,
pub(crate) exprs: Vec<ast::Expr>,
}
#[derive(Spanned)]
pub(crate) struct BuiltInFormat {
#[rune(span)]
pub(crate) span: Span,
pub(crate) fill: Option<char>,
pub(crate) align: Option<format::Alignment>,
pub(crate) width: Option<NonZeroUsize>,
pub(crate) precision: Option<NonZeroUsize>,
pub(crate) flags: Option<format::Flags>,
pub(crate) format_type: Option<format::Type>,
pub(crate) value: ast::Expr,
}
#[derive(Debug, TryClone, Clone, Copy, PartialEq, Eq, Spanned)]
#[try_clone(copy)]
pub(crate) struct BuiltInFile {
pub(crate) value: ast::Lit,
}
#[derive(Debug, TryClone, Clone, Copy, PartialEq, Eq, Spanned)]
#[try_clone(copy)]
pub(crate) struct BuiltInLine {
pub(crate) value: ast::Lit,
}
#[derive(Debug, TryClone)]
pub(crate) enum Build {
Function(indexing::Function),
Closure(indexing::Closure),
AsyncBlock(indexing::AsyncBlock),
Unused,
Import(indexing::Import),
ReExport,
Query,
}
#[derive(Debug, TryClone)]
pub(crate) struct BuildEntry {
pub(crate) item_meta: ItemMeta,
pub(crate) build: Build,
}
pub(crate) struct QueryImplFn {
pub(crate) ast: Box<ast::ItemFn>,
}
pub(crate) struct ItemImplEntry {
pub(crate) path: Box<ast::Path>,
pub(crate) location: Location,
pub(crate) id: NonZeroId,
pub(crate) root: Option<PathBuf>,
pub(crate) nested_item: Option<Span>,
pub(crate) macro_depth: usize,
}
#[derive(Debug, TryClone, Clone, Copy)]
#[try_clone(copy)]
pub(crate) struct QueryPath {
pub(crate) module: ModId,
pub(crate) impl_item: Option<NonZeroId>,
pub(crate) item: ItemId,
}
pub(crate) struct ConstFn<'hir> {
pub(crate) item_meta: ItemMeta,
pub(crate) ir_fn: ir::IrFn,
#[allow(unused)]
pub(crate) hir: hir::ItemFn<'hir>,
}
#[derive(Default)]
pub(crate) struct GenericsParameters {
pub(crate) trailing: usize,
pub(crate) parameters: [Option<Hash>; 2],
}
impl GenericsParameters {
pub(crate) fn is_empty(&self) -> bool {
self.parameters.iter().all(|p| p.is_none())
}
pub(crate) fn as_boxed(&self) -> alloc::Result<Box<[Option<Hash>]>> {
self.parameters.iter().copied().try_collect()
}
}
impl AsRef<GenericsParameters> for GenericsParameters {
#[inline]
fn as_ref(&self) -> &GenericsParameters {
self
}
}