Skip to content

Commit 49a70d1

Browse files
committed
change syntax tree api for number token
1 parent fa1540d commit 49a70d1

File tree

18 files changed

+136
-75
lines changed

18 files changed

+136
-75
lines changed

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use emmylua_parser::{
22
LuaAst, LuaAstNode, LuaAstToken, LuaCallExpr, LuaClosureExpr, LuaDocTagCast, LuaExpr,
33
LuaFuncStat, LuaIndexExpr, LuaIndexKey, LuaLiteralExpr, LuaLiteralToken, LuaNameExpr,
4-
LuaTableExpr, LuaVarExpr,
4+
LuaTableExpr, LuaVarExpr, NumberResult,
55
};
66

77
use crate::{
@@ -58,8 +58,8 @@ pub fn analyze_index_expr(analyzer: &mut DeclAnalyzer, index_expr: LuaIndexExpr)
5858
let key = match index_key {
5959
LuaIndexKey::Name(name) => LuaMemberKey::Name(name.get_name_text().to_string().into()),
6060
LuaIndexKey::Integer(int) => {
61-
if int.is_int() {
62-
LuaMemberKey::Integer(int.get_int_value())
61+
if let NumberResult::Int(i) = int.get_number_value() {
62+
LuaMemberKey::Integer(i)
6363
} else {
6464
return None;
6565
}
@@ -232,7 +232,13 @@ pub fn analyze_table_expr(analyzer: &mut DeclAnalyzer, table_expr: LuaTableExpr)
232232
let key: LuaMemberKey = match field_key {
233233
LuaIndexKey::Name(name) => LuaMemberKey::Name(name.get_name_text().into()),
234234
LuaIndexKey::String(str) => LuaMemberKey::Name(str.get_value().into()),
235-
LuaIndexKey::Integer(i) => LuaMemberKey::Integer(i.get_int_value()),
235+
LuaIndexKey::Integer(i) => {
236+
if let NumberResult::Int(idx) = i.get_number_value() {
237+
LuaMemberKey::Integer(idx)
238+
} else {
239+
continue;
240+
}
241+
}
236242
LuaIndexKey::Idx(idx) => LuaMemberKey::Integer(idx as i64),
237243
LuaIndexKey::Expr(field_expr) => {
238244
let unresolve_member = UnResolveTableField {

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

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

77
use crate::{
@@ -108,7 +108,13 @@ pub fn analyze_assign_stat(analyzer: &mut DeclAnalyzer, stat: LuaAssignStat) ->
108108
let key: LuaMemberKey = match index_key {
109109
LuaIndexKey::Name(name) => LuaMemberKey::Name(name.get_name_text().into()),
110110
LuaIndexKey::String(str) => LuaMemberKey::Name(str.get_value().into()),
111-
LuaIndexKey::Integer(i) => LuaMemberKey::Integer(i.get_int_value()),
111+
LuaIndexKey::Integer(i) => {
112+
if let NumberResult::Int(idx) = i.get_number_value() {
113+
LuaMemberKey::Integer(idx)
114+
} else {
115+
continue;
116+
}
117+
}
112118
LuaIndexKey::Idx(idx) => LuaMemberKey::Integer(idx as i64),
113119
LuaIndexKey::Expr(_) => {
114120
continue;
@@ -255,7 +261,13 @@ pub fn analyze_func_stat(analyzer: &mut DeclAnalyzer, stat: LuaFuncStat) -> Opti
255261
let key: LuaMemberKey = match index_key {
256262
LuaIndexKey::Name(name) => LuaMemberKey::Name(name.get_name_text().into()),
257263
LuaIndexKey::String(str) => LuaMemberKey::Name(str.get_value().into()),
258-
LuaIndexKey::Integer(i) => LuaMemberKey::Integer(i.get_int_value()),
264+
LuaIndexKey::Integer(i) => {
265+
if let NumberResult::Int(idx) = i.get_number_value() {
266+
LuaMemberKey::Integer(idx)
267+
} else {
268+
return None;
269+
}
270+
}
259271
LuaIndexKey::Idx(idx) => LuaMemberKey::Integer(idx as i64),
260272
LuaIndexKey::Expr(_) => {
261273
return None;

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use emmylua_parser::{
22
LuaAst, LuaAstNode, LuaDocTagAttributeUse, LuaDocType, LuaExpr, LuaKind, LuaLiteralExpr,
3-
LuaLiteralToken, LuaSyntaxKind, LuaSyntaxNode, LuaTokenKind,
3+
LuaLiteralToken, LuaSyntaxKind, LuaSyntaxNode, LuaTokenKind, NumberResult,
44
};
55
use smol_str::SmolStr;
66

@@ -110,8 +110,8 @@ fn infer_attribute_arg_type(expr: LuaLiteralExpr) -> LuaType {
110110
return LuaType::DocStringConst(SmolStr::new(str_token.get_value()).into());
111111
}
112112
LuaLiteralToken::Number(number_token) => {
113-
if number_token.is_int() {
114-
return LuaType::DocIntegerConst(number_token.get_int_value());
113+
if let NumberResult::Int(i) = number_token.get_number_value() {
114+
return LuaType::DocIntegerConst(i);
115115
} else {
116116
return LuaType::Number;
117117
}

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::sync::Arc;
22

33
use emmylua_parser::{
44
LuaAstNode, LuaAstToken, LuaDocDescriptionOwner, LuaDocFieldKey, LuaDocTagField,
5-
LuaDocTagOperator, LuaDocType, VisibilityKind,
5+
LuaDocTagOperator, LuaDocType, NumberResult, VisibilityKind,
66
};
77

88
use crate::{
@@ -79,7 +79,13 @@ pub fn analyze_field(analyzer: &mut DocAnalyzer, tag: LuaDocTagField) -> Option<
7979
LuaMemberKey::Name(name_token.get_name_text().to_string().into())
8080
}
8181
LuaDocFieldKey::String(string_token) => LuaMemberKey::Name(string_token.get_value().into()),
82-
LuaDocFieldKey::Integer(int_token) => LuaMemberKey::Integer(int_token.get_int_value()),
82+
LuaDocFieldKey::Integer(int_token) => {
83+
if let NumberResult::Int(idx) = int_token.get_number_value() {
84+
LuaMemberKey::Integer(idx)
85+
} else {
86+
return None;
87+
}
88+
}
8389
LuaDocFieldKey::Type(doc_type) => {
8490
let range = doc_type.get_range();
8591
let key_type_ref = infer_type(analyzer, doc_type);

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use emmylua_parser::{
66
LuaDocGenericType, LuaDocIndexAccessType, LuaDocInferType, LuaDocMappedType,
77
LuaDocMultiLineUnionType, LuaDocObjectFieldKey, LuaDocObjectType, LuaDocStrTplType, LuaDocType,
88
LuaDocUnaryType, LuaDocVariadicType, LuaLiteralToken, LuaSyntaxKind, LuaTypeBinaryOperator,
9-
LuaTypeUnaryOperator, LuaVarExpr,
9+
LuaTypeUnaryOperator, LuaVarExpr, NumberResult,
1010
};
1111
use internment::ArcIntern;
1212
use rowan::TextRange;
@@ -62,8 +62,8 @@ pub fn infer_type(analyzer: &mut DocAnalyzer, node: LuaDocType) -> LuaType {
6262
return LuaType::DocStringConst(SmolStr::new(str_token.get_value()).into());
6363
}
6464
LuaLiteralToken::Number(number_token) => {
65-
if number_token.is_int() {
66-
return LuaType::DocIntegerConst(number_token.get_int_value());
65+
if let NumberResult::Int(i) = number_token.get_number_value() {
66+
return LuaType::DocIntegerConst(i);
6767
} else {
6868
return LuaType::Number;
6969
}
@@ -601,7 +601,11 @@ fn infer_object_type(analyzer: &mut DocAnalyzer, object_type: &LuaDocObjectType)
601601
LuaIndexAccessKey::String(name.get_name_text().to_string().into())
602602
}
603603
LuaDocObjectFieldKey::Integer(int) => {
604-
LuaIndexAccessKey::Integer(int.get_int_value())
604+
if let NumberResult::Int(i) = int.get_number_value() {
605+
LuaIndexAccessKey::Integer(i)
606+
} else {
607+
continue;
608+
}
605609
}
606610
LuaDocObjectFieldKey::String(str) => {
607611
LuaIndexAccessKey::String(str.get_value().to_string().into())

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use emmylua_parser::{LuaAstNode, LuaIndexKey, LuaIndexMemberExpr};
1+
use emmylua_parser::{LuaAstNode, LuaIndexKey, LuaIndexMemberExpr, NumberResult};
22
use rowan::TextRange;
33
use smol_str::SmolStr;
44

@@ -304,7 +304,13 @@ fn find_index_metamethod(
304304
let access_key_type = match &index_key {
305305
LuaIndexKey::Name(name) => LuaType::StringConst(SmolStr::new(name.get_name_text()).into()),
306306
LuaIndexKey::String(s) => LuaType::StringConst(SmolStr::new(s.get_value()).into()),
307-
LuaIndexKey::Integer(i) => LuaType::IntegerConst(i.get_int_value()),
307+
LuaIndexKey::Integer(i) => {
308+
if let NumberResult::Int(idx) = i.get_number_value() {
309+
LuaType::IntegerConst(idx)
310+
} else {
311+
return Err(InferFailReason::FieldNotFound);
312+
}
313+
}
308314
LuaIndexKey::Idx(i) => LuaType::IntegerConst(*i as i64),
309315
LuaIndexKey::Expr(expr) => infer_expr(db, cache, expr.clone())?,
310316
};

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::ops::Deref;
22

3-
use emmylua_parser::{LuaIndexKey, LuaSyntaxId, LuaSyntaxKind};
3+
use emmylua_parser::{LuaIndexKey, LuaSyntaxId, LuaSyntaxKind, NumberResult};
44
use rowan::{TextRange, TextSize};
55
use serde::{Deserialize, Serialize};
66
use smol_str::SmolStr;
@@ -107,7 +107,13 @@ impl LuaMemberKey {
107107
match key {
108108
LuaIndexKey::Name(name) => Ok(LuaMemberKey::Name(name.get_name_text().into())),
109109
LuaIndexKey::String(str) => Ok(LuaMemberKey::Name(str.get_value().into())),
110-
LuaIndexKey::Integer(i) => Ok(LuaMemberKey::Integer(i.get_int_value())),
110+
LuaIndexKey::Integer(i) => {
111+
if let NumberResult::Int(idx) = i.get_number_value() {
112+
Ok(LuaMemberKey::Integer(idx))
113+
} else {
114+
Err(InferFailReason::FieldNotFound)
115+
}
116+
}
111117
LuaIndexKey::Idx(idx) => Ok(LuaMemberKey::Integer(*idx as i64)),
112118
LuaIndexKey::Expr(expr) => {
113119
let expr_type = infer_expr(db, cache, expr.clone())?;

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use emmylua_parser::{
44
LuaAstNode, LuaDocAttributeType, LuaDocBinaryType, LuaDocDescriptionOwner, LuaDocFuncType,
55
LuaDocGenericType, LuaDocMultiLineUnionType, LuaDocObjectFieldKey, LuaDocObjectType,
66
LuaDocStrTplType, LuaDocType, LuaDocUnaryType, LuaDocVariadicType, LuaLiteralToken,
7-
LuaSyntaxKind, LuaTypeBinaryOperator, LuaTypeUnaryOperator,
7+
LuaSyntaxKind, LuaTypeBinaryOperator, LuaTypeUnaryOperator, NumberResult,
88
};
99
use rowan::TextRange;
1010
use smol_str::SmolStr;
@@ -65,8 +65,8 @@ pub fn infer_doc_type(ctx: DocTypeInferContext<'_>, node: &LuaDocType) -> LuaTyp
6565
return LuaType::DocStringConst(SmolStr::new(str_token.get_value()).into());
6666
}
6767
LuaLiteralToken::Number(number_token) => {
68-
if number_token.is_int() {
69-
return LuaType::DocIntegerConst(number_token.get_int_value());
68+
if let NumberResult::Int(i) = number_token.get_number_value() {
69+
return LuaType::DocIntegerConst(i);
7070
} else {
7171
return LuaType::Number;
7272
}
@@ -471,7 +471,11 @@ fn infer_object_type(ctx: DocTypeInferContext<'_>, object_type: &LuaDocObjectTyp
471471
LuaIndexAccessKey::String(name.get_name_text().to_string().into())
472472
}
473473
LuaDocObjectFieldKey::Integer(int) => {
474-
LuaIndexAccessKey::Integer(int.get_int_value())
474+
if let NumberResult::Int(i) = int.get_number_value() {
475+
LuaIndexAccessKey::Integer(i)
476+
} else {
477+
continue;
478+
}
475479
}
476480
LuaDocObjectFieldKey::String(str) => {
477481
LuaIndexAccessKey::String(str.get_value().to_string().into())

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

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use std::collections::HashSet;
22

33
use emmylua_parser::{
4-
LuaAstNode, LuaExpr, LuaForStat, LuaIndexExpr, LuaIndexKey, LuaIndexMemberExpr, PathTrait,
5-
UnaryOperator,
4+
LuaAstNode, LuaExpr, LuaForStat, LuaIndexExpr, LuaIndexKey, LuaIndexMemberExpr, NumberResult,
5+
PathTrait, UnaryOperator,
66
};
77
use internment::ArcIntern;
88
use rowan::TextRange;
@@ -240,9 +240,10 @@ fn infer_array_member(
240240
match array_type.get_len() {
241241
LuaArrayLen::None => {}
242242
LuaArrayLen::Max(max_len) => {
243-
let index_value = i.get_int_value();
244-
if index_value > 0 && index_value <= *max_len {
245-
return Ok(base_type.clone());
243+
if let NumberResult::Int(index_value) = i.get_number_value() {
244+
if index_value > 0 && index_value <= *max_len {
245+
return Ok(base_type.clone());
246+
}
246247
}
247248
}
248249
}
@@ -648,7 +649,13 @@ fn infer_index_metamethod(
648649
let access_key_type = match &index_key {
649650
LuaIndexKey::Name(name) => LuaType::StringConst(SmolStr::new(name.get_name_text()).into()),
650651
LuaIndexKey::String(s) => LuaType::StringConst(SmolStr::new(s.get_value()).into()),
651-
LuaIndexKey::Integer(i) => LuaType::IntegerConst(i.get_int_value()),
652+
LuaIndexKey::Integer(i) => {
653+
if let NumberResult::Int(index_value) = i.get_number_value() {
654+
LuaType::IntegerConst(index_value)
655+
} else {
656+
return Err(InferFailReason::FieldNotFound);
657+
}
658+
}
652659
LuaIndexKey::Idx(i) => LuaType::IntegerConst(*i as i64),
653660
LuaIndexKey::Expr(expr) => infer_expr(db, cache, expr.clone())?,
654661
};

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

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use std::ops::Deref;
1313

1414
use emmylua_parser::{
1515
LuaAst, LuaAstNode, LuaCallExpr, LuaClosureExpr, LuaExpr, LuaLiteralExpr, LuaLiteralToken,
16-
LuaTableExpr, LuaVarExpr,
16+
LuaTableExpr, LuaVarExpr, NumberResult,
1717
};
1818
use infer_binary::infer_binary_expr;
1919
use infer_call::infer_call_expr;
@@ -115,15 +115,11 @@ fn infer_literal_expr(db: &DbIndex, config: &LuaInferCache, expr: LuaLiteralExpr
115115
match expr.get_literal().ok_or(InferFailReason::None)? {
116116
LuaLiteralToken::Nil(_) => Ok(LuaType::Nil),
117117
LuaLiteralToken::Bool(bool) => Ok(LuaType::BooleanConst(bool.is_true())),
118-
LuaLiteralToken::Number(num) => {
119-
if num.is_int() {
120-
Ok(LuaType::IntegerConst(num.get_int_value()))
121-
} else if num.is_float() {
122-
Ok(LuaType::FloatConst(num.get_float_value()))
123-
} else {
124-
Ok(LuaType::Number)
125-
}
126-
}
118+
LuaLiteralToken::Number(num) => match num.get_number_value() {
119+
NumberResult::Int(i) => Ok(LuaType::IntegerConst(i)),
120+
NumberResult::Float(f) => Ok(LuaType::FloatConst(f)),
121+
_ => Ok(LuaType::Number),
122+
},
127123
LuaLiteralToken::String(str) => {
128124
Ok(LuaType::StringConst(SmolStr::new(str.get_value()).into()))
129125
}

0 commit comments

Comments
 (0)