Skip to content

Commit 94345fd

Browse files
authored
Merge pull request #514 from xuhuanzy/fix
update
2 parents a796be0 + 86ca4dd commit 94345fd

File tree

80 files changed

+3097
-1340
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+3097
-1340
lines changed

crates/emmylua_code_analysis/locales/lint.yml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,8 @@ Cannot use `...` outside a vararg function.:
169169
en: 'Cannot assign `%{value}` to `%{source}`. %{reason}'
170170
zh_CN: '不能将 `%{value}` 赋值给 `%{source}`。%{reason}'
171171
zh_HK: '不能將 `%{value}` 賦值給 `%{source}`。%{reason}'
172-
'The same file is duplicate requires.':
173-
en: 'The same file is duplicate requires.'
172+
'The same file is required multiple times.':
173+
en: 'The same file is required multiple times.'
174174
zh_CN: '同一个文件被重复 require。'
175175
zh_HK: '同一個文件被重複 require。'
176176
'Annotations specify that a return value is required here.':
@@ -241,10 +241,10 @@ Cannot use `...` outside a vararg function.:
241241
en: "Duplicate index `%{name}`."
242242
zh_CN: "重复定义的索引 `%{name}`."
243243
zh_HK: "重複定義的索引 `%{name}`."
244-
"the generic constraint must be a subclass of `%{source}`. %{reason}":
245-
en: "the generic constraint must be a subclass of `%{source}`. %{reason}"
246-
zh_CN: "泛型约束要求类型为 `%{source}` 子类。%{reason}"
247-
zh_HK: "泛型約束要求類型為 `%{source}` 子類。%{reason}"
244+
"type `%{found}` does not satisfy the constraint `%{source}`. %{reason}":
245+
en: "type `%{found}` does not satisfy the constraint `%{source}`. %{reason}"
246+
zh_CN: "泛型约束要求为 `%{source}` 的子类, 但找到了 `%{found}`. %{reason}"
247+
zh_HK: "泛型约束要求为 `%{source}` 的子类, 但找到了 `%{found}`. %{reason}"
248248
"the string template type does not match any type declaration":
249249
en: "the string template type does not match any type declaration"
250250
zh_CN: "字符串模板类型与任何类型声明不匹配"

crates/emmylua_code_analysis/resources/schema.json

Lines changed: 44 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,11 @@
119119
},
120120
"runtime": {
121121
"default": {
122+
"classDefaultCall": {
123+
"forceNonColon": false,
124+
"forceReturnSelf": false,
125+
"functionName": ""
126+
},
122127
"extensions": [],
123128
"frameworkVersions": [],
124129
"requireLikeFunction": [],
@@ -154,6 +159,7 @@
154159
"strict": {
155160
"default": {
156161
"arrayIndex": true,
162+
"docBaseConstMatchBaseType": true,
157163
"metaOverrideFileDefine": true,
158164
"requirePath": false,
159165
"typeCall": false
@@ -184,6 +190,26 @@
184190
}
185191
},
186192
"definitions": {
193+
"ClassDefaultCall": {
194+
"type": "object",
195+
"properties": {
196+
"forceNonColon": {
197+
"description": "Mandatory non`:` definition. When `function_name` is not empty, it takes effect.",
198+
"default": true,
199+
"type": "boolean"
200+
},
201+
"forceReturnSelf": {
202+
"description": "Force to return `self`.",
203+
"default": true,
204+
"type": "boolean"
205+
},
206+
"functionName": {
207+
"description": "class default overload function. eg. \"__init\".",
208+
"default": "",
209+
"type": "string"
210+
}
211+
}
212+
},
187213
"DiagnosticCode": {
188214
"oneOf": [
189215
{
@@ -241,13 +267,6 @@
241267
"redundant-parameter"
242268
]
243269
},
244-
{
245-
"description": "Inject field fail",
246-
"type": "string",
247-
"enum": [
248-
"inject-field-fail"
249-
]
250-
},
251270
{
252271
"description": "Unreachable code",
253272
"type": "string",
@@ -290,13 +309,6 @@
290309
"discard-returns"
291310
]
292311
},
293-
{
294-
"description": "Disable global define",
295-
"type": "string",
296-
"enum": [
297-
"disable-global-define"
298-
]
299-
},
300312
{
301313
"description": "Undefined field",
302314
"type": "string",
@@ -339,13 +351,6 @@
339351
"redefined-label"
340352
]
341353
},
342-
{
343-
"description": "Name Style check",
344-
"type": "string",
345-
"enum": [
346-
"name-style-check"
347-
]
348-
},
349354
{
350355
"description": "Code style check",
351356
"type": "string",
@@ -836,6 +841,19 @@
836841
"EmmyrcRuntime": {
837842
"type": "object",
838843
"properties": {
844+
"classDefaultCall": {
845+
"description": "class default overload function.",
846+
"default": {
847+
"forceNonColon": false,
848+
"forceReturnSelf": false,
849+
"functionName": ""
850+
},
851+
"allOf": [
852+
{
853+
"$ref": "#/definitions/ClassDefaultCall"
854+
}
855+
]
856+
},
839857
"extensions": {
840858
"description": "file Extensions. eg: .lua, .lua.txt",
841859
"default": [],
@@ -907,6 +925,11 @@
907925
"default": true,
908926
"type": "boolean"
909927
},
928+
"docBaseConstMatchBaseType": {
929+
"description": "Base constant types defined in doc can match base types, allowing int to match `---@alias id 1|2|3`, same for string.",
930+
"default": false,
931+
"type": "boolean"
932+
},
910933
"metaOverrideFileDefine": {
911934
"description": "meta define overrides file define",
912935
"default": true,

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ pub fn analyze_field(analyzer: &mut DocAnalyzer, tag: LuaDocTagField) -> Option<
5656
LuaSemanticDeclId::Member(member_id),
5757
),
5858
};
59-
6059
if nullable && !field_type.is_nullable() {
6160
field_type = TypeOps::Union.apply(analyzer.db, &field_type, &LuaType::Nil);
6261
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ use crate::{
1414
AnalyzeError, LuaAliasCallType, LuaFunctionType, LuaGenericType, LuaIndexAccessKey,
1515
LuaIntersectionType, LuaObjectType, LuaStringTplType, LuaTupleType, LuaType, LuaUnionType,
1616
},
17-
DiagnosticCode, GenericTpl, InFiled, LuaAliasCallKind, LuaMultiLineUnion, LuaTypeDeclId,
18-
TypeOps, VariadicType,
17+
DiagnosticCode, GenericTpl, InFiled, LuaAliasCallKind, LuaMultiLineUnion, LuaTupleStatus,
18+
LuaTypeDeclId, TypeOps, VariadicType,
1919
};
2020

2121
use super::{preprocess_description, DocAnalyzer};
@@ -82,7 +82,7 @@ pub fn infer_type(analyzer: &mut DocAnalyzer, node: LuaDocType) -> LuaType {
8282
}
8383
types.push(t);
8484
}
85-
return LuaType::Tuple(LuaTupleType::new(types).into());
85+
return LuaType::Tuple(LuaTupleType::new(types, LuaTupleStatus::DocResolve).into());
8686
}
8787
LuaDocType::Generic(generic_type) => {
8888
return infer_generic_type(analyzer, generic_type);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ pub fn infer_for_range_iter_expr_func(
118118
.iter()
119119
.filter_map(|overload_id| {
120120
let operator = operator_index.get_operator(overload_id)?;
121-
let func = operator.get_operator_func();
121+
let func = operator.get_operator_func(db);
122122
match func {
123123
LuaType::DocFunction(f) => Some(f.clone()),
124124
_ => None,

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use crate::{
2424
db_index::{DbIndex, LuaType},
2525
profile::Profile,
2626
semantic::infer_expr,
27-
FileId, InferFailReason,
27+
Emmyrc, FileId, InferFailReason,
2828
};
2929

3030
use super::AnalyzeContext;
@@ -101,6 +101,10 @@ impl LuaAnalyzer<'_> {
101101
context,
102102
}
103103
}
104+
105+
pub fn get_emmyrc(&self) -> &Emmyrc {
106+
self.db.get_emmyrc()
107+
}
104108
}
105109

106110
impl LuaAnalyzer<'_> {

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

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ use crate::{
99
unresolve::{UnResolveDecl, UnResolveMember},
1010
},
1111
db_index::{LuaDeclId, LuaMemberId, LuaMemberOwner, LuaType},
12-
InFiled, InferFailReason, LuaTypeCache, LuaTypeOwner,
12+
InFiled, InferFailReason, LuaOperator, LuaOperatorMetaMethod, LuaOperatorOwner, LuaTypeCache,
13+
LuaTypeOwner, OperatorFunction,
1314
};
1415

1516
use super::LuaAnalyzer;
@@ -417,6 +418,8 @@ pub fn analyze_func_stat(analyzer: &mut LuaAnalyzer, func_stat: LuaFuncStat) ->
417418
.get_type_index_mut()
418419
.bind_type(type_owner, LuaTypeCache::InferType(signature_type.clone()));
419420

421+
try_add_class_default_call(analyzer, func_name, signature_type);
422+
420423
Some(())
421424
}
422425

@@ -500,3 +503,56 @@ fn special_assign_pattern(
500503

501504
Some(())
502505
}
506+
507+
pub fn try_add_class_default_call(
508+
analyzer: &mut LuaAnalyzer,
509+
func_name: LuaVarExpr,
510+
signature_type: LuaType,
511+
) -> Option<()> {
512+
let LuaType::Signature(signature_id) = signature_type else {
513+
return None;
514+
};
515+
516+
let default_name = &analyzer
517+
.get_emmyrc()
518+
.runtime
519+
.class_default_call
520+
.function_name;
521+
522+
if default_name.is_empty() {
523+
return None;
524+
}
525+
if let LuaVarExpr::IndexExpr(index_expr) = func_name {
526+
let index_key = index_expr.get_index_key()?;
527+
if index_key.get_path_part() == *default_name {
528+
let prefix_expr = index_expr.get_prefix_expr()?;
529+
match analyzer.infer_expr(&prefix_expr.into()) {
530+
Ok(prefix_type) => match prefix_type {
531+
LuaType::Def(decl_id) => {
532+
// 如果已经存在, 则不添加
533+
let call = analyzer.db.get_operator_index().get_operators(
534+
&LuaOperatorOwner::Type(decl_id.clone()),
535+
LuaOperatorMetaMethod::Call,
536+
);
537+
if call.is_some() {
538+
return None;
539+
}
540+
541+
let operator = LuaOperator::new(
542+
decl_id.into(),
543+
LuaOperatorMetaMethod::Call,
544+
analyzer.file_id,
545+
index_expr.get_range(),
546+
OperatorFunction::DefaultCall(signature_id),
547+
);
548+
analyzer.db.get_operator_index_mut().add_operator(operator);
549+
}
550+
_ => {}
551+
},
552+
Err(_) => {}
553+
}
554+
}
555+
}
556+
557+
Some(())
558+
}

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

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,12 @@ pub fn check_reach_reason(
2121
| InferFailReason::RecursiveInfer => Some(true),
2222
InferFailReason::UnResolveDeclType(decl_id) => {
2323
let decl = db.get_decl_index().get_decl(decl_id)?;
24-
if decl.is_param() {
24+
let typ = db.get_type_index().get_type_cache(&decl_id.clone().into());
25+
if typ.is_none() && decl.is_param() {
2526
return Some(infer_param(db, decl).is_ok());
2627
}
2728

28-
Some(
29-
db.get_type_index()
30-
.get_type_cache(&decl_id.clone().into())
31-
.is_some(),
32-
)
29+
Some(typ.is_some())
3330
}
3431
InferFailReason::UnResolveMemberType(member_id) => {
3532
let member = db.get_member_index().get_member(member_id)?;
@@ -52,13 +49,14 @@ pub fn check_reach_reason(
5249
pub fn resolve_all_reason(
5350
db: &mut DbIndex,
5451
reason_unresolves: &mut HashMap<InferFailReason, Vec<UnResolve>>,
52+
loop_count: usize,
5553
) {
5654
for (reason, _) in reason_unresolves.iter_mut() {
57-
resolve_as_any(db, reason);
55+
resolve_as_any(db, reason, loop_count);
5856
}
5957
}
6058

61-
pub fn resolve_as_any(db: &mut DbIndex, reason: &InferFailReason) -> Option<()> {
59+
pub fn resolve_as_any(db: &mut DbIndex, reason: &InferFailReason, loop_count: usize) -> Option<()> {
6260
match reason {
6361
InferFailReason::None
6462
| InferFailReason::FieldNotFound
@@ -72,6 +70,10 @@ pub fn resolve_as_any(db: &mut DbIndex, reason: &InferFailReason) -> Option<()>
7270
);
7371
}
7472
InferFailReason::UnResolveMemberType(member_id) => {
73+
// 第一次循环不处理, 或许需要判断`unresolves`是否全为取值再跳过?
74+
if loop_count == 0 {
75+
return Some(());
76+
}
7577
let member = db.get_member_index().get_member(member_id)?;
7678
let key = member.get_key();
7779
let owner = db.get_member_index().get_current_owner(&member_id)?;

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use resolve::{
1919
try_resolve_module_ref, try_resolve_return_point, try_resolve_table_field,
2020
};
2121
use resolve_closure::{
22-
try_resolve_closure_params, try_resolve_closure_parent_params, try_resolve_closure_return,
22+
try_resolve_call_closure_params, try_resolve_closure_parent_params, try_resolve_closure_return,
2323
};
2424

2525
use super::{infer_manager::InferCacheManager, lua::LuaReturnPoint, AnalyzeContext};
@@ -50,7 +50,7 @@ pub fn analyze(db: &mut DbIndex, context: &mut AnalyzeContext) {
5050
infer_manager.set_force();
5151
}
5252

53-
resolve_all_reason(db, &mut reason_resolve);
53+
resolve_all_reason(db, &mut reason_resolve, loop_count);
5454

5555
if loop_count >= 5 {
5656
break;
@@ -179,7 +179,7 @@ fn try_resolve(
179179
try_resolve_return_point(db, cache, un_resolve_return)
180180
}
181181
UnResolve::ClosureParams(un_resolve_closure_params) => {
182-
try_resolve_closure_params(db, cache, un_resolve_closure_params)
182+
try_resolve_call_closure_params(db, cache, un_resolve_closure_params)
183183
}
184184
UnResolve::ClosureReturn(un_resolve_closure_return) => {
185185
try_resolve_closure_return(db, cache, un_resolve_closure_return)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ pub fn try_resolve_table_field(
100100
LuaType::IntegerConst(i) => LuaMemberKey::Integer(i),
101101
_ => {
102102
if field_type.is_table() {
103-
LuaMemberKey::Expr(field_type)
103+
LuaMemberKey::ExprType(field_type)
104104
} else {
105105
return Err(InferFailReason::None);
106106
}

0 commit comments

Comments
 (0)