pub mod rust;
pub mod semantic;
use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Position {
pub line: usize,
pub column: usize,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Range {
pub start: Position,
pub end: Position,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Severity {
Error,
Warning,
Info,
Hint,
}
#[derive(Debug, Clone)]
pub struct Diagnostic {
pub severity: Severity,
pub message: String,
pub range: Option<Range>,
}
impl fmt::Display for Diagnostic {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let severity = match self.severity {
Severity::Error => "error",
Severity::Warning => "warning",
Severity::Info => "info",
Severity::Hint => "hint",
};
if let Some(range) = &self.range {
write!(
f,
"{}: {} ({}:{} - {}:{})",
severity,
self.message,
range.start.line,
range.start.column,
range.end.line,
range.end.column
)
} else {
write!(f, "{}: {}", severity, self.message)
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SymbolKind {
Function,
Struct,
Enum,
Trait,
Module,
Const,
Static,
Type,
Impl,
Macro,
Variable,
}
#[derive(Debug, Clone)]
pub struct Symbol {
pub kind: SymbolKind,
pub name: String,
pub range: Range,
pub detail: Option<String>,
}
#[derive(Debug, Clone)]
pub struct CompletionItem {
pub label: String,
pub kind: SymbolKind,
pub detail: Option<String>,
pub documentation: Option<String>,
}
#[derive(Debug, Clone)]
pub struct TypeInfo {
pub name: String,
pub full_name: String,
pub documentation: Option<String>,
}
#[derive(Debug, Clone)]
pub struct HoverInfo {
pub range: Range,
pub contents: String,
pub type_info: Option<TypeInfo>,
}
#[derive(Debug, Clone)]
pub struct Reference {
pub range: Range,
pub is_definition: bool,
}
#[derive(Debug, Clone)]
pub struct SignatureHelp {
pub label: String,
pub documentation: Option<String>,
pub parameters: Vec<ParameterInfo>,
pub active_parameter: Option<usize>,
}
#[derive(Debug, Clone)]
pub struct ParameterInfo {
pub label: String,
pub documentation: Option<String>,
}
pub trait Judge {
fn diagnostics(&self, source: &str) -> Vec<Diagnostic>;
fn symbols(&self, source: &str) -> Result<Vec<Symbol>, String>;
fn symbol_at_position(
&self,
source: &str,
position: Position,
) -> Result<Option<Symbol>, String>;
fn completions(
&self,
source: &str,
position: Position,
) -> Result<Vec<CompletionItem>, String>;
fn format(&self, source: &str) -> Result<String, String>;
}
pub trait SemanticJudge: Judge {
fn hover(
&self,
source: &str,
position: Position,
) -> Result<Option<HoverInfo>, String>;
fn type_at_position(
&self,
source: &str,
position: Position,
) -> Result<Option<TypeInfo>, String>;
fn find_references(
&self,
source: &str,
position: Position,
) -> Result<Vec<Reference>, String>;
fn goto_definition(
&self,
source: &str,
position: Position,
) -> Result<Option<Range>, String>;
fn signature_help(
&self,
source: &str,
position: Position,
) -> Result<Option<SignatureHelp>, String>;
fn infer_type(
&self,
source: &str,
position: Position,
) -> Result<Option<String>, String>;
}