Skip to content

Commit 3d47352

Browse files
committed
compact luals runtime.special config
1 parent f158266 commit 3d47352

File tree

5 files changed

+93
-4
lines changed

5 files changed

+93
-4
lines changed

crates/emmylua_code_analysis/resources/schema.json

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@
118118
"nonstandardSymbol": [],
119119
"requireLikeFunction": [],
120120
"requirePattern": [],
121+
"special": {},
121122
"version": "LuaLatest"
122123
}
123124
},
@@ -954,6 +955,14 @@
954955
"type": "string"
955956
}
956957
},
958+
"special": {
959+
"description": "Special symbols.",
960+
"type": "object",
961+
"additionalProperties": {
962+
"$ref": "#/$defs/EmmyrcSpecialSymbol"
963+
},
964+
"default": {}
965+
},
957966
"version": {
958967
"description": "Lua version.",
959968
"$ref": "#/$defs/EmmyrcLuaVersion",
@@ -988,6 +997,17 @@
988997
}
989998
}
990999
},
1000+
"EmmyrcSpecialSymbol": {
1001+
"type": "string",
1002+
"enum": [
1003+
"None",
1004+
"Require",
1005+
"Error",
1006+
"Assert",
1007+
"Type",
1008+
"Setmetatable"
1009+
]
1010+
},
9911011
"EmmyrcStrict": {
9921012
"type": "object",
9931013
"properties": {

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

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1-
use emmylua_parser::{LuaNonStdSymbol, LuaVersionNumber};
1+
use std::collections::HashMap;
2+
3+
use emmylua_parser::{LuaNonStdSymbol, LuaVersionNumber, SpecialFunction};
24
use schemars::JsonSchema;
5+
use serde::de::Deserializer;
36
use serde::{Deserialize, Serialize};
47

58
#[derive(Serialize, Deserialize, Debug, JsonSchema, Clone)]
@@ -26,6 +29,9 @@ pub struct EmmyrcRuntime {
2629
/// Non-standard symbols.
2730
#[serde(default)]
2831
pub nonstandard_symbol: Vec<EmmyrcNonStdSymbol>,
32+
/// Special symbols.
33+
#[serde(default)]
34+
pub special: HashMap<String, EmmyrcSpecialSymbol>,
2935
}
3036

3137
impl Default for EmmyrcRuntime {
@@ -38,6 +44,7 @@ impl Default for EmmyrcRuntime {
3844
require_pattern: Default::default(),
3945
class_default_call: Default::default(),
4046
nonstandard_symbol: Default::default(),
47+
special: Default::default(),
4148
}
4249
}
4350
}
@@ -173,6 +180,63 @@ impl From<EmmyrcNonStdSymbol> for LuaNonStdSymbol {
173180
}
174181
}
175182

183+
#[derive(Debug, Clone, Copy, PartialEq, Eq, JsonSchema)]
184+
pub enum EmmyrcSpecialSymbol {
185+
None,
186+
Require,
187+
Error,
188+
Assert,
189+
Type,
190+
Setmetatable,
191+
}
192+
193+
impl<'de> Deserialize<'de> for EmmyrcSpecialSymbol {
194+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
195+
where
196+
D: Deserializer<'de>,
197+
{
198+
let s = String::deserialize(deserializer)?;
199+
match s.as_str() {
200+
"require" => Ok(EmmyrcSpecialSymbol::Require),
201+
"error" => Ok(EmmyrcSpecialSymbol::Error),
202+
"assert" => Ok(EmmyrcSpecialSymbol::Assert),
203+
"type" => Ok(EmmyrcSpecialSymbol::Type),
204+
"setmetatable" => Ok(EmmyrcSpecialSymbol::Setmetatable),
205+
_ => Ok(EmmyrcSpecialSymbol::None),
206+
}
207+
}
208+
}
209+
210+
impl<'serialize> Serialize for EmmyrcSpecialSymbol {
211+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
212+
where
213+
S: serde::Serializer,
214+
{
215+
let s = match self {
216+
EmmyrcSpecialSymbol::None => "none",
217+
EmmyrcSpecialSymbol::Require => "require",
218+
EmmyrcSpecialSymbol::Error => "error",
219+
EmmyrcSpecialSymbol::Assert => "assert",
220+
EmmyrcSpecialSymbol::Type => "type",
221+
EmmyrcSpecialSymbol::Setmetatable => "setmetatable",
222+
};
223+
serializer.serialize_str(s)
224+
}
225+
}
226+
227+
impl From<EmmyrcSpecialSymbol> for Option<SpecialFunction> {
228+
fn from(symbol: EmmyrcSpecialSymbol) -> Self {
229+
match symbol {
230+
EmmyrcSpecialSymbol::None => None,
231+
EmmyrcSpecialSymbol::Require => Some(SpecialFunction::Require),
232+
EmmyrcSpecialSymbol::Error => Some(SpecialFunction::Error),
233+
EmmyrcSpecialSymbol::Assert => Some(SpecialFunction::Assert),
234+
EmmyrcSpecialSymbol::Type => Some(SpecialFunction::Type),
235+
EmmyrcSpecialSymbol::Setmetatable => Some(SpecialFunction::Setmetaatable),
236+
}
237+
}
238+
}
239+
176240
#[cfg(test)]
177241
mod tests {
178242
use super::*;

crates/emmylua_code_analysis/src/config/mod.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,11 @@ impl Emmyrc {
7171
) -> ParserConfig<'cache> {
7272
let lua_language_level = self.get_language_level();
7373
let mut special_like = HashMap::new();
74+
for (name, func) in self.runtime.special.iter() {
75+
if let Some(func) = func.clone().into() {
76+
special_like.insert(name.clone(), func);
77+
}
78+
}
7479
for name in self.runtime.require_like_function.iter() {
7580
special_like.insert(name.clone(), SpecialFunction::Require);
7681
}

crates/emmylua_parser/src/grammar/lua/expr.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,7 @@ fn parse_name_or_special_function(p: &mut LuaParser) -> ParseResult {
372372
SpecialFunction::Assert => LuaSyntaxKind::AssertCallExpr,
373373
SpecialFunction::Error => LuaSyntaxKind::ErrorCallExpr,
374374
SpecialFunction::Type => LuaSyntaxKind::TypeCallExpr,
375-
SpecialFunction::Setmatable => LuaSyntaxKind::SetmetatableCallExpr,
375+
SpecialFunction::Setmetaatable => LuaSyntaxKind::SetmetatableCallExpr,
376376
_ => LuaSyntaxKind::None,
377377
};
378378
p.bump();

crates/emmylua_parser/src/parser/parser_config.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ impl<'cache> ParserConfig<'cache> {
4747
"error" => SpecialFunction::Error,
4848
"assert" => SpecialFunction::Assert,
4949
"type" => SpecialFunction::Type,
50-
"setmetatable" => SpecialFunction::Setmatable,
50+
"setmetatable" => SpecialFunction::Setmetaatable,
5151
_ => *self
5252
.special_like
5353
.get(name)
@@ -89,5 +89,5 @@ pub enum SpecialFunction {
8989
Error,
9090
Assert,
9191
Type,
92-
Setmatable,
92+
Setmetaatable,
9393
}

0 commit comments

Comments
 (0)