Skip to content

Commit bc98064

Browse files
committed
updated the attribute AST to allow usage in @return
1 parent a9bc969 commit bc98064

File tree

9 files changed

+72
-15
lines changed

9 files changed

+72
-15
lines changed

crates/emmylua_code_analysis/src/compilation/analyzer/doc/type_ref_tags.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -234,15 +234,21 @@ pub fn analyze_return(analyzer: &mut DocAnalyzer, tag: LuaDocTagReturn) -> Optio
234234

235235
if let Some(closure) = find_owner_closure_or_report(analyzer, &tag) {
236236
let signature_id = LuaSignatureId::from_closure(analyzer.file_id, &closure);
237-
let returns = tag.get_type_and_name_list();
238-
for (doc_type, name_token) in returns {
237+
let returns = tag.get_info_list();
238+
for (doc_type, name_token, attribute_use_tag) in returns {
239239
let name = name_token.map(|name| name.get_name_text().to_string());
240240

241241
let type_ref = infer_type(analyzer, doc_type);
242+
let attributes = if let Some(attribute) = attribute_use_tag {
243+
infer_attribute_uses(analyzer, attribute)
244+
} else {
245+
None
246+
};
242247
let return_info = LuaDocReturnInfo {
243248
name,
244249
type_ref,
245250
description: description.clone(),
251+
attributes,
246252
};
247253

248254
let signature = analyzer

crates/emmylua_code_analysis/src/compilation/analyzer/lua/closure.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ fn analyze_return(
151151
type_ref: LuaType::Unknown,
152152
description: None,
153153
name: None,
154+
attributes: None,
154155
}]
155156
}
156157
Err(reason) => {
@@ -236,6 +237,7 @@ pub fn analyze_return_point(
236237
type_ref: return_type,
237238
description: None,
238239
name: None,
240+
attributes: None,
239241
}])
240242
}
241243

crates/emmylua_code_analysis/src/compilation/analyzer/unresolve/check_reason.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ pub fn resolve_as_any(db: &mut DbIndex, reason: &InferFailReason, loop_count: us
9797
name: None,
9898
type_ref: LuaType::Any,
9999
description: None,
100+
attributes: None,
100101
}];
101102
signature.resolve_return = SignatureReturnStatus::InferResolve;
102103
}

crates/emmylua_code_analysis/src/compilation/analyzer/unresolve/resolve_closure.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ pub fn try_resolve_closure_return(
172172
name: None,
173173
type_ref: ret_type.clone(),
174174
description: None,
175+
attributes: None,
175176
});
176177

177178
signature.resolve_return = SignatureReturnStatus::DocResolve;
@@ -482,6 +483,7 @@ fn resolve_doc_function(
482483
name: None,
483484
type_ref: doc_func.get_ret().clone(),
484485
description: None,
486+
attributes: None,
485487
});
486488
}
487489

crates/emmylua_code_analysis/src/db_index/signature/signature.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ pub struct LuaDocReturnInfo {
190190
pub name: Option<String>,
191191
pub type_ref: LuaType,
192192
pub description: Option<String>,
193+
pub attributes: Option<Vec<LuaAttributeUse>>,
193194
}
194195

195196
#[derive(Debug, Hash, Eq, PartialEq, Clone, Copy)]

crates/emmylua_ls/src/handlers/semantic_token/build_semantic_tokens.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -371,8 +371,8 @@ fn build_node_semantic_token(
371371
);
372372
}
373373
LuaAst::LuaDocTagReturn(doc_return) => {
374-
let type_name_list = doc_return.get_type_and_name_list();
375-
for (_, name) in type_name_list {
374+
let type_name_list = doc_return.get_info_list();
375+
for (_, name, _) in type_name_list {
376376
if let Some(name) = name {
377377
builder.push(name.syntax(), SemanticTokenType::VARIABLE);
378378
}

crates/emmylua_parser/src/grammar/doc/tag.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,17 +341,24 @@ fn parse_tag_param(p: &mut LuaDocParser) -> DocParseResult {
341341
// ---@return number
342342
// ---@return number, string
343343
// ---@return number <name> , this just compact luals
344+
// ---@return [attribute] number
344345
fn parse_tag_return(p: &mut LuaDocParser) -> DocParseResult {
345346
p.set_state(LuaDocLexerState::Normal);
346347
let m = p.mark(LuaSyntaxKind::DocTagReturn);
347348
p.bump();
349+
if p.current_token() == LuaTokenKind::TkLeftBracket {
350+
parse_tag_attribute_use(p, false)?;
351+
}
348352

349353
parse_type(p)?;
350354

351355
if_token_bump(p, LuaTokenKind::TkName);
352356

353357
while p.current_token() == LuaTokenKind::TkComma {
354358
p.bump();
359+
if p.current_token() == LuaTokenKind::TkLeftBracket {
360+
parse_tag_attribute_use(p, false)?;
361+
}
355362
parse_type(p)?;
356363
if_token_bump(p, LuaTokenKind::TkName);
357364
}

crates/emmylua_parser/src/grammar/doc/test.rs

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2937,21 +2937,22 @@ Syntax(Chunk)@0..105
29372937
}
29382938

29392939
#[test]
2940-
fn test_attribute_generic_param() {
2940+
fn test_attribute_embedded() {
29412941
let code = r#"
29422942
---@generic [attribute] T, [attribute] R
29432943
---@param [attribute] a number
2944+
---@return [attribute] number, [attribute] string
29442945
"#;
2945-
// print_ast(code);
2946+
print_ast(code);
29462947
// print_ast(r#"
29472948
// ---@class A<[attribute] T, [attribute] R>
29482949
// "#);
29492950
let result = r#"
2950-
Syntax(Chunk)@0..97
2951-
Syntax(Block)@0..97
2951+
Syntax(Chunk)@0..155
2952+
Syntax(Block)@0..155
29522953
Token(TkEndOfLine)@0..1 "\n"
29532954
Token(TkWhitespace)@1..9 " "
2954-
Syntax(Comment)@9..88
2955+
Syntax(Comment)@9..146
29552956
Token(TkDocStart)@9..13 "---@"
29562957
Syntax(DocTagGeneric)@13..49
29572958
Token(TkTagGeneric)@13..20 "generic"
@@ -2994,8 +2995,34 @@ Syntax(Chunk)@0..97
29942995
Token(TkWhitespace)@81..82 " "
29952996
Syntax(TypeName)@82..88
29962997
Token(TkName)@82..88 "number"
2997-
Token(TkEndOfLine)@88..89 "\n"
2998-
Token(TkWhitespace)@89..97 " "
2998+
Token(TkEndOfLine)@88..89 "\n"
2999+
Token(TkWhitespace)@89..97 " "
3000+
Token(TkDocStart)@97..101 "---@"
3001+
Syntax(DocTagReturn)@101..146
3002+
Token(TkTagReturn)@101..107 "return"
3003+
Token(TkWhitespace)@107..108 " "
3004+
Syntax(DocTagAttributeUse)@108..119
3005+
Token(TkLeftBracket)@108..109 "["
3006+
Syntax(DocAttributeUse)@109..118
3007+
Syntax(TypeName)@109..118
3008+
Token(TkName)@109..118 "attribute"
3009+
Token(TkRightBracket)@118..119 "]"
3010+
Token(TkWhitespace)@119..120 " "
3011+
Syntax(TypeName)@120..126
3012+
Token(TkName)@120..126 "number"
3013+
Token(TkComma)@126..127 ","
3014+
Token(TkWhitespace)@127..128 " "
3015+
Syntax(DocTagAttributeUse)@128..139
3016+
Token(TkLeftBracket)@128..129 "["
3017+
Syntax(DocAttributeUse)@129..138
3018+
Syntax(TypeName)@129..138
3019+
Token(TkName)@129..138 "attribute"
3020+
Token(TkRightBracket)@138..139 "]"
3021+
Token(TkWhitespace)@139..140 " "
3022+
Syntax(TypeName)@140..146
3023+
Token(TkName)@140..146 "string"
3024+
Token(TkEndOfLine)@146..147 "\n"
3025+
Token(TkWhitespace)@147..155 " "
29993026
"#;
30003027
assert_ast_eq!(code, result);
30013028
}

crates/emmylua_parser/src/syntax/node/doc/tag.rs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -534,32 +534,43 @@ impl LuaDocTagReturn {
534534
self.children()
535535
}
536536

537-
pub fn get_type_and_name_list(&self) -> Vec<(LuaDocType, Option<LuaNameToken>)> {
537+
pub fn get_info_list(
538+
&self,
539+
) -> Vec<(
540+
LuaDocType,
541+
Option<LuaNameToken>,
542+
Option<LuaDocTagAttributeUse>,
543+
)> {
538544
let mut result = Vec::new();
539545
let mut current_type = None;
540546
let mut current_name = None;
547+
let mut current_attribute = None;
541548
for child in self.syntax.children_with_tokens() {
542549
match child.kind() {
543550
LuaKind::Token(LuaTokenKind::TkComma) => {
544551
if let Some(type_) = current_type {
545-
result.push((type_, current_name));
552+
result.push((type_, current_name, current_attribute));
546553
}
547554
current_type = None;
548555
current_name = None;
556+
current_attribute = None;
549557
}
550558
LuaKind::Token(LuaTokenKind::TkName) => {
551559
current_name = Some(LuaNameToken::cast(child.into_token().unwrap()).unwrap());
552560
}
553561
k if LuaDocType::can_cast(k.into()) => {
554562
current_type = Some(LuaDocType::cast(child.into_node().unwrap()).unwrap());
555563
}
556-
564+
a if LuaDocTagAttributeUse::can_cast(a.into()) => {
565+
current_attribute =
566+
Some(LuaDocTagAttributeUse::cast(child.into_node().unwrap()).unwrap());
567+
}
557568
_ => {}
558569
}
559570
}
560571

561572
if let Some(type_) = current_type {
562-
result.push((type_, current_name));
573+
result.push((type_, current_name, current_attribute));
563574
}
564575

565576
result

0 commit comments

Comments
 (0)