public void GetDeclarations(LuaBlockNode block, LuaModel model)
 {
     foreach (var variable in VariableList)
     {
         block.Locals.Add(new Declaration(variable.AsString, String.Empty, model.FilePath,
                                          new ScopeSpan(variable.Span.EndPosition, variable.EndLine, block.Span.EndPosition, block.EndLine)));
     }
 }
Example #2
0
        public void SetValue(string key, object newValue)
        {
            if (LuaModel == null)
            {
                return;
            }
            LuaTable metaTab = LuaModel.GetMetaTable();

//            Debug.Log("key:" + key + ",Val:" + LuaModel[key] + ",newVal:" + newValue + ",meta:" + metaTab[key]);
//            metaTab[key] = newValue;
            LuaModel[key] = newValue;
//            Debug.Log("-----------key:" + key + ",Val:" + LuaModel[key] + ",newVal:" + newValue + ",meta:" + metaTab[key]);
        }
Example #3
0
 public void GetDeclarations(LuaBlockNode block, LuaModel model)
 {
     // require("sample.lua")
     if (Target != null &&
         (Target.AsString == "require" ||
          Target.AsString == "NPL.load") &&
         Arguments.ChildNodes.Count == 1 &&
         Arguments.ChildNodes[0] is LuaLiteralNode &&
         ((LuaLiteralNode)Arguments.ChildNodes[0]).Type == LuaType.String)
     {
         string fileName = ((LuaLiteralNode)Arguments.ChildNodes[0]).Value;
         fileName = fileName.Substring(1, fileName.Length - 2);
         try
         {
             string filePath = Path.Combine(Path.GetDirectoryName(model.FilePath), fileName);
             // project mode
             if (model.Entry != null && model.Entry.Analyzer != null && model.Entry.Analyzer.ContainsFile(filePath))
             {
                 AnalysisEntry requiredEntry = model.Entry.Analyzer.GetAnalysisEntry(filePath);
                 if (requiredEntry.Model != null)
                 {
                     block.Requires.AddRange(requiredEntry.Model.GetGlobalDeclarations());
                     model.AddIncludedFile(filePath, requiredEntry.Model);
                 }
             }
             // singleton mode
             else
             {
                 string source = File.ReadAllText(filePath);
                 Irony.Parsing.Parser parser        = new Irony.Parsing.Parser(LuaGrammar.Instance);
                 ParseTree            tree          = parser.Parse(source);
                 LuaModel             requiredModel = new LuaModel(tree, filePath);
                 block.Requires.AddRange(requiredModel.GetGlobalDeclarations());
                 model.AddIncludedFile(filePath, requiredModel);
             }
         }
         catch (Exception e)
         {
         }
     }
 }
Example #4
0
        public void GetDeclarations(LuaBlockNode block, LuaModel model)
        {
            for (int i = 0; i < VariableList.Count; ++i)
            {
                LuaNode variable = VariableList[i];
                Declaration namespaces, sibling = null; 
                bool isDeclarationAssign = false;
                if (i < ExpressionList.Count)
                    isDeclarationAssign = DeclarationHelper.TryGetExpressionDeclaration(ExpressionList[i], block, model, out sibling);

                DeclarationType type = GetDeclarationType(variable, block, out namespaces);

                if (type == DeclarationType.Global && variable is LuaIdentifierNode)
                {
                    Declaration declaration = new Declaration(variable.AsString, String.Empty, model.FilePath, new ScopeSpan(variable.Span.EndPosition, variable.EndLine, int.MaxValue, int.MaxValue));
                    if (isDeclarationAssign) sibling.AddSibling(declaration);
                    block.Globals.Add(declaration);
                }
                else if (type == DeclarationType.Global && variable is LuaTableAccessNode)
                {
                    string[] names = variable.AsString.Split('.');
                    Declaration declaration = new Declaration(names[names.Length - 1], String.Empty, model.FilePath, new ScopeSpan(variable.Span.EndPosition, variable.EndLine,
                        int.MaxValue, int.MaxValue), namespaces);
                    if (isDeclarationAssign) sibling.AddSibling(declaration);
                    block.Globals.Add(declaration);
                }
                else if (type == DeclarationType.Local)
                {
                    string[] names = variable.AsString.Split('.');
                    Declaration declaration = new Declaration(names[names.Length - 1], String.Empty, model.FilePath, new ScopeSpan(variable.Span.EndPosition, variable.EndLine,
                        block.Span.EndPosition, block.EndLine), namespaces);
                    if (isDeclarationAssign) sibling.AddSibling(declaration);
                    block.Locals.Add(declaration);
                }
            }
        }
Example #5
0
        private void AddDeclarationsForTableField(LuaBlockNode block, LuaModel model, Declaration namespaces, LuaNode expr)
        {
            if (expr is LuaTableNode)
            {
                foreach (var field in ((LuaTableNode)expr).FieldList)
                {
                    AddDeclarationsForTableField(block, model, namespaces, field);
                }
            }

            if (expr is LuaField && ((LuaField)expr).Name != null)
            {
                LuaNode     variable    = ((LuaField)expr).Name;
                Declaration declaration = new Declaration(variable.AsString, String.Empty, model.FilePath,
                                                          new ScopeSpan(variable.Span.EndPosition,
                                                                        variable.EndLine,
                                                                        block.Span.EndPosition,
                                                                        block.EndLine),
                                                          namespaces);

                block.Locals.Add(declaration);
                AddDeclarationsForTableField(block, model, declaration, ((LuaField)expr).Expression);
            }
        }
Example #6
0
        public void GetDeclarations(LuaBlockNode block, LuaModel model)
        {
            for (int i = 0; i < VariableList.Count && i < ExpressionList.Count; ++i)
            {
                LuaNode     variable    = VariableList[i];
                Declaration declaration = new Declaration(variable.AsString, String.Empty, model.FilePath,
                                                          new ScopeSpan(variable.Span.EndPosition,
                                                                        variable.EndLine,
                                                                        block.Span.EndPosition,
                                                                        block.EndLine));
                //block.Locals.Add(declaration);

                if (i < ExpressionList.Count)
                {
                    if (ExpressionList[i] is LuaTableNode)
                    {
                        declaration.Type = LuaDeclarationType.Table;
                        AddDeclarationsForTableField(block, model, declaration, ExpressionList[i]);
                    }

                    else if (ExpressionList[i] is LuaIdentifierNode ||
                             ExpressionList[i] is LuaTableAccessNode)
                    {
                        Declaration sibling = null;
                        if (DeclarationHelper.TryGetExpressionDeclaration(ExpressionList[i], block, model, out sibling))
                        {
                            declaration.Type = sibling.Type;
                            sibling.AddSibling(declaration);
                        }
                    }
                }

                // add declaration as the end in case of circling sibling which lead to stackoverflow
                block.Locals.Add(declaration);
            }
        }
Example #7
0
 public static bool TryGetExpressionDeclaration(LuaNode expr, LuaBlockNode block, LuaModel model, out Declaration declaration)
 {
     declaration = null;
     if (expr is LuaIdentifierNode)
     {
         foreach (var localDeclaration in block.Locals)
         {
             if (expr.AsString == localDeclaration.Name)
             {
                 declaration = localDeclaration;
                 return(true);
             }
         }
         foreach (var globalDeclaration in block.Globals)
         {
             if (expr.AsString == globalDeclaration.Name)
             {
                 declaration = globalDeclaration;
                 return(true);
             }
         }
         foreach (var globalDeclaration in block.Requires)
         {
             if (expr.AsString == globalDeclaration.Name)
             {
                 declaration = globalDeclaration;
                 // clear siblings in case of adding duplicate declaration
                 declaration.ClearSiblingsinFile(model.FilePath);
                 return(true);
             }
         }
     }
     else if (expr is LuaTableAccessNode)
     {
         foreach (var localDeclaration in block.Locals)
         {
             Declaration dummyDeclaration = BuildDeclaration(expr.AsString);
             if (dummyDeclaration.Equal(localDeclaration))
             {
                 declaration = localDeclaration;
                 return(true);
             }
         }
         foreach (var globalDeclaration in block.Globals)
         {
             Declaration dummyDeclaration = BuildDeclaration(expr.AsString);
             if (dummyDeclaration.Equal(globalDeclaration))
             {
                 declaration = globalDeclaration;
                 return(true);
             }
         }
         foreach (var globalDeclaration in block.Requires)
         {
             Declaration dummyDeclaration = BuildDeclaration(expr.AsString);
             if (dummyDeclaration.Equal(globalDeclaration))
             {
                 declaration = globalDeclaration;
                 // clear siblings in case of adding duplicate declaration
                 declaration.ClearSiblingsinFile(model.FilePath);
                 return(true);
             }
         }
     }
     return(false);
 }
Example #8
0
 public static void Initialize(LuaModel model)
 {
     _model = model;
 }
Example #9
0
        public void GetDeclarations(LuaBlockNode block, LuaModel model)
        {
            // add parameter declaration
            if (Parameters != null && Body != null)
            {
                foreach (var identifier in Parameters.Identifiers)
                {
                    Body.Locals.Add(new Declaration(identifier.Identifier, String.Empty, model.FilePath,
                                                    new ScopeSpan(identifier.Span.EndPosition, identifier.EndLine, Body.Span.EndPosition, Body.EndLine)));
                }
            }

            // Anonymous Function
            if (Type == FunctionType.Anonymous)
            {
                return;
            }
            // function declaration
            else if (Type == FunctionType.Declaration)
            {
                if (NameNode.Namespaces == null)
                {
                    block.Globals.Add(new Declaration(NameNode.Name, Description, model.FilePath,
                                                      new ScopeSpan(NameNode.Span.EndPosition, NameNode.EndLine, int.MaxValue, int.MaxValue), LuaDeclarationType.Function));
                }
                else
                {
                    // if its namespace is in local scope, add it to local declaration list
                    foreach (var local in block.Locals)
                    {
                        if (local.Equal(BuildDeclaration(NameNode.Namespaces)))
                        {
                            block.Locals.Add(new Declaration(NameNode.Name, Description, model.FilePath,
                                                             new ScopeSpan(NameNode.Span.EndPosition, NameNode.EndLine, block.Span.EndPosition, block.EndLine), LuaDeclarationType.Function, local));
                            break;
                        }
                    }
                    // if its namespace is in global scope, add it to global declaration list
                    foreach (var global in block.Globals)
                    {
                        if (global.Equal(BuildDeclaration(NameNode.Namespaces)))
                        {
                            block.Globals.Add(new Declaration(NameNode.Name, Description, model.FilePath,
                                                              new ScopeSpan(NameNode.Span.EndPosition, NameNode.EndLine, block.Span.EndPosition, block.EndLine), LuaDeclarationType.Function, global));
                            break;
                        }
                    }
                }
            }
            // local function declaration
            else if (Type == FunctionType.LocalDeclaration)
            {
                Declaration declaration = new Declaration(NameNode.Name, Description, model.FilePath,
                                                          new ScopeSpan(NameNode.Span.EndPosition, NameNode.EndLine, block.Span.EndPosition, block.EndLine), LuaDeclarationType.Function);

                //foreach (var local in block.Locals)
                //{
                //    if (local.Equal(NameNode.Namespaces))
                //    {
                //        declaration.NameSpaces.Add(local);
                //        break;
                //    }
                //}
                block.Locals.Add(declaration);
            }
        }