Show inlay hints for label references

See #753.
This commit is contained in:
Patrick Förster 2023-08-02 20:59:24 +02:00
parent 78d2b25860
commit 3949b5afe6
2 changed files with 26 additions and 6 deletions

View file

@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
### Added
- Show inlay hints for label references ([#753](https://github.com/latex-lsp/texlab/issues/753))
## [5.8.0] - 2023-07-30
### Added

View file

@ -1,24 +1,30 @@
use base_db::{
semantics::tex::LabelKind,
util::{render_label, RenderedObject},
semantics::tex::{Label, LabelKind},
util::{queries, render_label, RenderedLabel, RenderedObject},
DocumentData,
};
use super::InlayHintBuilder;
pub(super) fn find_hints(builder: &mut InlayHintBuilder) -> Option<()> {
let DocumentData::Tex(data) = &builder.document.data else { return None };
let DocumentData::Tex(data) = &builder.document.data else {
return None;
};
let range = builder.range;
for label in data
.semantics
.labels
.iter()
.filter(|label| label.kind == LabelKind::Definition)
.filter(|label| label.name.range.intersect(range).is_some())
{
let Some(rendered) = render_label(builder.workspace, &builder.project, label) else { continue };
let Some(number) = &rendered.number else { continue };
let Some(rendered) = find_and_render(builder, &label.name.text) else {
continue;
};
let Some(number) = &rendered.number else {
continue;
};
let text = match &rendered.object {
RenderedObject::Section { prefix, .. } => {
@ -39,3 +45,11 @@ pub(super) fn find_hints(builder: &mut InlayHintBuilder) -> Option<()> {
Some(())
}
fn find_and_render<'a>(builder: &InlayHintBuilder<'a>, name: &str) -> Option<RenderedLabel<'a>> {
let project = &builder.project;
queries::objects_with_name::<Label>(project, name)
.map(|(_, label)| label)
.find(|label| label.kind == LabelKind::Definition)
.and_then(|label| render_label(builder.workspace, project, label))
}