Compare commits

...

9 Commits

Author SHA1 Message Date
T0mstone
69f4cc90c5
Merge 01f73c35ed279d26678fe9c991ef55a0e44a1b76 into 0264534928864c7aed0466d670824ac0ce5ca1a8 2025-07-10 22:15:05 +02:00
Said A.
0264534928
Fix regression in reference autocomplete (#6586) 2025-07-10 15:02:23 +00:00
T0mstone
01f73c35ed Fix test spans for real
Haste is the enemy of correctness
2025-06-11 16:42:00 +02:00
T0mstone
fb0b01d45c Fix test spans 2025-06-11 16:37:03 +02:00
T0mstone
801b689dae Apply suggestions
Co-authored-by: Laurenz <laurmaedje@gmail.com>
2025-06-11 16:33:26 +02:00
T0mstone
d799a4207b Change test fix to empty content 2025-06-11 14:36:09 +02:00
T0mstone
72c219d24a Suppress warning in tests 2025-06-11 14:26:23 +02:00
T0mstone
ea3ca30a65 Merge branch 'main' into warn-last-show 2025-06-11 14:16:42 +02:00
T0mstone
a517a08d2f Warn on last show/set rule in block 2025-03-22 22:31:51 +01:00
5 changed files with 73 additions and 9 deletions

View File

@ -7,6 +7,7 @@ use typst_library::foundations::{
};
use typst_library::introspection::{Counter, State};
use typst_syntax::ast::{self, AstNode};
use typst_syntax::Span;
use typst_utils::singleton;
use crate::{CapturesVisitor, Eval, FlowEvent, Vm};
@ -284,8 +285,19 @@ impl Eval for ast::CodeBlock<'_> {
type Output = Value;
fn eval(self, vm: &mut Vm) -> SourceResult<Self::Output> {
let body = self.body();
match body.exprs().next_back() {
Some(expr @ ast::Expr::ShowRule(_)) => {
warn_for_useless_rule(&mut vm.engine, expr.span(), "show")
}
Some(expr @ ast::Expr::SetRule(_)) => {
warn_for_useless_rule(&mut vm.engine, expr.span(), "set")
}
_ => {}
}
vm.scopes.enter();
let output = self.body().eval(vm)?;
let output = body.eval(vm)?;
vm.scopes.exit();
Ok(output)
}
@ -393,3 +405,12 @@ fn warn_for_discarded_content(engine: &mut Engine, event: &FlowEvent, joined: &V
engine.sink.warn(warning);
}
/// Emits a warning when a set or show rule has no effect.
fn warn_for_useless_rule(engine: &mut Engine, span: Span, kind: &str) {
engine.sink.warn(warning!(
span,
"{kind} rule has no effect";
hint: "a {kind} rule is only in effect until the end of the surrounding code block"
));
}

View File

@ -130,7 +130,14 @@ fn complete_markup(ctx: &mut CompletionContext) -> bool {
return true;
}
// Start of a reference: "@|" or "@he|".
// Start of a reference: "@|".
if ctx.leaf.kind() == SyntaxKind::Text && ctx.before.ends_with("@") {
ctx.from = ctx.cursor;
ctx.label_completions();
return true;
}
// An existing reference: "@he|".
if ctx.leaf.kind() == SyntaxKind::RefMarker {
ctx.from = ctx.leaf.offset() + 1;
ctx.label_completions();
@ -1644,6 +1651,19 @@ mod tests {
test_with_doc(world, pos, doc.as_ref())
}
#[track_caller]
fn test_with_addition(
initial_text: &str,
addition: &str,
pos: impl FilePos,
) -> Response {
let mut world = TestWorld::new(initial_text);
let doc = typst::compile(&world).output.ok();
let end = world.main.text().len();
world.main.edit(end..end, addition);
test_with_doc(&world, pos, doc.as_ref())
}
#[track_caller]
fn test_with_doc(
world: impl WorldLike,
@ -1709,15 +1729,24 @@ mod tests {
.must_exclude(["bib"]);
}
#[test]
fn test_autocomplete_ref_function() {
test_with_addition("x<test>", " #ref(<)", -2).must_include(["test"]);
}
#[test]
fn test_autocomplete_ref_shorthand() {
test_with_addition("x<test>", " @", -1).must_include(["test"]);
}
#[test]
fn test_autocomplete_ref_shorthand_with_partial_identifier() {
test_with_addition("x<test>", " @te", -1).must_include(["test"]);
}
#[test]
fn test_autocomplete_ref_identical_labels_returns_single_completion() {
let mut world = TestWorld::new("x<test> y<test>");
let doc = typst::compile(&world).output.ok();
let end = world.main.text().len();
world.main.edit(end..end, " @t");
let result = test_with_doc(&world, -1, doc.as_ref());
let result = test_with_addition("x<test> y<test>", " @t", -1);
let completions = result.completions();
let label_count =
completions.iter().filter(|c| c.kind == CompletionKind::Label).count();

View File

@ -48,4 +48,5 @@
let n = query(<a>).len()
let fonts = ("nope", "Roboto")
set text(font: fonts.at(n))
[]
}

View File

@ -51,4 +51,5 @@ Hello
#context {
set document(author: "Changed") if "Normal" in document.author
set document(title: "Changed") if document.title == "Normal"
[]
}

View File

@ -0,0 +1,12 @@
--- warn-show-set-last-in-block ---
#{
// Warning: 3-16 show rule has no effect
// Hint: 3-16 a show rule is only in effect until the end of the surrounding code block
show "a": "b"
}
#{
// Warning: 3-17 set rule has no effect
// Hint: 3-17 a set rule is only in effect until the end of the surrounding code block
set text(blue)
}