mirror of
https://github.com/Dummi26/mers.git
synced 2025-12-16 03:57:50 +01:00
early prototype of a language server
currently only provides hover info (but that's already quite useful for debugging)
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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,
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user