Skip to content

Commit 74cd8b7

Browse files
committed
support lua5.5 grammar
1 parent 9f3f60b commit 74cd8b7

File tree

16 files changed

+201
-13
lines changed

16 files changed

+201
-13
lines changed

crates/emmylua_code_analysis/src/compilation/analyzer/decl/exprs.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,12 @@ fn analyze_closure_params(
199199
.get_signature_index_mut()
200200
.get_or_create(*signature_id);
201201
let params = closure.get_params_list()?.get_params();
202+
let mut is_vararg = false;
202203
for param in params {
204+
if param.is_dots() {
205+
is_vararg = true;
206+
}
207+
203208
let name = if let Some(name_token) = param.get_name_token() {
204209
name_token.get_name_text().to_string()
205210
} else if param.is_dots() {
@@ -211,6 +216,8 @@ fn analyze_closure_params(
211216
signature.params.push(name);
212217
}
213218

219+
signature.is_vararg = is_vararg;
220+
214221
Some(())
215222
}
216223

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ pub fn analyze_field(analyzer: &mut DocAnalyzer, tag: LuaDocTagField) -> Option<
101101
OperatorFunction::Func(Arc::new(LuaFunctionType::new(
102102
AsyncState::None,
103103
false,
104+
false,
104105
vec![
105106
(
106107
"self".to_string(),
@@ -194,6 +195,7 @@ pub fn analyze_operator(analyzer: &mut DocAnalyzer, tag: LuaDocTagOperator) -> O
194195
OperatorFunction::Func(Arc::new(LuaFunctionType::new(
195196
AsyncState::None,
196197
false,
198+
false,
197199
operands,
198200
return_type,
199201
))),

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -476,10 +476,12 @@ fn infer_func_type(analyzer: &mut DocAnalyzer, func: &LuaDocFuncType) -> LuaType
476476
}
477477

478478
let mut params_result = Vec::new();
479+
let mut is_variadic = false;
479480
for param in func.get_params() {
480481
let name = if let Some(param) = param.get_name_token() {
481482
param.get_name_text().to_string()
482483
} else if param.is_dots() {
484+
is_variadic = true;
483485
"...".to_string()
484486
} else {
485487
continue;
@@ -546,7 +548,14 @@ fn infer_func_type(analyzer: &mut DocAnalyzer, func: &LuaDocFuncType) -> LuaType
546548
};
547549

548550
LuaType::DocFunction(
549-
LuaFunctionType::new(async_state, is_colon, params_result, return_type).into(),
551+
LuaFunctionType::new(
552+
async_state,
553+
is_colon,
554+
is_variadic,
555+
params_result,
556+
return_type,
557+
)
558+
.into(),
550559
)
551560
}
552561

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,7 @@ fn resolve_closure_member_type(
395395
&LuaFunctionType::new(
396396
signature.async_state,
397397
signature.is_colon_define,
398+
signature.is_vararg,
398399
final_params,
399400
final_ret,
400401
),

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ impl LuaOperator {
143143
let func_type = LuaFunctionType::new(
144144
signature.async_state,
145145
is_colon_define,
146+
signature.is_vararg,
146147
params,
147148
return_type,
148149
);

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

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ pub struct LuaSignature {
2424
pub is_colon_define: bool,
2525
pub async_state: AsyncState,
2626
pub nodiscard: Option<LuaNoDiscard>,
27+
pub is_vararg: bool,
2728
}
2829

2930
#[derive(Debug, Clone, PartialEq, Eq)]
@@ -50,6 +51,7 @@ impl LuaSignature {
5051
is_colon_define: false,
5152
async_state: AsyncState::None,
5253
nodiscard: None,
54+
is_vararg: false,
5355
}
5456
}
5557

@@ -157,8 +159,14 @@ impl LuaSignature {
157159
pub fn to_doc_func_type(&self) -> Arc<LuaFunctionType> {
158160
let params = self.get_type_params();
159161
let return_type = self.get_return_type();
160-
let func_type =
161-
LuaFunctionType::new(self.async_state, self.is_colon_define, params, return_type);
162+
let is_vararg = self.is_vararg;
163+
let func_type = LuaFunctionType::new(
164+
self.async_state,
165+
self.is_colon_define,
166+
is_vararg,
167+
params,
168+
return_type,
169+
);
162170
Arc::new(func_type)
163171
}
164172

@@ -169,7 +177,8 @@ impl LuaSignature {
169177
}
170178

171179
let return_type = self.get_return_type();
172-
let func_type = LuaFunctionType::new(self.async_state, false, params, return_type);
180+
let func_type =
181+
LuaFunctionType::new(self.async_state, false, self.is_vararg, params, return_type);
173182
Arc::new(func_type)
174183
}
175184
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -635,6 +635,7 @@ impl From<LuaTupleType> for LuaType {
635635
pub struct LuaFunctionType {
636636
async_state: AsyncState,
637637
is_colon_define: bool,
638+
is_variadic: bool,
638639
params: Vec<(String, Option<LuaType>)>,
639640
ret: LuaType,
640641
}
@@ -657,12 +658,14 @@ impl LuaFunctionType {
657658
pub fn new(
658659
async_state: AsyncState,
659660
is_colon_define: bool,
661+
is_variadic: bool,
660662
params: Vec<(String, Option<LuaType>)>,
661663
ret: LuaType,
662664
) -> Self {
663665
Self {
664666
async_state,
665667
is_colon_define,
668+
is_variadic,
666669
params,
667670
ret,
668671
}
@@ -684,6 +687,10 @@ impl LuaFunctionType {
684687
&self.ret
685688
}
686689

690+
pub fn is_variadic(&self) -> bool {
691+
self.is_variadic
692+
}
693+
687694
pub fn get_variadic_ret(&self) -> VariadicType {
688695
if let LuaType::Variadic(variadic) = &self.ret {
689696
return variadic.deref().clone();

crates/emmylua_code_analysis/src/semantic/generic/instantiate_type/mod.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ pub fn instantiate_doc_function(
115115
let tpl_ret = doc_func.get_ret();
116116
let async_state = doc_func.get_async_state();
117117
let colon_define = doc_func.is_colon_define();
118+
let mut is_variadic = doc_func.is_variadic();
118119

119120
let mut new_params = Vec::new();
120121
for origin_param in tpl_func_params.iter() {
@@ -142,6 +143,7 @@ pub fn instantiate_doc_function(
142143
}
143144
continue;
144145
}
146+
is_variadic = true;
145147
new_params.push((
146148
"...".to_string(),
147149
Some(LuaType::Variadic(
@@ -150,7 +152,8 @@ pub fn instantiate_doc_function(
150152
));
151153
}
152154
SubstitutorValue::Params(params) => {
153-
for param in params {
155+
for (i, param) in params.iter().enumerate() {
156+
is_variadic = i + 1 == params.len() && param.0 == "...";
154157
new_params.push(param.clone());
155158
}
156159
}
@@ -161,6 +164,7 @@ pub fn instantiate_doc_function(
161164
}
162165
}
163166
_ => {
167+
is_variadic = true;
164168
new_params.push((
165169
"...".to_string(),
166170
Some(LuaType::Variadic(
@@ -212,7 +216,14 @@ pub fn instantiate_doc_function(
212216
}
213217

214218
LuaType::DocFunction(
215-
LuaFunctionType::new(async_state, colon_define, new_params, inst_ret_type).into(),
219+
LuaFunctionType::new(
220+
async_state,
221+
colon_define,
222+
is_variadic,
223+
new_params,
224+
inst_ret_type,
225+
)
226+
.into(),
216227
)
217228
}
218229

crates/emmylua_code_analysis/src/semantic/infer/infer_call/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ pub fn infer_call_expr_func(
106106
LuaFunctionType::new(
107107
func_ty.get_async_state(),
108108
func_ty.is_colon_define(),
109+
func_ty.is_variadic(),
109110
func_ty.get_params().to_vec(),
110111
new_ret,
111112
)
@@ -185,6 +186,7 @@ fn infer_signature_doc_function(
185186
let mut fake_doc_function = LuaFunctionType::new(
186187
signature.async_state,
187188
signature.is_colon_define,
189+
signature.is_vararg,
188190
signature.get_type_params(),
189191
signature.get_return_type(),
190192
);
@@ -198,6 +200,7 @@ fn infer_signature_doc_function(
198200
let fake_doc_function = Arc::new(LuaFunctionType::new(
199201
signature.async_state,
200202
signature.is_colon_define,
203+
signature.is_vararg,
201204
signature.get_type_params(),
202205
signature.get_return_type(),
203206
));
@@ -458,6 +461,7 @@ fn infer_union(
458461
let mut fake_doc_function = LuaFunctionType::new(
459462
signature.async_state,
460463
signature.is_colon_define,
464+
signature.is_vararg,
461465
signature.get_type_params(),
462466
signature.get_return_type(),
463467
);

crates/emmylua_code_analysis/src/semantic/infer/infer_doc_type.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -400,10 +400,12 @@ fn infer_unary_type(ctx: DocTypeInferContext<'_>, unary_type: &LuaDocUnaryType)
400400

401401
fn infer_func_type(ctx: DocTypeInferContext<'_>, func: &LuaDocFuncType) -> LuaType {
402402
let mut params_result = Vec::new();
403+
let mut is_variadic = false;
403404
for param in func.get_params() {
404405
let name = if let Some(param) = param.get_name_token() {
405406
param.get_name_text().to_string()
406407
} else if param.is_dots() {
408+
is_variadic = true;
407409
"...".to_string()
408410
} else {
409411
continue;
@@ -458,7 +460,14 @@ fn infer_func_type(ctx: DocTypeInferContext<'_>, func: &LuaDocFuncType) -> LuaTy
458460
};
459461

460462
LuaType::DocFunction(
461-
LuaFunctionType::new(async_state, is_colon, params_result, return_type).into(),
463+
LuaFunctionType::new(
464+
async_state,
465+
is_colon,
466+
is_variadic,
467+
params_result,
468+
return_type,
469+
)
470+
.into(),
462471
)
463472
}
464473

0 commit comments

Comments
 (0)