diff --git a/EmmyLua/CodeAnalysis/Compilation/Analyzer/DeclarationAnalyzer/DeclarationWalker/TableWalker.cs b/EmmyLua/CodeAnalysis/Compilation/Analyzer/DeclarationAnalyzer/DeclarationWalker/TableWalker.cs index 54b5b6ae..5ee8e16e 100644 --- a/EmmyLua/CodeAnalysis/Compilation/Analyzer/DeclarationAnalyzer/DeclarationWalker/TableWalker.cs +++ b/EmmyLua/CodeAnalysis/Compilation/Analyzer/DeclarationAnalyzer/DeclarationWalker/TableWalker.cs @@ -1,17 +1,34 @@ using EmmyLua.CodeAnalysis.Compilation.Analyzer.ResolveAnalyzer; using EmmyLua.CodeAnalysis.Compilation.Symbol; +using EmmyLua.CodeAnalysis.Document; using EmmyLua.CodeAnalysis.Syntax.Node.SyntaxNodes; namespace EmmyLua.CodeAnalysis.Compilation.Analyzer.DeclarationAnalyzer.DeclarationWalker; public partial class DeclarationWalker { + private List TableIgnoreRanges { get; } = new(); + private void AnalyzeTableExpr(LuaTableExprSyntax tableExprSyntax) { + if (IsIgnoreTable(tableExprSyntax)) + { + return; + } + declarationContext.TypeManager.AddDocumentElementType(tableExprSyntax.UniqueId); var fields = new List(); - foreach (var fieldSyntax in tableExprSyntax.FieldList) + var fieldList = tableExprSyntax.FieldList.ToList(); + for (var i = 0; i < fieldList.Count; i++) { + var fieldSyntax = fieldList[i]; + if (i == 0 && fieldSyntax.IsValue) + { + // declarationContext.TypeManager.AddDocumentElementType(fieldSyntax.UniqueId); + TableIgnoreRanges.Add(tableExprSyntax.Range); + return; + } + if (fieldSyntax is { Name: { } fieldName, Value: { } value }) { var declaration = new LuaSymbol( @@ -35,4 +52,23 @@ private void AnalyzeTableExpr(LuaTableExprSyntax tableExprSyntax) declarationContext.TypeManager.AddElementMembers(tableExprSyntax.UniqueId, fields); } } + + private bool IsIgnoreTable(LuaTableExprSyntax tableExprSyntax) + { + if (TableIgnoreRanges.Count == 0) + { + return false; + } + + var tableRange = tableExprSyntax.Range; + foreach (var range in TableIgnoreRanges) + { + if (range.Intersect(tableRange)) + { + return true; + } + } + + return false; + } }