From ba12d5e3b11e04999a8d97c1b077f9a3c6b5c575 Mon Sep 17 00:00:00 2001 From: Dominik Nakamura Date: Wed, 21 Feb 2024 16:14:52 +0900 Subject: [PATCH] feat: track more element locations of import statements Only the keyword location was repoted as semantic token (in the LSP), but more information was already available which is now properly added to the token list. --- crates/mabo-compiler/src/resolve/mod.rs | 2 +- crates/mabo-compiler/src/simplify.rs | 5 ++++- crates/mabo-compiler/src/validate/names.rs | 2 +- crates/mabo-lsp/src/handlers/document_symbols.rs | 11 +++++------ crates/mabo-lsp/src/handlers/semantic_tokens.rs | 10 +++++++++- crates/mabo-parser/src/lib.rs | 6 +++--- crates/mabo-parser/src/parser/imports.rs | 6 +++--- crates/mabo-parser/src/parser/types.rs | 5 ++--- .../snapshots/parser__parse@import_basic.mabo.snap | 9 ++++++--- 9 files changed, 34 insertions(+), 22 deletions(-) diff --git a/crates/mabo-compiler/src/resolve/mod.rs b/crates/mabo-compiler/src/resolve/mod.rs index 50ca7bd..a9a5897 100644 --- a/crates/mabo-compiler/src/resolve/mod.rs +++ b/crates/mabo-compiler/src/resolve/mod.rs @@ -192,7 +192,7 @@ impl Module<'_> { })? }; - if let Some(element) = import.element.as_ref() { + if let Some((_, element)) = import.element.as_ref() { let definition = module .types .iter() diff --git a/crates/mabo-compiler/src/simplify.rs b/crates/mabo-compiler/src/simplify.rs index 2972623..193fb36 100644 --- a/crates/mabo-compiler/src/simplify.rs +++ b/crates/mabo-compiler/src/simplify.rs @@ -500,7 +500,10 @@ fn simplify_import<'a>(item: &'a mabo_parser::Import<'_>) -> Import<'a> { Import { source: item, segments: item.segments.iter().map(mabo_parser::Name::get).collect(), - element: item.element.as_ref().map(|element| element.get().into()), + element: item + .element + .as_ref() + .map(|(_,element)| element.get().into()), } } diff --git a/crates/mabo-compiler/src/validate/names.rs b/crates/mabo-compiler/src/validate/names.rs index 9244099..2ad1fbb 100644 --- a/crates/mabo-compiler/src/validate/names.rs +++ b/crates/mabo-compiler/src/validate/names.rs @@ -140,7 +140,7 @@ pub(crate) fn validate_names_in_module(value: &[Definition<'_>]) -> Result<(), D Definition::TypeAlias(a) => &a.name, Definition::Const(c) => &c.name, Definition::Import(Import { - element: Some(name), + element: Some((_, name)), .. }) => name, Definition::Import(Import { segments, .. }) => segments.last()?, diff --git a/crates/mabo-lsp/src/handlers/document_symbols.rs b/crates/mabo-lsp/src/handlers/document_symbols.rs index 10af696..2567687 100644 --- a/crates/mabo-lsp/src/handlers/document_symbols.rs +++ b/crates/mabo-lsp/src/handlers/document_symbols.rs @@ -133,12 +133,11 @@ fn visit_import(index: &Index, item: &Import<'_>) -> Result { let mut name = item.segments[0].get().to_owned(); let mut span = Range::from(item.segments[0].span()); - for segment in item - .segments - .iter() - .skip(1) - .chain(std::iter::once(&item.element).flatten()) - { + for segment in item.segments.iter().skip(1).chain( + std::iter::once(&item.element) + .flatten() + .map(|(_, element)| element), + ) { let _ = write!(&mut name, "::{segment}"); span.end = Range::from(segment.span()).end; } diff --git a/crates/mabo-lsp/src/handlers/semantic_tokens.rs b/crates/mabo-lsp/src/handlers/semantic_tokens.rs index b05fc44..9ec687f 100644 --- a/crates/mabo-lsp/src/handlers/semantic_tokens.rs +++ b/crates/mabo-lsp/src/handlers/semantic_tokens.rs @@ -469,6 +469,14 @@ impl<'a> Visitor<'a> { } fn visit_import(&mut self, item: &Import<'_>) -> Result<()> { - self.add_span(&item.keyword, &types::KEYWORD, &[]) + self.add_span(&item.keyword, &types::KEYWORD, &[])?; + for segment in &item.segments { + self.add_span(segment, &types::NAMESPACE, &[])?; + } + if let Some((token, element)) = &item.element { + self.add_span(token, &types::DOUBLE_COLON, &[])?; + self.add_span(element, &types::TYPE, &[])?; + } + Ok(()) } } diff --git a/crates/mabo-parser/src/lib.rs b/crates/mabo-parser/src/lib.rs index 86a74ac..8f3b148 100644 --- a/crates/mabo-parser/src/lib.rs +++ b/crates/mabo-parser/src/lib.rs @@ -1284,7 +1284,7 @@ pub struct Import<'a> { pub segments: Vec>, /// Optional final element that allows to fully import the type, making it look as it would be /// defined in the current schema. - pub element: Option>, + pub element: Option<(token::DoubleColon, Name<'a>)>, /// Trailing semicolon to complete the definition. pub semicolon: token::Semicolon, } @@ -1309,8 +1309,8 @@ impl Print for Import<'_> { f.write_str(segment.get())?; } - if let Some(element) = element { - write!(f, "::{element}")?; + if let Some((token, element)) = element { + write!(f, "{token}{element}")?; } write!(f, "{semicolon}") diff --git a/crates/mabo-parser/src/parser/imports.rs b/crates/mabo-parser/src/parser/imports.rs index 4b7370c..b13b770 100644 --- a/crates/mabo-parser/src/parser/imports.rs +++ b/crates/mabo-parser/src/parser/imports.rs @@ -3,7 +3,7 @@ use std::ops::Range; use mabo_derive::{ParserError, ParserErrorCause}; use winnow::{ ascii::space1, - combinator::{alt, cut_err, opt, preceded, separated, terminated}, + combinator::{alt, cut_err, opt, separated, terminated}, error::ErrorKind, stream::{Location, Stream}, token::{one_of, take_while}, @@ -74,8 +74,8 @@ pub(super) fn parse<'i>(input: &mut Input<'i>) -> Result, ParseError> cut_err(( ( separated(1.., parse_segment, token::DoubleColon::VALUE.span()), - opt(preceded( - token::DoubleColon::VALUE.span(), + opt(( + token::DoubleColon::VALUE.span().output_into(), alt(( structs::parse_name.map_err(Cause::from), enums::parse_name.map_err(Cause::from), diff --git a/crates/mabo-parser/src/parser/types.rs b/crates/mabo-parser/src/parser/types.rs index d05cdb7..35ad3af 100644 --- a/crates/mabo-parser/src/parser/types.rs +++ b/crates/mabo-parser/src/parser/types.rs @@ -225,9 +225,8 @@ fn parse_external<'i>(input: &mut Input<'i>) -> Result, Cause> 1.., ( imports::parse_segment.map_err(Cause::from), - token::DoubleColon::VALUE.span(), - ) - .map(|(segment, token)| (segment, token.into())), + token::DoubleColon::VALUE.span().output_into(), + ), )) .map(Option::unwrap_or_default), parse_external_name, diff --git a/crates/mabo-parser/tests/snapshots/parser__parse@import_basic.mabo.snap b/crates/mabo-parser/tests/snapshots/parser__parse@import_basic.mabo.snap index c17a0f3..8d73aea 100644 --- a/crates/mabo-parser/tests/snapshots/parser__parse@import_basic.mabo.snap +++ b/crates/mabo-parser/tests/snapshots/parser__parse@import_basic.mabo.snap @@ -27,9 +27,12 @@ Schema { }, ], element: Some( - Name { - value: "Sample", - }, + ( + DoubleColon, + Name { + value: "Sample", + }, + ), ), semicolon: Semicolon, },