use std::collections::BTreeMap;
use std::path::PathBuf;
use serde::{Deserialize, Serialize};
use super::TypeExpr;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct Span {
pub start: u32,
pub end: u32,
}
impl From<rowan::TextRange> for Span {
fn from(range: rowan::TextRange) -> Self {
Span {
start: range.start().into(),
end: range.end().into(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct DefLocation {
pub file: PathBuf,
pub range: Span,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct PackageIndex {
pub name: String,
pub root: ModuleIndex,
pub members: Vec<PathBuf>,
pub member_modules: BTreeMap<PathBuf, Vec<String>>,
pub diagnostics: Vec<HarvestDiagnostic>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ModuleIndex {
pub name: String,
pub bare: bool,
pub loc: DefLocation,
pub exports: Vec<ExportedName>,
pub functions: Vec<FunctionGroup>,
pub types: Vec<TypeDef>,
pub consts: Vec<ConstDef>,
pub macros: Vec<MacroDef>,
pub submodules: Vec<ModuleIndex>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ExportedName {
pub name: String,
pub visibility: Visibility,
pub loc: DefLocation,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum Visibility {
Exported,
Public,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct FunctionGroup {
pub name: String,
pub owner: Option<Vec<String>>,
pub methods: Vec<Method>,
pub doc: Option<Docstring>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Method {
pub params: Vec<Param>,
pub keyword_params: Vec<Param>,
pub where_clauses: Vec<TypeExpr>,
pub return_type: Option<TypeExpr>,
pub has_body: bool,
pub doc: Option<Docstring>,
pub loc: DefLocation,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct Param {
pub name: Option<String>,
pub type_annotation: Option<TypeExpr>,
pub default: Option<String>,
pub is_vararg: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct TypeDef {
pub name: String,
pub kind: TypeKind,
pub type_params: Vec<TypeExpr>,
pub supertype: Option<TypeExpr>,
pub fields: Vec<Field>,
pub doc: Option<Docstring>,
pub loc: DefLocation,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum TypeKind {
Struct { mutable: bool },
Abstract,
Primitive { bits: Option<String> },
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Field {
pub name: String,
pub type_annotation: Option<TypeExpr>,
pub default: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ConstDef {
pub name: String,
pub value_repr: Option<String>,
pub doc: Option<Docstring>,
pub loc: DefLocation,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct MacroDef {
pub name: String,
pub params: Vec<Param>,
pub doc: Option<Docstring>,
pub loc: DefLocation,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Docstring {
pub text: String,
pub loc: DefLocation,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum HarvestDiagnostic {
EntryFileMissing { path: PathBuf },
ReadError { path: PathBuf, message: String },
IncludeCycle { path: PathBuf },
UnresolvedInclude { raw: String, from: PathBuf },
ParseError { path: PathBuf, count: usize },
}