Skip to content

Commit 53b6439

Browse files
committed
support sync fun()
1 parent fabb6b5 commit 53b6439

File tree

23 files changed

+215
-139
lines changed

23 files changed

+215
-139
lines changed

crates/emmylua_code_analysis/resources/std/global.lua

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ function pairs(t) end
245245
--- `pcall` also returns all results from the call, after this first result. In
246246
--- case of any error, `pcall` returns **false** plus the error message.
247247
---@generic T, R, R1
248-
---@param f fun(...: T...): R1, R...
248+
---@param f sync fun(...: T...): R1, R...
249249
---@param ... T...
250250
---@return boolean, R1|string, R...
251251
function pcall(f, ...) end
@@ -443,7 +443,7 @@ _VERSION = "Lua 5.4"
443443
--- This function is similar to `pcall`, except that it sets a new message
444444
--- handler `msgh`.
445445
---@generic T, R
446-
---@param f fun(...:T...): R...
446+
---@param f sync fun(...:T...): R...
447447
---@param msgh fun(err:string):void
448448
---@param ... T...
449449
---@return boolean, R...

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ use emmylua_parser::{
66
};
77

88
use crate::{
9-
AnalyzeError, DiagnosticCode, LuaFunctionType, LuaMemberFeature, LuaMemberId, LuaSignatureId,
10-
LuaTypeCache, OperatorFunction, TypeOps,
9+
AnalyzeError, AsyncState, DiagnosticCode, LuaFunctionType, LuaMemberFeature, LuaMemberId,
10+
LuaSignatureId, LuaTypeCache, OperatorFunction, TypeOps,
1111
compilation::analyzer::doc::preprocess_description,
1212
db_index::{
1313
LuaMember, LuaMemberKey, LuaMemberOwner, LuaOperator, LuaOperatorMetaMethod,
@@ -95,7 +95,7 @@ pub fn analyze_field(analyzer: &mut DocAnalyzer, tag: LuaDocTagField) -> Option<
9595
analyzer.file_id,
9696
range,
9797
OperatorFunction::Func(Arc::new(LuaFunctionType::new(
98-
false,
98+
AsyncState::None,
9999
false,
100100
vec![
101101
(
@@ -188,7 +188,7 @@ pub fn analyze_operator(analyzer: &mut DocAnalyzer, tag: LuaDocTagOperator) -> O
188188
analyzer.file_id,
189189
name_token.get_range(),
190190
OperatorFunction::Func(Arc::new(LuaFunctionType::new(
191-
false,
191+
AsyncState::None,
192192
false,
193193
operands,
194194
return_type,

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use rowan::TextRange;
1010
use smol_str::SmolStr;
1111

1212
use crate::{
13-
DiagnosticCode, GenericTpl, InFiled, LuaAliasCallKind, LuaArrayLen, LuaArrayType,
13+
AsyncState, DiagnosticCode, GenericTpl, InFiled, LuaAliasCallKind, LuaArrayLen, LuaArrayType,
1414
LuaMultiLineUnion, LuaTupleStatus, LuaTypeDeclId, TypeOps, VariadicType,
1515
db_index::{
1616
AnalyzeError, LuaAliasCallType, LuaFunctionType, LuaGenericType, LuaIndexAccessKey,
@@ -478,7 +478,13 @@ fn infer_func_type(analyzer: &mut DocAnalyzer, func: &LuaDocFuncType) -> LuaType
478478
}
479479
}
480480

481-
let is_async = func.is_async();
481+
let async_state = if func.is_async() {
482+
AsyncState::Async
483+
} else if func.is_sync() {
484+
AsyncState::Sync
485+
} else {
486+
AsyncState::None
487+
};
482488

483489
let mut is_colon = false;
484490
if let Some(parent) = func.get_parent::<LuaAst>() {
@@ -506,7 +512,7 @@ fn infer_func_type(analyzer: &mut DocAnalyzer, func: &LuaDocFuncType) -> LuaType
506512
};
507513

508514
LuaType::DocFunction(
509-
LuaFunctionType::new(is_async, is_colon, params_result, return_type).into(),
515+
LuaFunctionType::new(async_state, is_colon, params_result, return_type).into(),
510516
)
511517
}
512518

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::{
2-
LuaDeclId, LuaExport, LuaExportScope, LuaNoDiscard, LuaSemanticDeclId, LuaSignatureId,
2+
AsyncState, LuaDeclId, LuaExport, LuaExportScope, LuaNoDiscard, LuaSemanticDeclId,
3+
LuaSignatureId,
34
};
45

56
use super::{
@@ -110,7 +111,7 @@ pub fn analyze_async(analyzer: &mut DocAnalyzer, tag: LuaDocTagAsync) -> Option<
110111
.get_signature_index_mut()
111112
.get_mut(&signature_id)?;
112113

113-
signature.is_async = true;
114+
signature.async_state = AsyncState::Async;
114115

115116
Some(())
116117
}

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

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,22 +50,22 @@ pub fn try_resolve_call_closure_params(
5050
_ => {}
5151
}
5252

53-
let (is_async, params_to_insert) = if let Some(param_type) =
53+
let (async_state, params_to_insert) = if let Some(param_type) =
5454
call_doc_func.get_params().get(param_idx)
5555
{
5656
let Some(param_type) = get_real_type(db, &param_type.1.as_ref().unwrap_or(&LuaType::Any))
5757
else {
5858
return Ok(());
5959
};
6060
match param_type {
61-
LuaType::DocFunction(func) => (func.is_async(), func.get_params().to_vec()),
61+
LuaType::DocFunction(func) => (func.get_async_state(), func.get_params().to_vec()),
6262
LuaType::Union(union_types) => {
6363
if let Some(LuaType::DocFunction(func)) = union_types
6464
.into_vec()
6565
.iter()
6666
.find(|typ| matches!(typ, LuaType::DocFunction(_)))
6767
{
68-
(func.is_async(), func.get_params().to_vec())
68+
(func.get_async_state(), func.get_params().to_vec())
6969
} else {
7070
return Ok(());
7171
}
@@ -98,7 +98,7 @@ pub fn try_resolve_call_closure_params(
9898
);
9999
}
100100

101-
signature.is_async = is_async;
101+
signature.async_state = async_state;
102102

103103
Ok(())
104104
}
@@ -394,7 +394,7 @@ fn resolve_closure_member_type(
394394
db,
395395
closure_params,
396396
&LuaFunctionType::new(
397-
signature.is_async,
397+
signature.async_state,
398398
signature.is_colon_define,
399399
final_params,
400400
final_ret,
@@ -437,9 +437,7 @@ fn resolve_doc_function(
437437
.get_mut(&closure_params.signature_id)
438438
.ok_or(InferFailReason::None)?;
439439

440-
if doc_func.is_async() {
441-
signature.is_async = true;
442-
}
440+
signature.async_state = doc_func.get_async_state();
443441

444442
let mut doc_params = doc_func.get_params().to_vec();
445443
// doc_func 是往上追溯的有效签名, signature 是未解析的签名

crates/emmylua_code_analysis/src/db_index/operators/lua_operator.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ impl LuaOperator {
141141
signature.get_return_type()
142142
};
143143
let func_type = LuaFunctionType::new(
144-
signature.is_async,
144+
signature.async_state,
145145
is_colon_define,
146146
params,
147147
return_type,
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
2+
pub enum AsyncState {
3+
None,
4+
Async,
5+
Sync,
6+
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1+
mod async_state;
2+
mod signature;
3+
14
use std::collections::{HashMap, HashSet};
25

6+
pub use async_state::AsyncState;
37
pub use signature::{
48
LuaDocParamInfo, LuaDocReturnInfo, LuaNoDiscard, LuaSignature, LuaSignatureId,
59
SignatureReturnStatus,
@@ -9,8 +13,6 @@ use crate::FileId;
913

1014
use super::traits::LuaIndex;
1115

12-
mod signature;
13-
1416
#[derive(Debug)]
1517
pub struct LuaSignatureIndex {
1618
signatures: HashMap<LuaSignatureId, LuaSignature>,

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use std::{collections::HashMap, sync::Arc};
66
use emmylua_parser::{LuaAstNode, LuaClosureExpr, LuaDocFuncType};
77
use rowan::TextSize;
88

9+
use crate::db_index::signature::async_state::AsyncState;
910
use crate::{
1011
FileId,
1112
db_index::{LuaFunctionType, LuaType},
@@ -21,7 +22,7 @@ pub struct LuaSignature {
2122
pub return_docs: Vec<LuaDocReturnInfo>,
2223
pub resolve_return: SignatureReturnStatus,
2324
pub is_colon_define: bool,
24-
pub is_async: bool,
25+
pub async_state: AsyncState,
2526
pub nodiscard: Option<LuaNoDiscard>,
2627
}
2728

@@ -41,7 +42,7 @@ impl LuaSignature {
4142
return_docs: Vec::new(),
4243
resolve_return: SignatureReturnStatus::UnResolve,
4344
is_colon_define: false,
44-
is_async: false,
45+
async_state: AsyncState::None,
4546
nodiscard: None,
4647
}
4748
}
@@ -157,7 +158,7 @@ impl LuaSignature {
157158
let params = self.get_type_params();
158159
let return_type = self.get_return_type();
159160
let func_type =
160-
LuaFunctionType::new(self.is_async, self.is_colon_define, params, return_type);
161+
LuaFunctionType::new(self.async_state, self.is_colon_define, params, return_type);
161162
Arc::new(func_type)
162163
}
163164

@@ -168,7 +169,7 @@ impl LuaSignature {
168169
}
169170

170171
let return_type = self.get_return_type();
171-
let func_type = LuaFunctionType::new(self.is_async, false, params, return_type);
172+
let func_type = LuaFunctionType::new(self.async_state, false, params, return_type);
172173
Arc::new(func_type)
173174
}
174175
}

crates/emmylua_code_analysis/src/db_index/type/humanize_type.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@ use std::collections::HashSet;
33
use itertools::Itertools;
44

55
use crate::{
6-
DbIndex, GenericTpl, LuaAliasCallType, LuaFunctionType, LuaGenericType, LuaInstanceType,
7-
LuaIntersectionType, LuaMemberKey, LuaMemberOwner, LuaObjectType, LuaSignatureId,
8-
LuaStringTplType, LuaTupleType, LuaType, LuaTypeDeclId, LuaUnionType, VariadicType,
6+
AsyncState, DbIndex, GenericTpl, LuaAliasCallType, LuaFunctionType, LuaGenericType,
7+
LuaInstanceType, LuaIntersectionType, LuaMemberKey, LuaMemberOwner, LuaObjectType,
8+
LuaSignatureId, LuaStringTplType, LuaTupleType, LuaType, LuaTypeDeclId, LuaUnionType,
9+
VariadicType,
910
};
1011

1112
use super::{LuaAliasCallKind, LuaMultiLineUnion};
@@ -359,10 +360,10 @@ fn humanize_doc_function_type(
359360
return "fun(...) -> ...".to_string();
360361
}
361362

362-
let prev = if lua_func.is_async() {
363-
"async fun"
364-
} else {
365-
"fun"
363+
let prev = match lua_func.get_async_state() {
364+
AsyncState::None => "fun",
365+
AsyncState::Async => "async fun",
366+
AsyncState::Sync => "sync fun",
366367
};
367368
let params = lua_func
368369
.get_params()

0 commit comments

Comments
 (0)