Skip to content

Commit c674135

Browse files
committed
support check module lua version
1 parent 2725d5e commit c674135

File tree

22 files changed

+294
-48
lines changed

22 files changed

+294
-48
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/code_analysis/src/compilation/analyzer/decl/docs.rs

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use emmylua_parser::{
2-
LuaAstToken, LuaDocAttribute, LuaDocTagAlias, LuaDocTagClass, LuaDocTagEnum, LuaDocTagMeta, LuaDocTagNamespace, LuaDocTagUsing
2+
LuaAstNode, LuaAstToken, LuaComment, LuaDocAttribute, LuaDocTag, LuaDocTagAlias, LuaDocTagClass, LuaDocTagEnum, LuaDocTagMeta, LuaDocTagNamespace, LuaDocTagUsing
33
};
44
use flagset::FlagSet;
55

@@ -138,7 +138,7 @@ pub fn analyze_doc_tag_using(analyzer: &mut DeclAnalyzer, using: LuaDocTagUsing)
138138
Some(())
139139
}
140140

141-
pub fn analyze_doc_tag_meta(analyzer: &mut DeclAnalyzer, tag: LuaDocTagMeta) {
141+
pub fn analyze_doc_tag_meta(analyzer: &mut DeclAnalyzer, tag: LuaDocTagMeta) -> Option<()> {
142142
let file_id = analyzer.get_file_id();
143143
analyzer.db.get_meta_file_mut().add_meta_file(file_id);
144144

@@ -155,4 +155,32 @@ pub fn analyze_doc_tag_meta(analyzer: &mut DeclAnalyzer, tag: LuaDocTagMeta) {
155155
.add_module_by_module_path(file_id, name_token.get_name_text().to_string());
156156
}
157157
}
158+
159+
let comment = tag.get_parent::<LuaComment>()?;
160+
let version_tag = comment.get_doc_tags().find_map(|tag| {
161+
if let LuaDocTag::Version(version) = tag {
162+
Some(version)
163+
} else {
164+
None
165+
}
166+
})?;
167+
168+
let mut visible = false;
169+
let current_version = analyzer.emmyrc.runtime.version.to_lua_version_number();
170+
for doc_version in version_tag.get_version_list() {
171+
let version_condition = doc_version.get_version_condition()?;
172+
if version_condition.check(&current_version) {
173+
visible = true;
174+
break;
175+
}
176+
}
177+
178+
if !visible {
179+
analyzer
180+
.db
181+
.get_module_index_mut()
182+
.set_module_visibility(file_id, false);
183+
}
184+
185+
Some(())
158186
}

crates/code_analysis/src/compilation/analyzer/decl/mod.rs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ mod docs;
22
mod exprs;
33
mod stats;
44

5-
use crate::db_index::{DbIndex, LuaScopeKind};
5+
use crate::{
6+
db_index::{DbIndex, LuaScopeKind},
7+
Emmyrc,
8+
};
69

710
use super::AnalyzeContext;
811
use emmylua_parser::{LuaAst, LuaAstNode, LuaChunk, LuaSyntaxKind};
@@ -14,11 +17,12 @@ use crate::{
1417
};
1518

1619
pub(crate) fn analyze(db: &mut DbIndex, context: &mut AnalyzeContext) {
20+
let emmyrc = &context.config;
1721
for in_filed_tree in context.tree_list.iter() {
1822
db.get_reference_index_mut()
1923
.create_local_reference(in_filed_tree.file_id);
2024
let mut analyzer =
21-
DeclAnalyzer::new(db, in_filed_tree.file_id, in_filed_tree.value.clone());
25+
DeclAnalyzer::new(db, in_filed_tree.file_id, in_filed_tree.value.clone(), &emmyrc);
2226
analyzer.analyze();
2327
let decl_tree = analyzer.get_decl_tree();
2428
db.get_decl_index_mut().add_decl_tree(decl_tree);
@@ -124,15 +128,22 @@ pub struct DeclAnalyzer<'a> {
124128
root: LuaChunk,
125129
decl: LuaDeclarationTree,
126130
scopes: Vec<LuaScopeId>,
131+
emmyrc: &'a Emmyrc,
127132
}
128133

129134
impl<'a> DeclAnalyzer<'a> {
130-
pub fn new(db: &'a mut DbIndex, file_id: FileId, tree: LuaChunk) -> DeclAnalyzer<'a> {
135+
pub fn new(
136+
db: &'a mut DbIndex,
137+
file_id: FileId,
138+
root: LuaChunk,
139+
emmyrc: &'a Emmyrc,
140+
) -> DeclAnalyzer<'a> {
131141
DeclAnalyzer {
132142
db,
133-
root: tree,
143+
root,
134144
decl: LuaDeclarationTree::new(file_id),
135145
scopes: Vec::new(),
146+
emmyrc,
136147
}
137148
}
138149

crates/code_analysis/src/config/configs/runtime.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use emmylua_parser::LuaVersionNumber;
12
use schemars::JsonSchema;
23
use serde::{Deserialize, Serialize};
34

@@ -33,7 +34,7 @@ impl Default for EmmyrcRuntime {
3334
}
3435
}
3536

36-
#[derive(Serialize, Deserialize, Debug, JsonSchema)]
37+
#[derive(Serialize, Deserialize, Debug, JsonSchema, Clone, Copy)]
3738
pub enum EmmyrcLuaVersion {
3839
/// Lua 5.1
3940
#[serde(rename = "Lua5.1")]
@@ -61,3 +62,15 @@ impl Default for EmmyrcLuaVersion {
6162
}
6263
}
6364

65+
impl EmmyrcLuaVersion {
66+
pub fn to_lua_version_number(&self) -> LuaVersionNumber {
67+
match self {
68+
EmmyrcLuaVersion::Lua51 => LuaVersionNumber::new(5, 1, 0),
69+
EmmyrcLuaVersion::LuaJIT => LuaVersionNumber::LUA_JIT,
70+
EmmyrcLuaVersion::Lua52 => LuaVersionNumber::new(5, 2, 0),
71+
EmmyrcLuaVersion::Lua53 => LuaVersionNumber::new(5, 3, 0),
72+
EmmyrcLuaVersion::Lua54 => LuaVersionNumber::new(5, 4, 0),
73+
EmmyrcLuaVersion::LuaLatest => LuaVersionNumber::new(5, 4, 0),
74+
}
75+
}
76+
}

crates/code_analysis/src/config/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@ use std::{collections::HashSet, path::PathBuf};
77
use crate::{semantic::LuaInferConfig, FileId};
88
pub use config_loader::load_configs;
99
pub use configs::EmmyrcFilenameConvention;
10+
pub use configs::EmmyrcLuaVersion;
1011
use configs::{
1112
EmmyrcCodeLen, EmmyrcCompletion, EmmyrcDiagnostic, EmmyrcHover, EmmyrcInlayHint,
12-
EmmyrcLuaVersion, EmmyrcReference, EmmyrcResource, EmmyrcRuntime, EmmyrcSemanticToken,
13-
EmmyrcSignature, EmmyrcStrict, EmmyrcWorkspace,
13+
EmmyrcReference, EmmyrcResource, EmmyrcRuntime, EmmyrcSemanticToken, EmmyrcSignature,
14+
EmmyrcStrict, EmmyrcWorkspace,
1415
};
1516
use emmylua_parser::{LuaLanguageLevel, ParserConfig};
1617
use rowan::NodeCache;

crates/code_analysis/src/diagnostic/lua_diagnostic_code.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ pub enum DiagnosticCode {
2727
Unused,
2828
/// Undefined global
2929
UndefinedGlobal,
30-
/// Need import
31-
NeedImport,
3230
/// Deprecated
3331
Deprecated,
3432
/// Access invisible member
@@ -69,7 +67,6 @@ pub fn get_default_severity(code: DiagnosticCode) -> DiagnosticSeverity {
6967
DiagnosticCode::UnreachableCode => DiagnosticSeverity::HINT,
7068
DiagnosticCode::Unused => DiagnosticSeverity::HINT,
7169
DiagnosticCode::UndefinedGlobal => DiagnosticSeverity::ERROR,
72-
DiagnosticCode::NeedImport => DiagnosticSeverity::WARNING,
7370
DiagnosticCode::Deprecated => DiagnosticSeverity::HINT,
7471
DiagnosticCode::AccessInvisibleMember => DiagnosticSeverity::WARNING,
7572
DiagnosticCode::DiscardReturns => DiagnosticSeverity::WARNING,

crates/emmylua_ls/src/handlers/completion/providers/module_path_provider.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,11 @@ pub fn add_completion(builder: &mut CompletionBuilder) -> Option<()> {
1818
.get_parent::<LuaCallExpr>()?
1919
.get_prefix_expr()?;
2020

21+
let emmyrc = builder.semantic_model.get_emmyrc();
2122
match call_expr_prefix {
2223
LuaExpr::NameExpr(name_expr) => {
2324
let name = name_expr.get_name_text()?;
24-
if !is_require_call(builder.semantic_model.get_emmyrc(), &name) {
25+
if !is_require_call(emmyrc, &name) {
2526
return None;
2627
}
2728
}
@@ -53,7 +54,7 @@ pub fn add_completion(builder: &mut CompletionBuilder) -> Option<()> {
5354
let child_module_node = db.get_module_index().get_module_node(module_id)?;
5455
if let Some(child_file_id) = child_module_node.file_ids.first() {
5556
let child_module_info = db.get_module_index().get_module(*child_file_id)?;
56-
if child_module_info.visible {
57+
if child_module_info.visible {
5758
let uri = db.get_vfs().get_uri(child_file_id)?;
5859
let filter_text = format!("{}{}", prefix, name);
5960
let completion_item = CompletionItem {

crates/emmylua_parser/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "emmylua_parser"
3-
version = "0.8.0"
3+
version = "0.8.1"
44
edition = "2021"
55
authors = ["CppCXY"]
66
description = "A parser for EmmyLua and luals"

crates/emmylua_parser/src/kind/lua_version.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,22 @@ impl Ord for LuaVersionNumber {
5353
.then_with(|| self.patch.cmp(&other.patch))
5454
}
5555
}
56+
57+
#[allow(unused)]
58+
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
59+
pub enum LuaVersionCondition {
60+
Eq(LuaVersionNumber),
61+
Gte(LuaVersionNumber),
62+
Lte(LuaVersionNumber),
63+
}
64+
65+
#[allow(unused)]
66+
impl LuaVersionCondition {
67+
pub fn check(&self, version: &LuaVersionNumber) -> bool {
68+
match self {
69+
LuaVersionCondition::Eq(v) => version == v,
70+
LuaVersionCondition::Gte(v) => version >= v,
71+
LuaVersionCondition::Lte(v) => version <= v,
72+
}
73+
}
74+
}

crates/emmylua_parser/src/kind/mod.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
1+
mod lua_language_level;
2+
mod lua_operator_kind;
3+
mod lua_syntax_kind;
4+
mod lua_token_kind;
5+
mod lua_type_operator_kind;
6+
mod lua_version;
7+
mod lua_visibility_kind;
8+
19
pub use lua_language_level::LuaLanguageLevel;
210
pub use lua_operator_kind::{BinaryOperator, UnaryOperator, UNARY_PRIORITY};
311
pub use lua_syntax_kind::LuaSyntaxKind;
412
pub use lua_token_kind::LuaTokenKind;
513
pub use lua_type_operator_kind::{
614
LuaTypeBinaryOperator, LuaTypeTernaryOperator, LuaTypeUnaryOperator,
715
};
8-
pub use lua_version::LuaVersionNumber;
16+
pub use lua_version::{LuaVersionNumber, LuaVersionCondition};
917
pub use lua_visibility_kind::VisibilityKind;
1018

11-
mod lua_language_level;
12-
mod lua_operator_kind;
13-
mod lua_syntax_kind;
14-
mod lua_token_kind;
15-
mod lua_type_operator_kind;
16-
mod lua_version;
17-
mod lua_visibility_kind;
19+
1820

1921
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
2022
#[repr(u16)]

0 commit comments

Comments
 (0)