Skip to content

Commit 0bd02ef

Browse files
committed
Optimize the handling of table and region in document symbols
1 parent b99c855 commit 0bd02ef

File tree

2 files changed

+76
-2
lines changed

2 files changed

+76
-2
lines changed
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
use emmylua_parser::{LuaAstNode, LuaComment, LuaTokenKind};
2+
use lsp_types::SymbolKind;
3+
use rowan::NodeOrToken;
4+
5+
use super::builder::{DocumentSymbolBuilder, LuaSymbol};
6+
7+
pub fn build_doc_region_symbol(
8+
builder: &mut DocumentSymbolBuilder,
9+
comment: LuaComment,
10+
) -> Option<()> {
11+
let mut region_token = None;
12+
for child in comment.syntax().children_with_tokens() {
13+
if let NodeOrToken::Token(token) = child {
14+
if token.kind() == LuaTokenKind::TkDocRegion.into() {
15+
region_token = Some(token);
16+
break;
17+
}
18+
}
19+
}
20+
21+
let region_token = match region_token {
22+
Some(token) => token,
23+
None => return Some(()),
24+
};
25+
26+
let description = comment
27+
.get_description()
28+
.map(|desc| desc.get_description_text())
29+
.map(|text| {
30+
text.lines()
31+
.next()
32+
.map(|line| line.trim())
33+
.unwrap_or_default()
34+
.to_string()
35+
})
36+
.filter(|text| !text.is_empty())
37+
.unwrap_or_else(|| "region".to_string());
38+
39+
let range = comment.get_range();
40+
let selection_range = region_token.text_range();
41+
let symbol = LuaSymbol::with_selection_range(
42+
description,
43+
None,
44+
SymbolKind::NAMESPACE,
45+
range,
46+
selection_range,
47+
);
48+
49+
builder.add_node_symbol(comment.syntax().clone(), symbol);
50+
51+
Some(())
52+
}

crates/emmylua_ls/src/handlers/document_symbol/mod.rs

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
mod builder;
2+
mod comment;
23
mod expr;
34
mod stats;
45

6+
use std::collections::HashSet;
7+
58
use builder::{DocumentSymbolBuilder, LuaSymbol};
69
use emmylua_code_analysis::SemanticModel;
7-
use emmylua_parser::{LuaAst, LuaAstNode, LuaChunk};
10+
use emmylua_parser::{LuaAst, LuaAstNode, LuaChunk, LuaExpr, LuaTableExpr};
811
use expr::{build_closure_expr_symbol, build_table_symbol};
912
use lsp_types::{
1013
ClientCapabilities, DocumentSymbol, DocumentSymbolOptions, DocumentSymbolParams,
@@ -20,6 +23,7 @@ use tokio_util::sync::CancellationToken;
2023
use crate::context::ServerContextSnapshot;
2124

2225
use super::RegisterCapabilities;
26+
use comment::build_doc_region_symbol;
2327

2428
pub async fn on_document_symbol(
2529
context: ServerContextSnapshot,
@@ -59,12 +63,25 @@ fn build_child_document_symbols(
5963
builder: &mut DocumentSymbolBuilder,
6064
root: &LuaChunk,
6165
) -> Option<()> {
66+
let mut skip_table_exprs: HashSet<LuaTableExpr> = HashSet::new();
67+
6268
for child in root.descendants::<LuaAst>() {
6369
match child {
6470
LuaAst::LuaLocalStat(local_stat) => {
71+
for value_expr in local_stat.get_value_exprs() {
72+
if let LuaExpr::TableExpr(table_expr) = value_expr {
73+
skip_table_exprs.insert(table_expr);
74+
}
75+
}
6576
build_local_stat_symbol(builder, local_stat);
6677
}
6778
LuaAst::LuaAssignStat(assign_stat) => {
79+
let (_, exprs) = assign_stat.get_var_and_expr_list();
80+
for expr in exprs {
81+
if let LuaExpr::TableExpr(table_expr) = expr {
82+
skip_table_exprs.insert(table_expr);
83+
}
84+
}
6885
build_assign_stat_symbol(builder, assign_stat);
6986
}
7087
LuaAst::LuaForStat(for_stat) => {
@@ -83,7 +100,12 @@ fn build_child_document_symbols(
83100
build_closure_expr_symbol(builder, closure);
84101
}
85102
LuaAst::LuaTableExpr(table) => {
86-
build_table_symbol(builder, table);
103+
if !skip_table_exprs.contains(&table) {
104+
build_table_symbol(builder, table);
105+
}
106+
}
107+
LuaAst::LuaComment(comment) => {
108+
build_doc_region_symbol(builder, comment);
87109
}
88110
LuaAst::LuaIfStat(if_stat) => {
89111
build_if_stat_symbol(builder, if_stat);

0 commit comments

Comments
 (0)