Skip to content

Commit

Permalink
fix a bug in lsp spans for multiline strings
Browse files Browse the repository at this point in the history
  • Loading branch information
kaikalii committed Jun 14, 2024
1 parent 65db2cf commit 0a382a4
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 16 deletions.
2 changes: 1 addition & 1 deletion src/ast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ pub enum Word {
Number(String, f64),
Char(String),
String(String),
MultilineString(String),
MultilineString(Vec<Sp<String>>),
FormatString(Vec<String>),
MultilineFormatString(Vec<Sp<Vec<String>>>),
Label(String),
Expand Down
20 changes: 19 additions & 1 deletion src/compile/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -961,7 +961,25 @@ code:
}
self.push_instr(instr);
}
Word::String(s) | Word::MultilineString(s) => {
Word::String(s) => {
let mut instr = Instr::push(s);
if !call {
instr = Instr::PushFunc(self.make_function(
FunctionId::Anonymous(word.span.clone()),
Signature::new(0, 1),
eco_vec![instr],
));
}
self.push_instr(instr);
}
Word::MultilineString(lines) => {
let mut s = EcoVec::new();
for (i, line) in lines.into_iter().enumerate() {
if i > 0 {
s.push('\n');
}
s.extend(line.value.chars());
}
let mut instr = Instr::push(s);
if !call {
instr = Instr::PushFunc(self.make_function(
Expand Down
5 changes: 3 additions & 2 deletions src/format.rs
Original file line number Diff line number Diff line change
Expand Up @@ -793,13 +793,14 @@ impl<'a> Formatter<'a> {
Word::Char(_) | Word::String(_) | Word::Label(_) | Word::FormatString(_) => self
.output
.push_str(&self.inputs.get(&word.span.src)[word.span.byte_range()]),
Word::MultilineString(s) => {
Word::MultilineString(lines) => {
let curr_line_pos = if self.output.ends_with('\n') {
0
} else {
(self.output.split('\n').last().unwrap_or_default().chars()).count()
};
for (i, mut line) in s.split('\n').enumerate() {
for (i, line) in lines.iter().enumerate() {
let mut line = line.value.as_str();
if line.ends_with('\r') {
line = &line[..line.len() - 1];
}
Expand Down
18 changes: 11 additions & 7 deletions src/lsp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -308,11 +308,13 @@ impl Spanner {
}
spans.push(word.span.clone().sp(SpanKind::Number))
}
Word::Char(_)
| Word::String(_)
| Word::MultilineString(_)
| Word::FormatString(_) => spans.push(word.span.clone().sp(SpanKind::String)),
Word::Char(_) | Word::String(_) | Word::FormatString(_) => {
spans.push(word.span.clone().sp(SpanKind::String))
}
Word::Label(_) => spans.push(word.span.clone().sp(SpanKind::Label)),
Word::MultilineString(lines) => {
spans.extend((lines.iter()).map(|line| line.span.clone().sp(SpanKind::String)))
}
Word::MultilineFormatString(lines) => {
spans.extend((lines.iter()).map(|line| line.span.clone().sp(SpanKind::String)))
}
Expand Down Expand Up @@ -1276,13 +1278,15 @@ mod server {
} else {
start.character
};
tokens.push(SemanticToken {
let length = span.end.char_pos - span.start.char_pos;
let token = SemanticToken {
delta_line: start.line - prev_line,
delta_start,
length: (span.end.char_pos - span.start.char_pos),
length,
token_type,
token_modifiers_bitset: 0,
});
};
tokens.push(token);
prev_line = start.line;
prev_char = start.character;
}
Expand Down
9 changes: 4 additions & 5 deletions src/parse.rs
Original file line number Diff line number Diff line change
Expand Up @@ -877,13 +877,12 @@ impl<'i> Parser<'i> {
frags.map(Word::FormatString)
} else if let Some(line) = self.next_token_map(Token::as_multiline_string) {
let mut span = line.span.clone();
let mut s = line.value;
let mut lines = vec![line];
while let Some(line) = self.next_token_map(Token::as_multiline_string) {
span = span.merge(line.span);
s.push('\n');
s.push_str(&line.value);
span = span.merge(line.span.clone());
lines.push(line);
}
span.sp(Word::MultilineString(s))
span.sp(Word::MultilineString(lines))
} else if let Some(line) = self.next_token_map(Token::as_multiline_format_string) {
let start = line.span.clone();
let mut end = start.clone();
Expand Down

0 comments on commit 0a382a4

Please sign in to comment.