early prototype of a language server

currently only provides hover info (but that's already quite useful for debugging)
This commit is contained in:
Mark
2023-12-05 23:04:17 +01:00
parent 8b60da8d99
commit 0759b769e0
42 changed files with 892 additions and 26 deletions

View File

@@ -1,5 +1,7 @@
use std::{fmt::Debug, path::PathBuf, sync::Arc};
use line_span::{LineSpan, LineSpanExt};
use crate::{
errors::{CheckError, SourcePos},
program::{self, parsed::block::Block},
@@ -306,9 +308,37 @@ impl Source {
}
pos
}
pub fn pos_from_og(&self, mut pos: usize, behind_comment: bool) -> usize {
for (start, comment) in &self.comments {
if *start + comment.len() <= pos {
pos -= comment.len();
} else if *start <= pos {
return if behind_comment {
*start + comment.len()
} else {
*start
};
} else {
break;
}
}
pos
}
pub fn src_og(&self) -> &String {
&self.src_og
}
/// If found, returns `Some((line_nr, line_str, byte_pos_in_line_may_be_out_of_string_bounds))`
pub fn get_line_and_char_from_pos_in_str(
byte_index: usize,
str: &str,
) -> Option<(usize, LineSpan<'_>, usize)> {
for (line, line_span) in str.line_spans().enumerate() {
if line_span.start() <= byte_index {
return Some((line, line_span, byte_index - line_span.start()));
}
}
None
}
}
impl Drop for Source {

View File

@@ -123,7 +123,7 @@ pub fn parse(
.msg(format!("EOF after `:=`"))
})?;
first = Box::new(program::parsed::init_to::InitTo {
pos_in_src: (pos_in_src, src.get_pos(), srca).into(),
pos_in_src: (first.source_range().start(), src.get_pos(), srca).into(),
target: first,
source,
});
@@ -133,7 +133,10 @@ pub fn parse(
src.next_word_allow_colon();
let source = parse(src, srca)?.ok_or_else(|| {
CheckError::new()
.src(vec![((pos_in_src, src.get_pos(), srca).into(), None)])
.src(vec![(
(first.source_range().start(), src.get_pos(), srca).into(),
None,
)])
.msg(format!("EOF after `=`"))
})?;
first = Box::new(program::parsed::assign_to::AssignTo {
@@ -155,7 +158,7 @@ pub fn parse(
Err(e) => return Err(e),
};
first = Box::new(program::parsed::function::Function {
pos_in_src: (pos_in_src, src.get_pos(), srca).into(),
pos_in_src: (first.source_range().start(), src.get_pos(), srca).into(),
arg: first,
run,
});