Skip to content

Commit 5292397

Browse files
committed
refactor member key
1 parent 885833e commit 5292397

File tree

7 files changed

+87
-61
lines changed

7 files changed

+87
-61
lines changed

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

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -197,9 +197,12 @@ pub fn analyze_table_expr(analyzer: &mut DeclAnalyzer, table_expr: LuaTableExpr)
197197

198198
for field in table_expr.get_fields() {
199199
if let Some(field_key) = field.get_field_key() {
200-
let key: LuaMemberKey = field_key.clone().into();
201-
if key.is_none() {
202-
if let Some(field_expr) = field_key.get_expr() {
200+
let key: LuaMemberKey = match field_key {
201+
LuaIndexKey::Name(name) => LuaMemberKey::Name(name.get_name_text().into()),
202+
LuaIndexKey::String(str) => LuaMemberKey::Name(str.get_value().into()),
203+
LuaIndexKey::Integer(i) => LuaMemberKey::Integer(i.get_int_value()),
204+
LuaIndexKey::Idx(idx) => LuaMemberKey::Integer(idx as i64),
205+
LuaIndexKey::Expr(field_expr) => {
203206
let unresolve_member = UnResolveTableField {
204207
file_id: analyzer.get_file_id(),
205208
table_expr: table_expr.clone(),
@@ -208,9 +211,9 @@ pub fn analyze_table_expr(analyzer: &mut DeclAnalyzer, table_expr: LuaTableExpr)
208211
reason: InferFailReason::UnResolveExpr(field_expr.clone()),
209212
};
210213
analyzer.add_unresolved(unresolve_member.into());
214+
continue;
211215
}
212-
continue;
213-
}
216+
};
214217

215218
analyzer.db.get_reference_index_mut().add_index_reference(
216219
key.clone(),

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

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use emmylua_parser::{
22
LuaAssignStat, LuaAstNode, LuaAstToken, LuaExpr, LuaForRangeStat, LuaForStat, LuaFuncStat,
3-
LuaIndexExpr, LuaLocalFuncStat, LuaLocalStat, LuaSyntaxId, LuaSyntaxKind, LuaVarExpr,
3+
LuaIndexExpr, LuaIndexKey, LuaLocalFuncStat, LuaLocalStat, LuaSyntaxId, LuaSyntaxKind,
4+
LuaVarExpr,
45
};
56

67
use crate::{
@@ -95,10 +96,15 @@ pub fn analyze_assign_stat(analyzer: &mut DeclAnalyzer, stat: LuaAssignStat) ->
9596
}
9697
LuaVarExpr::IndexExpr(index_expr) => {
9798
let index_key = index_expr.get_index_key()?;
98-
let key: LuaMemberKey = index_key.into();
99-
if key.is_none() {
100-
continue;
101-
}
99+
let key: LuaMemberKey = match index_key {
100+
LuaIndexKey::Name(name) => LuaMemberKey::Name(name.get_name_text().into()),
101+
LuaIndexKey::String(str) => LuaMemberKey::Name(str.get_value().into()),
102+
LuaIndexKey::Integer(i) => LuaMemberKey::Integer(i.get_int_value()),
103+
LuaIndexKey::Idx(idx) => LuaMemberKey::Integer(idx as i64),
104+
LuaIndexKey::Expr(_) => {
105+
continue;
106+
}
107+
};
102108

103109
let file_id = analyzer.get_file_id();
104110
let member_id = LuaMemberId::new(index_expr.get_syntax_id(), file_id);
@@ -238,10 +244,15 @@ pub fn analyze_func_stat(analyzer: &mut DeclAnalyzer, stat: LuaFuncStat) -> Opti
238244
}
239245
LuaVarExpr::IndexExpr(index_expr) => {
240246
let index_key = index_expr.get_index_key()?;
241-
let key: LuaMemberKey = index_key.into();
242-
if key.is_none() {
243-
return None;
244-
}
247+
let key: LuaMemberKey = match index_key {
248+
LuaIndexKey::Name(name) => LuaMemberKey::Name(name.get_name_text().into()),
249+
LuaIndexKey::String(str) => LuaMemberKey::Name(str.get_value().into()),
250+
LuaIndexKey::Integer(i) => LuaMemberKey::Integer(i.get_int_value()),
251+
LuaIndexKey::Idx(idx) => LuaMemberKey::Integer(idx as i64),
252+
LuaIndexKey::Expr(_) => {
253+
return None;
254+
}
255+
};
245256

246257
let file_id = analyzer.get_file_id();
247258
let member_id = LuaMemberId::new(index_expr.get_syntax_id(), file_id);

crates/emmylua_code_analysis/src/db_index/member/lua_member.rs

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
use std::ops::Deref;
2+
13
use emmylua_parser::{LuaDocFieldKey, LuaIndexKey, LuaSyntaxId, LuaSyntaxKind};
24
use rowan::{TextRange, TextSize};
35
use serde::{Deserialize, Serialize};
46
use smol_str::SmolStr;
57

68
use super::lua_member_feature::LuaMemberFeature;
7-
use crate::{FileId, GlobalId, LuaType};
9+
use crate::{infer_expr, DbIndex, FileId, GlobalId, InferFailReason, LuaInferCache, LuaType};
810

911
#[derive(Debug)]
1012
pub struct LuaMember {
@@ -97,6 +99,29 @@ pub enum LuaMemberKey {
9799
}
98100

99101
impl LuaMemberKey {
102+
pub fn from_index_key(
103+
db: &DbIndex,
104+
cache: &mut LuaInferCache,
105+
key: &LuaIndexKey,
106+
) -> Result<Self, InferFailReason> {
107+
match key {
108+
LuaIndexKey::Name(name) => Ok(LuaMemberKey::Name(name.get_name_text().into())),
109+
LuaIndexKey::String(str) => Ok(LuaMemberKey::Name(str.get_value().into())),
110+
LuaIndexKey::Integer(i) => Ok(LuaMemberKey::Integer(i.get_int_value())),
111+
LuaIndexKey::Idx(idx) => Ok(LuaMemberKey::Integer(*idx as i64)),
112+
LuaIndexKey::Expr(expr) => {
113+
let expr_type = infer_expr(db, cache, expr.clone())?;
114+
match expr_type {
115+
LuaType::StringConst(s) => Ok(LuaMemberKey::Name(s.deref().clone())),
116+
LuaType::DocStringConst(s) => Ok(LuaMemberKey::Name(s.deref().clone())),
117+
LuaType::IntegerConst(i) => Ok(LuaMemberKey::Integer(i)),
118+
LuaType::DocIntegerConst(i) => Ok(LuaMemberKey::Integer(i)),
119+
_ => Ok(LuaMemberKey::Expr(expr_type)),
120+
}
121+
}
122+
}
123+
}
124+
100125
pub fn is_none(&self) -> bool {
101126
matches!(self, LuaMemberKey::None)
102127
}
@@ -163,29 +188,6 @@ impl Ord for LuaMemberKey {
163188
}
164189
}
165190

166-
impl From<LuaIndexKey> for LuaMemberKey {
167-
fn from(key: LuaIndexKey) -> Self {
168-
match key {
169-
LuaIndexKey::Name(name) => LuaMemberKey::Name(name.get_name_text().into()),
170-
LuaIndexKey::String(str) => LuaMemberKey::Name(str.get_value().into()),
171-
LuaIndexKey::Integer(i) => LuaMemberKey::Integer(i.get_int_value()),
172-
LuaIndexKey::Idx(idx) => LuaMemberKey::Integer(idx as i64),
173-
_ => LuaMemberKey::None,
174-
}
175-
}
176-
}
177-
178-
impl From<&LuaIndexKey> for LuaMemberKey {
179-
fn from(key: &LuaIndexKey) -> Self {
180-
match key {
181-
LuaIndexKey::Name(name) => LuaMemberKey::Name(name.get_name_text().to_string().into()),
182-
LuaIndexKey::String(str) => LuaMemberKey::Name(str.get_value().into()),
183-
LuaIndexKey::Integer(i) => LuaMemberKey::Integer(i.get_int_value()),
184-
_ => LuaMemberKey::None,
185-
}
186-
}
187-
}
188-
189191
impl From<LuaDocFieldKey> for LuaMemberKey {
190192
fn from(key: LuaDocFieldKey) -> Self {
191193
match key {

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

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ pub fn infer_member_by_member_key(
132132
) -> InferResult {
133133
match &prefix_type {
134134
LuaType::Table | LuaType::Any | LuaType::Unknown => Ok(LuaType::Any),
135-
LuaType::TableConst(id) => infer_table_member(db, id.clone(), index_expr),
135+
LuaType::TableConst(id) => infer_table_member(db, cache, id.clone(), index_expr),
136136
LuaType::String | LuaType::Io | LuaType::StringConst(_) | LuaType::DocStringConst(_) => {
137137
let decl_id =
138138
get_buildin_type_map_type_id(&prefix_type).ok_or(InferFailReason::None)?;
@@ -145,7 +145,7 @@ pub fn infer_member_by_member_key(
145145
infer_custom_type_member(db, cache, decl_id.clone(), index_expr, infer_guard)
146146
}
147147
// LuaType::Module(_) => todo!(),
148-
LuaType::Tuple(tuple_type) => infer_tuple_member(tuple_type, index_expr),
148+
LuaType::Tuple(tuple_type) => infer_tuple_member(db, cache, tuple_type, index_expr),
149149
LuaType::Object(object_type) => infer_object_member(db, cache, object_type, index_expr),
150150
LuaType::Union(union_type) => infer_union_member(db, cache, union_type, index_expr),
151151
LuaType::Intersection(intersection_type) => {
@@ -188,14 +188,13 @@ fn infer_array_member(
188188

189189
fn infer_table_member(
190190
db: &DbIndex,
191+
cache: &mut LuaInferCache,
191192
inst: InFiled<TextRange>,
192193
index_expr: LuaIndexMemberExpr,
193194
) -> InferResult {
194195
let owner = LuaMemberOwner::Element(inst);
195-
let key: LuaMemberKey = index_expr
196-
.get_index_key()
197-
.ok_or(InferFailReason::None)?
198-
.into();
196+
let index_key = index_expr.get_index_key().ok_or(InferFailReason::None)?;
197+
let key = LuaMemberKey::from_index_key(db, cache, &index_key)?;
199198
let member_item = match db.get_member_index().get_member_item(&owner, &key) {
200199
Some(member_item) => member_item,
201200
None => return Err(InferFailReason::FieldDotFound),
@@ -226,7 +225,7 @@ fn infer_custom_type_member(
226225

227226
let owner = LuaMemberOwner::Type(prefix_type_id.clone());
228227
let index_key = index_expr.get_index_key().ok_or(InferFailReason::None)?;
229-
let key: LuaMemberKey = index_key.clone().into();
228+
let key = LuaMemberKey::from_index_key(db, cache, &index_key)?;
230229
if let Some(member_item) = db.get_member_index().get_member_item(&owner, &key) {
231230
return member_item.resolve_type(db);
232231
}
@@ -395,11 +394,14 @@ fn get_all_member_key(db: &DbIndex, origin_type: &LuaType) -> Option<Vec<LuaMemb
395394
Some(result)
396395
}
397396

398-
fn infer_tuple_member(tuple_type: &LuaTupleType, index_expr: LuaIndexMemberExpr) -> InferResult {
399-
let key = index_expr
400-
.get_index_key()
401-
.ok_or(InferFailReason::None)?
402-
.into();
397+
fn infer_tuple_member(
398+
db: &DbIndex,
399+
cache: &mut LuaInferCache,
400+
tuple_type: &LuaTupleType,
401+
index_expr: LuaIndexMemberExpr,
402+
) -> InferResult {
403+
let index_key = index_expr.get_index_key().ok_or(InferFailReason::None)?;
404+
let key = LuaMemberKey::from_index_key(db, cache, &index_key)?;
403405
if let LuaMemberKey::Integer(i) = key {
404406
let index = if i > 0 { i - 1 } else { 0 };
405407
return match tuple_type.get_type(index as usize) {
@@ -417,12 +419,12 @@ fn infer_object_member(
417419
object_type: &LuaObjectType,
418420
index_expr: LuaIndexMemberExpr,
419421
) -> InferResult {
420-
let member_key = index_expr.get_index_key().ok_or(InferFailReason::None)?;
421-
if let Some(member_type) = object_type.get_field(&member_key.clone().into()) {
422+
let index_key = index_expr.get_index_key().ok_or(InferFailReason::None)?;
423+
let member_key = LuaMemberKey::from_index_key(db, cache, &index_key)?;
424+
if let Some(member_type) = object_type.get_field(&member_key) {
422425
return Ok(member_type.clone());
423426
}
424427

425-
let index_key = index_expr.get_index_key().ok_or(InferFailReason::None)?;
426428
// todo
427429
let index_accesses = object_type.get_index_access();
428430
for (key, value) in index_accesses {
@@ -607,7 +609,7 @@ fn infer_instance_member(
607609
Err(err) => return Err(err),
608610
}
609611

610-
infer_table_member(db, range.clone(), index_expr.clone())
612+
infer_table_member(db, cache, range.clone(), index_expr.clone())
611613
}
612614

613615
pub fn infer_member_by_operator(
@@ -1003,12 +1005,13 @@ fn infer_global_field_member(
10031005

10041006
fn infer_namespace_member(
10051007
db: &DbIndex,
1006-
_: &LuaInferCache,
1008+
cache: &mut LuaInferCache,
10071009
ns: &str,
10081010
index_expr: LuaIndexMemberExpr,
10091011
) -> InferResult {
1010-
let member_key = index_expr.get_index_key().ok_or(InferFailReason::None)?;
1011-
let member_key = match member_key.into() {
1012+
let index_key = index_expr.get_index_key().ok_or(InferFailReason::None)?;
1013+
let member_key = LuaMemberKey::from_index_key(db, cache, &index_key)?;
1014+
let member_key = match member_key {
10121015
LuaMemberKey::Name(name) => name.to_string(),
10131016
LuaMemberKey::Integer(i) => i.to_string(),
10141017
_ => return Err(InferFailReason::None),

crates/emmylua_code_analysis/src/semantic/mod.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ use std::collections::HashMap;
1313
use std::{collections::HashSet, sync::Arc};
1414

1515
pub use cache::{CacheEntry, CacheKey, CacheOptions, LuaAnalysisPhase, LuaInferCache};
16-
use emmylua_parser::{LuaCallExpr, LuaChunk, LuaExpr, LuaSyntaxNode, LuaSyntaxToken, LuaTableExpr};
16+
use emmylua_parser::{
17+
LuaCallExpr, LuaChunk, LuaExpr, LuaIndexKey, LuaSyntaxNode, LuaSyntaxToken, LuaTableExpr,
18+
};
1719
use infer::{infer_left_value_type_from_right_value, infer_multi_value_adjusted_expression_types};
1820
pub use infer::{infer_table_field_value_should_be, infer_table_should_be};
1921
use lsp_types::Uri;
@@ -261,6 +263,10 @@ impl<'a> SemanticModel<'a> {
261263
.unwrap_or(&LuaType::Unknown)
262264
.clone()
263265
}
266+
267+
pub fn get_member_key(&self, index_key: &LuaIndexKey) -> Option<LuaMemberKey> {
268+
LuaMemberKey::from_index_key(self.db, &mut self.infer_cache.borrow_mut(), index_key).ok()
269+
}
264270
}
265271

266272
/// Guard to prevent infinite recursion

crates/emmylua_code_analysis/src/semantic/semantic_info/infer_expr_semantic_decl.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,8 @@ fn infer_index_expr_semantic_decl(
154154
) -> Option<LuaSemanticDeclId> {
155155
let prefix_expr = index_expr.get_prefix_expr()?;
156156
let prefix_type = infer_expr(db, cache, prefix_expr.into()).ok()?;
157-
let member_key = index_expr.get_index_key()?.into();
157+
let index_key = index_expr.get_index_key()?;
158+
let member_key = LuaMemberKey::from_index_key(db, cache, &index_key).ok()?;
158159
infer_member_semantic_decl_by_member_key(
159160
db,
160161
cache,

crates/emmylua_ls/src/handlers/inlay_hint/build_inlay_hint.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -308,8 +308,8 @@ fn build_func_stat_override_hint(
308308
.get_type_index()
309309
.get_super_types(&id)?;
310310

311-
let name = index_expr.get_index_key()?;
312-
let member_key: LuaMemberKey = name.into();
311+
let index_key = index_expr.get_index_key()?;
312+
let member_key: LuaMemberKey = semantic_model.get_member_key(&index_key)?;
313313
let infer_guard = &mut InferGuard::new();
314314
for super_type in supers {
315315
if let Some(member_id) =

0 commit comments

Comments
 (0)