Exemple #1
0
        public override void Init(AstContext context, ParseTreeNode treeNode)
        {
            base.Init(context, treeNode);
            // prefixexp args
            if (treeNode.ChildNodes.Count == 2)
            {
                Target    = AddChild(String.Empty, treeNode.ChildNodes[0]) as LuaNode;
                Arguments = AddChild(String.Empty, treeNode.ChildNodes[1]) as LuaNode;
                Name      = null;
            }
            // prefixexp `:´ Name args
            else if (treeNode.ChildNodes.Count == 4)
            {
                Target    = AddChild(String.Empty, treeNode.ChildNodes[0]) as LuaNode;
                Name      = AddChild(String.Empty, treeNode.ChildNodes[2]) as LuaNode;
                Arguments = AddChild(String.Empty, treeNode.ChildNodes[3]) as LuaNode;
            }

            //foreach (var node in treeNode.ChildNodes)
            //{
            //    if (node.Term.Name == "identifier")
            //        name += node.FindTokenAndGetText();

            //    if (node.Term.Flags.IsSet(TermFlags.IsOperator))
            //        name += node.Term.Name;

            //    if (node.Term.Name == "expr list")
            //        Arguments = AddChild("Args", node);
            //}

            AsString = "Function Call";
        }
Exemple #2
0
 public override void Init(AstContext context, ParseTreeNode treeNode)
 {
     base.Init(context, treeNode);
     if (treeNode.ChildNodes.Count != 4)
     {
         return;
     }
     Expression  = AddChild("elseif expr", treeNode.ChildNodes[1]) as LuaNode;
     ElseIfBlock = AddChild("elseif block", treeNode.ChildNodes[3]) as LuaBlockNode;
 }
Exemple #3
0
 public void AddChild(string role, LuaNode child)
 {
     if (child == null)
     {
         return;
     }
     child.Role   = role;
     child.Parent = this;
     ChildNodes.Add(child);
 }
        private DeclarationType GetDeclarationType(LuaNode variable, LuaBlockNode block, out Declaration namespaces)
        {
            namespaces = null;
            if (variable is LuaIdentifierNode)
            {
                foreach (var localDeclaration in block.Locals)
                {
                    if (variable.AsString == localDeclaration.Name)
                    {
                        return DeclarationType.None;
                    }
                }

                foreach (var globalDeclaration in block.Globals)
                {
                    if (variable.AsString == globalDeclaration.Name)
                    {
                        return DeclarationType.None;
                    }
                }
            }
            else if (variable is LuaTableAccessNode)
            {
                foreach (var localDeclaration in block.Locals)
                {
                    //List<string> names = new List<string>(variable.AsString.Split('.'));
                    Declaration dummyDeclaration = DeclarationHelper.BuildDeclaration(variable.AsString);
                    if (dummyDeclaration.Equal(localDeclaration))
                        return DeclarationType.None;
                    if (dummyDeclaration.NameSpace != null && dummyDeclaration.NameSpace.Equal(localDeclaration))
                    {
                        namespaces = localDeclaration;
                        return DeclarationType.Local;
                    }
                }

                foreach (var globalDeclaration in block.Globals)
                {
                    //List<string> names = new List<string>(variable.AsString.Split('.'));
                    Declaration dummyDeclaration = DeclarationHelper.BuildDeclaration(variable.AsString);
                    if (dummyDeclaration.Equal(globalDeclaration))
                        return DeclarationType.None;
                    if (dummyDeclaration.NameSpace != null && dummyDeclaration.NameSpace.Equal(globalDeclaration))
                    {
                        namespaces = globalDeclaration;
                        return DeclarationType.Global;
                    }
                }
            }

            return DeclarationType.Global;
        }
Exemple #5
0
        public override void Init(AstContext context, ParseTreeNode treeNode)
        {
            base.Init(context, treeNode);

            if (treeNode.ChildNodes.Count != 5)
            {
                return;
            }

            Expression = treeNode.ChildNodes[1].AstNode as LuaNode;
            Block      = treeNode.ChildNodes[3].AstNode as LuaNode;

            AddChild("while loop expr", Expression);
            AddChild("while loop block", Block);
        }
Exemple #6
0
        public override void Init(AstContext context, ParseTreeNode treeNode)
        {
            base.Init(context, treeNode);

            if (treeNode.ChildNodes.Count > 1)
            {
                Name       = AddChild("key", treeNode.ChildNodes[0]) as LuaNode;
                Expression = AddChild("value", treeNode.ChildNodes[2]) as LuaNode;
                AsString   = "key/value field";
            }
            else
            {
                Name       = null;
                Expression = AddChild("entry", treeNode.ChildNodes[0]) as LuaNode;
                AsString   = "list field";
            }
        }
        public override void Init(AstContext context, ParseTreeNode treeNode)
        {
            base.Init(context, treeNode);

            // prefixexp `.´ Name
            if (treeNode.ChildNodes.Count == 3)
            {
                AsString   = (treeNode.ChildNodes[0].AstNode as LuaNode) + "." + (treeNode.ChildNodes[2].AstNode as LuaNode);
                PrefixNode = AddChild(String.Empty, treeNode.ChildNodes[0]) as LuaNode;
                Expr       = AddChild(String.Empty, treeNode.ChildNodes[2]) as LuaNode;
            }

            // prefixexp `[´ exp `]´
            if (treeNode.ChildNodes.Count == 4)
            {
            }
        }
        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);
                }
            }
        }
Exemple #9
0
        public override void Init(AstContext context, ParseTreeNode treeNode)
        {
            base.Init(context, treeNode);

            Expression = AddChild("Test", treeNode.ChildNodes[1]) as LuaNode;

            IfTrue = AddChild("IfTrue", treeNode.ChildNodes[3]) as LuaBlockNode;

            foreach (ParseTreeNode variable in treeNode.ChildNodes)
            {
                if (variable.ToString() == "ElseIfClause*" && variable.ChildNodes.Count > 0)
                {
                    foreach (var elseIf in variable.ChildNodes)
                    {
                        AddChild("ElseIf", elseIf);
                    }
                }

                if (variable.ToString() == "ElseClause" && variable.ChildNodes.Count > 0)
                {
                    IfFalse = AddChild("IfFalse", variable.ChildNodes[1]) as LuaNode;
                }
            }
        }
Exemple #10
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);
            }
        }
Exemple #11
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);
            }
        }
Exemple #12
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);
 }