Skip to content

Commit e5f774d

Browse files
committed
Fix #289
1 parent 4d29015 commit e5f774d

7 files changed

Lines changed: 50 additions & 8 deletions

File tree

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

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ impl LuaMemberIndexItem {
1414
}
1515

1616
pub fn resolve_semantic_decl(&self, db: &DbIndex) -> Option<LuaSemanticDeclId> {
17-
resolve_member_property(db, &self)
17+
resolve_member_semantic_id(db, &self)
1818
}
1919

2020
pub(super) fn resolve_member_id(&self, member_index: &LuaMemberIndex) -> Option<LuaMemberId> {
@@ -177,7 +177,7 @@ enum MemberTypeResolveState {
177177
FileDecl,
178178
}
179179

180-
fn resolve_member_property(
180+
fn resolve_member_semantic_id(
181181
db: &DbIndex,
182182
member_item: &LuaMemberIndexItem,
183183
) -> Option<LuaSemanticDeclId> {
@@ -201,14 +201,20 @@ fn resolve_member_property(
201201

202202
match resolve_state {
203203
MemberSemanticDeclResolveState::MetaOrNone => {
204+
let mut last_valid_member =
205+
LuaSemanticDeclId::Member(members.first()?.get_id());
204206
for member in &members {
205207
let feature = member.get_feature();
206208
if feature.is_meta_decl() {
207-
return Some(LuaSemanticDeclId::Member(member.get_id()));
209+
let semantic_id = LuaSemanticDeclId::Member(member.get_id());
210+
last_valid_member = semantic_id.clone();
211+
if check_member_version(db, semantic_id.clone()) {
212+
return Some(semantic_id);
213+
}
208214
}
209215
}
210216

211-
Some(LuaSemanticDeclId::Member(members.first()?.get_id()))
217+
Some(last_valid_member)
212218
}
213219
MemberSemanticDeclResolveState::FirstDefine => {
214220
for member in &members {
@@ -241,3 +247,16 @@ enum MemberSemanticDeclResolveState {
241247
FirstDefine,
242248
FileDecl,
243249
}
250+
251+
fn check_member_version(db: &DbIndex, semantic_id: LuaSemanticDeclId) -> bool {
252+
let Some(property) = db.get_property_index().get_property(&semantic_id) else {
253+
return true;
254+
};
255+
256+
if let Some(version) = &property.version_conds {
257+
let version_number = db.get_emmyrc().runtime.version.to_lua_version_number();
258+
return version.iter().any(|cond| cond.check(&version_number));
259+
}
260+
261+
true
262+
}

crates/emmylua_code_analysis/src/db_index/semantic_decl.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ pub enum LuaSemanticDeclId {
88
Member(LuaMemberId),
99
LuaDecl(LuaDeclId),
1010
Signature(LuaSignatureId),
11+
// Multi(Box<Vec<LuaSemanticDeclId>>),
1112
}
1213

1314
impl From<LuaDeclId> for LuaSemanticDeclId {

crates/emmylua_code_analysis/src/diagnostic/checker/access_invisible.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ fn check_name_expr(
4747
}
4848

4949
let name_token = name_expr.get_name_token()?;
50-
if !semantic_model.is_property_visible(name_token.syntax().clone(), semantic_decl.clone()) {
50+
if !semantic_model.is_semantic_visible(name_token.syntax().clone(), semantic_decl.clone()) {
5151
let emmyrc = semantic_model.get_emmyrc();
5252
report_reason(context, &emmyrc, name_token.get_range(), semantic_decl);
5353
}
@@ -71,7 +71,7 @@ fn check_index_expr(
7171
}
7272

7373
let index_token = index_expr.get_index_name_token()?;
74-
if !semantic_model.is_property_visible(index_token.clone(), semantic_decl.clone()) {
74+
if !semantic_model.is_semantic_visible(index_token.clone(), semantic_decl.clone()) {
7575
let emmyrc = semantic_model.get_emmyrc();
7676
report_reason(context, &emmyrc, index_token.text_range(), semantic_decl);
7777
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#[cfg(test)]
2+
mod tests {
3+
use crate::{DiagnosticCode, Emmyrc, EmmyrcLuaVersion, VirtualWorkspace};
4+
5+
#[test]
6+
fn test_issue_289() {
7+
let mut ws = VirtualWorkspace::new();
8+
let mut config = Emmyrc::default();
9+
config.runtime.version = EmmyrcLuaVersion::LuaJIT;
10+
ws.analysis.update_config(config.into());
11+
assert!(ws.check_code_for_namespace(
12+
DiagnosticCode::AccessInvisible,
13+
r#"
14+
local file = io.open("test.txt", "r")
15+
if file then
16+
file:close()
17+
end
18+
"#
19+
));
20+
}
21+
}

crates/emmylua_code_analysis/src/diagnostic/test/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
mod access_invisible_test;
12
mod assign_type_mismatch_test;
23
mod await_in_sync_test;
34
mod check_return_count_test;

crates/emmylua_code_analysis/src/semantic/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ impl<'a> SemanticModel<'a> {
205205
.unwrap_or(false)
206206
}
207207

208-
pub fn is_property_visible(
208+
pub fn is_semantic_visible(
209209
&self,
210210
token: LuaSyntaxToken,
211211
property_owner: LuaSemanticDeclId,

crates/emmylua_ls/src/handlers/completion/add_completions/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ pub fn check_visibility(builder: &mut CompletionBuilder, id: LuaSemanticDeclId)
2323

2424
if !builder
2525
.semantic_model
26-
.is_property_visible(builder.trigger_token.clone(), id)
26+
.is_semantic_visible(builder.trigger_token.clone(), id)
2727
{
2828
return None;
2929
}

0 commit comments

Comments
 (0)